diff --git a/crypto_kem/hqc-128/META.yml b/crypto_kem/hqc-128/META.yml new file mode 100644 index 00000000..36ca72fa --- /dev/null +++ b/crypto_kem/hqc-128/META.yml @@ -0,0 +1,34 @@ +name: HQC-128 +type: kem +claimed-nist-level: 1 +claimed-security: IND-CCA2 +length-ciphertext: 6017 +length-public-key: 3024 +length-secret-key: 3064 +length-shared-secret: 64 +nistkat-sha256: 32702949431d8a869abb530a2fda87d5c81c63c698673b135e59ad7e8b5a4f5f +principal-submitters: + - Carlos Aguilar Melchor + - Nicolas Aragon + - Slim Bettaieb + - Olivier Blazy + - Jurjen Bos + - Jean-Christophe Deneuville + - Philippe Gaborit + - Edoardo Persichetti + - Jean-Marc Robert + - Pascal Véron + - Gilles Zémor + - Loïc Bidoux +implementations: + - name: clean + version: 2020-05-29 + - name: avx2 + version: 2020-05-29 + supported_platforms: + - architecture: x86_64 + operating_systems: + - Linux + - Darwin + required_flags: + - avx2 diff --git a/crypto_kem/hqc-128/avx2/LICENSE b/crypto_kem/hqc-128/avx2/LICENSE new file mode 100644 index 00000000..d5d21fff --- /dev/null +++ b/crypto_kem/hqc-128/avx2/LICENSE @@ -0,0 +1 @@ +Public Domain diff --git a/crypto_kem/hqc-128/avx2/Makefile b/crypto_kem/hqc-128/avx2/Makefile new file mode 100644 index 00000000..607e047f --- /dev/null +++ b/crypto_kem/hqc-128/avx2/Makefile @@ -0,0 +1,22 @@ +# This Makefile can be used with GNU Make or BSD Make + +LIB=libhqc-128_avx2.a +HEADERS=alpha_table.h api.h bch.h code.h fft.h gen_matrix.h gf2x.h gf.h hqc.h parameters.h parsing.h repetition.h vector.h +OBJECTS=bch.o code.o fft.o gf2x.o gf.o hqc.o kem.o parsing.o repetition.o vector.o + +CFLAGS=-O3 -mavx2 -mbmi -mpclmul -Wall -Wextra -Wpedantic -Wvla -Werror -Wredundant-decls -Wmissing-prototypes -std=c99 -I../../../common $(EXTRAFLAGS) + +all: $(LIB) + +%.o: %.s $(HEADERS) + $(AS) -o $@ $< + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +$(LIB): $(OBJECTS) + $(AR) -r $@ $(OBJECTS) + +clean: + $(RM) $(OBJECTS) + $(RM) $(LIB) diff --git a/crypto_kem/hqc-128/avx2/alpha_table.h b/crypto_kem/hqc-128/avx2/alpha_table.h new file mode 100644 index 00000000..9b92134d --- /dev/null +++ b/crypto_kem/hqc-128/avx2/alpha_table.h @@ -0,0 +1,18 @@ +#ifndef ALPHA_TABLE_H +#define ALPHA_TABLE_H + + +/** + * @file alpha_table.h + * Header file that contain precomputed power of alpha the root of the generator poly og GF(2^PARAM_M) + */ + +#include "parameters.h" +#include "parameters.h" + + +#define SYND_SIZE_256 CEIL_DIVIDE(PARAM_DELTA, 8) + +static int16_t table_alpha_ij[PARAM_N1 * (SYND_SIZE_256 << 4)] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x9, 0x12, 0x24, 0x48, 0x90, 0x120, 0x240, 0x89, 0x112, 0x224, 0x41, 0x82, 0x104, 0x208, 0x19, 0x32, 0x64, 0xc8, 0x190, 0x320, 0x249, 0x9b, 0x136, 0x26c, 0xd1, 0x1a2, 0x344, 0x281, 0x10b, 0x216, 0x25, 0x4a, 0x94, 0x128, 0x250, 0xa9, 0x152, 0x2a4, 0x141, 0x282, 0x10d, 0x21a, 0x3d, 0x7a, 0xf4, 0x1e8, 0x3d0, 0x3a9, 0x35b, 0x2bf, 0x177, 0x2ee, 0x1d5, 0x3aa, 0x35d, 0x2b3, 0x16f, 0x2de, 0x1b5, 0x36a, 0x2dd, 0x1b3, 0x366, 0x2c5, 0x183, 0x306, 0x205, 0x3, 0x6, 0xc, 0x18, 0x30, 0x60, 0xc0, 0x180, 0x300, 0x209, 0x1b, 0x36, 0x6c, 0xd8, 0x1b0, 0x360, 0x2c9, 0x19b, 0x336, 0x265, 0xc3, 0x186, 0x30c, 0x211, 0x2b, 0x56, 0xac, 0x158, 0x2b0, 0x169, 0x2d2, 0x1ad, 0x35a, 0x2bd, 0x173, 0x2e6, 0x1c5, 0x38a, 0x4, 0x10, 0x40, 0x100, 0x9, 0x24, 0x90, 0x240, 0x112, 0x41, 0x104, 0x19, 0x64, 0x190, 0x249, 0x136, 0xd1, 0x344, 0x10b, 0x25, 0x94, 0x250, 0x152, 0x141, 0x10d, 0x3d, 0xf4, 0x3d0, 0x35b, 0x177, 0x1d5, 0x35d, 0x16f, 0x1b5, 0x2dd, 0x366, 0x183, 0x205, 0x6, 0x18, 0x60, 0x180, 0x209, 0x36, 0xd8, 0x360, 0x19b, 0x265, 0x186, 0x211, 0x56, 0x158, 0x169, 0x1ad, 0x2bd, 0x2e6, 0x38a, 0x233, 0xde, 0x378, 0x1fb, 0x3e5, 0x38f, 0x227, 0x8e, 0x238, 0xf2, 0x3c8, 0x33b, 0xf7, 0x3dc, 0x36b, 0x1b7, 0x2d5, 0x346, 0x103, 0x5, 0x14, 0x50, 0x140, 0x109, 0x2d, 0xb4, 0x2d0, 0x352, 0x153, 0x145, 0x11d, 0x7d, 0x1f4, 0x3d9, 0x37f, 0x1e7, 0x395, 0x24f, 0x12e, 0xb1, 0x2c4, 0x302, 0x13, 0x4c, 0x130, 0xc9, 0x324, 0x8b, 0x22c, 0xa2, 0x288, 0x232, 0xda, 0x368, 0x1bb, 0x2e5, 0x386, 0x8, 0x40, 0x200, 0x24, 0x120, 0x112, 0x82, 0x19, 0xc8, 0x249, 0x26c, 0x344, 0x216, 0x94, 0xa9, 0x141, 0x21a, 0xf4, 0x3a9, 0x177, 0x3aa, 0x16f, 0x36a, 0x366, 0x306, 0x6, 0x30, 0x180, 0x1b, 0xd8, 0x2c9, 0x265, 0x30c, 0x56, 0x2b0, 0x1ad, 0x173, 0x38a, 0x6f, 0x378, 0x3f6, 0x38f, 0x47, 0x238, 0x1e4, 0x33b, 0x1ee, 0x36b, 0x36e, 0x346, 0x206, 0x14, 0xa0, 0x109, 0x5a, 0x2d0, 0x2ad, 0x145, 0x23a, 0x1f4, 0x3bb, 0x1e7, 0x323, 0x12e, 0x162, 0x302, 0x26, 0x130, 0x192, 0x8b, 0x51, 0x288, 0x6d, 0x368, 0x376, 0x386, 0xf, 0x78, 0x3c0, 0x23f, 0x1dc, 0x2fb, 0x3f5, 0x397, 0x87, 0x31, 0x188, 0x5b, 0x2d8, 0x2ed, 0x345, 0x21e, 0xd4, 0x2a9, 0x165, 0x33a, 0x1e6, 0x32b, 0x16e, 0x362, 0x326, 0x106, 0x22, 0x110, 0x92, 0x99, 0xc1, 0x201, 0x2c, 0x160, 0x312, 0xa6, 0x139, 0x1da, 0x10, 0x100, 0x24, 0x240, 0x41, 0x19, 0x190, 0x136, 0x344, 0x25, 0x250, 0x141, 0x3d, 0x3d0, 0x177, 0x35d, 0x1b5, 0x366, 0x205, 0x18, 0x180, 0x36, 0x360, 0x265, 0x211, 0x158, 0x1ad, 0x2e6, 0x233, 0x378, 0x3e5, 0x227, 0x238, 0x3c8, 0xf7, 0x36b, 0x2d5, 0x103, 0x14, 0x140, 0x2d, 0x2d0, 0x153, 0x11d, 0x1f4, 0x37f, 0x395, 0x12e, 0x2c4, 0x13, 0x130, 0x324, 0x22c, 0x288, 0xda, 0x1bb, 0x386, 0x1e, 0x1e0, 0x23f, 0x3b8, 0x3fe, 0x397, 0x10e, 0xc4, 0x5b, 0x1b9, 0x3a6, 0x21e, 0x1a8, 0x2b6, 0x33a, 0x3cc, 0xb7, 0x362, 0x245, 0x11, 0x110, 0x124, 0x264, 0x201, 0x58, 0x189, 0xa6, 0x272, 0x361, 0x275, 0x311, 0x17c, 0x3ed, 0x2a7, 0x22a, 0x2e8, 0x2d3, 0x163, 0x21d, 0x198, 0x1b6, 0x356, 0x105, 0x74, 0x349, 0xf5, 0x34b, 0xd5, 0x14b, 0x9d, 0x1c2, 0x1f, 0x1f0, 0x33f, 0x39c, 0x1be, 0x3d6, 0x20, 0x9, 0x120, 0x41, 0x32, 0x249, 0x1a2, 0x25, 0xa9, 0x10d, 0x1e8, 0x177, 0x2b3, 0x2dd, 0x306, 0x18, 0x300, 0xd8, 0x336, 0x211, 0x2b0, 0x2bd, 0x31d, 0x378, 0x3c3, 0x8e, 0x1e4, 0xf7, 0x2df, 0x346, 0xa, 0x140, 0x5a, 0x352, 0x28a, 0x1f4, 0x2f7, 0x24f, 0x162, 0x13, 0x260, 0x8b, 0x144, 0xda, 0x376, 0x203, 0xf0, 0x23f, 0x379, 0x3e3, 0x87, 0xc4, 0xb6, 0x2ed, 0x10f, 0x1a8, 0x165, 0xf3, 0x25f, 0x362, 0x83, 0x44, 0x92, 0x264, 0xb, 0x160, 0x53, 0x272, 0x2cb, 0x1c6, 0xbe, 0x3ed, 0x147, 0xba, 0x36d, 0x163, 0x33, 0x269, 0x1ab, 0x105, 0xe8, 0x13f, 0x3a1, 0xd5, 0x296, 0x274, 0x20b, 0x1f0, 0x277, 0x26b, 0x1eb, 0x117, 0x2a8, 0x1bd, 0x3c5, 0x4e, 0x1d2, 0x23e, 0x359, 0x3ea, 0x1a7, 0x85, 0x84, 0xa4, 0xad, 0x18d, 0x1cc, 0x1fe, 0x3b7, 0x215, 0x230, 0x299, 0x394, 0x27c, 0x40, 0x24, 0x112, 0x19, 0x249, 0x344, 0x94, 0x141, 0xf4, 0x177, 0x16f, 0x366, 0x6, 0x180, 0xd8, 0x265, 0x56, 0x1ad, 0x38a, 0x378, 0x38f, 0x238, 0x33b, 0x36b, 0x346, 0x14, 0x109, 0x2d0, 0x145, 0x1f4, 0x1e7, 0x12e, 0x302, 0x130, 0x8b, 0x288, 0x368, 0x386, 0x78, 0x23f, 0x2fb, 0x397, 0x31, 0x5b, 0x2ed, 0x21e, 0x2a9, 0x33a, 0x32b, 0x362, 0x106, 0x110, 0x99, 0x201, 0x160, 0xa6, 0x1da, 0x275, 0x5f, 0x3ed, 0x28e, 0x2e8, 0x35e, 0x21d, 0x269, 0x356, 0x1d, 0x349, 0x3d4, 0xd5, 0x125, 0x1c2, 0x7c, 0x33f, 0x26b, 0x3d6, 0x55, 0x16d, 0x3e6, 0x4e, 0x3a4, 0xea, 0x2fe, 0x2d7, 0x85, 0x108, 0x290, 0x161, 0xe6, 0x1fe, 0x367, 0x46, 0x1a4, 0x1ca, 0x27c, 0x21f, 0x2e9, 0x31e, 0x239, 0x37b, 0x34f, 0x254, 0xd, 0x340, 0x194, 0x1d1, 0xb5, 0x113, 0x59, 0x26d, 0x256, 0x8d, 0x308, 0x3b0, 0x80, 0x90, 0x82, 0x190, 0x1a2, 0x94, 0x282, 0x3d0, 0x3aa, 0x2dd, 0x3, 0x180, 0x1b0, 0x186, 0x2b0, 0x2e6, 0x1bc, 0x38f, 0x79, 0xf7, 0x36e, 0x5, 0x280, 0x2d0, 0x28a, 0x3d9, 0x323, 0x2c4, 0x98, 0x8b, 0x119, 0x1bb, 0xf, 0x389, 0x379, 0x397, 0x62, 0x16c, 0x345, 0x1a8, 0x19d, 0x32b, 0x2cd, 0x11, 0x92, 0x182, 0xb0, 0xa6, 0x3b4, 0x1c6, 0x2f8, 0x2a7, 0x174, 0x35e, 0x33, 0x1b6, 0x286, 0x1d0, 0x1ea, 0xd5, 0x24a, 0x301, 0x3e0, 0x39c, 0x1eb, 0x55, 0x2da, 0x383, 0x270, 0x23e, 0x17f, 0x2d7, 0x10a, 0x29, 0xad, 0x23d, 0xff, 0x367, 0x8c, 0x299, 0x24b, 0x381, 0x370, 0x31e, 0x7b, 0x1f7, 0x24e, 0x101, 0x1a0, 0x194, 0x3a2, 0x2d4, 0x8a, 0x199, 0x12b, 0x8d, 0x219, 0x2db, 0x303, 0x2e0, 0x2bc, 0xef, 0x375, 0x19e, 0x2ab, 0x37d, 0x197, 0x222, 0x364, 0x10c, 0x329, 0x3cd, 0x131, 0x196, 0x100, 0x240, 0x19, 0x136, 0x25, 0x141, 0x3d0, 0x35d, 0x366, 0x18, 0x36, 0x265, 0x158, 0x2e6, 0x378, 0x227, 0x3c8, 0x36b, 0x103, 0x140, 0x2d0, 0x11d, 0x37f, 0x12e, 0x13, 0x324, 0x288, 0x1bb, 0x1e, 0x23f, 0x3fe, 0x10e, 0x5b, 0x3a6, 0x1a8, 0x33a, 0xb7, 0x245, 0x110, 0x264, 0x58, 0xa6, 0x361, 0x311, 0x3ed, 0x22a, 0x2d3, 0x21d, 0x1b6, 0x105, 0x349, 0x34b, 0x14b, 0x1c2, 0x1f0, 0x39c, 0x3d6, 0x154, 0x2fd, 0x4e, 0x28b, 0x2bb, 0x2d7, 0x214, 0xa4, 0x161, 0x398, 0x3df, 0x46, 0x299, 0x9f, 0x21f, 0x3b6, 0x18c, 0x37b, 0x127, 0x101, 0x340, 0x259, 0x12f, 0x113, 0x164, 0x291, 0x8d, 0x3b, 0x37e, 0x2e, 0x253, 0x33d, 0x3be, 0x19e, 0x15f, 0x1ef, 0xa3, 0x268, 0x43, 0x390, 0x3cd, 0x262, 0x251, 0x13d, 0x337, 0x1ac, 0x333, 0x1a5, 0x221, 0x1c1, 0x2f0, 0x155, 0x3fd, 0x20e, 0x292, 0x38d, 0x2f2, 0x200, 0x112, 0xc8, 0x344, 0xa9, 0xf4, 0x3aa, 0x366, 0x30, 0xd8, 0x30c, 0x1ad, 0x6f, 0x38f, 0x1e4, 0x36b, 0x206, 0x109, 0x2ad, 0x1f4, 0x323, 0x302, 0x192, 0x288, 0x376, 0x78, 0x1dc, 0x397, 0x188, 0x2ed, 0xd4, 0x33a, 0x16e, 0x106, 0x92, 0x201, 0x312, 0x1da, 0x38c, 0x3ed, 0x5d, 0x35e, 0xcc, 0x356, 0xe8, 0x3d4, 0x2a1, 0x1c2, 0x3e0, 0x26b, 0x28f, 0x16d, 0x30f, 0x3a4, 0x359, 0x2d7, 0x21, 0x290, 0x31a, 0x1fe, 0x30e, 0x1a4, 0x24b, 0x21f, 0x365, 0x239, 0x3ee, 0x254, 0x68, 0x194, 0x293, 0x113, 0x2c8, 0x256, 0x61, 0x3b0, 0x303, 0x392, 0x39a, 0x3be, 0x33c, 0x175, 0x363, 0x222, 0x18b, 0xe4, 0x3e2, 0x262, 0xab, 0xfd, 0x18e, 0x2f6, 0x2b1, 0x18a, 0x2e4, 0x2f0, 0x2aa, 0x3ef, 0x54, 0x17a, 0x15c, 0x1d7, 0x1ba, 0x23c, 0x1fc, 0x307, 0x380, 0x3db, 0x9e, 0x237, 0x3d1, 0xb3, 0x91, 0x8, 0x9, 0x41, 0x249, 0x25, 0x10d, 0x177, 0x2dd, 0x18, 0xd8, 0x211, 0x2bd, 0x378, 0x8e, 0xf7, 0x346, 0x140, 0x352, 0x1f4, 0x24f, 0x13, 0x8b, 0xda, 0x203, 0x23f, 0x3e3, 0xc4, 0x2ed, 0x1a8, 0xf3, 0x362, 0x44, 0x264, 0x160, 0x272, 0x1c6, 0x3ed, 0xba, 0x163, 0x269, 0x105, 0x13f, 0xd5, 0x274, 0x1f0, 0x26b, 0x117, 0x1bd, 0x4e, 0x23e, 0x3ea, 0x85, 0xa4, 0x18d, 0x1fe, 0x215, 0x299, 0x27c, 0x1b8, 0x63, 0x37b, 0x95, 0x34, 0x194, 0x12f, 0x45, 0x26d, 0x121, 0x3b, 0x1e3, 0x2e0, 0x1cd, 0x3be, 0x271, 0x1dd, 0x32e, 0x268, 0x10c, 0x17e, 0x29c, 0x251, 0xfd, 0x31c, 0x3ca, 0x1a5, 0x96, 0x2f, 0x157, 0x3fd, 0x2a, 0x17a, 0x2b8, 0x355, 0x1cb, 0x388, 0x3f7, 0x70, 0x3f0, 0x4f, 0x237, 0x3ab, 0x2cc, 0x81, 0x80, 0x89, 0xc8, 0x281, 0x2a4, 0x3a9, 0x2de, 0x3, 0x1b, 0xc3, 0x2d2, 0x6f, 0x12, 0x104, 0x26c, 0x250, 0x1e8, 0x16f, 0x3, 0x36, 0x30c, 0x2bd, 0x2f9, 0x238, 0x3b1, 0x5, 0x5a, 0x11d, 0x3ce, 0x302, 0x241, 0xda, 0xf, 0xee, 0x327, 0x5b, 0x10f, 0x2ca, 0x16e, 0x11, 0x132, 0x160, 0xed, 0x311, 0x357, 0x3b2, 0x33, 0x356, 0x3a0, 0x137, 0x13a, 0x1f0, 0xdf, 0x55, 0x1f3, 0xe9, 0x359, 0x34e, 0x210, 0x161, 0xff, 0x215, 0x13b, 0x1e2, 0x1db, 0x239, 0x3a3, 0x101, 0x236, 0x34d, 0x226, 0x26d, 0x242, 0xec, 0x303, 0x253, 0x1de, 0x263, 0x2be, 0x2cf, 0x134, 0x10c, 0x2fc, 0x262, 0x2ac, 0x3cb, 0x358, 0x35c, 0x314, 0x30d, 0x2af, 0x3fd, 0x54, 0x1e1, 0x1ed, 0x135, 0x11e, 0x3f8, 0xe, 0xfc, 0x223, 0x237, 0x35f, 0x322, 0x1, 0x12, 0x104, 0x26c, 0x250, 0x1e8, 0x16f, 0x3, 0x36, 0x30c, 0x2bd, 0x2f9, 0x238, 0x3b1, 0x5, 0x5a, 0x11d, 0x3ce, 0x302, 0x241, 0xda, 0xf, 0x24, 0x19, 0x344, 0x141, 0x177, 0x366, 0x180, 0x265, 0x1ad, 0x378, 0x238, 0x36b, 0x14, 0x2d0, 0x1f4, 0x12e, 0x130, 0x288, 0x386, 0x23f, 0x397, 0x5b, 0x21e, 0x33a, 0x362, 0x110, 0x201, 0xa6, 0x275, 0x3ed, 0x2e8, 0x21d, 0x356, 0x349, 0xd5, 0x1c2, 0x33f, 0x3d6, 0x16d, 0x4e, 0xea, 0x2d7, 0x108, 0x161, 0x1fe, 0x46, 0x1ca, 0x21f, 0x31e, 0x37b, 0x254, 0x340, 0x1d1, 0x113, 0x26d, 0x8d, 0x3b0, 0x2e, 0x171, 0x3be, 0x1d6, 0x1ef, 0x222, 0x43, 0x17e, 0x262, 0x151, 0x337, 0x2f6, 0x1a5, 0x258, 0x2f0, 0x17d, 0x20e, 0x17a, 0x2f2, 0x135, 0x23c, 0x3fb, 0x70, 0x3db, 0xf9, 0xfb, 0xb3, 0x81, 0x200, 0x82, 0x26c, 0xa9, 0x3a9, 0x36a, 0x30, 0x2c9, 0x2b0, 0x6f, 0x47, 0x1ee, 0x206, 0x5a, 0x23a, 0x323, 0x26, 0x51, 0x376, 0x3c0, 0x3f5, 0x188, 0x345, 0x165, 0x16e, 0x22, 0xc1, 0x312, 0x2cb, 0x48, 0x64, 0x216, 0x3d, 0x2b3, 0x6, 0x1b0, 0x158, 0x6f, 0x8e, 0x3b1, 0x14, 0x1a9, 0x3d9, 0x162, 0x324, 0x1b4, 0x78, 0x1ff, 0xc4, 0x345, 0x2ca, 0x1b1, 0x110, 0xb, 0x298, 0x38c, 0x2a7, 0x1af, 0x269, 0x3a, 0x34b, 0x13a, 0x3c9, 0x1eb, 0x16d, 0x9c, 0x3a8, 0x295, 0xa4, 0x73, 0x367, 0x348, 0x1e2, 0x365, 0x3d8, 0x12a, 0x340, 0x3a2, 0x45, 0x34c, 0xc2, 0x2f5, 0x392, 0x1de, 0x19e, 0x3ba, 0x28c, 0x225, 0x17e, 0xcd, 0x14d, 0x18e, 0x333, 0xc5, 0x30d, 0x2ae, 0x3a7, 0x12d, 0x2b8, 0x29e, 0x23c, 0x3ff, 0x1c0, 0x2e7, 0x38b, 0x35f, 0x93, 0x10, 0x89, 0x249, 0x128, 0x3d0, 0x36a, 0x60, 0x336, 0x1ad, 0x2f9, 0xf2, 0x36e, 0x140, 0x2a6, 0x1e7, 0x20d, 0x22c, 0x376, 0x389, 0x3cf, 0x5b, 0x35, 0xf3, 0x326, 0x124, 0xb0, 0x1da, 0xbe, 0x22a, 0x2c6, 0x2d1, 0x3a0, 0xd5, 0x384, 0xe7, 0x28f, 0x90, 0x190, 0x94, 0x3d0, 0x2dd, 0x180, 0x186, 0x2e6, 0x38f, 0xf7, 0x5, 0x2d0, 0x3d9, 0x2c4, 0x8b, 0x1bb, 0x389, 0x397, 0x16c, 0x1a8, 0x32b, 0x11, 0x182, 0xa6, 0x1c6, 0x2a7, 0x35e, 0x1b6, 0x1d0, 0xd5, 0x301, 0x39c, 0x55, 0x383, 0x23e, 0x2d7, 0x29, 0x23d, 0x367, 0x299, 0x381, 0x31e, 0x1f7, 0x101, 0x194, 0x2d4, 0x199, 0x8d, 0x2db, 0x2e0, 0xef, 0x19e, 0x37d, 0x222, 0x10c, 0x3cd, 0x196, 0x3f4, 0x2b9, 0x1a5, 0x172, 0x353, 0x3ef, 0x292, 0x2b8, 0x135, 0xe2, 0x3c7, 0x3f, 0x4f, 0x338, 0xb3, 0x204, 0x48, 0xc8, 0x4a, 0x1e8, 0x36a, 0xc0, 0xc3, 0x173, 0x3c3, 0x27f, 0x206, 0x168, 0x3e8, 0x162, 0x241, 0x2d9, 0x3c0, 0x3cf, 0xb6, 0xd4, 0x391, 0x20c, 0xc1, 0x53, 0xe3, 0x357, 0x1af, 0xdb, 0xe8, 0x26e, 0x384, 0x1ce, 0x22e, 0x3c5, 0x11f, 0x36f, 0x210, 0x31a, 0x3b7, 0x348, 0x3c4, 0x120, 0x249, 0xa9, 0x177, 0x306, 0xd8, 0x2b0, 0x378, 0x1e4, 0x346, 0x5a, 0x1f4, 0x162, 0x8b, 0x376, 0x23f, 0x87, 0x2ed, 0x165, 0x362, 0x92, 0x160, 0x2cb, 0x3ed, 0x36d, 0x269, 0xe8, 0xd5, 0x20b, 0x26b, 0x2a8, 0x4e, 0x359, 0x85, 0xad, 0x1fe, 0x230, 0x27c, 0x365, 0x37b, 0x284, 0x194, 0x1a1, 0x26d, 0x61, 0x1e3, 0xaf, 0x3be, 0x2ab, 0x32e, 0x18b, 0x17e, 0x334, 0xfd, 0x358, 0x1a5, 0x2e4, 0x157, 0x347, 0x17a, 0x3bd, 0x1cb, 0x1fc, 0x70, 0x2e7, 0x237, 0x195, 0x81, 0x24, 0xc8, 0x94, 0x3a9, 0x366, 0x1b, 0x56, 0x6f, 0x238, 0x36e, 0x109, 0x23a, 0x12e, 0x192, 0x368, 0x3c0, 0x397, 0x2d8, 0x2a9, 0x16e, 0x110, 0x2c, 0x1da, 0x2f8, 0x2e8, 0xcc, 0x1d, 0x29f, 0x1c2, 0x1ce, 0x55, 0x30f, 0xea, 0x295, 0x290, 0x339, 0x46, 0x24b, 0x2e9, 0x1ec, 0x254, 0x236, 0xb5, 0x2c8, 0x8d, 0x1bf, 0x240, 0x136, 0x141, 0x35d, 0x18, 0x265, 0x2e6, 0x227, 0x36b, 0x140, 0x11d, 0x12e, 0x324, 0x1bb, 0x23f, 0x10e, 0x3a6, 0x33a, 0x245, 0x264, 0xa6, 0x311, 0x22a, 0x21d, 0x105, 0x34b, 0x1c2, 0x39c, 0x154, 0x4e, 0x2bb, 0x214, 0x161, 0x3df, 0x299, 0x21f, 0x18c, 0x127, 0x340, 0x12f, 0x164, 0x8d, 0x37e, 0x253, 0x3be, 0x15f, 0xa3, 0x43, 0x3cd, 0x251, 0x337, 0x333, 0x221, 0x2f0, 0x3fd, 0x292, 0x2f2, 0x374, 0xfe, 0x70, 0x1c7, 0xce, 0xb3, 0x2, 0x89, 0x26c, 0x282, 0x2b3, 0x30, 0xc3, 0x1c5, 0x47, 0x2df, 0x280, 0x23a, 0x25c, 0x241, 0x376, 0x77, 0x21c, 0x345, 0x27d, 0x83, 0xc1, 0x14c, 0x22b, 0x5d, 0x33, 0x20a, 0x29f, 0x384, 0x331, 0x2a8, 0x9c, 0x17f, 0x21, 0x2c2, 0x3b7, 0x13b, 0x37, 0x318, 0x24e, 0x289, 0x25e, 0x2c8, 0x11a, 0x2f5, 0xaf, 0x375, 0x2be, 0x146, 0x86, 0x393, 0xab, 0x89, 0xd1, 0x21a, 0x1b5, 0x300, 0x56, 0x1bc, 0x3c8, 0x206, 0x352, 0x3ce, 0x130, 0x1b4, 0x389, 0x87, 0x3a6, 0x27d, 0x106, 0x304, 0x272, 0x2f8, 0x3b2, 0xdb, 0x349, 0x296, 0x3c9, 0x28f, 0x383, 0x1d4, 0x85, 0x2b4, 0x3df, 0x13b, 0x6e, 0x7b, 0x254, 0xca, 0x342, 0x34c, 0x3b, 0x5c, 0xef, 0xeb, 0x2cf, 0x18b, 0x1f1, 0x32c, 0x337, 0x26f, 0x96, 0x3ad, 0x3a7, 0x2f4, 0x1d7, 0x11e, 0x3c7, 0x1f8, 0x3e4, 0x167, 0x81, 0x90, 0x9b, 0x141, 0x2b3, 0x60, 0x30c, 0x233, 0x79, 0x346, 0x168, 0x37f, 0x26, 0x232, 0xf0, 0x397, 0x372, 0x2ca, 0x326, 0x264, 0x14c, 0x5f, 0x174, 0x198, 0xe8, 0x354, 0xf8, 0x3d6, 0x1f3, 0x23e, 0x295, 0x252, 0x3fc, 0x1a4, 0x30b, 0x18c, 0x24e, 0x11b, 0x16a, 0x26d, 0x184, 0x20f, 0x39a, 0x19e, 0x3de, 0x1b2, 0xbf, 0x261, 0x3e1, 0x3ca, 0x314, 0x2f0, 0x3f3, 0x25a, 0x3bd, 0x112, 0x344, 0xf4, 0x366, 0xd8, 0x1ad, 0x38f, 0x36b, 0x109, 0x1f4, 0x302, 0x288, 0x78, 0x397, 0x2ed, 0x33a, 0x106, 0x201, 0x1da, 0x3ed, 0x35e, 0x356, 0x3d4, 0x1c2, 0x26b, 0x16d, 0x3a4, 0x2d7, 0x290, 0x1fe, 0x1a4, 0x21f, 0x239, 0x254, 0x194, 0x113, 0x256, 0x3b0, 0x392, 0x3be, 0x175, 0x222, 0xe4, 0x262, 0xfd, 0x2f6, 0x18a, 0x2f0, 0x3ef, 0x17a, 0x1d7, 0x23c, 0x307, 0x3db, 0x237, 0xb3, 0x8, 0x82, 0x216, 0x3a9, 0x306, 0x2c9, 0x173, 0x47, 0x36e, 0x5a, 0x3bb, 0x26, 0x6d, 0x3c0, 0x87, 0x345, 0x1e6, 0x22, 0x2c, 0x2cb, 0x357, 0x2c6, 0x286, 0x29f, 0x20b, 0x37c, 0x37a, 0x11f, 0x295, 0xad, 0x3eb, 0x13b, 0xdc, 0x1ec, 0x284, 0xbb, 0x8a, 0x294, 0x1bf, 0xaf, 0x1cf, 0x3ba, 0x134, 0x329, 0x334, 0x3e1, 0x39d, 0x4b, 0x3ad, 0x347, 0x3c2, 0x2a3, 0x1c4, 0xe, 0x2e7, 0x19c, 0x191, 0x40, 0x224, 0x10b, 0x3a9, 0x205, 0x336, 0x38a, 0x79, 0x103, 0x2ad, 0x24f, 0x241, 0x386, 0x1ff, 0x16c, 0x165, 0x245, 0x304, 0x1da, 0x3d3, 0x163, 0x286, 0x137, 0x3e, 0x3d6, 0x3c5, 0x3a8, 0x21, 0x23d, 0x23, 0x27c, 0x235, 0x127, 0x236, 0x342, 0x12b, 0x3b0, 0x32d, 0x2e3, 0x3ba, 0x268, 0xbf, 0x196, 0x267, 0x35c, 0x2e4, 0x15d, 0x150, 0x2f2, 0x396, 0x3f7, 0x1f8, 0x38b, 0x25d, 0x8, 0x104, 0x4a, 0x177, 0xc, 0x186, 0x6f, 0x3c8, 0xa, 0x145, 0x25c, 0x22c, 0xf, 0x3e3, 0x372, 0x33a, 0x20c, 0x16, 0x2cb, 0x2a7, 0x30a, 0x1d, 0x1aa, 0x1f0, 0x28f, 0x217, 0x17f, 0x108, 0x1cc, 0x118, 0x3c4, 0x18c, 0x12a, 0x194, 0x226, 0x14a, 0x1bf, 0x15e, 0x335, 0x1ef, 0x364, 0x1f1, 0xab, 0x31c, 0x2d6, 0x30d, 0x2fa, 0x292, 0x3bd, 0x8f, 0x387, 0x3db, 0x67, 0x2cc, 0x40, 0x32, 0x250, 0x3aa, 0x60, 0x2b, 0x378, 0x41, 0x25, 0x177, 0x18, 0x211, 0x378, 0xf7, 0x140, 0x1f4, 0x13, 0xda, 0x23f, 0xc4, 0x1a8, 0x362, 0x264, 0x272, 0x3ed, 0x163, 0x105, 0xd5, 0x1f0, 0x117, 0x4e, 0x3ea, 0xa4, 0x1fe, 0x299, 0x1b8, 0x37b, 0x34, 0x12f, 0x26d, 0x3b, 0x2e0, 0x3be, 0x1dd, 0x268, 0x17e, 0x251, 0x31c, 0x1a5, 0x2f, 0x3fd, 0x17a, 0x355, 0x388, 0x70, 0x4f, 0x3ab, 0x81, 0x89, 0x281, 0x3a9, 0x3, 0xc3, 0x6f, 0x399, 0x28, 0x23a, 0x181, 0x119, 0x3c0, 0x21c, 0x35, 0x16e, 0x248, 0x14c, 0x2f8, 0x1af, 0x2a5, 0x29f, 0x3e, 0x3a5, 0x30f, 0x17f, 0x210, 0x339, 0xd2, 0x37, 0x1ec, 0x202, 0x3a2, 0x2c8, 0x184, 0x5c, 0x371, 0x2be, 0x4d, 0x329, 0xcb, 0x267, 0x2b1, 0x382, 0x2fa, 0x12d, 0x2ef, 0x71, 0xe, 0x38e, 0x1f6, 0x91, 0x90, 0xd1, 0xf4, 0x183, 0x19b, 0x38a, 0xf2, 0x5, 0x145, 0xb1, 0xa2, 0x78, 0x82, 0x94, 0x3aa, 0x180, 0x2b0, 0x38f, 0x36e, 0x2d0, 0x323, 0x8b, 0xf, 0x397, 0x345, 0x32b, 0x92, 0xa6, 0x2f8, 0x35e, 0x286, 0xd5, 0x3e0, 0x55, 0x270, 0x2d7, 0xad, 0x367, 0x24b, 0x31e, 0x24e, 0x194, 0x8a, 0x8d, 0x303, 0xef, 0x2ab, 0x222, 0x329, 0x196, 0x18e, 0x1a5, 0x5e, 0x3ef, 0x3c2, 0x135, 0x1fc, 0x3f, 0x3c1, 0xb3, 0x40, 0xc8, 0x141, 0x36a, 0xd8, 0x173, 0x238, 0x206, 0x145, 0x162, 0x288, 0x3c0, 0x31, 0xd4, 0x362, 0xc1, 0x1da, 0x357, 0x21d, 0xe8, 0x125, 0x1ce, 0x16d, 0x11f, 0x85, 0x31a, 0x46, 0x3c4, 0x239, 0x284, 0x1d1, 0x2c8, 0x308, 0x170, 0x3be, 0x3ba, 0x1b2, 0x3e2, 0x151, 0x358, 0x18a, 0x3ad, 0x20e, 0x15c, 0x1cb, 0x3e7, 0x3db, 0x19c, 0x93, 0x24, 0x26c, 0xf4, 0x306, 0x265, 0x6f, 0x33b, 0xa0, 0x1f4, 0x26, 0x368, 0x1dc, 0x5b, 0x165, 0x106, 0x2c, 0x275, 0x104, 0x250, 0x16f, 0x36, 0x2bd, 0x238, 0x5, 0x11d, 0x302, 0xda, 0xee, 0x5b, 0x2ca, 0x11, 0x160, 0x311, 0x3b2, 0x356, 0x137, 0x1f0, 0x55, 0xe9, 0x34e, 0x161, 0x215, 0x1e2, 0x239, 0x101, 0x34d, 0x26d, 0xec, 0x253, 0x263, 0x2cf, 0x10c, 0x262, 0x3cb, 0x35c, 0x30d, 0x3fd, 0x1e1, 0x135, 0x3f8, 0xfc, 0x237, 0x322, 0x12, 0x26c, 0x1e8, 0x3, 0x30c, 0x2f9, 0x3b1, 0x5a, 0x3ce, 0x241, 0xf, 0x327, 0x10f, 0x16e, 0x132, 0xed, 0x357, 0x33, 0x3a0, 0x13a, 0xdf, 0x1f3, 0x359, 0x210, 0xff, 0x13b, 0x1db, 0x3a3, 0x236, 0x226, 0x242, 0x303, 0x1de, 0x2be, 0x134, 0x2fc, 0x2ac, 0x358, 0x314, 0x2af, 0x54, 0x1ed, 0x11e, 0xe, 0x223, 0x35f, 0x1, 0x104, 0x250, 0x16f, 0x36, 0x2bd, 0x238, 0x5, 0x11d, 0x302, 0xda, 0xee, 0x5b, 0x2ca, 0x11, 0x160, 0x311, 0x3b2, 0x356, 0x137, 0x1f0, 0x55, 0x208, 0x152, 0x36a, 0x360, 0x31d, 0x33b, 0x280, 0x37f, 0x192, 0x203, 0x327, 0x21e, 0x1b1, 0x182, 0x2cb, 0x22a, 0xdb, 0x3d4, 0x3e, 0x117, 0x270, 0x34e, 0x2c2, 0x46, 0x30b, 0x3d8, 0x68, 0x2d4, 0xa5, 0x1e3, 0x273, 0x15f, 0x134, 0x1f1, 0x2a2, 0x2f6, 0x12c, 0x15d, 0x12d, 0x355, 0x7f, 0x3f, 0x31f, 0x322, 0x24, 0x1a2, 0x35b, 0x30, 0x158, 0x317, 0x346, 0x2a6, 0x2c4, 0x6d, 0xee, 0xb6, 0x33a, 0x88, 0x22d, 0x2f8, 0x163, 0x3a, 0x125, 0x331, 0x2fd, 0x359, 0x29, 0x3fc, 0x1ca, 0x18f, 0x95, 0xbb, 0x164, 0x219, 0x392, 0x335, 0x2cf, 0x218, 0x19a, 0x267, 0x1a5, 0x178, 0x287, 0x15c, 0x325, 0x207, 0x315, 0x35f, 0x2, 0x19, 0x2a4, 0x2dd, 0x2c9, 0x233, 0x27f, 0x109, 0x2f7, 0x324, 0xf, 0x247, 0x35, 0x362, 0x304, 0x19f, 0x5d, 0x1b6, 0x3a1, 0x7c, 0x22e, 0xe9, 0x295, 0x18d, 0x8c, 0x21f, 0x19, 0x141, 0x366, 0x265, 0x378, 0x36b, 0x2d0, 0x12e, 0x288, 0x23f, 0x5b, 0x33a, 0x110, 0xa6, 0x3ed, 0x21d, 0x349, 0x1c2, 0x3d6, 0x4e, 0x2d7, 0x161, 0x46, 0x21f, 0x37b, 0x340, 0x113, 0x8d, 0x2e, 0x3be, 0x1ef, 0x43, 0x262, 0x337, 0x1a5, 0x2f0, 0x20e, 0x2f2, 0x23c, 0x70, 0xf9, 0xb3, 0x200, 0x26c, 0x3a9, 0x30, 0x2b0, 0x47, 0x206, 0x23a, 0x26, 0x376, 0x3f5, 0x345, 0x16e, 0xc1, 0x2cb, 0x5d, 0x36c, 0x29f, 0x3e0, 0x2a8, 0x11f, 0x21, 0x339, 0x13b, 0x365, 0x24e, 0xbb, 0x2c8, 0x76, 0xaf, 0x33c, 0x146, 0x329, 0xab, 0x358, 0x4b, 0x2aa, 0x12d, 0x2a3, 0x1fc, 0x1f8, 0x19c, 0x91, 0x112, 0x94, 0x16f, 0xd8, 0x38a, 0x33b, 0x109, 0x1e7, 0x8b, 0x78, 0x31, 0x2a9, 0x106, 0x160, 0x5f, 0x35e, 0x1d, 0x125, 0x26b, 0x3e6, 0x2fe, 0x290, 0x367, 0x27c, 0x239, 0xd, 0xb5, 0x256, 0x1e3, 0x32, 0x10d, 0x306, 0x211, 0x3c3, 0x346, 0x28a, 0x13, 0x376, 0x3e3, 0x10f, 0x362, 0xb, 0x1c6, 0x36d, 0x105, 0x296, 0x26b, 0x3c5, 0x3ea, 0xad, 0x215, 0x30b, 0x37b, 0x289, 0x45, 0x61, 0x2e0, 0x335, 0x32e, 0x1c8, 0x251, 0x358, 0x96, 0x2ba, 0x17a, 0x26a, 0x3f7, 0x2e7, 0x3ab, 0x4, 0xc8, 0x3d, 0x3, 0x56, 0x317, 0x103, 0x23a, 0x4c, 0x1c3, 0x397, 0x35, 0x193, 0x2c, 0x311, 0x1af, 0x1d, 0x24a, 0x1be, 0x30f, 0x3b3, 0x2b4, 0x46, 0x37, 0x1f7, 0x236, 0x114, 0x184, 0x392, 0xcf, 0xa3, 0x329, 0x156, 0x17b, 0x258, 0x2fa, 0x1e1, 0x1ba, 0x3c7, 0x38e, 0x2b7, 0x10, 0x320, 0xf4, 0xc, 0x158, 0x47, 0x5, 0xfa, 0x130, 0x305, 0x247, 0xd4, 0x245, 0xb0, 0x5f, 0x2b5, 0x74, 0x13a, 0x2f1, 0x27, 0x2d7, 0x2c2, 0x118, 0xdc, 0x3d5, 0xca, 0x59, 0x219, 0x253, 0x33c, 0x28c, 0xbf, 0x151, 0x64, 0x3d, 0x6, 0x158, 0x8e, 0x14, 0x3d9, 0x324, 0x78, 0xc4, 0x2ca, 0x110, 0x298, 0x2a7, 0x269, 0x34b, 0x3c9, 0x16d, 0x3a8, 0xa4, 0x367, 0x1e2, 0x3d8, 0x340, 0x45, 0xc2, 0x392, 0x19e, 0x28c, 0x17e, 0x14d, 0x333, 0x30d, 0x3a7, 0x2b8, 0x23c, 0x1c0, 0x38b, 0x93, 0x89, 0x128, 0x36a, 0x336, 0x2f9, 0x36e, 0x2a6, 0x20d, 0x376, 0x3cf, 0x35, 0x326, 0xb0, 0xbe, 0x2c6, 0x3a0, 0x384, 0x28f, 0x1d2, 0x10a, 0x339, 0xe5, 0x235, 0x284, 0x25e, 0xa5, 0x303, 0x1df, 0x3de, 0x218, 0xcb, 0xd6, 0x4b, 0x2ba, 0x2f4, 0x1ba, 0x387, 0x223, 0x195, 0x100, 0xd1, 0x177, 0x209, 0x2e6, 0x33b, 0x2d, 0x24f, 0x288, 0xee, 0x1b9, 0x32b, 0x264, 0x19f, 0x2e8, 0x143, 0x14b, 0x26b, 0x383, 0x3b3, 0x161, 0x118, 0x1b8, 0x34f, 0x259, 0x199, 0x3b0, 0x1cd, 0x15f, 0x1b2, 0xa7, 0x3cb, 0x1a5, 0x3d2, 0xa8, 0x1d7, 0xc8, 0xf4, 0x30, 0x1ad, 0x1e4, 0x109, 0x323, 0x288, 0x1dc, 0x2ed, 0x16e, 0x201, 0x38c, 0x35e, 0xe8, 0x1c2, 0x28f, 0x3a4, 0x21, 0x1fe, 0x24b, 0x239, 0x68, 0x113, 0x61, 0x392, 0x33c, 0x222, 0x3e2, 0xfd, 0x2b1, 0x2f0, 0x54, 0x1d7, 0x1fc, 0x3db, 0x3d1, 0x8, 0x249, 0x3a9, 0x180, 0x173, 0x33b, 0x5a, 0x12e, 0x6d, 0x2fb, 0x345, 0x362, 0x2c, 0x5f, 0x2c6, 0x349, 0x20b, 0x55, 0x11f, 0x108, 0x3eb, 0x27c, 0x1ec, 0x340, 0x8a, 0x308, 0xaf, 0x1d6, 0x134, 0x32f, 0x3e1, 0x1a5, 0x3ad, 0x2a0, 0x2a3, 0x3fb, 0x2e7, 0x2b7, 0x40, 0x26c, 0x177, 0x1b, 0x38a, 0x1ee, 0x2d0, 0x162, 0x368, 0x3f5, 0x21e, 0x326, 0x160, 0x2f8, 0x21d, 0x27e, 0x7c, 0x2a8, 0xea, 0x52, 0x367, 0x3c4, 0x37b, 0x236, 0x59, 0x76, 0x171, 0x2ab, 0x1b2, 0x14e, 0x337, 0x133, 0x157, 0x12d, 0x135, 0x3e7, 0x315, 0x195, 0x200, 0x190, 0x3d0, 0x180, 0x2e6, 0xf7, 0x2d0, 0x2c4, 0x1bb, 0x397, 0x1a8, 0x11, 0xa6, 0x2a7, 0x1b6, 0xd5, 0x39c, 0x383, 0x2d7, 0x23d, 0x299, 0x31e, 0x101, 0x2d4, 0x8d, 0x2e0, 0x19e, 0x222, 0x3cd, 0x3f4, 0x1a5, 0x353, 0x292, 0x135, 0x3c7, 0x4f, 0xb3, 0x48, 0x4a, 0x36a, 0xc3, 0x3c3, 0x206, 0x3e8, 0x241, 0x3c0, 0xb6, 0x391, 0xc1, 0xe3, 0x1af, 0xe8, 0x384, 0x22e, 0x11f, 0x210, 0x3b7, 0x3c4, 0x2ff, 0xca, 0x2c8, 0x369, 0x273, 0x3ba, 0x86, 0xcb, 0x358, 0xb9, 0x3f3, 0x15c, 0x71, 0x21b, 0x19c, 0x102, 0x64, 0xf4, 0x60, 0x2bd, 0x33b, 0xb4, 0xb1, 0x368, 0x3e3, 0x6a, 0x106, 0x22d, 0x3af, 0x269, 0x137, 0xe7, 0x3e6, 0x3b3, 0x18d, 0x1a4, 0x2c3, 0x142, 0xb5, 0x121, 0xb8, 0x263, 0x28c, 0x1f1, 0xfd, 0x16b, 0x3d2, 0x2a0, 0x14f, 0x3f7, 0x315, 0x32a, 0x12, 0x216, 0x2de, 0x336, 0x3f6, 0x320, 0x35b, 0x1b, 0x233, 0x2df, 0x145, 0x98, 0x1e, 0x188, 0xf3, 0x132, 0x275, 0x1af, 0x1d0, 0x20b, 0x154, 0x1d4, 0x290, 0x23, 0x1b8, 0x24e, 0x34d, 0xa5, 0x2e, 0x335, 0x28c, 0x3e2, 0x3f4, 0x34a, 0x157, 0xbd, 0x374, 0xe, 0x3e4, 0x126, 0x82, 0x10d, 0xc, 0x1ad, 0x399, 0xb4, 0x162, 0x1bb, 0x327, 0x2a9, 0x88, 0x272, 0x5d, 0x143, 0x24a, 0x3d6, 0x1d2, 0x42, 0x3eb, 0x1e2, 0x2ff, 0x194, 0x332, 0x37e, 0x371, 0x3b5, 0x1c8, 0x151, 0x26f, 0xbc, 0x54, 0x355, 0x3ff, 0x315, 0x25d, 0x48, 0x94, 0x1b3, 0x211, 0x47, 0x50, 0x3ce, 0x288, 0x379, 0x283, 0x326, 0x189, 0x3d3, 0x269, 0x26e, 0x39c, 0x30f, 0x34e, 0x1cc, 0x1ca, 0x318, 0xd0, 0x8a, 0x3b, 0x2e2, 0x175, 0x225, 0x261, 0x358, 0x172, 0x3d7, 0x2f2, 0x319, 0x3f0, 0x3d1, 0x20, 0xd1, 0x3aa, 0x360, 0x2f9, 0x346, 0xfa, 0x324, 0x3c0, 0x249, 0x177, 0xd8, 0x378, 0x346, 0x1f4, 0x8b, 0x23f, 0x2ed, 0x362, 0x160, 0x3ed, 0x269, 0xd5, 0x26b, 0x4e, 0x85, 0x1fe, 0x27c, 0x37b, 0x194, 0x26d, 0x1e3, 0x3be, 0x32e, 0x17e, 0xfd, 0x1a5, 0x157, 0x17a, 0x1cb, 0x70, 0x237, 0x81, 0xc8, 0x3a9, 0x1b, 0x6f, 0x36e, 0x23a, 0x192, 0x3c0, 0x2d8, 0x16e, 0x2c, 0x2f8, 0xcc, 0x29f, 0x1ce, 0x30f, 0x295, 0x339, 0x24b, 0x1ec, 0x236, 0x2c8, 0x1bf, 0x371, 0x363, 0x329, 0x29a, 0x2b1, 0x3ad, 0x12d, 0x1ba, 0xe, 0x3c1, 0x91, 0x19, 0xf4, 0x180, 0x38a, 0x36b, 0x145, 0x130, 0x78, 0x5b, 0x32b, 0x201, 0x5f, 0x21d, 0x3d4, 0x33f, 0x3e6, 0x2d7, 0xe6, 0x1ca, 0x239, 0x340, 0x59, 0x3b0, 0xef, 0x1ef, 0xe4, 0x151, 0xd7, 0x2f0, 0x2a0, 0x135, 0x307, 0xf9, 0x93, 0x82, 0x21a, 0x30, 0x173, 0x1ee, 0x2ad, 0x26, 0xf, 0x188, 0x1e6, 0xc1, 0x38c, 0x9b, 0x1d5, 0x2c9, 0x3e5, 0xa, 0x1e7, 0x119, 0x3fe, 0xd4, 0x44, 0xed, 0x2e8, 0x3a, 0x301, 0x2a8, 0x2bb, 0x2b4, 0x1a4, 0x235, 0x34, 0x8a, 0xec, 0x273, 0x1ef, 0x1c8, 0x14d, 0x2b1, 0x353, 0xbd, 0x1cb, 0xe0, 0xce, 0x1, 0x9b, 0x1d5, 0x2c9, 0x3e5, 0xa, 0x1e7, 0x119, 0x3fe, 0xd4, 0x44, 0xed, 0x2e8, 0x3a, 0x301, 0x2a8, 0x2bb, 0x2b4, 0x1a4, 0x235, 0x34, 0x8a, 0xec, 0x273, 0x1ef, 0x1c8, 0x14d, 0x2b1, 0x353, 0xbd, 0x1cb, 0xe0, 0xce, 0x1, 0x9b, 0x1d5, 0x2c9, 0x3e5, 0xa, 0x1e7, 0x119, 0x3fe, 0xd4, 0x44, 0xed, 0x2e8, 0x3a, 0x301, 0x2a8, 0x2bb, 0x2b4, 0x1a4, 0x235, 0x34, 0x8a, 0xec, 0x273, 0x1ef, 0x1c8, 0x14d, 0x2b1, 0x353, 0xbd, 0x1cb, 0xe0, 0xce, 0x1, 0x9b, 0x1d5, 0x2c9, 0x3e5, 0xa, 0x1e7, 0x119, 0x3fe, 0xd4, 0x44, 0xed, 0x2e8, 0x3a, 0x301, 0x2a8, 0x136, 0x35d, 0x265, 0x227, 0x140, 0x12e, 0x1bb, 0x10e, 0x33a, 0x264, 0x311, 0x21d, 0x34b, 0x39c, 0x4e, 0x214, 0x3df, 0x21f, 0x127, 0x12f, 0x8d, 0x253, 0x15f, 0x43, 0x251, 0x333, 0x2f0, 0x292, 0x374, 0x70, 0xce, 0x2, 0x26c, 0x2b3, 0xc3, 0x47, 0x280, 0x25c, 0x376, 0x21c, 0x27d, 0xc1, 0x22b, 0x33, 0x29f, 0x331, 0x9c, 0x21, 0x3b7, 0x37, 0x24e, 0x25e, 0x11a, 0xaf, 0x2be, 0x86, 0xab, 0x26f, 0x1e9, 0x12d, 0x2e1, 0xe0, 0x19c, 0x4, 0xd1, 0x16f, 0x186, 0x8e, 0x109, 0xb1, 0x2e5, 0x31, 0xf3, 0x182, 0x5f, 0x66, 0x137, 0x26b, 0x138, 0x42, 0x367, 0x6e, 0x95, 0xb5, 0x234, 0x15e, 0x175, 0x10c, 0x156, 0xd7, 0x3d2, 0x25a, 0x1cb, 0x1c0, 0x338, 0x8, 0x1a2, 0x2de, 0x30c, 0x11c, 0x212, 0x162, 0x1c3, 0x62, 0x1e6, 0x304, 0xbe, 0xcc, 0x26e, 0xdf, 0x270, 0x84, 0x2c7, 0xdc, 0x26c, 0x16f, 0x30c, 0x238, 0x5a, 0x302, 0xf, 0x5b, 0x16e, 0x160, 0x357, 0x356, 0x13a, 0x55, 0x359, 0x161, 0x13b, 0x239, 0x236, 0x26d, 0x303, 0x263, 0x134, 0x262, 0x358, 0x30d, 0x54, 0x135, 0xe, 0x237, 0x1, 0x26c, 0x16f, 0x30c, 0x238, 0x5a, 0x302, 0xf, 0x5b, 0x16e, 0x160, 0x357, 0x356, 0x13a, 0x55, 0x359, 0x161, 0x13b, 0x239, 0x236, 0x26d, 0x303, 0x263, 0x134, 0x262, 0x358, 0x30d, 0x54, 0x135, 0xe, 0x237, 0x1, 0x26c, 0x16f, 0x30c, 0x238, 0x5a, 0x302, 0xf, 0x5b, 0x16e, 0x160, 0x357, 0x356, 0x13a, 0x55, 0x359, 0x161, 0x13b, 0x239, 0x236, 0x26d, 0x303, 0x263, 0x134, 0x262, 0x358, 0x30d, 0x54, 0x135, 0xe, 0x237, 0x1, 0x26c, 0x16f, 0x30c, 0x238, 0x5a, 0x302, 0xf, 0x5b, 0x16e, 0x160, 0x357, 0x356, 0x13a, 0x55, 0x359, 0x161, 0x13b, 0x239, 0x236, 0x26d, 0x303, 0xd1, 0x1b5, 0x56, 0x3c8, 0x352, 0x130, 0x389, 0x3a6, 0x106, 0x272, 0x3b2, 0x349, 0x3c9, 0x383, 0x85, 0x3df, 0x6e, 0x254, 0x342, 0x3b, 0xef, 0x2cf, 0x1f1, 0x337, 0x96, 0x3a7, 0x1d7, 0x3c7, 0x3e4, 0x81, 0x9b, 0x2b3, 0x30c, 0x79, 0x168, 0x26, 0xf0, 0x372, 0x326, 0x14c, 0x174, 0xe8, 0xf8, 0x1f3, 0x295, 0x3fc, 0x30b, 0x24e, 0x16a, 0x184, 0x39a, 0x3de, 0xbf, 0x3e1, 0x314, 0x3f3, 0x3bd, 0x3ff, 0x278, 0x91, 0x190, 0x1d5, 0x265, 0x8e, 0x2d, 0x302, 0x1e, 0x16c, 0x362, 0x22d, 0x22a, 0x1d, 0x1f, 0x1bd, 0x2d7, 0x27b, 0x1e2, 0x34f, 0x12f, 0x234, 0x171, 0x37d, 0x390, 0xfd, 0x266, 0x1fd, 0x2f2, 0x3f8, 0x4f, 0x93, 0x32, 0x2bf, 0x2c9, 0x317, 0x280, 0x162, 0x305, 0x229, 0x16e, 0x2c0, 0x147, 0x286, 0x384, 0x2b2, 0x3dd, 0x1cc, 0x13e, 0x3ee, 0x3a2, 0x242, 0xaf, 0x2ea, 0x72, 0x29a, 0x1a2, 0x2dd, 0x2b0, 0xf7, 0x28a, 0x8b, 0x379, 0x1a8, 0x92, 0x1c6, 0x33, 0xd5, 0x1eb, 0x23e, 0xad, 0x299, 0x7b, 0x194, 0x12b, 0x2e0, 0x2ab, 0x10c, 0x2a2, 0x1a5, 0x2ba, 0x2b8, 0x1fc, 0x4f, 0x126, 0xc8, 0x1d5, 0xc3, 0x238, 0x168, 0x4c, 0x3c0, 0x3a6, 0x20c, 0x1da, 0x1af, 0xf5, 0x1ce, 0x138, 0x210, 0x46, 0x18f, 0xd0, 0x2c8, 0x385, 0xcf, 0x1b2, 0xcb, 0x333, 0x3ad, 0x1e1, 0x71, 0x3db, 0x25d, 0x224, 0xf4, 0x6c, 0x3e5, 0xa0, 0xb1, 0x305, 0x5b, 0x1b1, 0x22d, 0x5d, 0x74, 0xf8, 0x3e6, 0x246, 0x3df, 0xdc, 0x142, 0x226, 0x3b0, 0x1df, 0x28c, 0x14e, 0x1ac, 0x213, 0x2a0, 0x2e1, 0x309, 0x3d1, 0x12, 0x152, 0x30, 0x233, 0x285, 0x1e7, 0x1b4, 0x10e, 0x1e6, 0x16, 0x3d3, 0x356, 0xe1, 0x159, 0x3dd, 0x398, 0xf1, 0x34f, 0x25e, 0xc2, 0x39a, 0x3b5, 0x2fc, 0x337, 0x12c, 0x287, 0x2a3, 0x344, 0x366, 0x1ad, 0x36b, 0x1f4, 0x288, 0x397, 0x33a, 0x201, 0x3ed, 0x356, 0x1c2, 0x16d, 0x2d7, 0x1fe, 0x21f, 0x254, 0x113, 0x3b0, 0x3be, 0x222, 0x262, 0x2f6, 0x2f0, 0x17a, 0x23c, 0x3db, 0xb3, 0x82, 0x3a9, 0x2c9, 0x47, 0x5a, 0x26, 0x3c0, 0x345, 0x22, 0x2cb, 0x2c6, 0x29f, 0x37c, 0x11f, 0xad, 0x13b, 0x1ec, 0xbb, 0x294, 0xaf, 0x3ba, 0x329, 0x3e1, 0x4b, 0x347, 0x2a3, 0xe, 0x19c, 0x40, 0x94, 0x6, 0x38a, 0x346, 0x1e7, 0x368, 0x31, 0x32b, 0x160, 0x28e, 0x1d, 0x7c, 0x3e6, 0x85, 0x367, 0x2e9, 0xd, 0x59, 0x1e3, 0x263, 0x1b2, 0x196, 0xd7, 0x157, 0x22f, 0x23b, 0x315, 0x93, 0xc8, 0x3aa, 0x30c, 0x1e4, 0x2ad, 0x192, 0x1dc, 0xd4, 0x92, 0x38c, 0xcc, 0x2a1, 0x28f, 0x359, 0x31a, 0x24b, 0x3ee, 0x293, 0x61, 0x39a, 0x363, 0x3e2, 0x18e, 0x2e4, 0x54, 0x1ba, 0x380, 0x3d1, 0x24, 0x281, 0x183, 0x173, 0x2d5, 0x2f7, 0x368, 0x62, 0xb7, 0x312, 0xba, 0x3a0, 0x33f, 0x9c, 0x29, 0x230, 0x18c, 0xca, 0x256, 0x32d, 0x1dd, 0x329, 0x3cb, 0x12c, 0x20e, 0x26a, 0x1c0, 0x3d1, 0x48, 0x10d, 0x1b, 0x3e5, 0x280, 0x302, 0xf0, 0x3a6, 0x22, 0x19f, 0x30a, 0xd5, 0x3a5, 0x3a8, 0x31a, 0x9f, 0x3a3, 0xb5, 0x219, 0x3bc, 0x146, 0x29c, 0x17b, 0x2f0, 0x2f4, 0xe2, 0x2e7, 0x322, 0x64, 0x3aa, 0x211, 0x399, 0x145, 0x116, 0x3fe, 0x165, 0x182, 0x3f2, 0x356, 0x384, 0x1bd, 0x295, 0x3df, 0x370, 0xd, 0xb2, 0x385, 0x33c, 0x316, 0x2ac, 0x1a5, 0x2fa, 0x3da, 0x3e7, 0x38b, 0x4, 0x216, 0x205, 0x1c5, 0x346, 0x3ce, 0x1bb, 0x188, 0x2dc, 0x53, 0x2e8, 0x29b, 0xe7, 0x270, 0xa4, 0xd2, 0x239, 0x328, 0x14a, 0xaf, 0x37d, 0xbf, 0x337, 0xb9, 0x2a, 0x1ba, 0x309, 0x35f, 0x120, 0x3d, 0x6c, 0x38f, 0x10b, 0x205, 0x38a, 0x103, 0x24f, 0x386, 0x16c, 0x245, 0x1da, 0x163, 0x137, 0x3d6, 0x3a8, 0x23d, 0x27c, 0x127, 0x342, 0x3b0, 0x2e3, 0x268, 0x196, 0x35c, 0x15d, 0x2f2, 0x3f7, 0x38b, 0x8, 0x4a, 0xc, 0x6f, 0xa, 0x25c, 0xf, 0x372, 0x20c, 0x2cb, 0x30a, 0x1aa, 0x28f, 0x17f, 0x1cc, 0x3c4, 0x12a, 0x226, 0x1bf, 0x335, 0x364, 0xab, 0x2d6, 0x2fa, 0x3bd, 0x387, 0x67, 0x40, 0x250, 0x60, 0x378, 0x50, 0x2c4, 0x78, 0x3a6, 0x44, 0x275, 0x66, 0x14b, 0x55, 0x3ea, 0x27b, 0x21f, 0x142, 0x114, 0x1e3, 0x19e, 0x316, 0x151, 0x29d, 0x3fd, 0x1d7, 0x7, 0x338, 0x200, 0x2a4, 0x300, 0x3f6, 0x280, 0x20d, 0x3c0, 0x10f, 0x220, 0x38c, 0x330, 0x24a, 0x2a8, 0x36f, 0x3fc, 0xdc, 0x202, 0xb2, 0x303, 0xeb, 0x86, 0x29a, 0xc5, 0x3d7, 0x2a3, 0x38, 0x1f6, 0x24, 0x10d, 0x36, 0x38f, 0x2d, 0x4c, 0x23f, 0x216, 0x6, 0x6f, 0x14, 0x162, 0x78, 0x345, 0x110, 0x38c, 0x269, 0x13a, 0x16d, 0x295, 0x367, 0x365, 0x340, 0x34c, 0x392, 0x3ba, 0x17e, 0x18e, 0x30d, 0x12d, 0x23c, 0x2e7, 0x93, 0x249, 0x36a, 0x1ad, 0x36e, 0x1e7, 0x376, 0x5b, 0x326, 0x1da, 0x2c6, 0xd5, 0x28f, 0x2fe, 0x339, 0x21f, 0x284, 0x59, 0x303, 0x1d6, 0x218, 0xfd, 0x4b, 0x20e, 0x1ba, 0x3f, 0x195, 0x82, 0x177, 0x30c, 0x33b, 0x23a, 0x288, 0x87, 0x32b, 0x312, 0x2e8, 0x27e, 0x26b, 0x11f, 0x161, 0x24b, 0x34f, 0x1a1, 0x3b0, 0x1cf, 0x1b2, 0xab, 0x1a5, 0x3fa, 0x1d7, 0xe, 0xfb, 0x24, 0x21a, 0xd8, 0x47, 0x2d0, 0x192, 0x2fb, 0x165, 0x201, 0x357, 0x1d, 0x3e0, 0x4e, 0x52, 0x1a4, 0x1ec, 0x1d1, 0x61, 0xef, 0x146, 0x262, 0x39d, 0x157, 0x15c, 0x3fb, 0x3c1, 0x8, 0x94, 0x30, 0x378, 0xa0, 0x302, 0x3c0, 0x21e, 0x92, 0x5f, 0x25, 0x18, 0x378, 0x140, 0x13, 0x23f, 0x1a8, 0x264, 0x3ed, 0x105, 0x1f0, 0x4e, 0xa4, 0x299, 0x37b, 0x12f, 0x3b, 0x3be, 0x268, 0x251, 0x1a5, 0x3fd, 0x355, 0x70, 0x3ab, 0x89, 0x3a9, 0xc3, 0x399, 0x23a, 0x119, 0x21c, 0x16e, 0x14c, 0x1af, 0x29f, 0x3a5, 0x17f, 0x339, 0x37, 0x202, 0x2c8, 0x5c, 0x2be, 0x329, 0x267, 0x382, 0x12d, 0x71, 0x38e, 0x91, 0xd1, 0x183, 0x38a, 0x5, 0xb1, 0x78, 0x283, 0x49, 0x5f, 0x2d1, 0x301, 0x3e6, 0x42, 0x118, 0x239, 0x176, 0x234, 0xef, 0x28c, 0x19a, 0xd7, 0x15d, 0x3da, 0x307, 0x338, 0x12, 0x21a, 0x1b0, 0x11c, 0x2ad, 0x116, 0x3cf, 0x1e6, 0x2c0, 0x174, 0x27e, 0xdf, 0x75, 0x31a, 0xf1, 0x12a, 0x8a, 0x3c6, 0xeb, 0x218, 0x1fa, 0x12c, 0x54, 0x396, 0x3e9, 0x191, 0x190, 0x1b5, 0x1ad, 0x2d5, 0x395, 0x386, 0x1b9, 0x11, 0x275, 0x198, 0x9d, 0x16d, 0x4a, 0x60, 0x3f6, 0x2d, 0x260, 0x2fb, 0x19d, 0x58, 0x5d, 0x13f, 0xdf, 0xea, 0x73, 0x381, 0x284, 0x164, 0x5c, 0x175, 0xbf, 0x31c, 0x5e, 0x1e1, 0x7f, 0xf9, 0x4, 0x128, 0x180, 0x3c3, 0xb4, 0x192, 0x3fe, 0x27d, 0x160, 0x174, 0xf5, 0x37c, 0x3a8, 0x1cc, 0x21f, 0x202, 0x199, 0x170, 0x1dd, 0x2fc, 0x6b, 0x178, 0x38d, 0x1fc, 0x3e4, 0x10, 0xa9, 0x209, 0x317, 0x2d0, 0x241, 0x3e3, 0x1e6, 0x189, 0x1d9, 0x3d4, 0x1eb, 0x2bb, 0x339, 0x6e, 0x1a, 0x26d, 0x1c9, 0x37d, 0x3e2, 0x1ac, 0x1e9, 0x22f, 0x3f9, 0x38b, 0x40, 0x2a4, 0x36, 0x47, 0x352, 0x116, 0x397, 0x391, 0x22d, 0x36d, 0x34b, 0x3a5, 0x2fe, 0xff, 0x1b8, 0x68, 0x1a6, 0x32d, 0x1ef, 0x393, 0x2b9, 0x3ad, 0xae, 0x3ff, 0x237, 0x100, 0x282, 0xd8, 0x11c, 0x153, 0x51, 0x247, 0x25f, 0xa6, 0x1af, 0x137, 0x28f, 0x3ea, 0x3fc, 0x2e9, 0x94, 0x180, 0x38f, 0x2d0, 0x8b, 0x397, 0x32b, 0xa6, 0x35e, 0xd5, 0x55, 0x2d7, 0x367, 0x31e, 0x194, 0x8d, 0xef, 0x222, 0x196, 0x1a5, 0x3ef, 0x135, 0x3f, 0xb3, 0xc8, 0x36a, 0x173, 0x206, 0x162, 0x3c0, 0xd4, 0xc1, 0x357, 0xe8, 0x1ce, 0x11f, 0x31a, 0x3c4, 0x284, 0x2c8, 0x170, 0x3ba, 0x3e2, 0x358, 0x3ad, 0x15c, 0x3e7, 0x19c, 0x24, 0xf4, 0x265, 0x33b, 0x1f4, 0x368, 0x5b, 0x106, 0x275, 0x269, 0x1c2, 0x3e6, 0x108, 0x1a4, 0x37b, 0xb5, 0x3b0, 0x263, 0x43, 0xfd, 0x258, 0x2a0, 0x23c, 0x315, 0x81, 0x216, 0x30, 0x3f6, 0x5a, 0x192, 0x3f5, 0x1e6, 0x312, 0x36d, 0x29f, 0x28f, 0x3dd, 0x3eb, 0x365, 0x236, 0x294, 0x39a, 0x146, 0x334, 0x2b1, 0x3fa, 0x2a3, 0x380, 0x195, 0x19, 0x16f, 0x1ad, 0x346, 0x12e, 0x78, 0x21e, 0x99, 0x3ed, 0x1d, 0x33f, 0x3a4, 0x161, 0x27c, 0x254, 0x59, 0x2e, 0x128, 0x209, 0x47, 0x153, 0x144, 0x31, 0x2cd, 0x361, 0xcc, 0x274, 0x1f3, 0x108, 0x348, 0x1f7, 0x1a1, 0x37e, 0xeb, 0xe4, 0x267, 0x2f, 0x3c2, 0x3f8, 0x31f, 0x200, 0x3d, 0x336, 0x33b, 0x3e8, 0x1bb, 0x2d8, 0x44, 0x22b, 0x356, 0xf8, 0x138, 0xad, 0x9f, 0x12a, 0x59, 0x5c, 0x1dd, 0x3e2, 0x2b9, 0x2af, 0x2f2, 0x207, 0x3ec, 0x112, 0x2ee, 0x158, 0x36e, 0x24f, 0x3c, 0x21e, 0x132, 0x3af, 0xe8, 0x39c, 0x75, 0xe6, 0x37, 0x34, 0x34c, 0x15e, 0x197, 0x262, 0x1ae, 0x1fd, 0x2a3, 0x309, 0x25d, 0xc8, 0x2dd, 0x1c5, 0x14, 0x20d, 0xee, 0x165, 0x58, 0x174, 0x3d4, 0x3a5, 0x3ea, 0x3eb, 0x2c3, 0xca, 0x8d, 0x1de, 0x9a, 0xab, 0x266, 0x107, 0x1cb, 0x3bf, 0x24c, 0x344, 0xc, 0x1fb, 0x5a, 0x324, 0x3cf, 0x32b, 0x14c, 0x163, 0x2a1, 0x159, 0x246, 0x46, 0x7b, 0x34d, 0x76, 0x39e, 0x225, 0xfd, 0x250, 0x36, 0x238, 0x11d, 0xda, 0x5b, 0x11, 0x311, 0x356, 0x1f0, 0xe9, 0x161, 0x1e2, 0x101, 0x26d, 0x253, 0x2cf, 0x262, 0x35c, 0x3fd, 0x135, 0xfc, 0x322, 0x26c, 0x3, 0x2f9, 0x5a, 0x241, 0x327, 0x16e, 0xed, 0x33, 0x13a, 0x1f3, 0x210, 0x13b, 0x3a3, 0x226, 0x303, 0x2be, 0x2fc, 0x358, 0x2af, 0x1ed, 0xe, 0x35f, 0x104, 0x16f, 0x2bd, 0x5, 0x302, 0xee, 0x2ca, 0x160, 0x3b2, 0x137, 0x55, 0x34e, 0x215, 0x239, 0x34d, 0xec, 0x263, 0x10c, 0x3cb, 0x30d, 0x1e1, 0x3f8, 0x237, 0x12, 0x1e8, 0x30c, 0x3b1, 0x3ce, 0xf, 0x10f, 0x132, 0x357, 0x3a0, 0xdf, 0x359, 0xff, 0x1db, 0x236, 0x242, 0x1de, 0x134, 0x2ac, 0x314, 0x54, 0x11e, 0x223, 0x1, 0x250, 0x36, 0x238, 0x11d, 0xda, 0x5b, 0x11, 0x311, 0x356, 0x1f0, 0xe9, 0x161, 0x1e2, 0x101, 0x26d, 0x253, 0x2cf, 0x262, 0x35c, 0x3fd, 0x135, 0xa9, 0xd8, 0x1e4, 0x1f4, 0x376, 0x2ed, 0x92, 0x3ed, 0xe8, 0x26b, 0x359, 0x1fe, 0x365, 0x194, 0x61, 0x3be, 0x18b, 0xfd, 0x2e4, 0x17a, 0x1fc, 0x237, 0x24, 0x3a9, 0x56, 0x36e, 0x12e, 0x3c0, 0x2a9, 0x2c, 0x2e8, 0x29f, 0x55, 0x295, 0x46, 0x1ec, 0xb5, 0x1bf, 0x1d6, 0x329, 0x6b, 0x3ad, 0x2f2, 0xe, 0x2b7, 0x19, 0x36a, 0x38a, 0xa0, 0x130, 0x3f5, 0x32b, 0x139, 0x21d, 0x13a, 0x3e6, 0x52, 0x1ca, 0x24e, 0x59, 0x170, 0x1ef, 0x14e, 0xd7, 0x3fa, 0x135, 0x1f8, 0x93, 0x344, 0x30, 0x38f, 0x2ad, 0x288, 0x188, 0x106, 0x38c, 0x356, 0x3e0, 0x3a4, 0x31a, 0x21f, 0x68, 0x256, 0x39a, 0x222, 0xab, 0x18a, 0x54, 0x23c, 0x9e, 0x8, 0x141, 0x2c9, 0x33b, 0x3bb, 0x386, 0x345, 0x99, 0x357, 0x349, 0x37c, 0x2fe, 0x3eb, 0x31e, 0xbb, 0x308, 0x1cf, 0x43, 0x3e1, 0x30d, 0x3c2, 0x3fb, 0x19c, 0x120, 0x152, 0x360, 0x33b, 0x37f, 0x203, 0x21e, 0x182, 0x22a, 0x3d4, 0x117, 0x34e, 0x46, 0x3d8, 0x2d4, 0x1e3, 0x15f, 0x1f1, 0x2f6, 0x15d, 0x355, 0x3f, 0x322, 0x1a2, 0x30, 0x317, 0x2a6, 0x6d, 0xb6, 0x88, 0x2f8, 0x3a, 0x331, 0x359, 0x3fc, 0x18f, 0xbb, 0x219, 0x335, 0x218, 0x267, 0x178, 0x15c, 0x207, 0x35f, 0x19, 0x2dd, 0x233, 0x109, 0x324, 0x247, 0x362, 0x19f, 0x1b6, 0x7c, 0xe9, 0x18d, 0x21f, 0xd0, 0x14a, 0xef, 0x268, 0x14d, 0x258, 0x25a, 0xfe, 0x237, 0x48, 0x2bf, 0x2b0, 0x285, 0x181, 0x1dc, 0x27d, 0x53, 0x2c6, 0x24a, 0x1f3, 0x52, 0x394, 0x12a, 0x2c8, 0x32d, 0x197, 0x334, 0x34a, 0x107, 0x243, 0x223, 0x4, 0x141, 0x19b, 0xf7, 0x1e7, 0x1e, 0x6a, 0x201, 0xba, 0x34b, 0x55, 0x123, 0x118, 0x37b, 0x342, 0x385, 0x175, 0x3cd, 0x3ca, 0x17d, 0x14f, 0xfc, 0x93, 0x281, 0xc0, 0x47, 0x2a4, 0x19b, 0x1ee, 0x395, 0xf0, 0x2a9, 0xb0, 0x2d3, 0x2a1, 0x1bd, 0x210, 0x1ca, 0x12a, 0x199, 0xaf, 0xa3, 0x32c, 0x18a, 0x150, 0x388, 0x3c1, 0x12, 0x35b, 0x2b0, 0x103, 0x20d, 0x2fb, 0x391, 0x272, 0xcc, 0x301, 0x9c, 0x161, 0x30b, 0xd0, 0x294, 0x3bc, 0x364, 0xfd, 0x382, 0x38d, 0x3e7, 0x3ec, 0x104, 0x36a, 0x233, 0x212, 0x8b, 0x21c, 0x245, 0x38c, 0x143, 0x277, 0xea, 0xff, 0x2c3, 0xbb, 0x3b, 0xcf, 0xe4, 0x231, 0x353, 0x3bd, 0x1c0, 0x166, 0x26c, 0x18, 0x317, 0x145, 0x1b4, 0x1b9, 0x92, 0x3af, 0x29b, 0x3d6, 0x36f, 0x215, 0x1ec, 0x2d4, 0x3c6, 0x175, 0x393, 0x333, 0x3fa, 0xdd, 0x3bf, 0x81, 0x250, 0x1b0, 0x33b, 0x2f7, 0x1e, 0xd4, 0x16, 0x1d9, 0xd5, 0x2b2, 0x42, 0x13b, 0x127, 0xb2, 0x392, 0x197, 0x261, 0x133, 0x2a, 0x71, 0xf9, 0x100, 0x1e8, 0x56, 0x1a3, 0x2c4, 0x1dc, 0x141, 0x265, 0x36b, 0x12e, 0x23f, 0x33a, 0xa6, 0x21d, 0x1c2, 0x4e, 0x161, 0x21f, 0x340, 0x8d, 0x3be, 0x43, 0x337, 0x2f0, 0x2f2, 0x70, 0xb3, 0x26c, 0x30, 0x47, 0x23a, 0x376, 0x345, 0xc1, 0x5d, 0x29f, 0x2a8, 0x21, 0x13b, 0x24e, 0x2c8, 0xaf, 0x146, 0xab, 0x4b, 0x12d, 0x1fc, 0x19c, 0x112, 0x16f, 0x38a, 0x109, 0x8b, 0x31, 0x106, 0x5f, 0x1d, 0x26b, 0x2fe, 0x367, 0x239, 0xb5, 0x1e3, 0x175, 0x32f, 0xd7, 0x3ef, 0x1cb, 0x315, 0x8, 0x21a, 0x30c, 0x36e, 0x162, 0x1dc, 0x1e6, 0x139, 0xcc, 0x20b, 0x270, 0x31a, 0xdc, 0x236, 0x61, 0x1cf, 0x218, 0x18e, 0x3ad, 0x3bd, 0x380, 0x191, 0x344, 0x180, 0x238, 0x1f4, 0x386, 0x21e, 0x201, 0x2e8, 0xd5, 0x16d, 0x108, 0x1ca, 0x254, 0x26d, 0x171, 0x222, 0x151, 0x258, 0x17a, 0x3fb, 0xfb, 0x82, 0x36a, 0x6f, 0x5a, 0x51, 0x188, 0x22, 0x2f8, 0x282, 0x186, 0x36e, 0x2c4, 0x379, 0x32b, 0x3b4, 0x1b6, 0x3e0, 0x23e, 0xff, 0x31e, 0x3a2, 0x2db, 0x2ab, 0x3cd, 0x26f, 0x3ef, 0x396, 0x4f, 0x40, 0x1e8, 0x158, 0x206, 0x4c, 0x3cf, 0x362, 0xe3, 0x143, 0x1ce, 0x2bb, 0x3b7, 0x239, 0x16a, 0x385, 0x3ba, 0x29c, 0x2d6, 0x20e, 0x71, 0x3e4, 0x24, 0x2ee, 0x2bd, 0xa0, 0x324, 0x21c, 0x106, 0xbe, 0x74, 0x37c, 0x3b3, 0x23, 0x37b, 0x226, 0xb8, 0x363, 0x261, 0xc5, 0x2a0, 0x7f, 0xce, 0x112, 0x2de, 0x233, 0x5a, 0xa2, 0x229, 0x110, 0x3d3, 0x13f, 0x28f, 0x123, 0xd2, 0x34f, 0xb2, 0x253, 0x146, 0x156, 0x12c, 0x17a, 0x3ff, 0x3ec, 0x19, 0x2c5, 0x1fb, 0x2ad, 0xda, 0x372, 0x99, 0x115, 0x34b, 0x2a8, 0x42, 0xe5, 0x254, 0xd3, 0x1cd, 0x134, 0x13d, 0x382, 0x22f, 0x207, 0x2ce, 0x249, 0xc, 0x227, 0x23a, 0x2e5, 0x10f, 0x201, 0x1d9, 0x354, 0x37a, 0x10d, 0x211, 0x346, 0x13, 0x3e3, 0x362, 0x1c6, 0x105, 0x26b, 0x3ea, 0x215, 0x37b, 0x45, 0x2e0, 0x32e, 0x251, 0x96, 0x17a, 0x3f7, 0x3ab, 0xc8, 0x3, 0x317, 0x23a, 0x1c3, 0x35, 0x2c, 0x1af, 0x24a, 0x30f, 0x2b4, 0x37, 0x236, 0x184, 0xcf, 0x329, 0x17b, 0x2fa, 0x1ba, 0x38e, 0x10, 0xf4, 0x158, 0x5, 0x130, 0x247, 0x245, 0x5f, 0x74, 0x2f1, 0x2d7, 0x118, 0x3d5, 0x59, 0x253, 0x28c, 0x151, 0x172, 0x38d, 0x307, 0x2ce, 0x9b, 0x30, 0x11c, 0x3e8, 0xf, 0x350, 0x2c0, 0x2c6, 0xe1, 0x9c, 0x31a, 0x370, 0x328, 0x76, 0xeb, 0x2fc, 0x39d, 0x3f3, 0x396, 0x9e, 0x100, 0x35b, 0x1ad, 0x50, 0x324, 0x31, 0x11, 0x1f9, 0x349, 0x343, 0x123, 0x1a4, 0x127, 0x199, 0x171, 0x9a, 0x13d, 0x30d, 0xae, 0x1c, 0xb3, 0x1a2, 0x300, 0x1e4, 0x2f7, 0xf0, 0x165, 0x53, 0x33, 0x20b, 0x1d2, 0x1cc, 0x365, 0x21a, 0x56, 0x206, 0x130, 0x87, 0x106, 0x2f8, 0x349, 0x28f, 0x85, 0x13b, 0x254, 0x34c, 0xef, 0x18b, 0x337, 0x3ad, 0x1d7, 0x1f8, 0x81, 0x141, 0x30c, 0x346, 0x26, 0x397, 0x326, 0x5f, 0xe8, 0x3d6, 0x295, 0x1a4, 0x24e, 0x26d, 0x39a, 0x1b2, 0x3e1, 0x2f0, 0x3bd, 0x3f, 0x91, 0xa9, 0x265, 0x36e, 0x302, 0x3f5, 0x362, 0x38c, 0x1d, 0x37c, 0x2d7, 0x230, 0x34f, 0x2c8, 0x171, 0x134, 0xfd, 0x5e, 0x2f2, 0x380, 0x93, 0x94, 0x2c9, 0x36b, 0x162, 0x2fb, 0x16e, 0x275, 0x286, 0x26b, 0x3dd, 0x46, 0x3ee, 0x59, 0xaf, 0x222, 0x29a, 0x30d, 0x15c, 0x70, 0x191, 0x216, 0xd8, 0x1ee, 0x12e, 0x1dc, 0x32b, 0x2cb, 0x356, 0x1ce, 0x2fe, 0x30e, 0x37b, 0x8a, 0x392, 0x146, 0x151, 0x2e4, 0x22f, 0xe, 0xb3, 0x344, 0x1b, 0x33b, 0x323, 0x23f, 0x1e6, 0x1da, 0x36c, 0x33f, 0x359, 0x367, 0x1ec, 0x113, 0x170, 0x3d, 0x158, 0x14, 0x324, 0xc4, 0x110, 0x2a7, 0x34b, 0x16d, 0xa4, 0x1e2, 0x340, 0xc2, 0x19e, 0x17e, 0x333, 0x3a7, 0x23c, 0x38b, 0x89, 0x36a, 0x2f9, 0x2a6, 0x376, 0x35, 0xb0, 0x2c6, 0x384, 0x1d2, 0x339, 0x235, 0x25e, 0x303, 0x3de, 0xcb, 0x4b, 0x2f4, 0x387, 0x195, 0xd1, 0x209, 0x33b, 0x24f, 0xee, 0x32b, 0x19f, 0x143, 0x26b, 0x3b3, 0x118, 0x34f, 0x199, 0x1cd, 0x1b2, 0x3cb, 0x3d2, 0x1d7, 0x3f0, 0x204, 0x21a, 0xac, 0xa, 0x192, 0x62, 0x88, 0x357, 0x3a1, 0x2b2, 0x52, 0xf1, 0x1a0, 0x61, 0xcf, 0xbf, 0x39d, 0x3d7, 0x11e, 0x3c1, 0x240, 0x1b5, 0x378, 0x153, 0x1bb, 0x21e, 0x58, 0x163, 0x1c2, 0xe9, 0x398, 0x31e, 0x12f, 0x385, 0x1ef, 0x261, 0x221, 0x17a, 0x3c7, 0x2ce, 0x26c, 0x300, 0x399, 0x323, 0x77, 0x391, 0x2cb, 0x2a5, 0x331, 0x3dd, 0x8c, 0x3a3, 0x2c8, 0x2e2, 0xd9, 0x3e1, 0x7a, 0x169, 0xa0, 0x22c, 0xb6, 0x99, 0x174, 0x14b, 0x30f, 0x18d, 0x1db, 0x1d1, 0x2f5, 0x37d, 0x334, 0x221, 0x2f4, 0x307, 0x25d, 0x281, 0xd8, 0x3b1, 0x2c4, 0x3f5, 0x193, 0xbe, 0x349, 0x22e, 0x42, 0x24b, 0x34, 0x11a, 0x263, 0xbf, 0x333, 0x347, 0xe2, 0x67, 0x82, 0x183, 0x317, 0x1f4, 0x3c, 0x2ca, 0x139, 0x1b6, 0x277, 0x2fe, 0x23, 0x3d5, 0x2c8, 0x1cd, 0x364, 0x337, 0x2af, 0x14f, 0x2e7, 0x20, 0x35b, 0x173, 0x2d, 0x119, 0x2ed, 0x304, 0x2d3, 0x13a, 0x138, 0x1cc, 0x31e, 0x25e, 0x20f, 0x363, 0x251, 0xb9, 0x22f, 0x38, 0x322, 0x94, 0x336, 0x2d5, 0x26, 0x247, 0x20c, 0x3ed, 0x1ea, 0x159, 0x52, 0x1e2, 0x289, 0x308, 0xeb, 0x3cd, 0x2b1, 0x2a, 0x7f, 0xfb, 0x64, 0xc, 0x238, 0x2f7, 0x389, 0x1e6, 0x361, 0x2a5, 0x26b, 0x36f, 0x69, 0x24e, 0x1a6, 0x1de, 0x43, 0x231, 0x15d, 0x1ba, 0xf4, 0x1ad, 0x109, 0x288, 0x2ed, 0x201, 0x35e, 0x1c2, 0x3a4, 0x1fe, 0x239, 0x113, 0x392, 0x222, 0xfd, 0x2f0, 0x1d7, 0x3db, 0x8, 0x3a9, 0x173, 0x5a, 0x6d, 0x345, 0x2c, 0x2c6, 0x20b, 0x11f, 0x3eb, 0x1ec, 0x8a, 0xaf, 0x134, 0x3e1, 0x3ad, 0x2a3, 0x2e7, 0x40, 0x177, 0x38a, 0x2d0, 0x368, 0x21e, 0x160, 0x21d, 0x7c, 0xea, 0x367, 0x37b, 0x59, 0x171, 0x1b2, 0x337, 0x157, 0x135, 0x315, 0x200, 0x3aa, 0x6f, 0x2ad, 0x376, 0xd4, 0x312, 0xcc, 0x3e0, 0x359, 0x30e, 0x3ee, 0x2c8, 0x39a, 0x18b, 0x18e, 0x2aa, 0x1ba, 0x9e, 0x24, 0x16f, 0x378, 0x145, 0x386, 0x2a9, 0xa6, 0x269, 0x33f, 0x2fe, 0x46, 0x34f, 0x26d, 0xef, 0x43, 0x6b, 0x17d, 0x1cb, 0xf9, 0x120, 0x36a, 0x3f6, 0x23a, 0xf, 0x165, 0x139, 0x36c, 0x1ce, 0x3dd, 0x230, 0x24e, 0x34c, 0x371, 0x218, 0x358, 0x3fa, 0x243, 0x3c1, 0x112, 0x1e8, 0x2bd, 0x5a, 0xda, 0x10f, 0x160, 0x33, 0x1f0, 0x359, 0x215, 0x3a3, 0x26d, 0x1de, 0x10c, 0x358, 0x3fd, 0x11e, 0x237, 0x104, 0x3, 0x238, 0x3ce, 0xee, 0x16e, 0x311, 0x3a0, 0x55, 0x210, 0x1e2, 0x236, 0xec, 0x2be, 0x262, 0x314, 0x1e1, 0xe, 0x322, 0x250, 0x30c, 0x5, 0x241, 0x5b, 0x132, 0x3b2, 0x13a, 0xe9, 0xff, 0x239, 0x226, 0x253, 0x134, 0x3cb, 0x2af, 0x135, 0x223, 0x12, 0x16f, 0x2f9, 0x11d, 0xf, 0x2ca, 0xed, 0x356, 0xdf, 0x34e, 0x13b, 0x101, 0x242, 0x263, 0x2fc, 0x35c, 0x54, 0x3f8, 0x35f, 0x26c, 0x36, 0x3b1, 0x302, 0x327, 0x11, 0x357, 0x137, 0x1f3, 0x161, 0x1db, 0x34d, 0x303, 0x2cf, 0x2ac, 0x30d, 0x1ed, 0xfc, 0x1, 0x1e8, 0x2bd, 0x5a, 0xda, 0x10f, 0x160, 0x33, 0x1f0, 0x359, 0x215, 0x3a3, 0x26d, 0x1de, 0x10c, 0x358, 0x3fd, 0x11e, 0x237, 0x104, 0x3, 0x238, 0x3d0, 0x2e6, 0x2d0, 0x1bb, 0x1a8, 0xa6, 0x1b6, 0x39c, 0x2d7, 0x299, 0x101, 0x8d, 0x19e, 0x3cd, 0x1a5, 0x292, 0x3c7, 0xb3, 0x4a, 0xc3, 0x206, 0x241, 0xb6, 0xc1, 0x1af, 0x384, 0x11f, 0x3b7, 0x2ff, 0x2c8, 0x273, 0x86, 0x358, 0x3f3, 0x71, 0x19c, 0x64, 0x60, 0x33b, 0xb1, 0x3e3, 0x106, 0x3af, 0x137, 0x3e6, 0x18d, 0x2c3, 0xb5, 0xb8, 0x28c, 0xfd, 0x3d2, 0x14f, 0x315, 0x12, 0x2de, 0x3f6, 0xfa, 0xf0, 0x1e6, 0x33e, 0x3a, 0x28f, 0x84, 0xf1, 0x236, 0x1d8, 0x2ea, 0x334, 0x12c, 0x57, 0x380, 0x244, 0x3d, 0x1ad, 0x2d, 0xda, 0x21e, 0x189, 0x198, 0x33f, 0x3ea, 0x69, 0x254, 0x14a, 0x39e, 0x17e, 0x35c, 0xa8, 0x3fb, 0x2ce, 0x281, 0x2c9, 0x1a3, 0x260, 0x188, 0x248, 0x1d9, 0x13a, 0x1d2, 0x3fc, 0x1ec, 0x228, 0x2e2, 0x18b, 0x231, 0x2fa, 0x243, 0x31f, 0x104, 0x6, 0xf2, 0x24f, 0x2fb, 0x3a9, 0x38a, 0x2ad, 0x386, 0x165, 0x1da, 0x286, 0x3d6, 0x21, 0x27c, 0x236, 0x3b0, 0x3ba, 0x196, 0x2e4, 0x2f2, 0x1f8, 0x8, 0x177, 0x6f, 0x145, 0xf, 0x33a, 0x2cb, 0x1d, 0x28f, 0x108, 0x3c4, 0x194, 0x1bf, 0x1ef, 0xab, 0x30d, 0x3bd, 0x3db, 0x40, 0x3aa, 0x378, 0x23a, 0x78, 0x1e6, 0x275, 0xe8, 0x55, 0x52, 0x21f, 0xbb, 0x1e3, 0x363, 0x151, 0x5e, 0x1d7, 0x2e7, 0x200, 0x16f, 0x3f6, 0x1f4, 0x3c0, 0x32b, 0x38c, 0x349, 0x2a8, 0x290, 0xdc, 0x1d1, 0x303, 0x32e, 0x29a, 0x2f0, 0x2a3, 0x315, 0x24, 0x36a, 0x38f, 0x3bb, 0x23f, 0x16e, 0x5f, 0x27e, 0x16d, 0xad, 0x2e9, 0x293, 0x2e, 0x146, 0xfd, 0x3ad, 0x135, 0x9e, 0x120, 0x366, 0x47, 0x1e7, 0x1dc, 0x362, 0x2f8, 0x3d4, 0x37a, 0x161, 0x365, 0xb5, 0x170, 0x222, 0x3e1, 0x157, 0x1ba, 0xf9, 0x112, 0x306, 0x238, 0x323, 0x2fb, 0x326, 0x3ed, 0x35b, 0x233, 0x145, 0x1e, 0xf3, 0x275, 0x1d0, 0x154, 0x290, 0x1b8, 0x34d, 0x2e, 0x28c, 0x3f4, 0x157, 0x374, 0x3e4, 0x82, 0xc, 0x399, 0x162, 0x327, 0x88, 0x5d, 0x24a, 0x1d2, 0x3eb, 0x2ff, 0x332, 0x371, 0x1c8, 0x26f, 0x54, 0x3ff, 0x25d, 0x94, 0x211, 0x50, 0x288, 0x283, 0x189, 0x269, 0x39c, 0x34e, 0x1ca, 0xd0, 0x3b, 0x175, 0x261, 0x172, 0x2f2, 0x3f0, 0x20, 0x3aa, 0x2f9, 0xfa, 0x3c0, 0x25f, 0x22b, 0x27e, 0x2da, 0x2b4, 0x365, 0x16a, 0x1c9, 0x134, 0x267, 0x2ba, 0x243, 0x67, 0x64, 0x180, 0x3dc, 0x13, 0x31, 0x124, 0x3b2, 0x1c2, 0x23e, 0x187, 0x34f, 0x291, 0x2e3, 0x17e, 0x16b, 0x292, 0x307, 0x322, 0x2a4, 0x2b0, 0x212, 0x1b4, 0xd4, 0x14c, 0x1ab, 0x37c, 0x10a, 0x13e, 0x236, 0x369, 0x2f3, 0xab, 0x213, 0x2ef, 0x2e7, 0x9, 0x1b5, 0x38f, 0x37f, 0xee, 0x362, 0x1f9, 0x34b, 0x3e6, 0x2bf, 0xde, 0x23a, 0x1e0, 0x25f, 0x5f, 0x1ea, 0x2fd, 0x31a, 0x63, 0x226, 0x171, 0x225, 0x2b9, 0x347, 0xfe, 0x167, 0x216, 0x186, 0x28, 0x288, 0x10f, 0x22d, 0x36c, 0x1be, 0x10a, 0x27c, 0xca, 0x37e, 0x363, 0x14d, 0x1e9, 0x135, 0x278, 0x224, 0x6, 0x399, 0x2c4, 0x87, 0x49, 0x1d9, 0x1c2, 0x75, 0x215, 0x24e, 0x14a, 0xcf, 0x32f, 0xc5, 0x38d, 0x380, 0x204, 0x35b, 0x6f, 0x11d, 0xf0, 0x32b, 0x22b, 0xf5, 0x37a, 0x18d, 0x235, 0x113, 0x2bc, 0x316, 0x358, 0x3a7, 0x7f, 0x2b7, 0x10b, 0xc3, 0x14, 0x144, 0x283, 0x312, 0x1b6, 0xdf, 0x85, 0x13e, 0x65, 0x1bf, 0x3b5, 0x2a2, 0x2f0, 0x29e, 0x13c, 0x112, 0x3, 0x3c8, 0x162, 0x247, 0x220, 0x2e8, 0xe1, 0x23e, 0x30e, 0x127, 0xa5, 0x263, 0x393, 0x266, 0x3c2, 0x1c0, 0x102, 0x3a9, 0x233, 0x28a, 0x78, 0x391, 0x311, 0x27e, 0x1bd, 0x2c2, 0x31e, 0x177, 0x378, 0x1f4, 0x23f, 0x362, 0x3ed, 0xd5, 0x4e, 0x1fe, 0x37b, 0x26d, 0x3be, 0x17e, 0x1a5, 0x17a, 0x70, 0x81, 0x3a9, 0x6f, 0x23a, 0x3c0, 0x16e, 0x2f8, 0x29f, 0x30f, 0x339, 0x1ec, 0x2c8, 0x371, 0x329, 0x2b1, 0x12d, 0xe, 0x91, 0xf4, 0x38a, 0x145, 0x78, 0x32b, 0x5f, 0x3d4, 0x3e6, 0xe6, 0x239, 0x59, 0xef, 0xe4, 0xd7, 0x2a0, 0x307, 0x93, 0x21a, 0x173, 0x2ad, 0xf, 0x1e6, 0x38c, 0x27e, 0x37a, 0x31a, 0xc6, 0x8a, 0x39a, 0x218, 0x39d, 0x54, 0x3e7, 0x191, 0x141, 0x1ad, 0x2d0, 0x386, 0x33a, 0x275, 0x349, 0x16d, 0x161, 0x31e, 0x113, 0x171, 0x43, 0x2f6, 0x20e, 0x3fb, 0xb3, 0xa9, 0x2b0, 0x5a, 0x376, 0x165, 0x2cb, 0xe8, 0x2a8, 0xad, 0x365, 0x1a1, 0xaf, 0x18b, 0x358, 0x347, 0x1fc, 0x195, 0x94, 0x56, 0x109, 0x368, 0x2a9, 0x1da, 0x1d, 0x55, 0x290, 0x2e9, 0xb5, 0x392, 0x2ee, 0x1fb, 0x3bb, 0x3b8, 0x83, 0x28e, 0x24a, 0x28b, 0x30e, 0x95, 0x242, 0x1d6, 0xcd, 0x172, 0x3bd, 0x1c7, 0x90, 0x306, 0x3c8, 0x181, 0x31, 0x132, 0x163, 0x3e0, 0x3b3, 0xe5, 0x340, 0x369, 0x3b5, 0x29a, 0x353, 0x2e1, 0x237, 0x190, 0x6c, 0x346, 0x116, 0x3a6, 0x312, 0x2d1, 0x1eb, 0x108, 0x37, 0x34d, 0x170, 0x268, 0x231, 0x3ef, 0x7f, 0x2ce, 0x94, 0xac, 0x2d, 0x376, 0x2ca, 0x33e, 0x349, 0x2da, 0x18d, 0xc6, 0x114, 0x273, 0xe4, 0x1ae, 0x292, 0xe, 0x122, 0x3d0, 0x6f, 0x7d, 0x31b, 0x362, 0x3d3, 0x354, 0x270, 0x3df, 0x3a3, 0x256, 0xcf, 0xa7, 0x4b, 0x2b8, 0x3e9, 0x200, 0x2dd, 0x11c, 0x12e, 0x327, 0x49, 0x36d, 0x1f, 0x17f, 0x1a4, 0x1a, 0x3b, 0x3ba, 0x156, 0x178, 0x135, 0x1f2, 0x208, 0x180, 0x2df, 0xc9, 0x2d8, 0x58, 0x330, 0x26b, 0x10a, 0x1e2, 0xbb, 0x20f, 0x111, 0x337, 0x1d5, 0x3e5, 0x1e7, 0x3fe, 0x44, 0x2e8, 0x301, 0x2bb, 0x1a4, 0x34, 0xec, 0x1ef, 0x14d, 0x353, 0x1cb, 0xce, 0x9b, 0x2c9, 0xa, 0x119, 0xd4, 0xed, 0x3a, 0x2a8, 0x2b4, 0x235, 0x8a, 0x273, 0x1c8, 0x2b1, 0xbd, 0xe0, 0x1, 0x1d5, 0x3e5, 0x1e7, 0x3fe, 0x44, 0x2e8, 0x301, 0x2bb, 0x1a4, 0x34, 0xec, 0x1ef, 0x14d, 0x353, 0x1cb, 0xce, 0x9b, 0x2c9, 0xa, 0x119, 0xd4, 0xed, 0x3a, 0x2a8, 0x2b4, 0x235, 0x8a, 0x273, 0x1c8, 0x2b1, 0xbd, 0xe0, 0x1, 0x1d5, 0x3e5, 0x1e7, 0x3fe, 0x44, 0x2e8, 0x301, 0x2bb, 0x1a4, 0x34, 0xec, 0x1ef, 0x14d, 0x353, 0x1cb, 0xce, 0x9b, 0x2c9, 0xa, 0x119, 0xd4, 0xed, 0x3a, 0x2a8, 0x2b4, 0x235, 0x8a, 0x273, 0x1c8, 0x2b1, 0xbd, 0xe0, 0x1, 0x1d5, 0x3e5, 0x1e7, 0x3fe, 0x44, 0x2e8, 0x301, 0x2bb, 0x1a4, 0x34, 0xec, 0x1ef, 0x14d, 0x353, 0x1cb, 0x3aa, 0x38f, 0x323, 0x397, 0x92, 0x35e, 0x3e0, 0x2d7, 0x24b, 0x194, 0x303, 0x222, 0x18e, 0x3ef, 0x1fc, 0xb3, 0x141, 0x173, 0x145, 0x3c0, 0x362, 0x357, 0x125, 0x11f, 0x46, 0x284, 0x308, 0x3ba, 0x151, 0x3ad, 0x1cb, 0x19c, 0x26c, 0x265, 0xa0, 0x368, 0x165, 0x275, 0x27e, 0x3e6, 0x339, 0x37b, 0x34c, 0x263, 0x14e, 0x258, 0x3bd, 0x315, 0x112, 0x30, 0x36b, 0x192, 0x2ed, 0x312, 0x356, 0x28f, 0x290, 0x365, 0x113, 0x39a, 0xe4, 0x2b1, 0x17a, 0x380, 0x8, 0x16f, 0x47, 0x12e, 0x87, 0x99, 0x2c6, 0x33f, 0x295, 0x27c, 0xbb, 0x2e, 0x134, 0x6b, 0x347, 0x3fb, 0x191, 0x21a, 0x38a, 0x23a, 0x23f, 0x326, 0x28e, 0x13a, 0xea, 0x230, 0xd, 0x76, 0x1ef, 0x29a, 0x157, 0x243, 0xfb, 0x344, 0x30c, 0x109, 0x376, 0x33a, 0x38c, 0x3d4, 0x30f, 0x1fe, 0x3ee, 0x256, 0x33c, 0x262, 0x2e4, 0x1d7, 0x9e, 0x82, 0x35d, 0x227, 0x12e, 0x10e, 0x264, 0x21d, 0x39c, 0x214, 0x21f, 0x12f, 0x253, 0x43, 0x333, 0x292, 0x70, 0x2, 0x2b3, 0x47, 0x25c, 0x21c, 0xc1, 0x33, 0x331, 0x21, 0x37, 0x25e, 0xaf, 0x86, 0x26f, 0x12d, 0xe0, 0x4, 0x16f, 0x8e, 0xb1, 0x31, 0x182, 0x66, 0x26b, 0x42, 0x6e, 0xb5, 0x15e, 0x10c, 0xd7, 0x25a, 0x1c0, 0x8, 0x2de, 0x11c, 0x162, 0x62, 0x304, 0xcc, 0xdf, 0x84, 0xdc, 0x16a, 0x2bc, 0x218, 0x1ae, 0xbd, 0x380, 0x10, 0x1b5, 0x238, 0x2c4, 0xc4, 0x201, 0x198, 0x1be, 0x108, 0x1b8, 0x2d4, 0x171, 0x39, 0x35c, 0x17a, 0x309, 0x20, 0x36a, 0x79, 0x181, 0x188, 0xb, 0x330, 0x37c, 0x210, 0x370, 0x1a1, 0x2e2, 0x72, 0x2b1, 0x2f4, 0x21b, 0x40, 0x2dd, 0xf2, 0x302, 0x310, 0x16, 0x269, 0x2f1, 0x29, 0x2e9, 0x342, 0x1cd, 0xe4, 0x16b, 0x1e1, 0x3f, 0x80, 0x1b3, 0x1e4, 0x2b3, 0x8e, 0x162, 0xc4, 0xb, 0x269, 0x1eb, 0xa4, 0x365, 0x45, 0x1de, 0x17e, 0xc5, 0x2b8, 0x2e7, 0x89, 0x60, 0x36e, 0x22c, 0x35, 0x1da, 0x3a0, 0x2fd, 0x339, 0x1f7, 0xa5, 0x1d6, 0xcb, 0xbc, 0x1ba, 0xce, 0xd1, 0x30c, 0x2d, 0x305, 0x32b, 0x3f2, 0x14b, 0x11f, 0x118, 0x1a, 0x3b0, 0x197, 0x3cb, 0x3fa, 0xfe, 0x166, 0x21a, 0x233, 0x3e8, 0x2fb, 0x88, 0x2d3, 0x3e0, 0x34e, 0xf1, 0x1d1, 0x1c9, 0x316, 0x39d, 0x292, 0xe0, 0x8, 0x1b5, 0x79, 0x302, 0x229, 0x58, 0x36c, 0x343, 0x129, 0x31e, 0x228, 0x2eb, 0x3e2, 0x221, 0x1ed, 0x315, 0x41, 0x300, 0x346, 0x144, 0x1a8, 0x2cb, 0x13f, 0x3c5, 0x1fe, 0x3a3, 0x121, 0x2ab, 0x251, 0x1e9, 0x1cb, 0x279, 0x281, 0x56, 0x168, 0x1e, 0x16e, 0x3af, 0x24a, 0xea, 0xd2, 0xd0, 0x1bf, 0xa3, 0x267, 0x3ef, 0x3f9, 0x322, 0xf4, 0x1bc, 0x37f, 0x3f5, 0x16f, 0x238, 0x302, 0x5b, 0x160, 0x356, 0x55, 0x161, 0x239, 0x26d, 0x263, 0x262, 0x30d, 0x135, 0x237, 0x26c, 0x30c, 0x5a, 0xf, 0x16e, 0x357, 0x13a, 0x359, 0x13b, 0x236, 0x303, 0x134, 0x358, 0x54, 0xe, 0x1, 0x16f, 0x238, 0x302, 0x5b, 0x160, 0x356, 0x55, 0x161, 0x239, 0x26d, 0x263, 0x262, 0x30d, 0x135, 0x237, 0x26c, 0x30c, 0x5a, 0xf, 0x16e, 0x357, 0x13a, 0x359, 0x13b, 0x236, 0x303, 0x134, 0x358, 0x54, 0xe, 0x1, 0x16f, 0x238, 0x302, 0x5b, 0x160, 0x356, 0x55, 0x161, 0x239, 0x26d, 0x263, 0x262, 0x30d, 0x135, 0x237, 0x26c, 0x30c, 0x5a, 0xf, 0x16e, 0x357, 0x13a, 0x359, 0x13b, 0x236, 0x303, 0x134, 0x358, 0x54, 0xe, 0x1, 0x16f, 0x238, 0x302, 0x5b, 0x160, 0x356, 0x55, 0x161, 0x239, 0x26d, 0x263, 0x262, 0x30d, 0x135, 0x237, 0x26c, 0x30c, 0x5a, 0xf, 0x16e, 0x357, 0x2de, 0xf2, 0x26, 0x1b9, 0x53, 0x1d, 0x2da, 0x398, 0x3ee, 0x121, 0x2be, 0x151, 0x2ae, 0xe2, 0x195, 0x282, 0x233, 0x3bb, 0x3e3, 0x248, 0x21d, 0xdf, 0x29, 0x365, 0x114, 0x1df, 0x32f, 0xb9, 0x355, 0x3c1, 0x9b, 0x186, 0x5a, 0x1e, 0x1b1, 0x28e, 0x384, 0x3ea, 0x24b, 0x176, 0x1c9, 0x43, 0x1ae, 0x1e1, 0x1f8, 0x48, 0x18, 0x36e, 0xa2, 0x350, 0x275, 0x3a1, 0x138, 0x30e, 0x101, 0x1d8, 0x32e, 0x267, 0x3a7, 0x3e7, 0x122, 0x1d5, 0x47, 0x2c4, 0x229, 0x160, 0x2a5, 0x154, 0x31a, 0x3d8, 0x12b, 0x1d6, 0x32c, 0x3d2, 0x243, 0x3ab, 0x250, 0x173, 0x7d, 0x379, 0x110, 0x2b5, 0xe7, 0x21, 0x1b8, 0x28d, 0xef, 0x2fc, 0x221, 0x3bd, 0x13c, 0x64, 0x2c9, 0x140, 0x1c3, 0x32b, 0x3d3, 0x9d, 0x359, 0x276, 0xca, 0x2e, 0x364, 0x3ca, 0x12d, 0x309, 0x100, 0x306, 0x3dc, 0x241, 0x21e, 0x3b4, 0x13f, 0x30f, 0x1b5, 0x3c8, 0x130, 0x3a6, 0x272, 0x349, 0x383, 0x3df, 0x254, 0x3b, 0x2cf, 0x337, 0x3a7, 0x3c7, 0x81, 0x2b3, 0x79, 0x26, 0x372, 0x14c, 0xe8, 0x1f3, 0x3fc, 0x24e, 0x184, 0x3de, 0x3e1, 0x3f3, 0x3ff, 0x91, 0x1d5, 0x8e, 0x302, 0x16c, 0x22d, 0x1d, 0x1bd, 0x27b, 0x34f, 0x234, 0x37d, 0xfd, 0x1fd, 0x3f8, 0x93, 0x2bf, 0x317, 0x162, 0x229, 0x2c0, 0x286, 0x2b2, 0x1cc, 0x3ee, 0x242, 0x2ea, 0x29a, 0x2ba, 0x7f, 0x191, 0x3d0, 0x3e5, 0x12e, 0xc4, 0x58, 0x356, 0x154, 0x23d, 0x37b, 0x14a, 0x15f, 0x151, 0x155, 0x388, 0xb3, 0x7a, 0x2f9, 0x323, 0x21c, 0xb, 0x36c, 0x22e, 0x2c2, 0x1ec, 0x12b, 0x3ac, 0xab, 0x2af, 0x71, 0x195, 0x10d, 0xde, 0x1e7, 0x247, 0x182, 0x269, 0x343, 0x15a, 0x239, 0x1a6, 0x271, 0x196, 0x3d2, 0x8f, 0x2b7, 0x2a4, 0x31d, 0x3bb, 0x3cf, 0x132, 0xcc, 0x1eb, 0x129, 0xc6, 0x36a, 0x33b, 0x192, 0x21e, 0x2cb, 0x3d4, 0x270, 0x46, 0x68, 0x1e3, 0x134, 0x2f6, 0x12d, 0x3f, 0x24, 0x30, 0x346, 0x6d, 0x33a, 0x2f8, 0x125, 0x359, 0x1ca, 0xbb, 0x392, 0x218, 0x1a5, 0x15c, 0x315, 0x19, 0x2c9, 0x109, 0xf, 0x362, 0x5d, 0x7c, 0x295, 0x21f, 0x1a1, 0xef, 0x3e2, 0x258, 0x2a3, 0x237, 0x344, 0x2b0, 0x145, 0x1dc, 0x110, 0x2c6, 0x26b, 0x52, 0x31e, 0x2c8, 0x263, 0x334, 0x2f0, 0x243, 0x2b7, 0x141, 0x6f, 0x1e7, 0x87, 0x201, 0x36c, 0x55, 0x31a, 0x37b, 0x294, 0x175, 0x29a, 0x17d, 0x1fc, 0x93, 0x177, 0x47, 0x302, 0x2d8, 0xa6, 0xe8, 0x3e6, 0x3eb, 0x254, 0x76, 0x32e, 0x18e, 0x20e, 0xe, 0x8, 0x366, 0x1ee, 0x8b, 0xd4, 0x275, 0x29f, 0x3a4, 0x230, 0x340, 0x303, 0x1b2, 0x39d, 0x17a, 0x1f8, 0x120, 0x180, 0x206, 0x368, 0x1e6, 0x3ed, 0x13a, 0x2fe, 0x24b, 0x1d1, 0xaf, 0x2dd, 0xf7, 0x8b, 0x1a8, 0x1c6, 0xd5, 0x23e, 0x299, 0x194, 0x2e0, 0x10c, 0x1a5, 0x2b8, 0x4f, 0xc8, 0xc3, 0x168, 0x3c0, 0x20c, 0x1af, 0x1ce, 0x210, 0x18f, 0x2c8, 0xcf, 0xcb, 0x3ad, 0x71, 0x25d, 0xf4, 0x3e5, 0xb1, 0x5b, 0x22d, 0x74, 0x3e6, 0x3df, 0x142, 0x3b0, 0x28c, 0x1ac, 0x2a0, 0x309, 0x12, 0x30, 0x285, 0x1b4, 0x1e6, 0x3d3, 0xe1, 0x3dd, 0xf1, 0x25e, 0x39a, 0x2fc, 0x12c, 0x2a3, 0x67, 0x10b, 0x1ad, 0x7d, 0x3fe, 0x99, 0x198, 0x343, 0x161, 0x3d8, 0x14a, 0x175, 0x13d, 0x1fd, 0x3fb, 0x122, 0x2b3, 0x1e4, 0x260, 0x10f, 0x2cb, 0x3a1, 0x1d2, 0x230, 0x289, 0x17, 0x18b, 0x1ae, 0x313, 0x2e7, 0x104, 0x360, 0x109, 0x1e, 0x193, 0x2e8, 0x3c9, 0x214, 0x2e9, 0x114, 0x2e3, 0x262, 0xbc, 0x325, 0x2b7, 0x282, 0x1bc, 0x323, 0x62, 0xb0, 0x286, 0x2da, 0xff, 0x24e, 0x219, 0x197, 0x18e, 0x1b3, 0x3dc, 0x51, 0x2b6, 0xbe, 0x125, 0x17f, 0x9f, 0x293, 0x1cd, 0x2fc, 0x258, 0x29e, 0x338, 0x94, 0x1c5, 0x37f, 0x87, 0x16, 0x2a5, 0x16d, 0xff, 0x95, 0x76, 0xa3, 0xd6, 0x2a0, 0x21b, 0x48, 0x180, 0xa, 0x2e5, 0x16e, 0x22a, 0xf8, 0x85, 0x370, 0x114, 0x1cf, 0x19a, 0x1e9, 0x23c, 0x25d, 0x1e8, 0x38f, 0x181, 0x1b9, 0x139, 0x13f, 0x9c, 0x46, 0x1a0, 0x20f, 0x18b, 0x35c, 0x57, 0x315, 0x64, 0xc3, 0x2d0, 0x31b, 0x44, 0x2c6, 0x1be, 0x129, 0x239, 0x12b, 0x15f, 0x29a, 0x1fd, 0x3ff, 0x81, 0x1b5, 0x27f, 0x8b, 0x350, 0x311, 0x2a1, 0x3a8, 0x394, 0x1d1, 0x2bc, 0x25b, 0x4b, 0x355, 0x67, 0x216, 0x2bd, 0x3e8, 0x397, 0x304, 0x2d1, 0x2a8, 0x398, 0x297, 0x308, 0x197, 0x31c, 0x54, 0x1c0, 0x9, 0x30, 0x103, 0x2d9, 0x32b, 0x147, 0x1f, 0x295, 0x6e, 0x226, 0x3be, 0x131, 0xbc, 0x243, 0x366, 0x36b, 0x288, 0x33a, 0x3ed, 0x1c2, 0x2d7, 0x21f, 0x113, 0x3be, 0x262, 0x2f0, 0x23c, 0xb3, 0x3a9, 0x47, 0x26, 0x345, 0x2cb, 0x29f, 0x11f, 0x13b, 0xbb, 0xaf, 0x329, 0x4b, 0x2a3, 0x19c, 0x94, 0x38a, 0x1e7, 0x31, 0x160, 0x1d, 0x3e6, 0x367, 0xd, 0x1e3, 0x1b2, 0xd7, 0x22f, 0x315, 0xc8, 0x30c, 0x2ad, 0x1dc, 0x92, 0xcc, 0x28f, 0x31a, 0x3ee, 0x61, 0x363, 0x18e, 0x54, 0x380, 0x24, 0x180, 0x14, 0x386, 0x362, 0x2e8, 0x33f, 0x108, 0x31e, 0x26d, 0x1d6, 0x151, 0x17d, 0x3fb, 0x81, 0x36a, 0x1ee, 0x51, 0x165, 0x2f8, 0x13a, 0x3dd, 0x3c4, 0x1a1, 0x371, 0x14e, 0x5e, 0x243, 0x195, 0xf4, 0x38f, 0x302, 0x2ed, 0x1da, 0x3d4, 0x3a4, 0x1a4, 0x194, 0x392, 0xe4, 0x18a, 0x1d7, 0x237, 0x216, 0x173, 0x3bb, 0x87, 0x2c, 0x286, 0x37a, 0x3eb, 0x284, 0x1bf, 0x134, 0x39d, 0x3c2, 0x2e7, 0x19, 0x2c5, 0x1b7, 0x6d, 0x3cc, 0x147, 0x7c, 0x10a, 0x3b6, 0x2c8, 0x271, 0x2ac, 0x17d, 0x3ff, 0x204, 0x366, 0x2df, 0x232, 0x1e6, 0x2a7, 0x3e, 0x85, 0x1db, 0x164, 0x33c, 0x156, 0x2ba, 0x3fb, 0x102, 0x1b3, 0x36b, 0x119, 0xf3, 0x357, 0x1f, 0x246, 0x2e9, 0xb2, 0x19e, 0xab, 0x15d, 0x3f9, 0x81, 0x2dd, 0x3b1, 0x288, 0x27d, 0x3af, 0x20b, 0x123, 0x370, 0x59, 0xcf, 0x251, 0x2aa, 0x3f8, 0x244, 0x36a, 0x3dc, 0x144, 0x33a, 0x3d3, 0x301, 0x295, 0x1b8, 0x228, 0x263, 0x32c, 0x155, 0x1fc, 0x122, 0x1b5, 0x1ee, 0xa2, 0x19d, 0x3ed, 0x384, 0x34e, 0xdc, 0x114, 0x335, 0x196, 0x2ae, 0xfe, 0x91, 0x2de, 0xf7, 0x51, 0x2ca, 0x3f2, 0x1c2, 0x1a7, 0x6e, 0x8a, 0x39e, 0xcb, 0x157, 0x7f, 0x24c, 0x16f, 0x27f, 0x22c, 0x165, 0x1f9, 0xe1, 0x2d7, 0x37, 0x45, 0x1cf, 0x261, 0x2af, 0x23b, 0x126, 0x2b3, 0x33b, 0x183, 0x2d5, 0x368, 0xb7, 0xba, 0x33f, 0x29, 0x18c, 0x256, 0x1dd, 0x3cb, 0x20e, 0x1c0, 0x48, 0x1b, 0x280, 0xf0, 0x22, 0x30a, 0x3a5, 0x31a, 0x3a3, 0x219, 0x146, 0x17b, 0x2f4, 0x2e7, 0x64, 0x211, 0x145, 0x3fe, 0x182, 0x356, 0x1bd, 0x3df, 0xd, 0x385, 0x316, 0x1a5, 0x3da, 0x38b, 0x216, 0x1c5, 0x3ce, 0x188, 0x53, 0x29b, 0x270, 0xd2, 0x328, 0xaf, 0xbf, 0xb9, 0x1ba, 0x35f, 0x3d, 0x38f, 0x13, 0x283, 0x275, 0x354, 0x2bb, 0x27c, 0x2d4, 0x2eb, 0x262, 0x3d2, 0x388, 0x93, 0x2b3, 0x27f, 0x51, 0x19d, 0x3d3, 0x20b, 0x246, 0x1db, 0x2c8, 0xeb, 0x2a2, 0x3fa, 0x387, 0x10, 0x6, 0x103, 0x2e5, 0x362, 0x3b2, 0x39c, 0x290, 0xf6, 0x121, 0x1ef, 0xc7, 0xa8, 0x3f, 0x89, 0x1b0, 0x5a, 0x31b, 0x220, 0xcc, 0x22e, 0x1cc, 0x24e, 0x1d8, 0x4d, 0x39d, 0x313, 0x223, 0x249, 0x158, 0x7d, 0x397, 0x306, 0x346, 0x376, 0x362, 0x36d, 0x26b, 0xad, 0x37b, 0x61, 0x32e, 0x358, 0x17a, 0x2e7, 0xc8, 0x56, 0x23a, 0x397, 0x2c, 0x1d, 0x30f, 0x46, 0x236, 0x392, 0x329, 0x258, 0x1ba, 0x2b7, 0xf4, 0x47, 0x130, 0xd4, 0x5f, 0x13a, 0x2d7, 0xdc, 0x59, 0x33c, 0x151, 0x3fa, 0x307, 0x40, 0x30, 0x14, 0xf, 0x106, 0x2c6, 0x3d6, 0x31a, 0x34f, 0x76, 0x222, 0x39d, 0x22f, 0x9e, 0x26c, 0x1ad, 0x3bb, 0x31, 0x312, 0x349, 0x270, 0x1a4, 0xbb, 0x171, 0x3e2, 0x30d, 0x243, 0xb3, 0x177, 0x1e4, 0x8b, 0x165, 0x3ed, 0x20b, 0x85, 0x365, 0x26d, 0x2ab, 0xfd, 0x347, 0x70, 0x24, 0x1b, 0x109, 0x3c0, 0x110, 0xcc, 0x55, 0x339, 0x254, 0x1bf, 0x1b2, 0x2b1, 0x2f2, 0x3c1, 0x216, 0x38a, 0x323, 0x5b, 0x139, 0x3d4, 0x11f, 0x1ca, 0x293, 0xef, 0x14e, 0x2f0, 0x1c4, 0x93, 0x16f, 0x1ee, 0x288, 0x1e6, 0x28e, 0x205, 0x103, 0x386, 0x245, 0x163, 0x3d6, 0x23d, 0x127, 0x3b0, 0x268, 0x35c, 0x2f2, 0x38b, 0x4a, 0x6f, 0x25c, 0x372, 0x2cb, 0x1aa, 0x17f, 0x3c4, 0x226, 0x335, 0xab, 0x2fa, 0x387, 0x40, 0x60, 0x50, 0x78, 0x44, 0x66, 0x55, 0x27b, 0x142, 0x1e3, 0x316, 0x29d, 0x1d7, 0x338, 0x2a4, 0x3f6, 0x20d, 0x10f, 0x38c, 0x24a, 0x36f, 0xdc, 0xb2, 0xeb, 0x29a, 0x3d7, 0x38, 0x24, 0x36, 0x2d, 0x23f, 0x124, 0x1b6, 0x16d, 0x3df, 0x34, 0x2e, 0x39, 0x221, 0x135, 0x3ab, 0x7a, 0x47, 0x260, 0x350, 0x2f8, 0x384, 0x246, 0x365, 0xd3, 0x2be, 0x3e1, 0x15, 0x21b, 0x112, 0x19b, 0x352, 0x2fb, 0x182, 0x143, 0x3e6, 0x215, 0x11b, 0x392, 0x25b, 0x172, 0x1cb, 0x32a, 0x2bf, 0x1e4, 0x116, 0x19d, 0x357, 0xf8, 0x84, 0xc6, 0xa5, 0x2f3, 0x18e, 0x149, 0x3e9, 0x19, 0x211, 0x11d, 0x397, 0x58, 0x74, 0x4e, 0x3, 0x5, 0xf, 0x11, 0x33, 0x55, 0xff, 0x101, 0x303, 0x10c, 0x314, 0x135, 0x35f, 0x1e8, 0x238, 0x241, 0x2ca, 0x357, 0x1f0, 0x210, 0x239, 0x242, 0x2cf, 0x358, 0x1e1, 0x223, 0x26c, 0x2bd, 0x3ce, 0x5b, 0xed, 0x137, 0x359, 0x1e2, 0x226, 0x263, 0x2ac, 0x3fd, 0xe, 0x12, 0x36, 0x5a, 0xee, 0x132, 0x356, 0x1f3, 0x215, 0x236, 0x253, 0x2fc, 0x30d, 0x11e, 0x322, 0x16f, 0x3b1, 0xda, 0x16e, 0x3b2, 0xdf, 0x161, 0x3a3, 0xec, 0x134, 0x35c, 0x1ed, 0x237, 0x250, 0x2f9, 0x302, 0x10f, 0x311, 0x13a, 0x34e, 0x1db, 0x26d, 0x2be, 0x3cb, 0x54, 0xfc, 0x104, 0x30c, 0x11d, 0x327, 0x160, 0x3a0, 0xe9, 0x13b, 0x34d, 0x1de, 0x262, 0x2af, 0x3f8, 0x1, 0x3, 0x5, 0xf, 0x11, 0x33, 0x55, 0xff, 0x101, 0x303, 0x10c, 0x314, 0x135, 0x35f, 0x1e8, 0x238, 0x241, 0x2ca, 0x357, 0x1f0, 0x210, 0x239, 0x6, 0x14, 0x78, 0x110, 0x269, 0x16d, 0x367, 0x340, 0x392, 0x17e, 0x30d, 0x23c, 0x93, 0x36a, 0x36e, 0x376, 0x326, 0x2c6, 0x28f, 0x339, 0x284, 0x303, 0x218, 0x4b, 0x1ba, 0x195, 0x177, 0x33b, 0x288, 0x32b, 0x2e8, 0x26b, 0x161, 0x34f, 0x3b0, 0x1b2, 0x1a5, 0x1d7, 0xfb, 0x21a, 0x47, 0x192, 0x165, 0x357, 0x3e0, 0x52, 0x1ec, 0x61, 0x146, 0x39d, 0x15c, 0x3c1, 0x94, 0x378, 0x302, 0x21e, 0x5f, 0x1c2, 0x85, 0x31e, 0x256, 0x1ef, 0x6b, 0x17a, 0x315, 0x26c, 0x173, 0x323, 0x2d8, 0x2cb, 0x2a1, 0x3dd, 0xdc, 0x2c8, 0x2ab, 0x3e1, 0x54, 0x1f8, 0x19, 0x56, 0x1f4, 0x31, 0xa6, 0x3d4, 0xea, 0x27c, 0x113, 0x263, 0x151, 0x3ef, 0x70, 0x120, 0x2c9, 0x2ad, 0x3f5, 0x2c, 0xe8, 0x270, 0x13b, 0x293, 0x371, 0x334, 0x2aa, 0x3e7, 0x40, 0x180, 0x109, 0x23f, 0x99, 0x356, 0x3e6, 0x46, 0x194, 0x171, 0xc, 0x50, 0x3c0, 0x124, 0x1ab, 0x3e6, 0x8c, 0x259, 0x39a, 0x29c, 0x2af, 0x3fb, 0x10, 0xc0, 0x109, 0x77, 0x264, 0x286, 0x217, 0xd2, 0x1d1, 0x1de, 0x19a, 0x2aa, 0x3c7, 0x100, 0x1b, 0xb4, 0x379, 0x201, 0x3a, 0x138, 0x13b, 0x12f, 0x1df, 0x196, 0x2fa, 0x7, 0x24, 0x1b0, 0x352, 0x3f5, 0x58, 0x3a0, 0x3a4, 0x394, 0x2d4, 0x1cf, 0x156, 0x3f3, 0x70, 0x240, 0x336, 0x145, 0x327, 0x189, 0x27e, 0x23e, 0x13e, 0x113, 0xcf, 0x14d, 0x347, 0x309, 0x41, 0x30c, 0x7d, 0x21c, 0xa6, 0x3a1, 0x3a8, 0x3c4, 0x114, 0xeb, 0xfd, 0x15, 0xfc, 0x19, 0xac, 0x3d9, 0x188, 0x272, 0x26e, 0x2fe, 0x37, 0x164, 0x2ab, 0x3cb, 0x150, 0x3db, 0x190, 0x2d2, 0x1e7, 0xb6, 0x361, 0x2a1, 0x3b3, 0x370, 0x26d, 0x2ea, 0xc7, 0x12d, 0x1c7, 0x136, 0x173, 0x24f, 0x372, 0x275, 0x24a, 0x34e, 0x365, 0x291, 0x2f3, 0x6b, 0x18, 0x140, 0x23f, 0x264, 0x105, 0x4e, 0x299, 0x12f, 0x3be, 0x251, 0x3fd, 0x70, 0x89, 0xc3, 0x23a, 0x21c, 0x14c, 0x29f, 0x17f, 0x37, 0x2c8, 0x2be, 0x267, 0x12d, 0x38e, 0xd1, 0x38a, 0xb1, 0x283, 0x5f, 0x301, 0x42, 0x239, 0x234, 0x28c, 0xd7, 0x3da, 0x338, 0x21a, 0x11c, 0x116, 0x1e6, 0x174, 0xdf, 0x31a, 0x12a, 0x3c6, 0x218, 0x12c, 0x396, 0x191, 0x1b5, 0x2d5, 0x386, 0x11, 0x198, 0x16d, 0x187, 0x65, 0x171, 0xa7, 0x353, 0x3fb, 0x20, 0x300, 0x5a, 0x379, 0xb, 0xe8, 0x1d2, 0x394, 0x1a1, 0x335, 0x2a2, 0x347, 0x21b, 0x104, 0x56, 0x3d9, 0x310, 0x1da, 0x354, 0x3b3, 0x2e9, 0x1a6, 0x37d, 0x6b, 0x1e1, 0x13c, 0x216, 0x1bc, 0x20d, 0xd4, 0x3f2, 0xf8, 0x52, 0x3b9, 0x219, 0x134, 0x2d6, 0x3ae, 0x3d1, 0x3d0, 0x3c8, 0x288, 0xb7, 0x2d3, 0x3d6, 0x398, 0x101, 0x2e, 0x390, 0x1c1, 0x23c, 0x30, 0x109, 0x1dc, 0x201, 0xe8, 0x3a4, 0x24b, 0x113, 0x33c, 0xfd, 0x54, 0x3db, 0x249, 0x173, 0x12e, 0x345, 0x5f, 0x20b, 0x108, 0x1ec, 0x308, 0x134, 0x1a5, 0x2a3, 0x2b7, 0x177, 0x1ee, 0x368, 0x326, 0x21d, 0x2a8, 0x367, 0x236, 0x171, 0x14e, 0x157, 0x3e7, 0x200, 0xd8, 0x2ad, 0x397, 0x312, 0x3d4, 0x359, 0x21f, 0x2c8, 0x175, 0x18e, 0x17a, 0x9e, 0x216, 0x378, 0x26, 0x2a9, 0x357, 0x33f, 0xad, 0x34f, 0x1bf, 0x43, 0x4b, 0x1cb, 0x191, 0x36a, 0x346, 0xf, 0x110, 0x36c, 0x3e6, 0x230, 0x1d1, 0x371, 0x196, 0x3fa, 0x70, 0x112, 0x30c, 0x1f4, 0x188, 0x1da, 0x2a1, 0x2d7, 0x365, 0x256, 0x363, 0x2f6, 0x15c, 0x237, 0x141, 0x47, 0x8b, 0x1e6, 0x2e8, 0x37c, 0xe6, 0x284, 0x2e, 0x329, 0x30d, 0x1c4, 0x81, 0x6, 0xa0, 0x23f, 0xc1, 0x1d, 0x270, 0x1ca, 0x1a1, 0x263, 0x29a, 0x20e, 0x1f8, 0xc8, 0x60, 0x2d, 0x2fb, 0x58, 0x13f, 0xea, 0x381, 0x164, 0x175, 0x31c, 0x1e1, 0xf9, 0x128, 0x3c3, 0x192, 0x27d, 0x174, 0x37c, 0x1cc, 0x202, 0x170, 0x2fc, 0x178, 0x1fc, 0x10, 0x209, 0x2d0, 0x3e3, 0x189, 0x3d4, 0x2bb, 0x6e, 0x26d, 0x37d, 0x1ac, 0x22f, 0x38b, 0x2a4, 0x47, 0x116, 0x391, 0x36d, 0x3a5, 0xff, 0x68, 0x32d, 0x393, 0x3ad, 0x3ff, 0x100, 0xd8, 0x153, 0x247, 0xa6, 0x137, 0x3ea, 0x2e9, 0x291, 0x3b5, 0x2f6, 0x2b8, 0xce, 0x21a, 0x79, 0x144, 0x16e, 0x2b5, 0x22e, 0x3eb, 0x289, 0x2bc, 0x14e, 0x2ae, 0x387, 0x24, 0x19b, 0x11d, 0x31, 0x272, 0x354, 0x2d7, 0x2c3, 0x14a, 0x32e, 0x333, 0x3da, 0xfb, 0x1e8, 0x399, 0x6d, 0x2cd, 0x30a, 0x2a8, 0x2c7, 0xca, 0x39a, 0xcd, 0x2ba, 0xe, 0x240, 0x186, 0x1f4, 0x310, 0x361, 0x125, 0x123, 0x63, 0x8d, 0x28c, 0x35c, 0x1d7, 0x3ab, 0x2bf, 0x1ee, 0xc0, 0xb4, 0x3f5, 0x189, 0x3a1, 0x2fe, 0x370, 0x291, 0x363, 0x3ca, 0x1ed, 0xfb, 0x3d0, 0x27f, 0x368, 0x83, 0x198, 0x37a, 0x118, 0x3a2, 0x3be, 0x2ac, 0x287, 0x1f8, 0x320, 0x2e6, 0x162, 0x6a, 0x3d3, 0x33f, 0x2b4, 0x95, 0x303, 0x390, 0x213, 0x23b, 0x4, 0x300, 0x2d0, 0x3cf, 0x22d, 0x29f, 0x3ea, 0x1db, 0x256, 0x197, 0x333, 0x3bd, 0x3ec, 0x35b, 0x1ee, 0x1bb, 0x20c, 0x269, 0x1f3, 0x69, 0x293, 0x2e3, 0x2a2, 0x20e, 0x3e9, 0x9b, 0x38a, 0x181, 0x1a8, 0x357, 0xe7, 0x2c2, 0x254, 0x17, 0x25b, 0x5e, 0xfe, 0x10, 0x1b, 0x352, 0x327, 0xa6, 0x26e, 0x3b3, 0x365, 0x14a, 0x255, 0xd7, 0x2ef, 0x3ab, 0x177, 0x3b1, 0x2e5, 0x22, 0x1b6, 0x3c5, 0x1a4, 0x25e, 0x39e, 0x29a, 0x2a, 0x3bf, 0x26c, 0x233, 0x20d, 0x2a9, 0x147, 0x39c, 0x31a, 0x142, 0x5c, 0x17e, 0x178, 0x3f8, 0x40, 0x6c, 0x153, 0x87, 0x180, 0x2d0, 0x397, 0xa6, 0xd5, 0x2d7, 0x31e, 0x8d, 0x222, 0x1a5, 0x135, 0xb3, 0x36a, 0x206, 0x3c0, 0xc1, 0xe8, 0x11f, 0x3c4, 0x2c8, 0x3ba, 0x358, 0x15c, 0x19c, 0xf4, 0x33b, 0x368, 0x106, 0x269, 0x3e6, 0x1a4, 0xb5, 0x263, 0xfd, 0x2a0, 0x315, 0x216, 0x3f6, 0x192, 0x1e6, 0x36d, 0x28f, 0x3eb, 0x236, 0x39a, 0x334, 0x3fa, 0x380, 0x19, 0x1ad, 0x12e, 0x21e, 0x3ed, 0x33f, 0x161, 0x254, 0x2e, 0x17e, 0x2f0, 0x3fb, 0x200, 0x2c9, 0x23a, 0x188, 0x2cb, 0x13a, 0x21, 0x1ec, 0x76, 0x18b, 0x4b, 0x243, 0x91, 0x6, 0x109, 0x2fb, 0x160, 0x3d4, 0x2fe, 0x2e9, 0x256, 0x32e, 0xd7, 0x1d7, 0x2b7, 0x3aa, 0x36e, 0xf, 0x92, 0x286, 0x270, 0x24b, 0x8a, 0x2ab, 0x18e, 0x3c2, 0x3c1, 0x141, 0x238, 0x288, 0x362, 0x21d, 0x16d, 0x46, 0x1d1, 0x3be, 0x151, 0x20e, 0x3db, 0x26c, 0x6f, 0x26, 0x165, 0x5d, 0x300, 0x352, 0x87, 0x272, 0x296, 0x85, 0x7b, 0x3b, 0x18b, 0x96, 0x11e, 0x81, 0x60, 0x168, 0x397, 0x14c, 0x354, 0x295, 0x18c, 0x184, 0x1b2, 0x314, 0x325, 0x91, 0xc, 0x2d, 0x3f5, 0x22d, 0x26e, 0x2d7, 0x235, 0x234, 0x134, 0x266, 0x2e1, 0x93, 0x205, 0x280, 0x2fb, 0x2c0, 0x34b, 0x3dd, 0x2c3, 0x242, 0x222, 0x34a, 0xdd, 0x191, 0x2c5, 0x50, 0x1dc, 0x58, 0x1ea, 0x2fe, 0x1db, 0x14a, 0x146, 0x16b, 0x29e, 0xb3, 0x2dd, 0xa, 0x23f, 0xb, 0x13f, 0x359, 0x1b8, 0x12b, 0x32e, 0x1ae, 0x355, 0x195, 0x2de, 0x103, 0x3c0, 0x182, 0x3a0, 0xea, 0x37, 0x1a6, 0x363, 0x333, 0x2ef, 0x2b7, 0x35d, 0x1a3, 0x78, 0x132, 0x74, 0x11f, 0x381, 0x332, 0x1ef, 0x1e5, 0x3da, 0x3d1, 0x2ee, 0x1b7, 0xf, 0x124, 0x20a, 0x3a4, 0xf1, 0x164, 0x3ba, 0x2b9, 0x179, 0xfb, 0x35b, 0x3b1, 0x386, 0x220, 0x143, 0x270, 0x209, 0x153, 0x31, 0x361, 0x274, 0x108, 0x1f7, 0x37e, 0xe4, 0x2f, 0x3f8, 0x200, 0x336, 0x3e8, 0x2d8, 0x22b, 0xf8, 0xad, 0x12a, 0x5c, 0x3e2, 0x2af, 0x207, 0x112, 0x158, 0x24f, 0x21e, 0x3af, 0x39c, 0xe6, 0x34, 0x15e, 0x262, 0x1fd, 0x309, 0xc8, 0x1c5, 0x20d, 0x165, 0x174, 0x3a5, 0x3eb, 0xca, 0x1de, 0xab, 0x107, 0x3bf, 0x344, 0x1fb, 0x324, 0x32b, 0x163, 0x159, 0x46, 0x34d, 0x39e, 0xfd, 0x292, 0x13c, 0xa9, 0x11c, 0x119, 0x326, 0x330, 0x3c5, 0x13b, 0x28d, 0x3ac, 0x18e, 0x313, 0x67, 0xf4, 0xf7, 0x2e5, 0x110, 0x143, 0xe9, 0x27c, 0x164, 0x37d, 0x2f6, 0x3da, 0x3ab, 0x3aa, 0x1a3, 0xf0, 0xc1, 0x3a0, 0x1d4, 0xdc, 0x12b, 0x255, 0x2b1, 0x29e, 0x166, 0x366, 0x50, 0x3b8, 0x160, 0x34b, 0x3b3, 0x31e, 0x234, 0x268, 0x18a, 0x325, 0x122, 0x30, 0x168, 0x327, 0x139, 0x296, 0x10a, 0x1ec, 0x1b, 0x145, 0x188, 0x275, 0x20b, 0x290, 0x24e, 0x2e, 0x3e2, 0x157, 0xe, 0x82, 0x1ad, 0x162, 0x2a9, 0x5d, 0x3d6, 0x3eb, 0x194, 0x371, 0x151, 0x54, 0x315, 0x94, 0x47, 0x288, 0x326, 0x269, 0x30f, 0x1ca, 0x8a, 0x175, 0x358, 0x2f2, 0x3d1, 0x3aa, 0x346, 0x3c0, 0x201, 0x27e, 0x2fe, 0x365, 0x8d, 0x134, 0x18a, 0x243, 0x81, 0x180, 0x2ad, 0x31, 0x2cb, 0x1c2, 0x52, 0x34f, 0x303, 0x17e, 0x3ad, 0x307, 0x112, 0x2b0, 0x12e, 0xd4, 0x28e, 0x37c, 0x1fe, 0x236, 0xef, 0xab, 0x20e, 0x2e7, 0x216, 0x38f, 0x51, 0x362, 0xcc, 0x3e6, 0x13b, 0x113, 0x2ab, 0x6b, 0x15c, 0xfb, 0x177, 0x36e, 0x78, 0xc1, 0x349, 0x359, 0x2e9, 0x294, 0x222, 0x133, 0x1cb, 0x91, 0x30, 0x2d0, 0x87, 0x1da, 0x13a, 0x108, 0x3ee, 0x1e3, 0x329, 0x2f0, 0x3e7, 0x120, 0x56, 0x323, 0x21e, 0x357, 0x26b, 0x339, 0x340, 0x39a, 0x36, 0x11d, 0x5b, 0x311, 0x1f0, 0x161, 0x101, 0x253, 0x262, 0x3fd, 0xfc, 0x26c, 0x2f9, 0x241, 0x16e, 0x33, 0x1f3, 0x13b, 0x226, 0x2be, 0x358, 0x1ed, 0x35f, 0x16f, 0x5, 0xee, 0x160, 0x137, 0x34e, 0x239, 0xec, 0x10c, 0x30d, 0x3f8, 0x12, 0x30c, 0x3ce, 0x10f, 0x357, 0xdf, 0xff, 0x236, 0x1de, 0x2ac, 0x54, 0x223, 0x250, 0x238, 0xda, 0x11, 0x356, 0xe9, 0x1e2, 0x26d, 0x2cf, 0x35c, 0x135, 0x322, 0x3, 0x5a, 0x327, 0xed, 0x13a, 0x210, 0x3a3, 0x303, 0x2fc, 0x2af, 0xe, 0x104, 0x2bd, 0x302, 0x2ca, 0x3b2, 0x55, 0x215, 0x34d, 0x263, 0x3cb, 0x1e1, 0x237, 0x1e8, 0x3b1, 0xf, 0x132, 0x3a0, 0x359, 0x1db, 0x242, 0x134, 0x314, 0x11e, 0x1, 0x36, 0x11d, 0x5b, 0x311, 0x1f0, 0x161, 0x101, 0x253, 0x262, 0x3fd, 0xfc, 0x26c, 0x2f9, 0x241, 0x16e, 0x33, 0x1f3, 0x13b, 0x226, 0x2be, 0x358, 0x6c, 0x7d, 0x2d8, 0x17c, 0x277, 0xe6, 0x1a0, 0x33d, 0xab, 0x2a, 0x223, 0xa9, 0xf2, 0x2d9, 0x110, 0x20a, 0x23e, 0xdc, 0x14a, 0x4d, 0x18a, 0x11e, 0x2, 0xd8, 0xfa, 0x1b9, 0x2f8, 0xe7, 0x1cc, 0x340, 0x273, 0x156, 0x54, 0x4f, 0x152, 0x1e4, 0x1bb, 0x220, 0x1d, 0x75, 0x1b8, 0x294, 0x9a, 0x314, 0x23c, 0x4, 0x1b0, 0x1f4, 0x372, 0x1f9, 0x1ce, 0x398, 0x289, 0xef, 0x2ac, 0xa8, 0x9e, 0x2a4, 0x3c8, 0x376, 0x49, 0x3a, 0xea, 0x370, 0x121, 0x134, 0x221, 0x71, 0x8, 0x360, 0x3e8, 0x2ed, 0x3f2, 0x39c, 0x339, 0x11b, 0x1de, 0x151, 0x150, 0x13c, 0x141, 0x399, 0x2e5, 0x92, 0x74, 0x1d4, 0x2e9, 0x242, 0x268, 0x4b, 0xe2, 0x10, 0x2c9, 0x3d9, 0x1d3, 0x3ed, 0x331, 0x27b, 0x236, 0x3bc, 0x2a2, 0x2a0, 0x278, 0x282, 0x33b, 0x1c3, 0x124, 0xe8, 0x3a8, 0x1db, 0x8d, 0xd9, 0x96, 0x1c4, 0xd8, 0x1f4, 0x2ed, 0x3ed, 0x26b, 0x1fe, 0x194, 0x3be, 0xfd, 0x17a, 0x237, 0x3a9, 0x36e, 0x3c0, 0x2c, 0x29f, 0x295, 0x1ec, 0x1bf, 0x329, 0x3ad, 0xe, 0x19, 0x38a, 0x130, 0x32b, 0x21d, 0x3e6, 0x1ca, 0x59, 0x1ef, 0xd7, 0x135, 0x93, 0x30, 0x2ad, 0x188, 0x38c, 0x3e0, 0x31a, 0x68, 0x39a, 0xab, 0x54, 0x9e, 0x141, 0x33b, 0x386, 0x99, 0x349, 0x2fe, 0x31e, 0x308, 0x43, 0x30d, 0x3fb, 0x120, 0x2b0, 0x162, 0x165, 0x36d, 0x2a8, 0x230, 0x1a1, 0x2ab, 0x358, 0x3bd, 0x195, 0x366, 0x109, 0x397, 0x1da, 0x1c2, 0x290, 0x254, 0x392, 0x262, 0x3ef, 0x3db, 0x216, 0x47, 0x6d, 0x22, 0x286, 0x11f, 0xdc, 0x294, 0x134, 0x4b, 0x1c4, 0x40, 0x265, 0x1e7, 0x21e, 0x28e, 0x3d6, 0x367, 0x1d1, 0x263, 0x337, 0x22f, 0xfb, 0x3aa, 0x206, 0x1dc, 0x312, 0x2a1, 0x21, 0x3ee, 0x303, 0x3e2, 0x2aa, 0x380, 0x249, 0x1b0, 0x3d9, 0x345, 0x2a7, 0x1eb, 0x367, 0x3a2, 0x19e, 0x18e, 0x2b8, 0x35f, 0x36a, 0x140, 0x3cf, 0x1da, 0x384, 0x252, 0x284, 0x15e, 0xcb, 0x20e, 0x223, 0x2a4, 0x33b, 0x305, 0x264, 0x27e, 0x3b3, 0x318, 0x3b0, 0x1c8, 0x3d2, 0xe, 0x32, 0x233, 0x192, 0x2dc, 0x330, 0x4e, 0xf1, 0x1a6, 0x146, 0x266, 0x11e, 0x8, 0x19b, 0x2f7, 0x21e, 0x115, 0x343, 0x30e, 0x12f, 0xeb, 0x6b, 0x1ed, 0x2ce, 0x366, 0x212, 0x247, 0x2cb, 0x1f, 0x2b4, 0xd, 0x2e2, 0x251, 0x54, 0x13c, 0x10d, 0x1ee, 0x1e, 0x304, 0x3d4, 0x1a7, 0xf6, 0x1bf, 0x25b, 0x2af, 0x70, 0x190, 0x1bc, 0x8b, 0x2cd, 0x1b6, 0x270, 0x381, 0x12b, 0x222, 0x314, 0xe2, 0x40, 0xc3, 0x395, 0xd4, 0xba, 0x22e, 0x46, 0x16a, 0x351, 0x358, 0x373, 0x25d, 0x306, 0xb4, 0x21c, 0x275, 0xf8, 0x18d, 0x68, 0x33d, 0x2ac, 0x2a0, 0x1f2, 0x7a, 0x36b, 0x360, 0x37f, 0x21e, 0x22a, 0x117, 0x46, 0x2d4, 0x15f, 0x2f6, 0x355, 0x322, 0x30, 0x2a6, 0xb6, 0x2f8, 0x331, 0x3fc, 0xbb, 0x335, 0x267, 0x15c, 0x35f, 0x2dd, 0x109, 0x247, 0x19f, 0x7c, 0x18d, 0xd0, 0xef, 0x14d, 0x25a, 0x237, 0x2bf, 0x285, 0x1dc, 0x53, 0x24a, 0x52, 0x12a, 0x32d, 0x334, 0x107, 0x223, 0x141, 0xf7, 0x1e, 0x201, 0x34b, 0x123, 0x37b, 0x385, 0x3cd, 0x17d, 0xfc, 0x281, 0x47, 0x1b4, 0x220, 0xe8, 0x17f, 0x235, 0x76, 0x72, 0x1e9, 0xe, 0x64, 0xde, 0x8b, 0x193, 0x2d1, 0x3a4, 0x6e, 0x121, 0x1b2, 0x172, 0x3f8, 0x120, 0x2d2, 0x20d, 0x1e6, 0x30a, 0x3c5, 0x24b, 0x332, 0x255, 0x133, 0x11e, 0x10, 0x265, 0x395, 0x1a8, 0x2e8, 0x154, 0x69, 0x113, 0x1dd, 0x333, 0x135, 0x24c, 0x300, 0x23a, 0x372, 0x3d3, 0x37c, 0x3b7, 0x3a2, 0x33c, 0x231, 0x1ed, 0x195, 0x183, 0xb4, 0x31, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x19b, 0x395, 0x2a9, 0x2d3, 0x1bd, 0x1ca, 0x199, 0xa3, 0x18a, 0x388, 0x12, 0x2b0, 0x20d, 0x391, 0xcc, 0x9c, 0x30b, 0x294, 0x364, 0x382, 0x3e7, 0x104, 0x233, 0x8b, 0x245, 0x143, 0xea, 0x2c3, 0x3b, 0xe4, 0x353, 0x1c0, 0x26c, 0x317, 0x1b4, 0x92, 0x29b, 0x36f, 0x1ec, 0x3c6, 0x393, 0x3fa, 0x3bf, 0x250, 0x33b, 0x1e, 0x16, 0xd5, 0x42, 0x127, 0x392, 0x261, 0x2a, 0xf9, 0x1e8, 0x1a3, 0x1dc, 0x14c, 0xe1, 0xad, 0x1a, 0x273, 0x29a, 0x2f4, 0x279, 0x16f, 0x140, 0x247, 0x275, 0x3c9, 0x398, 0x194, 0x39e, 0xc7, 0x2f2, 0x32a, 0x3, 0x2ad, 0xb6, 0x3f2, 0x37c, 0x2c7, 0x25e, 0x2ab, 0x1e5, 0x29e, 0x91, 0x36, 0x3d9, 0x21e, 0xba, 0x154, 0x1a4, 0x114, 0x3b5, 0x1a5, 0x8f, 0x20, 0x30c, 0x25c, 0x19d, 0x2c6, 0x3c5, 0x13e, 0x34c, 0x4d, 0x12c, 0x1fc, 0x240, 0x2bd, 0x130, 0x2dc, 0x1b6, 0x3a4, 0x336, 0x24f, 0x165, 0x163, 0x3c5, 0x27c, 0x12b, 0x268, 0x2e4, 0x3f7, 0x104, 0x6f, 0x22c, 0x20c, 0x1d, 0x17f, 0x18c, 0x1bf, 0x1f1, 0x2fa, 0x3db, 0x250, 0x27f, 0x78, 0xb0, 0x14b, 0x52, 0x142, 0x2e2, 0x151, 0xbd, 0x338, 0x16f, 0x280, 0x10e, 0x38c, 0xe7, 0x3fc, 0x1d1, 0xeb, 0x2b9, 0x2a3, 0x24c, 0x36, 0x3bb, 0x6a, 0x1d9, 0x16d, 0xe5, 0x199, 0x146, 0x221, 0x7f, 0x120, 0x2bd, 0x260, 0x362, 0x1ab, 0x23e, 0x365, 0x3b, 0x1c8, 0x157, 0x21b, 0x281, 0x238, 0x1c3, 0x182, 0x29f, 0x214, 0x297, 0x392, 0xcb, 0xa8, 0x3c1, 0x2bf, 0x5, 0x3f5, 0x361, 0xf8, 0xe6, 0xca, 0x39e, 0x18e, 0x3da, 0x166, 0x30, 0x11d, 0x1d3, 0x28e, 0x22e, 0x69, 0x8a, 0x3b5, 0x34a, 0x23c, 0x100, 0xac, 0x302, 0x391, 0x198, 0x270, 0x6e, 0x11a, 0x43, 0x178, 0x1c, 0x249, 0x3c3, 0xda, 0x92, 0x13f, 0x1a7, 0x37b, 0x265, 0x12e, 0x33a, 0x21d, 0x4e, 0x21f, 0x8d, 0x43, 0x2f0, 0x70, 0x26c, 0x47, 0x376, 0xc1, 0x29f, 0x21, 0x24e, 0xaf, 0xab, 0x12d, 0x19c, 0x16f, 0x109, 0x31, 0x5f, 0x26b, 0x367, 0xb5, 0x175, 0xd7, 0x1cb, 0x8, 0x30c, 0x162, 0x1e6, 0xcc, 0x270, 0xdc, 0x61, 0x218, 0x3ad, 0x380, 0x344, 0x238, 0x386, 0x201, 0xd5, 0x108, 0x254, 0x171, 0x151, 0x17a, 0xfb, 0x36a, 0x5a, 0x188, 0x2f8, 0x37c, 0x30e, 0x1a1, 0x3ba, 0x2b1, 0x243, 0x40, 0x56, 0x302, 0x32b, 0x269, 0x3a4, 0x2e9, 0x308, 0xe4, 0x157, 0x3f, 0x216, 0x1e4, 0xf, 0x2c, 0x2a1, 0x52, 0x284, 0x39a, 0x29a, 0x3c2, 0x3d1, 0x366, 0x2d0, 0x5b, 0x3ed, 0x3d6, 0x46, 0x113, 0x1ef, 0x1a5, 0x23c, 0x200, 0x2b0, 0x26, 0x16e, 0x36c, 0x11f, 0x365, 0x76, 0x329, 0x2aa, 0x1f8, 0x94, 0x33b, 0x78, 0x160, 0x125, 0x290, 0xd, 0xef, 0xc3, 0xb1, 0x1e6, 0x198, 0x1d2, 0x2e9, 0x219, 0x390, 0x2aa, 0x3f0, 0x250, 0x1ee, 0x389, 0x53, 0x1c2, 0x2c2, 0x11b, 0x1cf, 0x31c, 0x2ef, 0x93, 0x36, 0x2f7, 0x2a9, 0x2b5, 0x383, 0x3c4, 0x121, 0x225, 0x2f0, 0xe0, 0x1a2, 0x238, 0x305, 0x16, 0x2a1, 0xa4, 0x202, 0xef, 0x1fa, 0xae, 0x195, 0xc, 0x11d, 0x345, 0xba, 0x2b2, 0x1ca, 0xd3, 0x9a, 0x2e4, 0x3c7, 0x64, 0x3f6, 0xda, 0x248, 0x3d4, 0x10a, 0x127, 0xaf, 0x156, 0xbd, 0xfb, 0x2dd, 0x168, 0x5b, 0x3d3, 0x343, 0x230, 0x114, 0x197, 0x18a, 0x7f, 0x89, 0x38a, 0x116, 0x11, 0xe8, 0x3b3, 0x3b9, 0x2e, 0xcd, 0x2a, 0x3c1, 0x2ee, 0x50, 0x87, 0x311, 0x331, 0x367, 0x16a, 0x1dd, 0x2b1, 0x8f, 0x100, 0x2b0, 0x4c, 0x1b1, 0x356, 0x1d4, 0x63, 0x1bf, 0x3cd, 0x3f3, 0x315, 0x3d, 0x1a3, 0x2fb, 0x3b4, 0x1f0, 0x339, 0x176, 0xeb, 0x2f6, 0x186, 0x2c4, 0x32b, 0x1b6, 0x23e, 0x31e, 0x2db, 0x3cd, 0x3ef, 0x4f, 0x1e8, 0x206, 0x3cf, 0xe3, 0x1ce, 0x3b7, 0x16a, 0x3ba, 0x2d6, 0x71, 0x24, 0x2bd, 0x324, 0x106, 0x74, 0x3b3, 0x37b, 0xb8, 0x261, 0x2a0, 0xce, 0x2de, 0x5a, 0x229, 0x3d3, 0x28f, 0xd2, 0xb2, 0x146, 0x12c, 0x3ff, 0x19, 0x1fb, 0xda, 0x99, 0x34b, 0x42, 0x254, 0x1cd, 0x13d, 0x22f, 0x2ce, 0xc, 0x23a, 0x10f, 0x1d9, 0x37a, 0x13e, 0xa5, 0x18b, 0x178, 0xe0, 0x344, 0xf2, 0x1e, 0x160, 0x9d, 0x15a, 0x340, 0x2e3, 0x31c, 0x1d7, 0x24c, 0x1b0, 0x323, 0x19d, 0x33, 0x270, 0x370, 0x219, 0x329, 0x2ba, 0x3bf, 0x141, 0x1b7, 0x3b8, 0x1da, 0x1f0, 0x27b, 0x1d1, 0x351, 0x333, 0x1cb, 0x20, 0xac, 0x26, 0x1b1, 0x2a5, 0x359, 0x318, 0x3c6, 0x14e, 0x107, 0x1f2, 0x177, 0x50, 0x10e, 0x5f, 0x1be, 0x215, 0x113, 0x3b5, 0x266, 0x23b, 0x30c, 0x302, 0x16e, 0x356, 0x359, 0x239, 0x303, 0x262, 0x54, 0x237, 0x16f, 0x5a, 0x5b, 0x357, 0x55, 0x13b, 0x26d, 0x134, 0x30d, 0xe, 0x26c, 0x238, 0xf, 0x160, 0x13a, 0x161, 0x236, 0x263, 0x358, 0x135, 0x1, 0x30c, 0x302, 0x16e, 0x356, 0x359, 0x239, 0x303, 0x262, 0x54, 0x237, 0x16f, 0x5a, 0x5b, 0x357, 0x55, 0x13b, 0x26d, 0x134, 0x30d, 0xe, 0x26c, 0x238, 0xf, 0x160, 0x13a, 0x161, 0x236, 0x263, 0x358, 0x135, 0x1, 0x30c, 0x302, 0x16e, 0x356, 0x359, 0x239, 0x303, 0x262, 0x54, 0x237, 0x16f, 0x5a, 0x5b, 0x357, 0x55, 0x13b, 0x26d, 0x134, 0x30d, 0xe, 0x26c, 0x238, 0xf, 0x160, 0x13a, 0x161, 0x236, 0x263, 0x358, 0x135, 0x1, 0x30c, 0x302, 0x16e, 0x356, 0x359, 0x239, 0x303, 0x262, 0x54, 0x237, 0x16f, 0x5a, 0x5b, 0x357, 0x55, 0x13b, 0x26d, 0x134, 0x30d, 0xe, 0x26c, 0x211, 0x13, 0x362, 0x105, 0x3ea, 0x37b, 0x2e0, 0x251, 0x17a, 0x3ab, 0x3, 0x23a, 0x35, 0x1af, 0x30f, 0x37, 0x184, 0x329, 0x2fa, 0x38e, 0xf4, 0x5, 0x247, 0x5f, 0x2f1, 0x118, 0x59, 0x28c, 0x172, 0x307, 0x9b, 0x11c, 0xf, 0x2c0, 0xe1, 0x31a, 0x328, 0xeb, 0x39d, 0x396, 0x100, 0x1ad, 0x324, 0x11, 0x349, 0x123, 0x127, 0x171, 0x13d, 0xae, 0xb3, 0x300, 0x2f7, 0x165, 0x33, 0x1d2, 0x365, 0x369, 0x393, 0x347, 0x1f2, 0x1d5, 0x109, 0x310, 0x3af, 0x55, 0x276, 0x1a6, 0x1b2, 0xbc, 0x1c0, 0x216, 0x27f, 0x31b, 0x139, 0xf8, 0xff, 0x293, 0x2ea, 0x2d6, 0x1c4, 0x240, 0x233, 0x288, 0x124, 0x34b, 0x108, 0x101, 0x3bc, 0x337, 0x373, 0x24c, 0x2c9, 0x25c, 0x391, 0x36c, 0x1d4, 0x318, 0x303, 0xcd, 0x150, 0x19c, 0x2dd, 0x352, 0x2ed, 0xba, 0x1bd, 0x27c, 0x121, 0x10c, 0x157, 0x3f0, 0x2a4, 0x36e, 0x2b, 0x4c, 0x326, 0x74, 0x1a7, 0x34f, 0x2bc, 0x13d, 0x15c, 0x2cc, 0x36, 0x323, 0xf3, 0xdb, 0xea, 0x318, 0x20f, 0x334, 0x292, 0x1f6, 0x306, 0x11d, 0x35, 0x35e, 0x27, 0x1b8, 0x76, 0x1f1, 0x3d7, 0xf9, 0x1d5, 0x212, 0x5b, 0x147, 0x159, 0x24b, 0x14a, 0x86, 0x157, 0x3e9, 0x282, 0x346, 0x3cf, 0x311, 0x37c, 0x118, 0xb2, 0x222, 0x382, 0x1c, 0x344, 0x399, 0x389, 0x139, 0x1f0, 0x3fc, 0xb5, 0x2f3, 0x266, 0x1fc, 0x208, 0x3e5, 0x376, 0x16, 0x24a, 0x161, 0xca, 0x271, 0x39d, 0x325, 0x9, 0x173, 0x22c, 0x220, 0x3d4, 0x84, 0x101, 0x371, 0xc7, 0x3ae, 0x81, 0x186, 0x20d, 0x362, 0x20a, 0x3b3, 0x3ee, 0x253, 0x2a2, 0x22f, 0x25d, 0x300, 0x1e7, 0x19d, 0x198, 0x11f, 0x63, 0x3c6, 0x262, 0x150, 0x338, 0x366, 0x2a6, 0x283, 0x36d, 0x383, 0x37, 0x308, 0xbf, 0x3fd, 0x9e, 0x2bf, 0x140, 0x188, 0x56, 0x130, 0x106, 0x349, 0x85, 0x254, 0xef, 0x337, 0x1d7, 0x81, 0x30c, 0x26, 0x326, 0xe8, 0x295, 0x24e, 0x39a, 0x3e1, 0x3bd, 0x91, 0x265, 0x302, 0x362, 0x1d, 0x2d7, 0x34f, 0x171, 0xfd, 0x2f2, 0x93, 0x2c9, 0x162, 0x16e, 0x286, 0x3dd, 0x3ee, 0xaf, 0x29a, 0x15c, 0x191, 0xd8, 0x12e, 0x32b, 0x356, 0x2fe, 0x37b, 0x392, 0x151, 0x22f, 0xb3, 0x1b, 0x323, 0x1e6, 0x36c, 0x359, 0x1ec, 0x170, 0xab, 0x3c2, 0x195, 0x180, 0x1e7, 0x33a, 0x269, 0xea, 0x239, 0x2e, 0x196, 0x17a, 0x2b7, 0x30, 0x3bb, 0x165, 0xcc, 0x11f, 0xc6, 0x303, 0x334, 0x12d, 0x3d1, 0x6, 0x1f4, 0x2a9, 0x21d, 0x3a4, 0x31e, 0x1e3, 0x262, 0x2a0, 0xfb, 0x306, 0x23a, 0xd4, 0x2c6, 0x270, 0x365, 0x1bf, 0x14e, 0x54, 0x19c, 0x366, 0x145, 0x21e, 0x35e, 0x4e, 0x2e9, 0x3b0, 0x32f, 0x20e, 0x237, 0x36a, 0x2ad, 0x345, 0x36d, 0xac, 0xc9, 0x22, 0xf5, 0x84, 0xd, 0x375, 0x1ac, 0x1ba, 0x80, 0x2bd, 0x51, 0x124, 0x26e, 0x290, 0x289, 0x19e, 0x39d, 0x8f, 0x90, 0x6f, 0xda, 0x304, 0x125, 0x2c2, 0x259, 0x2ab, 0x16b, 0x319, 0x82, 0x3e5, 0x1c3, 0x160, 0x384, 0x398, 0x293, 0x37d, 0xc5, 0x3fb, 0x190, 0x11c, 0x78, 0x14c, 0x1f0, 0x3eb, 0x342, 0x197, 0x258, 0x207, 0x1a2, 0x33b, 0x77, 0x361, 0x1ce, 0x215, 0x228, 0x222, 0x213, 0x1c0, 0x94, 0x2df, 0x3fe, 0x38c, 0x2f1, 0xd2, 0x26d, 0x364, 0x3d2, 0x1f8, 0x282, 0x103, 0x87, 0x1f9, 0x22e, 0x1ca, 0xa5, 0x10c, 0x2aa, 0x1c7, 0x3d0, 0xa0, 0x310, 0x147, 0x16d, 0xf1, 0x234, 0x329, 0x3fd, 0x278, 0x3aa, 0xb4, 0x372, 0x2e8, 0x3c5, 0x6e, 0x76, 0x3cd, 0x107, 0x237, 0x2dd, 0x2a6, 0x21e, 0x2b5, 0x138, 0x365, 0x37e, 0x131, 0x2a0, 0x1f6, 0x3, 0x1f4, 0x15b, 0x66, 0x11f, 0x158, 0x324, 0x110, 0x34b, 0xa4, 0x340, 0x19e, 0x333, 0x23c, 0x89, 0x2f9, 0x376, 0xb0, 0x384, 0x339, 0x25e, 0x3de, 0x4b, 0x387, 0xd1, 0x33b, 0xee, 0x19f, 0x26b, 0x118, 0x199, 0x1b2, 0x3d2, 0x3f0, 0x21a, 0xa, 0x62, 0x357, 0x2b2, 0xf1, 0x61, 0xbf, 0x3d7, 0x3c1, 0x1b5, 0x153, 0x21e, 0x163, 0xe9, 0x31e, 0x385, 0x261, 0x17a, 0x2ce, 0x300, 0x323, 0x391, 0x2a5, 0x3dd, 0x3a3, 0x2e2, 0x3e1, 0x2ef, 0x102, 0x56, 0xc9, 0x44, 0x3d4, 0x29, 0xd0, 0x263, 0x3ca, 0x8f, 0x120, 0x1bc, 0x2d9, 0x2c, 0xe1, 0x1cc, 0x293, 0x2f3, 0x314, 0x3e7, 0x136, 0x3c8, 0x23f, 0x361, 0x39c, 0x46, 0x164, 0x268, 0x2f0, 0xfc, 0x282, 0x206, 0x21c, 0x3d3, 0x2a8, 0x13e, 0x11a, 0x329, 0x3f3, 0x1f2, 0x16f, 0x352, 0x283, 0x35e, 0x138, 0x2c3, 0x1e3, 0x19a, 0x25a, 0x2b7, 0xc0, 0x3ce, 0x1e6, 0x1ab, 0x1f5, 0x3ee, 0x2b0, 0x8b, 0x92, 0xd5, 0xad, 0x194, 0x2ab, 0x1a5, 0x1fc, 0xc8, 0x238, 0x3c0, 0x1da, 0x1ce, 0x46, 0x2c8, 0x1b2, 0x3ad, 0x3db, 0xf4, 0xa0, 0x5b, 0x5d, 0x3e6, 0xdc, 0x3b0, 0x14e, 0x2a0, 0x3d1, 0x30, 0x1e7, 0x1e6, 0x356, 0x3dd, 0x34f, 0x39a, 0x337, 0x2a3, 0x8, 0x1ad, 0x51, 0x99, 0x2a1, 0x161, 0xbb, 0x175, 0x133, 0x3fb, 0x249, 0x1e4, 0x23f, 0x2cb, 0x26b, 0x230, 0x26d, 0x18b, 0x157, 0x2e7, 0x3a9, 0x109, 0x2d8, 0x2e8, 0x30f, 0x2e9, 0x1bf, 0x262, 0x12d, 0x2b7, 0x180, 0x323, 0x32b, 0x286, 0x2d7, 0x24e, 0xef, 0x18e, 0x135, 0x40, 0x173, 0x288, 0xc1, 0x125, 0x31a, 0x1d1, 0x3ba, 0x18a, 0x3e7, 0x26c, 0x33b, 0x1dc, 0x275, 0x37c, 0x1a4, 0x34c, 0x43, 0x2aa, 0x315, 0x177, 0x5a, 0x2ed, 0x36d, 0x4e, 0x365, 0x1e3, 0x334, 0x17a, 0x195, 0x1b, 0x12e, 0x16e, 0x1d, 0x295, 0x254, 0x371, 0x169, 0x22c, 0x99, 0x14b, 0x18d, 0x1d1, 0x37d, 0x221, 0x307, 0x281, 0x3b1, 0x3f5, 0xbe, 0x22e, 0x24b, 0x11a, 0xbf, 0x347, 0x67, 0x183, 0x1f4, 0x2ca, 0x1b6, 0x2fe, 0x3d5, 0x1cd, 0x337, 0x14f, 0x20, 0x173, 0x119, 0x304, 0x13a, 0x1cc, 0x25e, 0x363, 0xb9, 0x38, 0x94, 0x2d5, 0x247, 0x3ed, 0x159, 0x1e2, 0x308, 0x3cd, 0x2a, 0xfb, 0xc, 0x2f7, 0x1e6, 0x2a5, 0x36f, 0x24e, 0x1de, 0x231, 0x1ba, 0x9, 0x233, 0x368, 0x58, 0x301, 0x1fe, 0x342, 0xa3, 0x30d, 0x309, 0x2a4, 0x206, 0x62, 0x147, 0x37a, 0x37, 0x1d8, 0x14e, 0x149, 0x35f, 0x180, 0x24f, 0xb7, 0x1d, 0x123, 0x142, 0x3be, 0x2b9, 0x325, 0x120, 0x2f9, 0x1c3, 0x312, 0xf8, 0x3b7, 0x8a, 0x4d, 0x178, 0x1f8, 0x3d, 0x50, 0x5b, 0xba, 0x383, 0x2e9, 0x37e, 0x19a, 0x17a, 0x32a, 0x6c, 0x162, 0x2cd, 0x3a0, 0x21, 0x1a, 0x335, 0x39d, 0x2d2, 0xa2, 0xc1, 0x9d, 0x1cc, 0xb5, 0x197, 0x1c1, 0x380, 0x2a4, 0x5, 0x188, 0x22a, 0x3c5, 0x2e9, 0x2f5, 0x261, 0x3c2, 0x2cc, 0x19b, 0x26, 0x11, 0x3a1, 0x290, 0xca, 0x15f, 0x133, 0x3f7, 0xd1, 0x1ee, 0x3fe, 0xbe, 0x55, 0x13e, 0xc2, 0x3e2, 0x2a, 0x1f6, 0x30, 0x395, 0x25f, 0x1d, 0x246, 0x101, 0x1cf, 0x3ca, 0x71, 0x82, 0x227, 0xf0, 0x1da, 0x331, 0x69, 0x34c, 0x10c, 0x2fa, 0xf9, 0x1b5, 0x28a, 0x2a9, 0x330, 0x2bb, 0x3ee, 0x1cd, 0x267, 0x135, 0x100, 0x31d, 0x368, 0xb0, 0x1f, 0x3eb, 0x45, 0x4d, 0x2f0, 0x3e9, 0x1e8, 0x109, 0x372, 0x2d3, 0x270, 0x63, 0x5c, 0x151, 0x179, 0x122, 0x56, 0x241, 0x124, 0x2a1, 0x18d, 0x3a2, 0x1ef, 0x12c, 0x1c, 0x94, 0x1a3, 0x10e, 0x357, 0x1bd, 0x37, 0x3b0, 0x131, 0x25a, 0x195, 0x6c, 0x2c4, 0x326, 0x13f, 0x210, 0x340, 0xeb, 0x16b, 0x1fc, 0x1ad, 0x288, 0x201, 0x1c2, 0x1fe, 0x113, 0x222, 0x2f0, 0x3db, 0x3a9, 0x5a, 0x345, 0x2c6, 0x11f, 0x1ec, 0xaf, 0x3e1, 0x2a3, 0x40, 0x38a, 0x368, 0x160, 0x7c, 0x367, 0x59, 0x1b2, 0x157, 0x315, 0x3aa, 0x2ad, 0xd4, 0xcc, 0x359, 0x3ee, 0x39a, 0x18e, 0x1ba, 0x24, 0x378, 0x386, 0xa6, 0x33f, 0x46, 0x26d, 0x43, 0x17d, 0xf9, 0x36a, 0x23a, 0x165, 0x36c, 0x3dd, 0x24e, 0x371, 0x358, 0x243, 0x112, 0x38f, 0x78, 0x1da, 0x26b, 0x1a4, 0x256, 0xe4, 0x3ef, 0x237, 0x306, 0x3bb, 0x1e6, 0x286, 0x295, 0x284, 0x1cf, 0x39d, 0x1c4, 0x19, 0x238, 0x23f, 0x275, 0x3d6, 0x1ca, 0x8d, 0x17e, 0x20e, 0xfb, 0x30, 0x323, 0x16e, 0xe8, 0x21, 0x68, 0x33c, 0x2b1, 0x1fc, 0x249, 0x33b, 0x2fb, 0x5f, 0x55, 0x27c, 0x308, 0x32f, 0x2a0, 0x2b7, 0x1b, 0x162, 0x326, 0x27e, 0x52, 0x236, 0x2ab, 0x133, 0x3e7, 0x344, 0x35a, 0x232, 0x2c, 0x1f, 0x3b7, 0x59, 0x364, 0x155, 0x9e, 0x2de, 0x11d, 0x165, 0x2d1, 0x36f, 0x254, 0x375, 0x3ca, 0x1c4, 0x32, 0xf2, 0x1dc, 0x311, 0x22e, 0x27c, 0x219, 0xa7, 0x12d, 0x32a, 0x360, 0x26, 0x44, 0x26e, 0x161, 0x3a2, 0x3b5, 0x2e4, 0x309, 0x10d, 0xa0, 0x1b9, 0x1af, 0x3a4, 0x7b, 0x253, 0x3e1, 0x14f, 0x100, 0x6f, 0x2e5, 0x53, 0x33f, 0x8c, 0x1a6, 0x218, 0x3fd, 0x31f, 0x306, 0x37f, 0x391, 0x1d, 0x10a, 0x34, 0x33c, 0x16b, 0x3f9, 0x26c, 0x3dc, 0x3cf, 0x3ed, 0x2da, 0x6e, 0x1bf, 0x261, 0x313, 0x93, 0x211, 0x241, 0x99, 0x24a, 0x398, 0x1a1, 0x28c, 0x178, 0x3db, 0x35b, 0x168, 0x21e, 0x33, 0x3a8, 0x3ee, 0x33d, 0x231, 0x1cb, 0x240, 0x3c3, 0x78, 0x3b4, 0x1be, 0x13b, 0x121, 0xbf, 0x20e, 0x1f6, 0xc0, 0x12e, 0x2cd, 0x13f, 0x52, 0x65, 0x2be, 0x18a, 0x207, 0x4a, 0x346, 0x2bd, 0xda, 0x160, 0x1f0, 0x215, 0x26d, 0x10c, 0x3fd, 0x237, 0x3, 0x3ce, 0x16e, 0x3a0, 0x210, 0x236, 0x2be, 0x314, 0xe, 0x250, 0x5, 0x5b, 0x3b2, 0xe9, 0x239, 0x253, 0x3cb, 0x135, 0x12, 0x2f9, 0xf, 0xed, 0xdf, 0x13b, 0x242, 0x2fc, 0x54, 0x35f, 0x36, 0x302, 0x11, 0x137, 0x161, 0x34d, 0x2cf, 0x30d, 0xfc, 0x1e8, 0x5a, 0x10f, 0x33, 0x359, 0x3a3, 0x1de, 0x358, 0x11e, 0x104, 0x238, 0xee, 0x311, 0x55, 0x1e2, 0xec, 0x262, 0x1e1, 0x322, 0x30c, 0x241, 0x132, 0x13a, 0xff, 0x226, 0x134, 0x2af, 0x223, 0x16f, 0x11d, 0x2ca, 0x356, 0x34e, 0x101, 0x263, 0x35c, 0x3f8, 0x26c, 0x3b1, 0x327, 0x357, 0x1f3, 0x1db, 0x303, 0x2ac, 0x1ed, 0x1, 0x2bd, 0xda, 0x160, 0x1f0, 0x215, 0x26d, 0x10c, 0x3fd, 0x237, 0x3, 0x3ce, 0x16e, 0x3a0, 0x210, 0x236, 0x2be, 0x314, 0xe, 0x250, 0x5, 0x5b, 0x173, 0x368, 0x312, 0x33f, 0x230, 0x256, 0x329, 0x20e, 0x3d1, 0x1b, 0x302, 0x22, 0xd5, 0x31a, 0xb5, 0x146, 0x2f0, 0x2e7, 0x3aa, 0x145, 0x165, 0x356, 0x295, 0xd, 0x33c, 0x1a5, 0x3e7, 0x216, 0x346, 0x188, 0x2e8, 0x270, 0x239, 0xaf, 0x337, 0x1ba, 0x120, 0x38f, 0x3c0, 0x275, 0x28f, 0x27c, 0x76, 0x262, 0x3c2, 0x93, 0x56, 0x51, 0x201, 0x20b, 0x367, 0x2c8, 0x43, 0x3fa, 0x237, 0x6, 0x323, 0x362, 0x27e, 0x290, 0xbb, 0x1ef, 0x2e4, 0x3f, 0xf4, 0x5a, 0x21e, 0xcc, 0x2fe, 0x24e, 0x3be, 0x39d, 0x23b, 0x249, 0x1ee, 0x397, 0x357, 0x3e6, 0x365, 0x2e, 0x29a, 0x1d7, 0x40, 0x6f, 0x386, 0x139, 0x26b, 0x13b, 0x8d, 0x3e2, 0x2a0, 0x195, 0x2c9, 0x130, 0x92, 0x125, 0x339, 0x113, 0x134, 0x157, 0x9e, 0x36a, 0x1f4, 0x1e6, 0x1d, 0x21, 0x340, 0x2ab, 0x18a, 0xe, 0xa9, 0x14, 0x2d8, 0x35e, 0x2e6, 0x1bb, 0xa6, 0x39c, 0x299, 0x8d, 0x3cd, 0x292, 0xb3, 0xc3, 0x241, 0xc1, 0x384, 0x3b7, 0x2c8, 0x86, 0x3f3, 0x19c, 0x60, 0xb1, 0x106, 0x137, 0x18d, 0xb5, 0x28c, 0x3d2, 0x315, 0x2de, 0xfa, 0x1e6, 0x3a, 0x84, 0x236, 0x2ea, 0x12c, 0x380, 0x3d, 0x2d, 0x21e, 0x198, 0x3ea, 0x254, 0x39e, 0x35c, 0x3fb, 0x281, 0x1a3, 0x188, 0x1d9, 0x1d2, 0x1ec, 0x2e2, 0x231, 0x243, 0x104, 0xf2, 0x2fb, 0x1f9, 0x1bd, 0x2e9, 0x20f, 0x14d, 0x1d7, 0x80, 0x1bc, 0xf, 0x3b4, 0x1eb, 0x24b, 0x219, 0x131, 0x3c2, 0x126, 0x158, 0x288, 0x58, 0x1f0, 0x46, 0x291, 0x390, 0x20e, 0x3ab, 0x6c, 0x26, 0x220, 0x296, 0x339, 0x226, 0xd9, 0x2aa, 0x1f2, 0x183, 0x1e7, 0x2dc, 0x13f, 0x290, 0x176, 0x3b5, 0x30d, 0x3f0, 0x2bf, 0x2ad, 0x15b, 0x1ab, 0x295, 0x1a, 0xeb, 0x133, 0x207, 0x250, 0x14, 0x1b9, 0x163, 0xea, 0x1c5, 0x2e5, 0x139, 0x1be, 0x394, 0x308, 0x131, 0x38d, 0x91, 0x2d2, 0xda, 0x312, 0xe7, 0x348, 0x8d, 0x393, 0x25a, 0x191, 0x2b, 0xa2, 0x2c, 0x1f0, 0x8c, 0x256, 0xbf, 0xa8, 0x195, 0x336, 0x324, 0xc1, 0x301, 0x2c7, 0x26d, 0x72, 0x287, 0x3d1, 0x6c, 0x4c, 0x92, 0x9d, 0x3fc, 0x59, 0x225, 0x3fd, 0x19c, 0xc0, 0x2c4, 0x22, 0x354, 0x1cc, 0x113, 0xd9, 0x15d, 0x3c1, 0x3, 0x24f, 0x326, 0x34b, 0x2c2, 0xb5, 0x111, 0x353, 0x9e, 0x1b3, 0x37f, 0x16e, 0x13f, 0x129, 0x1d1, 0x197, 0xbc, 0x2e7, 0x2b3, 0x7d, 0x1e6, 0x74, 0x210, 0x194, 0x2f3, 0x1c1, 0x1f8, 0x2bf, 0x153, 0x165, 0x143, 0x10a, 0x340, 0x2be, 0x96, 0x380, 0x7a, 0xb4, 0xd4, 0x1b6, 0x1a7, 0xd, 0xeb, 0x266, 0xe, 0x2a4, 0x140, 0x345, 0x66, 0x1f5, 0x254, 0x335, 0x16b, 0x3e7, 0x4a, 0x5, 0x2d8, 0x163, 0x1d4, 0x34f, 0x38a, 0x386, 0x1da, 0x3d6, 0x27c, 0x3b0, 0x196, 0x2f2, 0x8, 0x6f, 0xf, 0x2cb, 0x28f, 0x3c4, 0x1bf, 0xab, 0x3bd, 0x40, 0x378, 0x78, 0x275, 0x55, 0x21f, 0x1e3, 0x151, 0x1d7, 0x200, 0x3f6, 0x3c0, 0x38c, 0x2a8, 0xdc, 0x303, 0x29a, 0x2a3, 0x24, 0x38f, 0x23f, 0x5f, 0x16d, 0x2e9, 0x2e, 0xfd, 0x135, 0x120, 0x47, 0x1dc, 0x2f8, 0x37a, 0x365, 0x170, 0x3e1, 0x1ba, 0x112, 0x238, 0x2fb, 0x3ed, 0x3e6, 0x31e, 0x392, 0x337, 0x1cb, 0x82, 0x1e4, 0x3f5, 0x357, 0x30f, 0xc6, 0xaf, 0x18e, 0x243, 0x19, 0x33b, 0x397, 0x28e, 0x4e, 0x239, 0x171, 0x6b, 0x23c, 0xc8, 0x1ee, 0x87, 0x5d, 0x270, 0x1ec, 0x39a, 0x358, 0x1c4, 0x249, 0x36b, 0x31, 0x2e8, 0x3a4, 0x37b, 0xef, 0x2f6, 0x23b, 0x26c, 0x36e, 0x188, 0x36d, 0x11f, 0x3ee, 0x371, 0x39d, 0x1fc, 0x344, 0x346, 0x5b, 0x35e, 0xea, 0x34f, 0x3be, 0x31d, 0x203, 0x2cb, 0x117, 0x30b, 0x1e3, 0x2a2, 0x355, 0x24, 0x317, 0xee, 0x2f8, 0x2fd, 0x18f, 0x392, 0x267, 0x325, 0x19, 0x27f, 0x247, 0x5d, 0xe9, 0x3b9, 0xef, 0x1e5, 0xfe, 0x344, 0x285, 0x16c, 0x2c6, 0x2bb, 0x12a, 0x263, 0x34a, 0x7, 0x141, 0x212, 0x6a, 0x36c, 0x123, 0x1a0, 0x175, 0xb9, 0xfc, 0x177, 0x28a, 0xf3, 0xe8, 0xa4, 0x2ec, 0x32e, 0x1e9, 0x4f, 0x366, 0x3ce, 0x193, 0x29f, 0x23d, 0x28d, 0x1b2, 0x2fa, 0xce, 0x180, 0x20d, 0x49, 0x13a, 0x3df, 0x332, 0xe4, 0x15, 0x2ce, 0x265, 0x116, 0x16, 0x3e0, 0x69, 0x242, 0x32f, 0x2f4, 0x24c, 0x1ad, 0x2d9, 0x298, 0x37c, 0x9f, 0x1d8, 0x196, 0x1ed, 0x20, 0x378, 0xf0, 0x1c6, 0x2a8, 0x1b8, 0x17, 0xfd, 0x26a, 0x89, 0x238, 0x1ff, 0x3af, 0x30f, 0x18c, 0x2bc, 0x6b, 0x71, 0x320, 0x36b, 0x62, 0x3b2, 0x11f, 0x3d5, 0x1df, 0xd7, 0x233, 0x1e, 0x275, 0x154, 0x1b8, 0x2e, 0x3f4, 0x374, 0x82, 0x399, 0x327, 0x5d, 0x1d2, 0x2ff, 0x371, 0x26f, 0x3ff, 0x94, 0x50, 0x283, 0x269, 0x34e, 0xd0, 0x175, 0x172, 0x3f0, 0x3aa, 0xfa, 0x25f, 0x27e, 0x2b4, 0x16a, 0x134, 0x2ba, 0x67, 0x180, 0x13, 0x124, 0x1c2, 0x187, 0x291, 0x17e, 0x292, 0x322, 0x2b0, 0x1b4, 0x14c, 0x37c, 0x13e, 0x369, 0xab, 0x2ef, 0x9, 0x38f, 0xee, 0x1f9, 0x3e6, 0x63, 0x15e, 0x6b, 0xe2, 0x9b, 0x36e, 0x229, 0x2b5, 0x359, 0x12a, 0xcf, 0x133, 0x38, 0x3d, 0x2d0, 0x2b6, 0x105, 0x108, 0x259, 0x2cf, 0x2f0, 0x4f, 0x2c5, 0x323, 0x83, 0x1aa, 0x339, 0x228, 0x86, 0x347, 0x35f, 0x19b, 0x8b, 0x16, 0x3c9, 0x1a4, 0x234, 0x29c, 0x22f, 0x204, 0x31d, 0xf, 0x33e, 0xaa, 0xdc, 0x17, 0x1fa, 0x1ba, 0x41, 0x3c8, 0x397, 0x22a, 0xe9, 0x37b, 0x3bc, 0x333, 0x3fb, 0x6f, 0x78, 0x38c, 0x16d, 0x365, 0x392, 0x18e, 0x23c, 0x249, 0x36e, 0x5b, 0x2c6, 0x2fe, 0x284, 0x1d6, 0x4b, 0x3f, 0x177, 0x23a, 0x32b, 0x27e, 0x161, 0x1a1, 0x1b2, 0x3fa, 0xfb, 0xd8, 0x192, 0x201, 0x3e0, 0x1a4, 0x61, 0x262, 0x15c, 0x8, 0x378, 0x3c0, 0x5f, 0x37a, 0x31e, 0xaf, 0x6b, 0x1c4, 0x26c, 0x346, 0x2d8, 0x21d, 0x3dd, 0xd, 0x2ab, 0x258, 0x1f8, 0x3aa, 0x1f4, 0x16e, 0x3d4, 0x31a, 0x113, 0x18b, 0x3ef, 0x3d1, 0x2c9, 0x8b, 0x2c, 0x33f, 0x13b, 0x308, 0x334, 0x2f2, 0x40, 0x3f6, 0x23f, 0x2f8, 0x3e6, 0xc6, 0x171, 0x358, 0x23b, 0x344, 0x206, 0x2ed, 0xcc, 0x2d7, 0x68, 0x175, 0x2e4, 0x3db, 0x16f, 0x3bb, 0x362, 0x29f, 0xe6, 0x8a, 0x43, 0x347, 0x2b7, 0x265, 0x51, 0x160, 0x1ce, 0x1ca, 0x76, 0x196, 0x3bd, 0x200, 0x38f, 0x1dc, 0x3ed, 0x30f, 0x239, 0x39a, 0x2f6, 0x1fc, 0x216, 0xde, 0x1e0, 0x5f, 0x2fd, 0x63, 0x171, 0x2b9, 0xfe, 0x216, 0x28, 0x10f, 0x36c, 0x10a, 0xca, 0x363, 0x1e9, 0x278, 0x6, 0x2c4, 0x49, 0x1c2, 0x215, 0x14a, 0x32f, 0x38d, 0x204, 0x6f, 0xf0, 0x22b, 0x37a, 0x235, 0x2bc, 0x358, 0x7f, 0x10b, 0x14, 0x283, 0x1b6, 0x85, 0x65, 0x3b5, 0x2f0, 0x13c, 0x3, 0x162, 0x220, 0xe1, 0x30e, 0xa5, 0x393, 0x3c2, 0x102, 0x233, 0x78, 0x311, 0x1bd, 0x31e, 0x15e, 0x1ac, 0x23b, 0x281, 0xa, 0x345, 0xdb, 0x246, 0x236, 0x3de, 0x178, 0x9e, 0x205, 0xb1, 0x110, 0x274, 0x187, 0x256, 0x3cd, 0x1e1, 0x81, 0x31d, 0x3c, 0x38c, 0x2da, 0x18f, 0xaf, 0xd6, 0x319, 0x344, 0x5, 0x3a6, 0x269, 0x123, 0x11b, 0x1ef, 0xbc, 0x4f, 0x306, 0x25c, 0x88, 0x13a, 0x2c7, 0x12b, 0x3e2, 0x2f4, 0x244, 0x38a, 0x1e, 0x1c6, 0x16d, 0x2c3, 0x253, 0x6b, 0x388, 0x1a2, 0x206, 0x1bc, 0x389, 0x2f8, 0x383, 0x7b, 0xef, 0x26f, 0x3c7, 0x141, 0x168, 0x2ca, 0xe8, 0x252, 0x16a, 0x1b2, 0x3f3, 0x3ab, 0x265, 0x144, 0x22d, 0x37c, 0x1e2, 0x3c6, 0xfd, 0x2e1, 0x32, 0x36b, 0x229, 0x185, 0x3dd, 0x34, 0x2ea, 0x30d, 0x38e, 0x2c5, 0x12e, 0x88, 0x274, 0x30e, 0x14a, 0x257, 0x22f, 0x4, 0x2f9, 0x23f, 0x3f2, 0x217, 0x1ec, 0x3bc, 0x1ae, 0x307, 0x10d, 0x1a9, 0x33a, 0x3a0, 0x15a, 0x1a1, 0x2c1, 0x3d7, 0x2b7, 0x186, 0x119, 0xa6, 0x1eb, 0x381, 0x303, 0x3f4, 0x396, 0xc8, 0x1b7, 0xb6, 0x21d, 0x36f, 0xd0, 0x3ba, 0x2f, 0x223, 0x306, 0xb1, 0x220, 0x1c2, 0x23, 0x121, 0x14e, 0xae, 0x10, 0x3f6, 0xee, 0x3d3, 0x4e, 0x3b9, 0x2eb, 0x2b1, 0x7, 0x3d, 0x2ad, 0xf3, 0x29b, 0x161, 0x28d, 0x316, 0x347, 0x2ce, 0x211, 0x6d, 0x298, 0x3a5, 0x21f, 0x17, 0x3cb, 0x243, 0x320, 0x2d5, 0x2d8, 0x378, 0x23f, 0x3ed, 0x4e, 0x37b, 0x3be, 0x1a5, 0x70, 0x3a9, 0x23a, 0x16e, 0x29f, 0x339, 0x2c8, 0x329, 0x12d, 0x91, 0x38a, 0x78, 0x5f, 0x3e6, 0x239, 0xef, 0xd7, 0x307, 0x21a, 0x2ad, 0x1e6, 0x27e, 0x31a, 0x8a, 0x218, 0x54, 0x191, 0x1ad, 0x386, 0x275, 0x16d, 0x31e, 0x171, 0x2f6, 0x3fb, 0xa9, 0x5a, 0x165, 0xe8, 0xad, 0x1a1, 0x18b, 0x347, 0x195, 0x56, 0x368, 0x1da, 0x55, 0x2e9, 0x392, 0x6b, 0x23b, 0x216, 0xa0, 0xd4, 0x286, 0x52, 0x293, 0x134, 0x3fa, 0x3d1, 0x265, 0x288, 0xa6, 0x3d6, 0x21f, 0x2e, 0x337, 0x23c, 0x26c, 0x206, 0x345, 0x36c, 0x21, 0xbb, 0x146, 0x2aa, 0x19c, 0xd8, 0x8b, 0x160, 0x26b, 0x27c, 0x1e3, 0xfd, 0x1cb, 0xc8, 0x36e, 0x2d8, 0xcc, 0x295, 0x236, 0x363, 0x3ad, 0x3c1, 0x180, 0x130, 0x201, 0x33f, 0x1ca, 0x3b0, 0x151, 0x135, 0x82, 0x1ee, 0x188, 0x2c6, 0x2f9, 0xee, 0x357, 0xe9, 0x3a3, 0x263, 0x314, 0xfc, 0x16f, 0x3ce, 0x11, 0x13a, 0x215, 0x242, 0x262, 0x1ed, 0x12, 0x238, 0x327, 0x3b2, 0x359, 0x101, 0x2be, 0x30d, 0x223, 0x3, 0x302, 0x132, 0x1f0, 0x13b, 0xec, 0x2ac, 0x135, 0x104, 0x3b1, 0x5b, 0x33, 0x34e, 0x236, 0x2cf, 0x2af, 0x237, 0x36, 0x241, 0x160, 0xdf, 0x1e2, 0x303, 0x3cb, 0x11e, 0x26c, 0x5, 0x10f, 0x356, 0x210, 0x34d, 0x134, 0x3fd, 0x35f, 0x30c, 0xda, 0xed, 0x55, 0x1db, 0x253, 0x358, 0x3f8, 0x250, 0x5a, 0x2ca, 0x3a0, 0x161, 0x226, 0x10c, 0x54, 0x322, 0x2bd, 0xf, 0x311, 0x1f3, 0x239, 0x1de, 0x35c, 0xe, 0x1e8, 0x11d, 0x16e, 0x137, 0xff, 0x26d, 0x2fc, 0x1e1, 0x1, 0x2f9, 0xee, 0x357, 0xe9, 0x3a3, 0x263, 0x314, 0xfc, 0x16f, 0x3ce, 0x11, 0x13a, 0x215, 0x242, 0x262, 0x1ed, 0x12, 0x238, 0x327, 0x3b2, 0x359, 0x1fb, 0x3b8, 0x28e, 0x28b, 0x95, 0x1d6, 0x172, 0x1c7, 0x306, 0x181, 0x132, 0x3e0, 0xe5, 0x369, 0x29a, 0x2e1, 0x190, 0x346, 0x3a6, 0x2d1, 0x108, 0x34d, 0x268, 0x3ef, 0x2ce, 0xac, 0x376, 0x33e, 0x2da, 0xc6, 0x273, 0x1ae, 0xe, 0x3d0, 0x7d, 0x362, 0x354, 0x3df, 0x256, 0xa7, 0x2b8, 0x200, 0x11c, 0x327, 0x36d, 0x17f, 0x1a, 0x3ba, 0x178, 0x1f2, 0x180, 0xc9, 0x58, 0x26b, 0x1e2, 0x20f, 0x337, 0xe2, 0x281, 0xa0, 0x350, 0x3a, 0xad, 0x28d, 0x86, 0x54, 0x24d, 0x2e6, 0x78, 0x17c, 0x217, 0x37b, 0x2e3, 0x266, 0x3f, 0x2b3, 0x3ce, 0x22, 0xe1, 0x8c, 0x61, 0xcb, 0x3ae, 0x112, 0xf7, 0x310, 0x21d, 0x34e, 0x65, 0x32e, 0x155, 0x338, 0x2c9, 0x144, 0x14c, 0x28f, 0x370, 0x32d, 0x358, 0x3f9, 0x152, 0x2d0, 0xf3, 0xf5, 0xe6, 0x164, 0x25b, 0x17a, 0x204, 0x2f9, 0x1dc, 0x147, 0x341, 0x24e, 0x3f6, 0x2fb, 0x5d, 0xea, 0x284, 0x175, 0x5e, 0xf9, 0x180, 0x192, 0x160, 0x37c, 0x21f, 0x170, 0x6b, 0x1fc, 0xa9, 0x2d0, 0x1e6, 0x3d4, 0x339, 0x26d, 0x3e2, 0x22f, 0x40, 0x47, 0x397, 0x36d, 0x2fe, 0x68, 0x1ef, 0x3ad, 0x237, 0xd8, 0x51, 0xa6, 0x28f, 0x2e9, 0xaf, 0x2f6, 0x3e7, 0x21a, 0x145, 0x16e, 0xd5, 0x3eb, 0x256, 0x14e, 0x2f2, 0x24, 0x1e4, 0x31, 0x2c6, 0x2d7, 0x236, 0x32e, 0x2aa, 0xfb, 0x265, 0x6d, 0x1da, 0x2a8, 0x31e, 0x39a, 0xd7, 0xe, 0x3a9, 0x1f4, 0x326, 0x125, 0x30e, 0x8d, 0x334, 0x1d7, 0x112, 0x1ee, 0x5b, 0xcc, 0x85, 0xbb, 0x222, 0x3fa, 0x2b7, 0x56, 0x376, 0x275, 0x37a, 0x239, 0x371, 0x1a5, 0x380, 0x3aa, 0x1e7, 0x22, 0x1c2, 0x230, 0x308, 0xab, 0x135, 0x19, 0x36e, 0x2ed, 0x36c, 0x108, 0x293, 0x1b2, 0x347, 0xb3, 0x1ad, 0xf, 0x5f, 0x30f, 0x37b, 0x1cf, 0x3e5, 0x3fe, 0x2e8, 0x2bb, 0x34, 0x1ef, 0x353, 0xce, 0x2c9, 0x119, 0xed, 0x2a8, 0x235, 0x273, 0x2b1, 0xe0, 0x1d5, 0x1e7, 0x44, 0x301, 0x1a4, 0xec, 0x14d, 0x1cb, 0x9b, 0xa, 0xd4, 0x3a, 0x2b4, 0x8a, 0x1c8, 0xbd, 0x1, 0x3e5, 0x3fe, 0x2e8, 0x2bb, 0x34, 0x1ef, 0x353, 0xce, 0x2c9, 0x119, 0xed, 0x2a8, 0x235, 0x273, 0x2b1, 0xe0, 0x1d5, 0x1e7, 0x44, 0x301, 0x1a4, 0xec, 0x14d, 0x1cb, 0x9b, 0xa, 0xd4, 0x3a, 0x2b4, 0x8a, 0x1c8, 0xbd, 0x1, 0x3e5, 0x3fe, 0x2e8, 0x2bb, 0x34, 0x1ef, 0x353, 0xce, 0x2c9, 0x119, 0xed, 0x2a8, 0x235, 0x273, 0x2b1, 0xe0, 0x1d5, 0x1e7, 0x44, 0x301, 0x1a4, 0xec, 0x14d, 0x1cb, 0x9b, 0xa, 0xd4, 0x3a, 0x2b4, 0x8a, 0x1c8, 0xbd, 0x1, 0x3e5, 0x3fe, 0x2e8, 0x2bb, 0x34, 0x1ef, 0x353, 0xce, 0x2c9, 0x119, 0xed, 0x2a8, 0x235, 0x273, 0x2b1, 0x3c3, 0x3e3, 0x36d, 0x3ea, 0x289, 0x32e, 0x2ba, 0x3ab, 0x56, 0x1c3, 0x311, 0x30f, 0x1f7, 0xcf, 0x258, 0x38e, 0xc, 0x130, 0xb0, 0x2f1, 0xdc, 0x253, 0x1e5, 0x307, 0x3d0, 0x3e8, 0x106, 0xe1, 0x69, 0x76, 0x14d, 0x396, 0x26c, 0x50, 0x15b, 0x349, 0x73, 0x199, 0x3e2, 0xae, 0x9, 0x1e4, 0xc4, 0x33, 0x85, 0x2ec, 0x268, 0x347, 0x2cc, 0x2e6, 0x3c0, 0x3af, 0x341, 0x254, 0x2be, 0xbc, 0x3c1, 0x6c, 0xa2, 0x139, 0x154, 0x235, 0xef, 0x2d6, 0x309, 0x16f, 0x97, 0x124, 0x3e0, 0x321, 0x3c6, 0x337, 0x319, 0x128, 0x2d0, 0x391, 0x137, 0x3eb, 0x14a, 0xcd, 0x1d7, 0x41, 0x2df, 0x2ed, 0x1ab, 0xa4, 0x1a1, 0x10c, 0x149, 0x81, 0x1fb, 0x1ff, 0x2e8, 0x17f, 0xd0, 0x363, 0x155, 0x1f6, 0x30c, 0x1bb, 0xe3, 0x3e6, 0x3b9, 0x39e, 0x4b, 0x377, 0x205, 0x26, 0x16, 0xdf, 0x21f, 0x1c9, 0x2b9, 0x3e7, 0x38f, 0x397, 0x35e, 0x2d7, 0x194, 0x222, 0x3ef, 0xb3, 0x173, 0x3c0, 0x357, 0x11f, 0x284, 0x3ba, 0x3ad, 0x19c, 0x265, 0x368, 0x275, 0x3e6, 0x37b, 0x263, 0x258, 0x315, 0x30, 0x192, 0x312, 0x28f, 0x365, 0x39a, 0x2b1, 0x380, 0x16f, 0x12e, 0x99, 0x33f, 0x27c, 0x2e, 0x6b, 0x3fb, 0x21a, 0x23a, 0x326, 0x13a, 0x230, 0x76, 0x29a, 0x243, 0x344, 0x109, 0x33a, 0x3d4, 0x1fe, 0x256, 0x262, 0x1d7, 0x82, 0x36e, 0x345, 0x286, 0xad, 0x8a, 0x329, 0x3c2, 0x40, 0x238, 0x31, 0x21d, 0x85, 0x1d1, 0x1b2, 0x20e, 0x93, 0x6f, 0x1dc, 0x5d, 0x359, 0x68, 0x363, 0x2aa, 0x3d1, 0x56, 0x386, 0x5f, 0x4e, 0x34f, 0x1d6, 0x30d, 0xf9, 0x1b, 0x51, 0x139, 0x2a8, 0xc6, 0x371, 0x133, 0x1f8, 0x366, 0x302, 0x201, 0x26b, 0x21f, 0x392, 0x2f6, 0x307, 0x3a9, 0x3bb, 0x22, 0x20b, 0x13b, 0x1bf, 0x3e1, 0x1c4, 0x94, 0x317, 0x247, 0x2c6, 0x123, 0x2ec, 0x1b2, 0x15, 0x24c, 0x378, 0x1ff, 0x3b2, 0x3dd, 0x65, 0x111, 0x3ef, 0x166, 0x1c5, 0x23f, 0x115, 0x3a8, 0x68, 0x2cf, 0x2ba, 0x2b7, 0x169, 0x3c, 0x3ed, 0x341, 0x142, 0x3ba, 0x353, 0x279, 0x30c, 0x2e5, 0x22b, 0x4e, 0x297, 0x351, 0x5e, 0x38b, 0x360, 0x6d, 0x19f, 0x1f3, 0x37b, 0xcf, 0x172, 0x9e, 0x300, 0x22c, 0x139, 0x159, 0x318, 0x3be, 0x314, 0x377, 0x6, 0x260, 0x189, 0x28f, 0x2c3, 0x273, 0x1a5, 0x7e, 0x1b3, 0x302, 0xb, 0x1be, 0xdc, 0x15e, 0x26f, 0x70, 0x35d, 0x97, 0x99, 0x277, 0x1e2, 0x170, 0x2b9, 0x387, 0x3a9, 0x37f, 0x88, 0x7c, 0x394, 0x385, 0x18e, 0x3f8, 0x10d, 0x23a, 0x245, 0xe1, 0x1a4, 0x369, 0x3f4, 0x1c4, 0x128, 0x352, 0x16e, 0x14b, 0x23, 0x308, 0x2a2, 0x325, 0x344, 0x212, 0xf3, 0x29f, 0x3df, 0x242, 0x196, 0x26a, 0x320, 0x14, 0x227, 0x10e, 0x21d, 0x214, 0x12f, 0x43, 0x292, 0x2, 0x47, 0x21c, 0x33, 0x21, 0x25e, 0x86, 0x12d, 0x4, 0x8e, 0x31, 0x66, 0x42, 0xb5, 0x10c, 0x25a, 0x8, 0x11c, 0x62, 0xcc, 0x84, 0x16a, 0x218, 0xbd, 0x10, 0x238, 0xc4, 0x198, 0x108, 0x2d4, 0x39, 0x17a, 0x20, 0x79, 0x188, 0x330, 0x210, 0x1a1, 0x72, 0x2f4, 0x40, 0xf2, 0x310, 0x269, 0x29, 0x342, 0xe4, 0x1e1, 0x80, 0x1e4, 0x229, 0xdb, 0x52, 0x28d, 0x1c8, 0x3c2, 0x100, 0x3c8, 0x5b, 0x1b6, 0xa4, 0x113, 0x390, 0x38d, 0x200, 0x399, 0xb6, 0x36c, 0x148, 0x226, 0x329, 0x313, 0x9, 0x33b, 0x16c, 0x2d1, 0x290, 0x45, 0x25b, 0x22f, 0x12, 0x27f, 0x2d8, 0x1ab, 0x129, 0x8a, 0xbf, 0x57, 0x24, 0xf7, 0x1b9, 0x356, 0x252, 0x114, 0x17e, 0xae, 0x48, 0x1ee, 0x372, 0x2a5, 0xad, 0x228, 0x2fc, 0x15c, 0x90, 0x3dc, 0x2ed, 0x47, 0x31, 0xcc, 0x108, 0x1a1, 0xe4, 0x3c2, 0x200, 0x33b, 0x2d8, 0x356, 0xad, 0x59, 0x3e2, 0x2f2, 0x112, 0x36e, 0x21e, 0xe8, 0xe6, 0x34c, 0x262, 0x2a3, 0xc8, 0x14, 0x165, 0x3d4, 0x3eb, 0x8d, 0xab, 0x1cb, 0x344, 0x5a, 0x32b, 0x2a1, 0x46, 0x76, 0xfd, 0x1c4, 0xa9, 0x145, 0x326, 0x1c2, 0x13b, 0x1e3, 0x18e, 0x3fb, 0xf4, 0x3bb, 0x110, 0x3e0, 0x27c, 0x170, 0x2f6, 0xe, 0x3aa, 0x12e, 0xc1, 0x26b, 0xdc, 0x171, 0x2b1, 0x3f, 0x366, 0x26, 0x160, 0x28f, 0x31e, 0x371, 0x18a, 0x2e7, 0x30, 0x8b, 0x139, 0x16d, 0x1ec, 0x263, 0x2e4, 0xf9, 0xd8, 0x6d, 0x275, 0x30f, 0x34f, 0x2ab, 0x2f0, 0x19c, 0x30c, 0x386, 0x2f8, 0x3a4, 0x284, 0x1ef, 0x2aa, 0x2b7, 0x1ad, 0x3c0, 0x28e, 0x359, 0x340, 0x146, 0x3ef, 0x191, 0x6f, 0x2fb, 0x36d, 0x2d7, 0xbb, 0x1b2, 0x54, 0x81, 0x38f, 0x87, 0x21d, 0x8e, 0xc4, 0x269, 0xa4, 0x45, 0x17e, 0x2b8, 0x89, 0x36e, 0x35, 0x3a0, 0x339, 0xa5, 0xcb, 0x1ba, 0xd1, 0x2d, 0x32b, 0x14b, 0x118, 0x3b0, 0x3cb, 0xfe, 0x21a, 0x3e8, 0x88, 0x3e0, 0xf1, 0x1c9, 0x39d, 0xe0, 0x1b5, 0x302, 0x58, 0x343, 0x31e, 0x2eb, 0x221, 0x315, 0x300, 0x144, 0x2cb, 0x3c5, 0x3a3, 0x2ab, 0x1e9, 0x279, 0x56, 0x1e, 0x3af, 0xea, 0xd0, 0xa3, 0x3ef, 0x322, 0x1bc, 0x3f5, 0x2b5, 0x246, 0x293, 0x86, 0xbd, 0x40, 0x3c8, 0x16c, 0x356, 0x15a, 0x164, 0x32f, 0x373, 0x208, 0x206, 0x15b, 0x1ea, 0x3eb, 0x11a, 0x2ac, 0x243, 0x25, 0x352, 0x362, 0x274, 0x299, 0x1e3, 0x31c, 0x3f7, 0x3a9, 0x3ce, 0x248, 0x1ce, 0x37, 0x2bc, 0x2b1, 0x7e, 0x183, 0x130, 0x22d, 0x154, 0x239, 0x39e, 0x172, 0xf9, 0x1b0, 0x1b4, 0x38c, 0x9c, 0x12a, 0x3ba, 0x2ae, 0x35f, 0x1ad, 0x389, 0x22a, 0x2fe, 0x11c, 0x310, 0x36c, 0x252, 0xb2, 0x32f, 0x2ef, 0x32, 0x14, 0x19d, 0x137, 0x30e, 0x3b, 0x1fa, 0x23b, 0x10d, 0x3e8, 0x110, 0x39b, 0x381, 0xaf, 0x35c, 0x7e, 0x306, 0xc9, 0x14c, 0x16d, 0x3b9, 0x271, 0x5e, 0xce, 0x211, 0xf, 0x3af, 0x1d4, 0x340, 0x111, 0x287, 0x91, 0x3c3, 0x10e, 0xcc, 0x29, 0x226, 0x17e, 0x179, 0x224, 0x346, 0x350, 0xf5, 0x3eb, 0x234, 0x2a2, 0x23c, 0x250, 0x28a, 0x106, 0x3e, 0x9f, 0x170, 0x3ca, 0xe0, 0x36a, 0x13, 0x2c0, 0x55, 0x318, 0x39e, 0x2e4, 0x3e4, 0x19b, 0x376, 0x17c, 0x341, 0xd, 0x197, 0x3fd, 0x191, 0x1bc, 0x3e3, 0x2c6, 0x214, 0x16a, 0xe4, 0x313, 0x48, 0x36b, 0x10f, 0x1d0, 0x339, 0x14a, 0x32c, 0x1cb, 0x10b, 0x1a9, 0x362, 0xe1, 0x276, 0x303, 0x1ac, 0x207, 0x3aa, 0xb1, 0xb, 0x3d6, 0x18f, 0x2eb, 0x4b, 0x4f, 0x36, 0x6d, 0x1c6, 0x9c, 0x254, 0x238, 0x5b, 0x356, 0x161, 0x26d, 0x262, 0x135, 0x26c, 0x5a, 0x16e, 0x13a, 0x13b, 0x303, 0x358, 0xe, 0x16f, 0x302, 0x160, 0x55, 0x239, 0x263, 0x30d, 0x237, 0x30c, 0xf, 0x357, 0x359, 0x236, 0x134, 0x54, 0x1, 0x238, 0x5b, 0x356, 0x161, 0x26d, 0x262, 0x135, 0x26c, 0x5a, 0x16e, 0x13a, 0x13b, 0x303, 0x358, 0xe, 0x16f, 0x302, 0x160, 0x55, 0x239, 0x263, 0x30d, 0x237, 0x30c, 0xf, 0x357, 0x359, 0x236, 0x134, 0x54, 0x1, 0x238, 0x5b, 0x356, 0x161, 0x26d, 0x262, 0x135, 0x26c, 0x5a, 0x16e, 0x13a, 0x13b, 0x303, 0x358, 0xe, 0x16f, 0x302, 0x160, 0x55, 0x239, 0x263, 0x30d, 0x237, 0x30c, 0xf, 0x357, 0x359, 0x236, 0x134, 0x54, 0x1, 0x238, 0x5b, 0x356, 0x161, 0x26d, 0x262, 0x135, 0x26c, 0x5a, 0x16e, 0x13a, 0x13b, 0x303, 0x358, 0xe, 0x16f, 0x302, 0x160, 0x55, 0x239, 0x263, 0x79, 0x16c, 0x286, 0x23d, 0x12b, 0x196, 0x396, 0x4a, 0x145, 0x20c, 0x1f0, 0x3c4, 0x15e, 0x2d6, 0x3db, 0x60, 0x144, 0x275, 0x9c, 0x142, 0x363, 0x3fd, 0x24d, 0x3f6, 0x10e, 0x330, 0x290, 0xb2, 0xa7, 0x2a3, 0x9b, 0x2d, 0x16e, 0x274, 0xe5, 0x2e, 0x1e5, 0x1c0, 0x366, 0x260, 0x298, 0x37a, 0x3d5, 0x2be, 0x157, 0x167, 0x1c5, 0x2fb, 0x2b5, 0x214, 0x1a1, 0x25b, 0x179, 0x82, 0x5, 0x19d, 0xd5, 0x8c, 0x2db, 0x18e, 0x3c7, 0x1d5, 0x162, 0x58, 0x22e, 0x239, 0xcf, 0x2f, 0x19c, 0xac, 0x1e0, 0x5d, 0x3b3, 0x2ec, 0x43, 0x2f4, 0x12, 0x36b, 0x35, 0x13f, 0x3eb, 0xc2, 0x27a, 0x23b, 0x3d, 0x2f7, 0x99, 0xdf, 0x3b6, 0x371, 0x96, 0x278, 0x2c9, 0x2e5, 0x3f2, 0xea, 0x289, 0x9a, 0x54, 0x2, 0xf2, 0x2d8, 0x105, 0x73, 0x256, 0x32c, 0x325, 0x94, 0x28a, 0x11, 0x3e0, 0x381, 0x2bc, 0x1a5, 0xf2, 0x1b9, 0x1d, 0x398, 0x121, 0x151, 0xe2, 0x282, 0x3bb, 0x248, 0xdf, 0x365, 0x1df, 0xb9, 0x3c1, 0x186, 0x1e, 0x28e, 0x3ea, 0x176, 0x43, 0x1e1, 0x48, 0x36e, 0x350, 0x3a1, 0x30e, 0x1d8, 0x267, 0x3e7, 0x1d5, 0x2c4, 0x160, 0x154, 0x3d8, 0x1d6, 0x3d2, 0x3ab, 0x173, 0x379, 0x2b5, 0x21, 0x28d, 0x2fc, 0x3bd, 0x64, 0x140, 0x32b, 0x9d, 0x276, 0x2e, 0x3ca, 0x309, 0x306, 0x241, 0x3b4, 0x30f, 0x12a, 0x3de, 0x3fa, 0x24d, 0x3e5, 0x31, 0x1b6, 0x15a, 0x26d, 0x19a, 0x374, 0x216, 0x2a6, 0x20c, 0x3e0, 0x30b, 0x2e2, 0x133, 0x38e, 0x36, 0x368, 0x17c, 0x23e, 0x340, 0x9a, 0xa8, 0x8, 0x399, 0x1d3, 0xe8, 0xff, 0x11a, 0x29a, 0x319, 0x3d, 0x1e7, 0x264, 0x2f1, 0x31e, 0x2e3, 0x1c1, 0x237, 0x2b, 0xf0, 0x5d, 0x36f, 0x3a2, 0x218, 0x313, 0x240, 0x346, 0x2b6, 0x137, 0x46, 0x2db, 0x31c, 0x307, 0x1e4, 0x2ed, 0xe8, 0x1fe, 0x61, 0xfd, 0x1fc, 0x3a9, 0x12e, 0x2c, 0x55, 0x1ec, 0x1d6, 0x3ad, 0x2b7, 0x38a, 0x3f5, 0x21d, 0x52, 0x59, 0x14e, 0x135, 0x344, 0x2ad, 0x106, 0x3e0, 0x21f, 0x39a, 0x18a, 0x9e, 0x2c9, 0x386, 0x357, 0x2fe, 0xbb, 0x43, 0x3c2, 0x120, 0x346, 0x165, 0xd5, 0x230, 0x1e3, 0x358, 0x70, 0x366, 0x192, 0x1da, 0x30f, 0x254, 0x363, 0x3ef, 0x91, 0x47, 0x5b, 0x286, 0xe6, 0x294, 0x151, 0x1c4, 0x21a, 0x1e7, 0xc1, 0x3d6, 0xc6, 0x263, 0x5e, 0xfb, 0x1ad, 0x1dc, 0x35e, 0x21, 0x113, 0x3e2, 0x1d7, 0x249, 0x5a, 0x362, 0x20b, 0x27c, 0xaf, 0x1a5, 0x2e7, 0x1b, 0x368, 0x2f8, 0xea, 0x236, 0x1b2, 0x12d, 0x200, 0x36b, 0xd4, 0x3d4, 0x30e, 0x3b0, 0x18e, 0x307, 0x16f, 0x26, 0xa6, 0x37a, 0x34f, 0x3ba, 0x17d, 0x191, 0x3f6, 0x31, 0x36c, 0x161, 0x34c, 0x196, 0x243, 0xa9, 0x3c8, 0x3a6, 0x349, 0x3df, 0x3b, 0x337, 0x3c7, 0x2b3, 0x26, 0x14c, 0x1f3, 0x24e, 0x3de, 0x3f3, 0x91, 0x8e, 0x16c, 0x1d, 0x27b, 0x234, 0xfd, 0x3f8, 0x2bf, 0x162, 0x2c0, 0x2b2, 0x3ee, 0x2ea, 0x2ba, 0x191, 0x3e5, 0xc4, 0x356, 0x23d, 0x14a, 0x151, 0x388, 0x7a, 0x323, 0xb, 0x22e, 0x1ec, 0x3ac, 0x2af, 0x195, 0xde, 0x247, 0x269, 0x15a, 0x1a6, 0x196, 0x8f, 0x2a4, 0x3bb, 0x132, 0x1eb, 0xc6, 0xcf, 0x178, 0x3d1, 0x2e6, 0x3fe, 0x21d, 0xa4, 0x164, 0x262, 0x374, 0x4a, 0x23a, 0x220, 0x331, 0x365, 0x375, 0x382, 0x19c, 0x169, 0xee, 0x35e, 0x42, 0x45, 0x32f, 0x14f, 0x1a2, 0x2ad, 0x20c, 0x39b, 0xdc, 0x1de, 0x12c, 0x3c1, 0x211, 0x1e0, 0x2e8, 0x123, 0x2d4, 0x17e, 0x373, 0x320, 0x5a, 0x2cd, 0x3e, 0x3c4, 0x2e2, 0xc5, 0x9e, 0x19b, 0x203, 0x28e, 0x3b3, 0x34d, 0xe4, 0x2b8, 0x208, 0xa0, 0x399, 0x283, 0x27e, 0x187, 0x369, 0x6b, 0x38, 0x2c5, 0x8b, 0x33e, 0xe9, 0x68, 0x9a, 0x149, 0x200, 0x1b7, 0x15b, 0xd5, 0xd2, 0x20f, 0x39d, 0xfc, 0x60, 0x6d, 0x17c, 0x1d4, 0x194, 0x225, 0x38d, 0x112, 0xa, 0x3cc, 0x13a, 0x321, 0x32d, 0x1a5, 0x38e, 0x1b0, 0x386, 0x147, 0x3b3, 0x293, 0x390, 0x1ed, 0xc8, 0x2d, 0x2cd, 0x7c, 0x30b, 0x33d, 0x4b, 0x3e4, 0x211, 0x3c0, 0x3b2, 0x10a, 0x113, 0x393, 0x14f, 0x344, 0x2a6, 0x44, 0x1ce, 0x3b6, 0x375, 0x30d, 0x279, 0x35a, 0x2fb, 0x30a, 0xa4, 0x2c8, 0x19a, 0x396, 0xa9, 0x3d9, 0x132, 0x3d6, 0x318, 0x271, 0x3ad, 0x2ce, 0xde, 0x87, 0x1b6, 0x2c2, 0x256, 0x2ac, 0x388, 0xf4, 0x97, 0x58, 0x2a8, 0x1f7, 0x2ea, 0x17d, 0x24d, 0x317, 0x5b, 0x20a, 0x27b, 0x61, 0x3f4, 0x3ff, 0x3aa, 0x13, 0x14c, 0x3e6, 0x12a, 0x2cf, 0x347, 0x204, 0x3c8, 0x345, 0x33b, 0x21e, 0x3d4, 0x46, 0x1e3, 0x2f6, 0x3f, 0x30, 0x6d, 0x2f8, 0x359, 0xbb, 0x218, 0x15c, 0x19, 0x109, 0x362, 0x7c, 0x21f, 0xef, 0x258, 0x237, 0x2b0, 0x1dc, 0x2c6, 0x52, 0x2c8, 0x334, 0x243, 0x141, 0x1e7, 0x201, 0x55, 0x37b, 0x175, 0x17d, 0x93, 0x47, 0x2d8, 0xe8, 0x3eb, 0x76, 0x18e, 0xe, 0x366, 0x8b, 0x275, 0x3a4, 0x340, 0x1b2, 0x17a, 0x120, 0x206, 0x1e6, 0x13a, 0x24b, 0xaf, 0x133, 0x9e, 0x265, 0x78, 0x2e8, 0x85, 0x113, 0x32f, 0x135, 0x216, 0x23a, 0x92, 0x37c, 0xc6, 0x33c, 0x3ad, 0x195, 0x378, 0x31, 0x356, 0xe6, 0x8d, 0xfd, 0x3fb, 0x3aa, 0x26, 0x139, 0x30f, 0x284, 0x146, 0x54, 0x40, 0x36b, 0x2a9, 0xd5, 0x1a4, 0x2e, 0xd7, 0x3db, 0x1b, 0x376, 0x357, 0x3dd, 0x293, 0x329, 0x3bd, 0x249, 0x2d0, 0x106, 0x33f, 0x2e9, 0x3be, 0x30d, 0xfb, 0x173, 0x3f5, 0xcc, 0x27f, 0x6a, 0x29f, 0x69, 0x17, 0xd7, 0x3bf, 0x6c, 0x386, 0x115, 0x34e, 0x1a1, 0x3cd, 0x29e, 0x216, 0x7d, 0x248, 0x3d6, 0x7b, 0x351, 0x2aa, 0x322, 0x227, 0x2d8, 0x1d0, 0x3b7, 0x3b0, 0xd6, 0x1c0, 0x6, 0x119, 0x17c, 0x359, 0x176, 0x72, 0x2f2, 0x190, 0x168, 0x106, 0x277, 0x3b6, 0x1cf, 0xbc, 0x35f, 0x6f, 0x10e, 0x1ab, 0xe6, 0x11a, 0x3f4, 0x3e7, 0x2de, 0xc9, 0x2cb, 0xe9, 0x1a0, 0x1b2, 0x2f4, 0x89, 0x14, 0x25f, 0x301, 0x3c4, 0x33d, 0x12c, 0x237, 0x169, 0x379, 0x21d, 0x129, 0x1a6, 0xab, 0x388, 0x3d0, 0x162, 0x22d, 0x1f3, 0x254, 0x255, 0x2a, 0x40, 0x2df, 0x2b6, 0x2a1, 0x276, 0x1c9, 0x1a5, 0x223, 0x336, 0x78, 0x1d9, 0x214, 0x8a, 0x29c, 0x2e1, 0xa9, 0x37f, 0x304, 0x55, 0x2ff, 0x1dd, 0x3fa, 0x122, 0xf2, 0x345, 0xf5, 0x23, 0x1e3, 0x1e5, 0xfc, 0x180, 0x2d9, 0x3af, 0x3dd, 0xf7, 0x1a8, 0xd5, 0x299, 0x2e0, 0x1a5, 0x4f, 0xc3, 0x3c0, 0x1af, 0x210, 0x2c8, 0xcb, 0x71, 0xf4, 0xb1, 0x22d, 0x3e6, 0x142, 0x28c, 0x2a0, 0x12, 0x285, 0x1e6, 0xe1, 0xf1, 0x39a, 0x12c, 0x67, 0x1ad, 0x3fe, 0x198, 0x161, 0x14a, 0x13d, 0x3fb, 0x2b3, 0x260, 0x2cb, 0x1d2, 0x289, 0x18b, 0x313, 0x104, 0x109, 0x193, 0x3c9, 0x2e9, 0x2e3, 0xbc, 0x2b7, 0x1bc, 0x62, 0x286, 0xff, 0x219, 0x18e, 0x38, 0x205, 0x288, 0x17c, 0x2bb, 0x1d1, 0x390, 0x373, 0x26c, 0x2a6, 0x220, 0x37c, 0x318, 0x3ac, 0x2aa, 0x24d, 0x8e, 0x2ed, 0x13f, 0x215, 0x1e3, 0x3ca, 0x3f0, 0x1b, 0x1c3, 0x115, 0x295, 0x28d, 0x257, 0x1ba, 0x250, 0x37f, 0x201, 0x154, 0x3d5, 0x1ef, 0x3a7, 0x2, 0x1ee, 0x350, 0x1aa, 0x13b, 0x1c9, 0x34a, 0x9e, 0x186, 0x389, 0x35e, 0x29, 0x199, 0x196, 0xe2, 0x1e8, 0x162, 0x53, 0x3c5, 0x284, 0x1ee, 0x2a9, 0x2a1, 0x1ca, 0xaf, 0x18a, 0x3c1, 0x2b0, 0x2fb, 0xcc, 0x161, 0x294, 0xfd, 0x3e7, 0x36a, 0x8b, 0x38c, 0xea, 0xbb, 0xe4, 0x3bd, 0x26c, 0x145, 0x92, 0x3d6, 0x1ec, 0x175, 0x3fa, 0x81, 0x33b, 0xd4, 0xd5, 0x13b, 0x392, 0x133, 0xf9, 0x56, 0x1dc, 0x21d, 0xad, 0x256, 0x29a, 0x3fb, 0x16f, 0x192, 0x275, 0x11f, 0x194, 0x218, 0x2f2, 0x249, 0x2ad, 0x110, 0x37c, 0x239, 0x2ab, 0x17d, 0x91, 0x1e4, 0x21e, 0x29f, 0x1a4, 0x170, 0x1a5, 0x9e, 0x30c, 0x23f, 0x2c6, 0x290, 0x34c, 0x151, 0x1fc, 0x3aa, 0x130, 0x2cb, 0x3a4, 0x236, 0x43, 0x15c, 0xc8, 0x2d0, 0x22, 0x26b, 0xc6, 0x1d6, 0x2aa, 0x93, 0x238, 0x345, 0x3d4, 0x230, 0x2e, 0x2b1, 0x315, 0x265, 0x3c0, 0x35e, 0x52, 0x26d, 0xab, 0x23b, 0x177, 0x26, 0x1da, 0x270, 0x340, 0x18b, 0x22f, 0x19, 0x5a, 0x106, 0x1ce, 0x31e, 0x33c, 0x3dc, 0x2b6, 0x125, 0x9f, 0x1cd, 0x258, 0x338, 0x1c5, 0x87, 0x2a5, 0xff, 0x76, 0xd6, 0x21b, 0x180, 0x2e5, 0x22a, 0x85, 0x114, 0x19a, 0x23c, 0x1e8, 0x181, 0x139, 0x9c, 0x1a0, 0x18b, 0x57, 0x64, 0x2d0, 0x44, 0x1be, 0x239, 0x15f, 0x1fd, 0x81, 0x27f, 0x350, 0x2a1, 0x394, 0x2bc, 0x4b, 0x67, 0x2bd, 0x397, 0x2d1, 0x398, 0x308, 0x31c, 0x1c0, 0x30, 0x2d9, 0x147, 0x295, 0x226, 0x131, 0x243, 0x3d, 0xb1, 0xa6, 0x217, 0x34, 0x1b2, 0x38d, 0x208, 0x5a, 0x20c, 0x331, 0xc6, 0x3ac, 0x2ba, 0x91, 0x3c8, 0x6a, 0xd5, 0x276, 0x253, 0x18a, 0x38b, 0x2d2, 0x3f5, 0xdb, 0x73, 0x61, 0x267, 0x38, 0x6, 0xda, 0x3af, 0x2d7, 0x342, 0xa7, 0x1cb, 0x282, 0x97, 0x312, 0x3c5, 0x202, 0x134, 0x2f4, 0x41, 0x109, 0x245, 0xe7, 0x31e, 0x271, 0x155, 0x93, 0x79, 0x10f, 0x29f, 0x348, 0x1c9, 0x133, 0x3b1, 0x2ca, 0x13a, 0x1e2, 0x1de, 0x30d, 0x35f, 0x2f9, 0x5b, 0x3a0, 0x215, 0x303, 0x35c, 0x223, 0x30c, 0xee, 0x33, 0x161, 0x242, 0x3cb, 0xe, 0x3, 0xda, 0x357, 0x34e, 0x226, 0x262, 0x11e, 0x1e8, 0x302, 0xed, 0xe9, 0x236, 0x10c, 0x1ed, 0x26c, 0x11d, 0x132, 0x55, 0x3a3, 0x2cf, 0x54, 0x12, 0x5, 0x16e, 0x1f0, 0x1db, 0x263, 0x2af, 0x322, 0x238, 0x10f, 0x137, 0x13b, 0x253, 0x314, 0x237, 0x2bd, 0x327, 0x356, 0xff, 0xec, 0x358, 0xfc, 0x36, 0xf, 0x3b2, 0x210, 0x26d, 0x2ac, 0x3f8, 0x16f, 0x241, 0x311, 0x359, 0x34d, 0x2fc, 0x135, 0x250, 0x3ce, 0x160, 0x1f3, 0x101, 0x134, 0x1e1, 0x104, 0x5a, 0x11, 0xdf, 0x239, 0x2be, 0x3fd, 0x1, 0x3b1, 0x2ca, 0x13a, 0x1e2, 0x1de, 0x30d, 0x35f, 0x2f9, 0x5b, 0x3a0, 0x215, 0x303, 0x35c, 0x223, 0x30c, 0xee, 0x33, 0x161, 0x242, 0x3cb, 0xe, 0x36b, 0x33a, 0x1c2, 0x21f, 0x3be, 0x2f0, 0xb3, 0x47, 0x345, 0x29f, 0x13b, 0xaf, 0x4b, 0x19c, 0x38a, 0x31, 0x1d, 0x367, 0x1e3, 0xd7, 0x315, 0x30c, 0x1dc, 0xcc, 0x31a, 0x61, 0x18e, 0x380, 0x180, 0x386, 0x2e8, 0x108, 0x26d, 0x151, 0x3fb, 0x36a, 0x51, 0x2f8, 0x3dd, 0x1a1, 0x14e, 0x243, 0xf4, 0x302, 0x1da, 0x3a4, 0x194, 0xe4, 0x1d7, 0x216, 0x3bb, 0x2c, 0x37a, 0x284, 0x134, 0x3c2, 0x19, 0x2d0, 0x110, 0x3d6, 0x37b, 0x1ef, 0x20e, 0x200, 0x206, 0x16e, 0x3e0, 0x365, 0x33c, 0x2aa, 0x91, 0x33b, 0x2a9, 0x125, 0x27c, 0xef, 0x30d, 0x2b7, 0x3f6, 0x2d8, 0x27e, 0x230, 0x170, 0x133, 0x3c1, 0x1ad, 0x397, 0x356, 0x1fe, 0x3b0, 0x2f6, 0x3db, 0x2c9, 0x3c0, 0x2c6, 0xad, 0x294, 0x3e1, 0xe, 0x6, 0x368, 0x28e, 0x85, 0x59, 0x196, 0x23b, 0x3aa, 0x192, 0x38c, 0x359, 0x293, 0x3e2, 0x1ba, 0x141, 0x2df, 0xf3, 0x20b, 0x1b8, 0x335, 0x157, 0x126, 0x399, 0x2a9, 0x24a, 0x1e2, 0x371, 0xbc, 0x25d, 0x47, 0x283, 0x26e, 0x1ca, 0x2e2, 0x172, 0x3d1, 0x2f9, 0x16c, 0x27e, 0x69, 0x1c9, 0x18a, 0x67, 0x1c5, 0x31, 0x3a, 0x187, 0x303, 0x16b, 0x278, 0x2b0, 0x3e3, 0x1ab, 0x1fe, 0x369, 0x3ca, 0x2e7, 0xc3, 0xee, 0xcc, 0x23d, 0x184, 0x6b, 0x7e, 0x6c, 0x78, 0x2b5, 0x252, 0x294, 0x3cb, 0x38, 0x30, 0x2e5, 0x174, 0x108, 0xd3, 0x14d, 0x3e7, 0x2c5, 0x232, 0x357, 0x123, 0x228, 0x196, 0x7f, 0x2b3, 0x8b, 0xbe, 0x3ea, 0x1a1, 0x29c, 0x11e, 0x3a9, 0x4c, 0x33e, 0xea, 0x3a2, 0x1f1, 0x1ba, 0x282, 0xb1, 0x139, 0xe9, 0xca, 0xe4, 0x3ae, 0x4a, 0x1e7, 0x2c0, 0x383, 0x68, 0x316, 0x179, 0x26c, 0x7d, 0x304, 0x16d, 0xa1, 0x9a, 0x3c2, 0x32, 0x352, 0x92, 0x117, 0x3a3, 0x32e, 0x149, 0x89, 0x109, 0x1b7, 0x3cc, 0x7c, 0x3b6, 0x271, 0x17d, 0x204, 0x2df, 0x1e6, 0x3e, 0x1db, 0x33c, 0x2ba, 0x102, 0x36b, 0xf3, 0x1f, 0x2e9, 0x19e, 0x15d, 0x81, 0x3b1, 0x27d, 0x20b, 0x370, 0xcf, 0x2aa, 0x244, 0x3dc, 0x33a, 0x301, 0x1b8, 0x263, 0x155, 0x122, 0x1ee, 0x19d, 0x384, 0xdc, 0x335, 0x2ae, 0x91, 0xf7, 0x2ca, 0x1c2, 0x6e, 0x39e, 0x157, 0x24c, 0x27f, 0x165, 0xe1, 0x37, 0x1cf, 0x2af, 0x126, 0x33b, 0x2b6, 0x274, 0x21f, 0x2e3, 0x353, 0x93, 0x399, 0x15b, 0x13a, 0x30b, 0x375, 0x3ad, 0x24d, 0x3c8, 0x2a9, 0x9d, 0x381, 0x3be, 0x3d2, 0x322, 0x1e4, 0x350, 0x24a, 0x3c4, 0x1df, 0x1e9, 0x191, 0xf2, 0x1a8, 0x125, 0x1e2, 0x2eb, 0x2f0, 0x2cc, 0x79, 0xd4, 0x296, 0xf1, 0x371, 0x178, 0x166, 0x238, 0x6a, 0x14b, 0x27c, 0x3bc, 0xbc, 0xb3, 0x11c, 0x35, 0x2a1, 0x13e, 0x1de, 0x5e, 0x25d, 0x8e, 0x21e, 0x36e, 0x32b, 0x3e0, 0x31e, 0x2ab, 0x3ef, 0x40, 0x206, 0x362, 0x1ce, 0x239, 0x3ba, 0x20e, 0x24, 0xa0, 0x106, 0x37c, 0x37b, 0x363, 0x2a0, 0x112, 0x5a, 0x110, 0x28f, 0x34f, 0x146, 0x17a, 0x19, 0x2ad, 0x99, 0x2a8, 0x254, 0x134, 0x22f, 0x249, 0x23a, 0x201, 0x37a, 0xd, 0x18b, 0x2f2, 0x344, 0x3bb, 0x160, 0x30f, 0x340, 0x218, 0x1d7, 0x94, 0x323, 0xa6, 0x270, 0x194, 0x329, 0x135, 0x141, 0x162, 0x1da, 0x11f, 0x1d1, 0x3e2, 0x1cb, 0xf4, 0x26, 0x275, 0x359, 0xb5, 0x14e, 0x23c, 0x177, 0x192, 0x5f, 0x3dd, 0x113, 0x334, 0x23b, 0x16f, 0x51, 0x3ed, 0x295, 0x59, 0xab, 0x3fb, 0x366, 0x6d, 0x28e, 0x21, 0x26d, 0x29a, 0x307, 0x6, 0x376, 0x2e8, 0x52, 0x256, 0x3e1, 0x70, 0x180, 0xf, 0x35e, 0xad, 0x8d, 0x18e, 0x3f, 0xd8, 0x3c0, 0x21d, 0x31a, 0x308, 0x358, 0x3db, 0x265, 0x1dc, 0x269, 0x2d5, 0xb7, 0x33f, 0x18c, 0x1dd, 0x20e, 0x48, 0x280, 0x22, 0x3a5, 0x3a3, 0x146, 0x2f4, 0x64, 0x145, 0x182, 0x1bd, 0xd, 0x316, 0x3da, 0x216, 0x3ce, 0x53, 0x270, 0x328, 0xbf, 0x1ba, 0x3d, 0x13, 0x275, 0x2bb, 0x2d4, 0x262, 0x388, 0x2b3, 0x51, 0x3d3, 0x246, 0x2c8, 0x2a2, 0x387, 0x6, 0x2e5, 0x3b2, 0x290, 0x121, 0xc7, 0x3f, 0x1b0, 0x31b, 0xcc, 0x1cc, 0x1d8, 0x39d, 0x223, 0x158, 0x397, 0x105, 0x187, 0x2e, 0x266, 0xce, 0x6f, 0xb6, 0x1ea, 0x13b, 0x2e2, 0x382, 0x195, 0x8e, 0x6a, 0x125, 0x381, 0x2e3, 0x157, 0x122, 0x3b1, 0x1e6, 0xf8, 0x18f, 0x2ab, 0x3d7, 0x100, 0x14, 0x245, 0x1be, 0x37b, 0x2cf, 0x292, 0x82, 0x1a9, 0x248, 0x2a8, 0xa1, 0xd9, 0x15c, 0xd1, 0x3d9, 0x160, 0x217, 0x11b, 0xe4, 0x14f, 0x2a4, 0x162, 0x3b4, 0x75, 0x293, 0x257, 0x11e, 0x177, 0x324, 0x17c, 0x2d7, 0x1a3, 0x2dc, 0x1ce, 0xf6, 0x3de, 0x2a0, 0x41, 0x1a9, 0x99, 0x2b2, 0x101, 0x18b, 0x3da, 0x25, 0x323, 0x298, 0x341, 0x1d1, 0x393, 0x8f, 0x177, 0x241, 0x1f9, 0x295, 0x164, 0x2a2, 0x307, 0x18, 0x305, 0x35e, 0x2b4, 0xc2, 0x358, 0x377, 0x211, 0x3f5, 0x143, 0x2c7, 0x2e, 0xc5, 0x338, 0x378, 0x372, 0x137, 0x24b, 0x3bc, 0x1e9, 0x93, 0xf7, 0x27d, 0x7c, 0x18f, 0x15f, 0x347, 0x12, 0x140, 0x22, 0x343, 0x297, 0x222, 0x313, 0x9b, 0x1f4, 0xb0, 0x217, 0x236, 0x390, 0x26a, 0x21a, 0x13, 0xe3, 0x2fe, 0x28d, 0x261, 0x1fc, 0x1b3, 0xda, 0x5d, 0x29, 0xa5, 0x337, 0x21b, 0x1b0, 0x23f, 0x330, 0x27b, 0x1bf, 0x35c, 0x1f2, 0x173, 0xc4, 0x29b, 0x1a4, 0x2bc, 0x1c1, 0x195, 0x11c, 0x1a8, 0x13a, 0x6e, 0xcf, 0x17d, 0x4, 0x285, 0x362, 0x331, 0x3d8, 0x363, 0x292, 0x104, 0x2ad, 0x264, 0x2da, 0xd, 0x346, 0x362, 0x26b, 0x37b, 0x32e, 0x17a, 0xc8, 0x23a, 0x2c, 0x30f, 0x236, 0x329, 0x1ba, 0xf4, 0x130, 0x5f, 0x2d7, 0x59, 0x151, 0x307, 0x30, 0xf, 0x2c6, 0x31a, 0x76, 0x39d, 0x9e, 0x1ad, 0x31, 0x349, 0x1a4, 0x171, 0x30d, 0xb3, 0x1e4, 0x165, 0x20b, 0x365, 0x2ab, 0x347, 0x24, 0x109, 0x110, 0x55, 0x254, 0x1b2, 0x2f2, 0x216, 0x323, 0x139, 0x11f, 0x293, 0x14e, 0x1c4, 0x16f, 0x288, 0x28e, 0x108, 0x256, 0x337, 0x3f, 0x2c9, 0x1dc, 0x36c, 0x3eb, 0x303, 0x133, 0x19c, 0x378, 0x2ed, 0xd5, 0x27c, 0x3be, 0x157, 0x81, 0x36e, 0x16e, 0x1ce, 0x1ec, 0x363, 0x12d, 0x19, 0x145, 0x201, 0x3e6, 0x340, 0xe4, 0x135, 0x21a, 0x26, 0x38c, 0x3dd, 0x8a, 0xab, 0x3e7, 0x6, 0x386, 0x35e, 0x161, 0x308, 0x2f6, 0x315, 0x2b0, 0x87, 0xe8, 0x230, 0xaf, 0x2e4, 0x195, 0x238, 0x2a9, 0x1c2, 0x2e9, 0x1d6, 0x285, 0x193, 0x37c, 0x3d5, 0x111, 0x22f, 0xd1, 0x2f7, 0xa6, 0x341, 0x34d, 0x14e, 0x388, 0x1b5, 0x6d, 0xba, 0x148, 0x8d, 0xd6, 0x377, 0x56, 0x327, 0x74, 0x230, 0x15e, 0x382, 0xb3, 0x3c8, 0x19d, 0x7c, 0x235, 0x1dd, 0x54, 0x224, 0x352, 0xc1, 0x2fd, 0x1a0, 0xe4, 0x26a, 0x7a, 0x130, 0xbe, 0x34e, 0x2c8, 0x13d, 0x38, 0x1b, 0x389, 0x330, 0x1fe, 0x3c6, 0x29d, 0x19c, 0x2f9, 0x3a6, 0x2a1, 0x381, 0x335, 0x17d, 0x10, 0xa, 0x106, 0x3a5, 0x127, 0x134, 0x2b8, 0x10b, 0x323, 0x272, 0x75, 0xb5, 0xcd, 0xfe, 0x366, 0x2d9, 0x3b2, 0xad, 0xc2, 0x17b, 0x315, 0x169, 0x21c, 0x349, 0x348, 0x1cd, 0x5e, 0x322, 0xf7, 0x1e6, 0x3c9, 0x318, 0x1ef, 0x149, 0x208, 0x145, 0xb, 0x383, 0x236, 0x25b, 0x2e1, 0x3a9, 0x324, 0x3f2, 0x85, 0xd3, 0x3f4, 0x380, 0x1b0, 0xee, 0x36c, 0x3df, 0x17, 0x18a, 0x103, 0x245, 0x3d6, 0x127, 0x268, 0x2f2, 0x4a, 0x25c, 0x2cb, 0x17f, 0x226, 0xab, 0x387, 0x60, 0x78, 0x66, 0x27b, 0x1e3, 0x29d, 0x338, 0x3f6, 0x10f, 0x24a, 0xdc, 0xeb, 0x3d7, 0x24, 0x2d, 0x124, 0x16d, 0x34, 0x39, 0x135, 0x7a, 0x260, 0x2f8, 0x246, 0xd3, 0x3e1, 0x21b, 0x19b, 0x2fb, 0x143, 0x215, 0x392, 0x172, 0x32a, 0x1e4, 0x19d, 0xf8, 0xc6, 0x2f3, 0x149, 0x19, 0x11d, 0x58, 0x4e, 0x259, 0x3cd, 0x23c, 0x2b3, 0x119, 0x5d, 0x148, 0x11a, 0x358, 0x38e, 0x169, 0x31, 0x13f, 0x276, 0xef, 0x3d2, 0x122, 0x36e, 0x1b1, 0xdf, 0x3ee, 0x111, 0x57, 0x344, 0x395, 0x272, 0xea, 0x2d4, 0x261, 0x3fb, 0x3, 0x305, 0x2c6, 0x73, 0x369, 0x2b1, 0x31f, 0xde, 0x2ed, 0x354, 0x381, 0x263, 0x1fd, 0x80, 0xa0, 0x88, 0xaa, 0x284, 0x225, 0x3ae, 0x141, 0x13, 0x311, 0x2d7, 0x164, 0x13d, 0x70, 0x206, 0x106, 0x28f, 0x254, 0x18b, 0x1d7, 0x141, 0x26, 0x5f, 0x295, 0x26d, 0x3e1, 0x3f, 0x265, 0x3f5, 0x1d, 0x230, 0x171, 0x5e, 0x93, 0x36b, 0x16e, 0x26b, 0x3ee, 0x222, 0x15c, 0x216, 0x12e, 0x2cb, 0x2fe, 0x8a, 0x151, 0xe, 0x1b, 0x23f, 0x36c, 0x367, 0x170, 0x258, 0x195, 0x1e4, 0x33a, 0x3e0, 0x239, 0x363, 0x17a, 0x249, 0x3bb, 0xa6, 0x11f, 0xb5, 0x334, 0x3fb, 0x6, 0xf, 0x21d, 0x339, 0x1e3, 0x133, 0xfb, 0x38f, 0xd4, 0x1c2, 0x365, 0x175, 0x54, 0x82, 0x145, 0x2c, 0x4e, 0xbb, 0x32f, 0x1c4, 0x36a, 0x368, 0x36d, 0x161, 0x76, 0xd7, 0x3c1, 0x6f, 0x2ed, 0x2a1, 0x21f, 0x33c, 0x3ef, 0x24, 0x5a, 0x99, 0x37a, 0x340, 0x329, 0x1cb, 0x177, 0x51, 0x28e, 0x52, 0x8d, 0x358, 0x315, 0x1ad, 0x188, 0x3d4, 0x24b, 0x3be, 0x2aa, 0x8, 0x14, 0x22, 0x55, 0x284, 0x43, 0x2a3, 0x21a, 0x5, 0x11, 0x55, 0x101, 0x10c, 0x135, 0x1e8, 0x241, 0x357, 0x210, 0x242, 0x358, 0x223, 0x2bd, 0x5b, 0x137, 0x1e2, 0x263, 0x3fd, 0x12, 0x5a, 0x132, 0x1f3, 0x236, 0x2fc, 0x11e, 0x16f, 0xda, 0x3b2, 0x161, 0xec, 0x35c, 0x237, 0x2f9, 0x10f, 0x13a, 0x1db, 0x2be, 0x54, 0x104, 0x11d, 0x160, 0xe9, 0x34d, 0x262, 0x3f8, 0x3, 0xf, 0x33, 0xff, 0x303, 0x314, 0x35f, 0x238, 0x2ca, 0x1f0, 0x239, 0x2cf, 0x1e1, 0x26c, 0x3ce, 0xed, 0x359, 0x226, 0x2ac, 0xe, 0x36, 0xee, 0x356, 0x215, 0x253, 0x30d, 0x322, 0x3b1, 0x16e, 0xdf, 0x3a3, 0x134, 0x1ed, 0x250, 0x302, 0x311, 0x34e, 0x26d, 0x3cb, 0xfc, 0x30c, 0x327, 0x3a0, 0x13b, 0x1de, 0x2af, 0x1, 0x5, 0x11, 0x55, 0x101, 0x10c, 0x135, 0x1e8, 0x241, 0x357, 0x210, 0x242, 0x358, 0x223, 0x2bd, 0x5b, 0x137, 0x1e2, 0x263, 0x3fd, 0x12, 0x5a, 0xa, 0x44, 0x2a8, 0x34, 0x1c8, 0x1cb, 0x1d5, 0x119, 0x2e8, 0x2b4, 0xec, 0x2b1, 0xce, 0x3e5, 0xd4, 0x301, 0x235, 0x1ef, 0xbd, 0x9b, 0x1e7, 0xed, 0x2bb, 0x8a, 0x14d, 0xe0, 0x2c9, 0x3fe, 0x3a, 0x1a4, 0x273, 0x353, 0x1, 0xa, 0x44, 0x2a8, 0x34, 0x1c8, 0x1cb, 0x1d5, 0x119, 0x2e8, 0x2b4, 0xec, 0x2b1, 0xce, 0x3e5, 0xd4, 0x301, 0x235, 0x1ef, 0xbd, 0x9b, 0x1e7, 0xed, 0x2bb, 0x8a, 0x14d, 0xe0, 0x2c9, 0x3fe, 0x3a, 0x1a4, 0x273, 0x353, 0x1, 0xa, 0x44, 0x2a8, 0x34, 0x1c8, 0x1cb, 0x1d5, 0x119, 0x2e8, 0x2b4, 0xec, 0x2b1, 0xce, 0x3e5, 0xd4, 0x301, 0x235, 0x1ef, 0xbd, 0x9b, 0x1e7, 0xed, 0x2bb, 0x8a, 0x14d, 0xe0, 0x2c9, 0x3fe, 0x3a, 0x1a4, 0x273, 0x353, 0x1, 0xa, 0x44, 0x2a8, 0x34, 0x1c8, 0x1cb, 0x1d5, 0x119, 0x2e8, 0x2b4, 0xec, 0x2b1, 0xce, 0x3e5, 0xd4, 0x14, 0x110, 0x16d, 0x340, 0x17e, 0x23c, 0x36a, 0x376, 0x2c6, 0x339, 0x303, 0x4b, 0x195, 0x33b, 0x32b, 0x26b, 0x34f, 0x1b2, 0x1d7, 0x21a, 0x192, 0x357, 0x52, 0x61, 0x39d, 0x3c1, 0x378, 0x21e, 0x1c2, 0x31e, 0x1ef, 0x17a, 0x26c, 0x323, 0x2cb, 0x3dd, 0x2c8, 0x3e1, 0x1f8, 0x56, 0x31, 0x3d4, 0x27c, 0x263, 0x3ef, 0x120, 0x2ad, 0x2c, 0x270, 0x293, 0x334, 0x3e7, 0x180, 0x23f, 0x356, 0x46, 0x171, 0x2f0, 0x81, 0x206, 0x22, 0x2a8, 0x68, 0x329, 0x243, 0x16f, 0x368, 0x35e, 0xe6, 0x1e3, 0x18a, 0x2b7, 0x1e4, 0x1e6, 0x1ce, 0x3ee, 0x134, 0x3bd, 0x141, 0x130, 0x3ed, 0x108, 0x8d, 0x2f6, 0xf9, 0x6f, 0x345, 0x13a, 0x365, 0x3ba, 0x12d, 0x249, 0x1e7, 0x1da, 0x2fe, 0x59, 0xfd, 0x3f, 0x30c, 0x87, 0x27e, 0x24b, 0x1cf, 0x3fa, 0x24, 0x2d0, 0x201, 0x4e, 0x1d1, 0x262, 0x3fb, 0x30, 0x3c0, 0x36c, 0x28, 0x49, 0x37a, 0x65, 0x393, 0x23b, 0x205, 0x3c, 0x269, 0x2c7, 0x253, 0x5e, 0x122, 0x103, 0x22, 0x159, 0x1a0, 0x17e, 0x71, 0x1b3, 0x386, 0x33, 0x3f1, 0x170, 0x1c1, 0x24d, 0x36e, 0x245, 0x22e, 0xd, 0x1c8, 0x325, 0x16f, 0x2d9, 0x163, 0x339, 0x20f, 0x12c, 0xb3, 0x3dc, 0x1b1, 0x3d6, 0xa1, 0x10c, 0x1ba, 0x2ee, 0x232, 0x36d, 0x23d, 0x2f5, 0x18a, 0x167, 0x399, 0x32b, 0xdf, 0x127, 0x18b, 0x14f, 0x3d0, 0x51, 0xba, 0x2b4, 0x3b0, 0x34a, 0x3ec, 0x238, 0x27d, 0xe7, 0x3ee, 0x268, 0x2ef, 0x21a, 0x324, 0x147, 0x290, 0x219, 0x35c, 0x19c, 0x317, 0x2b6, 0x3e0, 0x3d8, 0x111, 0x2f2, 0x152, 0x98, 0x3ed, 0x210, 0x234, 0x39d, 0x38b, 0x1fb, 0xd4, 0x1f, 0x318, 0x32e, 0x57, 0x4a, 0x302, 0xbe, 0x214, 0x294, 0x2b9, 0x278, 0x6f, 0x283, 0xe1, 0x31e, 0x3de, 0x1e1, 0x344, 0x25c, 0x1c6, 0x295, 0x50, 0x124, 0x3e6, 0x259, 0x29c, 0x3fb, 0xc0, 0x77, 0x286, 0xd2, 0x1de, 0x2aa, 0x100, 0xb4, 0x201, 0x138, 0x12f, 0x196, 0x7, 0x1b0, 0x3f5, 0x3a0, 0x394, 0x1cf, 0x3f3, 0x240, 0x145, 0x189, 0x23e, 0x113, 0x14d, 0x309, 0x30c, 0x21c, 0x3a1, 0x3c4, 0xeb, 0x15, 0x19, 0x3d9, 0x272, 0x2fe, 0x164, 0x3cb, 0x3db, 0x2d2, 0xb6, 0x2a1, 0x370, 0x2ea, 0x12d, 0x136, 0x24f, 0x275, 0x34e, 0x291, 0x6b, 0x4f, 0x31d, 0x345, 0xe1, 0x235, 0x363, 0x313, 0x25, 0x302, 0x17c, 0x42, 0x8d, 0x3ca, 0x38b, 0x3f6, 0x350, 0xf8, 0x1ec, 0x111, 0x1ed, 0x141, 0xc9, 0x2a7, 0x290, 0x3b, 0x16b, 0xfb, 0x11c, 0x27d, 0x1ce, 0x3a3, 0x364, 0x2a3, 0x3d0, 0xa2, 0x2e8, 0x18d, 0x37e, 0x18a, 0x2ce, 0x27f, 0x16e, 0x1eb, 0xa1, 0x218, 0x2e1, 0x35d, 0x368, 0x163, 0x27b, 0x2e, 0x172, 0x322, 0x36e, 0x83, 0xaa, 0x68, 0xa0, 0x99, 0x30f, 0x1d1, 0x334, 0x307, 0xd8, 0x3f5, 0x349, 0x24b, 0x263, 0x347, 0x82, 0x1f4, 0x139, 0x2fe, 0x2c8, 0x337, 0x2e7, 0x173, 0x2ed, 0x13a, 0x31e, 0x363, 0x22f, 0x94, 0x26, 0x3ed, 0x52, 0x308, 0x2b1, 0xfb, 0x238, 0x1e6, 0x26b, 0x24e, 0x43, 0x1ba, 0x3aa, 0x368, 0x2c6, 0x1fe, 0x170, 0x30d, 0x91, 0x206, 0x110, 0x37a, 0x194, 0x14e, 0x3fb, 0x180, 0x1dc, 0x1d, 0x13b, 0x3be, 0x3fa, 0x120, 0x145, 0x312, 0xea, 0x8a, 0xfd, 0x1f8, 0x2b0, 0x5b, 0x2a1, 0x2e9, 0x3ba, 0x17a, 0x344, 0x162, 0x5f, 0x21, 0x8d, 0x39d, 0x237, 0x38f, 0x165, 0x33f, 0x3ee, 0x1b2, 0x2a3, 0x3a9, 0x288, 0x36d, 0xe6, 0x303, 0x258, 0x191, 0x36e, 0x106, 0x2a8, 0x340, 0x3e2, 0x23b, 0x6, 0x3c0, 0x356, 0x230, 0xef, 0x2aa, 0x200, 0x2d0, 0x2c, 0x3a4, 0x1a1, 0x151, 0x380, 0x30c, 0x31, 0x29f, 0x21f, 0x2ab, 0x140, 0x264, 0x4e, 0x12f, 0x251, 0x70, 0xc3, 0x21c, 0x29f, 0x37, 0x2be, 0x12d, 0xd1, 0xb1, 0x5f, 0x42, 0x234, 0xd7, 0x338, 0x11c, 0x1e6, 0xdf, 0x12a, 0x218, 0x396, 0x1b5, 0x386, 0x198, 0x187, 0x171, 0x353, 0x20, 0x5a, 0xb, 0x1d2, 0x1a1, 0x2a2, 0x21b, 0x56, 0x310, 0x354, 0x2e9, 0x37d, 0x1e1, 0x216, 0x20d, 0x3f2, 0x52, 0x219, 0x2d6, 0x3d1, 0x3c8, 0xb7, 0x3d6, 0x101, 0x390, 0x23c, 0x2c5, 0x3c, 0x36c, 0x8c, 0x273, 0x2aa, 0x9, 0x352, 0x160, 0x23e, 0x45, 0xfd, 0x3f0, 0x2d2, 0x2d8, 0x24a, 0x18f, 0x363, 0x57, 0x250, 0x130, 0x2a7, 0x252, 0x3b0, 0x266, 0x2ce, 0x1ee, 0x2cd, 0x22e, 0x68, 0x2fc, 0x319, 0x6, 0x389, 0x143, 0x1a4, 0x2eb, 0x1fd, 0x120, 0x28a, 0x53, 0x359, 0xb2, 0x39f, 0x2e7, 0x2e6, 0x3a6, 0x1c2, 0x18c, 0xa3, 0x2f2, 0x282, 0x241, 0x5d, 0x2c2, 0x2f5, 0x4b, 0x280, 0x182, 0x270, 0x2d4, 0x2a2, 0x3f, 0x158, 0xb6, 0x125, 0x18f, 0x2cf, 0x15c, 0x2a4, 0x324, 0x5d, 0x18d, 0x3c6, 0x258, 0x24d, 0x285, 0x110, 0x1f3, 0x176, 0x334, 0x7, 0x19b, 0x87, 0x34b, 0x37, 0x175, 0xbd, 0x281, 0x302, 0x3f2, 0xa4, 0x76, 0x29d, 0x167, 0x1ee, 0x193, 0xaa, 0x340, 0x393, 0x3f8, 0x180, 0x379, 0x1d0, 0x24b, 0x19e, 0x15, 0xc8, 0x395, 0xe3, 0x85, 0x242, 0x333, 0x19c, 0x11c, 0x3cc, 0x37c, 0x142, 0x1c8, 0x23c, 0x183, 0xf0, 0x356, 0xd2, 0x2eb, 0x3fa, 0x89, 0x7d, 0x139, 0x3ea, 0xd3, 0x6b, 0x278, 0x2f9, 0x2a9, 0x39b, 0x3d5, 0x18b, 0xdd, 0x35d, 0x376, 0x66, 0x2c7, 0x171, 0x2af, 0x80, 0x2d0, 0xb0, 0x23e, 0x8a, 0x3f4, 0x3bf, 0x173, 0x3a6, 0x384, 0x239, 0x111, 0x373, 0xf4, 0x144, 0x2d3, 0x339, 0xb8, 0x213, 0x81, 0x50, 0x132, 0x4e, 0x25e, 0x156, 0x380, 0x109, 0x201, 0x3a4, 0x113, 0xfd, 0x3db, 0x173, 0x345, 0x20b, 0x1ec, 0x134, 0x2a3, 0x177, 0x368, 0x21d, 0x367, 0x171, 0x157, 0x200, 0x2ad, 0x312, 0x359, 0x2c8, 0x18e, 0x9e, 0x378, 0x2a9, 0x33f, 0x34f, 0x43, 0x1cb, 0x36a, 0xf, 0x36c, 0x230, 0x371, 0x3fa, 0x112, 0x1f4, 0x1da, 0x2d7, 0x256, 0x2f6, 0x237, 0x47, 0x1e6, 0x37c, 0x284, 0x329, 0x1c4, 0x6, 0x23f, 0x1d, 0x1ca, 0x263, 0x20e, 0xc8, 0x323, 0x38c, 0x21, 0x61, 0x2b1, 0x3d1, 0x33b, 0x362, 0x55, 0x340, 0x32f, 0x3fb, 0x1b, 0x3f5, 0x27e, 0x3c4, 0x2ab, 0x12d, 0x344, 0x302, 0x3ed, 0x290, 0x3b0, 0x18a, 0xb3, 0x36e, 0x22, 0x37a, 0xbb, 0x334, 0xe, 0x265, 0x31, 0xd5, 0x2e9, 0x1ef, 0x22f, 0xa9, 0x192, 0x5d, 0x31a, 0x303, 0x2e4, 0x91, 0x14, 0x99, 0x4e, 0xb5, 0x151, 0x3f, 0x2b0, 0x2d8, 0x13a, 0xc6, 0x146, 0x3bd, 0xf4, 0x212, 0x16, 0x11f, 0x114, 0x39f, 0x315, 0xde, 0x350, 0x33f, 0x297, 0x10c, 0x243, 0x2c5, 0x1e0, 0x286, 0x276, 0x335, 0x20e, 0x190, 0x97, 0x5f, 0x210, 0x3b, 0x133, 0x32a, 0x1b7, 0x22, 0x2fd, 0x2ec, 0x196, 0xe0, 0x2b, 0x5b, 0x24a, 0x63, 0x146, 0x373, 0x3d0, 0x6d, 0x185, 0x3b7, 0x171, 0x2ae, 0x12, 0x145, 0x14c, 0x3ea, 0x34c, 0x2b9, 0x31f, 0x47, 0x3cc, 0x1eb, 0xd, 0x2fc, 0xfe, 0x180, 0x1ff, 0x13f, 0x3c4, 0x15f, 0xbd, 0x216, 0x4c, 0x147, 0x161, 0x3c6, 0x172, 0x91, 0x28, 0x264, 0x270, 0x342, 0x27a, 0x3db, 0x2e6, 0x10f, 0x7c, 0x2ff, 0x2c1, 0x1ba, 0x2de, 0x203, 0x36c, 0x69, 0x1df, 0x3ef, 0x104, 0x2f7, 0x275, 0x10a, 0x234, 0x2b1, 0x3ab, 0xf7, 0x326, 0x159, 0xca, 0x262, 0x207, 0x336, 0x31, 0x1aa, 0x3b6, 0x363, 0x2b8, 0x10d, 0x51, 0x2d3, 0xff, 0x392, 0x1e9, 0x20, 0x2d0, 0x2d, 0x58, 0xea, 0x164, 0x31c, 0xf9, 0x3c3, 0x27d, 0x37c, 0x202, 0x2fc, 0x1fc, 0x209, 0x3e3, 0x3d4, 0x6e, 0x37d, 0x22f, 0x2a4, 0x116, 0x36d, 0xff, 0x32d, 0x3ad, 0x100, 0x153, 0xa6, 0x3ea, 0x291, 0x2f6, 0xce, 0x79, 0x16e, 0x22e, 0x289, 0x14e, 0x387, 0x19b, 0x31, 0x354, 0x2c3, 0x32e, 0x3da, 0x1e8, 0x6d, 0x30a, 0x2c7, 0x39a, 0x2ba, 0x240, 0x1f4, 0x361, 0x123, 0x8d, 0x35c, 0x3ab, 0x1ee, 0x83, 0x2da, 0xbb, 0xcb, 0xe0, 0x56, 0x16c, 0x274, 0x239, 0x9a, 0x14f, 0x3aa, 0x1c3, 0xdb, 0x230, 0x1df, 0x3d7, 0x19, 0x395, 0x311, 0x108, 0x3b, 0x266, 0xb3, 0x1a3, 0x220, 0x30f, 0x25e, 0x2a2, 0x1f8, 0x2bd, 0x283, 0x7c, 0x1f7, 0x316, 0x1cb, 0x1b3, 0xf0, 0x286, 0xe5, 0xcf, 0x54, 0x136, 0x2c4, 0x3ed, 0x252, 0x37e, 0x258, 0x24c, 0x28, 0xc1, 0x1d2, 0x226, 0x3e1, 0x38e, 0xde, 0x2a9, 0x5a, 0x160, 0x359, 0x26d, 0x358, 0x237, 0x238, 0x16e, 0x55, 0x236, 0x262, 0xe, 0x30c, 0x5b, 0x13a, 0x239, 0x134, 0x135, 0x16f, 0xf, 0x356, 0x13b, 0x263, 0x54, 0x26c, 0x302, 0x357, 0x161, 0x303, 0x30d, 0x1, 0x5a, 0x160, 0x359, 0x26d, 0x358, 0x237, 0x238, 0x16e, 0x55, 0x236, 0x262, 0xe, 0x30c, 0x5b, 0x13a, 0x239, 0x134, 0x135, 0x16f, 0xf, 0x356, 0x13b, 0x263, 0x54, 0x26c, 0x302, 0x357, 0x161, 0x303, 0x30d, 0x1, 0x5a, 0x160, 0x359, 0x26d, 0x358, 0x237, 0x238, 0x16e, 0x55, 0x236, 0x262, 0xe, 0x30c, 0x5b, 0x13a, 0x239, 0x134, 0x135, 0x16f, 0xf, 0x356, 0x13b, 0x263, 0x54, 0x26c, 0x302, 0x357, 0x161, 0x303, 0x30d, 0x1, 0x5a, 0x160, 0x359, 0x26d, 0x358, 0x237, 0x238, 0x16e, 0x55, 0x236, 0x262, 0xe, 0x30c, 0x5b, 0x13a, 0x239, 0x134, 0x135, 0x16f, 0xf, 0x356, 0xb4, 0x189, 0x2fe, 0x291, 0x3ca, 0xfb, 0x27f, 0x83, 0x37a, 0x3a2, 0x2ac, 0x1f8, 0x2e6, 0x6a, 0x33f, 0x95, 0x390, 0x23b, 0x300, 0x3cf, 0x29f, 0x1db, 0x197, 0x3bd, 0x35b, 0x1bb, 0x269, 0x69, 0x2e3, 0x20e, 0x9b, 0x181, 0x357, 0x2c2, 0x17, 0x5e, 0x10, 0x352, 0xa6, 0x3b3, 0x14a, 0xd7, 0x3ab, 0x3b1, 0x22, 0x3c5, 0x25e, 0x29a, 0x3bf, 0x233, 0x2a9, 0x39c, 0x142, 0x17e, 0x3f8, 0x6c, 0x87, 0x1aa, 0x18f, 0x146, 0x3ae, 0x1d5, 0x386, 0x2d1, 0x299, 0x263, 0xa8, 0x1a2, 0x26, 0x115, 0x73, 0x170, 0x1e9, 0x100, 0x145, 0x272, 0x34e, 0x8d, 0x16b, 0x2ce, 0x36e, 0x220, 0x27, 0x1a1, 0x1fa, 0x38e, 0x378, 0x2ca, 0x1be, 0xd, 0x3cd, 0x3f7, 0x2c9, 0x62, 0x296, 0xc6, 0x4d, 0x29e, 0x16f, 0x1e, 0x143, 0x1ca, 0x271, 0x292, 0x216, 0x260, 0x174, 0x339, 0x32d, 0x2af, 0x24, 0x7d, 0x361, 0x85, 0x168, 0x22d, 0x3dd, 0x14a, 0x1ae, 0x2b7, 0x1b7, 0x220, 0x4e, 0x28d, 0x3cb, 0x9e, 0x3c3, 0x3cc, 0x28f, 0x11b, 0xcd, 0x70, 0x158, 0x1d3, 0x7c, 0x3a3, 0x39, 0x1c4, 0xc0, 0x3e3, 0x29f, 0x3b6, 0x255, 0x1d7, 0x1d5, 0x305, 0x356, 0xe5, 0x271, 0x12d, 0x4a, 0x324, 0x36d, 0x3f1, 0x2e2, 0x17d, 0x41, 0x3ce, 0x5f, 0x148, 0x37e, 0x2e4, 0x204, 0xb4, 0x312, 0x3ea, 0xa5, 0xd7, 0x35f, 0x2df, 0x110, 0x27, 0x342, 0x3e1, 0x4f, 0x3e5, 0x1e6, 0x343, 0x289, 0x262, 0x38, 0xac, 0x2ed, 0x3e, 0x3d5, 0x218, 0xe2, 0x60, 0x3f5, 0x34b, 0x1db, 0x32e, 0x2ef, 0x2ee, 0x386, 0x1ab, 0x276, 0x33c, 0x292, 0x25, 0x192, 0x3b2, 0x3fc, 0x171, 0x2ba, 0x224, 0x1e7, 0x22b, 0xa4, 0x1bf, 0x172, 0x102, 0x5a, 0x189, 0x1f5, 0x256, 0x26f, 0x3ab, 0x36b, 0x88, 0x217, 0x1a1, 0x3f4, 0x223, 0x3f6, 0xf3, 0x3a5, 0x340, 0x2d0, 0xa6, 0x2d7, 0x8d, 0x1a5, 0xb3, 0x206, 0xc1, 0x11f, 0x2c8, 0x358, 0x19c, 0x33b, 0x106, 0x3e6, 0xb5, 0xfd, 0x315, 0x3f6, 0x1e6, 0x28f, 0x236, 0x334, 0x380, 0x1ad, 0x21e, 0x33f, 0x254, 0x17e, 0x3fb, 0x2c9, 0x188, 0x13a, 0x1ec, 0x18b, 0x243, 0x6, 0x2fb, 0x3d4, 0x2e9, 0x32e, 0x1d7, 0x3aa, 0xf, 0x286, 0x24b, 0x2ab, 0x3c2, 0x141, 0x288, 0x21d, 0x46, 0x3be, 0x20e, 0x26c, 0x26, 0x5d, 0x339, 0xaf, 0x2aa, 0x112, 0x1e7, 0x5f, 0x290, 0x1e3, 0x30d, 0x8, 0x2ad, 0x139, 0x295, 0x61, 0x133, 0x191, 0x14, 0x201, 0xea, 0x26d, 0x2f6, 0xfb, 0x1ee, 0x22, 0x30f, 0x1a1, 0x3e1, 0x9e, 0x38f, 0x32b, 0x55, 0x194, 0x196, 0x3f, 0x173, 0xd4, 0x1ce, 0x284, 0x3e2, 0x3e7, 0x265, 0x5b, 0x1c2, 0x37b, 0x43, 0x23c, 0x30, 0x3f5, 0x29f, 0x365, 0x146, 0x2a3, 0x16f, 0x78, 0x1d, 0x27c, 0x175, 0x1a9, 0x298, 0x295, 0xc2, 0xc5, 0x93, 0x140, 0xb0, 0x2fe, 0xa5, 0x35c, 0x195, 0x285, 0x264, 0x11f, 0x199, 0x17b, 0xfb, 0x3dc, 0x88, 0x4e, 0x226, 0xc7, 0x3c1, 0x79, 0x193, 0x37a, 0x12f, 0x27a, 0x315, 0x3e5, 0x391, 0x55, 0x328, 0x251, 0x1f8, 0x31d, 0x2b6, 0x37c, 0xd0, 0x131, 0x70, 0x169, 0x10f, 0x33f, 0xa1, 0x1f1, 0x3e7, 0xc3, 0x16c, 0x20b, 0x3d5, 0x72, 0x23b, 0x36, 0x21c, 0x125, 0x7b, 0x2c1, 0x243, 0xc, 0x3fe, 0x29f, 0x2c3, 0x111, 0x135, 0x2dd, 0x31b, 0x349, 0x37, 0x3b5, 0x3bd, 0x2ee, 0x203, 0x286, 0x9f, 0x2be, 0x22f, 0x3d, 0x1b4, 0x269, 0x348, 0x19e, 0x12d, 0x128, 0x22c, 0x2c6, 0x215, 0x1df, 0x20e, 0xd1, 0x98, 0x2e8, 0x3fc, 0x1cd, 0x3fa, 0x32, 0xb1, 0x357, 0x23d, 0x1c9, 0x157, 0x240, 0x2f7, 0x5f, 0x129, 0x385, 0x5e, 0x80, 0x11d, 0x2cb, 0x42, 0x1d8, 0x258, 0x352, 0x272, 0x85, 0x3b, 0x96, 0x81, 0x168, 0x14c, 0x295, 0x184, 0x314, 0x91, 0x2d, 0x22d, 0x2d7, 0x234, 0x266, 0x93, 0x280, 0x2c0, 0x3dd, 0x242, 0x34a, 0x191, 0x50, 0x58, 0x2fe, 0x14a, 0x16b, 0xb3, 0xa, 0xb, 0x359, 0x12b, 0x1ae, 0x195, 0x103, 0x182, 0xea, 0x1a6, 0x333, 0x2b7, 0x1a3, 0x132, 0x11f, 0x332, 0x1e5, 0x3d1, 0x1b7, 0x124, 0x3a4, 0x164, 0x2b9, 0xfb, 0x3b1, 0x220, 0x270, 0x228, 0xd6, 0x19c, 0xf7, 0x44, 0x4e, 0x45, 0x31c, 0x237, 0x399, 0x20c, 0x30f, 0x28d, 0x267, 0x3c1, 0xf2, 0x245, 0x3e6, 0x2d4, 0x3cb, 0xf9, 0x11c, 0x2cd, 0x37a, 0x25e, 0x1fa, 0x9e, 0x227, 0x2dc, 0x16d, 0x34d, 0x13d, 0x315, 0x3c3, 0x25f, 0x2a8, 0x2ec, 0x2a2, 0x2e7, 0x1fb, 0x3cc, 0x55, 0x259, 0x156, 0x3db, 0x1bc, 0x27d, 0x28f, 0xca, 0x32c, 0x1f8, 0x233, 0x2ca, 0x3d6, 0x11b, 0x261, 0x3f, 0x2ad, 0x1da, 0x21, 0x3b0, 0x2e4, 0x8, 0x145, 0x2cb, 0x108, 0x1bf, 0x30d, 0x40, 0x23a, 0x275, 0x52, 0x1e3, 0x5e, 0x200, 0x1f4, 0x38c, 0x290, 0x303, 0x2f0, 0x24, 0x3bb, 0x5f, 0xad, 0x2e, 0x3ad, 0x120, 0x1e7, 0x2f8, 0x161, 0x170, 0x157, 0x112, 0x323, 0x3ed, 0x31a, 0x392, 0x2aa, 0x82, 0x12e, 0x357, 0xe6, 0xaf, 0x17d, 0x19, 0x162, 0x28e, 0x339, 0x171, 0x3fa, 0xc8, 0x302, 0x5d, 0x1fe, 0x39a, 0x3ef, 0x249, 0x26, 0x2e8, 0x3eb, 0xef, 0x347, 0x26c, 0x130, 0x36d, 0x367, 0x371, 0x20e, 0x344, 0x192, 0x35e, 0x30e, 0x3be, 0x54, 0x216, 0x8b, 0x2c6, 0x46, 0x1cf, 0x2a0, 0x94, 0x51, 0x21d, 0x230, 0x263, 0x12d, 0xa9, 0x288, 0xcc, 0x1a4, 0x33c, 0x17a, 0x141, 0x6d, 0x269, 0x13b, 0x1d6, 0x3c2, 0x21a, 0x368, 0x36c, 0x1ca, 0x2ab, 0x22f, 0xf4, 0x376, 0x356, 0x24b, 0x175, 0x15c, 0x3a9, 0x153, 0x361, 0x108, 0x37e, 0x2f, 0x200, 0x3e8, 0x22b, 0xad, 0x5c, 0x2af, 0x112, 0x24f, 0x3af, 0xe6, 0x15e, 0x1fd, 0xc8, 0x20d, 0x174, 0x3eb, 0x1de, 0x107, 0x344, 0x324, 0x163, 0x46, 0x39e, 0x292, 0xa9, 0x119, 0x330, 0x13b, 0x3ac, 0x313, 0xf4, 0x2e5, 0x143, 0x27c, 0x37d, 0x3da, 0x3aa, 0xf0, 0x3a0, 0xdc, 0x255, 0x29e, 0x366, 0x3b8, 0x34b, 0x31e, 0x268, 0x325, 0x30, 0x327, 0x296, 0x1ec, 0x86, 0x319, 0xd8, 0x310, 0x301, 0x34f, 0x25b, 0x3f7, 0x30c, 0x1d3, 0x39b, 0x284, 0x257, 0x38, 0x1ad, 0x1a8, 0x1be, 0x340, 0x261, 0xfc, 0x6f, 0x27d, 0x22e, 0xbb, 0x2a2, 0x38e, 0x38f, 0x2dc, 0x1bd, 0xb5, 0x3cb, 0x3e4, 0x1e4, 0x20c, 0x27, 0x8a, 0xd6, 0x279, 0x36b, 0x124, 0x28b, 0x26d, 0x333, 0x2ce, 0x206, 0xb, 0x17f, 0x294, 0x34a, 0x24d, 0x109, 0x22d, 0x34e, 0x308, 0x96, 0x204, 0x2ad, 0x2a6, 0x19f, 0x52, 0x385, 0x1e9, 0x120, 0x395, 0x3d3, 0xe6, 0x2bc, 0x3fd, 0x249, 0x98, 0x2d3, 0x30e, 0x2e3, 0x149, 0xa9, 0x232, 0xdb, 0x1ca, 0x2be, 0x2b8, 0x177, 0x3c, 0x1d0, 0xdc, 0xa3, 0x26a, 0x306, 0x3fe, 0x1aa, 0x239, 0x225, 0x388, 0xd8, 0x229, 0x1f, 0x24e, 0x1f1, 0x207, 0x2b0, 0x6a, 0xdf, 0x340, 0xcb, 0x3f0, 0x378, 0x391, 0x159, 0x293, 0x3f4, 0x1f2, 0x1e4, 0x11, 0x9c, 0x59, 0x17b, 0x3ab, 0x346, 0x304, 0x2bb, 0x294, 0x29d, 0x126, 0x5a, 0x298, 0x10a, 0x3b0, 0x382, 0x80, 0x1f4, 0x22b, 0x15a, 0x170, 0x155, 0x104, 0x162, 0x22a, 0x3fc, 0xef, 0x107, 0x281, 0x8b, 0x30a, 0x69, 0x33c, 0x1e1, 0x3d, 0x376, 0x143, 0xf1, 0x1ef, 0x2ef, 0x2de, 0x23f, 0x1ea, 0x2c3, 0x134, 0x325, 0x60, 0x87, 0x9d, 0x2ff, 0xe4, 0x3f9, 0xc3, 0x2ed, 0x39b, 0x101, 0x14e, 0x1c0, 0x2e6, 0x165, 0x145, 0x275, 0x290, 0x2e, 0x157, 0x82, 0x162, 0x5d, 0x3eb, 0x371, 0x54, 0x94, 0x288, 0x269, 0x1ca, 0x175, 0x2f2, 0x3aa, 0x3c0, 0x27e, 0x365, 0x134, 0x243, 0x180, 0x31, 0x1c2, 0x34f, 0x17e, 0x307, 0x2b0, 0xd4, 0x37c, 0x236, 0xab, 0x2e7, 0x38f, 0x362, 0x3e6, 0x113, 0x6b, 0xfb, 0x36e, 0xc1, 0x359, 0x294, 0x133, 0x91, 0x2d0, 0x1da, 0x108, 0x1e3, 0x2f0, 0x120, 0x323, 0x357, 0x339, 0x39a, 0x347, 0x344, 0x8b, 0x21d, 0x1a4, 0x1d6, 0x22f, 0x3a9, 0xf, 0xe8, 0xdc, 0x146, 0x1ba, 0x6, 0x397, 0x125, 0x37b, 0xe4, 0x3fb, 0x30c, 0x345, 0x1ce, 0x68, 0x334, 0x1f8, 0x378, 0x32b, 0x16d, 0xb5, 0x337, 0x237, 0x1ee, 0x92, 0x11f, 0x34c, 0x2b1, 0x191, 0x109, 0xa6, 0x85, 0x3b0, 0x30d, 0x200, 0x3bb, 0x2f8, 0x31a, 0xaf, 0x3fa, 0x249, 0x130, 0x35e, 0x46, 0x263, 0x17a, 0x21a, 0x376, 0x286, 0x28a, 0x1c6, 0xad, 0x2e0, 0x2ba, 0xc8, 0x4c, 0x1af, 0x46, 0xcf, 0x1e1, 0xf4, 0x305, 0x74, 0xdc, 0x28c, 0x2e1, 0x30, 0x10e, 0xe1, 0x34f, 0x2fc, 0x7, 0x1ad, 0x15b, 0x343, 0xbb, 0x13d, 0x278, 0x1e4, 0x44, 0x1d2, 0x26d, 0x1ae, 0x2cc, 0x109, 0x14c, 0x214, 0x1bf, 0xbc, 0x90, 0x323, 0x2a7, 0xff, 0xef, 0x15, 0x4a, 0x288, 0xdb, 0x321, 0x3ba, 0x373, 0x1b5, 0x1dc, 0x137, 0x318, 0x43, 0x7f, 0x336, 0x2ed, 0x277, 0x34, 0x334, 0x3f0, 0x1fb, 0x16e, 0x2fd, 0x28d, 0x6b, 0x1f6, 0x1a3, 0x201, 0x1f5, 0x234, 0x4b, 0x2, 0x11d, 0x38c, 0x15a, 0x1c9, 0x17d, 0x190, 0x98, 0x35e, 0x8c, 0x19e, 0x3c2, 0x1e8, 0x203, 0xe8, 0x1b8, 0x111, 0x1cb, 0x60, 0x21c, 0x1c2, 0x297, 0x1f1, 0xe, 0x35a, 0x2b6, 0x28f, 0x176, 0x27a, 0xf9, 0x3c8, 0x88, 0x3a4, 0xd3, 0x35c, 0x191, 0x212, 0x298, 0x21, 0x11d, 0x311, 0x161, 0x253, 0x3fd, 0x26c, 0x241, 0x33, 0x13b, 0x2be, 0x1ed, 0x16f, 0xee, 0x137, 0x239, 0x10c, 0x3f8, 0x30c, 0x10f, 0xdf, 0x236, 0x2ac, 0x223, 0x238, 0x11, 0xe9, 0x26d, 0x35c, 0x322, 0x5a, 0xed, 0x210, 0x303, 0x2af, 0x104, 0x302, 0x3b2, 0x215, 0x263, 0x1e1, 0x1e8, 0xf, 0x3a0, 0x1db, 0x134, 0x11e, 0x36, 0x5b, 0x1f0, 0x101, 0x262, 0xfc, 0x2f9, 0x16e, 0x1f3, 0x226, 0x358, 0x35f, 0x5, 0x160, 0x34e, 0xec, 0x30d, 0x12, 0x3ce, 0x357, 0xff, 0x1de, 0x54, 0x250, 0xda, 0x356, 0x1e2, 0x2cf, 0x135, 0x3, 0x327, 0x13a, 0x3a3, 0x2fc, 0xe, 0x2bd, 0x2ca, 0x55, 0x34d, 0x3cb, 0x237, 0x3b1, 0x132, 0x359, 0x242, 0x314, 0x1, 0x11d, 0x311, 0x161, 0x253, 0x3fd, 0x26c, 0x241, 0x33, 0x13b, 0x2be, 0x1ed, 0x16f, 0xee, 0x137, 0x239, 0x10c, 0x3f8, 0x30c, 0x10f, 0xdf, 0x236, 0x23a, 0x5f, 0x31a, 0x171, 0x347, 0x216, 0x288, 0x36c, 0x27c, 0x363, 0x135, 0x6, 0x87, 0x1c2, 0x24e, 0x32f, 0x380, 0x6f, 0x32b, 0x37a, 0x113, 0x358, 0x2b7, 0x14, 0x312, 0x85, 0x1bf, 0x2f0, 0x112, 0x162, 0x2e8, 0x30e, 0x263, 0x3c2, 0x3a9, 0x78, 0x27e, 0x31e, 0x18b, 0x23b, 0x265, 0x345, 0x26b, 0x236, 0x151, 0x9e, 0x1e4, 0x110, 0x11f, 0x256, 0x133, 0x81, 0x145, 0x38c, 0x161, 0xaf, 0x3ef, 0x344, 0x51, 0x269, 0x24b, 0x1ef, 0x2a3, 0x306, 0x397, 0x13a, 0x34f, 0x3e2, 0x70, 0x38a, 0x1e6, 0x16d, 0x1a1, 0x6b, 0x3d1, 0x206, 0x160, 0x295, 0x3b0, 0x5e, 0x120, 0x12e, 0x5d, 0x367, 0x1cf, 0x17a, 0xf4, 0xf, 0x349, 0x365, 0x1b2, 0x1c4, 0x2c9, 0x2ed, 0x1ce, 0x340, 0xab, 0x315, 0x238, 0x22, 0x3a4, 0x34c, 0x1a5, 0x91, 0x2ad, 0x275, 0xad, 0x392, 0x3fa, 0x26c, 0x8b, 0xcc, 0x1ca, 0x3ba, 0x7d, 0x17c, 0xe6, 0x33d, 0x2a, 0xa9, 0x2d9, 0x20a, 0xdc, 0x4d, 0x11e, 0xd8, 0x1b9, 0xe7, 0x340, 0x156, 0x4f, 0x1e4, 0x220, 0x75, 0x294, 0x314, 0x4, 0x1f4, 0x1f9, 0x398, 0xef, 0xa8, 0x2a4, 0x376, 0x3a, 0x370, 0x134, 0x71, 0x360, 0x2ed, 0x39c, 0x11b, 0x151, 0x13c, 0x399, 0x92, 0x1d4, 0x242, 0x4b, 0x10, 0x3d9, 0x3ed, 0x27b, 0x3bc, 0x2a0, 0x282, 0x1c3, 0xe8, 0x1db, 0xd9, 0x1c4, 0x19b, 0x3a6, 0x26b, 0x65, 0x14d, 0xf9, 0x27f, 0x248, 0x359, 0x11a, 0x12c, 0x40, 0x37f, 0x3af, 0x1fe, 0x2eb, 0x292, 0x21a, 0x305, 0x3a0, 0x365, 0x364, 0x319, 0x265, 0x283, 0x1be, 0x194, 0x13d, 0x3e4, 0x1ee, 0x132, 0x17f, 0x61, 0xb9, 0x100, 0x1e7, 0x2a7, 0x3f1, 0x3be, 0x25a, 0x7a, 0xf, 0x29b, 0x18f, 0x18b, 0x7f, 0x186, 0x21e, 0x2f1, 0x259, 0xfd, 0x38b, 0x3b1, 0xc1, 0x1f5, 0x184, 0x2e4, 0xfa, 0x1f9, 0x339, 0x3bc, 0x149, 0x21a, 0x203, 0x29b, 0x31e, 0x225, 0x3f8, 0x56, 0x350, 0x117, 0x293, 0xc7, 0x1f6, 0x206, 0x189, 0x10a, 0x1e3, 0x2af, 0x32, 0x130, 0x30a, 0x276, 0x3ba, 0x355, 0x205, 0x87, 0x301, 0xa1, 0x262, 0x3e9, 0x317, 0x106, 0x1d2, 0x291, 0x133, 0x204, 0x7d, 0x2f8, 0x398, 0x1de, 0x2a0, 0x10d, 0x305, 0x349, 0x18f, 0x316, 0x1fc, 0x2b, 0x1a8, 0x28f, 0x34d, 0x267, 0xfb, 0x103, 0x2c0, 0x85, 0x2f5, 0x353, 0x19, 0x98, 0x185, 0x13b, 0x1dd, 0x3ae, 0x306, 0x247, 0x384, 0x254, 0x131, 0x3f0, 0x38f, 0x83, 0xe9, 0x34c, 0x29d, 0x102, 0x23a, 0x17c, 0x1cc, 0xef, 0x150, 0x282, 0x386, 0x3a0, 0x2c3, 0x18b, 0xfe, 0x211, 0xd4, 0x343, 0x3a2, 0x337, 0x279, 0x285, 0x160, 0x246, 0x37e, 0x3ad, 0x208, 0x4c, 0x2c6, 0x299, 0x2ea, 0x1d7, 0x183, 0x327, 0x1c2, 0x12a, 0x29c, 0x1f8, 0x1f4, 0x3ed, 0x1fe, 0x3be, 0x17a, 0x3a9, 0x3c0, 0x29f, 0x1ec, 0x329, 0xe, 0x38a, 0x32b, 0x3e6, 0x59, 0xd7, 0x93, 0x2ad, 0x38c, 0x31a, 0x39a, 0x54, 0x141, 0x386, 0x349, 0x31e, 0x43, 0x3fb, 0x2b0, 0x165, 0x2a8, 0x1a1, 0x358, 0x195, 0x109, 0x1da, 0x290, 0x392, 0x3ef, 0x216, 0x6d, 0x286, 0xdc, 0x134, 0x1c4, 0x265, 0x21e, 0x3d6, 0x1d1, 0x337, 0xfb, 0x206, 0x312, 0x21, 0x303, 0x2aa, 0x249, 0x8b, 0x269, 0x27c, 0x32e, 0x1cb, 0x1b, 0x2d8, 0x1ce, 0x236, 0x29a, 0x3c1, 0x36b, 0x201, 0x2d7, 0x3b0, 0x2f0, 0x82, 0x26, 0x2c6, 0x13b, 0x3ba, 0x2a3, 0x6, 0x31, 0x7c, 0xd, 0x196, 0x315, 0x1e4, 0x92, 0x359, 0x61, 0x2e4, 0x24, 0x12e, 0x2e8, 0x46, 0x1d6, 0x2f2, 0x36a, 0x3f5, 0x13a, 0x24e, 0x14e, 0x1f8, 0x38f, 0x106, 0x3a4, 0x256, 0x18a, 0x8, 0x3bb, 0x357, 0x3eb, 0x1cf, 0x3c2, 0x177, 0x3e8, 0x3af, 0x3eb, 0x39e, 0x313, 0x3aa, 0x3b8, 0x296, 0x34f, 0x257, 0xfc, 0x38f, 0x20c, 0x28b, 0x294, 0x96, 0x100, 0x323, 0xba, 0x23, 0x1d6, 0x1ed, 0x1b3, 0x397, 0x384, 0x142, 0x334, 0x1c7, 0xf2, 0x92, 0x2bb, 0x184, 0x30d, 0x240, 0x181, 0x35e, 0x348, 0x1dd, 0x2a3, 0xc, 0xc4, 0x3e0, 0xd0, 0x2ac, 0xf9, 0x3dc, 0x304, 0x2d7, 0x369, 0x3d2, 0x19, 0x260, 0x66, 0x24b, 0x2cf, 0x2e1, 0x1b, 0x1b9, 0x331, 0x194, 0x1fa, 0xce, 0x346, 0x2c0, 0x214, 0x303, 0x15d, 0x136, 0x51, 0x2d1, 0x30b, 0x222, 0x71, 0x336, 0x21e, 0x3a5, 0x34d, 0x18e, 0x3ab, 0x50, 0x139, 0xa4, 0x1c9, 0x3ef, 0x25, 0x1b4, 0x1d, 0x1db, 0x2c1, 0x1fc, 0xac, 0x2b6, 0x2a8, 0x342, 0x17b, 0xb3, 0xb4, 0x33e, 0x161, 0x2e2, 0x2a, 0x141, 0x305, 0x13f, 0xc6, 0x39, 0x387, 0x173, 0x3cc, 0x1f3, 0x59, 0x1ae, 0x24c, 0x145, 0x3d9, 0x2a7, 0x367, 0x19e, 0x2b8, 0x36a, 0x3cf, 0x384, 0x284, 0xcb, 0x223, 0x33b, 0x264, 0x3b3, 0x3b0, 0x3d2, 0x32, 0x192, 0x330, 0xf1, 0x146, 0x11e, 0x19b, 0x21e, 0x343, 0x12f, 0x6b, 0x2ce, 0x212, 0x2cb, 0x2b4, 0x2e2, 0x54, 0x10d, 0x1e, 0x3d4, 0xf6, 0x25b, 0x70, 0x1bc, 0x2cd, 0x270, 0x12b, 0x314, 0x40, 0x395, 0xba, 0x46, 0x351, 0x373, 0x306, 0x21c, 0xf8, 0x68, 0x2ac, 0x1f2, 0x36b, 0x16, 0x123, 0x1e3, 0x155, 0x9b, 0x51, 0x1ab, 0x37, 0x134, 0x319, 0x211, 0x2a9, 0x154, 0x342, 0x2f6, 0x2cc, 0x1a9, 0x38c, 0x73, 0x1de, 0x12d, 0x3d0, 0x389, 0xd5, 0x1f7, 0x3cd, 0x3f, 0x3c3, 0x20c, 0x11f, 0x242, 0xb9, 0x24, 0xb1, 0x2d3, 0x1a4, 0x1dd, 0x14f, 0x30, 0x229, 0x277, 0x236, 0x27a, 0x67, 0x346, 0x189, 0x42, 0x2e, 0x1fd, 0x281, 0x6d, 0x20a, 0x1db, 0x18b, 0x3f9, 0x169, 0x33a, 0x3bb, 0x28e, 0x30e, 0x1d6, 0x3bd, 0x306, 0x31, 0x3e0, 0x340, 0x29a, 0x237, 0x346, 0x312, 0x108, 0x170, 0x3ef, 0x94, 0x376, 0x349, 0xc6, 0xe4, 0xe, 0x6f, 0x362, 0x270, 0x256, 0x4b, 0x200, 0x12e, 0x36d, 0x1a4, 0x3ba, 0x135, 0x180, 0x2d8, 0x26b, 0xbb, 0x337, 0x3d1, 0xa0, 0x1da, 0xad, 0x171, 0x54, 0x21a, 0x78, 0x29f, 0x37b, 0x3e2, 0x3f, 0x38f, 0x22, 0xea, 0x61, 0x30d, 0x112, 0x26, 0x21d, 0x24b, 0x32e, 0x243, 0x2c9, 0x21e, 0x28f, 0xb5, 0x358, 0xb3, 0x2d0, 0x38c, 0xe6, 0x371, 0x17a, 0x177, 0x1dc, 0x125, 0x24e, 0x262, 0x2e7, 0x1e4, 0x99, 0x3dd, 0x3b0, 0x3ad, 0xc8, 0x8b, 0x36c, 0x21f, 0x134, 0x23b, 0x56, 0x165, 0x16d, 0x8a, 0xd7, 0x91, 0x23a, 0x3ed, 0x3eb, 0x263, 0x15c, 0x36a, 0x397, 0x20b, 0xd, 0xab, 0xf9, 0x36b, 0x2c, 0x85, 0x303, 0x17d, 0x344, 0x6d, 0x1d, 0x37f, 0x22a, 0x46, 0x15f, 0x355, 0x30, 0xb6, 0x331, 0xbb, 0x267, 0x35f, 0x109, 0x19f, 0x18d, 0xef, 0x25a, 0x2bf, 0x1dc, 0x24a, 0x12a, 0x334, 0x223, 0xf7, 0x201, 0x123, 0x385, 0x17d, 0x281, 0x1b4, 0xe8, 0x235, 0x72, 0xe, 0xde, 0x193, 0x3a4, 0x121, 0x172, 0x120, 0x20d, 0x30a, 0x24b, 0x255, 0x11e, 0x265, 0x1a8, 0x154, 0x113, 0x333, 0x24c, 0x23a, 0x3d3, 0x3b7, 0x33c, 0x1ed, 0x183, 0x31, 0x3c9, 0x11b, 0xfd, 0x338, 0xa, 0x139, 0x129, 0x2bc, 0x54, 0x3d, 0x1e0, 0xd5, 0x3d5, 0xa7, 0x3db, 0x79, 0x248, 0x3dd, 0x369, 0x2af, 0x249, 0xa2, 0x143, 0x2e9, 0x316, 0x3f7, 0x173, 0x25f, 0x27, 0x34c, 0x314, 0x100, 0x12e, 0x2d3, 0x299, 0x1ef, 0x374, 0x6c, 0x345, 0x3a5, 0x25e, 0x358, 0x166, 0x352, 0x5f, 0x27b, 0x2e3, 0x22f, 0x2de, 0x3cf, 0x20b, 0x1a, 0x2ac, 0x3c1, 0x2d5, 0x189, 0x108, 0x2f7, 0xba, 0x230, 0x1dd, 0x26a, 0x1b, 0x3a6, 0x3a5, 0xb5, 0x17b, 0x322, 0x145, 0x3f2, 0x3df, 0x33c, 0x3da, 0x205, 0x188, 0xe7, 0x328, 0x337, 0x35f, 0x212, 0x275, 0x73, 0x2eb, 0x3c2, 0x2b3, 0x3e3, 0x20b, 0x34, 0x2a2, 0x237, 0x103, 0x14c, 0x290, 0x2bc, 0xa8, 0xf4, 0x31b, 0x14b, 0x24e, 0x19a, 0x223, 0x1ee, 0x16, 0x10a, 0x2e, 0x3f3, 0x128, 0x386, 0x1ea, 0x3d8, 0x3e2, 0xfc, 0x8e, 0x92, 0x3ea, 0x369, 0x157, 0x136, 0x119, 0x1d, 0x18f, 0x39, 0xe, 0x1bc, 0x245, 0x11f, 0x234, 0x213, 0x82, 0xc9, 0xdb, 0x21f, 0xd9, 0x3f8, 0x1ad, 0x391, 0x217, 0x34c, 0x221, 0x9, 0x162, 0x163, 0x394, 0x32e, 0x11e, 0xc3, 0x2a9, 0x2b2, 0x114, 0x2b1, 0x204, 0x37f, 0x5d, 0x118, 0x2ea, 0x135, 0x209, 0x1d3, 0x3d6, 0x25e, 0x2b9, 0x191, 0x2a6, 0x1f9, 0x3eb, 0x19e, 0x1ed, 0x306, 0xc4, 0x277, 0x194, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x3ce, 0x3b2, 0x13b, 0x2cf, 0x11e, 0x30c, 0x2ca, 0x1f3, 0x26d, 0x314, 0x12, 0x302, 0x33, 0x1e2, 0x134, 0x3f8, 0x2bd, 0x16e, 0xe9, 0x242, 0x30d, 0x104, 0x241, 0x356, 0x1db, 0x10c, 0xe, 0x2f9, 0x11, 0x359, 0xec, 0x2af, 0x26c, 0xda, 0x3a0, 0x239, 0x2fc, 0xfc, 0x238, 0x132, 0x34e, 0x303, 0x3fd, 0x250, 0xf, 0x137, 0x3a3, 0x262, 0x223, 0x3b1, 0x160, 0x210, 0x253, 0x54, 0x1e8, 0xee, 0x13a, 0x101, 0x2ac, 0x237, 0x5, 0xed, 0x161, 0x1de, 0x1e1, 0x16f, 0x327, 0x1f0, 0x236, 0x3cb, 0x35f, 0x5a, 0x311, 0xff, 0x263, 0x1ed, 0x3, 0x5b, 0xdf, 0x34d, 0x358, 0x322, 0x11d, 0x357, 0x215, 0x2be, 0x135, 0x36, 0x10f, 0x55, 0x226, 0x35c, 0x1, 0x3ce, 0x3b2, 0x13b, 0x2cf, 0x11e, 0x30c, 0x2ca, 0x1f3, 0x26d, 0x314, 0x12, 0x302, 0x33, 0x1e2, 0x134, 0x3f8, 0x2bd, 0x16e, 0xe9, 0x242, 0x30d, 0x395, 0x2d3, 0x1ca, 0xa3, 0x388, 0x2b0, 0x391, 0x9c, 0x294, 0x382, 0x104, 0x8b, 0x143, 0x2c3, 0xe4, 0x1c0, 0x317, 0x92, 0x36f, 0x3c6, 0x3fa, 0x250, 0x1e, 0xd5, 0x127, 0x261, 0xf9, 0x1a3, 0x14c, 0xad, 0x273, 0x2f4, 0x16f, 0x247, 0x3c9, 0x194, 0xc7, 0x32a, 0x2ad, 0x3f2, 0x2c7, 0x2ab, 0x29e, 0x36, 0x21e, 0x154, 0x114, 0x1a5, 0x20, 0x25c, 0x2c6, 0x13e, 0x4d, 0x1fc, 0x2bd, 0x2dc, 0x3a4, 0x234, 0xbc, 0xc8, 0x144, 0x3a, 0xc6, 0xbf, 0x7e, 0x238, 0x264, 0x123, 0x2e, 0x3a7, 0x282, 0x3c0, 0x296, 0xa1, 0xab, 0x31f, 0x5, 0x1da, 0x18d, 0x2eb, 0x22f, 0x1b3, 0x62, 0x1ce, 0x2ec, 0xd6, 0x191, 0x11d, 0x2a7, 0x46, 0x1dd, 0x374, 0x2c9, 0x350, 0x2da, 0x2c8, 0xc5, 0x9, 0x302, 0x66, 0x381, 0x1b2, 0x3f7, 0x31d, 0x326, 0x75, 0x219, 0x3ad, 0x136, 0xda, 0x349, 0xf6, 0x3cd, 0x3db, 0x323, 0x35e, 0x24b, 0x222, 0x1fc, 0x173, 0x362, 0x11f, 0x308, 0x3ad, 0x26c, 0x368, 0x27e, 0x37b, 0x14e, 0x315, 0x36b, 0x312, 0x290, 0x39a, 0x17a, 0x16f, 0x87, 0x33f, 0xbb, 0x6b, 0x191, 0x23a, 0x28e, 0x230, 0x1ef, 0x243, 0x30c, 0x33a, 0x30f, 0x256, 0x2e4, 0x82, 0x8b, 0x286, 0x31e, 0x329, 0x3f, 0x238, 0xc1, 0x85, 0x170, 0x20e, 0xf4, 0x1dc, 0x1c2, 0x68, 0xfd, 0x3d1, 0x5a, 0x5f, 0x3eb, 0x1d6, 0x2a3, 0x1b, 0x21e, 0x2a8, 0x59, 0x133, 0x200, 0x302, 0xcc, 0x21f, 0x18b, 0x307, 0x378, 0x22, 0x2fe, 0x1bf, 0x17d, 0x94, 0xf, 0xd5, 0x24e, 0x196, 0x3c1, 0x206, 0x1da, 0x31a, 0x3be, 0x15c, 0x306, 0x5b, 0x37c, 0xb5, 0x39d, 0x81, 0x1e7, 0x36d, 0x1ca, 0x146, 0x23b, 0x1ad, 0x16e, 0x3a4, 0x61, 0x2f0, 0x249, 0x6d, 0x349, 0x1ec, 0x32f, 0x2e7, 0x1ee, 0x160, 0x52, 0x171, 0x12d, 0x3aa, 0x24f, 0x163, 0x27c, 0x268, 0x3f7, 0x6f, 0x20c, 0x17f, 0x1bf, 0x2fa, 0x250, 0x78, 0x14b, 0x142, 0x151, 0x338, 0x280, 0x38c, 0x3fc, 0xeb, 0x2a3, 0x36, 0x6a, 0x16d, 0x199, 0x221, 0x120, 0x260, 0x1ab, 0x365, 0x1c8, 0x21b, 0x238, 0x182, 0x214, 0x392, 0xa8, 0x2bf, 0x3f5, 0xf8, 0xca, 0x18e, 0x166, 0x11d, 0x28e, 0x69, 0x3b5, 0x23c, 0xac, 0x391, 0x270, 0x11a, 0x178, 0x249, 0xda, 0x13f, 0x37b, 0x29c, 0x4f, 0x36e, 0x14c, 0x2b4, 0x371, 0x57, 0x183, 0x5b, 0x2f1, 0x2d4, 0xd7, 0x2, 0x97, 0x2c6, 0xf1, 0xd9, 0x3e7, 0xde, 0x11, 0x2fe, 0x37e, 0x1fd, 0xa9, 0xf0, 0x296, 0x284, 0x2a2, 0x279, 0x109, 0x311, 0x3f1, 0x1d6, 0x14f, 0x6c, 0xd4, 0x2da, 0x332, 0x4b, 0x240, 0xc9, 0x356, 0x2c3, 0x390, 0x3f, 0x79, 0x304, 0x21, 0x32d, 0x150, 0x177, 0x3e3, 0x1f0, 0x194, 0x31c, 0x2cc, 0x23a, 0x97, 0x185, 0x3c4, 0x2c1, 0x207, 0x3f6, 0x49, 0x1a7, 0x2e, 0x107, 0x1e8, 0x2fb, 0x3e, 0x65, 0x18e, 0x2cc, 0x7d, 0x5d, 0x299, 0x255, 0x23b, 0x2bd, 0x2cd, 0xea, 0x1d8, 0x15d, 0x94, 0x3c, 0x14b, 0x284, 0x14d, 0x1f6, 0x5a, 0x17c, 0x2c7, 0x175, 0x2e1, 0xc3, 0x33a, 0x27, 0x121, 0x5e, 0x320, 0xda, 0x27e, 0x1f7, 0xcd, 0xf9, 0x103, 0x3b4, 0xe6, 0x335, 0x373, 0x180, 0x10f, 0x159, 0x2c8, 0x221, 0x240, 0x192, 0x143, 0x235, 0x17e, 0x3e9, 0x27f, 0x160, 0x148, 0x33d, 0x3c2, 0x1b3, 0x310, 0x37c, 0x2d4, 0x1ae, 0x8, 0xb1, 0x33, 0x21f, 0x225, 0x1c, 0x38f, 0x248, 0x123, 0x170, 0x2a, 0x35b, 0x3f5, 0x1f0, 0x328, 0x6b, 0x24d, 0x3e8, 0x2e8, 0xe5, 0x28c, 0x1fc, 0x1c5, 0x245, 0x359, 0x2db, 0x2fa, 0xa9, 0x1e0, 0x24a, 0xd, 0x27a, 0x3ab, 0x2d0, 0x3f2, 0x215, 0x3ba, 0x325, 0x211, 0x1e6, 0x12e, 0x21d, 0x21f, 0x43, 0x70, 0x47, 0xc1, 0x21, 0xaf, 0x12d, 0x16f, 0x31, 0x26b, 0xb5, 0xd7, 0x8, 0x162, 0xcc, 0xdc, 0x218, 0x380, 0x238, 0x201, 0x108, 0x171, 0x17a, 0x36a, 0x188, 0x37c, 0x1a1, 0x2b1, 0x40, 0x302, 0x269, 0x2e9, 0xe4, 0x3f, 0x1e4, 0x2c, 0x52, 0x39a, 0x3c2, 0x366, 0x5b, 0x3d6, 0x113, 0x1a5, 0x200, 0x26, 0x36c, 0x365, 0x329, 0x1f8, 0x33b, 0x160, 0x290, 0xef, 0x22f, 0x306, 0x2d8, 0x28f, 0x8a, 0x133, 0x24, 0x130, 0x356, 0x31e, 0x17e, 0x3db, 0x1ee, 0x312, 0xad, 0x371, 0x15c, 0x6, 0x2ed, 0x55, 0x59, 0x18a, 0x120, 0x192, 0x286, 0xc6, 0x3e2, 0x2e7, 0x36b, 0xa6, 0x161, 0x3be, 0x2f2, 0x30, 0x345, 0x2a8, 0x2c8, 0x4b, 0x112, 0x8b, 0x1d, 0x239, 0x32f, 0x315, 0x36e, 0x139, 0x31a, 0x1cf, 0x3bd, 0x180, 0x21e, 0x16d, 0x26d, 0x258, 0x82, 0x51, 0xe8, 0x25c, 0x66, 0xdc, 0x39, 0x21b, 0x1e4, 0x58, 0x148, 0xef, 0x57, 0x3, 0x2ed, 0xaa, 0x164, 0x4b, 0x224, 0x22c, 0xe8, 0x3d8, 0x131, 0xf9, 0x5, 0x33e, 0x1fe, 0x3ac, 0xdd, 0x265, 0x27d, 0x138, 0x61, 0x353, 0x10b, 0xf, 0x14b, 0x202, 0xfd, 0x167, 0x2a6, 0x28e, 0x348, 0xa3, 0x1fc, 0x31d, 0x11, 0x3dd, 0x20f, 0x107, 0x3a9, 0x3e3, 0x39b, 0x1d1, 0x1e5, 0x204, 0x12e, 0x33, 0x6e, 0x218, 0x309, 0xf2, 0x2c, 0xa4, 0x273, 0x22f, 0x205, 0x372, 0x55, 0xb2, 0x221, 0x112, 0x116, 0x74, 0x1ec, 0x29c, 0x278, 0x206, 0x19f, 0xff, 0x1d6, 0x26a, 0x336, 0x33a, 0x9c, 0x234, 0x3ad, 0x281, 0x203, 0x2a1, 0x101, 0x27a, 0x2b7, 0x153, 0x147, 0x1a4, 0x255, 0xfe, 0x38a, 0x20c, 0x3ea, 0x303, 0x287, 0x3d0, 0x3f5, 0x3c9, 0x2ec, 0x2f6, 0x102, 0x97, 0x21d, 0x37, 0x10c, 0x380, 0x79, 0x16, 0x52, 0xb1, 0x198, 0x2e9, 0x390, 0x3f0, 0x1ee, 0x53, 0x2c2, 0x1cf, 0x2ef, 0x36, 0x2a9, 0x383, 0x121, 0x2f0, 0x1a2, 0x305, 0x2a1, 0x202, 0x1fa, 0x195, 0x11d, 0xba, 0x1ca, 0x9a, 0x3c7, 0x3f6, 0x248, 0x10a, 0xaf, 0xbd, 0x2dd, 0x5b, 0x343, 0x114, 0x18a, 0x89, 0x116, 0xe8, 0x3b9, 0xcd, 0x3c1, 0x50, 0x311, 0x367, 0x1dd, 0x8f, 0x2b0, 0x1b1, 0x1d4, 0x1bf, 0x3f3, 0x3d, 0x2fb, 0x1f0, 0x176, 0x2f6, 0x204, 0x25c, 0xcc, 0x370, 0x1c8, 0x1f8, 0xf7, 0x22d, 0x161, 0x2e3, 0x373, 0x1b, 0x350, 0x3c5, 0x294, 0x178, 0xd1, 0x386, 0x354, 0x101, 0xfd, 0x2ce, 0x28a, 0x5d, 0xe5, 0x4d, 0x3e7, 0x1fb, 0x124, 0x85, 0x253, 0x25a, 0x36a, 0x229, 0x3a5, 0x8a, 0xc5, 0x240, 0x8b, 0x74, 0x3d8, 0x262, 0x3e4, 0x28, 0x38c, 0x3b7, 0x2ea, 0x243, 0x158, 0x2dc, 0xea, 0x2db, 0x3fd, 0x21a, 0x379, 0xf8, 0xbb, 0x162, 0x269, 0x365, 0x17e, 0x2e7, 0x36e, 0x1da, 0x339, 0x1d6, 0x1ba, 0x30c, 0x32b, 0x11f, 0x3b0, 0x3fa, 0x21a, 0x2fb, 0x3e0, 0x1d1, 0x39d, 0x8, 0x302, 0x36c, 0x31e, 0x3e2, 0x315, 0x346, 0x2cb, 0x1fe, 0x2ab, 0x1cb, 0x56, 0x16e, 0xea, 0x1bf, 0x3ef, 0xf4, 0x3f5, 0x33f, 0x293, 0xd7, 0x40, 0x26, 0x356, 0xc6, 0x32f, 0x9e, 0x206, 0x275, 0x3eb, 0x175, 0x243, 0x2b0, 0x362, 0x359, 0x1e3, 0x347, 0x3a9, 0x397, 0x1ce, 0xb5, 0x2b1, 0x200, 0x130, 0x286, 0x239, 0x14e, 0xf9, 0x14, 0x38c, 0x367, 0x3ba, 0x23c, 0x1ad, 0x326, 0x2fe, 0x303, 0x20e, 0x177, 0x87, 0x26b, 0x1a1, 0x1a5, 0x24, 0x192, 0x1d, 0x1ec, 0x262, 0x3c1, 0xa0, 0x5f, 0x30e, 0x1ef, 0x1c4, 0x173, 0x106, 0x3dd, 0x2e, 0x54, 0x3aa, 0x31, 0x37c, 0x113, 0x133, 0x120, 0x8b, 0xe8, 0x37b, 0x334, 0x237, 0x109, 0x2f8, 0x46, 0x363, 0x2c4, 0x1b6, 0x31e, 0x3cd, 0x4f, 0x206, 0xe3, 0x3b7, 0x3ba, 0x71, 0x2bd, 0x106, 0x3b3, 0xb8, 0x2a0, 0x2de, 0x229, 0x28f, 0xb2, 0x12c, 0x19, 0xda, 0x34b, 0x254, 0x13d, 0x2ce, 0x23a, 0x1d9, 0x13e, 0x18b, 0xe0, 0xf2, 0x160, 0x15a, 0x2e3, 0x1d7, 0x1b0, 0x19d, 0x270, 0x219, 0x2ba, 0x141, 0x3b8, 0x1f0, 0x1d1, 0x333, 0x20, 0x26, 0x2a5, 0x318, 0x14e, 0x1f2, 0x50, 0x5f, 0x215, 0x3b5, 0x23b, 0x31d, 0x88, 0x295, 0x32d, 0xbd, 0x366, 0x1b9, 0x154, 0x26d, 0x1c1, 0x320, 0x376, 0x1aa, 0x202, 0x3e1, 0x166, 0x3d9, 0x35e, 0x381, 0x10c, 0x3f, 0x27f, 0x53, 0x31a, 0xcf, 0x29e, 0x265, 0x3cc, 0x28b, 0x3b0, 0x3fd, 0x7a, 0x3f5, 0x277, 0x25e, 0x2b1, 0x9, 0xc9, 0x1d, 0x3d8, 0x19a, 0x237, 0x212, 0x3f2, 0x230, 0x255, 0x3f9, 0x378, 0x124, 0x214, 0x171, 0x38d, 0x3, 0x345, 0x2da, 0x12b, 0x5e, 0x181, 0x2d1, 0xc6, 0xa7, 0x1f2, 0xa0, 0x17c, 0x8c, 0x32e, 0x3f9, 0x2f9, 0x99, 0x84, 0x33d, 0x15c, 0xc0, 0x1a8, 0x30f, 0x234, 0x2ae, 0xa9, 0xee, 0xf8, 0x1d1, 0x26f, 0x80, 0x130, 0x20a, 0x3d8, 0x334, 0xce, 0xb4, 0x357, 0x299, 0x4d, 0x307, 0x227, 0xb, 0x290, 0x1df, 0x373, 0xd8, 0x19d, 0xe9, 0x76, 0x1fd, 0x3d, 0x3f5, 0xe7, 0x16a, 0x1a5, 0x90, 0x116, 0x349, 0x3a3, 0x156, 0x3d1, 0x2a6, 0xba, 0x24b, 0x2c1, 0xe0, 0x1e4, 0x189, 0x2c2, 0x263, 0x29e, 0xc3, 0x32b, 0x75, 0x37e, 0x347, 0x2bf, 0x10e, 0x37c, 0x45, 0x314, 0x82, 0x232, 0x3a1, 0x254, 0x27a, 0x32a, 0x1f4, 0x1af, 0x381, 0x218, 0xfc, 0x3dc, 0x139, 0x398, 0x3ac, 0x1cb, 0x158, 0x2cd, 0x2fe, 0x17, 0xa8, 0x16f, 0x229, 0x117, 0x2c8, 0x172, 0x190, 0x376, 0x354, 0x1a, 0x337, 0x24d, 0x3ce, 0x21d, 0x370, 0x25b, 0x2e7, 0x302, 0x356, 0x239, 0x262, 0x237, 0x5a, 0x357, 0x13b, 0x134, 0xe, 0x238, 0x160, 0x161, 0x263, 0x135, 0x30c, 0x16e, 0x359, 0x303, 0x54, 0x16f, 0x5b, 0x55, 0x26d, 0x30d, 0x26c, 0xf, 0x13a, 0x236, 0x358, 0x1, 0x302, 0x356, 0x239, 0x262, 0x237, 0x5a, 0x357, 0x13b, 0x134, 0xe, 0x238, 0x160, 0x161, 0x263, 0x135, 0x30c, 0x16e, 0x359, 0x303, 0x54, 0x16f, 0x5b, 0x55, 0x26d, 0x30d, 0x26c, 0xf, 0x13a, 0x236, 0x358, 0x1, 0x302, 0x356, 0x239, 0x262, 0x237, 0x5a, 0x357, 0x13b, 0x134, 0xe, 0x238, 0x160, 0x161, 0x263, 0x135, 0x30c, 0x16e, 0x359, 0x303, 0x54, 0x16f, 0x5b, 0x55, 0x26d, 0x30d, 0x26c, 0xf, 0x13a, 0x236, 0x358, 0x1, 0x302, 0x356, 0x239, 0x262, 0x237, 0x5a, 0x357, 0x13b, 0x134, 0xe, 0x238, 0x160, 0x161, 0x263, 0x135, 0x30c, 0x16e, 0x359, 0x303, 0x54, 0x16f, 0x20d, 0x143, 0x1ec, 0x261, 0x279, 0x2ad, 0xba, 0x13e, 0x43, 0x7e, 0x3b1, 0x1da, 0x3fc, 0x1dd, 0x1c4, 0x31d, 0x49, 0x21, 0x33d, 0x179, 0x1b, 0x2ca, 0x1d2, 0x3b0, 0x3d7, 0x2bf, 0x31, 0x3a5, 0x164, 0x2e4, 0x9b, 0x203, 0x13a, 0x65, 0x17b, 0x8, 0x4c, 0x20a, 0x37b, 0x32c, 0x3ec, 0x145, 0x1d9, 0x1e2, 0x218, 0x3f0, 0x1b7, 0x2cb, 0x3df, 0x2f3, 0x23b, 0xde, 0x248, 0x108, 0x1de, 0x3da, 0xd8, 0x27d, 0x28b, 0x1bf, 0x287, 0x1d5, 0x188, 0x117, 0x332, 0x30d, 0xd1, 0x3c, 0x1c2, 0x328, 0x3ca, 0x40, 0x260, 0x74, 0x3ee, 0x156, 0x35f, 0x23a, 0x2d3, 0x30b, 0xe4, 0x3bf, 0x1a3, 0x275, 0x2c7, 0x3b5, 0x1fc, 0x2f9, 0x264, 0x52, 0x2eb, 0x2ef, 0x2c9, 0x3cc, 0x75, 0x1e3, 0x15, 0x2b3, 0x5b, 0xaa, 0x1a6, 0x5e, 0x281, 0x1e0, 0x20b, 0x176, 0x26f, 0x200, 0x324, 0x3a0, 0x34f, 0x2a2, 0x2ce, 0x1f4, 0x13, 0x105, 0x37b, 0x251, 0x3ab, 0x23a, 0x1af, 0x37, 0x329, 0x38e, 0x5, 0x5f, 0x118, 0x28c, 0x307, 0x11c, 0x2c0, 0x31a, 0xeb, 0x396, 0x1ad, 0x11, 0x123, 0x171, 0xae, 0x300, 0x165, 0x1d2, 0x369, 0x347, 0x1d5, 0x310, 0x55, 0x1a6, 0xbc, 0x216, 0x31b, 0xf8, 0x293, 0x2d6, 0x240, 0x288, 0x34b, 0x101, 0x337, 0x24c, 0x25c, 0x36c, 0x318, 0xcd, 0x19c, 0x352, 0xba, 0x27c, 0x10c, 0x3f0, 0x36e, 0x33e, 0x2c7, 0x363, 0x3f9, 0x3e5, 0x201, 0x252, 0x39e, 0x135, 0x2b, 0x2cd, 0x3dd, 0x1c9, 0x2f4, 0x6, 0x6a, 0x217, 0x308, 0x1fd, 0x1e8, 0x87, 0x1eb, 0xb2, 0x2e4, 0x136, 0x1e, 0x1c2, 0x259, 0x333, 0x200, 0x241, 0x29b, 0x24e, 0x27a, 0x166, 0x1e7, 0x66, 0x2c3, 0x32f, 0x3e4, 0x212, 0x357, 0xe5, 0x364, 0x380, 0xf7, 0x272, 0x1fe, 0x1dd, 0x388, 0x6f, 0x248, 0x210, 0x371, 0x2ef, 0x19b, 0x32b, 0x26, 0x1d, 0x3ee, 0x151, 0x195, 0x3bb, 0x21d, 0x365, 0x32f, 0x3c1, 0x5a, 0x28e, 0x24b, 0x43, 0x1f8, 0x36e, 0x275, 0x30e, 0x32e, 0x3e7, 0x47, 0x160, 0x31a, 0x1d6, 0x243, 0x173, 0x110, 0x21, 0xef, 0x3bd, 0x2c9, 0x32b, 0x359, 0x2e, 0x12d, 0x306, 0x21e, 0x30f, 0x308, 0x3fa, 0x3a9, 0x31, 0x28f, 0x26d, 0x5e, 0x216, 0x23f, 0x3e0, 0xb5, 0x133, 0x82, 0x368, 0x2a1, 0x340, 0x358, 0x8, 0x130, 0xe8, 0x34f, 0x29a, 0xb3, 0x1e7, 0xcc, 0x31e, 0x14e, 0x237, 0x2d0, 0x5d, 0x27c, 0x218, 0x3db, 0x346, 0x38c, 0x46, 0x146, 0x307, 0x238, 0x312, 0xe6, 0x2ab, 0x23c, 0x38a, 0x92, 0x108, 0x371, 0x1d7, 0x265, 0x16e, 0x2fe, 0x170, 0x17a, 0x6, 0xd4, 0x4e, 0x76, 0x3ef, 0x177, 0x188, 0x55, 0x34c, 0x2f0, 0x94, 0x1dc, 0x33f, 0x1a1, 0x18a, 0x19, 0x376, 0x125, 0x236, 0x2f6, 0x40, 0x192, 0x349, 0x4c, 0x74, 0x34f, 0x13d, 0x2cc, 0x323, 0xdb, 0x318, 0x334, 0x1f6, 0x11d, 0x35e, 0x1b8, 0x1f1, 0xf9, 0x212, 0x147, 0x24b, 0x86, 0x3e9, 0x346, 0x311, 0x118, 0x222, 0x1c, 0x399, 0x139, 0x3fc, 0x2f3, 0x1fc, 0x3e5, 0x16, 0x161, 0x271, 0x325, 0x173, 0x220, 0x84, 0x371, 0x3ae, 0x186, 0x362, 0x3b3, 0x253, 0x22f, 0x300, 0x19d, 0x11f, 0x3c6, 0x150, 0x366, 0x283, 0x383, 0x308, 0x3fd, 0x2bf, 0x188, 0xaa, 0x12b, 0x3ad, 0x152, 0x3fe, 0x26b, 0x114, 0x172, 0x26c, 0xf0, 0x3e, 0x293, 0x34a, 0x41, 0x368, 0x14b, 0x11b, 0x2f6, 0x80, 0x241, 0x27e, 0xa1, 0x39f, 0x91, 0x2c4, 0x143, 0x37b, 0x156, 0x2ce, 0x3bb, 0x33, 0x18f, 0x14e, 0x67, 0x352, 0x2e8, 0x381, 0x390, 0x315, 0x28, 0x3f2, 0x13b, 0x364, 0x21b, 0x36b, 0x19f, 0x187, 0x32e, 0x3c7, 0x11c, 0x312, 0x1cc, 0x2be, 0x1c4, 0xde, 0x264, 0x290, 0x98, 0x1d0, 0x24e, 0x3f4, 0x126, 0x162, 0x143, 0x2ff, 0x151, 0x25d, 0x3ce, 0x269, 0x318, 0x261, 0x3d1, 0xfa, 0x185, 0x365, 0xa7, 0x67, 0x2ad, 0x3b2, 0x37, 0x17e, 0x278, 0x212, 0x28e, 0x13e, 0x39, 0x2e7, 0xa, 0x1f9, 0x13b, 0x2c1, 0x7e, 0x36e, 0x1c6, 0x8c, 0x222, 0x38, 0x27f, 0x1da, 0x3b7, 0x2cf, 0x3e7, 0x11c, 0x22d, 0x339, 0x1dd, 0x7f, 0x3f6, 0x16, 0x2c2, 0x1d6, 0x11e, 0x31d, 0x99, 0x148, 0x39e, 0x1ba, 0x2d2, 0x44, 0x21, 0x3bc, 0x3ae, 0x30c, 0x193, 0x1a7, 0x171, 0x179, 0x1b0, 0x32b, 0x17f, 0x2e0, 0x3c2, 0xc0, 0x2ca, 0x11f, 0x385, 0x149, 0x306, 0x6a, 0x9c, 0x3b0, 0x107, 0x2de, 0x2ed, 0x1f3, 0xc2, 0x3fa, 0x2bf, 0x310, 0x2a8, 0x14a, 0x2ae, 0x21a, 0x247, 0x3a5, 0x26d, 0x178, 0x128, 0x2fb, 0x331, 0x114, 0x2e4, 0x1a2, 0x389, 0x3e0, 0x2d4, 0x314, 0xc8, 0x203, 0x384, 0x1d1, 0x130, 0x349, 0x254, 0x337, 0x81, 0x26, 0xe8, 0x24e, 0x3e1, 0x91, 0x302, 0x1d, 0x34f, 0xfd, 0x93, 0x162, 0x286, 0x3ee, 0x29a, 0x191, 0x12e, 0x356, 0x37b, 0x151, 0xb3, 0x323, 0x36c, 0x1ec, 0xab, 0x195, 0x1e7, 0x269, 0x239, 0x196, 0x2b7, 0x3bb, 0xcc, 0xc6, 0x334, 0x3d1, 0x1f4, 0x21d, 0x31e, 0x262, 0xfb, 0x23a, 0x2c6, 0x365, 0x14e, 0x19c, 0x145, 0x35e, 0x2e9, 0x32f, 0x237, 0x2ad, 0x36d, 0xdc, 0x3e2, 0x3c1, 0x2d0, 0x2e8, 0x21f, 0x17e, 0xf9, 0x5a, 0x5d, 0x3c4, 0x329, 0x9e, 0x109, 0x28e, 0x27c, 0xe4, 0x315, 0xa0, 0x357, 0x24b, 0x218, 0x2e7, 0x14, 0x3ed, 0x1ca, 0x43, 0x3db, 0x206, 0x2f8, 0x13b, 0x18b, 0x1f8, 0x346, 0x5f, 0x1a4, 0x1b2, 0x3f, 0x36e, 0x38c, 0x230, 0x134, 0x380, 0x36b, 0x275, 0x46, 0x222, 0x70, 0x1ee, 0x2cb, 0x30e, 0x146, 0xe, 0x33b, 0x1da, 0x367, 0x32e, 0x260, 0x13f, 0x284, 0x31c, 0x4, 0x192, 0xf5, 0x202, 0x6b, 0x10, 0x241, 0x3d4, 0x1a, 0x1ac, 0x40, 0x116, 0x34b, 0x68, 0x2b9, 0x100, 0x51, 0x137, 0x1a0, 0x2f6, 0x9, 0x144, 0xd5, 0x289, 0x3ca, 0x24, 0x119, 0x354, 0x236, 0x333, 0x90, 0x6d, 0x14b, 0xca, 0xd7, 0x240, 0x1b4, 0x125, 0x328, 0x35c, 0x112, 0x2d9, 0x9d, 0xbb, 0x16b, 0x41, 0x376, 0x274, 0x2ec, 0x1a5, 0x104, 0x1c3, 0x1c2, 0x3a2, 0x29d, 0x19, 0x305, 0x301, 0x293, 0x266, 0x64, 0xf, 0x1f, 0x25e, 0x18a, 0x190, 0x3c, 0x7c, 0x16a, 0x221, 0x249, 0xf0, 0x1f0, 0x1a1, 0x96, 0x136, 0x3c0, 0x3c9, 0x28d, 0x258, 0xd1, 0x31b, 0x33f, 0x226, 0x172, 0x344, 0x77, 0xe7, 0x8a, 0x1c1, 0x10b, 0x1dc, 0x39c, 0x228, 0x30d, 0x25, 0x379, 0x26b, 0xb2, 0x2f, 0x94, 0x1ff, 0x1be, 0x2c8, 0xbc, 0x250, 0x3f5, 0x2f1, 0x332, 0x2f0, 0xc9, 0xf5, 0xd, 0x1ac, 0x80, 0x51, 0x26e, 0x289, 0x39d, 0x90, 0xda, 0x125, 0x259, 0x16b, 0x82, 0x1c3, 0x384, 0x293, 0xc5, 0x190, 0x78, 0x1f0, 0x342, 0x258, 0x1a2, 0x77, 0x1ce, 0x228, 0x213, 0x94, 0x3fe, 0x2f1, 0x26d, 0x3d2, 0x282, 0x87, 0x22e, 0xa5, 0x2aa, 0x3d0, 0x310, 0x16d, 0x234, 0x3fd, 0x3aa, 0x372, 0x3c5, 0x76, 0x107, 0x2dd, 0x21e, 0x138, 0x37e, 0x2a0, 0x3, 0x15b, 0x11f, 0x17, 0x2f4, 0x180, 0xf3, 0x2bb, 0x392, 0xae, 0x1b0, 0x16e, 0x36f, 0x2e2, 0x3bd, 0x186, 0x245, 0x85, 0x3bc, 0x14f, 0x2b0, 0x88, 0x210, 0x1cf, 0x2e1, 0x2e6, 0x99, 0x252, 0x271, 0x23c, 0x1bc, 0xb, 0x31a, 0x2be, 0x7f, 0x38f, 0x189, 0x27b, 0x1ef, 0x3f7, 0x79, 0x139, 0x3b7, 0x255, 0xe, 0xf7, 0x19f, 0x46, 0x9a, 0x309, 0x36e, 0x22b, 0x348, 0x18b, 0x3e9, 0x5, 0x3ed, 0x321, 0x39, 0x315, 0x192, 0x3d4, 0x68, 0x2f6, 0x24, 0x6d, 0x125, 0xbb, 0x1a5, 0x19, 0xf, 0x7c, 0x1a1, 0x258, 0x344, 0x1dc, 0x26b, 0x2c8, 0x2f0, 0x141, 0x87, 0x55, 0x294, 0x17d, 0x177, 0x2d8, 0x3e6, 0x76, 0x20e, 0x366, 0xd4, 0x3a4, 0x303, 0x17a, 0x180, 0x1e6, 0x2fe, 0xaf, 0x2f2, 0x265, 0x326, 0x85, 0x371, 0x135, 0x1ad, 0x92, 0x290, 0x33c, 0x23c, 0x378, 0x2c, 0xe6, 0x3ba, 0x3fb, 0x238, 0x139, 0x367, 0x146, 0x70, 0x36b, 0x38c, 0x1a4, 0x18b, 0x3db, 0x14, 0x357, 0x27c, 0x329, 0xf9, 0x2d0, 0x36d, 0x2e9, 0x14e, 0xfb, 0x1f4, 0xcc, 0x239, 0xab, 0xb3, 0x12e, 0x286, 0x34f, 0x3e1, 0x81, 0x130, 0x27e, 0xd, 0x358, 0x200, 0x288, 0x2a1, 0x194, 0x2b1, 0x82, 0x386, 0x20b, 0xb5, 0x4b, 0x26c, 0x23f, 0x1ce, 0x59, 0x5e, 0xa9, 0x397, 0x28f, 0x256, 0x2aa, 0x3a9, 0x5b, 0x37a, 0x308, 0x347, 0x36a, 0x324, 0x34b, 0x340, 0x333, 0x89, 0x376, 0x384, 0x25e, 0x4b, 0xd1, 0xee, 0x26b, 0x199, 0x3d2, 0x21a, 0x62, 0x2b2, 0x61, 0x3d7, 0x1b5, 0x21e, 0xe9, 0x385, 0x17a, 0x300, 0x391, 0x3dd, 0x2e2, 0x2ef, 0x56, 0x44, 0x29, 0x263, 0x8f, 0x1bc, 0x2c, 0x1cc, 0x2f3, 0x3e7, 0x3c8, 0x361, 0x46, 0x268, 0xfc, 0x206, 0x3d3, 0x13e, 0x329, 0x1f2, 0x352, 0x35e, 0x2c3, 0x19a, 0x2b7, 0x3ce, 0x1ab, 0x3ee, 0x1fa, 0x244, 0x130, 0xf5, 0x34, 0x2f6, 0x48, 0x1b4, 0x13a, 0x3a2, 0xc5, 0x249, 0x389, 0xe7, 0x59, 0xbc, 0x2a4, 0x87, 0xaa, 0x242, 0x3fa, 0x35d, 0x3a6, 0x4e, 0x37e, 0x292, 0x30, 0x27d, 0x17f, 0xaf, 0x1ed, 0x186, 0x106, 0x42, 0x2e3, 0x1cb, 0x31d, 0x304, 0x31a, 0x2ea, 0x3f9, 0x238, 0x272, 0x187, 0x222, 0x309, 0x1a3, 0x2f8, 0x394, 0x72, 0x9e, 0xb4, 0x3b2, 0x2e9, 0x29c, 0x3ec, 0x3bb, 0x241, 0x137, 0x236, 0x35c, 0x104, 0xf, 0x1f0, 0x226, 0x30d, 0x250, 0x327, 0x55, 0x242, 0x3fd, 0x16f, 0x10f, 0xe9, 0x303, 0x1e1, 0x36, 0x16e, 0x34e, 0x1de, 0x135, 0x2bd, 0x132, 0x161, 0x2be, 0x3f8, 0x238, 0xed, 0x215, 0x134, 0xfc, 0x5, 0x357, 0x1e2, 0x2fc, 0x237, 0x11d, 0x33, 0x239, 0x2ac, 0x322, 0x302, 0x3a0, 0x101, 0x358, 0x12, 0xda, 0x13a, 0x34d, 0x314, 0x26c, 0xee, 0xdf, 0x26d, 0x2af, 0x1e8, 0x5b, 0x1f3, 0xec, 0x54, 0x3, 0x2ca, 0x359, 0x253, 0x1ed, 0x30c, 0x11, 0x210, 0x263, 0x11e, 0x2f9, 0x160, 0xff, 0x2cf, 0xe, 0x3b1, 0x311, 0x13b, 0x10c, 0x223, 0x5a, 0x3b2, 0x1db, 0x262, 0x35f, 0x3ce, 0x356, 0x3a3, 0x3cb, 0x1, 0x241, 0x137, 0x236, 0x35c, 0x104, 0xf, 0x1f0, 0x226, 0x30d, 0x250, 0x327, 0x55, 0x242, 0x3fd, 0x16f, 0x10f, 0xe9, 0x303, 0x1e1, 0x36, 0x16e, 0x8b, 0xd5, 0x194, 0x1a5, 0xc8, 0x3c0, 0x1ce, 0x2c8, 0x3ad, 0xf4, 0x5b, 0x3e6, 0x3b0, 0x2a0, 0x30, 0x1e6, 0x3dd, 0x39a, 0x2a3, 0x1ad, 0x99, 0x161, 0x175, 0x3fb, 0x1e4, 0x2cb, 0x230, 0x18b, 0x2e7, 0x109, 0x2e8, 0x2e9, 0x262, 0x2b7, 0x323, 0x286, 0x24e, 0x18e, 0x40, 0x288, 0x125, 0x1d1, 0x18a, 0x26c, 0x1dc, 0x37c, 0x34c, 0x2aa, 0x177, 0x2ed, 0x4e, 0x1e3, 0x17a, 0x1b, 0x16e, 0x295, 0x371, 0x1ba, 0x38a, 0x201, 0xe6, 0x1ef, 0x307, 0x1ee, 0x38c, 0x13b, 0x218, 0x9e, 0x2d0, 0x35e, 0x31e, 0x196, 0xb3, 0x162, 0xe8, 0x284, 0x358, 0x24, 0x368, 0x1c2, 0xb5, 0x258, 0x216, 0x3f5, 0x28f, 0x294, 0x3fa, 0x16f, 0x21e, 0x3a4, 0x2e, 0x22f, 0x2c9, 0x326, 0x21, 0x1cf, 0x243, 0x378, 0x160, 0x1fe, 0x32e, 0x70, 0x36e, 0x2f8, 0x24b, 0x329, 0x3c1, 0x145, 0x21d, 0x239, 0x151, 0x93, 0x26, 0x27e, 0x116, 0x354, 0xbb, 0x266, 0x136, 0x1dc, 0x2f1, 0x12b, 0x17d, 0x35d, 0x10f, 0x3a4, 0x5c, 0xae, 0x265, 0x20c, 0x29, 0x33c, 0x388, 0x227, 0x139, 0x215, 0xd9, 0x3db, 0x140, 0x174, 0x2e9, 0xcd, 0x2ce, 0x12e, 0x3a, 0x142, 0x358, 0x48, 0x1bb, 0x20b, 0x342, 0x382, 0xa9, 0x10e, 0x2b2, 0x308, 0x15, 0x3, 0x33a, 0x1f5, 0x1cd, 0x2a3, 0x35a, 0x264, 0x31a, 0x37d, 0x387, 0x1ee, 0x311, 0xe5, 0xe4, 0x1f2, 0x2a6, 0x21d, 0x7b, 0x14d, 0x91, 0x260, 0x34b, 0x236, 0x16b, 0x64, 0x3c0, 0x39c, 0x332, 0x157, 0x35b, 0x372, 0x4e, 0x3c6, 0x1e1, 0xd8, 0x2cd, 0x214, 0x1cf, 0x8f, 0x1fb, 0x312, 0x3df, 0x111, 0x3f, 0x5, 0x147, 0x21f, 0x257, 0x3ec, 0x1e7, 0x2a5, 0x127, 0x18e, 0x80, 0x232, 0x13a, 0x12f, 0x12c, 0x216, 0x3e3, 0x22e, 0x8d, 0x3d7, 0x1b3, 0x2a9, 0x1d4, 0x253, 0x3bd, 0xac, 0x49, 0xad, 0x22c, 0x14b, 0x1d1, 0x221, 0x281, 0x3f5, 0x22e, 0x11a, 0x347, 0x183, 0x2ca, 0x2fe, 0x1cd, 0x14f, 0x173, 0x304, 0x1cc, 0x363, 0x38, 0x2d5, 0x3ed, 0x1e2, 0x3cd, 0xfb, 0x2f7, 0x2a5, 0x24e, 0x231, 0x9, 0x368, 0x301, 0x342, 0x30d, 0x2a4, 0x62, 0x37a, 0x1d8, 0x149, 0x180, 0xb7, 0x123, 0x3be, 0x325, 0x2f9, 0x312, 0x3b7, 0x4d, 0x1f8, 0x50, 0xba, 0x2e9, 0x19a, 0x32a, 0x162, 0x3a0, 0x1a, 0x39d, 0x41, 0x1e, 0x33f, 0x164, 0x353, 0x3a9, 0x372, 0x9c, 0x303, 0x313, 0x19b, 0x106, 0x29, 0x271, 0x23b, 0x11c, 0x3b4, 0x230, 0x225, 0x223, 0x2d0, 0x163, 0x18c, 0x151, 0x24c, 0x260, 0x29f, 0xca, 0x34a, 0x249, 0xee, 0x2f1, 0x256, 0x1fd, 0x2de, 0xd4, 0x75, 0x32d, 0x3bd, 0x158, 0x124, 0x161, 0x1dd, 0x3c7, 0x1ee, 0x22b, 0x394, 0x329, 0x31f, 0x7d, 0x269, 0x1f7, 0x3cb, 0x8, 0x144, 0x24a, 0x293, 0x51, 0x125, 0x293, 0x258, 0x94, 0x87, 0x16d, 0x76, 0x2a0, 0x180, 0x16e, 0x85, 0x1cf, 0x23c, 0x38f, 0x139, 0x46, 0x18b, 0x315, 0x2d0, 0x2c6, 0x239, 0x29a, 0x81, 0x8b, 0x2a1, 0x1d1, 0x4b, 0x216, 0x397, 0x2a8, 0x308, 0x54, 0x30, 0x32b, 0x295, 0x3be, 0x243, 0x3f6, 0xa6, 0x30e, 0x1b2, 0x2e7, 0x5a, 0x35e, 0xc6, 0x151, 0x91, 0x192, 0xd5, 0xbb, 0x18a, 0x344, 0x3f5, 0x55, 0x61, 0x20e, 0x6, 0x1e6, 0x2d7, 0x371, 0x1cb, 0x378, 0x312, 0x367, 0x134, 0x3db, 0x109, 0x36d, 0x31e, 0xab, 0x93, 0x130, 0x29f, 0x194, 0x133, 0x26c, 0x2fb, 0x28f, 0x8d, 0x347, 0x306, 0x33a, 0x3dd, 0xef, 0x1ba, 0x6f, 0x160, 0x3eb, 0x222, 0x1f8, 0xa0, 0x2e8, 0x365, 0x196, 0x191, 0x26, 0x3d4, 0x236, 0x1a5, 0x249, 0x1dc, 0x3d6, 0x294, 0x3ef, 0x366, 0x165, 0x2fe, 0x39a, 0x135, 0x38a, 0x2c, 0x1fe, 0x146, 0xa2, 0x9d, 0xb5, 0x1c1, 0x2a4, 0x188, 0x3c5, 0x2f5, 0x3c2, 0x19b, 0x11, 0x290, 0x15f, 0x3f7, 0x1ee, 0xbe, 0x13e, 0x3e2, 0x1f6, 0x395, 0x1d, 0x101, 0x3ca, 0x82, 0xf0, 0x331, 0x34c, 0x2fa, 0x1b5, 0x2a9, 0x2bb, 0x1cd, 0x135, 0x31d, 0xb0, 0x3eb, 0x4d, 0x3e9, 0x109, 0x2d3, 0x63, 0x151, 0x122, 0x241, 0x2a1, 0x3a2, 0x12c, 0x94, 0x10e, 0x1bd, 0x3b0, 0x25a, 0x6c, 0x326, 0x210, 0xeb, 0x1fc, 0x3c8, 0x1c6, 0x1ca, 0x25b, 0xce, 0x3bb, 0x2a5, 0x12a, 0x358, 0x240, 0x203, 0x33f, 0x199, 0x155, 0x3aa, 0x35, 0x75, 0xaf, 0x3ae, 0x2bd, 0x201, 0x27b, 0xa3, 0x3f, 0x28, 0x174, 0x365, 0x32c, 0x24d, 0x130, 0x137, 0x259, 0x18a, 0x281, 0x3cf, 0x2a8, 0x219, 0x150, 0x180, 0x2dc, 0x214, 0x263, 0x388, 0x11c, 0x2cb, 0x348, 0x72, 0x3c1, 0x7d, 0x1b6, 0x34f, 0x31c, 0x12, 0x376, 0xf8, 0x228, 0x3ad, 0x144, 0x274, 0x1a1, 0x2f, 0x3d, 0x2d8, 0x138, 0x5c, 0x2f2, 0x158, 0x132, 0xe6, 0x197, 0x309, 0x14, 0x174, 0x2c3, 0xab, 0x24c, 0x324, 0x2a1, 0x34d, 0xb9, 0xa9, 0xc4, 0x3c5, 0x1e3, 0x313, 0xc3, 0x110, 0x2b4, 0x37d, 0xe, 0x1a3, 0x2a7, 0xdc, 0x19a, 0x166, 0x26, 0x34b, 0x328, 0x18a, 0x10b, 0x327, 0x16d, 0x1d8, 0x25a, 0xd8, 0x83, 0xa4, 0x2ab, 0x3f7, 0x3dc, 0x2f8, 0x1e2, 0x257, 0x2b7, 0xb1, 0x29b, 0x340, 0x2d6, 0x9b, 0x2fb, 0x22e, 0xc2, 0x54, 0xc0, 0x2dc, 0x21, 0x19e, 0x7f, 0x1e4, 0x1c6, 0x394, 0x17e, 0x279, 0x3ce, 0x1d, 0x202, 0x333, 0x19, 0x31b, 0x2f1, 0x294, 0x3a7, 0x205, 0x1e6, 0x34e, 0x375, 0x23c, 0x227, 0x3b4, 0x1a4, 0x72, 0x38b, 0x1f4, 0x1ab, 0x95, 0x358, 0x89, 0x1e, 0x1ce, 0x1a6, 0x2fa, 0x36a, 0x2b6, 0x1f5, 0xef, 0x2e1, 0x2f9, 0xa6, 0x23, 0x316, 0x9e, 0x288, 0x1c2, 0x113, 0x2f0, 0x3a9, 0x345, 0x11f, 0xaf, 0x2a3, 0x38a, 0x160, 0x367, 0x1b2, 0x315, 0x2ad, 0xcc, 0x3ee, 0x18e, 0x24, 0x386, 0x33f, 0x26d, 0x17d, 0x36a, 0x165, 0x3dd, 0x371, 0x243, 0x38f, 0x1da, 0x1a4, 0xe4, 0x237, 0x3bb, 0x286, 0x284, 0x39d, 0x19, 0x23f, 0x3d6, 0x8d, 0x20e, 0x30, 0x16e, 0x21, 0x33c, 0x1fc, 0x33b, 0x5f, 0x27c, 0x32f, 0x2b7, 0x162, 0x27e, 0x236, 0x133, 0x344, 0x397, 0x16d, 0x3b0, 0x17a, 0x2c9, 0x22, 0xad, 0x3ba, 0xe, 0x346, 0x28e, 0x2e9, 0x196, 0x93, 0x192, 0x2a1, 0x293, 0x2e4, 0x141, 0x5b, 0x4e, 0x2e, 0x2f2, 0x2b0, 0xc1, 0x339, 0x146, 0x1f8, 0x109, 0x35e, 0x239, 0xfd, 0x8, 0x6d, 0x20b, 0x8a, 0x3ad, 0x177, 0x21e, 0xea, 0x171, 0x135, 0x6f, 0x312, 0x30e, 0x18b, 0x9e, 0x145, 0x269, 0x34f, 0x6b, 0x120, 0xf, 0x1ce, 0x34c, 0x3fa, 0x366, 0x119, 0x301, 0x8a, 0x353, 0x1d5, 0xd4, 0x2bb, 0x273, 0x1cb, 0x3e5, 0xed, 0x1a4, 0x1c8, 0xce, 0x1e7, 0x3a, 0x34, 0x2b1, 0x9b, 0x3fe, 0x2a8, 0xec, 0xbd, 0x2c9, 0x44, 0x2b4, 0x1ef, 0xe0, 0xa, 0x2e8, 0x235, 0x14d, 0x1, 0x119, 0x301, 0x8a, 0x353, 0x1d5, 0xd4, 0x2bb, 0x273, 0x1cb, 0x3e5, 0xed, 0x1a4, 0x1c8, 0xce, 0x1e7, 0x3a, 0x34, 0x2b1, 0x9b, 0x3fe, 0x2a8, 0xec, 0xbd, 0x2c9, 0x44, 0x2b4, 0x1ef, 0xe0, 0xa, 0x2e8, 0x235, 0x14d, 0x1, 0x119, 0x301, 0x8a, 0x353, 0x1d5, 0xd4, 0x2bb, 0x273, 0x1cb, 0x3e5, 0xed, 0x1a4, 0x1c8, 0xce, 0x1e7, 0x3a, 0x34, 0x2b1, 0x9b, 0x3fe, 0x2a8, 0xec, 0xbd, 0x2c9, 0x44, 0x2b4, 0x1ef, 0xe0, 0xa, 0x2e8, 0x235, 0x14d, 0x1, 0x119, 0x301, 0x8a, 0x353, 0x1d5, 0xd4, 0x2bb, 0x273, 0x1cb, 0x3e5, 0xed, 0x1a4, 0x1c8, 0xce, 0x1e7, 0x232, 0x1f, 0x59, 0x155, 0x2de, 0x165, 0x36f, 0x375, 0x1c4, 0xf2, 0x311, 0x27c, 0xa7, 0x32a, 0x26, 0x26e, 0x3a2, 0x2e4, 0x10d, 0x1b9, 0x3a4, 0x253, 0x14f, 0x6f, 0x53, 0x8c, 0x218, 0x31f, 0x37f, 0x1d, 0x34, 0x16b, 0x26c, 0x3cf, 0x2da, 0x1bf, 0x313, 0x211, 0x99, 0x398, 0x28c, 0x3db, 0x168, 0x33, 0x3ee, 0x231, 0x240, 0x78, 0x1be, 0x121, 0x20e, 0xc0, 0x2cd, 0x52, 0x2be, 0x207, 0x346, 0x22a, 0x2c3, 0x151, 0x204, 0x119, 0x20b, 0x228, 0x2ae, 0x16f, 0x2b6, 0x3b3, 0x3be, 0xe2, 0x79, 0x38c, 0x13e, 0x257, 0x195, 0x13, 0x137, 0x1d1, 0x172, 0x282, 0x2d8, 0x1d2, 0x32d, 0x2a3, 0x233, 0x22d, 0x46, 0x10c, 0x38b, 0x3bb, 0x20a, 0x1a, 0x2b1, 0x136, 0x3e3, 0x16d, 0x2db, 0x38d, 0x30c, 0x248, 0x1cc, 0x146, 0x3e9, 0xb4, 0x21d, 0x1f7, 0x31c, 0x120, 0x3c, 0xdf, 0x294, 0x107, 0x60, 0x362, 0x6d, 0x7c, 0x2c8, 0x17d, 0x366, 0x1e6, 0x85, 0x33c, 0x3fb, 0x36b, 0x357, 0x2e9, 0xab, 0x81, 0x288, 0x20b, 0x59, 0x2aa, 0x36a, 0x33a, 0x295, 0x263, 0x1fc, 0x1ee, 0x3ed, 0xdc, 0x196, 0x91, 0x51, 0x1c2, 0x8a, 0x157, 0x16f, 0x165, 0x2d7, 0x1cf, 0x23b, 0x33b, 0x2f8, 0x21f, 0x334, 0x93, 0x8b, 0x13a, 0x113, 0x3ad, 0x3aa, 0x2a9, 0x3dd, 0x3be, 0x1c4, 0x1e4, 0x5f, 0x3c4, 0x262, 0x191, 0x192, 0x125, 0x1a1, 0x2f0, 0x177, 0xd4, 0x2fe, 0x371, 0x23c, 0x238, 0x38c, 0x27c, 0x14e, 0xb3, 0x130, 0x2a1, 0xb5, 0x5e, 0x3a9, 0x21e, 0x359, 0xef, 0x243, 0x47, 0x275, 0x24b, 0x32f, 0x195, 0x26, 0xd5, 0x293, 0x30d, 0xf4, 0x345, 0xea, 0x39a, 0x1cb, 0x38f, 0x2cb, 0x1ca, 0x3e2, 0x2b7, 0x302, 0x29f, 0x1d1, 0x2e4, 0x21a, 0x2ed, 0x11f, 0x171, 0x1ba, 0x3f6, 0x1da, 0x13b, 0x17e, 0x3d1, 0x162, 0x3d4, 0xda, 0x1f0, 0x26d, 0x3fd, 0x3, 0x16e, 0x210, 0x2be, 0xe, 0x5, 0x3b2, 0x239, 0x3cb, 0x12, 0xf, 0xdf, 0x242, 0x54, 0x36, 0x11, 0x161, 0x2cf, 0xfc, 0x5a, 0x33, 0x3a3, 0x358, 0x104, 0xee, 0x55, 0xec, 0x1e1, 0x30c, 0x132, 0xff, 0x134, 0x223, 0x11d, 0x356, 0x101, 0x35c, 0x26c, 0x327, 0x1f3, 0x303, 0x1ed, 0x2bd, 0x160, 0x215, 0x10c, 0x237, 0x3ce, 0x3a0, 0x236, 0x314, 0x250, 0x5b, 0xe9, 0x253, 0x135, 0x2f9, 0xed, 0x13b, 0x2fc, 0x35f, 0x302, 0x137, 0x34d, 0x30d, 0x1e8, 0x10f, 0x359, 0x1de, 0x11e, 0x238, 0x311, 0x1e2, 0x262, 0x322, 0x241, 0x13a, 0x226, 0x2af, 0x16f, 0x2ca, 0x34e, 0x263, 0x3f8, 0x3b1, 0x357, 0x1db, 0x2ac, 0x1, 0xda, 0x1f0, 0x26d, 0x3fd, 0x3, 0x16e, 0x210, 0x2be, 0xe, 0x5, 0x3b2, 0x239, 0x3cb, 0x12, 0xf, 0xdf, 0x242, 0x54, 0x36, 0x11, 0x161, 0x1b4, 0x3c9, 0x34c, 0x3a7, 0x60, 0x326, 0x252, 0x3de, 0x3f, 0x2d, 0x33, 0x34f, 0x17b, 0x32, 0x2fb, 0x2b2, 0x37e, 0x15c, 0x2d2, 0x58, 0x30e, 0x10c, 0x67, 0x323, 0x13f, 0x328, 0x258, 0x10d, 0x1d3, 0xea, 0x273, 0x8f, 0x238, 0x22b, 0x381, 0x334, 0x24c, 0xa2, 0x20b, 0x164, 0x2fa, 0x306, 0xb7, 0x210, 0x175, 0x38, 0x28, 0x35e, 0x3b9, 0x31c, 0x112, 0x31b, 0x117, 0x76, 0x1e1, 0x211, 0xc1, 0x3f1, 0x364, 0xf9, 0x3d9, 0x3a, 0x340, 0xc5, 0x128, 0x5b, 0x1d2, 0x15e, 0x1ba, 0x3c3, 0x19f, 0x24b, 0xa7, 0x166, 0x192, 0x9d, 0x226, 0x157, 0x1b5, 0x27d, 0x85, 0xeb, 0x3c7, 0x346, 0x174, 0x18c, 0x3e1, 0x12, 0x1e, 0x37c, 0x234, 0x149, 0x2c9, 0x49, 0x1cc, 0x222, 0x38e, 0x28a, 0x356, 0x202, 0x16b, 0x344, 0x21c, 0x217, 0x170, 0x355, 0xde, 0x139, 0x299, 0x2fc, 0x2b7, 0x13, 0x1aa, 0xb5, 0x368, 0x33f, 0x256, 0x20e, 0x1b, 0x22, 0x31a, 0x146, 0x2e7, 0x145, 0x356, 0xd, 0x1a5, 0x216, 0x188, 0x270, 0xaf, 0x1ba, 0x38f, 0x275, 0x27c, 0x262, 0x93, 0x51, 0x20b, 0x2c8, 0x3fa, 0x6, 0x362, 0x290, 0x1ef, 0x3f, 0x5a, 0xcc, 0x24e, 0x39d, 0x249, 0x397, 0x3e6, 0x2e, 0x1d7, 0x6f, 0x139, 0x13b, 0x3e2, 0x195, 0x130, 0x125, 0x113, 0x157, 0x36a, 0x1e6, 0x21, 0x2ab, 0xe, 0x14, 0x35e, 0x37b, 0x6b, 0x82, 0x1dc, 0x2a8, 0x1bf, 0x15c, 0x1ad, 0x160, 0x46, 0xe4, 0xfb, 0x162, 0x29f, 0x293, 0x5e, 0x177, 0x2a9, 0x2d7, 0x263, 0x3fb, 0x36e, 0x5d, 0xc6, 0x3e1, 0x24, 0x78, 0x3d6, 0x308, 0x17a, 0x30c, 0xc1, 0x3eb, 0x18b, 0x3c1, 0x1e7, 0x349, 0x194, 0x258, 0x21a, 0x345, 0x359, 0x371, 0x1c4, 0x33b, 0x3ed, 0x2e9, 0x151, 0x8, 0x376, 0x1ce, 0x294, 0x54, 0xd8, 0x110, 0xe6, 0x222, 0x2d9, 0xe7, 0x294, 0xa8, 0x360, 0x92, 0x27b, 0xd9, 0xf9, 0x37f, 0x3a0, 0x194, 0xb9, 0x7a, 0x21e, 0x1f5, 0x2e3, 0x1fc, 0x2df, 0x22a, 0xc6, 0x3cb, 0x90, 0x3c0, 0x117, 0x1d8, 0x22f, 0x169, 0xb0, 0x46, 0x1c8, 0x3ec, 0x302, 0x1aa, 0x2d4, 0x3ad, 0x2de, 0xf3, 0x21, 0x15f, 0x38, 0xa0, 0x185, 0x3a3, 0x2f6, 0x190, 0x3cf, 0x3e6, 0x5c, 0x355, 0x378, 0x3b4, 0x321, 0x14e, 0x322, 0x22c, 0x20b, 0x199, 0x3f3, 0x30, 0x245, 0x2b4, 0x32e, 0x3bf, 0x2a6, 0x356, 0x1a, 0x29d, 0x94, 0xb6, 0x28b, 0x39a, 0x8f, 0xf2, 0x2f8, 0x1b8, 0x2ac, 0x8, 0x2e5, 0x331, 0x8d, 0x149, 0x336, 0x99, 0x3fc, 0x2c1, 0x3c1, 0x3ce, 0x13f, 0xbb, 0x1c1, 0x3d0, 0xd4, 0x3b3, 0x335, 0x3fb, 0x2d5, 0x174, 0x239, 0x267, 0x89, 0x23f, 0xaa, 0x2db, 0x15c, 0x35a, 0x189, 0x230, 0x25b, 0x35f, 0x26, 0x14b, 0x28d, 0x157, 0x1bb, 0x39c, 0x8d, 0x292, 0xc3, 0xc1, 0x3b7, 0x86, 0x19c, 0xb1, 0x137, 0xb5, 0x3d2, 0x2de, 0x1e6, 0x84, 0x2ea, 0x380, 0x2d, 0x198, 0x254, 0x35c, 0x281, 0x188, 0x1d2, 0x2e2, 0x243, 0xf2, 0x1f9, 0x2e9, 0x14d, 0x80, 0xf, 0x1eb, 0x219, 0x3c2, 0x158, 0x58, 0x46, 0x390, 0x3ab, 0x26, 0x296, 0x226, 0x2aa, 0x183, 0x2dc, 0x290, 0x3b5, 0x3f0, 0x2ad, 0x1ab, 0x1a, 0x133, 0x250, 0x1b9, 0xea, 0x3bc, 0x388, 0x1ee, 0x147, 0x235, 0x3e1, 0x90, 0x389, 0x55, 0x2db, 0x2b8, 0x173, 0x53, 0x348, 0x3e2, 0x25d, 0x324, 0x1c2, 0x164, 0x3fd, 0x30, 0x83, 0x2c2, 0x146, 0x38e, 0x7d, 0x1d, 0x11b, 0x96, 0x21a, 0x10f, 0x1f5, 0x1cf, 0x3f9, 0x2d5, 0x2e8, 0xf6, 0x31c, 0x82, 0x379, 0x2da, 0x303, 0x2ef, 0xde, 0x1da, 0x321, 0x29c, 0x93, 0x144, 0xf8, 0x34c, 0x107, 0x36, 0x110, 0x398, 0x268, 0xf9, 0x376, 0x26b, 0x61, 0x17a, 0x56, 0x2c, 0x46, 0x329, 0x2b7, 0x130, 0x13a, 0x59, 0x3fa, 0x30, 0x106, 0x31a, 0x222, 0x9e, 0x3bb, 0x349, 0xbb, 0x30d, 0x177, 0x165, 0x85, 0x2ab, 0x70, 0x109, 0xcc, 0x254, 0x2b1, 0x216, 0x5b, 0x11f, 0xef, 0x1c4, 0x1ee, 0x28e, 0xc6, 0x337, 0x112, 0x1dc, 0x16d, 0x303, 0x1d7, 0x378, 0x2cb, 0x27c, 0x334, 0x81, 0x368, 0x1ce, 0x8d, 0x12d, 0x30c, 0x201, 0x30e, 0xe4, 0x3d1, 0x26, 0x125, 0x8a, 0x17d, 0x6, 0x326, 0x161, 0x146, 0x315, 0x1f4, 0xe8, 0x194, 0x2e4, 0x3a9, 0x2a9, 0x295, 0x1d6, 0xe, 0xa0, 0x21d, 0x24e, 0xd7, 0x344, 0x188, 0x3a4, 0x39a, 0x23c, 0x33b, 0x357, 0x31e, 0x3e1, 0x120, 0x23f, 0x2a8, 0x1e3, 0x3bd, 0x6f, 0x1da, 0x24b, 0x262, 0x91, 0x6d, 0x33f, 0x294, 0x2a0, 0x265, 0xc1, 0x367, 0x218, 0xfb, 0x302, 0x2a1, 0x113, 0x2aa, 0x306, 0x2e5, 0x1be, 0x308, 0x38d, 0x2d2, 0x312, 0x348, 0x393, 0x191, 0xa2, 0x1f0, 0x256, 0xa8, 0x336, 0xc1, 0x2c7, 0x72, 0x3d1, 0x4c, 0x9d, 0x59, 0x3fd, 0xc0, 0x22, 0x1cc, 0xd9, 0x3c1, 0x24f, 0x34b, 0xb5, 0x353, 0x1b3, 0x16e, 0x129, 0x197, 0x2e7, 0x7d, 0x74, 0x194, 0x1c1, 0x2bf, 0x165, 0x10a, 0x2be, 0x380, 0xb4, 0x1b6, 0xd, 0x266, 0x2a4, 0x345, 0x1f5, 0x335, 0x3e7, 0x5, 0x163, 0x34f, 0x333, 0x1a2, 0x188, 0x341, 0x273, 0x1c4, 0x3dc, 0x22a, 0x239, 0x31c, 0x208, 0x3f5, 0x3c5, 0x1c9, 0x1ba, 0x8e, 0x17c, 0x2e9, 0x13d, 0x12, 0x3c0, 0xaa, 0x2f5, 0x3bd, 0xde, 0x361, 0x27c, 0x261, 0x204, 0x376, 0xdf, 0x184, 0x3c2, 0x169, 0x189, 0x1a4, 0x3cd, 0x2cc, 0x51, 0xf8, 0x12b, 0x54, 0x19b, 0x264, 0x367, 0x39, 0x3ec, 0x26, 0x24a, 0x228, 0x3fa, 0x60, 0x11, 0xe6, 0x268, 0x3e4, 0x323, 0x1c3, 0x2f1, 0x76, 0xae, 0x2e6, 0x139, 0x321, 0xcd, 0x81, 0x1bb, 0xdf, 0x308, 0x313, 0x35a, 0xa6, 0xe5, 0x29c, 0x91, 0x1b4, 0x39c, 0x61, 0x1e1, 0x169, 0x312, 0x299, 0x257, 0x93, 0x232, 0x277, 0x8d, 0xbd, 0xac, 0x160, 0xd2, 0x3cd, 0x191, 0x144, 0x3c9, 0x294, 0x292, 0x211, 0x2c, 0x118, 0x2fc, 0xb3, 0x22c, 0xf8, 0x256, 0x150, 0xc3, 0x201, 0x23, 0x25b, 0x195, 0x241, 0x1f, 0x34c, 0x2a, 0x19b, 0xc1, 0x187, 0x1c8, 0x2b7, 0xc9, 0x384, 0x26d, 0x107, 0x1b0, 0x99, 0x3b7, 0x39, 0x3d1, 0x98, 0x274, 0x2c8, 0x3a7, 0x36, 0x92, 0x3f1, 0x86, 0xfb, 0x13, 0x24a, 0x59, 0x3f3, 0x300, 0x110, 0xff, 0x316, 0x19c, 0x181, 0x14b, 0x8a, 0x1fd, 0x60, 0x22, 0x398, 0x364, 0x237, 0xb1, 0x1aa, 0x113, 0x2ba, 0xc, 0x106, 0x73, 0x268, 0x3c1, 0x97, 0x137, 0x1a1, 0x155, 0x205, 0x326, 0x386, 0x3d6, 0x3b0, 0x2f2, 0x6f, 0x2cb, 0x3c4, 0xab, 0x40, 0x78, 0x55, 0x1e3, 0x1d7, 0x3f6, 0x38c, 0xdc, 0x29a, 0x24, 0x23f, 0x16d, 0x2e, 0x135, 0x47, 0x2f8, 0x365, 0x3e1, 0x112, 0x2fb, 0x3e6, 0x392, 0x1cb, 0x1e4, 0x357, 0xc6, 0x18e, 0x19, 0x397, 0x4e, 0x171, 0x23c, 0x1ee, 0x5d, 0x1ec, 0x358, 0x249, 0x31, 0x3a4, 0xef, 0x23b, 0x36e, 0x36d, 0x3ee, 0x39d, 0x344, 0x5b, 0xea, 0x3be, 0x3fb, 0x206, 0x2c6, 0x24e, 0x2b1, 0x94, 0x2ed, 0x2fe, 0x263, 0x307, 0xa0, 0xcc, 0x284, 0x133, 0x141, 0x21e, 0x2d7, 0x1d6, 0x70, 0x5a, 0x36c, 0x68, 0x4b, 0xf4, 0x2a9, 0x85, 0x175, 0x3f, 0x2ad, 0x286, 0x236, 0x2e4, 0x177, 0x33a, 0x108, 0x1ef, 0x3db, 0x23a, 0xe8, 0xbb, 0x5e, 0x16f, 0x32b, 0x290, 0x32e, 0x315, 0x3bb, 0x27e, 0x293, 0x3ad, 0x366, 0x362, 0x161, 0x222, 0xf9, 0x323, 0x29f, 0x305, 0x343, 0x1bf, 0x373, 0x1fb, 0x38c, 0x1b8, 0x27a, 0x120, 0x3b8, 0x1f3, 0x392, 0x396, 0x399, 0x28e, 0x7b, 0x1ac, 0x249, 0x62, 0x28b, 0x371, 0x3f8, 0x103, 0x2c6, 0x95, 0x2d6, 0xa9, 0x283, 0x36f, 0x1d6, 0xe0, 0x168, 0x356, 0x289, 0x172, 0x177, 0x27d, 0x29, 0x363, 0x1c7, 0x3d9, 0x27e, 0x12f, 0x2af, 0x306, 0x245, 0x73, 0x1b2, 0x67, 0x181, 0x125, 0xb2, 0x3a7, 0xd8, 0x132, 0x187, 0x329, 0x32a, 0x22c, 0x3e0, 0x121, 0xbd, 0x2b0, 0x22d, 0xe5, 0x262, 0x102, 0x1c3, 0x3d6, 0x369, 0x3da, 0x378, 0xe3, 0x6e, 0x29a, 0x48, 0xee, 0x37a, 0x2e0, 0x2e1, 0x1e4, 0x2a7, 0x318, 0x6b, 0x190, 0x21c, 0x3a4, 0x1de, 0xfe, 0x346, 0x2b5, 0x127, 0x2b1, 0x128, 0x3a6, 0x3dd, 0x271, 0x38, 0x5a, 0x2d1, 0x1a0, 0x258, 0x35b, 0x19d, 0x108, 0x3de, 0x377, 0x1f4, 0x29b, 0x34d, 0x3ad, 0x2c5, 0x193, 0x31a, 0x203, 0x117, 0x1e3, 0x355, 0x317, 0x2f8, 0x18f, 0x267, 0x19, 0x247, 0xe9, 0xef, 0xfe, 0x285, 0x2c6, 0x12a, 0x34a, 0x141, 0x6a, 0x123, 0x175, 0xfc, 0x28a, 0xe8, 0x2ec, 0x1e9, 0x366, 0x193, 0x23d, 0x1b2, 0xce, 0x20d, 0x13a, 0x332, 0x15, 0x265, 0x16, 0x69, 0x32f, 0x24c, 0x2d9, 0x37c, 0x1d8, 0x1ed, 0x378, 0x1c6, 0x1b8, 0xfd, 0x89, 0x1ff, 0x30f, 0x2bc, 0x71, 0x36b, 0x3b2, 0x3d5, 0xd7, 0x4a, 0x1d3, 0x3dd, 0xeb, 0xe0, 0x2d0, 0x143, 0x65, 0x30d, 0x2b3, 0x25f, 0xad, 0x111, 0x1f2, 0x12e, 0x354, 0x114, 0x3ef, 0x6c, 0x132, 0x30e, 0xbf, 0x166, 0x288, 0xe7, 0xc2, 0x22f, 0x1c5, 0x3b4, 0x3c4, 0x2ac, 0x9, 0x23f, 0x1bd, 0x2e0, 0x1cb, 0x399, 0x115, 0x1ec, 0x17b, 0xd1, 0x5b, 0x3a8, 0x39e, 0x307, 0x280, 0xdb, 0x68, 0x12c, 0x35b, 0x33a, 0x29, 0x2cf, 0x315, 0x2f7, 0x3a1, 0x1a1, 0xf, 0x55, 0x303, 0x135, 0x238, 0x357, 0x239, 0x358, 0x26c, 0x5b, 0x359, 0x263, 0xe, 0x5a, 0x356, 0x236, 0x30d, 0x16f, 0x16e, 0x161, 0x134, 0x237, 0x302, 0x13a, 0x26d, 0x54, 0x30c, 0x160, 0x13b, 0x262, 0x1, 0xf, 0x55, 0x303, 0x135, 0x238, 0x357, 0x239, 0x358, 0x26c, 0x5b, 0x359, 0x263, 0xe, 0x5a, 0x356, 0x236, 0x30d, 0x16f, 0x16e, 0x161, 0x134, 0x237, 0x302, 0x13a, 0x26d, 0x54, 0x30c, 0x160, 0x13b, 0x262, 0x1, 0xf, 0x55, 0x303, 0x135, 0x238, 0x357, 0x239, 0x358, 0x26c, 0x5b, 0x359, 0x263, 0xe, 0x5a, 0x356, 0x236, 0x30d, 0x16f, 0x16e, 0x161, 0x134, 0x237, 0x302, 0x13a, 0x26d, 0x54, 0x30c, 0x160, 0x13b, 0x262, 0x1, 0xf, 0x55, 0x303, 0x135, 0x238, 0x357, 0x239, 0x358, 0x26c, 0x5b, 0x359, 0x263, 0xe, 0x5a, 0x356, 0x236, 0x30d, 0x16f, 0x16e, 0x161, 0x134, 0x1e, 0x154, 0x2e, 0x374, 0x399, 0x5d, 0x2ff, 0x26f, 0x94, 0x283, 0x34e, 0x175, 0x3f0, 0xfa, 0x27e, 0x16a, 0x2ba, 0x180, 0x124, 0x187, 0x17e, 0x322, 0x1b4, 0x37c, 0x369, 0x2ef, 0x38f, 0x1f9, 0x63, 0x6b, 0x9b, 0x229, 0x359, 0xcf, 0x38, 0x2d0, 0x105, 0x259, 0x2f0, 0x2c5, 0x83, 0x339, 0x86, 0x35f, 0x8b, 0x3c9, 0x234, 0x22f, 0x31d, 0x33e, 0xdc, 0x1fa, 0x41, 0x397, 0xe9, 0x3bc, 0x3fb, 0x28, 0x330, 0x68, 0xb9, 0x1d5, 0x32b, 0x15a, 0x9a, 0x237, 0x20d, 0xe1, 0x34c, 0x149, 0x158, 0xa6, 0x9f, 0x251, 0x200, 0x77, 0x1f3, 0xaf, 0x71, 0x1b7, 0x35e, 0x95, 0x29d, 0x21a, 0x15b, 0x84, 0x363, 0x223, 0x395, 0xd5, 0x114, 0x3a7, 0x2c9, 0xb, 0xd2, 0x14e, 0x102, 0x203, 0x55, 0x20f, 0xdd, 0x1e4, 0x115, 0x3b9, 0x39d, 0x25, 0x3a6, 0x2d7, 0x15f, 0xfc, 0x23a, 0x29b, 0x25e, 0x2aa, 0x3c, 0x159, 0x170, 0x325, 0x3dc, 0x36d, 0x127, 0x34a, 0x21a, 0x2b6, 0x210, 0x32e, 0x278, 0x25c, 0x125, 0x332, 0xa8, 0x56, 0x53, 0x9f, 0xab, 0x12, 0x3b8, 0x30f, 0x1cd, 0x7f, 0x206, 0x66, 0x1a, 0x258, 0x1d5, 0x25f, 0x161, 0xd9, 0x338, 0x130, 0x3e, 0x121, 0x3c2, 0x1c5, 0x19f, 0xdc, 0x3f4, 0x104, 0x87, 0x28b, 0x375, 0x307, 0x2d, 0x2a5, 0x194, 0x178, 0x2c5, 0x106, 0xff, 0x39, 0x195, 0x144, 0x39c, 0x76, 0x3da, 0x3e5, 0x2f8, 0x63, 0xd6, 0x26c, 0x16c, 0x1f5, 0x1d6, 0x21b, 0x28a, 0x349, 0x25e, 0x15d, 0x180, 0x248, 0x215, 0x3e2, 0x24c, 0x2e5, 0x28f, 0x385, 0x26a, 0x1e4, 0x22a, 0x2ff, 0xd7, 0x250, 0x35, 0x85, 0x2f3, 0x1c7, 0x1e7, 0x26e, 0x114, 0x347, 0x336, 0x58, 0x13b, 0x19a, 0x10, 0x3c0, 0x1bd, 0x32d, 0x23c, 0x1b7, 0x2b5, 0x254, 0xc5, 0x1e8, 0x33a, 0x148, 0x28c, 0x3c1, 0x78, 0x16d, 0x392, 0x23c, 0x36e, 0x2c6, 0x284, 0x4b, 0x177, 0x32b, 0x161, 0x1b2, 0xfb, 0x192, 0x3e0, 0x61, 0x15c, 0x378, 0x5f, 0x31e, 0x6b, 0x26c, 0x2d8, 0x3dd, 0x2ab, 0x1f8, 0x1f4, 0x3d4, 0x113, 0x3ef, 0x2c9, 0x2c, 0x13b, 0x334, 0x40, 0x23f, 0x3e6, 0x171, 0x23b, 0x206, 0xcc, 0x68, 0x2e4, 0x16f, 0x362, 0xe6, 0x43, 0x2b7, 0x51, 0x1ce, 0x76, 0x3bd, 0x38f, 0x3ed, 0x239, 0x2f6, 0x216, 0x345, 0x295, 0x3ba, 0x2e7, 0x1e7, 0xd5, 0x59, 0x20e, 0x30c, 0x312, 0x24b, 0xab, 0x24, 0x2fb, 0x4e, 0xef, 0x3fb, 0xa0, 0x36c, 0x236, 0x5e, 0x366, 0x106, 0x1fe, 0xe4, 0xb3, 0x6d, 0x37c, 0x1bf, 0x2a3, 0x238, 0x28e, 0x37b, 0xd7, 0xa9, 0xd4, 0x21, 0x363, 0x9e, 0x12e, 0x125, 0x26d, 0x2a0, 0x2b0, 0x139, 0x3c4, 0x29a, 0x112, 0x397, 0x3a4, 0x3be, 0x307, 0x5a, 0x286, 0xbb, 0x3ad, 0x6, 0xf0, 0x1bd, 0xaf, 0x388, 0x103, 0xcc, 0xd0, 0x382, 0x36a, 0x245, 0xff, 0xe4, 0x166, 0x1b4, 0x3d6, 0x3c6, 0xdd, 0x33b, 0x1d9, 0x127, 0x133, 0x1e8, 0xf3, 0xad, 0x268, 0x279, 0x192, 0x3c9, 0x184, 0x2f2, 0x3e5, 0x3f2, 0x239, 0x1e5, 0x4a, 0x21e, 0x10a, 0x3b5, 0x9e, 0x25c, 0x9d, 0x34c, 0x25a, 0x2bd, 0x2cb, 0x1b8, 0x39f, 0xc8, 0x310, 0x17f, 0x1d6, 0x7e, 0xfa, 0x3d4, 0x226, 0x3a7, 0x265, 0x2c0, 0x321, 0xab, 0x48, 0x3fe, 0x270, 0x2eb, 0x387, 0x5a, 0x105, 0x2ec, 0x157, 0x60, 0x248, 0x46, 0x257, 0x204, 0x78, 0x2da, 0x253, 0x1c4, 0x285, 0x66, 0x68, 0x1c1, 0x1b5, 0x326, 0x27b, 0x72, 0xb3, 0xda, 0x1eb, 0x1e3, 0x26a, 0x399, 0x2e8, 0x297, 0x29d, 0xf4, 0x27d, 0x252, 0x134, 0x338, 0xc9, 0x3e0, 0xc2, 0x179, 0x3f6, 0x1f9, 0x318, 0x2f6, 0x25, 0x10f, 0x85, 0x3de, 0x4f, 0x12e, 0x1e0, 0x2fd, 0x171, 0xfe, 0x28, 0x36c, 0xca, 0x1e9, 0x6, 0x49, 0x215, 0x32f, 0x204, 0xf0, 0x37a, 0x2bc, 0x7f, 0x14, 0x1b6, 0x65, 0x2f0, 0x3, 0x220, 0x30e, 0x393, 0x102, 0x78, 0x1bd, 0x15e, 0x23b, 0xa, 0xdb, 0x236, 0x178, 0x205, 0x110, 0x187, 0x3cd, 0x81, 0x3c, 0x2da, 0xaf, 0x319, 0x5, 0x269, 0x11b, 0xbc, 0x306, 0x88, 0x2c7, 0x3e2, 0x244, 0x1e, 0x16d, 0x253, 0x388, 0x206, 0x330, 0x289, 0x5e, 0x183, 0x44, 0x367, 0x1f1, 0x122, 0xf, 0x2b2, 0x32d, 0x1c4, 0x103, 0x198, 0x340, 0x2f, 0x2c5, 0x22, 0x3b7, 0x2fc, 0x91, 0x203, 0x159, 0x392, 0xe2, 0x285, 0xcc, 0x1a0, 0x213, 0x366, 0x11, 0x3df, 0x17e, 0x24c, 0x305, 0x2a8, 0x1c9, 0x71, 0x346, 0x66, 0xd0, 0x30d, 0x1b3, 0x20c, 0x3eb, 0xbf, 0x126, 0x386, 0x154, 0x2e0, 0x23c, 0x1a3, 0x33, 0x68, 0x382, 0x2dd, 0x106, 0x3c0, 0x3e6, 0x39a, 0x3fb, 0x109, 0x286, 0x1d1, 0x2aa, 0x1b, 0x201, 0x13b, 0x196, 0x24, 0x3f5, 0x3a4, 0x1cf, 0x70, 0x145, 0x27e, 0x113, 0x347, 0x30c, 0xa6, 0x3c4, 0xfd, 0x19, 0x188, 0x2fe, 0x2ab, 0x3db, 0x1e7, 0x2a1, 0x26d, 0x12d, 0x173, 0x275, 0x365, 0x6b, 0x344, 0x345, 0x85, 0x363, 0xf9, 0x302, 0x20b, 0x8d, 0x15c, 0x3f6, 0x3ed, 0x1ec, 0xd7, 0x141, 0x165, 0x290, 0x134, 0xfb, 0x8b, 0x1ce, 0x3b0, 0x2a3, 0x1e4, 0x2e8, 0x24e, 0x18a, 0x177, 0x16e, 0xe6, 0x218, 0xb3, 0x368, 0x28f, 0x2e, 0x243, 0x36e, 0x21d, 0x68, 0x30d, 0x366, 0x22, 0x367, 0x3e2, 0x81, 0x78, 0x37a, 0x171, 0x1fc, 0xa0, 0x356, 0xbb, 0x157, 0x180, 0xc1, 0x1a4, 0x334, 0x200, 0x2fb, 0x270, 0x3be, 0xe, 0x2ad, 0x349, 0x1a1, 0x3ef, 0x265, 0x312, 0x27c, 0x29a, 0x82, 0x31, 0x359, 0x1d6, 0x1f8, 0x3bb, 0xd5, 0x389, 0x383, 0xef, 0x3c7, 0x168, 0xe8, 0x16a, 0x3f3, 0x265, 0x22d, 0x1e2, 0xfd, 0x32, 0x229, 0x3dd, 0x2ea, 0x38e, 0x12e, 0x274, 0x14a, 0x22f, 0x2f9, 0x3f2, 0x1ec, 0x1ae, 0x10d, 0x33a, 0x15a, 0x2c1, 0x2b7, 0x119, 0x1eb, 0x303, 0x396, 0x1b7, 0x21d, 0xd0, 0x2f, 0x306, 0x220, 0x23, 0x14e, 0x10, 0xee, 0x4e, 0x2eb, 0x7, 0x2ad, 0x29b, 0x28d, 0x347, 0x211, 0x298, 0x21f, 0x3cb, 0x320, 0x2d8, 0x1a7, 0x2f3, 0x9e, 0x2c4, 0x301, 0x8d, 0x2b8, 0x3c3, 0x357, 0x2ff, 0x2d6, 0xf4, 0x3cc, 0x18d, 0x43, 0x32a, 0x1b4, 0x28f, 0x5c, 0x11e, 0x346, 0x198, 0x11b, 0x2f0, 0xc, 0x248, 0x230, 0xcd, 0x100, 0x2fb, 0xe9, 0x2e3, 0x70, 0x28a, 0x1ea, 0x8a, 0x15, 0x158, 0x1da, 0x1b8, 0xc7, 0x26c, 0x1d3, 0x246, 0x363, 0x1f2, 0x13, 0x7c, 0xc2, 0x3da, 0x47, 0x115, 0x3a3, 0x133, 0x35b, 0xb7, 0xe6, 0x31b, 0x217, 0x371, 0x7, 0x153, 0x27e, 0x45, 0x15, 0x2b0, 0x361, 0x1db, 0x6b, 0x10b, 0x35, 0x108, 0x111, 0x338, 0x8b, 0x331, 0x37e, 0x1ba, 0x3b1, 0x185, 0x68, 0x2f, 0x205, 0x92, 0x118, 0xcd, 0x200, 0x3fe, 0x341, 0x263, 0x21b, 0x3e8, 0xd5, 0x332, 0x25a, 0x38a, 0x22b, 0x18c, 0x39d, 0x2a4, 0x2ca, 0xad, 0x2c1, 0x167, 0x6d, 0x343, 0x5c, 0x23c, 0x103, 0xdb, 0x194, 0x2af, 0x300, 0x201, 0xe5, 0x156, 0x112, 0x21c, 0x2bb, 0x2ab, 0x377, 0x24f, 0x13a, 0x14a, 0x57, 0x3f6, 0x3af, 0x2ff, 0x1a5, 0x3d0, 0x25f, 0xe6, 0x72, 0x322, 0x386, 0x2b2, 0x15e, 0x1fc, 0x280, 0x105, 0x293, 0x1fd, 0x19b, 0x312, 0x1e2, 0x1fa, 0xc8, 0x16c, 0x1a7, 0x1ef, 0x278, 0x20d, 0x7c, 0x184, 0x373, 0x238, 0x174, 0x95, 0x4b, 0x2b3, 0x245, 0x3eb, 0x1f1, 0x102, 0x3c0, 0x383, 0x1de, 0x307, 0x352, 0x29b, 0x113, 0x23f, 0x4e, 0x3be, 0x70, 0x23a, 0x29f, 0x2c8, 0x12d, 0x38a, 0x5f, 0x239, 0xd7, 0x21a, 0x1e6, 0x31a, 0x218, 0x191, 0x386, 0x16d, 0x171, 0x3fb, 0x5a, 0xe8, 0x1a1, 0x347, 0x56, 0x1da, 0x2e9, 0x6b, 0x216, 0xd4, 0x52, 0x134, 0x3d1, 0x288, 0x3d6, 0x2e, 0x23c, 0x206, 0x36c, 0xbb, 0x2aa, 0xd8, 0x160, 0x27c, 0xfd, 0xc8, 0x2d8, 0x295, 0x363, 0x3c1, 0x130, 0x33f, 0x3b0, 0x135, 0x1ee, 0x2c6, 0x68, 0x5e, 0x6, 0x99, 0x1a4, 0x196, 0x120, 0x87, 0x359, 0x2ab, 0x2e7, 0x12e, 0x1c2, 0x8d, 0x2f2, 0x47, 0x5d, 0x24e, 0x4b, 0x16f, 0x106, 0x367, 0x32f, 0x8, 0x1dc, 0x270, 0x1cf, 0x380, 0x1f4, 0xd5, 0x26d, 0x17a, 0x6f, 0x2f8, 0x1ec, 0x2b1, 0xf4, 0x32b, 0xe6, 0xe4, 0x93, 0xf, 0x37a, 0x39a, 0x3e7, 0x2d0, 0x349, 0x113, 0x20e, 0x2b0, 0x2cb, 0x365, 0x358, 0x94, 0x2a9, 0x290, 0x1b2, 0x77, 0x138, 0x1cf, 0x309, 0x3d9, 0x2a1, 0x291, 0x313, 0x3f6, 0x2a7, 0x3a3, 0x18a, 0x35d, 0x83, 0x367, 0x257, 0x20, 0x2fb, 0x341, 0x19e, 0x1f8, 0x3ce, 0x9d, 0x294, 0x2b8, 0x227, 0x5d, 0x95, 0x12c, 0x36a, 0x44, 0x23, 0x262, 0x9, 0x3cf, 0xea, 0x3ac, 0x377, 0x12e, 0x384, 0x234, 0x3bd, 0x79, 0x3b2, 0x284, 0x1c1, 0x183, 0x92, 0x69, 0xcb, 0x120, 0x10e, 0x17f, 0x175, 0x223, 0x181, 0x7c, 0x219, 0x355, 0x33b, 0x2b5, 0x34, 0x5e, 0xc, 0x264, 0x13b, 0x156, 0x41, 0x188, 0x3b3, 0x2f3, 0xf9, 0x4c, 0x39b, 0x3b0, 0x26a, 0x3b1, 0x21d, 0x289, 0x3d2, 0x180, 0xb, 0x321, 0x29a, 0x32, 0x16c, 0x295, 0x2cf, 0x31f, 0x192, 0x39c, 0x2f5, 0x1cb, 0x2d5, 0x330, 0x194, 0x2ae, 0x6c, 0x160, 0xf1, 0x3f4, 0x249, 0x1d3, 0x214, 0x146, 0x338, 0x22c, 0x37c, 0x20f, 0x11e, 0x206, 0x2d1, 0x2ec, 0x17d, 0xee, 0xe9, 0x263, 0xfc, 0x3ce, 0x13a, 0x242, 0x1ed, 0x238, 0x3b2, 0x101, 0x30d, 0x3, 0x132, 0x13b, 0x2ac, 0x104, 0x5b, 0x34e, 0x2cf, 0x237, 0x241, 0xdf, 0x303, 0x11e, 0x5, 0x356, 0x34d, 0x3fd, 0x30c, 0xed, 0x1db, 0x358, 0x250, 0x2ca, 0x161, 0x10c, 0x322, 0xf, 0x1f3, 0x1de, 0xe, 0x11d, 0x137, 0x26d, 0x1e1, 0x2f9, 0x357, 0x3a3, 0x314, 0x16f, 0x11, 0x215, 0x262, 0x12, 0x327, 0x359, 0x2be, 0x223, 0x302, 0x1f0, 0xec, 0x135, 0x3b1, 0x33, 0x236, 0x2af, 0x36, 0x160, 0x1e2, 0x3cb, 0x26c, 0x10f, 0x210, 0x134, 0x35f, 0xda, 0x55, 0x253, 0x3f8, 0x5a, 0x3a0, 0x226, 0x54, 0x2bd, 0x311, 0x239, 0x35c, 0x1e8, 0x16e, 0xff, 0x2fc, 0x1, 0xee, 0xe9, 0x263, 0xfc, 0x3ce, 0x13a, 0x242, 0x1ed, 0x238, 0x3b2, 0x101, 0x30d, 0x3, 0x132, 0x13b, 0x2ac, 0x104, 0x5b, 0x34e, 0x2cf, 0x237, 0x1dc, 0x3a4, 0x33c, 0x3db, 0x12e, 0x20b, 0x308, 0x2a3, 0x1ee, 0x21d, 0x236, 0x157, 0xd8, 0x312, 0x21f, 0x18e, 0x216, 0x2a9, 0xad, 0x43, 0x191, 0xf, 0x3e6, 0x371, 0x70, 0x1f4, 0x2a1, 0x256, 0x15c, 0x47, 0x2e8, 0x284, 0x30d, 0x6, 0xc1, 0x1ca, 0x29a, 0xc8, 0x2ed, 0x21, 0x222, 0x3d1, 0x6d, 0x55, 0xaf, 0x3fb, 0x2d0, 0x27e, 0x59, 0x12d, 0x6f, 0x3ed, 0x3ee, 0x18a, 0x16f, 0x22, 0x46, 0x334, 0x120, 0x31, 0x3dd, 0x1ef, 0x3c1, 0x192, 0x26b, 0x303, 0x23c, 0x14, 0x286, 0xb5, 0x347, 0x2b0, 0x275, 0xc6, 0xd7, 0xf4, 0x16e, 0x1fe, 0x3e2, 0x8, 0x2fb, 0x11f, 0x1d6, 0x2e7, 0x162, 0x7c, 0x76, 0x135, 0x36b, 0xcc, 0x194, 0x2aa, 0x2c9, 0xa6, 0xdc, 0x6b, 0x94, 0x165, 0x161, 0x218, 0x93, 0x78, 0x30f, 0x3be, 0x380, 0x3bb, 0x125, 0x294, 0x2f2, 0x238, 0x36d, 0xd, 0x5e, 0x30, 0x3b8, 0x28b, 0x1d6, 0x1c7, 0x181, 0x3e0, 0x369, 0x2e1, 0x346, 0x2d1, 0x34d, 0x3ef, 0xac, 0x33e, 0xc6, 0x1ae, 0x3d0, 0x362, 0x3df, 0xa7, 0x200, 0x327, 0x17f, 0x3ba, 0x1f2, 0xc9, 0x26b, 0x20f, 0xe2, 0xa0, 0x3a, 0x28d, 0x54, 0x2e6, 0x17c, 0x37b, 0x266, 0x2b3, 0x22, 0x8c, 0xcb, 0x112, 0x310, 0x34e, 0x32e, 0x338, 0x144, 0x28f, 0x32d, 0x3f9, 0x2d0, 0xf5, 0x164, 0x17a, 0x2f9, 0x147, 0x24e, 0xb9, 0x183, 0x99, 0x276, 0x14d, 0xc8, 0x1d3, 0x84, 0x134, 0x167, 0x1bb, 0x16d, 0x33d, 0x7, 0x23a, 0x1aa, 0x12b, 0x15c, 0x8e, 0x3b2, 0xd, 0xbc, 0xc0, 0x2c, 0xf1, 0x39f, 0x344, 0x1a8, 0x252, 0x43, 0x322, 0x3c, 0x30f, 0x375, 0x21b, 0x1e7, 0x274, 0x234, 0x1d7, 0x27f, 0x30a, 0x236, 0x2ae, 0x360, 0xa6, 0x1b8, 0x1ac, 0xa9, 0x27d, 0x73, 0x329, 0x102, 0xee, 0x3a4, 0x271, 0x377, 0x162, 0x379, 0x23e, 0x2ab, 0x4f, 0x4c, 0x1ce, 0x385, 0x71, 0xa0, 0x74, 0x226, 0x2a0, 0x233, 0x3d3, 0x34f, 0x12c, 0x2c5, 0x99, 0xe5, 0x13d, 0x249, 0x10f, 0xa4, 0x18b, 0x2cc, 0x1e, 0x30f, 0x2e3, 0x7e, 0x323, 0x301, 0x219, 0x135, 0x1b7, 0xdb, 0x1d1, 0x3f3, 0xac, 0x275, 0x318, 0x16b, 0x177, 0x83, 0x215, 0x334, 0x89, 0x310, 0x295, 0xa3, 0x1f6, 0x6d, 0x154, 0x2e2, 0x307, 0x11d, 0x1aa, 0x256, 0x179, 0x79, 0x35e, 0x1a0, 0x353, 0xd8, 0x53, 0x1b8, 0x358, 0x2a4, 0x3cc, 0x339, 0x1f1, 0x10, 0x3f5, 0x3a8, 0x2ea, 0xf9, 0xc9, 0xdf, 0x2e, 0x319, 0x212, 0x349, 0x228, 0x25a, 0x378, 0x147, 0x95, 0x2e4, 0x3, 0x182, 0x24b, 0x3f4, 0xd1, 0xd4, 0x252, 0x86, 0x93, 0x1e0, 0x9c, 0x263, 0x3e9, 0x25c, 0x7c, 0x1d8, 0x374, 0x346, 0x1ab, 0x12f, 0x347, 0x2d2, 0x311, 0x1ec, 0x29d, 0x35d, 0x22, 0x2fb, 0xea, 0x175, 0xf9, 0x192, 0x37c, 0x170, 0x1fc, 0x2d0, 0x3d4, 0x26d, 0x22f, 0x47, 0x36d, 0x68, 0x3ad, 0xd8, 0xa6, 0x2e9, 0x2f6, 0x21a, 0x16e, 0x3eb, 0x14e, 0x24, 0x31, 0x2d7, 0x32e, 0xfb, 0x6d, 0x2a8, 0x39a, 0xe, 0x1f4, 0x125, 0x8d, 0x1d7, 0x1ee, 0xcc, 0xbb, 0x3fa, 0x56, 0x275, 0x239, 0x1a5, 0x3aa, 0x22, 0x230, 0xab, 0x19, 0x2ed, 0x108, 0x1b2, 0xb3, 0xf, 0x30f, 0x1cf, 0x1f8, 0x12e, 0x7c, 0x3b0, 0x1cb, 0x206, 0x286, 0x1a1, 0x54, 0x38a, 0x3ed, 0x34f, 0x258, 0x306, 0xc1, 0x24b, 0x3e1, 0x344, 0x2a9, 0x161, 0xe4, 0x81, 0x1dc, 0x11f, 0x2ab, 0x9e, 0x130, 0x26b, 0x2e, 0x23b, 0x5a, 0x27e, 0x2c8, 0x3c2, 0x38f, 0x2e8, 0xd, 0x2f0, 0x1b, 0x312, 0xdc, 0x358, 0x141, 0x32b, 0x1fe, 0x32f, 0x200, 0x87, 0x3dd, 0x363, 0x19c, 0x288, 0x55, 0x171, 0x307, 0x23a, 0x2a1, 0x1ff, 0x3a8, 0x3ba, 0x38b, 0x22c, 0x28f, 0x15e, 0x387, 0x23a, 0x14b, 0x242, 0x1d7, 0x3dc, 0x330, 0x1d1, 0x3d7, 0x2d2, 0x5f, 0x2ff, 0x221, 0x366, 0x132, 0x321, 0x3e1, 0x281, 0x2b6, 0x31a, 0x25b, 0x4, 0x3f5, 0x2bb, 0x2f3, 0x237, 0xa2, 0x22e, 0x171, 0x207, 0xfa, 0x125, 0x11a, 0x355, 0x36b, 0xdb, 0x34d, 0x347, 0x35a, 0x17c, 0x3ee, 0x96, 0x183, 0xc1, 0x9f, 0x39f, 0x216, 0x2ca, 0x73, 0x17e, 0x10, 0x3cf, 0x2fe, 0x3de, 0xce, 0x288, 0xaa, 0x1cd, 0xe, 0x3e8, 0x9d, 0x61, 0x14f, 0x1b7, 0x36c, 0x12f, 0x107, 0x173, 0x1f9, 0x3a3, 0x258, 0x205, 0x304, 0x27c, 0x267, 0x4a, 0x33a, 0x1cc, 0x1f1, 0x40, 0x327, 0x3ea, 0x363, 0x338, 0x232, 0x2a8, 0x33d, 0x38, 0x3bb, 0x274, 0x184, 0x135, 0x2d5, 0x1ab, 0xb5, 0x15, 0x1c5, 0x3ed, 0x297, 0x172, 0x6, 0xb, 0x1e2, 0x18e, 0x128, 0xf3, 0x339, 0x3fe, 0x2bb, 0x1ef, 0xce, 0x119, 0x2a8, 0x273, 0xe0, 0x1e7, 0x301, 0xec, 0x1cb, 0xa, 0x3a, 0x8a, 0xbd, 0x3e5, 0x2e8, 0x34, 0x353, 0x2c9, 0xed, 0x235, 0x2b1, 0x1d5, 0x44, 0x1a4, 0x14d, 0x9b, 0xd4, 0x2b4, 0x1c8, 0x1, 0x3fe, 0x2bb, 0x1ef, 0xce, 0x119, 0x2a8, 0x273, 0xe0, 0x1e7, 0x301, 0xec, 0x1cb, 0xa, 0x3a, 0x8a, 0xbd, 0x3e5, 0x2e8, 0x34, 0x353, 0x2c9, 0xed, 0x235, 0x2b1, 0x1d5, 0x44, 0x1a4, 0x14d, 0x9b, 0xd4, 0x2b4, 0x1c8, 0x1, 0x3fe, 0x2bb, 0x1ef, 0xce, 0x119, 0x2a8, 0x273, 0xe0, 0x1e7, 0x301, 0xec, 0x1cb, 0xa, 0x3a, 0x8a, 0xbd, 0x3e5, 0x2e8, 0x34, 0x353, 0x2c9, 0xed, 0x235, 0x2b1, 0x1d5, 0x44, 0x1a4, 0x14d, 0x9b, 0xd4, 0x2b4, 0x1c8, 0x1, 0x3fe, 0x2bb, 0x1ef, 0xce, 0x119, 0x2a8, 0x273, 0xe0, 0x1e7, 0x301, 0xec, 0x1cb, 0xa, 0x3a, 0x8a, 0x3f5, 0x2fe, 0x363, 0xfb, 0x368, 0x37a, 0x3be, 0x1f8, 0x162, 0x33f, 0x303, 0x23b, 0x2d0, 0x29f, 0x256, 0x3bd, 0x1ee, 0x269, 0x293, 0x20e, 0x38a, 0x357, 0x254, 0x5e, 0x1b, 0xa6, 0x365, 0xd7, 0x177, 0x22, 0x1a4, 0x29a, 0x26c, 0x2a9, 0x31a, 0x17e, 0x40, 0x87, 0x2d7, 0x146, 0x2b7, 0x386, 0x30f, 0x263, 0x2e7, 0x26, 0x26b, 0x170, 0x3fb, 0x145, 0x2a1, 0x8d, 0x2a3, 0x36e, 0x356, 0x1a1, 0x2a0, 0x378, 0x5d, 0xd, 0x3ad, 0x2c9, 0x1da, 0xc6, 0x1a5, 0x16f, 0x92, 0x1ca, 0x3e1, 0x216, 0x33a, 0x339, 0x32f, 0x24, 0x188, 0x85, 0x134, 0xb3, 0x78, 0x270, 0x1d6, 0x9e, 0x192, 0x3d6, 0xaf, 0x307, 0x1f4, 0x13a, 0x308, 0x1ba, 0x206, 0x1d, 0x8a, 0x17a, 0x38f, 0x36d, 0x340, 0x2aa, 0x30c, 0x275, 0x1ec, 0x18a, 0x366, 0xc1, 0x27c, 0x18e, 0xa9, 0x32b, 0x3eb, 0x262, 0x112, 0x2d8, 0x108, 0x18b, 0x3e3, 0x3ea, 0x32e, 0x3ab, 0x1c3, 0x30f, 0xcf, 0x38e, 0x130, 0x2f1, 0x253, 0x307, 0x3e8, 0xe1, 0x76, 0x396, 0x50, 0x349, 0x199, 0xae, 0x1e4, 0x33, 0x2ec, 0x347, 0x2e6, 0x3af, 0x254, 0xbc, 0x6c, 0x139, 0x235, 0x2d6, 0x16f, 0x124, 0x321, 0x337, 0x128, 0x391, 0x3eb, 0xcd, 0x41, 0x2ed, 0xa4, 0x10c, 0x81, 0x1ff, 0x17f, 0x363, 0x1f6, 0x1bb, 0x3e6, 0x39e, 0x377, 0x26, 0xdf, 0x1c9, 0x3e7, 0x7d, 0x9d, 0x308, 0x374, 0xa, 0xe8, 0xb2, 0x313, 0x238, 0x185, 0x259, 0x3ef, 0x35a, 0x3f2, 0x24e, 0x213, 0x209, 0xa6, 0x2c3, 0x35c, 0x3aa, 0x220, 0xe5, 0x3e1, 0x25, 0xf3, 0x1fe, 0x29c, 0x89, 0x2d8, 0x210, 0x225, 0x91, 0x3b8, 0x3a8, 0x1ef, 0x338, 0x1b4, 0x37a, 0x375, 0x3e9, 0x302, 0x39c, 0xb8, 0x3fb, 0x28a, 0x296, 0x61, 0x26a, 0x103, 0x1d, 0x114, 0x1e1, 0x47, 0x2b5, 0xca, 0x3fa, 0x3cf, 0x3b3, 0x146, 0x2ce, 0x1e, 0x270, 0x351, 0x1f2, 0x51, 0x154, 0x1de, 0x3f, 0xb1, 0x277, 0x2e, 0x3f9, 0x28a, 0x125, 0x184, 0x374, 0x14, 0x3a0, 0x199, 0x15c, 0x399, 0x198, 0x293, 0x2a, 0xde, 0x5d, 0x34, 0x2ae, 0x30c, 0x1c6, 0x2ff, 0x258, 0x18, 0x2c0, 0x2e9, 0x26f, 0x2ee, 0x110, 0xe5, 0x3cb, 0x94, 0x391, 0x3df, 0x334, 0x208, 0x283, 0xad, 0x390, 0x10, 0x87, 0x34e, 0x4d, 0xb3, 0x1e0, 0x341, 0x175, 0x31f, 0x119, 0x16d, 0x1df, 0x3f0, 0x302, 0x331, 0x2e0, 0x3e7, 0xfa, 0x274, 0x76, 0x325, 0x140, 0x27e, 0x1a6, 0x1ed, 0x1ee, 0x1b6, 0x16a, 0x2a0, 0x1fb, 0x1d9, 0x340, 0x2ba, 0xac, 0x5f, 0x3a3, 0x1c1, 0x180, 0x53, 0x2c3, 0x2b1, 0x2b3, 0x124, 0x24b, 0xc7, 0x152, 0x16e, 0x187, 0x32c, 0xc8, 0x6a, 0x2c2, 0x17e, 0x100, 0x62, 0x85, 0xd9, 0x322, 0x23f, 0x75, 0x37d, 0x19c, 0x397, 0x2d7, 0x222, 0xb3, 0x3c0, 0x11f, 0x3ba, 0x19c, 0x368, 0x3e6, 0x263, 0x315, 0x192, 0x28f, 0x39a, 0x380, 0x12e, 0x33f, 0x2e, 0x3fb, 0x23a, 0x13a, 0x76, 0x243, 0x109, 0x3d4, 0x256, 0x1d7, 0x36e, 0x286, 0x8a, 0x3c2, 0x238, 0x21d, 0x1d1, 0x20e, 0x6f, 0x5d, 0x68, 0x2aa, 0x56, 0x5f, 0x34f, 0x30d, 0x1b, 0x139, 0xc6, 0x133, 0x366, 0x201, 0x21f, 0x2f6, 0x3a9, 0x22, 0x13b, 0x3e1, 0x94, 0x32b, 0x367, 0x196, 0xc8, 0xd4, 0x31a, 0x3e2, 0x24, 0x5b, 0x108, 0x43, 0x81, 0x3f5, 0x3dd, 0x146, 0x195, 0x78, 0x3a4, 0x175, 0x237, 0x6d, 0x37a, 0x1cf, 0x2e7, 0x130, 0x3d6, 0x171, 0x70, 0x323, 0x3e0, 0x303, 0x1fc, 0x145, 0x125, 0x308, 0x1cb, 0xa0, 0x27e, 0x34c, 0x3bd, 0x36b, 0x356, 0x113, 0x17a, 0x47, 0x2c6, 0xbb, 0x347, 0x38a, 0x28e, 0xd, 0x157, 0x30c, 0x38c, 0x3ee, 0x2e4, 0x180, 0x327, 0x34e, 0x134, 0x322, 0xee, 0x359, 0x2cf, 0x35f, 0xf, 0xe9, 0x2be, 0x237, 0xda, 0x1f3, 0x263, 0x223, 0x241, 0x55, 0x1de, 0xfc, 0x302, 0xdf, 0x253, 0xe, 0x3ce, 0x1f0, 0x303, 0x3f8, 0x11d, 0x13a, 0xec, 0x11e, 0x5a, 0x137, 0x242, 0x135, 0x5, 0x3a0, 0x26d, 0x1ed, 0x3b1, 0x356, 0x226, 0x1e1, 0x238, 0x33, 0x34d, 0x54, 0x2f9, 0x3b2, 0x236, 0x3fd, 0x2bd, 0x357, 0x101, 0x2af, 0x30c, 0x311, 0x3a3, 0x30d, 0x36, 0xed, 0x239, 0x314, 0x3, 0x160, 0x1db, 0x35c, 0x16f, 0x132, 0x1e2, 0x358, 0x1e8, 0x11, 0x13b, 0x3cb, 0x250, 0x16e, 0x215, 0x2ac, 0x26c, 0x2ca, 0xff, 0x262, 0x104, 0x10f, 0x161, 0x2fc, 0x12, 0x5b, 0x210, 0x10c, 0x1, 0x327, 0x34e, 0x134, 0x322, 0xee, 0x359, 0x2cf, 0x35f, 0xf, 0xe9, 0x2be, 0x237, 0xda, 0x1f3, 0x263, 0x223, 0x241, 0x55, 0x1de, 0xfc, 0x302, 0x247, 0x123, 0x1b2, 0x24c, 0x1ff, 0x3dd, 0x111, 0x166, 0x23f, 0x3a8, 0x2cf, 0x2b7, 0x3c, 0x341, 0x3ba, 0x279, 0x2e5, 0x4e, 0x351, 0x38b, 0x6d, 0x1f3, 0xcf, 0x9e, 0x22c, 0x159, 0x3be, 0x377, 0x260, 0x28f, 0x273, 0x7e, 0x302, 0x1be, 0x15e, 0x70, 0x97, 0x277, 0x170, 0x387, 0x37f, 0x7c, 0x385, 0x3f8, 0x23a, 0xe1, 0x369, 0x1c4, 0x352, 0x14b, 0x308, 0x325, 0x212, 0x29f, 0x242, 0x26a, 0x14, 0x13f, 0x291, 0x1d7, 0x1a3, 0x3a, 0x2c8, 0x179, 0x3dc, 0x356, 0x45, 0x38d, 0x1e4, 0x330, 0x16a, 0x12d, 0x227, 0x185, 0x1d1, 0x2a, 0x2f9, 0x36d, 0xca, 0x3d7, 0x38a, 0x22a, 0xd0, 0x17d, 0x2d2, 0x3d3, 0x284, 0x2af, 0x211, 0x5f, 0x127, 0xbc, 0x2c9, 0x33e, 0x2ff, 0x2e4, 0x209, 0x272, 0x239, 0x221, 0xc, 0x312, 0x18f, 0x34a, 0x366, 0x16, 0x1b8, 0xd7, 0x2b3, 0x132, 0x3c4, 0x17b, 0x35b, 0x110, 0x87, 0x85, 0x18b, 0x81, 0x397, 0x295, 0x1b2, 0x91, 0x3f5, 0x2d7, 0x134, 0x93, 0x2fb, 0x3dd, 0x222, 0x191, 0x1dc, 0x2fe, 0x146, 0xb3, 0x23f, 0x359, 0x32e, 0x195, 0x3c0, 0xea, 0x363, 0x2b7, 0x78, 0x11f, 0x1ef, 0x3d1, 0xf, 0x3a4, 0x3ba, 0xfb, 0x386, 0x270, 0x175, 0x19c, 0x376, 0x4e, 0x2ab, 0x237, 0x368, 0x30f, 0x1d6, 0x3c1, 0x6d, 0x3e6, 0x33c, 0xf9, 0x288, 0x37a, 0x263, 0x9e, 0x51, 0x16d, 0x1cf, 0x315, 0x8b, 0x2a8, 0x3be, 0x2e7, 0x192, 0x55, 0x371, 0x3db, 0x130, 0x28f, 0xef, 0x1f8, 0x26, 0x3d6, 0x39a, 0x3f, 0x302, 0x37c, 0x171, 0x380, 0x162, 0x26b, 0xaf, 0x70, 0x12e, 0x1ce, 0x392, 0xe, 0x323, 0x33f, 0x170, 0x307, 0x1e7, 0x3e0, 0x2e, 0x3e7, 0x3bb, 0x7c, 0x303, 0x3fb, 0x1f4, 0x20b, 0x1e3, 0x1fc, 0x23a, 0x1c2, 0x1bf, 0x23b, 0x145, 0x13a, 0x3b0, 0x1c4, 0x2ad, 0x125, 0x10e, 0x214, 0x43, 0x2, 0x21c, 0x21, 0x86, 0x4, 0x31, 0x42, 0x10c, 0x8, 0x62, 0x84, 0x218, 0x10, 0xc4, 0x108, 0x39, 0x20, 0x188, 0x210, 0x72, 0x40, 0x310, 0x29, 0xe4, 0x80, 0x229, 0x52, 0x1c8, 0x100, 0x5b, 0xa4, 0x390, 0x200, 0xb6, 0x148, 0x329, 0x9, 0x16c, 0x290, 0x25b, 0x12, 0x2d8, 0x129, 0xbf, 0x24, 0x1b9, 0x252, 0x17e, 0x48, 0x372, 0xad, 0x2fc, 0x90, 0x2ed, 0x15a, 0x1f1, 0x120, 0x1d3, 0x2b4, 0x3e2, 0x240, 0x3a6, 0x161, 0x3cd, 0x89, 0x345, 0x2c2, 0x393, 0x112, 0x283, 0x18d, 0x32f, 0x224, 0x10f, 0x31a, 0x257, 0x41, 0x21e, 0x23d, 0xa7, 0x82, 0x35, 0x73, 0x14e, 0x104, 0x6a, 0xe6, 0x29c, 0x208, 0xd4, 0x1cc, 0x131, 0x19, 0x1a8, 0x398, 0x262, 0x32, 0x350, 0x339, 0xcd, 0x64, 0x2a9, 0x27b, 0x19a, 0xc8, 0x15b, 0xff, 0x334, 0x190, 0x2b6, 0x1fe, 0x21c, 0x42, 0x218, 0x20, 0x310, 0x52, 0x390, 0x9, 0x2d8, 0x252, 0x2fc, 0x120, 0x3a6, 0x2c2, 0x32f, 0x41, 0x35, 0xe6, 0x131, 0x32, 0x2a9, 0xff, 0x261, 0x249, 0x19d, 0x3df, 0xab, 0x1a2, 0x3cc, 0x30e, 0x14d, 0x25, 0x16e, 0x118, 0x1fa, 0xa9, 0x193, 0x348, 0x337, 0x10d, 0x20c, 0x1ca, 0x231, 0x1e8, 0x110, 0x13e, 0x2b9, 0x177, 0x248, 0x381, 0x39d, 0x2b3, 0x182, 0xdc, 0x35c, 0x2dd, 0x2c, 0x3b6, 0x34a, 0x306, 0x189, 0x235, 0x18a, 0x18, 0x14c, 0x239, 0x12c, 0x300, 0x1da, 0x3b9, 0x1c1, 0xd8, 0x33e, 0x3d5, 0x5e, 0x336, 0x311, 0x24e, 0x3d2, 0x211, 0x2f8, 0x142, 0x2ae, 0x2b0, 0x3af, 0x1a, 0x17d, 0x2bd, 0x115, 0x340, 0x3f3, 0x31d, 0x2e8, 0xca, 0x287, 0x378, 0x1af, 0x176, 0x54, 0x3c3, 0x185, 0x293, 0x292, 0x8e, 0xcc, 0x2d4, 0x2f4, 0x1e4, 0x1b6, 0x226, 0x22f, 0xf7, 0x2a5, 0x59, 0x31, 0x108, 0xe4, 0x200, 0x2d8, 0xad, 0x3e2, 0x112, 0x21e, 0xe6, 0x262, 0xc8, 0x165, 0x3eb, 0xab, 0x344, 0x32b, 0x46, 0xfd, 0xa9, 0x326, 0x13b, 0x18e, 0xf4, 0x110, 0x27c, 0x2f6, 0x3aa, 0xc1, 0xdc, 0x2b1, 0x366, 0x160, 0x31e, 0x18a, 0x30, 0x139, 0x1ec, 0x2e4, 0xd8, 0x275, 0x34f, 0x2f0, 0x30c, 0x2f8, 0x284, 0x2aa, 0x1ad, 0x28e, 0x340, 0x3ef, 0x6f, 0x36d, 0xbb, 0x54, 0x38f, 0x21d, 0xb5, 0x17a, 0x1e4, 0x36c, 0x8a, 0x15c, 0x36b, 0x1d, 0x26d, 0x1d7, 0x206, 0x27e, 0x294, 0x1ba, 0x109, 0xd5, 0x308, 0x23c, 0x2ad, 0x13a, 0x1bf, 0x1fc, 0x1f4, 0x7c, 0x2e, 0x307, 0x323, 0x1ce, 0xaf, 0x380, 0x302, 0x3d6, 0xef, 0x3db, 0x192, 0x2a8, 0x1cf, 0x9e, 0x288, 0x3e6, 0x1d6, 0x237, 0x376, 0x270, 0x3ba, 0x3d1, 0x78, 0xea, 0x32e, 0xb3, 0x1dc, 0x3dd, 0x134, 0x91, 0x397, 0x85, 0x43, 0x62, 0x29, 0x329, 0x48, 0x3a6, 0x31a, 0x29c, 0x64, 0x165, 0x3df, 0x2ac, 0x216, 0x2dc, 0xd2, 0x337, 0x3d, 0x88, 0x27c, 0x1e5, 0x2b3, 0x201, 0x1db, 0x29d, 0x6, 0x14c, 0xf6, 0x2e4, 0x1b0, 0x1c6, 0x24e, 0x353, 0x158, 0x357, 0xd0, 0x3f3, 0x6f, 0x2d3, 0x2ec, 0x2a0, 0x8e, 0x330, 0x113, 0x57, 0x3b1, 0x1d, 0xd3, 0x355, 0x14, 0x3a1, 0x234, 0x243, 0x1a9, 0x9d, 0x1bf, 0x3f8, 0x3d9, 0x3e0, 0x2e0, 0x38, 0x162, 0x2f1, 0x273, 0x3db, 0x324, 0x2b2, 0x263, 0x1f2, 0x1b4, 0x4e, 0x2ea, 0x3ec, 0x78, 0x1d4, 0xa3, 0x191, 0x1ff, 0x34e, 0x18b, 0x2, 0xc4, 0x52, 0x25b, 0x90, 0x345, 0x23d, 0x131, 0xc8, 0x2ca, 0x3b7, 0x151, 0x25, 0x1b1, 0x1a4, 0x267, 0x7a, 0x110, 0xf1, 0x3ca, 0x16f, 0xb, 0x3b6, 0x133, 0xc, 0x298, 0x1ec, 0x1c1, 0x360, 0x38c, 0x95, 0x2af, 0x2b0, 0x2a7, 0x1a0, 0x3ef, 0xc4, 0xa4, 0x17e, 0x89, 0x35, 0x339, 0xcb, 0xd1, 0x32b, 0x118, 0x3cb, 0x21a, 0x88, 0xf1, 0x39d, 0x1b5, 0x58, 0x31e, 0x221, 0x300, 0x2cb, 0x3a3, 0x1e9, 0x56, 0x3af, 0xd0, 0x3ef, 0x1bc, 0x2b5, 0x293, 0xbd, 0x3c8, 0x356, 0x164, 0x373, 0x206, 0x1ea, 0x11a, 0x243, 0x352, 0x274, 0x1e3, 0x3f7, 0x3ce, 0x1ce, 0x2bc, 0x7e, 0x130, 0x154, 0x39e, 0xf9, 0x1b4, 0x9c, 0x3ba, 0x35f, 0x389, 0x2fe, 0x9a, 0x122, 0x87, 0x84, 0x1c8, 0x24, 0x3a6, 0x23d, 0x262, 0x320, 0x27d, 0x30e, 0x27a, 0x152, 0x106, 0x321, 0x2b9, 0x3aa, 0x304, 0x1db, 0x133, 0x18, 0x272, 0x37b, 0x2f, 0xc3, 0x2f8, 0x202, 0x2fa, 0x38a, 0x3b2, 0x176, 0x2a0, 0x11c, 0xdb, 0x8a, 0x179, 0x2d5, 0x349, 0x14a, 0x374, 0x5a, 0x296, 0x369, 0x1fc, 0x3d9, 0x3c9, 0x392, 0x1c0, 0x20d, 0x28f, 0x1df, 0x223, 0x288, 0x383, 0x15f, 0xfb, 0x188, 0x290, 0x3e2, 0x82, 0x2a9, 0x3eb, 0x151, 0x94, 0x326, 0x1ca, 0x358, 0x3aa, 0x201, 0x365, 0x18a, 0x180, 0x2cb, 0x34f, 0x3ad, 0x2b0, 0x28e, 0x236, 0x20e, 0x38f, 0xcc, 0x113, 0x15c, 0x36e, 0x349, 0x294, 0x1cb, 0x2d0, 0x13a, 0x1e3, 0x3e7, 0x323, 0x26b, 0x39a, 0x3db, 0x8b, 0x37a, 0x1d6, 0x19c, 0xf, 0xea, 0x146, 0x93, 0x397, 0x21, 0xe4, 0x24, 0x345, 0xe6, 0x334, 0x26c, 0x32b, 0x230, 0x337, 0xf4, 0x92, 0x21f, 0x2b1, 0x306, 0xa6, 0x1ec, 0x30d, 0x265, 0x2f8, 0xd, 0x3fa, 0x6f, 0x35e, 0x293, 0x17a, 0x33b, 0x286, 0x26d, 0x2a3, 0xa0, 0xd5, 0x76, 0x23b, 0x1f4, 0x3e0, 0x392, 0x380, 0x26, 0x55, 0x1cf, 0xf9, 0x368, 0x270, 0x1ef, 0x195, 0x1dc, 0x2d7, 0x18b, 0x8, 0x5b, 0xad, 0x32f, 0x19, 0x165, 0x367, 0x29a, 0xa9, 0x106, 0x24b, 0x2f6, 0x16f, 0x2c, 0x31e, 0x4b, 0x1b, 0x310, 0x252, 0x32f, 0x32, 0x19d, 0x30e, 0x1fa, 0x10d, 0x110, 0x381, 0x35c, 0x306, 0x14c, 0x3b9, 0x5e, 0x211, 0x3af, 0x340, 0x287, 0x3c3, 0xcc, 0x226, 0x179, 0x346, 0xf5, 0x234, 0x23c, 0x28a, 0x3e, 0x170, 0xe0, 0x13, 0x55, 0x39e, 0x3e4, 0x376, 0x341, 0x197, 0x191, 0x3e3, 0x214, 0xe4, 0x48, 0x10f, 0x339, 0x32c, 0x10b, 0x362, 0x276, 0x1ac, 0x3aa, 0xb, 0x18f, 0x4b, 0x36, 0x1c6, 0x254, 0x15d, 0x1c5, 0x36d, 0x3a2, 0xbd, 0x33b, 0x105, 0x1a6, 0x135, 0x212, 0x296, 0x1bf, 0x3ff, 0x395, 0x26b, 0x33d, 0x377, 0x51, 0x3c5, 0x2be, 0x3d1, 0x389, 0x3ea, 0x1b2, 0x2, 0x229, 0xad, 0x257, 0x64, 0x33a, 0x215, 0x3f4, 0x21a, 0x220, 0x30b, 0x2b1, 0x205, 0x298, 0x37b, 0xbc, 0x2b, 0x357, 0x289, 0x107, 0x38f, 0x198, 0x45, 0x2f2, 0x285, 0x1ea, 0x61, 0x71, 0x11d, 0x7c, 0x2e0, 0x1c0, 0x26, 0x229, 0x15a, 0x14e, 0x320, 0x3cc, 0x230, 0xc7, 0x35b, 0xc1, 0x3b6, 0x314, 0x1b, 0x1c6, 0xa1, 0x17d, 0x233, 0x2b5, 0xb5, 0x313, 0x2df, 0x349, 0x242, 0x8f, 0x145, 0x3e, 0x2e0, 0x380, 0x98, 0x159, 0x33c, 0xce, 0x1e, 0x359, 0x9a, 0x102, 0x188, 0x252, 0x257, 0xc8, 0xf3, 0x8c, 0x337, 0x3d0, 0x132, 0x2e9, 0xc5, 0x300, 0x275, 0x12a, 0x15d, 0x38a, 0x1af, 0x12f, 0x3c2, 0x3b1, 0x1d0, 0x294, 0x325, 0x153, 0x20b, 0xb8, 0xe0, 0x26, 0x154, 0xcf, 0x237, 0x203, 0x1d4, 0x222, 0x244, 0x62, 0x290, 0x393, 0x32, 0x33a, 0x23, 0x3cb, 0xf4, 0x248, 0x1b8, 0x133, 0xc0, 0x19f, 0x24e, 0x155, 0x2e6, 0x36d, 0x34d, 0x2f4, 0x1ee, 0x74, 0xa5, 0x1cb, 0x352, 0x384, 0x2e, 0x38, 0x20d, 0x55, 0x335, 0x38b, 0x386, 0x75, 0x28c, 0x91, 0x21c, 0xa4, 0x3e2, 0x208, 0x2ca, 0x30e, 0x3f4, 0x3d, 0x92, 0x5b, 0x161, 0x262, 0x26c, 0x16e, 0x13b, 0x358, 0x16f, 0x160, 0x239, 0x30d, 0x30c, 0x357, 0x236, 0x54, 0x238, 0x356, 0x26d, 0x135, 0x5a, 0x13a, 0x303, 0xe, 0x302, 0x55, 0x263, 0x237, 0xf, 0x359, 0x134, 0x1, 0x5b, 0x161, 0x262, 0x26c, 0x16e, 0x13b, 0x358, 0x16f, 0x160, 0x239, 0x30d, 0x30c, 0x357, 0x236, 0x54, 0x238, 0x356, 0x26d, 0x135, 0x5a, 0x13a, 0x303, 0xe, 0x302, 0x55, 0x263, 0x237, 0xf, 0x359, 0x134, 0x1, 0x5b, 0x161, 0x262, 0x26c, 0x16e, 0x13b, 0x358, 0x16f, 0x160, 0x239, 0x30d, 0x30c, 0x357, 0x236, 0x54, 0x238, 0x356, 0x26d, 0x135, 0x5a, 0x13a, 0x303, 0xe, 0x302, 0x55, 0x263, 0x237, 0xf, 0x359, 0x134, 0x1, 0x5b, 0x161, 0x262, 0x26c, 0x16e, 0x13b, 0x358, 0x16f, 0x160, 0x239, 0x30d, 0x30c, 0x357, 0x236, 0x54, 0x238, 0x356, 0x26d, 0x135, 0x5a, 0x13a, 0xb6, 0x18d, 0x334, 0x281, 0x193, 0x24b, 0x333, 0x183, 0x139, 0x3d5, 0x2af, 0x173, 0x2d3, 0x25e, 0x22f, 0x2d5, 0x1ea, 0x308, 0x7f, 0x2f7, 0x26b, 0x1de, 0x4f, 0x368, 0x341, 0xa3, 0x91, 0x62, 0x252, 0x14e, 0x9b, 0xb7, 0x13b, 0x2b9, 0x1b5, 0x312, 0x3d8, 0x178, 0x2b0, 0xba, 0x2ec, 0x17a, 0x3dc, 0x3a0, 0x8d, 0x71, 0xfa, 0x33f, 0x2e2, 0x377, 0x288, 0x9c, 0x3b5, 0x191, 0x327, 0x29, 0x3e2, 0x32, 0xf3, 0x230, 0x31c, 0x1d5, 0x2c, 0x18c, 0x382, 0x30c, 0x2a7, 0xca, 0x2a0, 0x3c8, 0x20a, 0x256, 0x396, 0x2a6, 0x7c, 0x32d, 0xfc, 0x8b, 0x3c5, 0x1dd, 0x195, 0x1ff, 0x214, 0x329, 0x224, 0x2b6, 0x30e, 0x3cb, 0x3d0, 0xc1, 0x2c3, 0x12c, 0x2c9, 0x1f9, 0x1a0, 0x20e, 0x8e, 0x1ab, 0x26d, 0x26a, 0x168, 0x1c2, 0x5c, 0x1c0, 0x130, 0x2da, 0x351, 0x3d1, 0x77, 0x34e, 0x218, 0x48, 0x6a, 0x3eb, 0x16c, 0x23d, 0x196, 0x4a, 0x20c, 0x3c4, 0x2d6, 0x60, 0x275, 0x142, 0x3fd, 0x3f6, 0x330, 0xb2, 0x2a3, 0x2d, 0x274, 0x2e, 0x1c0, 0x260, 0x37a, 0x2be, 0x167, 0x2fb, 0x214, 0x25b, 0x82, 0x19d, 0x8c, 0x18e, 0x1d5, 0x58, 0x239, 0x2f, 0xac, 0x5d, 0x2ec, 0x2f4, 0x36b, 0x13f, 0xc2, 0x23b, 0x2f7, 0xdf, 0x371, 0x278, 0x2e5, 0xea, 0x9a, 0x2, 0x2d8, 0x73, 0x32c, 0x94, 0x11, 0x381, 0x1a5, 0xc0, 0xe3, 0x284, 0x3f3, 0x3e5, 0x269, 0x164, 0x14f, 0x5a, 0xe1, 0x5c, 0x380, 0xc9, 0x2fd, 0x175, 0x2ce, 0x1ff, 0x21, 0xbf, 0x104, 0x33a, 0x118, 0x31c, 0x3aa, 0xb0, 0x7b, 0x5e, 0x158, 0xba, 0x1d1, 0x1e1, 0x2df, 0x27e, 0x184, 0x7f, 0x1e7, 0x1be, 0x2eb, 0xf9, 0x1c3, 0x1d4, 0x134, 0x4, 0x1b9, 0xe6, 0x251, 0x128, 0x22, 0x30b, 0x34a, 0x180, 0x1c6, 0x101, 0x3ef, 0x3c3, 0xdb, 0x2c8, 0x2d8, 0xe6, 0xab, 0xa9, 0x110, 0xdc, 0x18a, 0xd8, 0x2f8, 0x340, 0x54, 0x1e4, 0x1d, 0x294, 0x23c, 0x1f4, 0x1ce, 0xef, 0x9e, 0x376, 0xea, 0x134, 0x8, 0x2ed, 0x339, 0x151, 0x141, 0x92, 0x2e9, 0x4b, 0x2c9, 0x3ed, 0x236, 0x2a0, 0x33b, 0xe8, 0x8d, 0x1c4, 0x3bb, 0x26b, 0x371, 0xf9, 0x386, 0x359, 0x1b2, 0x40, 0x345, 0x1fe, 0x29a, 0x21a, 0x99, 0x365, 0x258, 0x265, 0x357, 0x194, 0x12d, 0x1ee, 0x349, 0x61, 0x23b, 0x1e7, 0x37c, 0x3be, 0x3c1, 0xf, 0x2fe, 0x18b, 0x200, 0x21e, 0x3eb, 0xfd, 0xf4, 0xc1, 0x31e, 0x2e4, 0x30c, 0x28e, 0xbb, 0x17a, 0x36b, 0x27e, 0x308, 0x1fc, 0x323, 0x3d6, 0x1cf, 0x237, 0x78, 0x3dd, 0x43, 0x24, 0xd4, 0x367, 0x3e1, 0x3a9, 0x201, 0xc6, 0x30d, 0x56, 0x5d, 0x1d1, 0x3c2, 0x36e, 0x3d4, 0x76, 0x3fb, 0x12e, 0x28f, 0x263, 0x19c, 0x3c0, 0x2d7, 0x218, 0x1b9, 0x398, 0x151, 0x282, 0x248, 0x365, 0xb9, 0x186, 0x28e, 0x176, 0x1e1, 0x36e, 0x3a1, 0x1d8, 0x3e7, 0x2c4, 0x154, 0x1d6, 0x3ab, 0x379, 0x21, 0x2fc, 0x64, 0x32b, 0x276, 0x3ca, 0x306, 0x3b4, 0x12a, 0x3fa, 0x3e5, 0x1b6, 0x26d, 0x374, 0x2a6, 0x3e0, 0x2e2, 0x38e, 0x368, 0x23e, 0x9a, 0x8, 0x1d3, 0xff, 0x29a, 0x3d, 0x264, 0x31e, 0x1c1, 0x2b, 0x5d, 0x3a2, 0x313, 0x346, 0x137, 0x2db, 0x307, 0x20d, 0x2b2, 0x2ab, 0x167, 0x3fe, 0x108, 0x3cd, 0x320, 0x16e, 0x394, 0x26f, 0x6, 0x19f, 0x142, 0x3ef, 0x317, 0x1ab, 0x34c, 0x396, 0x11d, 0x33f, 0x33d, 0x4f, 0x376, 0x1d4, 0xd9, 0x40, 0x283, 0x3f1, 0xfd, 0x1e8, 0x304, 0xc6, 0x213, 0x158, 0x2e8, 0x12f, 0xae, 0x206, 0x1aa, 0x2f5, 0xe, 0x4c, 0x1bd, 0x175, 0x32a, 0x3cf, 0x52, 0x257, 0x136, 0x362, 0x9f, 0x35c, 0x30, 0xe3, 0x202, 0x347, 0x372, 0x27b, 0x29a, 0x7a, 0x182, 0xc6, 0x2f, 0x169, 0x36d, 0x2d4, 0x1ed, 0xa0, 0x9d, 0x5c, 0x3f, 0x22c, 0x9c, 0x32e, 0x244, 0xb6, 0xe6, 0x2ac, 0x282, 0x99, 0x18f, 0x1c1, 0x56, 0x174, 0x12f, 0x15c, 0xa, 0x14b, 0x303, 0x1c0, 0x324, 0x30f, 0x3b5, 0x126, 0x188, 0x18d, 0x32c, 0xa9, 0x49, 0x1db, 0x258, 0x186, 0x115, 0x1d1, 0x313, 0x285, 0xd5, 0x2f5, 0x1c, 0x130, 0x1f3, 0x37d, 0x191, 0x21c, 0x15a, 0x334, 0x4a, 0x44, 0xdc, 0x221, 0x19b, 0x357, 0x259, 0x2f4, 0x36e, 0x34b, 0x369, 0x307, 0x13, 0x2da, 0x175, 0x25d, 0x327, 0x290, 0x131, 0x281, 0x106, 0x30b, 0x266, 0xd8, 0x3f2, 0x65, 0x12d, 0x3b1, 0xf5, 0x76, 0x3f7, 0x2c4, 0x2a8, 0x351, 0x167, 0x3f5, 0x29, 0x257, 0x26c, 0x193, 0xf1, 0x1a5, 0x209, 0xbe, 0x340, 0x150, 0x27f, 0x349, 0x184, 0x3f8, 0x12e, 0x22e, 0x271, 0x3d1, 0x2ed, 0x1fe, 0xfd, 0x3a9, 0x2c, 0x1ec, 0x3ad, 0x38a, 0x21d, 0x59, 0x135, 0x2ad, 0x3e0, 0x39a, 0x9e, 0x386, 0x2fe, 0x43, 0x120, 0x165, 0x230, 0x358, 0x366, 0x1da, 0x254, 0x3ef, 0x47, 0x286, 0x294, 0x1c4, 0x1e7, 0x3d6, 0x263, 0xfb, 0x1dc, 0x21, 0x3e2, 0x249, 0x362, 0x27c, 0x1a5, 0x1b, 0x2f8, 0x236, 0x12d, 0x36b, 0x3d4, 0x3b0, 0x307, 0x26, 0x37a, 0x3ba, 0x191, 0x31, 0x161, 0x196, 0xa9, 0x92, 0x365, 0x2e4, 0x56, 0x2e8, 0xb5, 0x2f2, 0xa0, 0x13a, 0x170, 0x1f8, 0x288, 0x3a4, 0x222, 0x8, 0x345, 0x3eb, 0x3e1, 0x177, 0x160, 0x37b, 0x157, 0x6f, 0xcc, 0x2c8, 0x1ba, 0x145, 0x33f, 0xef, 0xf9, 0xf, 0x3dd, 0x218, 0x112, 0x33a, 0x1a4, 0x2f6, 0x306, 0x2cb, 0x284, 0x347, 0x238, 0x1d, 0x8d, 0x23b, 0x323, 0x28f, 0x33c, 0x3d1, 0x2fb, 0x108, 0x32f, 0x26c, 0x326, 0x3c4, 0x133, 0xd8, 0x1d3, 0x3f1, 0x3e1, 0x2ee, 0x189, 0x3ee, 0x15d, 0x1fb, 0x36c, 0x291, 0x11e, 0x3bb, 0x2f1, 0x335, 0xfb, 0x3b8, 0x84, 0x32f, 0xd1, 0x83, 0x21f, 0x314, 0x336, 0x28e, 0x3a2, 0xae, 0x14, 0x24a, 0xb8, 0x1f8, 0x119, 0x28b, 0x134, 0x80, 0x6a, 0x30e, 0x31c, 0x1b5, 0x139, 0x95, 0x3f3, 0x47, 0x105, 0x242, 0x23b, 0x24f, 0x22e, 0x1d6, 0x167, 0x3cf, 0x290, 0xcd, 0x4a, 0x110, 0x1db, 0x172, 0x56, 0x1d9, 0x2d4, 0x3bd, 0x212, 0x301, 0xaf, 0x1c7, 0x1bb, 0x359, 0x316, 0x90, 0x165, 0x69, 0x17b, 0x306, 0x19f, 0x202, 0x20e, 0x3c8, 0x3a0, 0x308, 0x3ff, 0x181, 0x16d, 0x2ea, 0x2cc, 0x31, 0x2c2, 0x251, 0x141, 0x132, 0x63, 0x5e, 0x35a, 0x163, 0x8a, 0x14f, 0x352, 0x3e0, 0x33d, 0x278, 0xf, 0x3b3, 0x72, 0x82, 0x3cc, 0xe5, 0xd7, 0x60, 0x22b, 0x340, 0x149, 0x3b1, 0x3d4, 0x369, 0x7, 0x130, 0x3a6, 0x3df, 0x337, 0x2b3, 0x14c, 0x24e, 0x3f3, 0x8e, 0x1d, 0x234, 0x3f8, 0x162, 0x2b2, 0x2ea, 0x191, 0xc4, 0x23d, 0x151, 0x7a, 0xb, 0x1ec, 0x2af, 0xde, 0x269, 0x1a6, 0x8f, 0x3bb, 0x1eb, 0xcf, 0x3d1, 0x3fe, 0xa4, 0x262, 0x4a, 0x220, 0x365, 0x382, 0x169, 0x35e, 0x45, 0x14f, 0x2ad, 0x39b, 0x1de, 0x3c1, 0x1e0, 0x123, 0x17e, 0x320, 0x2cd, 0x3c4, 0xc5, 0x19b, 0x28e, 0x34d, 0x2b8, 0xa0, 0xe1, 0x32d, 0x2e7, 0x1bb, 0x2bb, 0x43, 0x89, 0x27d, 0x13b, 0x26f, 0x60, 0x5f, 0x11b, 0x25a, 0x36e, 0x26e, 0x3c6, 0x380, 0x22c, 0xe9, 0x222, 0x20, 0x35, 0x30e, 0x231, 0x2dd, 0x1da, 0x142, 0x287, 0x1e4, 0x3a0, 0x219, 0x3e7, 0x13, 0x2fd, 0x1ef, 0x24c, 0xb6, 0x339, 0x27a, 0x35b, 0x160, 0x1f7, 0x15d, 0x3f6, 0x1ab, 0xa5, 0x1c4, 0x395, 0x117, 0x1d6, 0x2ce, 0x327, 0xad, 0xcb, 0x152, 0x99, 0x345, 0x367, 0x18e, 0x36a, 0x1da, 0x284, 0x20e, 0x33b, 0x27e, 0x3b0, 0xe, 0x192, 0x4e, 0x146, 0x8, 0x21e, 0x30e, 0x6b, 0x366, 0x2cb, 0xd, 0x54, 0x1ee, 0x3d4, 0x1bf, 0x70, 0x8b, 0x270, 0x222, 0x40, 0xd4, 0x46, 0x358, 0x306, 0x275, 0x68, 0x2a0, 0x36b, 0x29f, 0x1e3, 0x380, 0x51, 0x3a4, 0x134, 0x200, 0x2a9, 0x230, 0x2f6, 0x6, 0x38c, 0x340, 0x12d, 0x36e, 0xd5, 0x303, 0x3f, 0x288, 0x11f, 0x1b2, 0x24, 0x165, 0x1a4, 0x39d, 0x30, 0x5f, 0x236, 0x17a, 0x346, 0x2a1, 0x2e, 0x1f8, 0x6d, 0xea, 0x18b, 0x120, 0x33a, 0x13b, 0xd7, 0x180, 0x2f8, 0x194, 0x3c2, 0x206, 0x125, 0x170, 0x3db, 0x368, 0x359, 0x43, 0x112, 0x1e6, 0x1ca, 0x2b1, 0x1b, 0x3ed, 0xbb, 0x22f, 0x14, 0x13a, 0x392, 0x2e7, 0x376, 0x2fe, 0x218, 0x82, 0x32b, 0x24b, 0x1a5, 0xd8, 0x357, 0x1d1, 0x15c, 0xa0, 0x1c2, 0x283, 0x187, 0x6b, 0x2c5, 0x33e, 0x68, 0x149, 0x1b7, 0xd5, 0x20f, 0xfc, 0x6d, 0x1d4, 0x225, 0x112, 0x3cc, 0x321, 0x1a5, 0x1b0, 0x147, 0x293, 0x1ed, 0x2d, 0x7c, 0x33d, 0x3e4, 0x3c0, 0x10a, 0x393, 0x344, 0x44, 0x3b6, 0x30d, 0x35a, 0x30a, 0x2c8, 0x396, 0x3d9, 0x3d6, 0x271, 0x2ce, 0x87, 0x2c2, 0x2ac, 0xf4, 0x58, 0x1f7, 0x17d, 0x317, 0x20a, 0x61, 0x3ff, 0x13, 0x3e6, 0x2cf, 0x204, 0x345, 0x2c7, 0x231, 0x366, 0x19f, 0x34, 0x2a0, 0x2df, 0x26e, 0x303, 0x7e, 0x232, 0xea, 0x316, 0x89, 0x1e6, 0x394, 0x2d6, 0xd8, 0x2a7, 0x34d, 0x2f2, 0x212, 0x3e, 0x39a, 0x1f2, 0x1e0, 0x85, 0x3cd, 0x1a2, 0x22, 0x1db, 0x382, 0x1ad, 0x185, 0x164, 0x1cb, 0x3e8, 0x1eb, 0x33c, 0x167, 0x247, 0x161, 0x156, 0x7a, 0x2c, 0x2ff, 0x2ba, 0x38f, 0x105, 0x234, 0x3fb, 0x20d, 0x1f3, 0x363, 0x102, 0x3a6, 0x367, 0x10f, 0x215, 0x358, 0x3, 0x311, 0x236, 0x1e1, 0x5, 0x13a, 0x253, 0x223, 0xf, 0x34e, 0x2fc, 0x26c, 0x11, 0x1db, 0x30d, 0x2bd, 0x33, 0x26d, 0x11e, 0x3ce, 0x55, 0x2be, 0x322, 0x5b, 0xff, 0x3cb, 0x16f, 0xed, 0x101, 0x54, 0x3b1, 0x137, 0x303, 0xfc, 0xda, 0x359, 0x10c, 0x104, 0x16e, 0x1e2, 0x314, 0x30c, 0x3b2, 0x226, 0x135, 0x11d, 0xdf, 0x263, 0x35f, 0x327, 0x161, 0x2ac, 0x1e8, 0x160, 0x3a3, 0x3fd, 0x238, 0x3a0, 0xec, 0xe, 0x241, 0xe9, 0x134, 0x12, 0x2ca, 0x13b, 0x35c, 0x36, 0x357, 0x34d, 0x1ed, 0x5a, 0x1f0, 0x1de, 0x237, 0xee, 0x210, 0x262, 0x250, 0x132, 0x239, 0x2af, 0x2f9, 0x356, 0x242, 0x3f8, 0x302, 0x1f3, 0x2cf, 0x1, 0x10f, 0x215, 0x358, 0x3, 0x311, 0x236, 0x1e1, 0x5, 0x13a, 0x253, 0x223, 0xf, 0x34e, 0x2fc, 0x26c, 0x11, 0x1db, 0x30d, 0x2bd, 0x33, 0x26d, 0x21e, 0x46, 0x2f6, 0x30, 0x2f8, 0xbb, 0x15c, 0x109, 0x7c, 0xef, 0x237, 0x1dc, 0x52, 0x334, 0x141, 0x201, 0x37b, 0x17d, 0x47, 0xe8, 0x76, 0xe, 0x8b, 0x3a4, 0x1b2, 0x120, 0x1e6, 0x24b, 0x133, 0x265, 0x2e8, 0x113, 0x135, 0x23a, 0x37c, 0x33c, 0x195, 0x31, 0xe6, 0xfd, 0x3aa, 0x139, 0x284, 0x54, 0x36b, 0xd5, 0x2e, 0x3db, 0x376, 0x3dd, 0x329, 0x249, 0x106, 0x2e9, 0x30d, 0x173, 0xcc, 0x34c, 0x1c4, 0x12e, 0x16d, 0x1ef, 0x81, 0x345, 0x30e, 0x358, 0x6, 0x5f, 0x194, 0x22f, 0xa0, 0x20b, 0x39a, 0x3c1, 0x23f, 0x108, 0x262, 0xa9, 0xc1, 0x1ec, 0x2aa, 0x38f, 0x1d, 0x308, 0x307, 0x192, 0x270, 0x134, 0x24, 0x33a, 0x1ca, 0x1a5, 0x2c9, 0x5d, 0x1a1, 0x2a3, 0x145, 0x26b, 0x263, 0x2b7, 0x87, 0x31a, 0x29a, 0x177, 0xa6, 0x254, 0x20e, 0x1ee, 0x29f, 0x303, 0x1f8, 0x368, 0x2fe, 0xe4, 0x35, 0x118, 0x39d, 0x300, 0x3af, 0x293, 0x373, 0x352, 0x1ce, 0x39e, 0x35f, 0x87, 0x23d, 0x27a, 0x3aa, 0x272, 0x202, 0x2a0, 0x2d5, 0x296, 0x392, 0x223, 0x3c, 0x85, 0x257, 0x4a, 0x99, 0x7b, 0x155, 0x38f, 0x3a, 0x3b, 0xe, 0x116, 0x28b, 0x18b, 0x224, 0xb7, 0x3c4, 0x96, 0x158, 0x2c6, 0x199, 0x11e, 0x323, 0x159, 0x2f3, 0x81, 0x283, 0x23, 0x2f6, 0x60, 0x3f2, 0x1d1, 0x1ed, 0x168, 0x33f, 0x375, 0x3ec, 0x397, 0x2c2, 0x14d, 0x177, 0x14c, 0x142, 0x54, 0x2df, 0x354, 0x170, 0x1c7, 0x203, 0x295, 0x3cd, 0x10b, 0x92, 0x18c, 0x2af, 0x3f6, 0x105, 0x184, 0x307, 0x324, 0x1d2, 0x1b2, 0x240, 0x391, 0x27c, 0x314, 0x2b, 0x35e, 0xb2, 0x325, 0x1e7, 0xaa, 0x1dd, 0x91, 0x1d3, 0x187, 0x358, 0xc, 0x17c, 0xbb, 0x2b8, 0x2d, 0x3e0, 0x2eb, 0x279, 0x3f5, 0x15a, 0x2ac, 0x3a9, 0x22d, 0x12a, 0x20e, 0x6a, 0x69, 0xd7, 0x6c, 0x115, 0x1a1, 0x29e, 0x7d, 0x3d6, 0x351, 0x322, 0x2d8, 0x3b7, 0xd6, 0x6, 0x17c, 0x176, 0x2f2, 0x168, 0x277, 0x1cf, 0x35f, 0x10e, 0xe6, 0x3f4, 0x2de, 0x2cb, 0x1a0, 0x2f4, 0x14, 0x301, 0x33d, 0x237, 0x379, 0x129, 0xab, 0x3d0, 0x22d, 0x254, 0x2a, 0x2df, 0x2a1, 0x1c9, 0x223, 0x78, 0x214, 0x29c, 0xa9, 0x304, 0x2ff, 0x3fa, 0xf2, 0xf5, 0x1e3, 0xfc, 0x2d9, 0x3dd, 0xbf, 0xd1, 0x110, 0x63, 0x353, 0x3f6, 0x20a, 0x219, 0xe, 0x22c, 0x23e, 0x43, 0x208, 0x2cd, 0xdc, 0x382, 0x2e6, 0x269, 0x14a, 0x3f8, 0x26, 0x27, 0x4d, 0x24, 0xf3, 0x9f, 0x18a, 0x2b, 0x2b5, 0x2c8, 0x11e, 0x24f, 0x16d, 0x3b5, 0x2, 0xd4, 0xd2, 0x1ae, 0xd8, 0x22a, 0x342, 0x135, 0xfa, 0x3a5, 0x2ab, 0x24d, 0x1b9, 0x367, 0x1ac, 0xc, 0x2f8, 0x2ec, 0x1ed, 0x2d0, 0xe7, 0x39e, 0x2b7, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x1a8, 0x299, 0x1a5, 0xc3, 0x1af, 0x2c8, 0x71, 0xb1, 0x3e6, 0x28c, 0x12, 0x1e6, 0xf1, 0x12c, 0x1ad, 0x198, 0x14a, 0x3fb, 0x260, 0x1d2, 0x18b, 0x104, 0x193, 0x2e9, 0xbc, 0x1bc, 0x286, 0x219, 0x38, 0x288, 0x2bb, 0x390, 0x26c, 0x220, 0x318, 0x2aa, 0x8e, 0x13f, 0x1e3, 0x3f0, 0x1c3, 0x295, 0x257, 0x250, 0x201, 0x3d5, 0x3a7, 0x1ee, 0x1aa, 0x1c9, 0x9e, 0x389, 0x29, 0x196, 0x1e8, 0x53, 0x284, 0x149, 0x103, 0x1c2, 0x33d, 0xce, 0x3f5, 0x2c2, 0x27a, 0x16f, 0x19f, 0x11b, 0x22f, 0x212, 0x39b, 0x1cf, 0x167, 0xc4, 0x1fe, 0x31c, 0x3, 0x2f8, 0x3a2, 0x2ef, 0x145, 0x2f1, 0x351, 0x93, 0x1d3, 0x23, 0x39d, 0x36, 0x22a, 0x113, 0x374, 0x2f7, 0x2a8, 0x3de, 0x4, 0x2a9, 0x276, 0x29d, 0x30c, 0x2b5, 0x332, 0x1c4, 0x2c4, 0x383, 0x222, 0x48, 0x391, 0x3c4, 0xb9, 0x2bd, 0x269, 0x121, 0x3f7, 0x192, 0x350, 0x276, 0x133, 0x2b, 0x185, 0x34c, 0xfe, 0x4c, 0x270, 0x2c1, 0x104, 0x326, 0x3b6, 0x1e9, 0x3f6, 0x74, 0x369, 0x3f, 0x1bb, 0x1a7, 0x32f, 0x250, 0xb, 0x34f, 0x107, 0x2df, 0x125, 0x2bc, 0x38b, 0x2fb, 0x2b4, 0x13d, 0x16f, 0x33e, 0x65, 0x15c, 0x168, 0x39c, 0x33c, 0x2cc, 0x1b9, 0x30e, 0x3ca, 0x36, 0x5d, 0x45, 0x396, 0x323, 0x1bd, 0x255, 0x200, 0xf3, 0xf1, 0x258, 0x2bd, 0xdb, 0x8d, 0x387, 0x116, 0xea, 0x72, 0x9b, 0x110, 0x318, 0x15d, 0x238, 0x1ea, 0x20f, 0x2e7, 0x3c, 0x42, 0x334, 0x7a, 0x22d, 0x284, 0x292, 0x5, 0x20b, 0x3bc, 0x1f6, 0x87, 0x398, 0x267, 0x306, 0x17c, 0x3a2, 0x1d7, 0x11d, 0x3a5, 0x175, 0x244, 0x35, 0x1a4, 0x2d6, 0xc3, 0x35e, 0x332, 0x388, 0x302, 0x27, 0x268, 0x112, 0x1b1, 0x1b8, 0x5e, 0x1bc, 0x105, 0x76, 0x1c0, 0xda, 0x3dd, 0x1f1, 0x25, 0xc1, 0x2a9, 0x1ca, 0x18a, 0x2b0, 0xcc, 0x294, 0x3e7, 0x8b, 0xea, 0xe4, 0x26c, 0x92, 0x1ec, 0x3fa, 0x33b, 0xd5, 0x392, 0xf9, 0x1dc, 0xad, 0x29a, 0x16f, 0x275, 0x194, 0x2f2, 0x2ad, 0x37c, 0x2ab, 0x91, 0x21e, 0x1a4, 0x1a5, 0x30c, 0x2c6, 0x34c, 0x1fc, 0x130, 0x3a4, 0x43, 0xc8, 0x22, 0xc6, 0x2aa, 0x238, 0x3d4, 0x2e, 0x315, 0x3c0, 0x52, 0xab, 0x177, 0x1da, 0x340, 0x22f, 0x5a, 0x1ce, 0x33c, 0x191, 0x2ed, 0x46, 0xd7, 0x2c9, 0x36d, 0x2c8, 0x1c4, 0x302, 0x4e, 0x1b2, 0x82, 0x326, 0x365, 0x3ad, 0x38f, 0x349, 0x1e3, 0x3db, 0xf, 0x21, 0x334, 0xf4, 0xa6, 0xd, 0x17a, 0xa0, 0x3e0, 0x1cf, 0x195, 0x5b, 0x367, 0x2f6, 0x1b, 0x5d, 0x8a, 0x243, 0x12e, 0x3e6, 0x222, 0x120, 0x16e, 0xdc, 0x5e, 0x378, 0x1d, 0x3b0, 0x3f, 0x376, 0x295, 0x14e, 0x141, 0x160, 0x254, 0x2a0, 0x206, 0x20b, 0x15b, 0x321, 0x4b, 0x35a, 0x1b6, 0x61, 0x1c, 0x232, 0x3dd, 0x3cd, 0x250, 0x2c, 0x95, 0x150, 0x206, 0x1f, 0x1df, 0x2b7, 0x310, 0x3b7, 0x2f6, 0x36, 0x174, 0x59, 0x71, 0x181, 0x4e, 0x364, 0x208, 0x106, 0x235, 0x155, 0x238, 0x3a1, 0xb8, 0x9e, 0x77, 0x252, 0x29a, 0x2de, 0x1c6, 0xbb, 0x373, 0x11d, 0x28f, 0x37d, 0x4, 0x165, 0x9f, 0x12c, 0x173, 0x2d1, 0x184, 0x70, 0xda, 0x36f, 0x32f, 0x152, 0xb0, 0x254, 0x149, 0xa, 0x7c, 0x375, 0x2ce, 0x5b, 0x2c7, 0x3ca, 0xd8, 0x1d9, 0x164, 0x1c4, 0x20d, 0x138, 0x18b, 0x32, 0x11, 0xc6, 0x15d, 0xf2, 0x29f, 0x2e0, 0x278, 0x1dc, 0x15a, 0x27a, 0x36a, 0x311, 0x2ec, 0x1d7, 0x7d, 0x22e, 0x1ef, 0x10, 0x19d, 0x27c, 0xb9, 0x1c5, 0x356, 0x219, 0x1c0, 0x368, 0x1a7, 0xa7, 0x141, 0x2c0, 0x142, 0x12d, 0x28, 0x1f0, 0x1cf, 0x32a, 0x16c, 0x30e, 0x2b6, 0x9f, 0x258, 0x1c5, 0x2a5, 0x76, 0x21b, 0x2e5, 0x85, 0x19a, 0x1e8, 0x139, 0x1a0, 0x57, 0x2d0, 0x1be, 0x15f, 0x81, 0x350, 0x394, 0x4b, 0x2bd, 0x2d1, 0x308, 0x1c0, 0x2d9, 0x295, 0x131, 0x3d, 0xa6, 0x34, 0x38d, 0x5a, 0x331, 0x3ac, 0x91, 0x6a, 0x276, 0x18a, 0x2d2, 0xdb, 0x61, 0x38, 0xda, 0x2d7, 0xa7, 0x282, 0x312, 0x202, 0x2f4, 0x109, 0xe7, 0x271, 0x93, 0x10f, 0x348, 0x133, 0x158, 0x198, 0x8d, 0x7, 0x119, 0x3dd, 0x393, 0x152, 0x160, 0x142, 0x25a, 0xa0, 0x39b, 0xcf, 0x191, 0x3a6, 0x69, 0x1a5, 0x2b, 0x33, 0x294, 0x387, 0xa2, 0x2fe, 0x1f1, 0x128, 0x2c, 0x12a, 0x149, 0x14, 0x1f0, 0x39e, 0xb3, 0x372, 0x8c, 0x2b1, 0x186, 0x185, 0x256, 0x3f7, 0x116, 0x359, 0xbf, 0x25, 0x201, 0x127, 0xa8, 0x206, 0x3e, 0x375, 0x195, 0x16c, 0x215, 0xd7, 0x336, 0x2b5, 0x34c, 0x165, 0x27c, 0x2e4, 0x6f, 0x1d, 0x1bf, 0x3db, 0x78, 0x52, 0x151, 0x16f, 0x38c, 0x1d1, 0x2a3, 0x3bb, 0x16d, 0x146, 0x120, 0x362, 0x365, 0x157, 0x238, 0x29f, 0x392, 0x3c1, 0x3f5, 0xe6, 0x18e, 0x30, 0x28e, 0x8a, 0x23c, 0x302, 0x270, 0x43, 0x249, 0x92, 0x37b, 0x347, 0x36e, 0x1c2, 0x371, 0x2b7, 0x5b, 0x30e, 0xd7, 0x265, 0x2c6, 0x256, 0x3e7, 0x51, 0x2fe, 0x3e2, 0xa9, 0x160, 0x284, 0x17a, 0x109, 0x1ce, 0x1d6, 0x91, 0xd4, 0x1ca, 0x4b, 0x173, 0x356, 0x76, 0x3f, 0x386, 0x21, 0x196, 0x177, 0x2cb, 0x194, 0x3bd, 0x23a, 0x55, 0x363, 0x200, 0x32b, 0xdc, 0x2f0, 0x38f, 0x27e, 0x2e, 0x9e, 0x1dc, 0x161, 0x3e1, 0x306, 0x3ed, 0x1a1, 0x1cb, 0x12e, 0x30f, 0x1b2, 0x19, 0x22, 0x239, 0x3fa, 0x1ee, 0x125, 0x39a, 0xfb, 0x31, 0x3eb, 0x2f6, 0xd8, 0x36d, 0x26d, 0x1fc, 0x192, 0xea, 0x329, 0x2ca, 0x1e2, 0x30d, 0x2f9, 0x3a0, 0x303, 0x223, 0xee, 0x161, 0x3cb, 0x3, 0x357, 0x226, 0x11e, 0x302, 0xe9, 0x10c, 0x26c, 0x132, 0x3a3, 0x54, 0x5, 0x1f0, 0x263, 0x322, 0x10f, 0x13b, 0x314, 0x2bd, 0x356, 0xec, 0xfc, 0xf, 0x210, 0x2ac, 0x16f, 0x311, 0x34d, 0x135, 0x3ce, 0x1f3, 0x134, 0x104, 0x11, 0x239, 0x3fd, 0x3b1, 0x13a, 0x1de, 0x35f, 0x5b, 0x215, 0x35c, 0x30c, 0x33, 0x242, 0xe, 0xda, 0x34e, 0x262, 0x1e8, 0xed, 0x236, 0x1ed, 0x11d, 0x55, 0x2cf, 0x12, 0x16e, 0x1db, 0x2af, 0x238, 0x137, 0x253, 0x237, 0x327, 0xff, 0x358, 0x36, 0x3b2, 0x26d, 0x3f8, 0x241, 0x359, 0x2fc, 0x250, 0x160, 0x101, 0x1e1, 0x5a, 0xdf, 0x2be, 0x1, 0x2ca, 0x1e2, 0x30d, 0x2f9, 0x3a0, 0x303, 0x223, 0xee, 0x161, 0x3cb, 0x3, 0x357, 0x226, 0x11e, 0x302, 0xe9, 0x10c, 0x26c, 0x132, 0x3a3, 0x54, 0x19d, 0x381, 0x5e, 0x3c3, 0xf5, 0x170, 0x3e4, 0x3e3, 0x339, 0x1ac, 0x36, 0x36d, 0x1a6, 0x3ff, 0x51, 0x3ea, 0x257, 0x21a, 0x298, 0x289, 0x2f2, 0x11d, 0xaa, 0x32e, 0x90, 0x2cd, 0x31e, 0x2ba, 0x27f, 0x125, 0x273, 0x3ab, 0x5b, 0x23, 0x16b, 0x56, 0x330, 0xc2, 0x380, 0x1c3, 0x42, 0xab, 0x2b3, 0x311, 0x293, 0xdd, 0x24f, 0x30f, 0x2c1, 0x190, 0x92, 0x1f7, 0x15, 0x206, 0x1f0, 0xcf, 0x93, 0x6a, 0x394, 0x258, 0x233, 0x3a, 0x1e3, 0x38e, 0x77, 0x161, 0x39f, 0xc, 0x28e, 0x228, 0x388, 0x130, 0x75, 0x25b, 0x94, 0xb0, 0x101, 0x3c2, 0x168, 0x2f1, 0x3ba, 0x20, 0x3cc, 0xdc, 0x3d2, 0x8e, 0x29f, 0x253, 0x67, 0x87, 0x3f1, 0x1e5, 0x2c9, 0x163, 0xa5, 0x307, 0x232, 0x1a7, 0x262, 0x3d0, 0x3b4, 0x194, 0x2ef, 0x3e8, 0x16d, 0x111, 0x224, 0x106, 0x318, 0x3fd, 0x36b, 0xe1, 0x2eb, 0x195, 0x33a, 0x21f, 0x2f0, 0x47, 0x29f, 0xaf, 0x19c, 0x31, 0x367, 0xd7, 0x30c, 0xcc, 0x61, 0x380, 0x386, 0x108, 0x151, 0x36a, 0x2f8, 0x1a1, 0x243, 0x302, 0x3a4, 0xe4, 0x216, 0x2c, 0x284, 0x3c2, 0x2d0, 0x3d6, 0x1ef, 0x200, 0x16e, 0x365, 0x2aa, 0x33b, 0x125, 0xef, 0x2b7, 0x2d8, 0x230, 0x133, 0x1ad, 0x356, 0x3b0, 0x3db, 0x3c0, 0xad, 0x3e1, 0x6, 0x28e, 0x59, 0x23b, 0x192, 0x359, 0x3e2, 0x141, 0xa6, 0x340, 0x2f2, 0x23a, 0x2a8, 0x146, 0x112, 0x106, 0x239, 0x3ef, 0x36e, 0x20b, 0x1cf, 0x191, 0x21e, 0x1ca, 0x258, 0x6f, 0xe8, 0x303, 0x9e, 0x2fb, 0xe6, 0x6b, 0x1b, 0x36d, 0x34c, 0x3e7, 0x288, 0x2d7, 0x262, 0x3a9, 0x2cb, 0xbb, 0x2a3, 0x1e7, 0x3e6, 0x1b2, 0xc8, 0x92, 0x3ee, 0x54, 0x14, 0x33f, 0x1d6, 0x81, 0x165, 0x3c4, 0x5e, 0x38f, 0x3d4, 0x392, 0x237, 0x87, 0x3eb, 0x39d, 0x265, 0x27d, 0x6e, 0x3ad, 0x79, 0x354, 0x39a, 0x3ab, 0x16c, 0x230, 0x266, 0x2bd, 0x286, 0x37e, 0x38e, 0x1dc, 0x23d, 0x231, 0x1b, 0x2d3, 0x12b, 0x307, 0xda, 0x246, 0x196, 0x35d, 0x22b, 0xb5, 0x396, 0x181, 0x3a4, 0x1c8, 0x4a, 0x160, 0x1a, 0xae, 0x145, 0xaa, 0xa3, 0x112, 0x20c, 0xf6, 0x347, 0x285, 0x1f0, 0x33c, 0x122, 0x2b6, 0x3c4, 0xbc, 0x227, 0x29f, 0x15e, 0x279, 0x188, 0x215, 0x2d6, 0x2b0, 0x2d1, 0x1d8, 0x3db, 0x389, 0x2b4, 0x337, 0x60, 0x174, 0x26d, 0x3ff, 0x144, 0x2d7, 0xcd, 0x2bf, 0x275, 0x3a2, 0xdd, 0x12e, 0x9c, 0x10c, 0x344, 0xb, 0x142, 0x3c2, 0x1a9, 0x343, 0x363, 0x48, 0x193, 0xc6, 0x3fd, 0x1b7, 0x20b, 0x39e, 0x24d, 0xd4, 0x9f, 0x382, 0x3f6, 0xf5, 0x1c9, 0x237, 0x10e, 0x3b7, 0xd7, 0x211, 0x330, 0x308, 0x7e, 0x3c, 0x290, 0x1fa, 0x3, 0x28e, 0xb2, 0xfe, 0x8b, 0xf3, 0x1b8, 0x157, 0x399, 0x24a, 0x371, 0x25d, 0x283, 0x1ca, 0x172, 0x2f9, 0x27e, 0x1c9, 0x67, 0x31, 0x187, 0x16b, 0x2b0, 0x1ab, 0x369, 0x2e7, 0xee, 0x23d, 0x6b, 0x6c, 0x2b5, 0x294, 0x38, 0x2e5, 0x108, 0x14d, 0x2c5, 0x357, 0x228, 0x7f, 0x8b, 0x3ea, 0x29c, 0x3a9, 0x33e, 0x3a2, 0x1ba, 0xb1, 0xe9, 0xe4, 0x4a, 0x2c0, 0x68, 0x179, 0x7d, 0x16d, 0x9a, 0x32, 0x92, 0x3a3, 0x149, 0x109, 0x1be, 0x37d, 0x200, 0x1b1, 0x235, 0x3fa, 0x1b7, 0x1f, 0x263, 0x24c, 0x15b, 0x3c4, 0x178, 0x8e, 0xd5, 0x1cd, 0x3ab, 0x2d8, 0xd2, 0x314, 0x38a, 0x74, 0x20f, 0xf9, 0x3cf, 0x3fc, 0x39d, 0x186, 0x198, 0x308, 0xfc, 0xf0, 0xad, 0x39f, 0x60, 0x2e8, 0x1a6, 0x3c7, 0x6d, 0x246, 0x32c, 0x16f, 0x17c, 0x342, 0x23c, 0x98, 0x1d4, 0x3e2, 0x10d, 0x272, 0x194, 0x355, 0x3ce, 0x30f, 0x225, 0xd1, 0x201, 0x1e6, 0x2e9, 0x2aa, 0x1ee, 0x1c2, 0x1cf, 0x93, 0x2a9, 0x3c4, 0x2f0, 0x238, 0x2a1, 0xef, 0x195, 0x345, 0x1ca, 0x2e4, 0x3f6, 0x3d4, 0xaf, 0xfb, 0x5b, 0x230, 0x18a, 0x38a, 0xe8, 0x2e, 0x3c1, 0x87, 0x367, 0x2b1, 0x2b0, 0x356, 0x1bf, 0x315, 0x2fb, 0x339, 0x2f6, 0x265, 0xcc, 0x308, 0x1f8, 0x3c0, 0x161, 0x18e, 0x1b, 0x35e, 0x294, 0x70, 0x386, 0x52, 0xfd, 0x6, 0x5d, 0x26d, 0x3e7, 0x6d, 0x85, 0xab, 0x36a, 0x3ed, 0x8a, 0x23b, 0x8b, 0x3dd, 0x262, 0x177, 0x38c, 0xb5, 0x243, 0x26, 0xea, 0x3e2, 0x21a, 0x1da, 0xbb, 0x135, 0x12e, 0x270, 0xe4, 0x94, 0x312, 0x340, 0x3bd, 0x3bb, 0x3e6, 0x18b, 0x26c, 0x201, 0x284, 0x22f, 0x145, 0x2a8, 0x222, 0x19, 0x92, 0x34f, 0x12d, 0x5a, 0x3d6, 0x363, 0x120, 0x106, 0x1ec, 0x20e, 0x14, 0x1ce, 0x175, 0x40, 0x16e, 0x31e, 0x3fa, 0x36e, 0x7c, 0x3cc, 0x3b6, 0x17d, 0x2df, 0x3e, 0x33c, 0x102, 0xf3, 0x2e9, 0x15d, 0x3b1, 0x20b, 0xcf, 0x244, 0x33a, 0x1b8, 0x155, 0x1ee, 0x384, 0x335, 0x91, 0x2ca, 0x6e, 0x157, 0x27f, 0xe1, 0x1cf, 0x126, 0x2b6, 0x21f, 0x353, 0x399, 0x13a, 0x375, 0x24d, 0x2a9, 0x381, 0x3d2, 0x1e4, 0x24a, 0x1df, 0x191, 0x1a8, 0x1e2, 0x2f0, 0x79, 0x296, 0x371, 0x166, 0x6a, 0x27c, 0xbc, 0x11c, 0x2a1, 0x1de, 0x25d, 0x21e, 0x9f, 0x2f, 0x47, 0x1aa, 0x273, 0x195, 0x283, 0x321, 0x30d, 0x317, 0x26e, 0x39a, 0x167, 0x3a6, 0x1ca, 0x1c1, 0x3c3, 0x29f, 0x2e2, 0x35f, 0x2ed, 0x276, 0x172, 0x3f6, 0x3a1, 0x2bc, 0x3d1, 0x1b9, 0x299, 0x258, 0x2f9, 0x1ea, 0xaf, 0x1f6, 0x16c, 0x1a4, 0x96, 0x1bc, 0x27e, 0x32d, 0x279, 0x5b, 0x69, 0x221, 0x6f, 0x29b, 0x1c9, 0x19c, 0x310, 0x118, 0x18a, 0x31d, 0x3a0, 0x170, 0x67, 0xc4, 0x46, 0x391, 0x2c3, 0x3fa, 0x1a3, 0x3c9, 0x2ab, 0x20, 0x2dc, 0xc6, 0x3a7, 0x5, 0x1ce, 0x1dd, 0x9, 0x326, 0xf6, 0x15, 0xa0, 0x1be, 0x3de, 0x120, 0x11, 0x2ff, 0x2a0, 0x2d, 0x3a5, 0x32e, 0x41, 0x220, 0x34f, 0xbd, 0x1a9, 0x55, 0x111, 0x32, 0x99, 0x12a, 0x38d, 0x145, 0x2b2, 0x268, 0x249, 0x304, 0x101, 0x15c, 0xfa, 0x2fd, 0x18b, 0x1a2, 0x58, 0x68, 0x3da, 0x37f, 0x30f, 0x10c, 0x25, 0x312, 0x11b, 0x3ae, 0x323, 0x138, 0x1c8, 0xa9, 0x298, 0x328, 0x135, 0xb1, 0x341, 0x17e, 0x10d, 0x3b4, 0x1d1, 0x2e1, 0x20d, 0xea, 0x393, 0x1e8, 0x275, 0x25e, 0x8f, 0x130, 0x17f, 0x29c, 0x177, 0x22b, 0x342, 0x1c4, 0x241, 0x3b3, 0x334, 0x2b3, 0x1f9, 0x8a, 0xfe, 0xa2, 0x295, 0x251, 0x2dd, 0x357, 0x164, 0x3ff, 0x6d, 0x214, 0x2a2, 0x306, 0x22a, 0xd3, 0x307, 0x1bb, 0x210, 0xfd, 0x18, 0x1d9, 0x256, 0x32b, 0x31e, 0x3ef, 0x206, 0x1ce, 0x3ba, 0x24, 0x106, 0x37b, 0x2a0, 0x5a, 0x28f, 0x146, 0x19, 0x99, 0x254, 0x22f, 0x23a, 0x37a, 0x18b, 0x344, 0x160, 0x340, 0x1d7, 0x323, 0x270, 0x329, 0x141, 0x1da, 0x1d1, 0x1cb, 0x26, 0x359, 0x14e, 0x177, 0x5f, 0x113, 0x23b, 0x51, 0x295, 0xab, 0x366, 0x28e, 0x26d, 0x307, 0x376, 0x52, 0x3e1, 0x180, 0x35e, 0x8d, 0x3f, 0x3c0, 0x31a, 0x358, 0x265, 0x269, 0x3b0, 0x315, 0x3f5, 0x3eb, 0x2b1, 0x1ad, 0x1d, 0x2e, 0x237, 0x188, 0x230, 0x4b, 0x378, 0x3d4, 0x171, 0x2b7, 0x345, 0x24b, 0x5e, 0x238, 0x125, 0x3be, 0x93, 0x165, 0xdc, 0x2aa, 0x36b, 0x7c, 0x1d6, 0x8, 0x16e, 0xc6, 0x347, 0x14, 0x26b, 0x1ef, 0x120, 0x22, 0x3ee, 0x12d, 0x2d0, 0x55, 0x222, 0xc8, 0xc1, 0x284, 0x15c, 0x1f4, 0x3e6, 0x43, 0x216, 0x312, 0x236, 0x2a3, 0x12e, 0x3a4, 0x17e, 0x25f, 0x63, 0x347, 0x28, 0x1be, 0x363, 0x224, 0x49, 0x24e, 0x38d, 0x11d, 0x37a, 0x316, 0x10b, 0x312, 0x65, 0x29e, 0x162, 0x23e, 0x393, 0x3a9, 0x311, 0x28d, 0x23b, 0xa2, 0x246, 0x151, 0x205, 0x174, 0x256, 0xe0, 0x3c, 0x161, 0xd6, 0x336, 0x269, 0x369, 0x4f, 0x397, 0x2c7, 0x29d, 0x38a, 0x29b, 0x253, 0x3d1, 0x1d3, 0x321, 0x5e, 0x79, 0x9d, 0x1cf, 0x122, 0xf3, 0x365, 0x3fd, 0x103, 0x1ce, 0x37d, 0x90, 0x22, 0x3d5, 0xbd, 0x2ad, 0x159, 0xd9, 0x26c, 0x58, 0x1a0, 0x1d7, 0x24f, 0x1d2, 0x17e, 0x3d, 0x33e, 0xb5, 0x71, 0x241, 0x2d7, 0x32c, 0x1b3, 0x28e, 0xd3, 0x7, 0x386, 0x129, 0xc7, 0xd8, 0x33, 0x3b, 0x2e7, 0x1ff, 0x3f1, 0x2b1, 0x35a, 0x74, 0x170, 0x338, 0x16c, 0x13b, 0x1c1, 0x227, 0x2a1, 0x2eb, 0x24d, 0x165, 0x1b8, 0x2ba, 0x36e, 0x3c9, 0x2be, 0x200, 0x245, 0x3b9, 0x2a0, 0xb7, 0x18c, 0x20e, 0x280, 0x3a5, 0x146, 0x64, 0x182, 0xd, 0x3da, 0x3ce, 0x270, 0xbf, 0x3d, 0x275, 0x2d4, 0x388, 0x51, 0x246, 0x2a2, 0x6, 0x3b2, 0x121, 0x3f, 0x31b, 0x1cc, 0x39d, 0x158, 0x105, 0x2e, 0xce, 0xb6, 0x13b, 0x382, 0x8e, 0x125, 0x2e3, 0x122, 0x1e6, 0x18f, 0x3d7, 0x14, 0x1be, 0x2cf, 0x82, 0x248, 0xa1, 0x15c, 0x3d9, 0x217, 0xe4, 0x2a4, 0x3b4, 0x293, 0x11e, 0x324, 0x2d7, 0x251, 0x2c5, 0x5d, 0x12b, 0xe0, 0x78, 0x18d, 0x2b9, 0x30c, 0x1ab, 0x3c6, 0x3c1, 0xc4, 0x69, 0x258, 0x3c3, 0x1aa, 0x371, 0x24d, 0x2ca, 0x2e9, 0x1fd, 0x285, 0x1ce, 0x2f3, 0x240, 0x110, 0x127, 0x38d, 0x23a, 0x1f3, 0x86, 0x94, 0x298, 0x176, 0x1cb, 0x98, 0x1f5, 0x334, 0x1b5, 0x2a7, 0x26d, 0x7, 0x305, 0xad, 0x231, 0x19b, 0x269, 0x2db, 0x13c, 0x87, 0x23, 0x314, 0x378, 0x34b, 0x33d, 0xb3, 0x16e, 0x239, 0x54, 0x5a, 0x55, 0x134, 0x26c, 0x160, 0x236, 0x135, 0x302, 0x359, 0x262, 0x16f, 0x357, 0x26d, 0xe, 0xf, 0x161, 0x358, 0x30c, 0x356, 0x303, 0x237, 0x5b, 0x13b, 0x30d, 0x238, 0x13a, 0x263, 0x1, 0x16e, 0x239, 0x54, 0x5a, 0x55, 0x134, 0x26c, 0x160, 0x236, 0x135, 0x302, 0x359, 0x262, 0x16f, 0x357, 0x26d, 0xe, 0xf, 0x161, 0x358, 0x30c, 0x356, 0x303, 0x237, 0x5b, 0x13b, 0x30d, 0x238, 0x13a, 0x263, 0x1, 0x16e, 0x239, 0x54, 0x5a, 0x55, 0x134, 0x26c, 0x160, 0x236, 0x135, 0x302, 0x359, 0x262, 0x16f, 0x357, 0x26d, 0xe, 0xf, 0x161, 0x358, 0x30c, 0x356, 0x303, 0x237, 0x5b, 0x13b, 0x30d, 0x238, 0x13a, 0x263, 0x1, 0x16e, 0x239, 0x54, 0x5a, 0x55, 0x134, 0x26c, 0x160, 0x236, 0x135, 0x302, 0x359, 0x262, 0x16f, 0x357, 0x26d, 0xe, 0xf, 0x161, 0x358, 0x30c, 0x2dc, 0xf6, 0x2a0, 0x1a9, 0x2b2, 0x18b, 0x25, 0x298, 0x1d1, 0x8f, 0x241, 0x295, 0x2a2, 0x18, 0x35e, 0xc2, 0x377, 0x3f5, 0x2c7, 0xc5, 0x378, 0x137, 0x3bc, 0x93, 0x27d, 0x18f, 0x347, 0x140, 0x343, 0x222, 0x9b, 0xb0, 0x236, 0x26a, 0x13, 0x2fe, 0x261, 0x1b3, 0x5d, 0xa5, 0x21b, 0x23f, 0x27b, 0x35c, 0x173, 0x29b, 0x2bc, 0x195, 0x1a8, 0x6e, 0x17d, 0x285, 0x331, 0x363, 0x104, 0x264, 0xd, 0x373, 0x97, 0x11f, 0x257, 0x1d5, 0x3ed, 0x199, 0x7, 0xf, 0x2c2, 0x17b, 0x56, 0x105, 0xb8, 0xfb, 0x1d3, 0x13e, 0x3ad, 0x3dc, 0x1f0, 0x175, 0x48, 0x88, 0x24e, 0x57, 0x3d9, 0x4e, 0x25b, 0x7a, 0x38c, 0x226, 0x3f9, 0x368, 0xa4, 0xc7, 0x2c9, 0xdb, 0x2f5, 0x3c1, 0x310, 0x299, 0x30d, 0x79, 0xe1, 0x33c, 0x10, 0x193, 0x37b, 0x25a, 0x2a6, 0x37a, 0x86, 0x250, 0x1da, 0x12f, 0xe2, 0x51, 0x1b1, 0x3d8, 0x12d, 0x2a6, 0x2fd, 0x218, 0x2a4, 0x19f, 0x1a1, 0xfe, 0xda, 0x52, 0xc7, 0x19b, 0x36c, 0x385, 0x67, 0x2d8, 0x321, 0x1e9, 0x1ee, 0x1f0, 0x2ea, 0x120, 0x49, 0xa1, 0x2f2, 0x395, 0x341, 0x32f, 0x1d5, 0x3d3, 0x26d, 0x38, 0xf0, 0xe6, 0x26f, 0x35a, 0x349, 0x2bc, 0x32a, 0x2a9, 0x370, 0x3fd, 0x14, 0x1eb, 0x28c, 0x249, 0xb0, 0x65, 0x1ba, 0x98, 0x3b3, 0xab, 0x3, 0x2d3, 0x61, 0x377, 0x3e3, 0x30e, 0x221, 0x3e5, 0x2a1, 0x2e3, 0x102, 0x16e, 0xf6, 0x149, 0x2ad, 0x1bd, 0x86, 0xa9, 0x361, 0x16a, 0x23b, 0x232, 0x210, 0x337, 0x360, 0xdb, 0x1e3, 0x31f, 0xb6, 0x1ca, 0x178, 0x27f, 0x7c, 0x2be, 0x48, 0x110, 0x12a, 0x2b8, 0x1e7, 0x1d2, 0x3cd, 0x177, 0x3f2, 0x199, 0xe, 0x3c, 0x23d, 0x39d, 0x2d2, 0x1d0, 0xaf, 0x2ce, 0x1a8, 0xdc, 0x1fd, 0x5, 0x37c, 0xa3, 0x190, 0x2c, 0x362, 0x37b, 0x17a, 0x23a, 0x30f, 0x329, 0xf4, 0x5f, 0x59, 0x307, 0xf, 0x31a, 0x39d, 0x1ad, 0x349, 0x171, 0xb3, 0x165, 0x365, 0x347, 0x109, 0x55, 0x1b2, 0x216, 0x139, 0x293, 0x1c4, 0x288, 0x108, 0x337, 0x2c9, 0x36c, 0x303, 0x19c, 0x2ed, 0x27c, 0x157, 0x36e, 0x1ce, 0x363, 0x19, 0x201, 0x340, 0x135, 0x26, 0x3dd, 0xab, 0x6, 0x35e, 0x308, 0x315, 0x87, 0x230, 0x2e4, 0x238, 0x1c2, 0x1d6, 0x200, 0x22, 0x24e, 0x15c, 0x1e7, 0x3a4, 0x32f, 0x3aa, 0x357, 0x34c, 0x380, 0x23f, 0x1fe, 0x1a5, 0x6f, 0x29f, 0x371, 0x91, 0x32b, 0x239, 0x2a0, 0x2ad, 0x37a, 0x218, 0x141, 0x275, 0x113, 0x3fb, 0x376, 0xad, 0x358, 0x56, 0x1d, 0x392, 0x2b7, 0xd4, 0xdc, 0x3fa, 0x14, 0x3d6, 0x222, 0x26c, 0x312, 0xbb, 0x243, 0x8b, 0x85, 0xfd, 0x1b, 0xcc, 0x1bf, 0x3c1, 0x5b, 0x1ca, 0x2f0, 0x1ee, 0x3e0, 0x2cd, 0x1f7, 0x3c2, 0x3e8, 0x138, 0x3e2, 0x2ee, 0x3af, 0x34c, 0x309, 0xee, 0x3eb, 0x266, 0x1fb, 0x2a1, 0x39e, 0x4, 0x326, 0x3d5, 0x313, 0x3bb, 0xe9, 0x393, 0x3aa, 0x2a7, 0x12b, 0x3f, 0x3b8, 0x3b7, 0x18a, 0x3e5, 0x296, 0x263, 0x10, 0x83, 0x34f, 0x57, 0x2f7, 0x3a4, 0x257, 0x2b3, 0x28e, 0xa5, 0xfc, 0x2fb, 0x2c7, 0x221, 0x38f, 0x24a, 0x19e, 0x40, 0x20c, 0x127, 0x15c, 0x3ce, 0x28b, 0x14e, 0x2de, 0x22a, 0x294, 0x3f0, 0x3fe, 0x30e, 0x96, 0x227, 0x13a, 0x271, 0x100, 0x22, 0x95, 0x179, 0x323, 0x23e, 0x131, 0x36a, 0xba, 0x242, 0x3db, 0x3e3, 0x23, 0x258, 0x8e, 0xe1, 0x1d6, 0x9, 0x88, 0x254, 0x1ed, 0x97, 0xea, 0xcd, 0x1b3, 0x2e8, 0x11a, 0x377, 0x397, 0x8c, 0x172, 0x238, 0x384, 0x351, 0x24, 0x220, 0x142, 0x3bd, 0x25c, 0x3a8, 0x334, 0x2c5, 0x3b2, 0x61, 0x1c7, 0x247, 0x230, 0x193, 0x3d5, 0x22f, 0x2f7, 0x341, 0x14e, 0x1b5, 0xba, 0x8d, 0x377, 0x327, 0x230, 0x382, 0x3c8, 0x7c, 0x1dd, 0x224, 0xc1, 0x1a0, 0x26a, 0x130, 0x34e, 0x13d, 0x1b, 0x330, 0x3c6, 0x19c, 0x3a6, 0x381, 0x17d, 0xa, 0x3a5, 0x134, 0x10b, 0x272, 0xb5, 0xfe, 0x2d9, 0xad, 0x17b, 0x169, 0x349, 0x1cd, 0x322, 0x1e6, 0x318, 0x149, 0x145, 0x383, 0x25b, 0x3a9, 0x3f2, 0xd3, 0x380, 0xee, 0x3df, 0x18a, 0x3c3, 0x24a, 0x33c, 0x100, 0x44, 0x254, 0x3da, 0x25c, 0x359, 0xcb, 0x205, 0x35e, 0x3b, 0x13c, 0x188, 0xe5, 0x1e9, 0x36b, 0xe7, 0x2cf, 0xc8, 0xb0, 0x328, 0x243, 0x22c, 0x42, 0x337, 0x336, 0x2a5, 0x170, 0x35f, 0x1a8, 0x2e9, 0x3a7, 0x212, 0x2a8, 0x225, 0x152, 0x275, 0x45, 0x3c7, 0xf, 0x73, 0x1ae, 0x38a, 0x34b, 0x2eb, 0x81, 0x1b1, 0x2ff, 0x3c2, 0x3d9, 0xe9, 0x32f, 0x2b3, 0x115, 0x294, 0x326, 0x34f, 0x15c, 0x323, 0xea, 0x334, 0x306, 0x35e, 0x76, 0xf9, 0x5b, 0x24b, 0x157, 0x346, 0x37c, 0x222, 0x344, 0x139, 0xb5, 0x1fc, 0x376, 0x161, 0x39d, 0x173, 0x3d4, 0x371, 0x81, 0x362, 0x3ee, 0x22f, 0x1e7, 0x11f, 0x262, 0x366, 0x36d, 0x308, 0x9e, 0x188, 0x1ca, 0x3ad, 0x36e, 0x26b, 0x146, 0x26c, 0xa6, 0x293, 0x23b, 0x368, 0xad, 0x2f6, 0x1ad, 0x27e, 0xef, 0x91, 0x16e, 0x37b, 0x3c2, 0x3bb, 0x3a4, 0x14e, 0x36a, 0x2e8, 0x61, 0x315, 0x31, 0x13b, 0x2f0, 0x36b, 0x1ce, 0x32e, 0x249, 0x312, 0x1d1, 0x1c4, 0x6d, 0x290, 0x358, 0x2b0, 0x349, 0x39a, 0x93, 0x32b, 0x1ec, 0x17a, 0x1f4, 0x270, 0x32f, 0x16f, 0x5d, 0x8d, 0x2e7, 0x87, 0x1a4, 0x5e, 0x1ee, 0x33f, 0x363, 0xc8, 0x160, 0xbb, 0x23c, 0x288, 0x52, 0x6b, 0x56, 0xe8, 0x171, 0x191, 0x1e6, 0x239, 0x12d, 0x23a, 0x4e, 0x3e2, 0x245, 0x127, 0x2f2, 0x25c, 0x17f, 0xab, 0x60, 0x66, 0x1e3, 0x338, 0x10f, 0xdc, 0x3d7, 0x2d, 0x16d, 0x39, 0x7a, 0x2f8, 0xd3, 0x21b, 0x2fb, 0x215, 0x172, 0x1e4, 0xf8, 0x2f3, 0x19, 0x58, 0x259, 0x23c, 0x119, 0x148, 0x358, 0x169, 0x13f, 0xef, 0x122, 0x1b1, 0x3ee, 0x57, 0x395, 0xea, 0x261, 0x3, 0x2c6, 0x369, 0x31f, 0x2ed, 0x381, 0x1fd, 0xa0, 0xaa, 0x225, 0x141, 0x311, 0x164, 0x70, 0x77, 0x3b7, 0x4b, 0x8e, 0x301, 0x175, 0x224, 0x304, 0x236, 0x396, 0x22c, 0x108, 0x31c, 0x2b, 0xe8, 0x2e2, 0x24d, 0x32b, 0x3d8, 0x1e1, 0x3bb, 0x341, 0x131, 0x366, 0x2d3, 0x3b, 0xf9, 0xb6, 0x13e, 0x2aa, 0x5, 0x343, 0x1b2, 0x128, 0x33e, 0x8a, 0x207, 0x1e0, 0x1fe, 0x266, 0x3c3, 0x13a, 0x3ac, 0x90, 0x99, 0xd0, 0xdd, 0x192, 0x10a, 0x39f, 0x265, 0x105, 0x253, 0xb3, 0x27d, 0x318, 0x12d, 0x83, 0x95, 0x3bd, 0x181, 0x3b3, 0x29a, 0x6c, 0x2d1, 0x170, 0x2ce, 0x2ca, 0xc6, 0x292, 0x7d, 0x270, 0xa7, 0x2dd, 0x36d, 0x3b, 0x1f2, 0x2d8, 0x1e2, 0x2fa, 0xa0, 0x154, 0x86, 0x21a, 0x17c, 0xd3, 0x3f, 0x3fe, 0x8c, 0x30d, 0xf7, 0x277, 0x32e, 0x136, 0x14c, 0xb5, 0x3f9, 0x305, 0xe6, 0x2d6, 0x2f9, 0x125, 0xeb, 0x48, 0x99, 0x1a0, 0x374, 0x8b, 0x84, 0x31c, 0x56, 0x3a0, 0x33d, 0x91, 0x1b1, 0x3d5, 0x15c, 0x97, 0x2bb, 0xab, 0xc0, 0x198, 0x303, 0x3ec, 0x1a8, 0x365, 0x2a, 0x153, 0x30f, 0x1f1, 0x35d, 0x5d, 0x234, 0x223, 0x188, 0x321, 0x2ae, 0x206, 0x343, 0x364, 0xa9, 0x1c6, 0xb2, 0x70, 0xee, 0x2c7, 0x258, 0xf2, 0xf8, 0x1ef, 0x64, 0x2c0, 0x1d1, 0x319, 0x2d9, 0x161, 0x26f, 0x31d, 0xd5, 0x335, 0x80, 0x110, 0x202, 0x14f, 0x130, 0x246, 0x3cb, 0x265, 0x20a, 0x15e, 0x191, 0x106, 0x254, 0x1d7, 0x26, 0x295, 0x3e1, 0x265, 0x1d, 0x171, 0x93, 0x16e, 0x3ee, 0x15c, 0x12e, 0x2fe, 0x151, 0x1b, 0x36c, 0x170, 0x195, 0x33a, 0x239, 0x17a, 0x3bb, 0x11f, 0x334, 0x6, 0x21d, 0x1e3, 0xfb, 0xd4, 0x365, 0x54, 0x145, 0x4e, 0x32f, 0x36a, 0x36d, 0x76, 0x3c1, 0x2ed, 0x21f, 0x3ef, 0x5a, 0x37a, 0x329, 0x177, 0x28e, 0x8d, 0x315, 0x188, 0x24b, 0x2aa, 0x14, 0x55, 0x43, 0x21a, 0x2f8, 0x34c, 0x1f8, 0x397, 0x1a4, 0x2f0, 0x36e, 0x37c, 0x134, 0x94, 0x275, 0x59, 0x70, 0x1dc, 0x30e, 0x2e4, 0x33b, 0x33f, 0x32e, 0x26c, 0x139, 0x1a1, 0x3e7, 0x78, 0x1fe, 0x18a, 0x47, 0x20b, 0x3ba, 0x19, 0x160, 0x1d1, 0x23b, 0x376, 0x31a, 0x2b1, 0x378, 0x125, 0x1d6, 0x120, 0xc1, 0x236, 0x243, 0x288, 0x290, 0x2f6, 0x173, 0x29f, 0x1cf, 0x40, 0x110, 0xd, 0x135, 0x192, 0x21, 0x18e, 0x56, 0x20c, 0x142, 0x2a3, 0x260, 0x214, 0x18e, 0xac, 0x13f, 0x371, 0x2, 0x11, 0x284, 0x14f, 0xc9, 0x21, 0x31c, 0x158, 0x27e, 0x2eb, 0x4, 0x22, 0x101, 0x29e, 0x192, 0x42, 0x231, 0x2b0, 0xf5, 0x1df, 0x8, 0x44, 0x202, 0x135, 0x324, 0x84, 0x6b, 0x169, 0x1ea, 0x3be, 0x10, 0x88, 0xd, 0x26a, 0x241, 0x108, 0xd6, 0x2d2, 0x3d4, 0x375, 0x20, 0x110, 0x1a, 0xdd, 0x8b, 0x210, 0x1ac, 0x1ad, 0x3a1, 0x2e3, 0x40, 0x220, 0x34, 0x1ba, 0x116, 0x29, 0x358, 0x35a, 0x34b, 0x1cf, 0x80, 0x49, 0x68, 0x374, 0x22c, 0x52, 0x2b9, 0x2bd, 0x29f, 0x39e, 0x100, 0x92, 0xd0, 0x2e1, 0x51, 0xa4, 0x17b, 0x173, 0x137, 0x335, 0x200, 0x124, 0x1a0, 0x1cb, 0xa2, 0x148, 0x2f6, 0x2e6, 0x26e, 0x263, 0x9, 0x248, 0x340, 0x396, 0x144, 0x290, 0x1e5, 0x1c5, 0xd5, 0xcf, 0x12, 0x99, 0x289, 0x325, 0x288, 0x11, 0x101, 0x135, 0x241, 0x210, 0x358, 0x2bd, 0x137, 0x263, 0x12, 0x132, 0x236, 0x11e, 0xda, 0x161, 0x35c, 0x2f9, 0x13a, 0x2be, 0x104, 0x160, 0x34d, 0x3f8, 0xf, 0xff, 0x314, 0x238, 0x1f0, 0x2cf, 0x26c, 0xed, 0x226, 0xe, 0xee, 0x215, 0x30d, 0x3b1, 0xdf, 0x134, 0x250, 0x311, 0x26d, 0xfc, 0x327, 0x13b, 0x2af, 0x5, 0x55, 0x10c, 0x1e8, 0x357, 0x242, 0x223, 0x5b, 0x1e2, 0x3fd, 0x5a, 0x1f3, 0x2fc, 0x16f, 0x3b2, 0xec, 0x237, 0x10f, 0x1db, 0x54, 0x11d, 0xe9, 0x262, 0x3, 0x33, 0x303, 0x35f, 0x2ca, 0x239, 0x1e1, 0x3ce, 0x359, 0x2ac, 0x36, 0x356, 0x253, 0x322, 0x16e, 0x3a3, 0x1ed, 0x302, 0x34e, 0x3cb, 0x30c, 0x3a0, 0x1de, 0x1, 0x11, 0x101, 0x135, 0x241, 0x210, 0x358, 0x2bd, 0x137, 0x263, 0x12, 0x132, 0x236, 0x11e, 0xda, 0x161, 0x35c, 0x2f9, 0x13a, 0x2be, 0x104, 0x160, 0x22, 0xd, 0x1ba, 0x51, 0x290, 0x39d, 0x6f, 0x125, 0x2ab, 0x82, 0x160, 0x293, 0x3fb, 0x78, 0x3eb, 0x258, 0x33b, 0x1ce, 0x222, 0x94, 0x38c, 0x26d, 0x1f8, 0x87, 0x1ca, 0x2aa, 0xa0, 0x16d, 0x329, 0x3aa, 0x2e8, 0x76, 0x237, 0x21e, 0x365, 0x2a0, 0x1f4, 0x11f, 0x196, 0x180, 0x36c, 0x392, 0x191, 0x16e, 0x34f, 0x3bd, 0x26, 0x85, 0x18e, 0x2b0, 0x3d4, 0x1cf, 0x200, 0x99, 0x236, 0x23c, 0x368, 0x31a, 0x1a5, 0x38f, 0x20b, 0x1ef, 0x249, 0x139, 0x113, 0xe, 0x1dc, 0x46, 0x5e, 0x36e, 0x3d6, 0x18b, 0x21a, 0x3ed, 0x294, 0x315, 0x5b, 0x3c4, 0x3ef, 0x2d0, 0x30f, 0x32f, 0x366, 0x2c6, 0x1e3, 0x3d1, 0x165, 0x239, 0x3c2, 0x323, 0x2fe, 0x29a, 0x2c9, 0x1d, 0x39a, 0x81, 0x106, 0x284, 0x135, 0x8b, 0x52, 0x2f6, 0x38a, 0x2a1, 0x1d6, 0x112, 0x2c, 0x1d1, 0x1fc, 0xf, 0x1fe, 0x4b, 0x1e4, 0x33f, 0x44, 0x34, 0x1cb, 0x119, 0x2b4, 0x2b1, 0x3e5, 0x301, 0x1ef, 0x9b, 0xed, 0x8a, 0xe0, 0x3fe, 0x1a4, 0x353, 0xa, 0x2a8, 0x1c8, 0x1d5, 0x2e8, 0xec, 0xce, 0xd4, 0x235, 0xbd, 0x1e7, 0x2bb, 0x14d, 0x2c9, 0x3a, 0x273, 0x1, 0x44, 0x34, 0x1cb, 0x119, 0x2b4, 0x2b1, 0x3e5, 0x301, 0x1ef, 0x9b, 0xed, 0x8a, 0xe0, 0x3fe, 0x1a4, 0x353, 0xa, 0x2a8, 0x1c8, 0x1d5, 0x2e8, 0xec, 0xce, 0xd4, 0x235, 0xbd, 0x1e7, 0x2bb, 0x14d, 0x2c9, 0x3a, 0x273, 0x1, 0x44, 0x34, 0x1cb, 0x119, 0x2b4, 0x2b1, 0x3e5, 0x301, 0x1ef, 0x9b, 0xed, 0x8a, 0xe0, 0x3fe, 0x1a4, 0x353, 0xa, 0x2a8, 0x1c8, 0x1d5, 0x2e8, 0xec, 0xce, 0xd4, 0x235, 0xbd, 0x1e7, 0x2bb, 0x14d, 0x2c9, 0x3a, 0x273, 0x1, 0x44, 0x34, 0x1cb, 0x119, 0x2b4, 0x2b1, 0x3e5, 0x301, 0x1ef, 0x9b, 0xed, 0x8a, 0xe0, 0x3fe, 0x1a4, 0x88, 0xd0, 0x243, 0x1b4, 0x23d, 0x133, 0x11c, 0x3c9, 0x146, 0x4a, 0x311, 0x34c, 0x377, 0x310, 0x3c4, 0x3a7, 0x153, 0x270, 0x19a, 0x60, 0x36c, 0x253, 0x126, 0x326, 0x142, 0x26a, 0x51, 0x252, 0x1ae, 0x3f6, 0x301, 0x3de, 0x26c, 0x361, 0xb2, 0x3f, 0x247, 0x394, 0x17d, 0x2d, 0x3c5, 0x32f, 0x183, 0x33, 0x2e, 0x25d, 0x25f, 0x34f, 0x2ef, 0x260, 0x108, 0x17b, 0x31d, 0x125, 0x2be, 0x32, 0xa6, 0x28d, 0x1c, 0x2fb, 0xd2, 0x353, 0x14, 0x2b2, 0x25b, 0x16f, 0x1af, 0x37e, 0x3d1, 0x19d, 0x3d8, 0x15c, 0x181, 0x123, 0x18e, 0x2d2, 0x137, 0x33c, 0x89, 0x58, 0x293, 0x3f7, 0x389, 0x30e, 0x2f, 0x2d5, 0x28f, 0x10c, 0x35b, 0x5d, 0x3b, 0x67, 0xd4, 0x63, 0x2f4, 0x323, 0x3ea, 0x1fa, 0x30c, 0x13f, 0x375, 0x200, 0x264, 0x328, 0x23b, 0x203, 0x3fc, 0x258, 0xf7, 0xdf, 0x1b2, 0x10d, 0x3d3, 0x8d, 0x110, 0x340, 0x23c, 0x376, 0x339, 0x4b, 0x33b, 0x26b, 0x1b2, 0x21a, 0x357, 0x61, 0x3c1, 0x21e, 0x31e, 0x17a, 0x323, 0x3dd, 0x3e1, 0x56, 0x3d4, 0x263, 0x120, 0x2c, 0x293, 0x3e7, 0x23f, 0x46, 0x2f0, 0x206, 0x2a8, 0x329, 0x16f, 0x35e, 0x1e3, 0x2b7, 0x1e6, 0x3ee, 0x3bd, 0x130, 0x108, 0x2f6, 0x6f, 0x13a, 0x3ba, 0x249, 0x1da, 0x59, 0x3f, 0x87, 0x24b, 0x3fa, 0x2d0, 0x4e, 0x262, 0x30, 0x36c, 0xaf, 0x91, 0x106, 0xd, 0x1cb, 0x6d, 0x31a, 0x133, 0x238, 0x33f, 0x222, 0xa9, 0x2f8, 0x294, 0x9e, 0x2ed, 0x2e9, 0x2a0, 0x3bb, 0x359, 0x29a, 0x265, 0x349, 0x3be, 0x200, 0xc1, 0xbb, 0x1fc, 0x78, 0x367, 0x30d, 0x36e, 0x28f, 0x218, 0x177, 0x2e8, 0x3b0, 0xfb, 0x165, 0x1ec, 0x15c, 0x302, 0x85, 0x6b, 0x173, 0x2a1, 0x2ab, 0x19, 0xa6, 0x113, 0x70, 0x3f5, 0x13b, 0x2aa, 0x109, 0x3e6, 0x32f, 0x220, 0x11b, 0x1c4, 0x305, 0x3f1, 0x2e4, 0x2df, 0x343, 0x218, 0x2ee, 0x3b2, 0x1bf, 0x3ab, 0xf3, 0x3ee, 0x373, 0xc9, 0x52, 0x333, 0x1fb, 0x20b, 0x2cf, 0x10b, 0x38c, 0x291, 0x38e, 0x2d8, 0x1b8, 0x150, 0x3bb, 0x2bb, 0x27a, 0x30c, 0xf5, 0x335, 0x120, 0x58, 0x25e, 0x307, 0x3b8, 0xd2, 0x157, 0x140, 0x1f3, 0x32f, 0x205, 0x330, 0x392, 0x126, 0x83, 0xd, 0x396, 0x1b4, 0xe6, 0x314, 0x399, 0x26b, 0x364, 0x7a, 0x28e, 0x219, 0xce, 0x2a9, 0x7b, 0xae, 0x302, 0x10a, 0x1ac, 0x38a, 0x24a, 0x1dd, 0x249, 0x3b4, 0x164, 0x1f8, 0x62, 0x1e2, 0x347, 0x28a, 0x28b, 0xab, 0x1b0, 0x74, 0x371, 0x80, 0x264, 0xbb, 0x3f8, 0x1e0, 0x30e, 0xbc, 0x103, 0x2a8, 0x25b, 0x1b5, 0x2c6, 0x20f, 0x25d, 0x16e, 0x95, 0x29e, 0x51, 0x15a, 0x2d6, 0x47, 0x3c9, 0x111, 0xa9, 0x1f9, 0x242, 0xf9, 0x283, 0x18f, 0x17a, 0x49, 0x65, 0x23b, 0x3c, 0x2c7, 0x5e, 0x103, 0x159, 0x17e, 0x1b3, 0x33, 0x170, 0x24d, 0x245, 0xd, 0x325, 0x2d9, 0x339, 0x12c, 0x3dc, 0x3d6, 0x10c, 0x2ee, 0x36d, 0x2f5, 0x167, 0x32b, 0x127, 0x14f, 0x51, 0x2b4, 0x34a, 0x238, 0xe7, 0x268, 0x21a, 0x147, 0x219, 0x19c, 0x2b6, 0x3d8, 0x2f2, 0x98, 0x210, 0x39d, 0x1fb, 0x1f, 0x32e, 0x4a, 0xbe, 0x294, 0x278, 0x283, 0x31e, 0x1e1, 0x25c, 0x295, 0x231, 0x2e6, 0x125, 0x1dd, 0x9b, 0x2cb, 0x332, 0x3bf, 0x5b, 0x6e, 0xa8, 0x3bb, 0x17f, 0x1fa, 0x56, 0x34b, 0x271, 0x82, 0x53, 0x226, 0x380, 0x247, 0x9f, 0x3ef, 0x2a6, 0x341, 0xab, 0x360, 0x1d0, 0x3be, 0x12, 0xb, 0x293, 0x387, 0x3b8, 0x1a4, 0x155, 0x212, 0x30f, 0x131, 0x60, 0x356, 0x1cd, 0x2, 0x92, 0xca, 0x7f, 0x78, 0x187, 0xbc, 0x206, 0x2b2, 0x2fc, 0x366, 0x66, 0x2e0, 0x93, 0x92, 0x194, 0x1fc, 0x3c0, 0x46, 0x3ad, 0xa0, 0x3e6, 0x14e, 0x30, 0x356, 0x39a, 0x8, 0x99, 0xbb, 0x3fb, 0x23f, 0x230, 0x157, 0x109, 0x30f, 0x262, 0x180, 0x286, 0xef, 0x40, 0xc1, 0x1d1, 0x3e7, 0x1dc, 0x1a4, 0x2aa, 0x5a, 0x4e, 0x334, 0x1b, 0x1d, 0x371, 0x200, 0x201, 0x293, 0x307, 0x2fb, 0x13b, 0x17d, 0x2d0, 0x270, 0x196, 0xd8, 0xe8, 0x3be, 0x24, 0x2c, 0xb5, 0xe, 0x3f5, 0x1ca, 0x3fa, 0x2ad, 0x3a4, 0xab, 0x2c9, 0x349, 0x1cf, 0x120, 0x160, 0x1a1, 0x70, 0x397, 0x24b, 0x3ef, 0x145, 0x11f, 0x151, 0x265, 0x27e, 0x263, 0x112, 0x312, 0x113, 0x380, 0x87, 0x27c, 0x347, 0x23a, 0xea, 0x29a, 0x30c, 0x3d4, 0x33c, 0x82, 0xa6, 0x8a, 0x3f, 0x31, 0x3c4, 0x20e, 0x1f4, 0x359, 0xfd, 0x56, 0x29f, 0x1d6, 0x19, 0x139, 0x59, 0x1f8, 0x188, 0x21f, 0x54, 0x3bb, 0x2fe, 0x3e1, 0x2b0, 0x124, 0x259, 0x3fb, 0x77, 0xd2, 0x2aa, 0xb4, 0x138, 0x196, 0x1b0, 0x3a0, 0x1cf, 0x240, 0x189, 0x113, 0x309, 0x21c, 0x3c4, 0x15, 0x3d9, 0x2fe, 0x3cb, 0x2d2, 0x2a1, 0x2ea, 0x136, 0x275, 0x291, 0x4f, 0x345, 0x235, 0x313, 0x302, 0x42, 0x3ca, 0x3f6, 0xf8, 0x111, 0x141, 0x2a7, 0x3b, 0xfb, 0x27d, 0x3a3, 0x2a3, 0xa2, 0x18d, 0x18a, 0x27f, 0x1eb, 0x218, 0x35d, 0x163, 0x2e, 0x322, 0x83, 0x68, 0x71, 0x203, 0x367, 0xbc, 0xa, 0x37a, 0x257, 0x18, 0x356, 0x33d, 0x20, 0xc1, 0x3a2, 0x387, 0x2fb, 0x276, 0x1fd, 0x2ad, 0x341, 0x2ac, 0x265, 0xf5, 0x19e, 0x82, 0x14c, 0x228, 0x1f8, 0x310, 0x6e, 0x2a0, 0x3ce, 0x36f, 0x18e, 0x2e6, 0x9d, 0x1ef, 0x281, 0x22b, 0x294, 0x1f2, 0x6a, 0x239, 0x2b8, 0x98, 0x52, 0x1ae, 0x227, 0x33f, 0x268, 0x7a, 0x5d, 0x369, 0x35f, 0x32b, 0x95, 0xdd, 0x6d, 0x248, 0x176, 0x3e7, 0x379, 0x276, 0x3fa, 0x2a6, 0x23e, 0x29a, 0x2b, 0x137, 0x2ab, 0x320, 0x19f, 0x34c, 0x4f, 0x283, 0xc6, 0xae, 0x4c, 0x52, 0x35c, 0x8e, 0x1ce, 0x2c1, 0x35b, 0x36d, 0x385, 0x166, 0x326, 0x34, 0x71, 0xf, 0x187, 0x1e9, 0xa0, 0x383, 0xcd, 0x1b, 0x74, 0x375, 0x120, 0x189, 0x226, 0x3f, 0xc4, 0x37, 0x2a0, 0x395, 0x1a7, 0x6b, 0x233, 0x384, 0x32e, 0x250, 0x3d3, 0x308, 0x279, 0x27d, 0x34f, 0x29e, 0x119, 0xe6, 0x12c, 0x2df, 0x55, 0xbf, 0x2c5, 0x269, 0x2bc, 0x2, 0x99, 0x2ec, 0x3c7, 0x2fb, 0xe5, 0x3fd, 0x145, 0x75, 0x13d, 0x56, 0x26e, 0x15f, 0x249, 0x33e, 0x291, 0x9e, 0x10f, 0x18c, 0x15c, 0x98, 0xa4, 0x2b1, 0x11c, 0x39c, 0x18b, 0x2bf, 0x2d3, 0x303, 0x2cc, 0x245, 0x68, 0xe2, 0x1e, 0x30e, 0x3d2, 0x140, 0x30f, 0x19a, 0x36, 0xe8, 0x2e3, 0x240, 0x312, 0x99, 0x1d1, 0x307, 0x3f5, 0x24b, 0x347, 0x1f4, 0x2fe, 0x337, 0x173, 0x13a, 0x363, 0x94, 0x3ed, 0x308, 0xfb, 0x1e6, 0x24e, 0x1ba, 0x368, 0x1fe, 0x30d, 0x206, 0x37a, 0x14e, 0x180, 0x1d, 0x3be, 0x120, 0x312, 0x8a, 0x1f8, 0x5b, 0x2e9, 0x17a, 0x162, 0x21, 0x39d, 0x38f, 0x33f, 0x1b2, 0x3a9, 0x36d, 0x303, 0x191, 0x106, 0x340, 0x23b, 0x3c0, 0x230, 0x2aa, 0x2d0, 0x3a4, 0x151, 0x30c, 0x29f, 0x2ab, 0x249, 0x275, 0x256, 0xf9, 0xd4, 0x1ec, 0x3bd, 0x8b, 0x161, 0x18a, 0x1ee, 0x28f, 0x329, 0x366, 0x269, 0x171, 0x8, 0xc1, 0x293, 0xe, 0x397, 0x27c, 0x20e, 0x3bb, 0x3dd, 0x18e, 0x38a, 0x1c2, 0x32e, 0xa9, 0x357, 0x76, 0x3d1, 0x32b, 0x254, 0x1cb, 0x376, 0x3eb, 0x5e, 0x14, 0x3e6, 0x262, 0x1b, 0xe8, 0x1cf, 0x112, 0xa6, 0x59, 0x3db, 0x2d8, 0x365, 0x3c2, 0x302, 0x108, 0xd7, 0x47, 0x1ce, 0x132, 0x34d, 0xe, 0x327, 0x1e2, 0x54, 0x3ce, 0x34e, 0x358, 0x2f9, 0x1f0, 0x134, 0x1e8, 0x3b2, 0x303, 0x322, 0x11, 0x236, 0x3f8, 0xee, 0x13b, 0x3fd, 0x11d, 0x359, 0x3cb, 0x2bd, 0x13a, 0x2cf, 0x250, 0x357, 0xec, 0x35f, 0x16e, 0x101, 0x11e, 0xf, 0x215, 0x2af, 0x5a, 0xe9, 0x2ac, 0x30c, 0x137, 0x2be, 0x26c, 0x311, 0x242, 0x237, 0x2ca, 0x3a3, 0x135, 0xda, 0xff, 0x30d, 0x5, 0x1f3, 0x262, 0x36, 0x3a0, 0x263, 0x104, 0xed, 0x26d, 0x223, 0x10f, 0x239, 0x1ed, 0x241, 0x161, 0x314, 0x3b1, 0x55, 0x2fc, 0x3, 0x356, 0x1de, 0x12, 0x160, 0x226, 0xfc, 0x5b, 0x1db, 0x1e1, 0x302, 0x210, 0x35c, 0x238, 0xdf, 0x10c, 0x16f, 0x33, 0x253, 0x1, 0x132, 0x34d, 0xe, 0x327, 0x1e2, 0x54, 0x3ce, 0x34e, 0x358, 0x2f9, 0x1f0, 0x134, 0x1e8, 0x3b2, 0x303, 0x322, 0x11, 0x236, 0x3f8, 0xee, 0x13b, 0x264, 0x12f, 0x70, 0x21c, 0x37, 0x12d, 0xb1, 0x42, 0xd7, 0x11c, 0xdf, 0x218, 0x1b5, 0x198, 0x171, 0x20, 0xb, 0x1a1, 0x21b, 0x310, 0x2e9, 0x1e1, 0x20d, 0x52, 0x2d6, 0x3c8, 0x3d6, 0x390, 0x2c5, 0x36c, 0x273, 0x9, 0x160, 0x45, 0x3f0, 0x2d8, 0x18f, 0x57, 0x130, 0x252, 0x266, 0x1ee, 0x22e, 0x2fc, 0x6, 0x143, 0x2eb, 0x120, 0x53, 0xb2, 0x2e7, 0x3a6, 0x18c, 0x2f2, 0x241, 0x2c2, 0x4b, 0x1b7, 0x159, 0x32f, 0xc0, 0x3a, 0x1cf, 0x41, 0x272, 0x26d, 0x4f, 0x35, 0x1ec, 0x2ef, 0xa2, 0xe6, 0x172, 0x285, 0x37a, 0x131, 0x36, 0x349, 0x19e, 0x32, 0x2cb, 0x12b, 0x1f2, 0x2a9, 0x1f7, 0x14f, 0x6d, 0xff, 0x213, 0x14, 0x383, 0x261, 0x2c9, 0x1ea, 0x3ac, 0x249, 0x1c6, 0x121, 0x237, 0x19d, 0x297, 0x1ba, 0x1bb, 0x3df, 0x2f0, 0x280, 0x9c, 0xab, 0x186, 0x137, 0x175, 0x1a2, 0xbe, 0x61, 0xc1, 0xb5, 0x380, 0x188, 0x2e9, 0x3c2, 0x26, 0x290, 0x133, 0x1ee, 0x55, 0x3e2, 0x30, 0x1d, 0x1cf, 0x82, 0x1da, 0x34c, 0xf9, 0x2a9, 0x3ee, 0x135, 0x368, 0x3eb, 0x2f0, 0x109, 0x270, 0x151, 0x56, 0x2a1, 0x1ef, 0x94, 0x357, 0x3b0, 0x195, 0x326, 0x340, 0x1fc, 0x1dc, 0x1ca, 0x347, 0x3bb, 0x2d7, 0x358, 0x3f6, 0x33f, 0x18b, 0x3aa, 0x21d, 0xaf, 0x8, 0x201, 0x1a1, 0x3f, 0x5b, 0x365, 0x22f, 0x130, 0xad, 0x18a, 0x36b, 0x2a8, 0x32f, 0x180, 0xe8, 0x263, 0x19, 0x2cb, 0x256, 0x3c1, 0x165, 0x34f, 0x1ba, 0x376, 0x367, 0x3ad, 0x5a, 0x3a4, 0x29a, 0x2b0, 0x125, 0x363, 0xa9, 0x28e, 0x1bf, 0xb3, 0x106, 0x236, 0x3fb, 0x2fb, 0x24b, 0x20e, 0x1e7, 0x295, 0x2f6, 0x38f, 0x1ce, 0x43, 0x16f, 0xcc, 0x171, 0x40, 0x2c, 0x113, 0x1f8, 0x2d8, 0x31e, 0x15c, 0x192, 0x161, 0x4b, 0x36e, 0x16d, 0x14e, 0x182, 0x2d4, 0x3f, 0xb6, 0x18f, 0x15c, 0x324, 0x18d, 0x258, 0x285, 0x1f3, 0x334, 0x19b, 0x34b, 0x175, 0x281, 0x3f2, 0x76, 0x167, 0x193, 0x340, 0x3f8, 0x379, 0x24b, 0x15, 0x395, 0x85, 0x333, 0x11c, 0x37c, 0x1c8, 0x183, 0x356, 0x2eb, 0x89, 0x139, 0xd3, 0x278, 0x2a9, 0x3d5, 0xdd, 0x376, 0x2c7, 0x2af, 0x2d0, 0x23e, 0x3f4, 0x173, 0x384, 0x111, 0xf4, 0x2d3, 0xb8, 0x81, 0x132, 0x25e, 0x380, 0x310, 0x3b6, 0x22f, 0x260, 0x2b4, 0x4b, 0x2d5, 0x1bd, 0x262, 0x1b0, 0x1ea, 0x2ab, 0xd1, 0x17c, 0x308, 0x3ab, 0x1b1, 0x68, 0x7f, 0xee, 0x1ca, 0x287, 0x2f7, 0x295, 0x1e5, 0x227, 0x26b, 0x39, 0x1b3, 0x36c, 0x1de, 0x90, 0xa6, 0x199, 0x4f, 0xd4, 0x2ff, 0x29e, 0x368, 0x3df, 0x3d2, 0x5a, 0x341, 0x27a, 0x1ad, 0x274, 0xa3, 0x21a, 0x1d9, 0x17, 0x91, 0x124, 0x34d, 0x70, 0x62, 0x370, 0x3c2, 0x304, 0x342, 0x1f8, 0x372, 0x18c, 0x3bd, 0x144, 0x27b, 0x5e, 0x280, 0xe9, 0x29a, 0x2d2, 0x274, 0x146, 0x7a, 0x2d3, 0x170, 0x204, 0x182, 0x1a1, 0xfc, 0x1b9, 0xc6, 0x3da, 0xa2, 0x339, 0x2f, 0x140, 0x270, 0x14d, 0x169, 0x13a, 0xa3, 0x3d, 0x36d, 0xb8, 0x102, 0xc1, 0x2d4, 0x7e, 0x2d8, 0x63, 0x1ed, 0x51, 0x398, 0x213, 0xa0, 0x138, 0x2a2, 0x2b0, 0x9d, 0x255, 0x21a, 0x3b2, 0x5c, 0x81, 0x264, 0x16a, 0x3f, 0x16c, 0x235, 0x2f2, 0x22c, 0x1cc, 0x30d, 0x50, 0x9c, 0x151, 0x158, 0x24a, 0x32e, 0x10d, 0x1d9, 0x2e, 0x244, 0x132, 0xb5, 0x21b, 0xb6, 0x31e, 0x179, 0x116, 0xe6, 0x382, 0x28, 0x4e, 0x2ac, 0xac, 0x125, 0x197, 0x282, 0x2e8, 0x17, 0x122, 0x99, 0x25e, 0x309, 0x5b, 0x18f, 0x2b8, 0x8b, 0x73, 0x1c1, 0x14, 0x27, 0x156, 0x56, 0x296, 0x2cf, 0x141, 0x174, 0x20f, 0x91, 0x201, 0x113, 0x3db, 0x345, 0x1ec, 0x2a3, 0x368, 0x367, 0x157, 0x2ad, 0x359, 0x18e, 0x378, 0x33f, 0x43, 0x36a, 0x36c, 0x371, 0x112, 0x1da, 0x256, 0x237, 0x1e6, 0x284, 0x1c4, 0x23f, 0x1ca, 0x20e, 0x323, 0x21, 0x2b1, 0x33b, 0x55, 0x32f, 0x1b, 0x27e, 0x2ab, 0x344, 0x3ed, 0x3b0, 0xb3, 0x22, 0xbb, 0xe, 0x31, 0x2e9, 0x22f, 0x192, 0x31a, 0x2e4, 0x14, 0x4e, 0x151, 0x2b0, 0x13a, 0x146, 0xf4, 0x35e, 0x392, 0x8, 0x2c, 0x8a, 0x2e7, 0x21e, 0x37b, 0x135, 0x376, 0x30e, 0x2aa, 0x145, 0x2fe, 0x6b, 0x3f6, 0x1ce, 0x218, 0x366, 0x356, 0x3be, 0x82, 0x2cb, 0x294, 0x19c, 0x32b, 0xd, 0x23b, 0x1dc, 0x24b, 0x54, 0x12e, 0x108, 0x1a5, 0x1ee, 0x2a8, 0x14e, 0xd8, 0x3d4, 0x175, 0x216, 0x357, 0x1bf, 0x191, 0x110, 0x1d1, 0x70, 0x188, 0x365, 0x15c, 0x8b, 0xe6, 0x30d, 0xa0, 0x270, 0x29a, 0x1ad, 0xb, 0x45, 0x2e7, 0x35, 0x1f7, 0x1ba, 0x305, 0x118, 0x3fa, 0x3e8, 0x34e, 0x39d, 0x79, 0x343, 0x3e2, 0x300, 0x13f, 0x2ab, 0x281, 0x3af, 0x1bf, 0x322, 0x49, 0x293, 0x309, 0x16c, 0xc6, 0x373, 0x232, 0x3eb, 0x353, 0x352, 0x359, 0x31c, 0x1fb, 0x1ce, 0x39, 0x183, 0x286, 0x39e, 0x64, 0x38c, 0xc2, 0x35f, 0x326, 0x65, 0x387, 0x87, 0x1b8, 0x313, 0x192, 0x23d, 0x382, 0xa0, 0xe9, 0x27a, 0x173, 0x1f, 0xd9, 0x3aa, 0x198, 0x273, 0x120, 0x272, 0x12b, 0x237, 0x3cc, 0x202, 0x23b, 0x3b8, 0x13e, 0x2a0, 0x2c4, 0x148, 0x18a, 0x2d5, 0x1f3, 0x196, 0x211, 0x296, 0x32e, 0x3d, 0x1af, 0x392, 0x10, 0xb0, 0x59, 0x223, 0x350, 0x34f, 0x396, 0x3c, 0x1a4, 0x3d7, 0x2f7, 0x85, 0x1ae, 0x399, 0x55, 0x257, 0x6c, 0x3d4, 0x2ea, 0x4a, 0x28e, 0x3c6, 0x24c, 0x99, 0x16a, 0xfc, 0x2ed, 0x7b, 0x355, 0x368, 0x16, 0x114, 0x315, 0x350, 0x297, 0x243, 0x1e0, 0x276, 0x20e, 0x97, 0x210, 0x133, 0x1b7, 0x2fd, 0x196, 0x2b, 0x24a, 0x146, 0x3d0, 0x185, 0x171, 0x12, 0x14c, 0x34c, 0x31f, 0x3cc, 0xd, 0xfe, 0x1ff, 0x3c4, 0xbd, 0x4c, 0x161, 0x172, 0x28, 0x270, 0x27a, 0x2e6, 0x7c, 0x2c1, 0x2de, 0x36c, 0x1df, 0x104, 0x275, 0x234, 0x3ab, 0x326, 0xca, 0x207, 0x31, 0x3b6, 0x2b8, 0x51, 0xff, 0x1e9, 0x2d0, 0x3a8, 0x31c, 0x3f6, 0x331, 0x1c8, 0x6, 0x74, 0x271, 0x26c, 0x3f2, 0x369, 0x191, 0x49, 0x12f, 0x3f, 0x372, 0x7b, 0x2a3, 0x1bb, 0x215, 0x17d, 0xfa, 0x1a7, 0x39d, 0xf2, 0x117, 0x32f, 0x6c, 0x3a1, 0x3ba, 0x250, 0xba, 0x2e, 0x204, 0xb, 0x8a, 0x38e, 0x1a8, 0x34f, 0x325, 0xf0, 0x13b, 0x107, 0x24f, 0x108, 0x29d, 0x2df, 0x37a, 0xcb, 0x211, 0x125, 0xa3, 0x1e8, 0x2c6, 0x2bc, 0x9, 0xa6, 0x2c, 0x59, 0x9e, 0x165, 0x254, 0x1c4, 0x1dc, 0x27c, 0x12d, 0x26, 0x161, 0x2e4, 0xa0, 0x3a4, 0x3e1, 0x6f, 0x33f, 0x218, 0x306, 0x1d, 0x33c, 0x26c, 0x3ed, 0x1bf, 0x93, 0x99, 0x1a1, 0x3db, 0x21e, 0x3ee, 0x1cb, 0x78, 0x13b, 0x20e, 0x12e, 0x52, 0x18a, 0x346, 0x30f, 0x151, 0x1ad, 0x20b, 0x1b2, 0x16f, 0x36c, 0x3be, 0x19, 0x38c, 0x308, 0x195, 0x22, 0x1d1, 0x380, 0x2d8, 0x239, 0x2a3, 0x376, 0x46, 0x3fa, 0x3bb, 0x85, 0x2b1, 0x1ee, 0x16d, 0x334, 0x30c, 0x125, 0x146, 0x3a9, 0x21d, 0x39a, 0x120, 0x1da, 0x294, 0xfb, 0x362, 0x236, 0x307, 0x31, 0x365, 0x2f2, 0x288, 0x3eb, 0x157, 0x145, 0x3dd, 0x2f6, 0x238, 0x28f, 0x32f, 0xd8, 0x29f, 0x1ef, 0x141, 0x36d, 0x392, 0x40, 0x312, 0x26d, 0x3c1, 0x1e6, 0xd, 0x1fc, 0x3f5, 0x21f, 0x3c2, 0x192, 0xe6, 0x5e, 0x5a, 0xea, 0x18e, 0x3f6, 0x26b, 0x58, 0x164, 0xf9, 0x27d, 0x202, 0x1fc, 0x3e3, 0x6e, 0x22f, 0x116, 0xff, 0x3ad, 0x153, 0x3ea, 0x2f6, 0x79, 0x22e, 0x14e, 0x19b, 0x354, 0x32e, 0x1e8, 0x30a, 0x39a, 0x240, 0x361, 0x8d, 0x3ab, 0x83, 0xbb, 0xe0, 0x16c, 0x239, 0x14f, 0x1c3, 0x230, 0x3d7, 0x395, 0x108, 0x266, 0x1a3, 0x30f, 0x2a2, 0x2bd, 0x7c, 0x316, 0x1b3, 0x286, 0xcf, 0x136, 0x3ed, 0x37e, 0x24c, 0xc1, 0x226, 0x38e, 0x2a9, 0x95, 0xe2, 0x1dc, 0xf1, 0xbd, 0x130, 0x23d, 0x2f, 0x5a, 0x1d4, 0x231, 0x38f, 0x2f1, 0x1f1, 0x1b, 0x3a1, 0x2f3, 0x141, 0x2d3, 0x253, 0x200, 0x14c, 0x12b, 0x19c, 0x2dc, 0x11b, 0x307, 0x62, 0x18f, 0x3bd, 0xda, 0x187, 0x17d, 0x3e8, 0x246, 0x2b1, 0x3dc, 0x1bd, 0x196, 0xac, 0xe1, 0x134, 0x35d, 0x1b6, 0x3be, 0x32, 0x22b, 0x76, 0x166, 0x49, 0xb5, 0x3f0, 0x10f, 0x3ee, 0x396, 0x1e0, 0x1ca, 0xb0, 0x199, 0x3c1, 0x391, 0xd0, 0x3e7, 0x21c, 0x2c3, 0x3bd, 0x1b4, 0x215, 0x3fa, 0x2f7, 0x42, 0x133, 0x1a3, 0x217, 0x29a, 0x1c5, 0x3c9, 0x218, 0x3, 0x1d0, 0x2ab, 0x4a, 0xba, 0x170, 0x20, 0x22d, 0x34c, 0xce, 0x2dc, 0x236, 0x7, 0x310, 0xc6, 0x355, 0x2e5, 0x230, 0x3a7, 0x24f, 0x52, 0x221, 0x5, 0x270, 0x3f4, 0xde, 0x1ce, 0x390, 0x60, 0x27e, 0x1dd, 0x152, 0x36d, 0x253, 0x9, 0x139, 0x14a, 0x1f6, 0x326, 0x259, 0xe0, 0x2d8, 0xf6, 0x26a, 0xf, 0x299, 0x15, 0x162, 0x252, 0xb9, 0xa0, 0x28b, 0x267, 0x3f6, 0x1be, 0x2fc, 0x1b, 0x34b, 0x3de, 0x21a, 0x163, 0x2e2, 0x120, 0x361, 0x11a, 0x2b7, 0x11, 0x3a2, 0x3f, 0x3a6, 0x2ff, 0x1cb, 0x1e0, 0x394, 0x2a0, 0x13, 0x2c2, 0x30d, 0x2d, 0x1d4, 0x6b, 0x227, 0x3a5, 0x32f, 0x360, 0x1aa, 0x32e, 0x3d0, 0x33, 0xef, 0x41, 0xe3, 0x308, 0x160, 0x26d, 0x237, 0x16e, 0x236, 0xe, 0x5b, 0x239, 0x135, 0xf, 0x13b, 0x54, 0x302, 0x161, 0x30d, 0x5a, 0x359, 0x358, 0x238, 0x55, 0x262, 0x30c, 0x13a, 0x134, 0x16f, 0x356, 0x263, 0x26c, 0x357, 0x303, 0x1, 0x160, 0x26d, 0x237, 0x16e, 0x236, 0xe, 0x5b, 0x239, 0x135, 0xf, 0x13b, 0x54, 0x302, 0x161, 0x30d, 0x5a, 0x359, 0x358, 0x238, 0x55, 0x262, 0x30c, 0x13a, 0x134, 0x16f, 0x356, 0x263, 0x26c, 0x357, 0x303, 0x1, 0x160, 0x26d, 0x237, 0x16e, 0x236, 0xe, 0x5b, 0x239, 0x135, 0xf, 0x13b, 0x54, 0x302, 0x161, 0x30d, 0x5a, 0x359, 0x358, 0x238, 0x55, 0x262, 0x30c, 0x13a, 0x134, 0x16f, 0x356, 0x263, 0x26c, 0x357, 0x303, 0x1, 0x160, 0x26d, 0x237, 0x16e, 0x236, 0xe, 0x5b, 0x239, 0x135, 0xf, 0x13b, 0x54, 0x302, 0x161, 0x30d, 0x5a, 0x359, 0x358, 0x238, 0x55, 0x262, 0x2c0, 0x1a6, 0x19c, 0x2cd, 0x259, 0x380, 0x1d3, 0x1f7, 0x243, 0x77, 0x1e2, 0x3c2, 0x116, 0x3f1, 0x2aa, 0x3e8, 0x214, 0x133, 0x285, 0x138, 0x3e1, 0x2f9, 0x1be, 0x3e2, 0x1b0, 0x354, 0x146, 0x2ee, 0x1b6, 0x1cf, 0x9b, 0x3af, 0x303, 0x2, 0x189, 0x34c, 0x338, 0x193, 0xbb, 0x309, 0x3a6, 0x3ee, 0x8f, 0xee, 0x3c4, 0x38d, 0x22c, 0x3eb, 0x15d, 0x3d9, 0x21, 0x266, 0x103, 0x270, 0x3cb, 0x1fb, 0x37c, 0x3cd, 0x360, 0x2a1, 0x28c, 0x1d5, 0x36c, 0x39e, 0x136, 0x357, 0x20f, 0x4, 0x312, 0x291, 0x279, 0x326, 0x176, 0x21b, 0x345, 0x3d5, 0x11e, 0x1dc, 0x381, 0x313, 0x51, 0x3df, 0x2ba, 0x3bb, 0x42, 0xc5, 0x206, 0xe9, 0x39f, 0x3f6, 0x2f1, 0x393, 0x2c9, 0x14b, 0x111, 0x3aa, 0x2d1, 0x335, 0x26c, 0x2a7, 0x17, 0x8, 0x22d, 0x12b, 0xfb, 0x245, 0x2ec, 0x3f, 0x283, 0x3a3, 0x23c, 0x3b8, 0x30b, 0x22f, 0x189, 0x291, 0xfb, 0x83, 0x3a2, 0x1f8, 0x6a, 0x95, 0x23b, 0x3cf, 0x1db, 0x3bd, 0x1bb, 0x69, 0x20e, 0x181, 0x2c2, 0x5e, 0x352, 0x3b3, 0xd7, 0x3b1, 0x3c5, 0x29a, 0x233, 0x39c, 0x17e, 0x6c, 0x1aa, 0x146, 0x1d5, 0x2d1, 0x263, 0x1a2, 0x115, 0x170, 0x100, 0x272, 0x8d, 0x2ce, 0x220, 0x1a1, 0x38e, 0x2ca, 0xd, 0x3f7, 0x62, 0xc6, 0x29e, 0x1e, 0x1ca, 0x292, 0x260, 0x339, 0x2af, 0x7d, 0x85, 0x29d, 0x285, 0x270, 0x39f, 0x3e5, 0x3d6, 0xa7, 0xc3, 0x13a, 0xd9, 0x2dd, 0x1d, 0x351, 0x128, 0x36d, 0x2bc, 0x240, 0x275, 0x3b, 0x322, 0xc1, 0x228, 0x1f2, 0x32b, 0x11b, 0x1c, 0x2d8, 0x3b9, 0x396, 0x23f, 0x1e2, 0x38d, 0x51, 0x3b7, 0x2fa, 0x1e7, 0x29, 0x96, 0xa0, 0x75, 0xd6, 0x238, 0x154, 0x261, 0x2b0, 0x3e, 0x86, 0x6, 0x13f, 0x37d, 0x21a, 0x30a, 0x1de, 0x19, 0x17c, 0x37e, 0x81, 0x312, 0x256, 0x3d1, 0x22, 0xb5, 0x2e7, 0x165, 0xd, 0x3e7, 0x188, 0x239, 0x1ba, 0x3c0, 0x27c, 0x3c2, 0x51, 0x367, 0x3fa, 0x323, 0x290, 0x2e4, 0x5a, 0x2fe, 0x39d, 0x1ee, 0x3e6, 0x29a, 0x6f, 0x26b, 0x3e2, 0x2c9, 0x125, 0x134, 0x36a, 0x1d, 0x2ab, 0xa9, 0x35e, 0x39a, 0x82, 0x5f, 0x1bf, 0x81, 0x160, 0x34c, 0xfb, 0x106, 0x293, 0x3db, 0x2a9, 0x284, 0x3fb, 0x31, 0xc6, 0x135, 0x78, 0x24b, 0x17a, 0x8b, 0x3eb, 0x17d, 0x1e7, 0x52, 0x258, 0x109, 0x359, 0x2f6, 0x33b, 0x37a, 0x151, 0x38a, 0x1ce, 0x17e, 0xd8, 0x2a1, 0x222, 0x16f, 0x286, 0x1d6, 0x94, 0x36d, 0x171, 0x112, 0x38c, 0x3b0, 0x91, 0x2c, 0x26d, 0x19c, 0x326, 0x1d1, 0x1f8, 0xd4, 0x254, 0x1fc, 0x87, 0x31e, 0x2a3, 0xf, 0x1ca, 0x12d, 0x192, 0x1fe, 0x2aa, 0x3bb, 0x108, 0x4b, 0xa0, 0xea, 0x358, 0x1e4, 0x16d, 0xab, 0x173, 0x22d, 0x14a, 0x2b7, 0x220, 0x28d, 0x9e, 0x3cc, 0x11b, 0x70, 0x1d3, 0x3a3, 0x1c4, 0x3e3, 0x3b6, 0x1d7, 0x305, 0xe5, 0x12d, 0x324, 0x3f1, 0x17d, 0x3ce, 0x148, 0x2e4, 0xb4, 0x3ea, 0xd7, 0x2df, 0x27, 0x3e1, 0x3e5, 0x343, 0x262, 0xac, 0x3e, 0x218, 0x60, 0x34b, 0x32e, 0x2ee, 0x1ab, 0x33c, 0x25, 0x3b2, 0x171, 0x224, 0x22b, 0x1bf, 0x102, 0x189, 0x256, 0x3ab, 0x88, 0x1a1, 0x223, 0xf3, 0x340, 0x1c, 0x372, 0x3ee, 0x71, 0x3fe, 0x2e9, 0x373, 0x1c3, 0x13b, 0x149, 0xc9, 0x1fe, 0x15d, 0x2f7, 0x52, 0xb9, 0x2d, 0x2fe, 0x333, 0x3b1, 0x30f, 0x1fa, 0x1fb, 0x3d6, 0x29c, 0x2b, 0x20b, 0x86, 0x18, 0x3d4, 0x2cf, 0x2bf, 0x36c, 0xcf, 0x10b, 0x2e8, 0x15e, 0x89, 0x38c, 0x369, 0x244, 0x160, 0x291, 0x3ec, 0x22, 0x16a, 0x38e, 0x33a, 0xd0, 0x7, 0x2d8, 0x2ff, 0x11e, 0x2fb, 0x1b8, 0x3da, 0x376, 0x53, 0x121, 0x195, 0x248, 0x114, 0x3c1, 0x1b1, 0x176, 0x1f8, 0x350, 0x101, 0x3e7, 0x229, 0x3d8, 0x243, 0x379, 0x1b8, 0x3bd, 0x1c3, 0x276, 0x12d, 0x241, 0x3df, 0x3fa, 0x97, 0x15a, 0x5e, 0x2a6, 0x123, 0x133, 0xa, 0x23e, 0x358, 0x399, 0x2fd, 0x29a, 0x1bc, 0x2f1, 0x14e, 0x2b, 0x1f, 0x218, 0xc0, 0x137, 0x146, 0x2b3, 0x105, 0x2ab, 0x2a4, 0x185, 0x371, 0x320, 0x2a7, 0x170, 0x12, 0x19f, 0x76, 0x24c, 0x58, 0x34c, 0x3ec, 0x44, 0x1a1, 0x4f, 0x3cc, 0x236, 0x1c0, 0x283, 0x24e, 0xfe, 0x10e, 0xc6, 0xdd, 0x389, 0x3c4, 0xae, 0xda, 0x230, 0x2a, 0x4c, 0x339, 0x155, 0x37f, 0x52, 0x172, 0xb4, 0x3dd, 0x35c, 0x2d5, 0x270, 0xc7, 0x8e, 0x2a8, 0x251, 0x2e6, 0x1ce, 0x1f1, 0x19b, 0x13a, 0x2c1, 0x205, 0x27e, 0x3b5, 0x35b, 0x36c, 0x19e, 0x25, 0x36d, 0x1cd, 0x104, 0x2f8, 0x385, 0x10, 0x139, 0xa6, 0x8d, 0xb3, 0xc1, 0x2c8, 0x19c, 0x106, 0xb5, 0x315, 0x1e6, 0x236, 0x380, 0x21e, 0x254, 0x3fb, 0x188, 0x1ec, 0x243, 0x2fb, 0x2e9, 0x1d7, 0xf, 0x24b, 0x3c2, 0x288, 0x46, 0x20e, 0x26, 0x339, 0x2aa, 0x1e7, 0x290, 0x30d, 0x2ad, 0x295, 0x133, 0x14, 0xea, 0x2f6, 0x1ee, 0x30f, 0x3e1, 0x38f, 0x55, 0x196, 0x173, 0x1ce, 0x3e2, 0x265, 0x1c2, 0x43, 0x30, 0x29f, 0x146, 0x16f, 0x1d, 0x175, 0x21a, 0xcc, 0x1cf, 0x344, 0x2e8, 0x171, 0x82, 0x2f8, 0x303, 0x40, 0x1da, 0x308, 0x93, 0x2c, 0x34c, 0x3d1, 0x110, 0x113, 0xf9, 0x16e, 0xbb, 0x1f8, 0x2a9, 0xd, 0x307, 0x2d8, 0x3ee, 0x1c4, 0x397, 0x31e, 0x135, 0x3c0, 0x3c4, 0x15c, 0x368, 0x1a4, 0x2a0, 0x192, 0x3eb, 0x3fa, 0x12e, 0x161, 0x2f0, 0x23a, 0x21, 0x4b, 0x109, 0x2fe, 0xd7, 0x36e, 0x270, 0x18e, 0x238, 0x16d, 0x151, 0x6f, 0x37c, 0x14c, 0x234, 0x191, 0xb, 0x1a6, 0x3d1, 0x220, 0x45, 0x3c1, 0x2cd, 0x34d, 0x2e7, 0x27d, 0x11b, 0x380, 0x35, 0x142, 0x3e7, 0xb6, 0x1f7, 0x1c4, 0x327, 0x63, 0x1ba, 0x77, 0x6e, 0x3bd, 0x305, 0x321, 0x3c2, 0x119, 0x118, 0x54, 0x260, 0x3f1, 0x3fa, 0x25c, 0x18d, 0x3ad, 0x3e8, 0x29, 0x2e4, 0x1a9, 0x34e, 0x133, 0x28, 0x3a8, 0x39d, 0x2df, 0x138, 0x18e, 0x79, 0x1bd, 0x29a, 0x2f9, 0x343, 0x334, 0x35a, 0xe7, 0x3e2, 0xc3, 0x301, 0x218, 0x300, 0x354, 0x134, 0x2c5, 0x13f, 0x363, 0x2ee, 0x143, 0x2ab, 0x282, 0x66, 0x1cf, 0x281, 0x3b2, 0x39a, 0x32, 0x3af, 0x170, 0x48, 0x1c6, 0x1bf, 0x2, 0x298, 0x61, 0x322, 0x16, 0x34c, 0x3ab, 0x49, 0x8a, 0x38b, 0x193, 0x293, 0x1c7, 0xf3, 0x236, 0x309, 0x6a, 0x284, 0x3c7, 0x16c, 0x3ee, 0x388, 0x247, 0xc6, 0x374, 0xee, 0xdc, 0x373, 0x203, 0x24b, 0x298, 0xc2, 0x93, 0xb0, 0xa5, 0x195, 0x264, 0x199, 0xfb, 0x88, 0x226, 0x3c1, 0x193, 0x12f, 0x315, 0x391, 0x328, 0x1f8, 0x2b6, 0xd0, 0x70, 0x10f, 0xa1, 0x3e7, 0x16c, 0x3d5, 0x23b, 0x21c, 0x7b, 0x243, 0x3fe, 0x2c3, 0x135, 0x31b, 0x37, 0x3bd, 0x203, 0x9f, 0x22f, 0x1b4, 0x348, 0x12d, 0x22c, 0x215, 0x20e, 0x98, 0x3fc, 0x3fa, 0xb1, 0x23d, 0x157, 0x2f7, 0x129, 0x5e, 0x11d, 0x42, 0x258, 0x168, 0x1a7, 0x133, 0x50, 0x2bb, 0xd7, 0x1a3, 0x341, 0x358, 0xf7, 0x217, 0x337, 0x11c, 0x2da, 0x29a, 0x1fb, 0x117, 0x196, 0x1c5, 0xdf, 0x14e, 0x158, 0x3c9, 0x17e, 0x336, 0x384, 0x218, 0x209, 0x14b, 0x1b2, 0x3, 0x3a1, 0x146, 0x1b5, 0x1d0, 0x1ef, 0x2bf, 0x2a5, 0x2ab, 0x10d, 0x198, 0x263, 0x4a, 0x2b5, 0x371, 0x136, 0xba, 0x171, 0x208, 0x3d3, 0x170, 0x90, 0x311, 0x1e3, 0x20, 0x3b4, 0x76, 0x139, 0x308, 0x91, 0x312, 0x8d, 0x191, 0x2c, 0x256, 0x195, 0xc1, 0x26d, 0x3d1, 0x92, 0x59, 0x19c, 0x22, 0x113, 0x3c1, 0x326, 0xb5, 0x9e, 0x16e, 0x1d1, 0x2e7, 0x1e6, 0x194, 0x1f8, 0x165, 0x340, 0x380, 0xd4, 0xd, 0xe, 0x345, 0x254, 0x3e7, 0x2d8, 0x34f, 0x1fc, 0x188, 0x37b, 0x1c4, 0x87, 0x239, 0x243, 0x3f5, 0x31e, 0x1ba, 0x1dc, 0x2e9, 0x2a3, 0x3c0, 0x21f, 0x3bd, 0xf, 0x27c, 0x15c, 0x376, 0x1ca, 0x3c2, 0x6d, 0x1a4, 0x12d, 0x51, 0x46, 0x54, 0x192, 0x367, 0x347, 0x26, 0x1fe, 0x3fa, 0x162, 0xe6, 0x2aa, 0x323, 0x161, 0x3ad, 0x3bb, 0x290, 0x5e, 0x23a, 0x108, 0x2e4, 0x2ad, 0x85, 0x4b, 0x5a, 0x2d7, 0x133, 0xa0, 0x2fe, 0x2b1, 0x206, 0xea, 0x39d, 0x36e, 0x3a4, 0x358, 0x1ee, 0x4e, 0x18e, 0x1e4, 0x3e6, 0x3e1, 0x47, 0x16d, 0x29a, 0x3f6, 0x55, 0xab, 0x6f, 0x3d6, 0x334, 0x272, 0x3b, 0x81, 0x14c, 0x184, 0x91, 0x22d, 0x234, 0x93, 0x2c0, 0x242, 0x191, 0x58, 0x14a, 0xb3, 0xb, 0x12b, 0x195, 0x182, 0x1a6, 0x2b7, 0x132, 0x332, 0x3d1, 0x124, 0x164, 0xfb, 0x220, 0x228, 0x19c, 0x44, 0x45, 0x237, 0x20c, 0x28d, 0x3c1, 0x245, 0x2d4, 0xf9, 0x2cd, 0x25e, 0x9e, 0x2dc, 0x34d, 0x315, 0x25f, 0x2ec, 0x2e7, 0x3cc, 0x259, 0x3db, 0x27d, 0xca, 0x1f8, 0x2ca, 0x11b, 0x3f, 0x15b, 0x1a0, 0x380, 0x1a8, 0x34, 0x70, 0x35, 0x202, 0xe, 0x283, 0x142, 0x307, 0x1d3, 0x12a, 0x3e7, 0x1b9, 0x127, 0x3fb, 0xb6, 0x3a3, 0x1fc, 0x310, 0x1f7, 0x23b, 0x62, 0x3b9, 0x1c4, 0x10e, 0xf6, 0x23c, 0x327, 0x318, 0x243, 0x3e3, 0x63, 0x1cb, 0x1ff, 0x18f, 0x1ba, 0x3b8, 0x3b6, 0x135, 0x77, 0x370, 0x2a3, 0x389, 0x6e, 0x1d7, 0xf0, 0x30b, 0x3bd, 0x1e, 0x1e2, 0x2f2, 0x305, 0x13e, 0x15c, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0x1da, 0x3b0, 0x8, 0x2cb, 0x1bf, 0x40, 0x275, 0x1e3, 0x200, 0x38c, 0x303, 0x24, 0x5f, 0x2e, 0x120, 0x2f8, 0x170, 0x112, 0x3ed, 0x392, 0x82, 0x357, 0xaf, 0x19, 0x28e, 0x171, 0xc8, 0x5d, 0x39a, 0x249, 0x2e8, 0xef, 0x26c, 0x36d, 0x371, 0x344, 0x35e, 0x3be, 0x216, 0x2c6, 0x1cf, 0x94, 0x21d, 0x263, 0xa9, 0xcc, 0x33c, 0x141, 0x269, 0x1d6, 0x21a, 0x36c, 0x2ab, 0xf4, 0x356, 0x175, 0x3a9, 0x286, 0x3ba, 0x177, 0x1d, 0x1ef, 0x3aa, 0xe8, 0x363, 0x16f, 0x349, 0x32e, 0x36a, 0x27e, 0x146, 0x366, 0x3d4, 0x222, 0x306, 0x29f, 0x134, 0x6, 0xd5, 0x1b2, 0x30, 0x2a1, 0x18b, 0x180, 0x125, 0x43, 0x1b, 0x13a, 0x218, 0xd8, 0x1c2, 0xe4, 0x2c9, 0x20b, 0x329, 0x265, 0x7c, 0x17e, 0x30c, 0x3e0, 0x3e2, 0x56, 0x33f, 0x32f, 0x2b0, 0x1ce, 0x14e, 0x1ad, 0x26b, 0x262, 0x173, 0x37c, 0x334, 0x38a, 0x3b4, 0x2db, 0x40, 0xe3, 0x385, 0x24, 0xbe, 0xb8, 0x112, 0x3d3, 0x253, 0x19, 0x115, 0x1cd, 0x249, 0x1d9, 0x3bc, 0x344, 0x2b5, 0x2e3, 0x94, 0x33, 0x19e, 0x141, 0xdb, 0x351, 0xf4, 0x2a5, 0x1dd, 0x177, 0x3a, 0x3b5, 0x16f, 0x29b, 0xa3, 0x366, 0x3a1, 0x9a, 0x6, 0x1aa, 0x2c1, 0x180, 0x24a, 0x10c, 0xd8, 0x384, 0x390, 0x265, 0xf8, 0x1f1, 0x56, 0x277, 0xa7, 0x1ad, 0xdf, 0x19a, 0x38a, 0x3a5, 0x251, 0x378, 0xaa, 0x14d, 0x38f, 0x2da, 0x3f4, 0x238, 0x3c5, 0xc7, 0x33b, 0x9c, 0x1ac, 0x36b, 0x341, 0x3ca, 0x346, 0x1d4, 0x35c, 0x14, 0x1f5, 0x29d, 0x109, 0x1a7, 0x221, 0x2d0, 0x10a, 0x172, 0x145, 0x210, 0x2f, 0x1f4, 0x129, 0x3d2, 0x1e7, 0x2c2, 0x155, 0x12e, 0x1cc, 0x1fd, 0x302, 0x3fc, 0x3a7, 0x130, 0x2c7, 0x2a, 0x8b, 0x8c, 0x292, 0x288, 0x348, 0x1e1, 0x368, 0x394, 0xae, 0x386, 0x361, 0x37e, 0x200, 0x22b, 0x5c, 0x112, 0x3af, 0x15e, 0xc8, 0x174, 0x1de, 0x344, 0x163, 0x39e, 0xa9, 0x330, 0x3ac, 0xf4, 0x143, 0x37d, 0x3aa, 0x3a0, 0x255, 0x366, 0x34b, 0x268, 0x30, 0x296, 0x86, 0xd8, 0x301, 0x25b, 0x30c, 0x39b, 0x257, 0x1ad, 0x1be, 0x261, 0x6f, 0x22e, 0x2a2, 0x38f, 0x1bd, 0x3cb, 0x1e4, 0x27, 0xd6, 0x36b, 0x28b, 0x333, 0x206, 0x17f, 0x34a, 0x109, 0x34e, 0x96, 0x2ad, 0x84, 0x213, 0x1f4, 0x252, 0x353, 0x323, 0x73, 0x2fa, 0x302, 0x3f1, 0x287, 0x192, 0x23, 0x149, 0x288, 0x299, 0x38d, 0x376, 0x13e, 0x1ed, 0x78, 0x6e, 0x14f, 0x1dc, 0x18f, 0x396, 0x397, 0xf6, 0x388, 0x188, 0x3a3, 0x3ff, 0x2ed, 0x142, 0x1c, 0xd4, 0x1a0, 0x7e, 0x33a, 0x259, 0x1c7, 0x16e, 0x25e, 0x1f2, 0x106, 0x45, 0x338, 0x92, 0x332, 0x167, 0x201, 0x14a, 0x322, 0x312, 0x184, 0x102, 0x1da, 0x2cb, 0x1e3, 0x24, 0x2f8, 0x392, 0x19, 0x5d, 0xef, 0x344, 0x2c6, 0x263, 0x141, 0x36c, 0x175, 0x177, 0xe8, 0x32e, 0x366, 0x29f, 0x1b2, 0x180, 0x13a, 0xe4, 0x265, 0x3e0, 0x32f, 0x1ad, 0x37c, 0x196, 0x378, 0x2a8, 0xfd, 0x238, 0x30f, 0x6b, 0x36b, 0x11f, 0xd7, 0x14, 0x3dd, 0x18a, 0x2d0, 0x21, 0x30d, 0x1f4, 0xad, 0x157, 0x12e, 0x339, 0x3ef, 0x130, 0x30e, 0x2a0, 0x288, 0x13b, 0x22f, 0x386, 0x3c4, 0x1d7, 0x23f, 0x365, 0x1cb, 0x397, 0x1ec, 0x23b, 0x5b, 0x24e, 0x307, 0x21e, 0x68, 0x3f, 0x33a, 0xbb, 0x315, 0x362, 0x1a1, 0x237, 0x110, 0x2c8, 0x2b7, 0x201, 0x294, 0x93, 0xa6, 0x76, 0x8, 0x275, 0x303, 0x120, 0x3ed, 0xaf, 0xc8, 0x2e8, 0x371, 0x216, 0x21d, 0x33c, 0x21a, 0x356, 0x3ba, 0x3aa, 0x349, 0x146, 0x306, 0xd5, 0x18b, 0x1b, 0x1c2, 0x329, 0x30c, 0x33f, 0x14e, 0x173, 0x3d6, 0x19f, 0x385, 0x120, 0x3d3, 0x2bc, 0x249, 0x2d3, 0x2e3, 0xa9, 0xdb, 0x2be, 0x177, 0x1d0, 0xa3, 0x306, 0x1aa, 0x225, 0xd8, 0x1f, 0x1f1, 0x2b0, 0xdf, 0xcb, 0x378, 0x159, 0x3f4, 0x1e4, 0x9c, 0x17b, 0x346, 0x2bb, 0x29d, 0x5a, 0x10a, 0x382, 0x1f4, 0x15a, 0x155, 0x162, 0x3fc, 0x107, 0x8b, 0x69, 0x1e1, 0x376, 0xf1, 0x2ef, 0x23f, 0x2c3, 0x325, 0x87, 0x2ff, 0x3f9, 0x2ed, 0x101, 0x1c0, 0x165, 0x328, 0x38e, 0x362, 0x342, 0xce, 0x92, 0xd3, 0x25d, 0x160, 0xc2, 0x204, 0x2cb, 0x3c6, 0x90, 0x3ed, 0x15e, 0x320, 0x36d, 0x375, 0x250, 0x269, 0x15f, 0x2bf, 0xe8, 0x255, 0x183, 0xd5, 0x316, 0x6c, 0x20b, 0x2fc, 0x158, 0x26b, 0x261, 0x1bc, 0x2a8, 0x1fa, 0xf2, 0x4e, 0x2b9, 0x1a3, 0x359, 0x34a, 0x2d, 0x85, 0x1c1, 0xfa, 0xad, 0x2ae, 0xb1, 0x1fe, 0x287, 0x241, 0x230, 0x2f4, 0x1bb, 0x27c, 0x33e, 0x20f, 0x112, 0x147, 0x33d, 0x344, 0x30a, 0x271, 0xf4, 0x20a, 0x2cf, 0x366, 0x26e, 0x316, 0xd8, 0x3e, 0x3cd, 0x1ad, 0x1eb, 0x156, 0x38f, 0x1f3, 0x31c, 0x36b, 0x75, 0x16b, 0x109, 0x246, 0x1c1, 0x1f4, 0x2b4, 0x15d, 0x302, 0x3b7, 0xa8, 0x288, 0xe5, 0x2b8, 0x78, 0x370, 0x374, 0x397, 0x3b9, 0x3f8, 0x2ed, 0x202, 0x309, 0x33a, 0x2ec, 0x13c, 0x106, 0x228, 0x3ab, 0x201, 0x242, 0x122, 0x1da, 0x2f5, 0x48, 0x3ed, 0x2bc, 0x9b, 0x35e, 0x335, 0x282, 0x356, 0x2f3, 0x2de, 0x3d4, 0xd9, 0x300, 0x1c2, 0xbf, 0xac, 0x26b, 0xcb, 0x2f9, 0x16d, 0x39f, 0x27f, 0x3a4, 0x26f, 0x28, 0x2d7, 0x12c, 0x28a, 0x290, 0x2af, 0x25c, 0x1fe, 0x107, 0x116, 0x1a4, 0x313, 0x305, 0x21f, 0x29e, 0x1ff, 0x239, 0x319, 0xb6, 0x254, 0x38, 0x15b, 0x194, 0x38e, 0x2cd, 0x113, 0x279, 0x132, 0x256, 0x24d, 0x14c, 0x3b0, 0x275, 0x2e, 0x82, 0x5d, 0x371, 0x94, 0x269, 0x175, 0x3aa, 0x27e, 0x134, 0x180, 0x1c2, 0x17e, 0x2b0, 0x37c, 0xab, 0x38f, 0x3e6, 0x6b, 0x36e, 0x359, 0x133, 0x2d0, 0x108, 0x2f0, 0x323, 0x339, 0x347, 0x8b, 0x1a4, 0x22f, 0xf, 0xdc, 0x1ba, 0x397, 0x37b, 0x3fb, 0x345, 0x68, 0x1f8, 0x32b, 0xb5, 0x237, 0x92, 0x34c, 0x191, 0xa6, 0x3b0, 0x200, 0x2f8, 0xaf, 0x249, 0x35e, 0x263, 0x21a, 0x286, 0x363, 0x366, 0xd5, 0x43, 0x2c9, 0x3e0, 0x14e, 0x38a, 0x55, 0xfd, 0x1e4, 0x270, 0x39d, 0x14, 0x2d7, 0x258, 0x23a, 0xad, 0x2aa, 0x302, 0x367, 0x2a0, 0x6d, 0x24b, 0x3bd, 0x23f, 0x31e, 0x23c, 0x188, 0x24e, 0xe, 0x2a9, 0x194, 0x315, 0x326, 0x8a, 0x3d1, 0x201, 0x8d, 0x81, 0x2cb, 0x303, 0x112, 0x28e, 0xef, 0x216, 0xcc, 0x2ab, 0x177, 0x349, 0x222, 0x30, 0x13a, 0x329, 0x56, 0x26b, 0x196, 0xe3, 0xb8, 0x19, 0x1d9, 0x2e3, 0x141, 0x2a5, 0x3b5, 0x366, 0x1aa, 0x10c, 0x265, 0x277, 0x19a, 0x378, 0x2da, 0xc7, 0x36b, 0x1d4, 0x29d, 0x2d0, 0x210, 0x3d2, 0x12e, 0x3fc, 0x2a, 0x288, 0x394, 0x3da, 0x23f, 0x235, 0xe2, 0x5b, 0xa1, 0x1c0, 0x33a, 0x3a2, 0x3e4, 0x110, 0xd3, 0x2cc, 0xa6, 0x369, 0x12, 0x3ed, 0x2e2, 0x1a2, 0x21d, 0x3ac, 0x2bf, 0x349, 0x4d, 0xc0, 0x1c2, 0x2fc, 0x2d2, 0x3d6, 0x2a2, 0x11c, 0x4e, 0x1e5, 0xa, 0x2d7, 0xb9, 0xfa, 0x161, 0x2fa, 0x98, 0x46, 0x2f4, 0x1c3, 0x21f, 0x26a, 0x3cf, 0x37b, 0x3ff, 0x10f, 0x340, 0x3bf, 0x1b1, 0x113, 0x1f6, 0x304, 0x8d, 0x102, 0x33e, 0x2e, 0x104, 0x174, 0x3be, 0x152, 0x1ab, 0x1ef, 0x2dd, 0x26e, 0x43, 0x19b, 0x39b, 0x262, 0xde, 0x2b2, 0x337, 0x3dc, 0x75, 0x1a5, 0xb4, 0x84, 0x2f0, 0x24f, 0xff, 0x20e, 0xa2, 0xe5, 0x2f2, 0x1c6, 0x2e0, 0xc8, 0x1af, 0xcf, 0xf4, 0x74, 0x28c, 0x30, 0xe1, 0x2fc, 0x1ad, 0x343, 0x13d, 0x1e4, 0x1d2, 0x1ae, 0x109, 0x214, 0xbc, 0x323, 0xff, 0x15, 0x288, 0x321, 0x373, 0x1dc, 0x318, 0x7f, 0x2ed, 0x34, 0x3f0, 0x16e, 0x28d, 0x1f6, 0x201, 0x234, 0x2, 0x38c, 0x1c9, 0x190, 0x35e, 0x19e, 0x1e8, 0xe8, 0x111, 0x60, 0x1c2, 0x1f1, 0x35a, 0x28f, 0x27a, 0x3c8, 0x3a4, 0x35c, 0x212, 0x21, 0x178, 0x24f, 0x1fe, 0x2a, 0x119, 0x24b, 0x2ef, 0x3b8, 0x239, 0xfe, 0x1d3, 0x68, 0x3e9, 0x2dc, 0x113, 0x3ec, 0xb, 0x61, 0x4, 0x311, 0x392, 0x320, 0x2b5, 0x33c, 0x3d0, 0x1d0, 0x222, 0xc0, 0x384, 0x3e2, 0x2bd, 0x117, 0xfd, 0x399, 0x341, 0x2b1, 0x2d, 0x42, 0x2f0, 0x97, 0x3fc, 0x54, 0x232, 0x9f, 0x1d7, 0x379, 0x7b, 0x1fc, 0x3a6, 0xd0, 0x3db, 0x1b1, 0x226, 0x3d1, 0x16, 0xc2, 0x8, 0x38c, 0x392, 0x249, 0x2c6, 0x1d6, 0x177, 0x27e, 0x1b2, 0xd8, 0x3e0, 0x262, 0x378, 0x37a, 0x6b, 0x346, 0x3dd, 0x258, 0x1f4, 0x31a, 0x3ef, 0x8b, 0x13b, 0x2f2, 0x23f, 0xc6, 0x23b, 0x2ed, 0x68, 0x3db, 0x362, 0x8a, 0x2b7, 0x160, 0x76, 0x200, 0x3ed, 0x39a, 0x216, 0x269, 0x3ba, 0x36a, 0xd5, 0x218, 0x30c, 0x26b, 0xab, 0x47, 0x4e, 0x39d, 0xa0, 0x85, 0x5e, 0x323, 0x1fe, 0x54, 0x6d, 0x27c, 0x2a3, 0x3f5, 0x37b, 0x3e7, 0xd4, 0x194, 0x9e, 0x22, 0x26d, 0x191, 0x139, 0x1e3, 0x112, 0x5d, 0x3be, 0x141, 0x286, 0x32e, 0x6, 0x13a, 0x17e, 0x1ad, 0x28f, 0xfd, 0x33b, 0x11f, 0x1a5, 0x2d0, 0x52, 0x157, 0x302, 0x30e, 0x17a, 0x386, 0xdc, 0x1cb, 0x31, 0x24e, 0x70, 0x33a, 0x293, 0x237, 0x99, 0x294, 0x81, 0x275, 0x170, 0xc8, 0x35e, 0x33c, 0x3a9, 0x349, 0x134, 0x1b, 0x7c, 0x14e, 0x6f, 0x311, 0x253, 0x26c, 0x33, 0x2be, 0x16f, 0x137, 0x10c, 0x30c, 0xdf, 0x2ac, 0x238, 0xe9, 0x35c, 0x5a, 0x210, 0x2af, 0x302, 0x215, 0x1e1, 0xf, 0x1db, 0x11e, 0x5b, 0x101, 0xfc, 0x16e, 0x226, 0x35f, 0x160, 0xec, 0x12, 0x357, 0x1de, 0x250, 0x356, 0x2cf, 0x3, 0x13a, 0x2fc, 0x2bd, 0x55, 0x3cb, 0x3b1, 0x359, 0x314, 0x11d, 0x161, 0x3fd, 0x241, 0x13b, 0x1ed, 0xee, 0x239, 0x3f8, 0x10f, 0x236, 0x223, 0x11, 0x26d, 0x322, 0xed, 0x303, 0x104, 0x3b2, 0x263, 0x1e8, 0x3a0, 0x134, 0x36, 0x1f0, 0x262, 0x2f9, 0x1f3, 0x358, 0x5, 0x34e, 0x30d, 0x3ce, 0xff, 0x54, 0xda, 0x1e2, 0x135, 0x327, 0x3a3, 0xe, 0x2ca, 0x34d, 0x237, 0x132, 0x242, 0x1, 0x311, 0x253, 0x26c, 0x33, 0x2be, 0x16f, 0x137, 0x10c, 0x30c, 0xdf, 0x2ac, 0x238, 0xe9, 0x35c, 0x5a, 0x210, 0x2af, 0x302, 0x215, 0x1e1, 0xf, 0x22b, 0x15e, 0x344, 0x330, 0x37d, 0x366, 0x296, 0x25b, 0x1ad, 0x22e, 0x3cb, 0x36b, 0x17f, 0x96, 0x1f4, 0x73, 0x287, 0x288, 0x13e, 0x14f, 0x397, 0x3a3, 0x1c, 0x33a, 0x25e, 0x338, 0x201, 0x184, 0x80, 0x3ed, 0x273, 0x128, 0x356, 0x197, 0xc, 0x1c2, 0x393, 0x31d, 0x16d, 0x231, 0x285, 0x2d7, 0x382, 0x3ce, 0x1fe, 0x150, 0x2d9, 0x21f, 0x2e1, 0x62, 0x254, 0x21b, 0x25f, 0x113, 0x35f, 0x2c0, 0x3b0, 0x90, 0x115, 0x3be, 0x10d, 0x3a, 0x222, 0x209, 0xf8, 0x262, 0x1fb, 0x3c5, 0x2f6, 0x50, 0x10a, 0x2f0, 0xb1, 0x2c7, 0x17a, 0x203, 0x1db, 0x23c, 0x16c, 0x1a, 0x3db, 0x193, 0xb2, 0xb3, 0x298, 0x3c6, 0x82, 0x3b2, 0xcf, 0x3a9, 0x13f, 0x364, 0x2c9, 0xe7, 0x32c, 0x47, 0x138, 0x1ae, 0x5a, 0x29, 0x2ae, 0x26, 0x118, 0x57, 0x3c0, 0x63, 0x7f, 0x345, 0x11b, 0x223, 0x22, 0x1a6, 0x126, 0x2cb, 0x5f, 0x171, 0x216, 0x36c, 0x363, 0x6, 0x1c2, 0x32f, 0x6f, 0x37a, 0x358, 0x14, 0x85, 0x2f0, 0x162, 0x30e, 0x3c2, 0x78, 0x31e, 0x23b, 0x345, 0x236, 0x9e, 0x110, 0x256, 0x81, 0x38c, 0xaf, 0x344, 0x269, 0x1ef, 0x306, 0x13a, 0x3e2, 0x38a, 0x16d, 0x6b, 0x206, 0x295, 0x5e, 0x12e, 0x367, 0x17a, 0xf, 0x365, 0x1c4, 0x2ed, 0x340, 0x315, 0x22, 0x34c, 0x91, 0x275, 0x392, 0x26c, 0xcc, 0x3ba, 0x366, 0x125, 0x17e, 0x173, 0x2a8, 0x18e, 0x346, 0x2d7, 0x30d, 0x323, 0x3eb, 0x12d, 0x386, 0x2e9, 0x23c, 0x2d8, 0x68, 0x2e7, 0x106, 0x26d, 0x93, 0x2cb, 0x170, 0x249, 0x21d, 0x175, 0x36a, 0x2a1, 0x329, 0x1ad, 0x55, 0x337, 0x36e, 0x3dd, 0x2e4, 0x1e7, 0x1fe, 0x2a0, 0x376, 0xdc, 0x243, 0x5b, 0xd, 0x3db, 0x326, 0x2c8, 0x191, 0x1da, 0x2e, 0xc8, 0x2c6, 0x2ab, 0x16f, 0xd5, 0xe4, 0x2b0, 0x28f, 0xbe, 0x1cd, 0x94, 0x2a5, 0xa3, 0x180, 0xf8, 0x19a, 0x38f, 0x9c, 0x35c, 0x2d0, 0x129, 0x1fd, 0x8b, 0x394, 0x355, 0x397, 0x297, 0x1c0, 0x32b, 0x226, 0x2ce, 0xa6, 0x3c6, 0x208, 0x35e, 0x3ac, 0x2b3, 0xd5, 0x1c8, 0x2d2, 0x55, 0x267, 0x1a3, 0x2d7, 0x213, 0x97, 0x367, 0x2f4, 0x3c, 0x31e, 0x7f, 0x10f, 0x194, 0x1f2, 0x248, 0x8d, 0x10, 0x3f2, 0xef, 0x152, 0x20a, 0x222, 0x36, 0x39b, 0x196, 0x8e, 0x1d2, 0x1a5, 0x153, 0x2b4, 0x3ef, 0xa2, 0x13e, 0x135, 0x10e, 0x12a, 0x3f, 0x2dc, 0x228, 0xb3, 0x272, 0x17, 0xc8, 0x185, 0x2be, 0x36a, 0x14b, 0xbf, 0x173, 0x159, 0x231, 0x206, 0x123, 0x178, 0x162, 0x215, 0x313, 0x3c0, 0x18c, 0x3f9, 0xd4, 0x176, 0x31f, 0xc1, 0xc2, 0x100, 0x357, 0x2eb, 0x10d, 0xe8, 0x268, 0x360, 0x1ce, 0x156, 0xf2, 0x11f, 0x266, 0x11d, 0x31a, 0x287, 0x232, 0x3c4, 0x17c, 0x33d, 0xa9, 0x20a, 0x4d, 0xd8, 0xe7, 0x156, 0x1e4, 0x75, 0x314, 0x1f4, 0x398, 0xa8, 0x376, 0x370, 0x71, 0x2ed, 0x11b, 0x13c, 0x92, 0x242, 0x10, 0x3ed, 0x3bc, 0x282, 0xe8, 0xd9, 0x19b, 0x26b, 0x14d, 0x27f, 0x359, 0x12c, 0x37f, 0x1fe, 0x292, 0x305, 0x365, 0x319, 0x283, 0x194, 0x3e4, 0x132, 0x61, 0x100, 0x2a7, 0x3be, 0x7a, 0x29b, 0x18b, 0x186, 0x2f1, 0xfd, 0x3b1, 0x1f5, 0x2e4, 0x395, 0x3df, 0x17a, 0x3c, 0x235, 0x1fc, 0x6a, 0x176, 0x237, 0x304, 0x219, 0x24, 0x22a, 0x39e, 0x3a9, 0x1ea, 0x86, 0x56, 0x343, 0x3cb, 0x36e, 0x36f, 0x213, 0x12e, 0x187, 0x38d, 0x3c0, 0x318, 0x3ff, 0x2a9, 0x34d, 0x338, 0x2c, 0x1d8, 0x240, 0x2e8, 0x19e, 0x2ee, 0x29f, 0x72, 0x169, 0x55, 0xc7, 0x285, 0x295, 0x178, 0x2c4, 0x46, 0xae, 0x77, 0x1ec, 0x387, 0x2ca, 0xb5, 0x3ec, 0x2c0, 0x1bf, 0x2f8, 0xef, 0x141, 0xe8, 0x1b2, 0x265, 0x37c, 0xfd, 0x36b, 0x3dd, 0x30d, 0x12e, 0x30e, 0x22f, 0x23f, 0x1ec, 0x307, 0x33a, 0x1a1, 0x2b7, 0xa6, 0x303, 0xc8, 0x21d, 0x3ba, 0x306, 0x1c2, 0x14e, 0x3f6, 0x4e, 0x2b1, 0x2ad, 0x161, 0x347, 0x6d, 0x21f, 0x243, 0x2d8, 0x340, 0x9e, 0x92, 0x8d, 0x40, 0x357, 0x3be, 0xf4, 0x27e, 0x43, 0x56, 0x28f, 0x337, 0x346, 0x295, 0x2f0, 0x302, 0x230, 0x2f2, 0x2fb, 0x3ee, 0x70, 0x32b, 0x8a, 0xb3, 0x1da, 0x170, 0x26c, 0x269, 0x363, 0x30, 0x7c, 0x334, 0x47, 0x3a4, 0x133, 0x23a, 0xe6, 0x54, 0x376, 0x2e9, 0x1c4, 0x345, 0x194, 0x3c1, 0xc1, 0x308, 0x24, 0x5d, 0x263, 0x177, 0x29f, 0xe4, 0x1ad, 0x2a8, 0x6b, 0x14, 0x21, 0x157, 0x130, 0x13b, 0x1d7, 0x397, 0x24e, 0x3f, 0x362, 0x2c8, 0x93, 0x275, 0xaf, 0x216, 0x356, 0x146, 0x1b, 0x33f, 0xab, 0x1f9, 0x3bc, 0x21a, 0x29b, 0x225, 0x56, 0x117, 0xc7, 0x206, 0x10a, 0x2af, 0x130, 0x276, 0x355, 0x87, 0xa1, 0x3e9, 0x106, 0x291, 0x204, 0x2f8, 0x1de, 0x10d, 0x349, 0x316, 0x2b, 0x28f, 0x267, 0x103, 0x85, 0x353, 0x98, 0x13b, 0x3ae, 0x247, 0x254, 0x3f0, 0x83, 0x34c, 0x102, 0x17c, 0xef, 0x282, 0x3a0, 0x18b, 0x211, 0x343, 0x337, 0x285, 0x246, 0x3ad, 0x4c, 0x299, 0x1d7, 0x327, 0x12a, 0x1f8, 0x245, 0x1a6, 0x81, 0xbe, 0x273, 0x141, 0x1d0, 0x2c1, 0x30c, 0x3a5, 0x39f, 0x346, 0x123, 0x3d2, 0x26, 0x348, 0x2ef, 0x397, 0x95, 0xfc, 0x326, 0xd3, 0x244, 0x5f, 0x33d, 0x2a4, 0xe8, 0x364, 0x186, 0x3d6, 0x3cb, 0x1a3, 0x295, 0x1e9, 0x13, 0x1a4, 0x373, 0x3cf, 0x24e, 0x7e, 0x193, 0x26d, 0x122, 0x22b, 0x39a, 0x152, 0x74, 0x1b2, 0xc3, 0x1eb, 0x3e1, 0x2d5, 0x34e, 0x2f0, 0x20d, 0xd2, 0x3bd, 0x3f2, 0x2eb, 0xf4, 0x1ea, 0x39, 0x1ad, 0x2b2, 0x2b9, 0x109, 0x148, 0x3fd, 0x288, 0x30b, 0x8f, 0x2ed, 0xca, 0x38b, 0x201, 0x1d8, 0x224, 0x35e, 0x2be, 0x2c5, 0x1c2, 0x131, 0x317, 0x3a4, 0xc5, 0x3e8, 0x1fe, 0xbd, 0xf0, 0x239, 0x387, 0x27d, 0x113, 0x25d, 0x3b4, 0x392, 0x10b, 0x2a5, 0x222, 0x360, 0xdf, 0xfd, 0x1b7, 0x1a7, 0x2f0, 0x13, 0x348, 0x1d7, 0x247, 0xa1, 0x3db, 0x11, 0xa5, 0x8, 0x3af, 0x375, 0x3a9, 0x34b, 0x1c8, 0x173, 0x1bd, 0x1e5, 0x5a, 0x252, 0x3d7, 0x6d, 0x6e, 0x71, 0x345, 0x259, 0x67, 0x2c, 0x2db, 0x104, 0x2c6, 0x1dd, 0x205, 0x20b, 0x19a, 0x8e, 0x11f, 0x221, 0x37f, 0x3eb, 0x1e1, 0x389, 0x1ec, 0x7, 0x3cc, 0x8a, 0x2cc, 0x19f, 0xaf, 0x4a, 0x105, 0x134, 0x336, 0x2f1, 0x3e1, 0x1a3, 0x123, 0x3ad, 0x98, 0x276, 0x2a3, 0x21c, 0x101, 0x2e7, 0x88, 0x121, 0x40, 0x3ed, 0x3be, 0x3a9, 0x29f, 0x329, 0x38a, 0x3e6, 0xd7, 0x2ad, 0x31a, 0x54, 0x386, 0x31e, 0x3fb, 0x165, 0x1a1, 0x195, 0x1da, 0x392, 0x216, 0x286, 0x134, 0x265, 0x3d6, 0x337, 0x206, 0x21, 0x2aa, 0x8b, 0x27c, 0x1cb, 0x2d8, 0x236, 0x3c1, 0x201, 0x3b0, 0x82, 0x2c6, 0x3ba, 0x6, 0x7c, 0x196, 0x1e4, 0x359, 0x2e4, 0x12e, 0x46, 0x2f2, 0x3f5, 0x24e, 0x1f8, 0x106, 0x256, 0x8, 0x357, 0x1cf, 0x177, 0xd5, 0x17e, 0x6f, 0x30f, 0x2b1, 0x145, 0xe6, 0x2a0, 0xf, 0xc6, 0x3e7, 0x33a, 0x113, 0xb3, 0x2cb, 0xaf, 0x94, 0x1d, 0x1b2, 0x30c, 0x28f, 0x18e, 0x14, 0x108, 0x17d, 0x51, 0x3c4, 0x243, 0x2ed, 0x194, 0x237, 0x2c, 0x1bf, 0x19, 0x21d, 0x1ef, 0x30, 0x3e0, 0xab, 0x33b, 0x2fe, 0x30d, 0x162, 0x230, 0x3bd, 0x397, 0x254, 0x3db, 0x22, 0x294, 0x40, 0x28e, 0x263, 0x3aa, 0x2a1, 0x3e2, 0x378, 0x3d3, 0x2e3, 0x177, 0x1aa, 0x1f1, 0x378, 0x9c, 0x29d, 0x1f4, 0x3fc, 0x1e1, 0x23f, 0x2ff, 0x1c0, 0x362, 0xd3, 0x204, 0x3ed, 0x375, 0x2bf, 0xd5, 0x2fc, 0x1bc, 0x4e, 0x34a, 0xfa, 0x1fe, 0x2f4, 0x31b, 0x37b, 0xe0, 0x1b1, 0x26d, 0x102, 0x3f2, 0x3be, 0x35b, 0x26e, 0x17e, 0xde, 0x27, 0x1a5, 0x7d, 0xff, 0x17a, 0x389, 0x3b9, 0x70, 0x2dc, 0x332, 0x81, 0x1f9, 0x1df, 0x3a9, 0x137, 0xbf, 0x6f, 0x217, 0x2d6, 0x23a, 0x27b, 0xbd, 0x3c0, 0x3d8, 0x38, 0x16e, 0x199, 0x244, 0x2f8, 0x2eb, 0x3d0, 0x29f, 0x25b, 0x233, 0x30f, 0x16b, 0x11d, 0x339, 0x25a, 0x1e0, 0x1ec, 0x1c, 0xb7, 0x2c8, 0x122, 0x17c, 0x371, 0x1e8, 0x34b, 0x329, 0x31d, 0x383, 0x2b1, 0x28a, 0x398, 0x12d, 0xf0, 0xf6, 0xe, 0x25f, 0x164, 0x91, 0xbe, 0x3bc, 0xf4, 0x3a1, 0x390, 0x38a, 0x3c5, 0x35c, 0x145, 0x1cc, 0x292, 0x78, 0x3af, 0x39e, 0x3aa, 0x296, 0x257, 0x38f, 0x28b, 0x96, 0x323, 0x23, 0x1ed, 0x397, 0x142, 0x1c7, 0x92, 0x184, 0x240, 0x35e, 0x1dd, 0xc, 0x3e0, 0x2ac, 0x3dc, 0x2d7, 0x3d2, 0x260, 0x24b, 0x2e1, 0x1b9, 0x194, 0xce, 0x2c0, 0x303, 0x136, 0x2d1, 0x222, 0x336, 0x3a5, 0x18e, 0x50, 0xa4, 0x3ef, 0x1b4, 0x1db, 0x1fc, 0x2b6, 0x342, 0xb3, 0x33e, 0x2e2, 0x141, 0x13f, 0x39, 0x173, 0x1f3, 0x1ae, 0x145, 0x398, 0x25a, 0x3c0, 0x3b9, 0xe0, 0x362, 0x1a6, 0x2, 0x357, 0x335, 0x35d, 0x125, 0xa7, 0x317, 0x11f, 0x12c, 0x24f, 0x46, 0x3da, 0x327, 0x284, 0x38e, 0x124, 0x308, 0x89, 0x2b5, 0x3ba, 0x18, 0x3c9, 0x151, 0x3b1, 0x1a7, 0x3ad, 0xc9, 0x9f, 0x1cb, 0x372, 0x328, 0x19c, 0x189, 0x20f, 0x26c, 0x1ab, 0x4d, 0x265, 0x343, 0x31c, 0xa0, 0x148, 0x3d7, 0x368, 0x3b6, 0x3f8, 0x165, 0x28d, 0x166, 0x275, 0x357, 0x263, 0x16f, 0x13a, 0x262, 0x238, 0x359, 0x30d, 0x302, 0x13b, 0x135, 0x5b, 0x236, 0x237, 0x160, 0x303, 0x26c, 0x356, 0x134, 0x30c, 0x55, 0x358, 0x5a, 0x161, 0x54, 0xf, 0x239, 0xe, 0x16e, 0x26d, 0x1, 0x357, 0x263, 0x16f, 0x13a, 0x262, 0x238, 0x359, 0x30d, 0x302, 0x13b, 0x135, 0x5b, 0x236, 0x237, 0x160, 0x303, 0x26c, 0x356, 0x134, 0x30c, 0x55, 0x358, 0x5a, 0x161, 0x54, 0xf, 0x239, 0xe, 0x16e, 0x26d, 0x1, 0x357, 0x263, 0x16f, 0x13a, 0x262, 0x238, 0x359, 0x30d, 0x302, 0x13b, 0x135, 0x5b, 0x236, 0x237, 0x160, 0x303, 0x26c, 0x356, 0x134, 0x30c, 0x55, 0x358, 0x5a, 0x161, 0x54, 0xf, 0x239, 0xe, 0x16e, 0x26d, 0x1, 0x357, 0x263, 0x16f, 0x13a, 0x262, 0x238, 0x359, 0x30d, 0x302, 0x13b, 0x135, 0x5b, 0x236, 0x237, 0x160, 0x303, 0x26c, 0x356, 0x134, 0x30c, 0x55, 0x2a7, 0x19e, 0x36a, 0x384, 0xcb, 0x33b, 0x3b3, 0x3d2, 0x192, 0xf1, 0x11e, 0x21e, 0x12f, 0x2ce, 0x2cb, 0x2e2, 0x10d, 0x3d4, 0x25b, 0x1bc, 0x270, 0x314, 0x395, 0x46, 0x373, 0x21c, 0x68, 0x1f2, 0x16, 0x1e3, 0x9b, 0x1ab, 0x134, 0x211, 0x154, 0x2f6, 0x1a9, 0x73, 0x12d, 0x389, 0x1f7, 0x3f, 0x20c, 0x242, 0x24, 0x2d3, 0x1dd, 0x30, 0x277, 0x27a, 0x346, 0x42, 0x1fd, 0x6d, 0x1db, 0x3f9, 0x33a, 0x114, 0x24c, 0x2f8, 0x375, 0x1d5, 0x125, 0x29c, 0x11c, 0x359, 0x213, 0x13, 0x1ca, 0x374, 0x372, 0xbb, 0x1f6, 0x298, 0x392, 0x128, 0x3a0, 0x218, 0x2e6, 0x383, 0x1a5, 0x3e8, 0x3b7, 0x15c, 0x3e3, 0x142, 0x315, 0x132, 0x1d8, 0x19, 0x198, 0xa3, 0x2c9, 0x3a5, 0x231, 0x109, 0x15a, 0x2a, 0xf, 0x7b, 0x38, 0x362, 0x291, 0x20, 0x5d, 0x3ac, 0x183, 0x7c, 0x156, 0x3b1, 0x295, 0x2ae, 0x22c, 0x21f, 0x147, 0x271, 0x366, 0x3e, 0x156, 0x36b, 0x246, 0x15d, 0x288, 0x370, 0x3f8, 0x33a, 0x228, 0x122, 0x3ed, 0x335, 0x2de, 0x1c2, 0xcb, 0x27f, 0x2d7, 0x2af, 0x116, 0x21f, 0x319, 0x15b, 0x113, 0x24d, 0xbe, 0x3be, 0x1d5, 0x24a, 0x262, 0xf2, 0x1f5, 0x2f0, 0xc9, 0xf1, 0x23c, 0x6a, 0x16a, 0xb3, 0x1c6, 0x1de, 0x3a9, 0x354, 0x257, 0x47, 0x3a8, 0x213, 0x26, 0x321, 0x396, 0x345, 0x34d, 0x167, 0x2cb, 0x1cd, 0x3d, 0x29f, 0x1f1, 0x3e5, 0x11f, 0x172, 0x2c4, 0x13b, 0xdd, 0x1b9, 0xbb, 0x3ec, 0x272, 0xaf, 0x2a4, 0xf5, 0x329, 0x1bc, 0xe9, 0x4b, 0x97, 0x69, 0x2a3, 0x229, 0x65, 0x19c, 0x53, 0x2e0, 0x94, 0x3a0, 0x39, 0x38a, 0x27, 0x266, 0x1e7, 0x23, 0x373, 0x31, 0x1a0, 0x38b, 0x160, 0x17, 0x281, 0x1d, 0x225, 0x35a, 0x3e6, 0x2d6, 0x3e8, 0x367, 0x179, 0x327, 0xd, 0x278, 0xb, 0x1e3, 0x28e, 0x1d6, 0x306, 0x3e0, 0x29a, 0x346, 0x108, 0x3ef, 0x376, 0xc6, 0xe, 0x362, 0x256, 0x200, 0x36d, 0x3ba, 0x180, 0x26b, 0x337, 0xa0, 0xad, 0x54, 0x78, 0x37b, 0x3f, 0x22, 0x61, 0x112, 0x21d, 0x32e, 0x2c9, 0x28f, 0x358, 0x2d0, 0xe6, 0x17a, 0x1dc, 0x24e, 0x2e7, 0x99, 0x3b0, 0xc8, 0x36c, 0x134, 0x56, 0x16d, 0xd7, 0x23a, 0x3eb, 0x15c, 0x397, 0xd, 0xf9, 0x2c, 0x303, 0x344, 0x1d, 0x43, 0x173, 0x30f, 0x133, 0x1e7, 0x46, 0x1d7, 0x188, 0x236, 0x19c, 0xa6, 0x392, 0xa9, 0x27e, 0x329, 0x378, 0x3a4, 0x258, 0x162, 0x13b, 0x1ba, 0x2ed, 0x1d1, 0x2b7, 0x2cb, 0x39a, 0xf4, 0xd5, 0x32f, 0x47, 0x359, 0x5e, 0x130, 0x27c, 0x23c, 0xd4, 0x1a1, 0x191, 0x5f, 0x3be, 0x3aa, 0x13a, 0x334, 0x33b, 0x2d7, 0x157, 0x51, 0xdc, 0x1fc, 0x33a, 0x59, 0x81, 0x357, 0x33c, 0x366, 0x7c, 0x151, 0x115, 0x351, 0x6, 0x277, 0x3f4, 0x14, 0x129, 0x2a, 0x78, 0x2ff, 0xfc, 0x110, 0x219, 0x208, 0x269, 0x4d, 0x2b, 0x16d, 0x1ae, 0xfa, 0x367, 0x1ed, 0x21c, 0x340, 0x67, 0x53, 0x392, 0x152, 0x1ea, 0x17e, 0x3e5, 0x75, 0x30d, 0x4c, 0x13e, 0x23c, 0x1a8, 0x28d, 0x93, 0x1f9, 0x335, 0x36a, 0x1f, 0x2ac, 0x36e, 0x42, 0x3f3, 0x376, 0x18c, 0x38, 0x326, 0x121, 0x90, 0x2c6, 0x2cf, 0x360, 0x28f, 0x2b9, 0x352, 0x339, 0x38d, 0x3fe, 0x284, 0x13c, 0x16, 0x303, 0x281, 0x74, 0x218, 0x31d, 0x138, 0x4b, 0x25c, 0x299, 0x1ba, 0x1d3, 0x34d, 0x195, 0xe3, 0x3bc, 0x177, 0x24a, 0x19a, 0x33b, 0x1a7, 0x155, 0x288, 0x1db, 0x3f7, 0x32b, 0xd3, 0x20, 0x2e8, 0x2ea, 0xc0, 0x26b, 0x267, 0x280, 0x161, 0x149, 0x31b, 0x34f, 0x3bf, 0x248, 0x3b0, 0x190, 0x1ab, 0x1b2, 0x169, 0x1f3, 0x1a5, 0x37f, 0x23, 0x1d7, 0x22a, 0x15f, 0x30, 0x331, 0x267, 0x109, 0x18d, 0x25a, 0x1dc, 0x12a, 0x223, 0x201, 0x385, 0x281, 0xe8, 0x72, 0xde, 0x3a4, 0x172, 0x20d, 0x24b, 0x11e, 0x1a8, 0x113, 0x24c, 0x3d3, 0x33c, 0x183, 0x3c9, 0xfd, 0xa, 0x129, 0x54, 0x1e0, 0x3d5, 0x3db, 0x248, 0x369, 0x249, 0x143, 0x316, 0x173, 0x27, 0x314, 0x12e, 0x299, 0x374, 0x345, 0x25e, 0x166, 0x5f, 0x2e3, 0x2de, 0x20b, 0x2ac, 0x2d5, 0x108, 0x3a7, 0x305, 0x1ec, 0x21b, 0x44, 0x308, 0x208, 0xdb, 0x134, 0x158, 0x2fd, 0x1a5, 0x2f7, 0x8c, 0x2a3, 0x16c, 0x176, 0x2b7, 0x33e, 0x1de, 0x177, 0x9d, 0x261, 0x1ee, 0x246, 0x2fa, 0x368, 0x63, 0x1c, 0x326, 0x242, 0x240, 0x21d, 0xa3, 0xc3, 0x2a8, 0x26f, 0x7d, 0x367, 0x3da, 0x62, 0x236, 0x279, 0x272, 0x171, 0x7a, 0x1aa, 0x14e, 0xf2, 0x3b3, 0x157, 0x144, 0x1db, 0x3e7, 0xb7, 0x291, 0x200, 0x5d, 0x175, 0x180, 0x37c, 0x6b, 0x2d0, 0x339, 0x22f, 0x397, 0x68, 0x237, 0xa6, 0xaf, 0x21a, 0xd5, 0x14e, 0x1e4, 0x2d7, 0x2aa, 0x6d, 0x31e, 0xe, 0x326, 0x8d, 0x112, 0xcc, 0x222, 0x56, 0x37a, 0x1a5, 0x1e7, 0x230, 0x135, 0x2ed, 0x293, 0xb3, 0x5f, 0x1cf, 0x36a, 0x7c, 0x29a, 0x206, 0x290, 0x54, 0x3c0, 0x34f, 0x2e7, 0xc1, 0x1e3, 0x344, 0xe8, 0xe4, 0x378, 0x11f, 0x30d, 0x130, 0x3c4, 0x23b, 0x33a, 0x2c8, 0x8, 0x2e8, 0x3ba, 0x1b, 0x3d6, 0x358, 0x2ad, 0x1fe, 0x15c, 0x87, 0x340, 0x19c, 0x139, 0x171, 0xf4, 0x2a1, 0x262, 0x33b, 0x295, 0x17d, 0x368, 0xc6, 0x70, 0x106, 0x61, 0x82, 0x269, 0x134, 0x2b0, 0x3e6, 0x133, 0x323, 0x1a4, 0x1ba, 0x345, 0xb5, 0x191, 0x2f8, 0x263, 0x366, 0x3e0, 0xfd, 0x14, 0xad, 0x2a0, 0x23f, 0x24e, 0x315, 0x201, 0x303, 0x216, 0x349, 0x329, 0x3f6, 0xba, 0x1dd, 0x1b, 0x3a5, 0x17b, 0x145, 0x3df, 0x3da, 0x188, 0x328, 0x35f, 0x275, 0x2eb, 0x2b3, 0x20b, 0x2a2, 0x103, 0x290, 0xa8, 0x31b, 0x24e, 0x223, 0x16, 0x2e, 0x128, 0x1ea, 0x3e2, 0x8e, 0x3ea, 0x157, 0x119, 0x18f, 0xe, 0x245, 0x234, 0x82, 0xdb, 0xd9, 0x1ad, 0x217, 0x221, 0x162, 0x394, 0x11e, 0x2a9, 0x114, 0x204, 0x5d, 0x2ea, 0x209, 0x3d6, 0x2b9, 0x2a6, 0x3eb, 0x1ed, 0xc4, 0x194, 0x3ab, 0x33e, 0x371, 0x35d, 0x301, 0x151, 0x285, 0x148, 0x54, 0x389, 0x127, 0x315, 0xb, 0x17, 0x94, 0xf5, 0x1f1, 0x47, 0x1f5, 0x2af, 0x288, 0x2c3, 0x7, 0x326, 0x11a, 0x41, 0x269, 0x268, 0x2d2, 0x30f, 0x314, 0xb1, 0x1ca, 0x8f, 0x350, 0x8a, 0x102, 0x22a, 0x175, 0x300, 0x1eb, 0x358, 0x153, 0x3f1, 0x2f2, 0x62, 0xca, 0x3d1, 0x19f, 0x3bc, 0x3aa, 0x384, 0x2ac, 0x346, 0xa4, 0x2a, 0x3c0, 0x174, 0x37d, 0xd8, 0x22e, 0x333, 0x1f4, 0x23, 0x14f, 0x2ed, 0x25e, 0x322, 0x3ed, 0xeb, 0xc, 0x26b, 0x231, 0x1a9, 0x1fe, 0x179, 0x62, 0x194, 0x35f, 0xe3, 0x3be, 0x1b5, 0xf8, 0xfd, 0x50, 0x2c2, 0x17a, 0x3fe, 0x1a, 0x237, 0x298, 0x2e2, 0x3a9, 0x9d, 0x32c, 0x36e, 0x29, 0x15, 0x3c0, 0x127, 0x223, 0x2c, 0xb8, 0x152, 0x29f, 0xa7, 0x3c8, 0x295, 0x1fd, 0x2e5, 0x1ec, 0xfc, 0x124, 0x1bf, 0x1a2, 0x1d0, 0x329, 0x3c3, 0x2bb, 0x3ad, 0x144, 0x2c3, 0xe, 0x83, 0xc2, 0x19, 0x1ab, 0x316, 0x38a, 0x1d2, 0x1c1, 0x130, 0x30b, 0x3f8, 0x32b, 0x12b, 0x48, 0x21d, 0x111, 0xac, 0x3e6, 0xc5, 0x25c, 0x1ca, 0x11e, 0x15b, 0x59, 0x4, 0x1d9, 0x1ef, 0x360, 0xaa, 0xd7, 0x3d9, 0x8c, 0x135, 0x3a6, 0x16a, 0x93, 0x3af, 0x3ac, 0x30, 0x1be, 0xd6, 0x2ad, 0x3f1, 0x1ed, 0x188, 0x259, 0x167, 0x38c, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x1d9, 0x3b5, 0x265, 0x2da, 0x29d, 0x12e, 0x394, 0xe2, 0x33a, 0xd3, 0x12, 0x21d, 0x4d, 0x2d2, 0x4e, 0xb9, 0x98, 0x21f, 0x3ff, 0x1b1, 0x8d, 0x104, 0x1ab, 0x43, 0xde, 0x75, 0x2f0, 0xa2, 0x18f, 0x70, 0x44, 0x1d8, 0x26c, 0x1d0, 0xbf, 0x47, 0x3b3, 0x2ba, 0x376, 0x3d8, 0x3e9, 0xc1, 0x20f, 0x250, 0x29f, 0x29c, 0xf7, 0x21, 0x287, 0x1e0, 0x24e, 0x13c, 0x189, 0xaf, 0x1e8, 0x9d, 0xab, 0x285, 0x252, 0x12d, 0x1ff, 0x34, 0x19c, 0x3b4, 0x3bc, 0x16f, 0xf8, 0x3f4, 0x109, 0x1cc, 0xae, 0x31, 0x328, 0x2ce, 0x5f, 0xcf, 0x3, 0x26b, 0xd6, 0x2a6, 0x367, 0x3ae, 0x372, 0xb5, 0x126, 0x147, 0x175, 0x36, 0x22e, 0xd7, 0x37f, 0xd2, 0x1cb, 0x1a8, 0x228, 0x8, 0x2d3, 0x197, 0x30c, 0x2fd, 0xc5, 0x162, 0x9f, 0x319, 0x1e6, 0x291, 0x90, 0xcc, 0x268, 0x2bd, 0x270, 0x1c1, 0xc9, 0xdc, 0x3b2, 0x2cf, 0x30c, 0x1f3, 0x314, 0x302, 0x1e2, 0x3f8, 0x16e, 0x242, 0x104, 0x356, 0x10c, 0x2f9, 0x359, 0x2af, 0xda, 0x239, 0xfc, 0x132, 0x303, 0x250, 0x137, 0x262, 0x3b1, 0x210, 0x54, 0xee, 0x101, 0x237, 0xed, 0x1de, 0x16f, 0x1f0, 0x3cb, 0x5a, 0xff, 0x1ed, 0x5b, 0x34d, 0x322, 0x357, 0x2be, 0x36, 0x55, 0x35c, 0x3ce, 0x13b, 0x11e, 0x2ca, 0x26d, 0x12, 0x33, 0x134, 0x2bd, 0xe9, 0x30d, 0x241, 0x1db, 0xe, 0x11, 0xec, 0x26c, 0x3a0, 0x2fc, 0x238, 0x34e, 0x3fd, 0xf, 0x3a3, 0x223, 0x160, 0x253, 0x1e8, 0x13a, 0x2ac, 0x5, 0x161, 0x1e1, 0x327, 0x236, 0x35f, 0x311, 0x263, 0x3, 0xdf, 0x358, 0x11d, 0x215, 0x135, 0x10f, 0x226, 0x1, 0x3b2, 0x2cf, 0x30c, 0x1f3, 0x314, 0x302, 0x1e2, 0x3f8, 0x16e, 0x242, 0x104, 0x356, 0x10c, 0x2f9, 0x359, 0x2af, 0xda, 0x239, 0xfc, 0x132, 0x303, 0x36d, 0x32e, 0x56, 0x30f, 0x258, 0x130, 0xdc, 0x307, 0x106, 0x76, 0x26c, 0x349, 0x3e2, 0x1e4, 0x85, 0x347, 0x3c0, 0x254, 0x3c1, 0x139, 0xef, 0x16f, 0x3e0, 0x337, 0x2d0, 0x3eb, 0x1d7, 0x2ed, 0x1a1, 0x81, 0x2e8, 0x363, 0x30c, 0x3e6, 0x4b, 0x26, 0x21f, 0x3e7, 0x326, 0x308, 0x249, 0xe8, 0x17e, 0x238, 0x295, 0x3ef, 0x78, 0x24e, 0xf9, 0xa6, 0x39a, 0x3aa, 0x7c, 0x3e1, 0x5a, 0x1fe, 0x3bd, 0x2d8, 0xb5, 0x91, 0x5d, 0x1ef, 0x265, 0x37a, 0x18a, 0x302, 0x3c4, 0x3fb, 0x362, 0x61, 0xc8, 0x1d, 0x329, 0x47, 0x2d7, 0x3fa, 0xf, 0x34f, 0x9e, 0x312, 0x171, 0x177, 0x20b, 0xfd, 0x109, 0x339, 0x2f2, 0x5b, 0x293, 0x93, 0x28e, 0x3ba, 0x2c9, 0x16d, 0x133, 0x162, 0x27c, 0x1fc, 0x16e, 0x8d, 0x19, 0x286, 0xe4, 0x38f, 0x3dd, 0x17d, 0x386, 0x3ee, 0x315, 0x160, 0xaf, 0x3a9, 0x1c2, 0x29a, 0x2d3, 0xa3, 0x2b0, 0x9c, 0x382, 0x8b, 0x2c3, 0x1c0, 0x92, 0x3c6, 0x250, 0xd5, 0x261, 0x1a3, 0xad, 0x2f4, 0x247, 0x194, 0x32a, 0x3f2, 0x2ab, 0x36, 0x154, 0x1a5, 0x25c, 0x13e, 0x1fc, 0x2dc, 0x234, 0xc8, 0x3a, 0xbf, 0x238, 0x123, 0x3a7, 0x3c0, 0xa1, 0x31f, 0x1da, 0x2eb, 0x1b3, 0x1ce, 0xd6, 0x11d, 0x46, 0x374, 0x350, 0x2c8, 0x9, 0x66, 0x1b2, 0x31d, 0x75, 0x3ad, 0xda, 0xf6, 0x3db, 0xb, 0x1c9, 0xf4, 0x274, 0x14d, 0xa0, 0x1cc, 0x179, 0x5b, 0x12f, 0x24c, 0x5d, 0x3de, 0x186, 0x3e6, 0x96, 0x98, 0xdc, 0x207, 0x11, 0x3b0, 0x281, 0x1ea, 0x14e, 0x3dc, 0x29, 0x2a0, 0x1ff, 0x1a0, 0x3d1, 0x311, 0x19e, 0x30, 0x3a5, 0x26f, 0x1e7, 0x276, 0xe2, 0x1e6, 0xa5, 0x41, 0x356, 0x39, 0x3c3, 0x3dd, 0x2fa, 0x203, 0x34f, 0x13c, 0x53, 0x39a, 0x35d, 0x1f0, 0x337, 0x1a9, 0x3b7, 0x2a3, 0x1af, 0x28c, 0x1ad, 0x1d2, 0xbc, 0x288, 0x318, 0x3f0, 0x201, 0x1c9, 0x1e8, 0x1c2, 0x27a, 0x212, 0x1fe, 0x2ef, 0x1d3, 0x113, 0x4, 0x2b5, 0x222, 0x2bd, 0x341, 0x2f0, 0x232, 0x7b, 0x3db, 0x16, 0x32d, 0x3a9, 0x301, 0x1fa, 0x5a, 0x3f1, 0x3ae, 0x345, 0x45, 0x10, 0x2c6, 0x9a, 0x2e6, 0x11f, 0x3d2, 0xda, 0x1ec, 0x377, 0x58, 0xaf, 0x2bf, 0x1f, 0x3e1, 0x168, 0x3df, 0x2a3, 0x10f, 0x114, 0x40, 0x30a, 0x268, 0x38a, 0x75, 0x353, 0x368, 0x3b9, 0x1c7, 0x160, 0x2bc, 0x2ee, 0x7c, 0x39f, 0x1a9, 0x367, 0x29e, 0x35, 0x59, 0x100, 0x33, 0x1b2, 0x233, 0x1d4, 0x157, 0x1bb, 0x2ff, 0x315, 0x189, 0x2e2, 0x3aa, 0x1f0, 0x267, 0x2ad, 0x187, 0x26a, 0xd4, 0x164, 0x9, 0xcc, 0x2c1, 0xde, 0x359, 0x155, 0x2e5, 0x3ee, 0x4f, 0x22d, 0x39a, 0x2b3, 0x3c9, 0x18e, 0x2a6, 0x215, 0x1ba, 0x350, 0x199, 0x24, 0x35e, 0x222, 0x173, 0x11f, 0x3ad, 0x368, 0x37b, 0x315, 0x312, 0x39a, 0x16f, 0x33f, 0x6b, 0x23a, 0x230, 0x243, 0x33a, 0x256, 0x82, 0x286, 0x329, 0x238, 0x85, 0x20e, 0x1dc, 0x68, 0x3d1, 0x5f, 0x1d6, 0x1b, 0x2a8, 0x133, 0x302, 0x21f, 0x307, 0x22, 0x1bf, 0x94, 0xd5, 0x196, 0x206, 0x31a, 0x15c, 0x5b, 0xb5, 0x81, 0x36d, 0x146, 0x1ad, 0x3a4, 0x2f0, 0x6d, 0x1ec, 0x2e7, 0x160, 0x171, 0x3aa, 0x3e0, 0x18e, 0x145, 0x46, 0x1cb, 0x165, 0x34c, 0x112, 0x356, 0xe4, 0x47, 0x295, 0x347, 0x23f, 0xd, 0xfb, 0x38c, 0x33c, 0x180, 0x55, 0x1a5, 0x162, 0x3c4, 0x3e7, 0x106, 0x3b0, 0x216, 0x29f, 0x334, 0x346, 0x161, 0x22f, 0x188, 0x293, 0x91, 0x2e8, 0x32e, 0x2b0, 0x270, 0x5e, 0x288, 0x239, 0x3db, 0x2c, 0xaf, 0x177, 0x7c, 0x337, 0x2ad, 0x30e, 0x1ba, 0x2a9, 0x26d, 0x120, 0x36c, 0x218, 0x38f, 0x2b5, 0x9a, 0x38a, 0x1d4, 0x155, 0x386, 0x297, 0x3e4, 0x1da, 0x375, 0x3, 0x3d6, 0x1ae, 0x97, 0x27c, 0x3ff, 0x83, 0x3b0, 0x25, 0x26e, 0x196, 0x5, 0x73, 0x2f2, 0x1b9, 0x28d, 0x8, 0x185, 0xd9, 0x6f, 0x2bb, 0x2ba, 0xf, 0x95, 0x31f, 0x2cb, 0x39e, 0x18, 0x28f, 0x16b, 0xb1, 0x3c4, 0x3c7, 0x11, 0x1bf, 0x128, 0x354, 0xab, 0x28, 0x398, 0x3bd, 0x1d3, 0x45, 0x40, 0x33, 0x2c1, 0x378, 0x1f5, 0x1fd, 0x78, 0xa1, 0xce, 0x275, 0xcf, 0xc0, 0x55, 0x34a, 0x181, 0x21f, 0x207, 0x88, 0x1e3, 0x152, 0x296, 0x151, 0x140, 0xff, 0x1d7, 0x283, 0x228, 0x200, 0x198, 0x225, 0x3f6, 0x3b3, 0x3f3, 0x3c0, 0x101, 0x279, 0x38c, 0x271, 0x209, 0x2a8, 0x266, 0x13, 0xdc, 0x1c, 0x49, 0x303, 0x282, 0x9d, 0x29a, 0x212, 0x3f1, 0x2a3, 0x35, 0x164, 0x24, 0xdb, 0x10c, 0x38f, 0x1a7, 0x3a7, 0x23f, 0x163, 0x268, 0x6f, 0x17f, 0x2fa, 0x78, 0x142, 0x338, 0x38c, 0xeb, 0x36, 0x16d, 0x221, 0x260, 0x365, 0x21b, 0x182, 0x392, 0x2bf, 0xf8, 0x18e, 0x11d, 0x69, 0x23c, 0x391, 0x11a, 0x249, 0x13f, 0x29c, 0x36e, 0x2b4, 0x57, 0x5b, 0x2d4, 0x2, 0x2c6, 0xd9, 0xde, 0x2fe, 0x1fd, 0xf0, 0x284, 0x279, 0x311, 0x1d6, 0x6c, 0x2da, 0x4b, 0xc9, 0x2c3, 0x3f, 0x304, 0x32d, 0x177, 0x1f0, 0x31c, 0x23a, 0xd2, 0x71, 0x32b, 0x234, 0x9b, 0x27e, 0x131, 0x2d5, 0x161, 0xae, 0xb6, 0x1a1, 0x4, 0x185, 0x1b2, 0x1bc, 0x1f5, 0x3fa, 0x1e0, 0x101, 0xfb, 0x22b, 0x3ac, 0xd8, 0x1bd, 0x96, 0x192, 0x18f, 0x7e, 0x201, 0x253, 0x2ee, 0x3e0, 0x231, 0x7d, 0x1a4, 0xe2, 0x25f, 0x61, 0x136, 0xf5, 0x262, 0x1a3, 0x2c2, 0x15c, 0x16c, 0x342, 0x8, 0x30a, 0x364, 0x378, 0x3ea, 0x3fd, 0x3c0, 0x202, 0x1f6, 0x5f, 0x2c6, 0x1b2, 0x378, 0x3dd, 0x3ef, 0x23f, 0x68, 0x2b7, 0x3ed, 0x3ba, 0x30c, 0x4e, 0x5e, 0x6d, 0x37b, 0x9e, 0x139, 0x3be, 0x6, 0x28f, 0x1a5, 0x302, 0xdc, 0x70, 0x99, 0x170, 0x3a9, 0x7c, 0x18e, 0x23a, 0x1a4, 0x1c4, 0x16e, 0x308, 0x344, 0x29f, 0x196, 0x14, 0x339, 0x1d7, 0x21e, 0x2c8, 0x120, 0x356, 0x329, 0x1e4, 0x108, 0x12d, 0x87, 0x1d1, 0x91, 0x36d, 0x222, 0x38a, 0x359, 0x17d, 0x78, 0x284, 0xfb, 0x5f, 0x2ab, 0x2c9, 0x3e6, 0x2e4, 0x51, 0x239, 0x2e7, 0x312, 0xef, 0x366, 0x37c, 0xd7, 0x12e, 0x3c4, 0x307, 0x110, 0x303, 0x21a, 0x1c2, 0x3e1, 0x2ad, 0x46, 0x243, 0x1e6, 0x8d, 0x249, 0x27e, 0x262, 0x346, 0x31a, 0x2f2, 0x2ed, 0x8a, 0x200, 0x269, 0x218, 0x47, 0x85, 0x54, 0x3f5, 0x194, 0x191, 0x5d, 0x32e, 0x1ad, 0x11f, 0x157, 0x386, 0x24e, 0x237, 0x275, 0x33c, 0x1b, 0x16d, 0x185, 0x2c1, 0x3f6, 0x1a7, 0x107, 0x2fb, 0x65, 0x2cc, 0x5d, 0x255, 0x2bd, 0xea, 0x15d, 0x3c, 0x284, 0x1f6, 0x17c, 0x175, 0xc3, 0x27, 0x5e, 0xda, 0x1f7, 0xf9, 0x3b4, 0x335, 0x180, 0x159, 0x221, 0x192, 0x235, 0x3e9, 0x160, 0x33d, 0x1b3, 0x37c, 0x1ae, 0xb1, 0x21f, 0x1c, 0x248, 0x170, 0x35b, 0x1f0, 0x6b, 0x3e8, 0xe5, 0x1fc, 0x245, 0x2db, 0xa9, 0x24a, 0x27a, 0x2d0, 0x215, 0x325, 0x1e6, 0x11a, 0x136, 0x3d4, 0x261, 0xa, 0x339, 0x3ae, 0x6a, 0x26d, 0x224, 0x20a, 0x3e2, 0x3dc, 0x252, 0x22f, 0xb6, 0x28d, 0x40, 0x198, 0x10c, 0x47, 0x10a, 0x150, 0x397, 0x176, 0x24c, 0x36d, 0x4d, 0x233, 0x2fe, 0x3fd, 0x31b, 0x68, 0x167, 0x3af, 0x1ef, 0xac, 0x1d2, 0x3ad, 0x2e5, 0x127, 0x237, 0xe3, 0xeb, 0xd8, 0x2fd, 0x172, 0x51, 0x7b, 0x38e, 0xa6, 0x2eb, 0x3, 0x28f, 0x34a, 0x13, 0x2e9, 0x30a, 0x316, 0x38f, 0x246, 0xa8, 0x397, 0x2ec, 0x122, 0x35e, 0xd9, 0x2f9, 0x2d7, 0x107, 0x1ff, 0x194, 0x24d, 0x1d9, 0x222, 0x233, 0x1f5, 0x3ef, 0xee, 0x289, 0xb3, 0x22a, 0x255, 0x173, 0x3a8, 0x2fa, 0x3c0, 0x34, 0x167, 0x357, 0x3b5, 0x169, 0x11f, 0x155, 0x1e, 0x284, 0x3ec, 0x1f9, 0x3ba, 0x2b, 0xe9, 0x3ad, 0x1c3, 0x95, 0x19c, 0x22b, 0x15f, 0x265, 0x27, 0xbc, 0x368, 0x3a3, 0x38b, 0x275, 0xeb, 0x1b0, 0x3e6, 0x382, 0x119, 0x37b, 0x278, 0x3b4, 0x263, 0x209, 0x2da, 0x258, 0x22c, 0x7b, 0x315, 0x298, 0x375, 0x30, 0x154, 0x314, 0x192, 0x63, 0x3bf, 0x312, 0x3bc, 0x205, 0x28f, 0x29d, 0x4c, 0x365, 0xfc, 0x58, 0x39a, 0x1b3, 0x2f1, 0x2b1, 0x181, 0x1b8, 0x380, 0x304, 0x15e, 0x16f, 0x331, 0x333, 0x12e, 0x30b, 0x1c, 0x99, 0x1c9, 0x2ee, 0x33f, 0x17b, 0x3ce, 0x27c, 0x387, 0x220, 0x2e, 0x21d, 0x43, 0x47, 0x21, 0x12d, 0x31, 0xb5, 0x8, 0xcc, 0x218, 0x238, 0x108, 0x17a, 0x188, 0x1a1, 0x40, 0x269, 0xe4, 0x1e4, 0x52, 0x3c2, 0x5b, 0x113, 0x200, 0x36c, 0x329, 0x33b, 0x290, 0x22f, 0x2d8, 0x8a, 0x24, 0x356, 0x17e, 0x1ee, 0xad, 0x15c, 0x2ed, 0x59, 0x120, 0x286, 0x3e2, 0x36b, 0x161, 0x2f2, 0x345, 0x2c8, 0x112, 0x1d, 0x32f, 0x36e, 0x31a, 0x3bd, 0x21e, 0x26d, 0x82, 0xe8, 0x14e, 0x346, 0xe6, 0x1d7, 0xd4, 0x34c, 0x19, 0x349, 0x262, 0x206, 0x339, 0x2a3, 0x2a9, 0x256, 0xc8, 0x27e, 0x334, 0x14, 0x1fe, 0x135, 0x165, 0x294, 0x249, 0x3d4, 0x196, 0xa0, 0x3eb, 0x1ba, 0x33a, 0x8d, 0x26c, 0x29f, 0xab, 0x109, 0x367, 0x1cb, 0x1e6, 0x61, 0x344, 0xd5, 0x151, 0x5a, 0x30e, 0x243, 0x32b, 0x308, 0x216, 0x2a1, 0x29a, 0x2d0, 0x46, 0x23c, 0x16e, 0x76, 0x94, 0x125, 0xfd, 0x33, 0x10c, 0x238, 0x210, 0x1e1, 0x5b, 0x226, 0x12, 0x356, 0x2fc, 0x3b1, 0x161, 0x1ed, 0x10f, 0x26d, 0x104, 0x3a0, 0x262, 0x5, 0xff, 0x135, 0x2ca, 0x242, 0x26c, 0x137, 0x2ac, 0x5a, 0x215, 0x11e, 0x16e, 0xec, 0x250, 0x13a, 0x3cb, 0x11d, 0x13b, 0x3f8, 0x11, 0x303, 0x1e8, 0x1f0, 0x358, 0x3ce, 0x1e2, 0xe, 0x132, 0x253, 0x16f, 0xdf, 0x35c, 0x302, 0x1db, 0xfc, 0x160, 0x1de, 0x3, 0x55, 0x314, 0x241, 0x239, 0x223, 0xed, 0x263, 0x36, 0x1f3, 0x30d, 0xda, 0x3a3, 0x237, 0x311, 0x2be, 0x30c, 0xe9, 0x2af, 0xf, 0x101, 0x35f, 0x357, 0x2cf, 0x2bd, 0x359, 0x3fd, 0xee, 0x236, 0x322, 0x3b2, 0x134, 0x2f9, 0x34e, 0x54, 0x327, 0x34d, 0x1, 0x33, 0x10c, 0x238, 0x210, 0x1e1, 0x5b, 0x226, 0x12, 0x356, 0x2fc, 0x3b1, 0x161, 0x1ed, 0x10f, 0x26d, 0x104, 0x3a0, 0x262, 0x5, 0xff, 0x135, 0x66, 0x39, 0x1e4, 0x148, 0x57, 0x2ed, 0x164, 0x224, 0xe8, 0x131, 0x5, 0x1fe, 0xdd, 0x27d, 0x61, 0x10b, 0x14b, 0xfd, 0x2a6, 0x348, 0x1fc, 0x11, 0x20f, 0x3a9, 0x39b, 0x1e5, 0x12e, 0x6e, 0x309, 0x2c, 0x273, 0x205, 0x55, 0x221, 0x116, 0x1ec, 0x278, 0x19f, 0x1d6, 0x336, 0x9c, 0x3ad, 0x203, 0x101, 0x2b7, 0x147, 0x255, 0x38a, 0x3ea, 0x287, 0x3f5, 0x2ec, 0x102, 0x21d, 0x10c, 0x79, 0x52, 0x313, 0x1b9, 0x59, 0x89, 0x3a, 0x14e, 0x103, 0x27b, 0x135, 0x19d, 0x11a, 0x344, 0x354, 0x13d, 0x2ad, 0xd2, 0x7f, 0x106, 0x385, 0x1e8, 0x3e0, 0x17b, 0x24f, 0x21f, 0x1c0, 0xb, 0x39a, 0x183, 0x117, 0x18a, 0x241, 0x7b, 0x9e, 0x361, 0x271, 0x2c9, 0x27, 0x1e9, 0x386, 0x142, 0x3ab, 0x357, 0x197, 0x2e6, 0x2fe, 0x3a7, 0x1ff, 0xbb, 0x244, 0x185, 0x43, 0x11c, 0x210, 0x3c2, 0x16c, 0x114, 0x120, 0xcc, 0xe4, 0x33b, 0xad, 0x2f2, 0x21e, 0x34c, 0xc8, 0x3d4, 0xab, 0x5a, 0x46, 0x1c4, 0x326, 0x1e3, 0xf4, 0x3e0, 0x2f6, 0x12e, 0xdc, 0x3f, 0x160, 0x371, 0x30, 0x16d, 0x2e4, 0x6d, 0x34f, 0x19c, 0x2f8, 0x1ef, 0x1ad, 0x359, 0x3ef, 0x2fb, 0xbb, 0x81, 0x21d, 0x218, 0x1e4, 0x290, 0x15c, 0x345, 0x26d, 0x19, 0x27e, 0x196, 0x109, 0x30e, 0x23c, 0x362, 0x1bf, 0x21a, 0x7c, 0x358, 0x323, 0x21f, 0x380, 0x2c, 0xef, 0x6, 0x2a8, 0x258, 0x288, 0x3ee, 0x237, 0x5f, 0x3ba, 0x2b0, 0xea, 0x3fa, 0x1dc, 0x194, 0x91, 0x2c6, 0x43, 0x238, 0x52, 0x22f, 0x2ed, 0x2c8, 0x82, 0x349, 0x334, 0xa0, 0x367, 0x243, 0x16e, 0x3b0, 0x141, 0x20b, 0x6b, 0x1e7, 0x3c4, 0x70, 0x201, 0x39a, 0x306, 0x55, 0x4b, 0x51, 0x37b, 0x3c1, 0x38c, 0x175, 0x56, 0x11f, 0x17d, 0x23f, 0x236, 0x93, 0x35e, 0x18b, 0x47, 0x198, 0x390, 0x1ee, 0x2c2, 0x2ef, 0x2a9, 0x121, 0x1a2, 0x2a1, 0x1fa, 0x11d, 0x1ca, 0x3c7, 0x248, 0xaf, 0x2dd, 0x343, 0x18a, 0x116, 0x3b9, 0x3c1, 0x311, 0x1dd, 0x2b0, 0x1d4, 0x3f3, 0x2fb, 0x176, 0x204, 0xcc, 0x1c8, 0xf7, 0x161, 0x373, 0x350, 0x294, 0xd1, 0x354, 0xfd, 0x28a, 0xe5, 0x3e7, 0x124, 0x253, 0x36a, 0x3a5, 0xc5, 0x8b, 0x3d8, 0x3e4, 0x38c, 0x2ea, 0x158, 0xea, 0x3fd, 0x379, 0xbb, 0x102, 0x66, 0xe4, 0x27f, 0x2b4, 0x3bd, 0x1a8, 0x14a, 0x26c, 0x1aa, 0x27a, 0x145, 0x276, 0x3f7, 0x92, 0x32d, 0x1b5, 0x3d6, 0x266, 0x241, 0x1ec, 0x1f2, 0x1c6, 0x175, 0xac, 0x75, 0x3fa, 0x3b8, 0x259, 0x81, 0x33, 0x72, 0x33b, 0x15a, 0x3da, 0xd4, 0xa5, 0x136, 0xd5, 0x13d, 0x2a6, 0x13b, 0x3ff, 0x49, 0x392, 0x2de, 0x1eb, 0x133, 0x324, 0xf6, 0xf9, 0xe3, 0x2be, 0x56, 0x23e, 0x1fd, 0x1dc, 0x330, 0x25b, 0x36b, 0x73, 0x14f, 0x33a, 0x184, 0x128, 0x1c2, 0x231, 0x3ce, 0x21f, 0x21b, 0x2c0, 0x3be, 0x209, 0x3c5, 0x2f0, 0x203, 0x1a, 0xb3, 0x3b2, 0x364, 0x47, 0x29, 0x57, 0x345, 0x1a6, 0x190, 0x29f, 0x14d, 0x153, 0x13b, 0x3f7, 0x124, 0xaf, 0x1b3, 0x117, 0x4b, 0x144, 0x3d5, 0x19c, 0x3f2, 0x2cf, 0x38a, 0x36f, 0xa8, 0x31, 0x28d, 0x48, 0x1d, 0x131, 0x28, 0x367, 0x11e, 0x2cd, 0x1e3, 0x3d0, 0x277, 0xd7, 0x13, 0x235, 0x315, 0x361, 0x3ac, 0x30c, 0x28b, 0x2fa, 0x1dc, 0x259, 0x102, 0xcc, 0x390, 0x3dc, 0x31a, 0x355, 0x2ca, 0x61, 0x4a, 0x274, 0x18e, 0x2f7, 0x381, 0x380, 0xb0, 0x2eb, 0x180, 0x1f3, 0xbc, 0x386, 0x202, 0x32a, 0x2e8, 0xd9, 0x317, 0x108, 0x313, 0x1d3, 0x26d, 0x64, 0x3a1, 0x151, 0x352, 0x348, 0x3fb, 0x49, 0x32d, 0x36a, 0x343, 0x314, 0x51, 0x1f7, 0x67, 0x2f8, 0x269, 0x17e, 0x36e, 0x339, 0x1ba, 0x32b, 0x3b0, 0x21a, 0x3e0, 0x39d, 0x302, 0x31e, 0x315, 0x2cb, 0x2ab, 0x56, 0xea, 0x3ef, 0x3f5, 0x293, 0x40, 0x356, 0x32f, 0x206, 0x3eb, 0x243, 0x362, 0x1e3, 0x3a9, 0x1ce, 0x2b1, 0x130, 0x239, 0xf9, 0x38c, 0x3ba, 0x1ad, 0x2fe, 0x20e, 0x87, 0x1a1, 0x24, 0x1d, 0x262, 0xa0, 0x30e, 0x1c4, 0x106, 0x2e, 0x3aa, 0x37c, 0x133, 0x8b, 0x37b, 0x237, 0x2f8, 0x363, 0x38a, 0x2d7, 0x2a0, 0x188, 0x8a, 0x112, 0x349, 0x196, 0x5a, 0x230, 0x1fc, 0x110, 0x392, 0x36a, 0x28f, 0x4b, 0x288, 0x34f, 0xfb, 0x357, 0x146, 0x378, 0x85, 0x17a, 0x2d8, 0x2c8, 0x19, 0x3d4, 0x151, 0x2ad, 0x13b, 0x3e7, 0x99, 0x171, 0x306, 0x2a8, 0x2e4, 0x368, 0x254, 0x2b7, 0x5d, 0x134, 0x38f, 0x108, 0x22f, 0x345, 0x34c, 0x249, 0xd5, 0xfd, 0x23a, 0x24b, 0xe, 0x201, 0xef, 0x30, 0x37a, 0xdb, 0x1f1, 0x346, 0x3fc, 0x325, 0x362, 0x3c6, 0x2bf, 0x26b, 0x34a, 0x241, 0x37b, 0x67, 0x3f2, 0x32e, 0xde, 0x246, 0x17a, 0x1b9, 0x332, 0xc8, 0x137, 0x27a, 0x23a, 0x9f, 0x38, 0x2c, 0x2eb, 0x209, 0x30f, 0x353, 0x1e0, 0x236, 0x122, 0x66, 0x329, 0x2df, 0x398, 0x1ba, 0x25f, 0x2db, 0xf4, 0x277, 0x35c, 0x130, 0x7b, 0x3e4, 0x5f, 0x3de, 0x1c5, 0x2d7, 0x149, 0x229, 0x59, 0x104, 0x1ea, 0x151, 0x153, 0xe5, 0x307, 0x182, 0x273, 0x30, 0x2fd, 0x178, 0xf, 0xd0, 0x24d, 0x2c6, 0x39, 0xf7, 0x31a, 0x14f, 0xf3, 0x76, 0x282, 0x1f0, 0x39d, 0x20d, 0x63, 0x9e, 0xe3, 0x1dd, 0x1ad, 0x1f5, 0x2a, 0x31, 0x226, 0x89, 0x349, 0x32c, 0x168, 0x1a4, 0x3ff, 0x248, 0x171, 0x205, 0x2b2, 0x30d, 0x2e5, 0x202, 0xb3, 0x2d3, 0x225, 0x1e4, 0x15a, 0x2ef, 0x165, 0xc2, 0x250, 0x20b, 0x2b9, 0xb1, 0x365, 0x1b6, 0x3cd, 0x206, 0x3b7, 0x71, 0x106, 0xb8, 0x2de, 0x28f, 0x12c, 0xda, 0x254, 0x2ce, 0x1d9, 0x18b, 0xf2, 0x15a, 0x1d7, 0x19d, 0x219, 0x141, 0x1f0, 0x333, 0x26, 0x318, 0x1f2, 0x5f, 0x3b5, 0x31d, 0x295, 0xbd, 0x1b9, 0x26d, 0x320, 0x1aa, 0x3e1, 0x3d9, 0x381, 0x3f, 0x53, 0xcf, 0x265, 0x28b, 0x3fd, 0x3f5, 0x25e, 0x9, 0x1d, 0x19a, 0x212, 0x230, 0x3f9, 0x124, 0x171, 0x3, 0x2da, 0x5e, 0x203, 0xd0, 0x93, 0x30a, 0x1c8, 0x36b, 0x398, 0x374, 0x16e, 0x2f5, 0x35b, 0x26b, 0x29d, 0x116, 0x3ee, 0x279, 0x2a7, 0x222, 0x3c3, 0x210, 0x15c, 0x6a, 0x121, 0x216, 0xe1, 0xd6, 0x12e, 0x3b6, 0x1c7, 0x2cb, 0x2be, 0x169, 0x2fe, 0x2a, 0x62, 0x8a, 0x41, 0xf5, 0x151, 0x2a6, 0x394, 0xe, 0x16, 0x2eb, 0x1b, 0x27, 0x2ae, 0x23f, 0x259, 0x2, 0x36c, 0x393, 0x5, 0x367, 0xe2, 0x20c, 0x170, 0x36c, 0x32f, 0x14, 0x30e, 0x23b, 0x110, 0xaf, 0x306, 0x16d, 0x5e, 0xf, 0x340, 0x91, 0xcc, 0x17e, 0x346, 0x3eb, 0x23c, 0x106, 0x170, 0x36a, 0x55, 0x2e4, 0x376, 0xd, 0x191, 0x2c6, 0xe4, 0x36b, 0x339, 0x1cb, 0x362, 0x303, 0x3aa, 0x3d6, 0x4b, 0x6d, 0x254, 0x195, 0x36d, 0x43, 0x33b, 0x31a, 0x135, 0x32b, 0x1bf, 0x3a9, 0x26b, 0x133, 0x51, 0x34f, 0x3d1, 0x5d, 0x1b2, 0x238, 0xad, 0x1d7, 0x33a, 0x76, 0x21a, 0x33f, 0x2b1, 0x192, 0x37b, 0x19c, 0x357, 0x222, 0x38f, 0x52, 0x2f2, 0x2a9, 0x61, 0xa9, 0x7c, 0x39d, 0x26, 0x239, 0x3c1, 0x2f8, 0x32e, 0x378, 0x21, 0x22f, 0x21e, 0x294, 0x216, 0x1c2, 0x358, 0x162, 0x31e, 0x9e, 0x38c, 0x1ef, 0x38a, 0x295, 0x17a, 0x2ed, 0x34c, 0x26c, 0x125, 0x18e, 0x323, 0x2e9, 0x2e7, 0x2cb, 0x175, 0x1ad, 0x3dd, 0x2a0, 0x5b, 0x2c8, 0xc8, 0xd5, 0x3e1, 0x2d1, 0xa7, 0xa0, 0x8c, 0x3f9, 0x99, 0x33d, 0xc0, 0x30f, 0x2ae, 0xee, 0x1d1, 0x80, 0x20a, 0x334, 0xb4, 0x299, 0x307, 0xb, 0x1df, 0xd8, 0xe9, 0x1fd, 0x3f5, 0x16a, 0x90, 0x349, 0x156, 0x2a6, 0x24b, 0xe0, 0x189, 0x263, 0xc3, 0x75, 0x347, 0x10e, 0x45, 0x82, 0x3a1, 0x27a, 0x1f4, 0x381, 0xfc, 0x139, 0x3ac, 0x158, 0x2fe, 0xa8, 0x229, 0x2c8, 0x190, 0x354, 0x337, 0x3ce, 0x370, 0x2e7, 0x19f, 0x1dd, 0x173, 0x1a7, 0xbd, 0x2ed, 0x291, 0x1a2, 0x13a, 0xd6, 0xb1, 0x31e, 0x13c, 0x22b, 0x363, 0xde, 0x214, 0x22f, 0x35, 0x242, 0x94, 0x1f, 0x3ca, 0x26, 0x7b, 0x31f, 0x3ed, 0x28c, 0x3c3, 0x52, 0x1ed, 0x2b6, 0x308, 0x282, 0x39b, 0x2b1, 0x324, 0x1f7, 0xfb, 0x115, 0xd9, 0x238, 0x15a, 0x355, 0x1e6, 0x369, 0x3d0, 0x26b, 0x266, 0x144, 0x24e, 0x167, 0x3b2, 0x43, 0x27f, 0x73, 0x1ba, 0x1ab, 0x29c, 0x109, 0xd2, 0x3c7, 0x201, 0x1df, 0x1b0, 0x3a4, 0x3f3, 0x327, 0x113, 0x41, 0x3a1, 0xfd, 0x3d9, 0x37, 0x3db, 0x361, 0x2ea, 0x173, 0x34e, 0x2f4, 0x345, 0x14a, 0x25, 0x20b, 0x3ca, 0x4c, 0x1ec, 0xce, 0x2a7, 0x134, 0x11c, 0x15a, 0x2a3, 0x391, 0x37e, 0x177, 0x1eb, 0x96, 0x368, 0x202, 0x322, 0x21d, 0xbf, 0x285, 0x367, 0x319, 0x220, 0x171, 0x18, 0x3c5, 0x157, 0xee, 0x3a2, 0x200, 0x74, 0x32c, 0x2ad, 0x321, 0xe0, 0x312, 0x19e, 0x211, 0x359, 0x2a, 0x310, 0x2c8, 0x320, 0x14b, 0x18e, 0x97, 0x2c3, 0x9e, 0x22b, 0x2cf, 0x378, 0x84, 0x2b8, 0x2a9, 0x184, 0x282, 0x33f, 0x2d6, 0x116, 0x34f, 0x35f, 0x1d9, 0x43, 0xf7, 0x1cc, 0x1cb, 0x193, 0x5c, 0x36a, 0x154, 0x213, 0xf, 0x11b, 0x102, 0x36c, 0xa7, 0x140, 0x230, 0x3f7, 0x182, 0x371, 0x6c, 0xe9, 0x3fa, 0x3cf, 0x342, 0x112, 0x356, 0x262, 0x5a, 0x13b, 0xe, 0x160, 0x263, 0x30c, 0x359, 0x54, 0x5b, 0x26d, 0x26c, 0x13a, 0x358, 0x302, 0x239, 0x237, 0x357, 0x134, 0x238, 0x161, 0x135, 0x16e, 0x303, 0x16f, 0x55, 0x30d, 0xf, 0x236, 0x1, 0x356, 0x262, 0x5a, 0x13b, 0xe, 0x160, 0x263, 0x30c, 0x359, 0x54, 0x5b, 0x26d, 0x26c, 0x13a, 0x358, 0x302, 0x239, 0x237, 0x357, 0x134, 0x238, 0x161, 0x135, 0x16e, 0x303, 0x16f, 0x55, 0x30d, 0xf, 0x236, 0x1, 0x356, 0x262, 0x5a, 0x13b, 0xe, 0x160, 0x263, 0x30c, 0x359, 0x54, 0x5b, 0x26d, 0x26c, 0x13a, 0x358, 0x302, 0x239, 0x237, 0x357, 0x134, 0x238, 0x161, 0x135, 0x16e, 0x303, 0x16f, 0x55, 0x30d, 0xf, 0x236, 0x1, 0x356, 0x262, 0x5a, 0x13b, 0xe, 0x160, 0x263, 0x30c, 0x359, 0x54, 0x5b, 0x26d, 0x26c, 0x13a, 0x358, 0x302, 0x239, 0x237, 0x357, 0x134, 0x238, 0x2a5, 0x19a, 0x2d0, 0x394, 0x1c0, 0xa6, 0x3ac, 0x2d2, 0x2d7, 0x2f4, 0x10f, 0x8d, 0x152, 0x39b, 0x1a5, 0xa2, 0x12a, 0xb3, 0x185, 0xbf, 0x206, 0x215, 0x3f9, 0xc1, 0x2eb, 0x360, 0x11f, 0x287, 0xc4, 0x2c8, 0x9b, 0x9d, 0x358, 0x20d, 0xf6, 0x19c, 0x115, 0x2c1, 0x33b, 0x1cc, 0x325, 0x106, 0x32d, 0x3, 0x3e6, 0x2ae, 0x379, 0xb5, 0x240, 0x1ea, 0xfd, 0x37f, 0x370, 0x315, 0x311, 0x197, 0x3f6, 0xa4, 0x2ef, 0x1e6, 0x37e, 0x1d5, 0x28f, 0x1c1, 0x203, 0x236, 0x2, 0x143, 0x334, 0x1a9, 0x321, 0x380, 0x14c, 0x351, 0x1ad, 0x1a7, 0x1e1, 0x21e, 0x11a, 0x2a4, 0x33f, 0x34a, 0x144, 0x254, 0x166, 0x30a, 0x17e, 0x5, 0x23, 0x3fb, 0x182, 0x1df, 0x2c9, 0x23e, 0x107, 0x188, 0x199, 0x136, 0x13a, 0x2b9, 0x13, 0x1ec, 0x338, 0x22a, 0x18b, 0x27f, 0x398, 0x243, 0x20c, 0x253, 0x6, 0x3c5, 0x155, 0x2fb, 0x143, 0x261, 0x2ad, 0x13e, 0x7e, 0x1da, 0x1dd, 0x31d, 0x21, 0x179, 0x2ca, 0x3b0, 0x2bf, 0x3a5, 0x2e4, 0x203, 0x65, 0x8, 0x20a, 0x32c, 0x145, 0x1e2, 0x3f0, 0x2cb, 0x2f3, 0xde, 0x108, 0x3da, 0x27d, 0x1bf, 0x1d5, 0x117, 0x30d, 0x3c, 0x328, 0x40, 0x74, 0x156, 0x23a, 0x30b, 0x3bf, 0x275, 0x3b5, 0x2f9, 0x52, 0x2ef, 0x3cc, 0x1e3, 0x2b3, 0xaa, 0x5e, 0x1e0, 0x176, 0x200, 0x3a0, 0x2a2, 0x1f4, 0x6e, 0x1c7, 0x38c, 0x197, 0x3e5, 0x290, 0x355, 0x25f, 0x303, 0x1b5, 0x159, 0x2f0, 0x31b, 0x3a2, 0x24, 0x13f, 0x13d, 0x3bb, 0x370, 0x223, 0x5f, 0xa3, 0x317, 0xad, 0x29e, 0x2dc, 0x2e, 0x1b3, 0x2da, 0x3ad, 0xee, 0x12f, 0x120, 0x1ea, 0x1fa, 0x1e7, 0x3b6, 0x13c, 0x2f8, 0x111, 0x8e, 0x161, 0xdd, 0x2cd, 0x170, 0x183, 0x2fd, 0x157, 0x379, 0x16a, 0x112, 0x34b, 0x3cb, 0x323, 0x18f, 0x1f2, 0x3ed, 0x286, 0x196, 0x145, 0x3c4, 0x3db, 0x275, 0x363, 0x3f6, 0x290, 0x2a3, 0x16e, 0x2e, 0x366, 0x37a, 0x157, 0x2fb, 0x1a1, 0x82, 0xd5, 0x18e, 0x162, 0x239, 0x19c, 0x5d, 0x43, 0x36b, 0x3eb, 0x23b, 0x99, 0x371, 0x2c9, 0xea, 0x54, 0x2d8, 0x256, 0x94, 0x3e0, 0x1a5, 0x288, 0x284, 0x93, 0x269, 0x14e, 0x5a, 0x1ca, 0x380, 0x139, 0x175, 0x38a, 0x21, 0x2f2, 0x33a, 0x1bf, 0x3aa, 0x55, 0x5e, 0x3c0, 0x1d1, 0x24, 0x27e, 0xfd, 0x1e7, 0x365, 0xf9, 0x3ed, 0x134, 0x1e4, 0xe6, 0x243, 0x22, 0x171, 0x180, 0x270, 0x3ef, 0x31, 0x2c8, 0x26c, 0x1c2, 0x39d, 0x192, 0x34f, 0x195, 0x2c6, 0x17e, 0x14, 0x230, 0x307, 0x160, 0x33c, 0x2b0, 0x2d7, 0x3c2, 0xd4, 0x308, 0xf4, 0x37c, 0x258, 0x386, 0x236, 0x8, 0x1d, 0xab, 0x23a, 0x21f, 0x2e7, 0x38c, 0x32e, 0x38f, 0xad, 0x135, 0x362, 0x170, 0x306, 0x3e6, 0x105, 0x251, 0x23a, 0x37, 0x38e, 0x5f, 0x28c, 0x11c, 0x31a, 0x396, 0x11, 0x171, 0x300, 0x1d2, 0x347, 0x310, 0x1a6, 0x216, 0xf8, 0x2d6, 0x288, 0x101, 0x24c, 0x36c, 0xcd, 0x352, 0x27c, 0x3f0, 0x33e, 0x363, 0x3e5, 0x252, 0x135, 0x2cd, 0x1c9, 0x6, 0x217, 0x1fd, 0x87, 0xb2, 0x136, 0x1c2, 0x333, 0x241, 0x24e, 0x166, 0x66, 0x32f, 0x212, 0xe5, 0x380, 0x272, 0x1dd, 0x6f, 0x210, 0x2ef, 0x32b, 0x20f, 0x1b3, 0x37a, 0x2ae, 0x3fe, 0x113, 0x32, 0x296, 0x358, 0x4c, 0x1f7, 0x2b7, 0x2b5, 0xbf, 0x14, 0x69, 0x7, 0x312, 0x3ac, 0x2bd, 0x85, 0x2b8, 0x19d, 0x1bf, 0x35d, 0x154, 0x2f0, 0x77, 0x25e, 0x112, 0x137, 0xc7, 0x162, 0x7b, 0x279, 0x2e8, 0x39, 0x1a3, 0x30e, 0x3ff, 0x16, 0x263, 0xac, 0x36f, 0x3c2, 0x1a8, 0x3b, 0x3a9, 0x3a5, 0x382, 0x78, 0x176, 0x12, 0x27e, 0x1fa, 0x395, 0x31e, 0x20a, 0x156, 0x1f4, 0x370, 0x13c, 0x3ed, 0xd9, 0x27f, 0x1fe, 0x319, 0x132, 0x3be, 0x186, 0x1f5, 0x17a, 0x6a, 0x219, 0x3a9, 0x343, 0x213, 0x3c0, 0x34d, 0x240, 0x29f, 0xc7, 0x2c4, 0x1ec, 0x3ec, 0x2d3, 0x329, 0xa, 0x69, 0xe, 0x53, 0x15f, 0x38a, 0x84, 0x373, 0x32b, 0x17, 0x2c5, 0x3e6, 0x2ba, 0x327, 0x59, 0x136, 0x384, 0xd7, 0x22c, 0xa1, 0x93, 0x1b6, 0xcd, 0x2ad, 0x1e2, 0x3bf, 0x38c, 0xa3, 0x8e, 0x31a, 0x325, 0x44, 0x39a, 0x6c, 0x23e, 0x54, 0x372, 0x121, 0x141, 0x331, 0x96, 0x386, 0xca, 0x80, 0x349, 0x27a, 0x3ce, 0x31e, 0x31f, 0x115, 0x43, 0x1b7, 0x2c7, 0x3fb, 0x16, 0xcf, 0x2b0, 0x34e, 0x57, 0x165, 0x2db, 0x35d, 0x2a8, 0x3d2, 0x3b8, 0x1a1, 0x208, 0x14b, 0x358, 0x98, 0x3d5, 0x195, 0x30a, 0x3cd, 0x109, 0xe5, 0x309, 0x1da, 0x2f3, 0x2f9, 0x290, 0x29e, 0x2cd, 0x392, 0x1d, 0x151, 0x3bb, 0x365, 0x3c1, 0x28e, 0x43, 0x36e, 0x30e, 0x3e7, 0x160, 0x1d6, 0x173, 0x21, 0x3bd, 0x32b, 0x2e, 0x306, 0x30f, 0x3fa, 0x31, 0x26d, 0x216, 0x3e0, 0x133, 0x368, 0x340, 0x8, 0xe8, 0x29a, 0x1e7, 0x31e, 0x237, 0x5d, 0x218, 0x346, 0x46, 0x307, 0x312, 0x2ab, 0x38a, 0x108, 0x1d7, 0x16e, 0x170, 0x6, 0x4e, 0x3ef, 0x188, 0x34c, 0x94, 0x33f, 0x18a, 0x376, 0x236, 0x40, 0x349, 0xfd, 0x323, 0xc6, 0x19c, 0x2e8, 0xe4, 0x206, 0x230, 0xe, 0xa6, 0x175, 0x6f, 0x52, 0x2a3, 0x362, 0x392, 0x30, 0x270, 0x347, 0x5b, 0x256, 0xa9, 0x1ce, 0x4b, 0x386, 0x194, 0x200, 0x27e, 0x3e1, 0x12e, 0x239, 0xfb, 0x36d, 0x329, 0x14, 0x1a4, 0x70, 0x139, 0x3ba, 0x378, 0x290, 0x135, 0x326, 0xaf, 0x180, 0x3a4, 0x20e, 0x2d8, 0x294, 0x141, 0x26b, 0x258, 0xf, 0xbb, 0x24, 0x3d4, 0x337, 0x3a, 0x14d, 0x1e7, 0x235, 0xce, 0x2e8, 0x1c8, 0xa, 0x1a4, 0xe0, 0xed, 0x1ef, 0x3e5, 0x2b4, 0x1cb, 0x44, 0x273, 0x2c9, 0x2bb, 0xbd, 0xd4, 0xec, 0x1d5, 0x2a8, 0x353, 0x3fe, 0x8a, 0x9b, 0x301, 0x2b1, 0x119, 0x34, 0x1, 0x3a, 0x14d, 0x1e7, 0x235, 0xce, 0x2e8, 0x1c8, 0xa, 0x1a4, 0xe0, 0xed, 0x1ef, 0x3e5, 0x2b4, 0x1cb, 0x44, 0x273, 0x2c9, 0x2bb, 0xbd, 0xd4, 0xec, 0x1d5, 0x2a8, 0x353, 0x3fe, 0x8a, 0x9b, 0x301, 0x2b1, 0x119, 0x34, 0x1, 0x3a, 0x14d, 0x1e7, 0x235, 0xce, 0x2e8, 0x1c8, 0xa, 0x1a4, 0xe0, 0xed, 0x1ef, 0x3e5, 0x2b4, 0x1cb, 0x44, 0x273, 0x2c9, 0x2bb, 0xbd, 0xd4, 0xec, 0x1d5, 0x2a8, 0x353, 0x3fe, 0x8a, 0x9b, 0x301, 0x2b1, 0x119, 0x34, 0x1, 0x3a, 0x14d, 0x1e7, 0x235, 0xce, 0x2e8, 0x1c8, 0xa, 0x1a4, 0xe0, 0xed, 0x1ef, 0x3e5, 0x2b4, 0x1cb, 0x74, 0x13d, 0x323, 0x318, 0x1f6, 0x35e, 0x1f1, 0x212, 0x24b, 0x3e9, 0x311, 0x222, 0x399, 0x3fc, 0x1fc, 0x16, 0x271, 0x173, 0x84, 0x3ae, 0x362, 0x253, 0x300, 0x11f, 0x150, 0x283, 0x308, 0x2bf, 0xaa, 0x3ad, 0x3fe, 0x114, 0x26c, 0x3e, 0x34a, 0x368, 0x11b, 0x80, 0x27e, 0x39f, 0x2c4, 0x37b, 0x2ce, 0x33, 0x14e, 0x352, 0x381, 0x315, 0x3f2, 0x364, 0x36b, 0x187, 0x3c7, 0x312, 0x2be, 0xde, 0x290, 0xdd, 0x20c, 0x39a, 0x360, 0x2bb, 0x17a, 0x350, 0x369, 0x16f, 0x1bd, 0x15d, 0x87, 0x332, 0x25, 0x33f, 0x221, 0x305, 0xbb, 0x90, 0x137, 0x6b, 0x98, 0x297, 0x191, 0x1b6, 0x261, 0x23a, 0x370, 0x1f2, 0x28e, 0x10c, 0x285, 0x230, 0x38, 0x272, 0x1ef, 0x3c3, 0x2c2, 0x243, 0x49, 0x2eb, 0x30c, 0x36f, 0x57, 0x33a, 0x385, 0x2c5, 0x30f, 0x3f3, 0x310, 0x256, 0x2a4, 0xdf, 0x2e4, 0x1e0, 0x12f, 0x82, 0xe8, 0xfd, 0x12e, 0x1ec, 0x2b7, 0x21d, 0x14e, 0x2ad, 0x21f, 0x9e, 0x357, 0x43, 0x346, 0x230, 0x70, 0x1da, 0x363, 0x47, 0xe6, 0x1c4, 0xc1, 0x263, 0x1ad, 0x21, 0x1d7, 0x362, 0xaf, 0x1b, 0xea, 0x12d, 0xd4, 0x3b0, 0x16f, 0x37a, 0x17d, 0x31, 0x34c, 0xa9, 0x26b, 0x2e4, 0x3c0, 0xb5, 0x19, 0x13a, 0xd7, 0x288, 0x68, 0x8, 0x349, 0x3e1, 0x162, 0x37b, 0x195, 0xcc, 0x262, 0x145, 0xdc, 0xf9, 0x28e, 0x218, 0x206, 0x1a4, 0x380, 0x2cb, 0x32e, 0x238, 0x339, 0x23b, 0x201, 0x33c, 0x173, 0x108, 0x2a3, 0x326, 0x171, 0xd8, 0x359, 0x17a, 0x2a9, 0x1bf, 0x36a, 0x3e6, 0x3fa, 0x188, 0x256, 0x141, 0x37c, 0x30d, 0x23f, 0x1a1, 0xc8, 0x1c2, 0x2b1, 0x6d, 0x340, 0x40, 0x27e, 0x337, 0x302, 0x3ee, 0xb3, 0x269, 0x334, 0x23a, 0x2e9, 0x3c1, 0x5d, 0xe4, 0x14, 0x13b, 0x3f, 0x275, 0x146, 0x1e4, 0x1d0, 0x3f4, 0x162, 0x2ff, 0x25d, 0x269, 0x261, 0xfa, 0x365, 0x67, 0x3b2, 0x17e, 0x212, 0x13e, 0x2e7, 0x1f9, 0x2c1, 0x36e, 0x8c, 0x38, 0x1da, 0x2cf, 0x11c, 0x339, 0x7f, 0x16, 0x1d6, 0x31d, 0x148, 0x1ba, 0x44, 0x3bc, 0x30c, 0x1a7, 0x179, 0x32b, 0x2e0, 0xc0, 0x11f, 0x149, 0x6a, 0x3b0, 0x2de, 0x1f3, 0x3fa, 0x310, 0x14a, 0x21a, 0x3a5, 0x178, 0x2fb, 0x114, 0x1a2, 0x3e0, 0x314, 0x203, 0x1d1, 0x224, 0x296, 0x39d, 0xa2, 0x34, 0x8, 0x29b, 0x39f, 0x302, 0x3d5, 0x2cc, 0x36c, 0x32c, 0x3d9, 0x31e, 0x338, 0x1af, 0x3e2, 0xb4, 0x1e2, 0x315, 0x3d3, 0x225, 0x346, 0x69, 0x1c0, 0x2cb, 0x255, 0xf2, 0x1fe, 0x3f8, 0xb0, 0x2ab, 0xde, 0x252, 0x1cb, 0x220, 0x1df, 0x56, 0x123, 0x3da, 0x16e, 0x32d, 0x209, 0xea, 0x25a, 0x350, 0x1bf, 0x2dd, 0x383, 0x3ef, 0xb6, 0x242, 0xf4, 0x117, 0x3d2, 0x3f5, 0x3a0, 0x3cb, 0x302, 0x3a3, 0x322, 0x356, 0x2ac, 0x3ce, 0x239, 0x35f, 0x33, 0x262, 0x11d, 0x1db, 0x237, 0x3b2, 0x2fc, 0x5a, 0x1e2, 0x223, 0x357, 0x10c, 0x5, 0x13b, 0xfc, 0x311, 0x134, 0x3b1, 0x215, 0xe, 0xed, 0x2cf, 0x238, 0xff, 0x3f8, 0x160, 0x2be, 0x2f9, 0x161, 0x11e, 0x132, 0x263, 0x2bd, 0x210, 0x135, 0x11, 0x1de, 0x30c, 0x34e, 0x1ed, 0x16e, 0x253, 0x36, 0x359, 0x1e1, 0x2ca, 0x303, 0x3, 0xe9, 0x54, 0x10f, 0xec, 0x16f, 0x1f3, 0x3fd, 0x5b, 0x242, 0x1e8, 0x55, 0x2af, 0x327, 0x26d, 0x250, 0xdf, 0x30d, 0xee, 0x226, 0x26c, 0x1f0, 0x314, 0xf, 0x34d, 0x104, 0x13a, 0x35c, 0xda, 0x236, 0x12, 0x137, 0x358, 0x241, 0x101, 0x1, 0x3a0, 0x3cb, 0x302, 0x3a3, 0x322, 0x356, 0x2ac, 0x3ce, 0x239, 0x35f, 0x33, 0x262, 0x11d, 0x1db, 0x237, 0x3b2, 0x2fc, 0x5a, 0x1e2, 0x223, 0x357, 0x349, 0x337, 0x26, 0x24e, 0x91, 0x1d, 0xfd, 0x162, 0x3ee, 0x191, 0x356, 0x151, 0x323, 0x1ec, 0x195, 0x269, 0x196, 0x3bb, 0xc6, 0x3d1, 0x21d, 0x262, 0x23a, 0x365, 0x19c, 0x35e, 0x32f, 0x2ad, 0xdc, 0x3c1, 0x2e8, 0x17e, 0x5a, 0x3c4, 0x9e, 0x28e, 0xe4, 0xa0, 0x24b, 0x2e7, 0x3ed, 0x43, 0x206, 0x13b, 0x1f8, 0x5f, 0x1b2, 0x36e, 0x230, 0x380, 0x275, 0x222, 0x1ee, 0x30e, 0xe, 0x1da, 0x32e, 0x1e4, 0x3eb, 0x3e7, 0xa6, 0x1ef, 0x47, 0x339, 0x1fc, 0x160, 0x175, 0x3f6, 0x31a, 0x1c4, 0x201, 0x1d6, 0x6f, 0xad, 0x243, 0x99, 0x263, 0x173, 0x52, 0x1ba, 0x110, 0x3be, 0x2b0, 0x21, 0x2a3, 0x106, 0xef, 0x30c, 0x295, 0x3bd, 0x362, 0x171, 0x2c9, 0x3dd, 0x15c, 0x32b, 0x392, 0x1b, 0x359, 0x3c2, 0x33a, 0x2e, 0x30, 0x11f, 0x12d, 0x2a9, 0x1e3, 0x306, 0x270, 0x54, 0x21e, 0x3b0, 0x36a, 0x30f, 0x29b, 0xc7, 0x130, 0xa1, 0x204, 0x349, 0x267, 0x98, 0x254, 0x102, 0x3a0, 0x337, 0x4c, 0x12a, 0x81, 0x1d0, 0x39f, 0x26, 0x95, 0x244, 0xe8, 0x3cb, 0x13, 0x24e, 0x122, 0x74, 0x3e1, 0x20d, 0x127, 0x91, 0x3a, 0x3f4, 0x302, 0x297, 0x24c, 0x1d, 0x1fa, 0x181, 0x34f, 0x126, 0x20a, 0xfd, 0x2c4, 0x3a3, 0x93, 0x105, 0x27a, 0x162, 0x3d5, 0x24d, 0x286, 0x13d, 0xb1, 0x3ee, 0x322, 0x143, 0x29a, 0x25c, 0x1f7, 0x191, 0x2a5, 0x14d, 0x12e, 0x2ff, 0x2cc, 0x356, 0x2a2, 0x97, 0x37b, 0x166, 0x1ab, 0x151, 0x24f, 0x3b9, 0xb3, 0x2d1, 0x2ac, 0x323, 0x3d8, 0x25d, 0x36c, 0x156, 0x395, 0x1ec, 0x32a, 0x1b6, 0xab, 0x3ce, 0xf6, 0x195, 0xdb, 0x251, 0x1e7, 0x7b, 0x2ce, 0x269, 0x32c, 0x2f7, 0x239, 0x167, 0x330, 0x196, 0x37f, 0x318, 0x2b7, 0x198, 0xcb, 0x3bb, 0x18c, 0x35f, 0xcc, 0x261, 0x3d9, 0xc6, 0x13f, 0x31c, 0x192, 0x202, 0x10, 0x3d4, 0x1ac, 0x116, 0x68, 0x100, 0x137, 0x2f6, 0x144, 0x289, 0x24, 0x354, 0x333, 0x6d, 0xca, 0x240, 0x125, 0x35c, 0x2d9, 0xbb, 0x41, 0x274, 0x1a5, 0x1c3, 0x3a2, 0x19, 0x301, 0x266, 0xf, 0x25e, 0x190, 0x7c, 0x221, 0xf0, 0x1a1, 0x136, 0x3c9, 0x258, 0x31b, 0x226, 0x344, 0xe7, 0x1c1, 0x1dc, 0x228, 0x25, 0x26b, 0x2f, 0x1ff, 0x2c8, 0x250, 0x2f1, 0x2f0, 0x3cf, 0xd3, 0x141, 0x343, 0x353, 0x87, 0x12b, 0x3d, 0x55, 0x155, 0x62, 0x294, 0x3d0, 0x159, 0x17d, 0x229, 0x11a, 0x177, 0x1bd, 0x3fd, 0x2d8, 0x184, 0x35d, 0x3e6, 0x3a7, 0x1d3, 0x76, 0x1b5, 0x217, 0x20e, 0x10f, 0x369, 0x366, 0x138, 0xa8, 0xd4, 0x2f5, 0x205, 0x3a4, 0x292, 0x15b, 0x303, 0x18, 0x23e, 0x17a, 0x19d, 0x5c, 0x180, 0x3a8, 0x38d, 0x1e6, 0x1c9, 0x36, 0x2fe, 0xae, 0x25f, 0xaf, 0x27e, 0x6b, 0x8b, 0x68, 0x200, 0xd5, 0x39d, 0x6d, 0x194, 0x112, 0x13a, 0x1a5, 0x386, 0x293, 0xc8, 0x7c, 0x4b, 0x3c0, 0x113, 0x344, 0x1ce, 0x30d, 0x2fb, 0x2c8, 0xa9, 0x3d6, 0x3ad, 0x87, 0x256, 0xf4, 0x2a8, 0x17d, 0x5b, 0x61, 0x3aa, 0x3e6, 0x347, 0x345, 0x3b0, 0x366, 0x270, 0x2a0, 0x2a9, 0x303, 0x30, 0xea, 0x3c2, 0x1e6, 0x392, 0xd8, 0x3dd, 0x2f2, 0x362, 0x39a, 0x30c, 0x85, 0x2a3, 0x22, 0x3be, 0x1ad, 0x52, 0x1cb, 0x99, 0x33c, 0x6f, 0x161, 0x1c4, 0x2c, 0x175, 0x38f, 0x339, 0x3fb, 0xa6, 0x363, 0x1e4, 0x367, 0xe, 0x2cb, 0x222, 0x36b, 0x230, 0x3f, 0x5f, 0x18b, 0x206, 0x1ca, 0x2e7, 0x357, 0xe4, 0x109, 0x3c4, 0xf9, 0x2e8, 0x3e2, 0x2ad, 0x2e9, 0x19c, 0x2c6, 0x262, 0x1f4, 0xc6, 0x2b7, 0x269, 0xab, 0x323, 0x37b, 0x191, 0x286, 0xfd, 0x302, 0x24e, 0x81, 0x349, 0x18e, 0xf5, 0x1ac, 0x51, 0x289, 0x90, 0x125, 0x16b, 0x1c3, 0x293, 0x190, 0x1f0, 0x258, 0x77, 0x228, 0x94, 0x2f1, 0x3d2, 0x87, 0xa5, 0x3d0, 0x16d, 0x3fd, 0x372, 0x76, 0x2dd, 0x138, 0x2a0, 0x15b, 0x17, 0x180, 0x2bb, 0xae, 0x16e, 0x2e2, 0x186, 0x85, 0x14f, 0x88, 0x1cf, 0x2e6, 0x252, 0x23c, 0xb, 0x2be, 0x38f, 0x27b, 0x3f7, 0x139, 0x255, 0xf7, 0x46, 0x309, 0x22b, 0x18b, 0x5, 0x321, 0x315, 0x115, 0xbf, 0x2d0, 0x1b8, 0xce, 0x2c6, 0xcd, 0x3d9, 0x239, 0x32a, 0x1ab, 0x29a, 0x2c4, 0x127, 0x81, 0x29b, 0x231, 0x8b, 0xd0, 0x12, 0x2a1, 0x1ae, 0x1bb, 0x1d1, 0x32, 0x3e, 0x4b, 0x389, 0x45, 0x216, 0xdf, 0x178, 0x397, 0x291, 0x7a, 0x2a8, 0x2fa, 0x16c, 0x308, 0x2de, 0x27, 0x54, 0x1a8, 0x385, 0x30, 0x1d4, 0x313, 0x32b, 0x15e, 0x336, 0x295, 0x3ae, 0x11, 0x3be, 0x35a, 0x148, 0x243, 0x1ea, 0x2b9, 0x288, 0xca, 0x224, 0x1c2, 0xc5, 0xf0, 0x113, 0x10b, 0xdf, 0x2f0, 0x247, 0xa5, 0x3a9, 0x1bd, 0x3d7, 0x345, 0x2db, 0x205, 0x11f, 0x1e1, 0x3cc, 0xaf, 0x336, 0x123, 0x2a3, 0x88, 0x39e, 0x38a, 0x2b4, 0x388, 0x160, 0x2f3, 0x79, 0x367, 0x38, 0xe3, 0x1b2, 0x103, 0x394, 0x315, 0x22a, 0x2fc, 0x2ad, 0x3b6, 0x1f6, 0xcc, 0x251, 0x24f, 0x3ee, 0x24c, 0x1d0, 0x18e, 0x241, 0xd0, 0x24, 0x296, 0x16b, 0x386, 0x25e, 0x9b, 0x33f, 0x382, 0x1ff, 0x26d, 0x10d, 0xaa, 0x17d, 0x16c, 0x219, 0x36a, 0x138, 0x149, 0x165, 0xb8, 0x36, 0x3dd, 0x3da, 0x245, 0x371, 0x2d2, 0xa4, 0x243, 0x304, 0x15f, 0x38f, 0xff, 0x3c7, 0x1da, 0x111, 0x2df, 0x1a4, 0x3e9, 0x3d3, 0xe4, 0x2d, 0x37, 0x237, 0x163, 0xcd, 0x3bb, 0xf6, 0x166, 0x286, 0x3f4, 0x4c, 0x284, 0x20, 0x137, 0x39d, 0x1b4, 0x176, 0x19, 0x3d4, 0x2f6, 0x6d, 0xbb, 0x19, 0x7c, 0x258, 0x1dc, 0x2c8, 0x141, 0x55, 0x17d, 0x2d8, 0x76, 0x366, 0x3a4, 0x17a, 0x1e6, 0xaf, 0x265, 0x85, 0x135, 0x92, 0x33c, 0x378, 0xe6, 0x3fb, 0x139, 0x146, 0x36b, 0x1a4, 0x3db, 0x357, 0x329, 0x2d0, 0x2e9, 0xfb, 0xcc, 0xab, 0x12e, 0x34f, 0x81, 0x27e, 0x358, 0x288, 0x194, 0x82, 0x20b, 0x4b, 0x23f, 0x59, 0xa9, 0x28f, 0x2aa, 0x5b, 0x308, 0x36a, 0x270, 0x12d, 0x33a, 0x392, 0x2c9, 0x295, 0x2a3, 0x110, 0x263, 0x6f, 0x31a, 0x1fc, 0xa6, 0x32e, 0x1ee, 0x230, 0x1f8, 0x3ed, 0xe4, 0x5a, 0xdc, 0x19c, 0x21d, 0x196, 0x323, 0x3ee, 0x91, 0x349, 0x6b, 0x51, 0x236, 0x112, 0x1c2, 0x18a, 0x3c0, 0x8a, 0x94, 0x3d6, 0x157, 0x188, 0x61, 0x16f, 0x4e, 0x2a0, 0x165, 0x170, 0xd8, 0x2d7, 0x1d7, 0x22, 0x1cf, 0x38a, 0x161, 0x23b, 0x312, 0x363, 0x33b, 0x3a1, 0x3ca, 0x368, 0x3a2, 0x320, 0x33f, 0x213, 0x3cf, 0x256, 0x35b, 0x1f3, 0x20e, 0x1a8, 0x17, 0x1b, 0x3b3, 0x2ef, 0x22, 0x39e, 0x233, 0x31a, 0x3f8, 0x298, 0x146, 0x2df, 0x299, 0x2e7, 0x115, 0x1f1, 0x145, 0x235, 0x2ce, 0x356, 0x1fa, 0x98, 0xd, 0x9, 0x296, 0x1a5, 0x1e, 0x28d, 0x216, 0x2f1, 0x2af, 0x188, 0xc2, 0x1b5, 0x270, 0x25a, 0xf3, 0xaf, 0xc3, 0x214, 0x1ba, 0x132, 0x351, 0x38f, 0x3fc, 0x7, 0x275, 0x364, 0xa, 0x27c, 0x1f2, 0x1af, 0x262, 0x37f, 0x3b9, 0x93, 0x1d0, 0x231, 0x51, 0x65, 0x41, 0x20b, 0x96, 0xee, 0x2c8, 0x282, 0x154, 0x3fa, 0x1d3, 0x2db, 0x6, 0x1d4, 0xae, 0x362, 0x1de, 0x2d2, 0x290, 0x71, 0xb0, 0x1ef, 0x3c8, 0x23, 0x3f, 0x1f9, 0x72, 0x5a, 0x1b8, 0x279, 0xcc, 0x156, 0xb1, 0x24e, 0x2, 0x34b, 0x39d, 0x2d9, 0x34d, 0x249, 0x277, 0x2f, 0x397, 0x34b, 0x333, 0x376, 0x25e, 0xd1, 0x26b, 0x3d2, 0x62, 0x61, 0x1b5, 0xe9, 0x17a, 0x391, 0x2e2, 0x56, 0x29, 0x8f, 0x2c, 0x2f3, 0x3c8, 0x46, 0xfc, 0x3d3, 0x329, 0x352, 0x2c3, 0x2b7, 0x1ab, 0x1fa, 0x130, 0x34, 0x48, 0x13a, 0xc5, 0x389, 0x59, 0x2a4, 0xaa, 0x3fa, 0x3a6, 0x37e, 0x30, 0x17f, 0x1ed, 0x106, 0x2e3, 0x31d, 0x31a, 0x3f9, 0x272, 0x222, 0x1a3, 0x394, 0x9e, 0x3b2, 0x29c, 0x3bb, 0x3b9, 0x126, 0x349, 0x1ac, 0x119, 0xbb, 0x64, 0x3c9, 0x30d, 0x3cf, 0xa5, 0x177, 0x383, 0xa8, 0x165, 0x1c9, 0x19b, 0x85, 0xdd, 0x132, 0x2ab, 0x227, 0x3df, 0x70, 0x22b, 0x86, 0x109, 0x6e, 0x338, 0xcc, 0x2ac, 0x2c4, 0x254, 0x20, 0x1aa, 0x2b1, 0x203, 0x342, 0x216, 0x1eb, 0x2ae, 0x5b, 0x3b, 0x2c5, 0x11f, 0x313, 0x2dc, 0xef, 0x2d2, 0x129, 0x1c4, 0x189, 0x2cf, 0x1ee, 0xd2, 0x3bf, 0x28e, 0x29f, 0xd7, 0x386, 0x1a1, 0x216, 0x3d6, 0x2aa, 0x2d8, 0x3b0, 0x6, 0x359, 0x2f2, 0x106, 0x1cf, 0x6f, 0xe6, 0x3e7, 0x2cb, 0x1b2, 0x14, 0x3c4, 0x237, 0x21d, 0xab, 0x162, 0x254, 0x40, 0x2a1, 0x1a5, 0x78, 0x8a, 0xa9, 0x55, 0x3fa, 0x345, 0x1e3, 0x180, 0x3dd, 0x1d7, 0x110, 0x33c, 0x3f6, 0x1fe, 0xe, 0x38c, 0x43, 0x109, 0xdc, 0xfb, 0x269, 0x29a, 0x26, 0xd, 0x24, 0x13a, 0x18a, 0x23f, 0x2c8, 0x21a, 0x16d, 0x347, 0xd4, 0x2e, 0xd8, 0x295, 0x135, 0x99, 0x2ab, 0x47, 0x367, 0x380, 0x2f8, 0xe4, 0x2d0, 0x365, 0x2b7, 0x356, 0x3e1, 0x192, 0x340, 0x112, 0x20b, 0x258, 0x2fb, 0x34c, 0x3a9, 0x3e6, 0x54, 0x165, 0x392, 0x265, 0x21, 0x1cb, 0x201, 0x3ba, 0x1e4, 0x46, 0x1f8, 0x357, 0x17e, 0x145, 0xc6, 0xb3, 0x1d, 0x18e, 0x51, 0x194, 0x19, 0x3e0, 0x30d, 0x397, 0x294, 0x3aa, 0x4e, 0x137, 0x35c, 0xf, 0x226, 0x250, 0x55, 0x3fd, 0x10f, 0x303, 0x36, 0x34e, 0x135, 0x132, 0x2be, 0x238, 0x215, 0xfc, 0x357, 0x2fc, 0x11d, 0x239, 0x322, 0x3a0, 0x358, 0xda, 0x34d, 0x26c, 0xdf, 0x2af, 0x5b, 0xec, 0x3, 0x359, 0x1ed, 0x11, 0x263, 0x2f9, 0xff, 0xe, 0x311, 0x10c, 0x5a, 0x1db, 0x35f, 0x356, 0x3cb, 0x241, 0x236, 0x104, 0x1f0, 0x30d, 0x327, 0x242, 0x16f, 0xe9, 0x1e1, 0x16e, 0x1de, 0x2bd, 0x161, 0x3f8, 0xed, 0x134, 0x5, 0x1e2, 0x237, 0x33, 0x2ac, 0x302, 0x101, 0x12, 0x13a, 0x314, 0xee, 0x26d, 0x1e8, 0x1f3, 0x54, 0x2ca, 0x253, 0x30c, 0x210, 0x11e, 0x160, 0x2cf, 0x3b1, 0x13b, 0x223, 0x3b2, 0x262, 0x3ce, 0x3a3, 0x1, 0x137, 0x35c, 0xf, 0x226, 0x250, 0x55, 0x3fd, 0x10f, 0x303, 0x36, 0x34e, 0x135, 0x132, 0x2be, 0x238, 0x215, 0xfc, 0x357, 0x2fc, 0x11d, 0x239, 0x26e, 0x16b, 0x78, 0x228, 0x282, 0x16d, 0x107, 0x15b, 0x392, 0x186, 0x210, 0x23c, 0x189, 0x255, 0x36e, 0x321, 0x1f2, 0x2c6, 0x251, 0x2c4, 0x284, 0x12, 0x274, 0x4b, 0x379, 0x291, 0x177, 0x27, 0x25a, 0x32b, 0x273, 0x35a, 0x161, 0x3f9, 0x3b4, 0x1b2, 0x50, 0x37, 0xfb, 0x1b6, 0x1fa, 0x192, 0x11b, 0x104, 0x3e0, 0x2f, 0x10e, 0x61, 0x1b3, 0x23e, 0x15c, 0x83, 0x39e, 0x378, 0xff, 0x1c, 0x5f, 0x72, 0x1a9, 0x31e, 0x25d, 0x3a, 0x6b, 0x232, 0x3a2, 0x26c, 0x1be, 0x2ae, 0x2d8, 0x2db, 0x60, 0x3dd, 0x355, 0x124, 0x2ab, 0x11c, 0x215, 0x1f8, 0x147, 0x3cd, 0x1f4, 0x3b9, 0x122, 0x3d4, 0x26f, 0x305, 0x113, 0x250, 0xaa, 0x3ef, 0x6a, 0x5c, 0x2c9, 0x214, 0x396, 0x2c, 0x3b5, 0x3dc, 0x13b, 0x4f, 0x2d3, 0x334, 0x97, 0x95, 0x40, 0x296, 0x266, 0x23f, 0x332, 0x1e8, 0x3e6, 0x150, 0x27d, 0x171, 0xd5, 0x1a5, 0x3c0, 0x2c8, 0xf4, 0x3e6, 0x2a0, 0x1e6, 0x39a, 0x1ad, 0x161, 0x3fb, 0x2cb, 0x18b, 0x109, 0x2e9, 0x2b7, 0x286, 0x18e, 0x288, 0x1d1, 0x26c, 0x37c, 0x2aa, 0x2ed, 0x1e3, 0x1b, 0x295, 0x1ba, 0x201, 0x1ef, 0x1ee, 0x13b, 0x9e, 0x35e, 0x196, 0x162, 0x284, 0x24, 0x1c2, 0x258, 0x3f5, 0x294, 0x16f, 0x3a4, 0x22f, 0x326, 0x1cf, 0x378, 0x1fe, 0x70, 0x2f8, 0x329, 0x145, 0x239, 0x93, 0x27e, 0x39d, 0x386, 0x113, 0xa9, 0x2a8, 0x347, 0x2a9, 0x392, 0x30c, 0x52, 0x1c4, 0xa6, 0x222, 0x206, 0x3c4, 0x19c, 0x269, 0xfd, 0x192, 0x236, 0x19, 0x33f, 0x2f0, 0x188, 0x76, 0x6, 0x2fe, 0x1d7, 0x92, 0x2ab, 0x238, 0x46, 0x3db, 0x5d, 0x14e, 0x1e7, 0x34f, 0x8, 0x2a1, 0x133, 0x23f, 0x26d, 0x3a9, 0x30f, 0x12d, 0x32b, 0xef, 0x173, 0x31a, 0x3e7, 0x275, 0x43, 0x5a, 0x365, 0x195, 0x1d, 0x6b, 0x1aa, 0x29d, 0x23f, 0xd3, 0x2bf, 0x4e, 0x2f4, 0x1b1, 0x3be, 0xde, 0xff, 0x70, 0x1f9, 0xbf, 0x23a, 0x3d8, 0x244, 0x29f, 0x16b, 0x1e0, 0x2c8, 0x1e8, 0x383, 0x12d, 0x25f, 0x3bc, 0x38a, 0x1cc, 0x7, 0x5f, 0x1c8, 0x2a6, 0x239, 0x126, 0x1ea, 0xd7, 0x1e, 0x228, 0x21a, 0x2fd, 0x150, 0x1e6, 0x33d, 0x2bd, 0x31a, 0x3c7, 0x1c6, 0x218, 0x1a9, 0x63, 0x191, 0x29b, 0x3ca, 0x386, 0x226, 0x2a4, 0x16d, 0x15, 0x19d, 0x171, 0x169, 0x2b4, 0x3fb, 0x19f, 0x225, 0x5a, 0x2c3, 0x25d, 0xe8, 0x2b9, 0x1bb, 0x1a1, 0x128, 0x154, 0x347, 0x15b, 0x253, 0x56, 0x129, 0xfe, 0x1da, 0x364, 0x280, 0x2e9, 0x167, 0x20a, 0x6b, 0xda, 0x25e, 0x216, 0x117, 0x3f3, 0xd4, 0x2e0, 0x186, 0x52, 0x388, 0x298, 0x134, 0x28, 0x6e, 0x3d1, 0x2a5, 0xc7, 0x288, 0x3a2, 0x1a2, 0x3d6, 0x2fa, 0x10f, 0x2e, 0x19b, 0x84, 0x23c, 0x354, 0x266, 0x1dc, 0x12b, 0x35d, 0x3a4, 0xae, 0x20c, 0x33c, 0x227, 0x215, 0x3db, 0x174, 0xcd, 0x12e, 0x142, 0x48, 0x20b, 0x382, 0x10e, 0x308, 0x3, 0x1f5, 0x2a3, 0x264, 0x37d, 0x1ee, 0xe5, 0x1f2, 0x21d, 0x14d, 0x260, 0x236, 0x64, 0x39c, 0x157, 0x372, 0x3c6, 0xd8, 0x214, 0x8f, 0x312, 0x111, 0x5, 0x21f, 0x3ec, 0x2a5, 0x18e, 0x232, 0x12f, 0x216, 0x22e, 0x3d7, 0x2a9, 0x253, 0xac, 0xad, 0x3f9, 0x19f, 0x43, 0x168, 0x235, 0x191, 0x13f, 0x333, 0xf, 0x228, 0x3d, 0x3e6, 0x292, 0x25f, 0x371, 0x233, 0x27b, 0x70, 0x3f2, 0x2fc, 0x1f4, 0x1f7, 0x2, 0x2a1, 0xc5, 0x3b8, 0x256, 0x2b3, 0x341, 0x15c, 0x11, 0x271, 0x47, 0x23, 0x3bf, 0x2e8, 0x19a, 0x25c, 0x284, 0x90, 0x1f, 0x30d, 0x21c, 0x219, 0x6, 0x3ea, 0x14f, 0xc1, 0x2f3, 0x3dc, 0x1ca, 0x3e4, 0x33, 0x29a, 0xc9, 0x65, 0xc8, 0x2a1, 0x18a, 0x2fb, 0x294, 0x36a, 0xea, 0x3bd, 0x92, 0x175, 0x33b, 0x13b, 0xf9, 0x21d, 0x29a, 0x192, 0x194, 0x249, 0x37c, 0x17d, 0x21e, 0x170, 0x30c, 0x290, 0x1fc, 0x2cb, 0x43, 0x2d0, 0xc6, 0x93, 0x3d4, 0x2b1, 0x3c0, 0x26d, 0x177, 0x270, 0x22f, 0x106, 0x33c, 0x47, 0x46, 0x2e7, 0x36d, 0x196, 0x302, 0x68, 0x82, 0x33f, 0x3ad, 0x2d8, 0x1e3, 0xd8, 0x21, 0x23c, 0xa6, 0x134, 0xa0, 0x2e9, 0x195, 0xe8, 0x2f6, 0x386, 0x8a, 0x21a, 0x3e6, 0x12d, 0x16e, 0x3be, 0x378, 0x3eb, 0x3f, 0x28e, 0x14e, 0x323, 0x254, 0x24, 0x20b, 0x30d, 0x31, 0x76, 0x30, 0x2d7, 0x1ba, 0x2c, 0x32e, 0x346, 0x3c4, 0xfb, 0x356, 0x18e, 0x6d, 0xb5, 0x94, 0x2a8, 0x20e, 0x33a, 0x39a, 0x173, 0xe6, 0xe, 0x2f8, 0x17e, 0x1f4, 0x3ee, 0x8, 0x125, 0x4b, 0x3f5, 0x8d, 0x366, 0x359, 0x1d7, 0x99, 0x3ba, 0x1ee, 0x14b, 0x221, 0x3f5, 0x11a, 0x183, 0x2fe, 0x14f, 0x304, 0x363, 0x2d5, 0x1e2, 0xfb, 0x2a5, 0x231, 0x368, 0x342, 0x2a4, 0x37a, 0x149, 0xb7, 0x3be, 0x2f9, 0x3b7, 0x1f8, 0xba, 0x19a, 0x162, 0x1a, 0x41, 0x33f, 0x353, 0x372, 0x303, 0x19b, 0x29, 0x23b, 0x3b4, 0x225, 0x2d0, 0x18c, 0x24c, 0x29f, 0x34a, 0xee, 0x256, 0x2de, 0x75, 0x3bd, 0x124, 0x1dd, 0x1ee, 0x394, 0x31f, 0x269, 0x3cb, 0x144, 0x293, 0x25, 0x154, 0x20e, 0x27d, 0x273, 0x38a, 0x27b, 0x1c0, 0x357, 0x257, 0x395, 0x254, 0x48, 0x3e, 0x5e, 0x310, 0x2db, 0x1b, 0x10a, 0x11e, 0xa6, 0x268, 0x280, 0x365, 0x166, 0x13f, 0xd7, 0xf0, 0x332, 0x177, 0xe9, 0xae, 0x22, 0x3ac, 0xf2, 0x1a4, 0x13c, 0x30a, 0x29a, 0x324, 0x259, 0x26c, 0x3a5, 0x3f3, 0x2a9, 0x15e, 0x2d2, 0x31a, 0x207, 0x17c, 0x17e, 0x3e8, 0x3a3, 0x40, 0x274, 0x172, 0x87, 0x296, 0x96, 0x397, 0x184, 0xc, 0x2d7, 0x2e1, 0x2c0, 0x222, 0x50, 0x1db, 0xb3, 0x13f, 0x1ae, 0x3c0, 0x1a6, 0x35d, 0x11f, 0x3da, 0x124, 0x3ba, 0x3b1, 0x9f, 0x19c, 0x1ab, 0x31c, 0x368, 0x28d, 0x282, 0x3e6, 0xbd, 0x2cd, 0x263, 0x227, 0x8c, 0x315, 0x163, 0x2a2, 0x192, 0x259, 0xd1, 0x28f, 0x3a7, 0x2ca, 0x39a, 0x1c5, 0x27b, 0x380, 0x147, 0x29c, 0x12e, 0x202, 0x224, 0x33f, 0x2af, 0x1d3, 0x2e, 0x186, 0x129, 0x3fb, 0x1c6, 0x1c8, 0x23a, 0x1f7, 0x10, 0x13a, 0x172, 0x10e, 0x76, 0xc0, 0x123, 0x243, 0x53, 0x268, 0x109, 0x18f, 0x322, 0x3d4, 0x2d6, 0x77, 0x256, 0x1b5, 0x1d4, 0x1d7, 0x264, 0x3de, 0x36e, 0x1e2, 0x1f6, 0x286, 0x1ac, 0x2e5, 0x8a, 0x7a, 0x217, 0x3c2, 0x83, 0x271, 0x238, 0xd2, 0x13c, 0x21d, 0x27a, 0x116, 0x1d1, 0x10b, 0xaa, 0x20e, 0xf3, 0x1de, 0x6f, 0x3f1, 0x7e, 0x5d, 0x125, 0x258, 0x87, 0x76, 0x180, 0x85, 0x23c, 0x139, 0x18b, 0x2d0, 0x239, 0x81, 0x2a1, 0x4b, 0x397, 0x308, 0x30, 0x295, 0x243, 0xa6, 0x1b2, 0x5a, 0xc6, 0x91, 0xd5, 0x18a, 0x3f5, 0x61, 0x6, 0x2d7, 0x1cb, 0x312, 0x134, 0x109, 0x31e, 0x93, 0x29f, 0x133, 0x2fb, 0x8d, 0x306, 0x3dd, 0x1ba, 0x160, 0x222, 0xa0, 0x365, 0x191, 0x3d4, 0x1a5, 0x1dc, 0x294, 0x366, 0x2fe, 0x135, 0x2c, 0x146, 0x14, 0x2e9, 0xb3, 0x27e, 0x2b1, 0x23f, 0x256, 0x36a, 0x359, 0x2a3, 0x201, 0x32e, 0x206, 0xdc, 0x195, 0x349, 0xd7, 0x3c0, 0x34c, 0x16f, 0xea, 0x1d7, 0xc1, 0x363, 0x346, 0x21f, 0x2b7, 0xe8, 0x39d, 0x78, 0x26d, 0x3aa, 0x11f, 0x3bd, 0x99, 0x1ef, 0x36e, 0x3c4, 0x3d1, 0x1d, 0x2f6, 0xf, 0x2c8, 0x177, 0x3a4, 0x2f2, 0x92, 0x3ba, 0x36b, 0x27c, 0xfb, 0x286, 0x358, 0x386, 0x59, 0x3a9, 0x270, 0x24a, 0x172, 0x31, 0x369, 0x6c, 0x108, 0x7f, 0x33e, 0xe4, 0x7d, 0x3a3, 0x200, 0x1f, 0x178, 0x2d8, 0x20f, 0x186, 0xad, 0x3c7, 0x17c, 0x3e2, 0x3ce, 0x142, 0x112, 0x277, 0x155, 0x21e, 0x32d, 0x2d2, 0xe6, 0xe0, 0x147, 0x262, 0x2c4, 0x1a0, 0xc8, 0x2f1, 0x3f3, 0x165, 0x33d, 0x233, 0x3eb, 0x3f0, 0x3b2, 0xab, 0x260, 0x259, 0x344, 0xaa, 0x2a, 0x32b, 0x375, 0x3c3, 0x46, 0x223, 0x30a, 0xfd, 0xa2, 0x25e, 0xa9, 0x2fd, 0xbd, 0x326, 0x271, 0xf2, 0x13b, 0x38b, 0x1b6, 0x18e, 0x2d9, 0x45, 0xf4, 0x9c, 0xae, 0x110, 0x2ea, 0x3b1, 0x27c, 0x1f6, 0x20a, 0x2f6, 0x1e, 0x332, 0x3aa, 0x23e, 0x2ef, 0xc1, 0x2cf, 0x103, 0xdc, 0x32a, 0x13f, 0x2b1, 0x77, 0x14a, 0x366, 0x1f5, 0xdd, 0x160, 0x4d, 0x280, 0x31e, 0x126, 0x26e, 0x18a, 0x3e3, 0x184, 0x30, 0x123, 0x11e, 0x139, 0x316, 0x352, 0x1ec, 0x9d, 0x1c1, 0x188, 0x2f5, 0x19b, 0x290, 0x3f7, 0xbe, 0x3e2, 0x395, 0x101, 0x82, 0x331, 0x2fa, 0x2a9, 0x1cd, 0x31d, 0x3eb, 0x3e9, 0x2d3, 0x151, 0x241, 0x3a2, 0x94, 0x1bd, 0x25a, 0x326, 0xeb, 0x3c8, 0x1ca, 0xce, 0x2a5, 0x358, 0x203, 0x199, 0x3aa, 0x75, 0x3ae, 0x201, 0xa3, 0x28, 0x365, 0x24d, 0x137, 0x18a, 0x3cf, 0x219, 0x180, 0x214, 0x388, 0x2cb, 0x72, 0x7d, 0x34f, 0x12, 0xf8, 0x3ad, 0x3a6, 0x2e0, 0x2b0, 0x73, 0xe0, 0x28e, 0x19a, 0x20d, 0x236, 0x136, 0x117, 0x20e, 0x391, 0x375, 0x38f, 0x118, 0x13c, 0xcc, 0x39f, 0xda, 0x113, 0x7a, 0x9c, 0x15c, 0x49, 0x37d, 0x36e, 0x30b, 0x167, 0x349, 0x35c, 0x77, 0x294, 0x183, 0x3b3, 0x1cb, 0x53, 0x364, 0x2d0, 0xf6, 0x2, 0x13a, 0x382, 0x310, 0x1e3, 0x336, 0x129, 0x3e7, 0x17c, 0x3cd, 0x323, 0x202, 0x104, 0x26b, 0x1fd, 0x15b, 0x39a, 0x13a, 0x30d, 0x5b, 0x303, 0x30c, 0x161, 0xe, 0x357, 0x262, 0x302, 0x236, 0x26c, 0x55, 0x54, 0x16e, 0x263, 0x238, 0x13b, 0x237, 0x356, 0x358, 0xf, 0x26d, 0x16f, 0x359, 0x135, 0x160, 0x134, 0x5a, 0x239, 0x1, 0x13a, 0x30d, 0x5b, 0x303, 0x30c, 0x161, 0xe, 0x357, 0x262, 0x302, 0x236, 0x26c, 0x55, 0x54, 0x16e, 0x263, 0x238, 0x13b, 0x237, 0x356, 0x358, 0xf, 0x26d, 0x16f, 0x359, 0x135, 0x160, 0x134, 0x5a, 0x239, 0x1, 0x13a, 0x30d, 0x5b, 0x303, 0x30c, 0x161, 0xe, 0x357, 0x262, 0x302, 0x236, 0x26c, 0x55, 0x54, 0x16e, 0x263, 0x238, 0x13b, 0x237, 0x356, 0x358, 0xf, 0x26d, 0x16f, 0x359, 0x135, 0x160, 0x134, 0x5a, 0x239, 0x1, 0x13a, 0x30d, 0x5b, 0x303, 0x30c, 0x161, 0xe, 0x357, 0x262, 0x302, 0x236, 0x26c, 0x55, 0x54, 0x16e, 0x263, 0x238, 0x13b, 0x237, 0x356, 0x358, 0x274, 0x2f, 0x2d8, 0x5c, 0x158, 0xe6, 0x309, 0x174, 0xab, 0x324, 0x34d, 0xa9, 0x3c5, 0x313, 0x110, 0x37d, 0x1a3, 0xdc, 0x166, 0x34b, 0x18a, 0x327, 0x1d8, 0xd8, 0xa4, 0x3f7, 0x2f8, 0x257, 0xb1, 0x340, 0x9b, 0x22e, 0x54, 0x2dc, 0x19e, 0x1e4, 0x394, 0x279, 0x1d, 0x333, 0x31b, 0x294, 0x205, 0x34e, 0x23c, 0x3b4, 0x72, 0x1f4, 0x95, 0x89, 0x1ce, 0x2fa, 0x2b6, 0xef, 0x2f9, 0x23, 0x9e, 0x198, 0xc7, 0x376, 0xb2, 0x1d5, 0xea, 0x14f, 0xb0, 0x134, 0xb4, 0xf6, 0x8, 0x384, 0x178, 0x2ed, 0x2e0, 0x2d2, 0x339, 0x7e, 0x3b2, 0x151, 0x116, 0x25e, 0x141, 0x217, 0xae, 0x92, 0x3de, 0x103, 0x2e9, 0x322, 0x26e, 0x4b, 0x10e, 0x2db, 0x2c9, 0x129, 0x387, 0x3ed, 0x29c, 0x181, 0x236, 0xd1, 0x154, 0x2a0, 0x2cd, 0xeb, 0x33b, 0x9f, 0x3ec, 0xe8, 0x1ae, 0xee, 0x8d, 0xc, 0x246, 0x1c4, 0xe1, 0xbc, 0x2ed, 0x1c9, 0x35a, 0x1fe, 0x3e9, 0x2b5, 0xfd, 0x232, 0x226, 0x3a9, 0x28b, 0x3ae, 0x2c, 0x9a, 0xb4, 0x1ec, 0x20, 0x1f, 0x3ad, 0x10f, 0x15e, 0x38a, 0x3b7, 0x1c7, 0x21d, 0x39f, 0x2d9, 0x59, 0x1d5, 0x1d4, 0x135, 0x189, 0x364, 0x2ad, 0x1f7, 0x9, 0x3e0, 0x155, 0x1a8, 0x39a, 0x1bc, 0x215, 0x9e, 0x330, 0x31c, 0x386, 0x332, 0x2de, 0x2fe, 0x2e1, 0x14c, 0x43, 0x11d, 0x297, 0x120, 0xe7, 0x2fa, 0x165, 0x3bc, 0x3e5, 0x230, 0x3e4, 0x2d1, 0x358, 0x3c, 0x291, 0x366, 0x36f, 0x8f, 0x1da, 0x72, 0x3e8, 0x254, 0x41, 0xdf, 0x3ef, 0xf3, 0x375, 0x47, 0x299, 0x67, 0x286, 0x3ca, 0x389, 0x294, 0x3, 0x123, 0x1c4, 0x33e, 0x25b, 0x1e7, 0x202, 0x32, 0x3d6, 0x107, 0x25f, 0x263, 0xf2, 0x394, 0xfb, 0x74, 0x1ae, 0x1dc, 0x234, 0x60, 0x21, 0xfe, 0x311, 0x3e2, 0x97, 0xd0, 0x249, 0x1c2, 0x2f0, 0x345, 0xaf, 0x38a, 0x367, 0x315, 0xcc, 0x18e, 0x386, 0x26d, 0x36a, 0x3dd, 0x243, 0x1da, 0xe4, 0x3bb, 0x284, 0x19, 0x3d6, 0x20e, 0x16e, 0x33c, 0x33b, 0x27c, 0x2b7, 0x27e, 0x133, 0x397, 0x3b0, 0x2c9, 0xad, 0xe, 0x28e, 0x196, 0x192, 0x293, 0x141, 0x4e, 0x2f2, 0xc1, 0x146, 0x109, 0x239, 0x8, 0x20b, 0x3ad, 0x21e, 0x171, 0x6f, 0x30e, 0x9e, 0x269, 0x6b, 0xf, 0x34c, 0x366, 0x2d7, 0x23c, 0x2cb, 0x329, 0x1e7, 0xd, 0xc8, 0x28f, 0x54, 0x362, 0x1d6, 0x1ee, 0x3c4, 0x195, 0x3d4, 0x18a, 0x87, 0x1bf, 0x265, 0x161, 0x70, 0x5d, 0xab, 0x8b, 0xb5, 0x21a, 0x270, 0x3bd, 0x201, 0x222, 0x5a, 0x1ec, 0x40, 0x7c, 0x157, 0xd4, 0x39a, 0x378, 0x46, 0xf9, 0x36c, 0x358, 0x78, 0x256, 0x306, 0x295, 0x1c4, 0x275, 0x17e, 0x323, 0x68, 0x249, 0x55, 0x2a0, 0x326, 0x2ab, 0x36b, 0x384, 0x3d2, 0x21e, 0x2e2, 0x1bc, 0x46, 0x1f2, 0x1ab, 0x2f6, 0x389, 0x242, 0x30, 0x42, 0x3f9, 0x2f8, 0x29c, 0x13, 0xbb, 0x128, 0x383, 0x15c, 0x132, 0xa3, 0x109, 0x7b, 0x20, 0x7c, 0x2ae, 0x350, 0xef, 0x3e5, 0xd2, 0x237, 0x105, 0x26f, 0x1dc, 0xc2, 0x209, 0x52, 0x3c7, 0x3af, 0x334, 0x260, 0x34d, 0x141, 0x9c, 0x3da, 0x201, 0x4d, 0x168, 0x37b, 0x9, 0x39b, 0x17d, 0x2ca, 0x1df, 0x47, 0x276, 0x279, 0xe8, 0x16b, 0x3fe, 0x76, 0x1b0, 0x252, 0xe, 0x115, 0x251, 0x8b, 0x16a, 0x7a, 0x3a4, 0x3ae, 0xb0, 0x1b2, 0x153, 0x3a3, 0x120, 0x39c, 0x3f3, 0x1e6, 0x39e, 0xf2, 0x24b, 0x3ab, 0x13f, 0x133, 0x327, 0x2db, 0x265, 0x2c2, 0x1c0, 0x2e8, 0x2a2, 0x144, 0x113, 0x35b, 0x75, 0x135, 0x22d, 0x225, 0x23a, 0x95, 0x41, 0x37c, 0x287, 0xb7, 0x33c, 0x27f, 0x1e2, 0x195, 0x3a1, 0x221, 0x31, 0x301, 0x353, 0xd4, 0x273, 0x3e5, 0x1a4, 0xce, 0x3a, 0x2b1, 0x3fe, 0xec, 0x2c9, 0x2b4, 0xe0, 0x2e8, 0x14d, 0x119, 0x8a, 0x1d5, 0x2bb, 0x1cb, 0xed, 0x1c8, 0x1e7, 0x34, 0x9b, 0x2a8, 0xbd, 0x44, 0x1ef, 0xa, 0x235, 0x1, 0x301, 0x353, 0xd4, 0x273, 0x3e5, 0x1a4, 0xce, 0x3a, 0x2b1, 0x3fe, 0xec, 0x2c9, 0x2b4, 0xe0, 0x2e8, 0x14d, 0x119, 0x8a, 0x1d5, 0x2bb, 0x1cb, 0xed, 0x1c8, 0x1e7, 0x34, 0x9b, 0x2a8, 0xbd, 0x44, 0x1ef, 0xa, 0x235, 0x1, 0x301, 0x353, 0xd4, 0x273, 0x3e5, 0x1a4, 0xce, 0x3a, 0x2b1, 0x3fe, 0xec, 0x2c9, 0x2b4, 0xe0, 0x2e8, 0x14d, 0x119, 0x8a, 0x1d5, 0x2bb, 0x1cb, 0xed, 0x1c8, 0x1e7, 0x34, 0x9b, 0x2a8, 0xbd, 0x44, 0x1ef, 0xa, 0x235, 0x1, 0x301, 0x353, 0xd4, 0x273, 0x3e5, 0x1a4, 0xce, 0x3a, 0x2b1, 0x3fe, 0xec, 0x2c9, 0x2b4, 0xe0, 0x2e8, 0x20b, 0x157, 0x2a9, 0x371, 0x47, 0x1ca, 0x3d1, 0x27e, 0x18a, 0x31, 0x303, 0x2b0, 0x1fe, 0x2e7, 0xcc, 0x6b, 0x78, 0x294, 0x30, 0x108, 0x3e7, 0x357, 0x196, 0x8b, 0x1a1, 0x3a9, 0xea, 0x1ba, 0x139, 0xe4, 0x1e7, 0x68, 0x26c, 0x16d, 0x3c2, 0x92, 0x32e, 0x109, 0x1ec, 0x200, 0x33f, 0x3fa, 0x1e6, 0x263, 0x33b, 0x3c4, 0xb3, 0xd5, 0x2e4, 0x2d8, 0x392, 0x38a, 0x30e, 0xf9, 0x356, 0x39d, 0x1dc, 0x308, 0xd8, 0xad, 0x70, 0x2e8, 0x29a, 0x6d, 0x59, 0x16f, 0x3dd, 0x23c, 0x275, 0x3e2, 0x162, 0x194, 0x94, 0x30f, 0x2f2, 0x201, 0x134, 0x2ad, 0x34f, 0x112, 0x37c, 0x20e, 0x362, 0x2ab, 0x36e, 0x2e9, 0x91, 0x13a, 0x2f0, 0x21e, 0x39a, 0x3f6, 0x1a4, 0x19c, 0xe8, 0x1a5, 0x397, 0x1bf, 0x30c, 0xe6, 0x1f8, 0x2c6, 0x337, 0x386, 0x34c, 0x306, 0x85, 0x1fc, 0x2f8, 0x262, 0x130, 0x293, 0x21a, 0x3a4, 0x1f, 0x155, 0x165, 0x375, 0xf2, 0x27c, 0x32a, 0x26e, 0x2e4, 0x1b9, 0x253, 0x6f, 0x8c, 0x31f, 0x1d, 0x16b, 0x3cf, 0x1bf, 0x211, 0x398, 0x3db, 0x33, 0x231, 0x78, 0x121, 0xc0, 0x52, 0x207, 0x22a, 0x151, 0x119, 0x228, 0x16f, 0x3b3, 0xe2, 0x38c, 0x257, 0x13, 0x1d1, 0x282, 0x1d2, 0x2a3, 0x22d, 0x10c, 0x3bb, 0x1a, 0x136, 0x16d, 0x38d, 0x248, 0x146, 0xb4, 0x1f7, 0x120, 0xdf, 0x107, 0x362, 0x15f, 0x1a3, 0x365, 0x102, 0x301, 0x157, 0x15b, 0x1df, 0x238, 0x9f, 0x2ce, 0x29f, 0xb9, 0x16c, 0x392, 0x31d, 0x23, 0x3c1, 0x105, 0x35c, 0x3f5, 0x369, 0x186, 0xe6, 0x3f0, 0x30a, 0x18e, 0x1e, 0x14a, 0x30, 0x210, 0x387, 0x28e, 0x156, 0x144, 0x8a, 0x35d, 0x3ea, 0x23c, 0xe3, 0x393, 0x302, 0x176, 0x2a4, 0x270, 0x3ae, 0x189, 0x43, 0x3e8, 0x202, 0x249, 0x159, 0x1e1, 0x92, 0x255, 0x2d, 0x37b, 0x3e, 0x15d, 0x33a, 0x335, 0x27f, 0x21f, 0x24d, 0x24a, 0x2f0, 0x6a, 0x1de, 0x47, 0x321, 0x167, 0x29f, 0x172, 0x1b9, 0xaf, 0x1bc, 0x69, 0x19c, 0x3a0, 0x266, 0x31, 0x17, 0x35a, 0x367, 0x278, 0x2a5, 0xd7, 0x3fe, 0x369, 0x30c, 0x398, 0x3bf, 0xcc, 0x1ac, 0x389, 0x61, 0x6c, 0x15a, 0x380, 0x1af, 0x3cb, 0x386, 0x12b, 0xc, 0x108, 0x387, 0x115, 0x151, 0x232, 0xb2, 0x36a, 0x34e, 0x7f, 0x2f8, 0x19a, 0x324, 0x1a1, 0x2bf, 0x2bb, 0x243, 0x33e, 0x3cd, 0x302, 0x2ec, 0x282, 0x3a4, 0x29e, 0x14c, 0xe4, 0x395, 0x289, 0x216, 0x383, 0x1ed, 0x2c, 0x2c1, 0x7d, 0x284, 0x320, 0x159, 0x3c2, 0x248, 0x28c, 0x2d0, 0x3a3, 0x224, 0x3d6, 0x150, 0x20c, 0x1ef, 0x50, 0x7b, 0x200, 0xe7, 0x3d7, 0x16e, 0x351, 0x2d5, 0x365, 0x204, 0x1f, 0x2aa, 0x19d, 0x39e, 0x33b, 0x30b, 0x322, 0x125, 0x178, 0x35, 0xef, 0x7c, 0x17d, 0x1e6, 0x33c, 0x36b, 0x2e9, 0x81, 0x20b, 0x2aa, 0x33a, 0x263, 0x1ee, 0xdc, 0x91, 0x1c2, 0x157, 0x165, 0x1cf, 0x33b, 0x21f, 0x93, 0x13a, 0x3ad, 0x2a9, 0x3be, 0x1e4, 0x3c4, 0x191, 0x125, 0x2f0, 0xd4, 0x371, 0x238, 0x27c, 0xb3, 0x2a1, 0x5e, 0x21e, 0xef, 0x47, 0x24b, 0x195, 0xd5, 0x30d, 0x345, 0x39a, 0x38f, 0x1ca, 0x2b7, 0x29f, 0x2e4, 0x2ed, 0x171, 0x3f6, 0x13b, 0x3d1, 0x3d4, 0x258, 0x2d8, 0xaf, 0x378, 0x1a4, 0xfb, 0x27e, 0x4b, 0x5b, 0x392, 0x6f, 0x230, 0x19c, 0x349, 0x18a, 0x188, 0x170, 0x38a, 0x46, 0x237, 0xe8, 0x133, 0x31, 0x2e, 0x173, 0x30e, 0x3c1, 0x1d, 0x1a5, 0x87, 0x303, 0x1ad, 0x367, 0xf9, 0x286, 0x2b1, 0x397, 0x1e3, 0x2b0, 0x3eb, 0x9e, 0x356, 0xd7, 0x3f5, 0x1bf, 0x56, 0x1fe, 0x315, 0x36c, 0x39d, 0x2fb, 0x3b0, 0x30c, 0x339, 0x2e7, 0x269, 0x2f6, 0xf8, 0x1fd, 0x32b, 0x3ac, 0x1a3, 0x31e, 0x10, 0x39b, 0x3ef, 0x2dc, 0x2be, 0x206, 0x18c, 0x100, 0x1ce, 0x287, 0x193, 0x3ba, 0x28, 0xf6, 0x24, 0xdf, 0x2a, 0x106, 0x3de, 0x280, 0x37b, 0x240, 0x1eb, 0x2a0, 0x44, 0x197, 0x5a, 0x3d5, 0x41, 0x28f, 0x25a, 0x49, 0x146, 0x1a9, 0x127, 0x19, 0xaa, 0x1e1, 0x99, 0x4d, 0x2a6, 0x254, 0x190, 0x2b2, 0x22f, 0x182, 0xd9, 0x23a, 0x101, 0x136, 0x37a, 0x2b8, 0x16, 0x18b, 0x3e8, 0x34, 0x344, 0x3c5, 0x3da, 0x160, 0x86, 0x2f7, 0x340, 0x25, 0x27, 0x1d7, 0x22d, 0x72, 0x323, 0x65, 0x250, 0x270, 0x14f, 0x298, 0x329, 0x25c, 0x259, 0x141, 0x341, 0xdd, 0x1da, 0x2fc, 0x181, 0x1d1, 0x3d, 0x75, 0x1cb, 0x19f, 0x393, 0x26, 0x12f, 0x3d0, 0x359, 0x8f, 0x1c6, 0x14e, 0x260, 0x2d4, 0x177, 0x1f5, 0xe2, 0x5f, 0xcd, 0x241, 0x113, 0x35d, 0x36f, 0x23b, 0x1f0, 0x3fd, 0x16e, 0x2be, 0x5, 0x239, 0x12, 0xdf, 0x54, 0x11, 0x2cf, 0x5a, 0x3a3, 0x104, 0x55, 0x1e1, 0x132, 0x134, 0x11d, 0x101, 0x26c, 0x1f3, 0x1ed, 0x160, 0x10c, 0x3ce, 0x236, 0x250, 0xe9, 0x135, 0xed, 0x2fc, 0x302, 0x34d, 0x1e8, 0x359, 0x11e, 0x311, 0x262, 0x241, 0x226, 0x16f, 0x34e, 0x3f8, 0x357, 0x2ac, 0xda, 0x26d, 0x3, 0x210, 0xe, 0x3b2, 0x3cb, 0xf, 0x242, 0x36, 0x161, 0xfc, 0x33, 0x358, 0xee, 0xec, 0x30c, 0xff, 0x223, 0x356, 0x35c, 0x327, 0x303, 0x2bd, 0x215, 0x237, 0x3a0, 0x314, 0x5b, 0x253, 0x2f9, 0x13b, 0x35f, 0x137, 0x30d, 0x10f, 0x1de, 0x238, 0x1e2, 0x322, 0x13a, 0x2af, 0x2ca, 0x263, 0x3b1, 0x1db, 0x1, 0x1f0, 0x3fd, 0x16e, 0x2be, 0x5, 0x239, 0x12, 0xdf, 0x54, 0x11, 0x2cf, 0x5a, 0x3a3, 0x104, 0x55, 0x1e1, 0x132, 0x134, 0x11d, 0x101, 0x26c, 0x3e0, 0x3ef, 0x362, 0x3ba, 0xa0, 0x37b, 0x112, 0x28f, 0x17a, 0x99, 0x134, 0x23a, 0xd, 0x344, 0x30f, 0x1d7, 0xa6, 0x329, 0x162, 0x1d1, 0xf4, 0x359, 0x23c, 0x5f, 0x334, 0x51, 0x59, 0x366, 0x21, 0x307, 0x2e8, 0x3e1, 0xf, 0x8d, 0xd8, 0x31a, 0x3db, 0x269, 0x39d, 0x3f5, 0x1e3, 0x1ad, 0x30e, 0x237, 0x349, 0x4b, 0x2d8, 0x171, 0x38f, 0x24b, 0xb3, 0x125, 0x3ad, 0x165, 0x263, 0x36b, 0x365, 0x8, 0x33f, 0x347, 0x326, 0x1ef, 0x109, 0x3ee, 0x82, 0x55, 0x3c2, 0xc1, 0x1b2, 0x1f4, 0x68, 0x216, 0x4e, 0x2a3, 0x139, 0x17e, 0x302, 0x293, 0x3a9, 0x2fe, 0x1c4, 0x2f8, 0x196, 0x288, 0x2c8, 0x306, 0x108, 0xe, 0x36d, 0x337, 0x78, 0x61, 0x2c9, 0xe6, 0x2e7, 0x36c, 0xd7, 0x397, 0x303, 0x173, 0x46, 0x19c, 0x27e, 0x258, 0x2ed, 0x39a, 0x47, 0x27c, 0x191, 0x13a, 0x157, 0x33a, 0x33c, 0x36e, 0x3c9, 0x3a7, 0x326, 0x3de, 0x2d, 0x34f, 0x32, 0x2b2, 0x15c, 0x58, 0x10c, 0x323, 0x328, 0x10d, 0xea, 0x8f, 0x22b, 0x334, 0xa2, 0x164, 0x306, 0x210, 0x38, 0x35e, 0x31c, 0x31b, 0x76, 0x211, 0x3f1, 0xf9, 0x3a, 0xc5, 0x5b, 0x15e, 0x3c3, 0x24b, 0x166, 0x9d, 0x157, 0x27d, 0xeb, 0x346, 0x18c, 0x12, 0x37c, 0x149, 0x49, 0x222, 0x28a, 0x202, 0x344, 0x217, 0x355, 0x139, 0x2fc, 0x13, 0xb5, 0x2ee, 0x36f, 0x1fc, 0x2a7, 0x14d, 0x376, 0xa5, 0x209, 0x161, 0x3f0, 0x330, 0x39d, 0x3e3, 0x385, 0x173, 0x8c, 0x279, 0x3d4, 0x1c1, 0x10f, 0x371, 0x3c8, 0x6e, 0x81, 0xf8, 0x3f3, 0x362, 0x37d, 0x280, 0x3ee, 0x104, 0x154, 0x22f, 0xb, 0x225, 0x1e7, 0x65, 0x2a4, 0x11f, 0x396, 0x1c6, 0x262, 0x116, 0x228, 0x366, 0x42, 0x7, 0x36d, 0x267, 0x1e0, 0x308, 0xc3, 0xff, 0x9e, 0x105, 0x29d, 0x188, 0x39b, 0x287, 0x106, 0x197, 0x1a9, 0x254, 0x136, 0x3c5, 0x1d7, 0x298, 0x2fc, 0x26, 0x2d4, 0x35d, 0x295, 0x3f7, 0xba, 0x3e1, 0x3c, 0xc2, 0x265, 0xff, 0x13c, 0x1d, 0xc5, 0xb6, 0x171, 0x227, 0xf1, 0x93, 0x301, 0x2fa, 0x16e, 0x1dd, 0x140, 0x3ee, 0x208, 0x159, 0x15c, 0xb0, 0x39, 0x12e, 0x2ec, 0x1e8, 0x2fe, 0x319, 0x3d3, 0x151, 0x1bb, 0xa5, 0x1b, 0x18d, 0x3bf, 0x36c, 0x35c, 0x10e, 0x170, 0x1bc, 0x276, 0x195, 0x296, 0x353, 0x33a, 0xeb, 0x285, 0x239, 0x90, 0x3a5, 0x17a, 0x264, 0x364, 0x3bb, 0x11b, 0x152, 0x11f, 0x325, 0x311, 0x334, 0x144, 0x199, 0x6, 0x148, 0x309, 0x21d, 0x17b, 0x1ff, 0x1e3, 0x2bd, 0x8c, 0xfb, 0x34b, 0x213, 0xd4, 0x2e3, 0x3dc, 0x365, 0x20, 0x39c, 0x54, 0x88, 0x28c, 0x145, 0x202, 0x281, 0x4e, 0x29e, 0x3b4, 0x32f, 0xc9, 0x226, 0x36a, 0x214, 0x207, 0x36d, 0x33f, 0x20e, 0x22, 0x146, 0x145, 0xd, 0x216, 0x270, 0x1ba, 0x275, 0x262, 0x51, 0x2c8, 0x6, 0x290, 0x3f, 0xcc, 0x39d, 0x397, 0x2e, 0x6f, 0x13b, 0x195, 0x125, 0x157, 0x1e6, 0x2ab, 0x14, 0x37b, 0x82, 0x2a8, 0x15c, 0x160, 0xe4, 0x162, 0x293, 0x177, 0x2d7, 0x3fb, 0x5d, 0x3e1, 0x78, 0x308, 0x30c, 0x3eb, 0x3c1, 0x349, 0x258, 0x345, 0x371, 0x33b, 0x2e9, 0x8, 0x1ce, 0x54, 0x110, 0x222, 0x23a, 0x68, 0x94, 0x3a4, 0x1cb, 0x38c, 0x334, 0x288, 0x26d, 0x30, 0xad, 0x1f8, 0x269, 0xd7, 0x87, 0x170, 0x378, 0x1ca, 0xb3, 0x13a, 0x2aa, 0x32b, 0x175, 0xa0, 0x3ee, 0x19, 0x16d, 0x2f2, 0x312, 0x329, 0x302, 0xb5, 0x3aa, 0x295, 0x3e7, 0x2e8, 0x337, 0x3c0, 0x76, 0x56, 0x367, 0x237, 0x27e, 0x2e4, 0x21e, 0x3be, 0x1ee, 0x365, 0x40, 0x26b, 0x2a0, 0x92, 0x134, 0x1f4, 0x340, 0xa9, 0x11f, 0x277, 0x2a, 0x110, 0x4d, 0xfa, 0x340, 0x152, 0x75, 0x23c, 0x1f9, 0x2ac, 0x376, 0x121, 0x360, 0x339, 0x13c, 0x74, 0x4b, 0x1d3, 0x3bc, 0x33b, 0x1db, 0x20, 0x26b, 0x149, 0x248, 0x1b2, 0x37f, 0xca, 0x21a, 0x2bb, 0x319, 0x357, 0x13d, 0x203, 0x61, 0xc3, 0x3f1, 0x3c1, 0x29b, 0x172, 0x21e, 0x375, 0x3b1, 0x31e, 0x9, 0x1eb, 0x17a, 0x182, 0x225, 0x323, 0x176, 0x3d0, 0x3dd, 0x3f8, 0x22a, 0x3e1, 0xf0, 0x3b, 0x56, 0x2c7, 0xce, 0x3d4, 0x213, 0x350, 0x263, 0x2d5, 0x318, 0x120, 0x117, 0x313, 0x2c, 0x39, 0xb1, 0x293, 0x2ee, 0x34e, 0x3e7, 0x1d9, 0xc7, 0x23f, 0x369, 0x2d2, 0x46, 0x1f6, 0x26e, 0x2f0, 0x2ca, 0xeb, 0x206, 0x3d8, 0x41, 0x2a8, 0x2b8, 0x189, 0x329, 0x20d, 0x2d4, 0x16f, 0x10a, 0x7, 0x35e, 0xd6, 0x379, 0x1e3, 0x2e6, 0xd2, 0x2b7, 0x14b, 0x2af, 0x1e6, 0x15f, 0x50, 0x3ee, 0xe7, 0xa8, 0x92, 0xd9, 0x37f, 0x194, 0x7a, 0x1f5, 0x1fc, 0x22a, 0x3cb, 0x3c0, 0x1d8, 0x169, 0x46, 0x3ec, 0x1aa, 0x3ad, 0xf3, 0x15f, 0xa0, 0x3a3, 0x190, 0x3e6, 0x355, 0x3b4, 0x14e, 0x22c, 0x199, 0x30, 0x2b4, 0x3bf, 0x356, 0x29d, 0xb6, 0x39a, 0xf2, 0x1b8, 0x8, 0x331, 0x149, 0x99, 0x2c1, 0x3ce, 0xbb, 0x3d0, 0x3b3, 0x3fb, 0x174, 0x267, 0x23f, 0x2db, 0x35a, 0x230, 0x35f, 0x14b, 0x157, 0x391, 0x2ea, 0x109, 0x127, 0x9b, 0x30f, 0x29e, 0x19f, 0x262, 0x144, 0xd3, 0x180, 0x18d, 0x1c7, 0x286, 0xc5, 0x1b9, 0xef, 0x399, 0x1db, 0x40, 0x1be, 0x25a, 0xc1, 0x225, 0x24f, 0x1d1, 0x2bf, 0x1a7, 0x3e7, 0x3b2, 0x31c, 0x1dc, 0x2f5, 0x2e6, 0x1a4, 0x2ce, 0x24a, 0x2aa, 0xb7, 0x37d, 0x5a, 0x12a, 0xd1, 0x4e, 0xdd, 0xe3, 0x334, 0x232, 0x291, 0x1b, 0x73, 0x223, 0x1d, 0x221, 0x1d3, 0x371, 0x1ce, 0x2a0, 0x99, 0x18b, 0x323, 0x1d1, 0x177, 0x295, 0x307, 0x35e, 0x358, 0x3f5, 0x2e, 0x378, 0x24b, 0x93, 0x7c, 0x347, 0x22, 0x222, 0x1f4, 0x236, 0x21a, 0x2fe, 0x1fc, 0x5d, 0x337, 0x23f, 0x1bf, 0x173, 0x1a4, 0x195, 0x13a, 0x17d, 0x362, 0x363, 0x2ad, 0xd, 0x94, 0x11f, 0x23c, 0x3ed, 0x29a, 0xf, 0x308, 0x56, 0x30e, 0xfb, 0xd5, 0x3ad, 0x1e6, 0x175, 0x109, 0x24e, 0x26c, 0x4e, 0x1ba, 0x38c, 0x196, 0x368, 0x294, 0x2c9, 0x1fe, 0x3c1, 0x27e, 0x30d, 0x2a9, 0x33c, 0x206, 0x37b, 0x19, 0x37a, 0x1d7, 0x1da, 0x14e, 0x51, 0x26d, 0x180, 0x31a, 0x315, 0x1d, 0x4b, 0x345, 0x3be, 0x36b, 0xc6, 0x120, 0x55, 0x15c, 0x312, 0x17e, 0x130, 0x8a, 0x306, 0x290, 0x1f8, 0x36c, 0x1a5, 0x5b, 0x39a, 0x1e4, 0x2e9, 0x40, 0x37c, 0x17a, 0x201, 0x218, 0x162, 0xb5, 0x16f, 0x21, 0x70, 0x21d, 0x39d, 0x39c, 0x292, 0xc1, 0x86, 0xb1, 0xb5, 0x2de, 0x84, 0x380, 0x198, 0x35c, 0x188, 0x2e2, 0xf2, 0x2e9, 0x80, 0x1eb, 0x3c2, 0x58, 0x390, 0x26, 0x226, 0x183, 0x290, 0x3f0, 0x1ab, 0x133, 0x1b9, 0x3bc, 0x1ee, 0x235, 0x90, 0x55, 0x2b8, 0x53, 0x3e2, 0x324, 0x164, 0x30, 0x2c2, 0x38e, 0x1d, 0x96, 0x10f, 0x1cf, 0x2d5, 0xf6, 0x82, 0x2da, 0x2ef, 0x1da, 0x29c, 0x144, 0x34c, 0x36, 0x398, 0xf9, 0x29b, 0x382, 0x2a9, 0x271, 0xa, 0x3ee, 0x190, 0x383, 0x135, 0xe3, 0xcb, 0x368, 0x121, 0x336, 0x3eb, 0x67, 0x34b, 0x2f0, 0x27d, 0x2be, 0x109, 0x95, 0x1a2, 0x270, 0x396, 0x17c, 0x151, 0x305, 0x184, 0x56, 0x215, 0x3ec, 0x2a1, 0x2ae, 0xb7, 0x1ef, 0x1a9, 0x202, 0x94, 0x23e, 0xe2, 0x357, 0x1fa, 0x1e0, 0x3b0, 0x35a, 0xd2, 0x195, 0x274, 0x1fd, 0x326, 0x255, 0x11d, 0x340, 0x282, 0x17f, 0x1fc, 0x331, 0x25a, 0x201, 0x72, 0x20d, 0x113, 0x183, 0x129, 0x3db, 0x143, 0x314, 0x345, 0x2e3, 0x2d5, 0x1ec, 0x208, 0x2fd, 0x2a3, 0x33e, 0x261, 0x368, 0x242, 0xc3, 0x367, 0x279, 0x1aa, 0x157, 0xb7, 0x3de, 0x2ad, 0x34, 0x152, 0x359, 0xfe, 0xba, 0x18e, 0x379, 0x20f, 0x378, 0x13e, 0x122, 0x33f, 0x150, 0x132, 0x43, 0xb1, 0x16a, 0x36a, 0x29, 0x7e, 0x36c, 0x29d, 0x1b9, 0x371, 0x3b1, 0x18c, 0x112, 0x2b2, 0x373, 0x1da, 0x131, 0x119, 0x256, 0x360, 0x3fc, 0x237, 0x34b, 0x1e9, 0x1e6, 0x1dd, 0xb4, 0x284, 0x4a, 0x23e, 0x1c4, 0x147, 0x3cb, 0x23f, 0x2f5, 0x31d, 0x1ca, 0x24d, 0xf8, 0x20e, 0x49, 0x364, 0x323, 0x34d, 0x35d, 0x21, 0x1c0, 0x198, 0x2b1, 0x229, 0x33d, 0x33b, 0x18f, 0x48, 0x55, 0x179, 0x14c, 0x32f, 0x22c, 0xd3, 0x1b, 0x398, 0x1f2, 0x27e, 0x2f, 0x2ca, 0x2ab, 0x280, 0x95, 0x344, 0x26b, 0x17a, 0x2c, 0x329, 0x130, 0x59, 0x30, 0x31a, 0x9e, 0x349, 0x30d, 0x165, 0x2ab, 0x109, 0x254, 0x216, 0x11f, 0x1c4, 0x28e, 0x337, 0x1dc, 0x303, 0x378, 0x27c, 0x81, 0x1ce, 0x12d, 0x201, 0xe4, 0x26, 0x8a, 0x6, 0x161, 0x315, 0xe8, 0x2e4, 0x2a9, 0x1d6, 0xa0, 0x24e, 0x344, 0x3a4, 0x23c, 0x357, 0x3e1, 0x23f, 0x1e3, 0x6f, 0x24b, 0x91, 0x33f, 0x2a0, 0xc1, 0x218, 0x302, 0x113, 0x306, 0xad, 0x2e7, 0x1d, 0x258, 0xd4, 0x33c, 0x14, 0x34f, 0x26c, 0x270, 0x243, 0x3ed, 0xfd, 0x3c0, 0x1bf, 0x38a, 0x1ca, 0x93, 0x3e0, 0x54, 0x99, 0x43, 0x162, 0x1a1, 0x366, 0x290, 0x3db, 0x286, 0x4b, 0x21e, 0x263, 0x206, 0x3ee, 0x249, 0x4e, 0x1cb, 0x2f8, 0x29a, 0x78, 0x3b0, 0x173, 0x13b, 0x191, 0x7c, 0x20e, 0x92, 0x18b, 0x12e, 0xb5, 0x36a, 0x52, 0x1f8, 0x356, 0x18a, 0x345, 0x1cf, 0x346, 0xdf, 0x1e1, 0x160, 0x2fc, 0x241, 0x26d, 0x36, 0xff, 0x237, 0x137, 0x2af, 0x16e, 0x2cf, 0x11d, 0x236, 0x1e8, 0x34e, 0xe, 0x33, 0x35c, 0x5b, 0x1de, 0x3b1, 0x239, 0x104, 0x1f3, 0x135, 0x311, 0x2ac, 0xf, 0xec, 0x2bd, 0x13b, 0x322, 0x1f0, 0x54, 0x132, 0x10c, 0x302, 0x226, 0x3, 0x161, 0x223, 0x3a0, 0x30d, 0x2ca, 0x2be, 0x5a, 0x101, 0x250, 0x359, 0x3f8, 0x3b2, 0x358, 0x327, 0x253, 0x238, 0x1db, 0x12, 0x55, 0x1ed, 0xed, 0x262, 0xda, 0x242, 0x30c, 0x215, 0x35f, 0x13a, 0x3fd, 0x11, 0x134, 0x3ce, 0x34d, 0x16f, 0x210, 0xfc, 0x356, 0x314, 0x10f, 0x263, 0x5, 0x3a3, 0x26c, 0xe9, 0x11e, 0x357, 0x3cb, 0xee, 0x303, 0x2f9, 0x1e2, 0x1, 0xdf, 0x1e1, 0x160, 0x2fc, 0x241, 0x26d, 0x36, 0xff, 0x237, 0x137, 0x2af, 0x16e, 0x2cf, 0x11d, 0x236, 0x1e8, 0x34e, 0xe, 0x33, 0x35c, 0x5b, 0x1be, 0x38d, 0x312, 0x393, 0xa2, 0x256, 0x336, 0x2c7, 0x3d1, 0x9d, 0x3fd, 0x22, 0xd9, 0x24f, 0xb5, 0x1b3, 0x129, 0x2e7, 0x74, 0x1c1, 0x165, 0x2be, 0xb4, 0xd, 0x2a4, 0x1f5, 0x3e7, 0x163, 0x333, 0x188, 0x273, 0x3dc, 0x239, 0x208, 0x3c5, 0x1ba, 0x17c, 0x13d, 0x3c0, 0x2f5, 0xde, 0x27c, 0x204, 0xdf, 0x3c2, 0x189, 0x3cd, 0x51, 0x12b, 0x19b, 0x367, 0x3ec, 0x24a, 0x3fa, 0x11, 0x268, 0x323, 0x25e, 0x2dd, 0x290, 0x377, 0x3a, 0x2e4, 0x2b6, 0x15f, 0x5a, 0x202, 0x152, 0x2fe, 0x3f7, 0x2b5, 0x39d, 0xc4, 0x33d, 0x1ee, 0x318, 0x104, 0x3e6, 0xdd, 0xbe, 0x29a, 0x1e0, 0x37e, 0x6f, 0x13e, 0x102, 0x26b, 0x1e1, 0x2c0, 0x3e2, 0x22c, 0x291, 0x2c9, 0x3b7, 0x1f6, 0x125, 0x1fd, 0x20c, 0x134, 0x395, 0x12f, 0x36a, 0x148, 0x3bf, 0x1d, 0x172, 0x15b, 0x2ab, 0x2d, 0x101, 0xa9, 0x17f, 0x3ff, 0x35e, 0x37c, 0x22f, 0xa6, 0x14e, 0x6d, 0x8d, 0x56, 0x230, 0xb3, 0x7c, 0x54, 0xc1, 0xe4, 0x130, 0x2c8, 0x1b, 0x1fe, 0x19c, 0x2a1, 0x17d, 0x106, 0x134, 0x323, 0xb5, 0x366, 0xad, 0x315, 0x349, 0x5e, 0x1e6, 0x1ef, 0x145, 0x236, 0x3a9, 0x85, 0x380, 0x36c, 0x18a, 0x21e, 0x33c, 0xa0, 0x254, 0x94, 0x359, 0x3fb, 0x35e, 0x39d, 0x188, 0xef, 0x36b, 0x1ec, 0xc8, 0x4e, 0x243, 0x357, 0x337, 0x2fb, 0x170, 0x47, 0x2e9, 0x24, 0x2a8, 0x1d7, 0x275, 0xab, 0xf, 0x3b0, 0x38a, 0x24b, 0x81, 0x26b, 0x3c2, 0x312, 0x32f, 0x288, 0x294, 0x30c, 0x46, 0x195, 0x20b, 0x20e, 0x99, 0x218, 0x26, 0x59, 0x180, 0x339, 0x237, 0xd5, 0x2aa, 0x326, 0x222, 0x1e7, 0x293, 0x36a, 0x290, 0x2e7, 0xe8, 0x30d, 0x33a, 0x3ba, 0x2ad, 0x340, 0xf4, 0x295, 0x70, 0x269, 0x133, 0x345, 0x263, 0x14, 0x24e, 0x216, 0xea, 0x2f1, 0xae, 0x139, 0xcd, 0x1bb, 0x308, 0x35a, 0xe5, 0x91, 0x39c, 0x1e1, 0x312, 0x257, 0x232, 0x8d, 0xac, 0xd2, 0x191, 0x3c9, 0x292, 0x2c, 0x2fc, 0x22c, 0x256, 0xc3, 0x23, 0x195, 0x1f, 0x2a, 0xc1, 0x1c8, 0xc9, 0x26d, 0x1b0, 0x3b7, 0x3d1, 0x274, 0x3a7, 0x92, 0x86, 0x13, 0x59, 0x300, 0xff, 0x19c, 0x14b, 0x1fd, 0x22, 0x364, 0xb1, 0x113, 0xc, 0x73, 0x3c1, 0x137, 0x155, 0x326, 0x4d, 0x395, 0xb5, 0x2c5, 0x2b4, 0x9e, 0xf5, 0x3d2, 0x16e, 0x255, 0x3d9, 0x1d1, 0x2de, 0x148, 0x2e7, 0x1d0, 0x2f, 0x1e6, 0x3de, 0x11d, 0x194, 0x2ee, 0x84, 0x1f8, 0x105, 0x172, 0x165, 0x2ea, 0x352, 0x340, 0x1e8, 0x246, 0x380, 0x2d1, 0x221, 0xd4, 0x3ac, 0x2d, 0xd, 0x282, 0x36f, 0xe, 0x198, 0x29d, 0x345, 0xcf, 0x50, 0x254, 0x128, 0x17f, 0x3e7, 0x185, 0x35c, 0x2d8, 0x375, 0x103, 0x34f, 0x1eb, 0x2b8, 0x1da, 0xcb, 0x305, 0x3b0, 0x233, 0xf1, 0x8, 0x343, 0x1ed, 0x2cb, 0x251, 0x1e, 0x1bf, 0x1bc, 0x381, 0x40, 0x22e, 0x373, 0x275, 0x2ac, 0xf0, 0x1e3, 0x1fb, 0x37, 0x200, 0x154, 0x3ae, 0x38c, 0x14d, 0x389, 0x303, 0x3c3, 0x1b8, 0x24, 0x2b2, 0x14f, 0x5f, 0x27a, 0x77, 0x2e, 0x227, 0x1db, 0x120, 0x1bd, 0x26a, 0x2f8, 0x3f4, 0x3b8, 0x170, 0x11c, 0x2c3, 0x112, 0x1f3, 0x374, 0x3ed, 0x39f, 0x1ff, 0x392, 0xf2, 0x235, 0x82, 0x383, 0x396, 0x357, 0xc7, 0x3e3, 0xaf, 0x399, 0x18c, 0x19, 0x27, 0x8f, 0x28e, 0x231, 0x327, 0x171, 0xf7, 0x7b, 0xc8, 0x138, 0x71, 0x5d, 0x1ac, 0x10e, 0x39a, 0x3b1, 0x3d8, 0x249, 0x1d2, 0x388, 0x2e8, 0x17b, 0x62, 0xef, 0x1b7, 0x2ff, 0x26c, 0x28b, 0x7f, 0x36d, 0x3ca, 0x310, 0x371, 0x1a3, 0x3d5, 0x344, 0x75, 0x3f8, 0x35e, 0x26f, 0xb6, 0x3be, 0x3d6, 0x2f2, 0x2cb, 0xab, 0x78, 0x1e3, 0x3f6, 0xdc, 0x24, 0x16d, 0x135, 0x2f8, 0x3e1, 0x2fb, 0x392, 0x1e4, 0xc6, 0x19, 0x4e, 0x23c, 0x5d, 0x358, 0x31, 0xef, 0x36e, 0x3ee, 0x344, 0xea, 0x3fb, 0x2c6, 0x2b1, 0x2ed, 0x263, 0xa0, 0x284, 0x141, 0x2d7, 0x70, 0x36c, 0x4b, 0x2a9, 0x175, 0x2ad, 0x236, 0x177, 0x108, 0x3db, 0xe8, 0x5e, 0x32b, 0x32e, 0x3bb, 0x293, 0x366, 0x161, 0xf9, 0x29f, 0x2aa, 0x106, 0x1b2, 0x162, 0x8a, 0x180, 0x1fe, 0xfb, 0x13a, 0x347, 0x99, 0xe4, 0x192, 0x34c, 0x265, 0x46, 0xb3, 0x3e0, 0x12d, 0x160, 0x32f, 0x6d, 0x61, 0x1ad, 0x1ca, 0x81, 0x37c, 0x15c, 0x1da, 0x196, 0xf, 0x1bf, 0x378, 0x21f, 0x200, 0x2a8, 0x2a3, 0x5f, 0xfd, 0x1dc, 0x170, 0x238, 0x31e, 0x82, 0x30f, 0x243, 0x28e, 0x6b, 0x87, 0x39a, 0x36b, 0x37b, 0x26c, 0x11f, 0x1fc, 0x35e, 0xd7, 0x3a5, 0x3da, 0x275, 0x2a2, 0x31b, 0x2e, 0x8e, 0x18f, 0x82, 0x217, 0x11e, 0x5d, 0x2b9, 0xc4, 0x371, 0x285, 0x127, 0x94, 0x1f5, 0x7, 0x269, 0x314, 0x350, 0x175, 0x153, 0xca, 0x3aa, 0xa4, 0x38e, 0x27e, 0x353, 0x193, 0x134, 0x25c, 0x45, 0x180, 0x3fc, 0x3ec, 0x1c2, 0x15, 0x304, 0x17e, 0xa2, 0x242, 0x2b0, 0x276, 0x244, 0x37c, 0x2b8, 0x361, 0xab, 0xf0, 0x385, 0x38f, 0x1db, 0x89, 0x3e6, 0x396, 0x147, 0x6b, 0x10e, 0x273, 0x36e, 0x3d5, 0x10b, 0x359, 0x3c7, 0x66, 0x133, 0x35, 0x351, 0x2d0, 0x289, 0x2bf, 0x108, 0x3bf, 0x3a0, 0x2f0, 0x2dc, 0x111, 0x323, 0x342, 0x18, 0x339, 0x338, 0x9d, 0x347, 0x132, 0x390, 0x8b, 0xa5, 0x2b, 0x1a4, 0x126, 0x331, 0x22f, 0x272, 0xcb, 0xf, 0x37e, 0x1fb, 0xdc, 0x48, 0x1bd, 0x1ba, 0x3d3, 0xc7, 0x397, 0x2e2, 0x3b1, 0x37b, 0xd1, 0x75, 0x3fb, 0x343, 0x373, 0x38c, 0x27a, 0x3b8, 0x392, 0x399, 0x7b, 0x249, 0x28b, 0x3f8, 0x2c6, 0x2d6, 0x283, 0x1d6, 0x168, 0x289, 0x177, 0x29, 0x1c7, 0x27e, 0x2af, 0x245, 0x1b2, 0x181, 0xb2, 0xd8, 0x187, 0x32a, 0x3e0, 0xbd, 0x22d, 0x262, 0x1c3, 0x369, 0x378, 0x6e, 0x48, 0x37a, 0x2e1, 0x2a7, 0x6b, 0x21c, 0x1de, 0x346, 0x127, 0x128, 0x3dd, 0x38, 0x2d1, 0x258, 0x19d, 0x3de, 0x1f4, 0x34d, 0x2c5, 0x31a, 0x31f, 0x14b, 0x3ef, 0x248, 0x1c8, 0x8b, 0x14a, 0xac, 0x13b, 0x244, 0x2f1, 0x2f2, 0x33e, 0x2a2, 0x23f, 0xb8, 0x79, 0xc6, 0x64, 0xe9, 0x23b, 0x1af, 0x1ae, 0x2ed, 0x19e, 0x212, 0x68, 0x3d0, 0x42, 0x3db, 0x3a0, 0x1e9, 0x362, 0x9a, 0x25c, 0x8a, 0x209, 0x3df, 0x2b7, 0x3e, 0x149, 0x160, 0xa7, 0x2d9, 0x76, 0x233, 0x381, 0x200, 0x2b2, 0x26a, 0x3ed, 0xc7, 0x327, 0x39a, 0x1b7, 0x3d5, 0x216, 0x28f, 0x1d7, 0x5f, 0x3e1, 0x3f5, 0x171, 0x36b, 0x3ee, 0x216, 0x2fe, 0xe, 0x36c, 0x258, 0x33a, 0x363, 0x3bb, 0xb5, 0x6, 0x339, 0xfb, 0x1c2, 0x54, 0x2c, 0x32f, 0x368, 0x76, 0x6f, 0x21f, 0x24, 0x37a, 0x1cb, 0x28e, 0x358, 0x188, 0x3be, 0x14, 0x284, 0x21a, 0x85, 0x1f8, 0xe8, 0x2f0, 0x362, 0x134, 0x162, 0x59, 0xd8, 0x30e, 0xb3, 0x33f, 0x3c2, 0x139, 0x196, 0x78, 0x303, 0x47, 0x31e, 0x19, 0x270, 0x23b, 0x35e, 0x2b1, 0x345, 0x1d6, 0x2d0, 0x236, 0x3aa, 0x290, 0x9e, 0x29f, 0x17d, 0x110, 0x218, 0x192, 0x256, 0x56, 0x13b, 0x81, 0x3d6, 0x3bd, 0x38c, 0xfd, 0x2fb, 0xaf, 0x1ee, 0x37b, 0x344, 0x359, 0x307, 0x269, 0x4b, 0x165, 0x1ef, 0x1f4, 0x293, 0x306, 0xe6, 0x19c, 0x13a, 0x20e, 0x201, 0x3e2, 0x6d, 0x308, 0x38a, 0x3c4, 0x200, 0x16d, 0x1ba, 0x357, 0x6b, 0x31, 0x371, 0x206, 0x117, 0x355, 0x2f8, 0x267, 0x247, 0xef, 0x285, 0x12a, 0x141, 0x123, 0xfc, 0xe8, 0x1e9, 0x193, 0x1b2, 0x20d, 0x332, 0x265, 0x69, 0x24c, 0x37c, 0x1ed, 0x1c6, 0xfd, 0x1ff, 0x2bc, 0x36b, 0x3d5, 0x4a, 0x3dd, 0xe0, 0x143, 0x30d, 0x25f, 0x111, 0x12e, 0x114, 0x6c, 0x30e, 0x166, 0xe7, 0x22f, 0x3b4, 0x2ac, 0x23f, 0x2e0, 0x399, 0x1ec, 0xd1, 0x3a8, 0x307, 0xdb, 0x12c, 0x33a, 0x2cf, 0x2f7, 0x1a1, 0x60, 0x3f1, 0x2b7, 0xf8, 0xbd, 0xa6, 0x261, 0x3c, 0x303, 0x8e, 0x63, 0xc8, 0x341, 0x3f9, 0x21d, 0x266, 0x350, 0x3ba, 0x7d, 0x34d, 0x306, 0x1cc, 0x279, 0x1c2, 0xa8, 0xb0, 0x14e, 0x2e5, 0x2db, 0x3f6, 0x1db, 0x41, 0x4e, 0x388, 0x1af, 0x2b1, 0x283, 0x351, 0x2ad, 0x328, 0x1b5, 0x161, 0x38b, 0x296, 0x347, 0x182, 0x1f1, 0x6d, 0x219, 0x233, 0x21f, 0x48, 0x1f3, 0x243, 0xba, 0x3ca, 0x2d8, 0x22e, 0x14f, 0x3ed, 0x231, 0x62, 0x3be, 0x50, 0x1a, 0x3a9, 0x29, 0x223, 0x29f, 0x1fd, 0x124, 0x329, 0x144, 0xc2, 0x38a, 0x30b, 0x48, 0x3e6, 0x11e, 0x1d9, 0xd7, 0x3a6, 0x3ac, 0x2ad, 0x259, 0x2dd, 0x31a, 0xce, 0x274, 0x54, 0xb0, 0x29c, 0x386, 0x2f5, 0x317, 0x31e, 0x64, 0x341, 0x3fb, 0x66, 0x314, 0x165, 0x3b5, 0x37f, 0x1a1, 0xc0, 0x3df, 0x195, 0x39b, 0x38d, 0x1da, 0x2ac, 0x77, 0x392, 0xf7, 0x2ff, 0x216, 0x3ea, 0xe0, 0x286, 0x2f, 0x2dc, 0x134, 0x181, 0x199, 0x265, 0xd2, 0x122, 0x3d6, 0x2ef, 0xbe, 0x337, 0x247, 0x1de, 0x206, 0x142, 0x3d, 0x21, 0x377, 0xf5, 0x2aa, 0x88, 0x39, 0x8b, 0x242, 0x35a, 0x27c, 0x100, 0x2da, 0x1cb, 0x22a, 0x1e5, 0x2d8, 0x19e, 0xb4, 0x236, 0x2b3, 0x15a, 0x3c1, 0x296, 0x287, 0x201, 0x393, 0x2d9, 0x3b0, 0x1fb, 0x1db, 0x82, 0x138, 0x7f, 0x2c6, 0x55, 0x135, 0x357, 0x358, 0x5b, 0x263, 0x5a, 0x236, 0x16f, 0x161, 0x237, 0x13a, 0x54, 0x160, 0x262, 0xf, 0x303, 0x238, 0x239, 0x26c, 0x359, 0xe, 0x356, 0x30d, 0x16e, 0x134, 0x302, 0x26d, 0x30c, 0x13b, 0x1, 0x55, 0x135, 0x357, 0x358, 0x5b, 0x263, 0x5a, 0x236, 0x16f, 0x161, 0x237, 0x13a, 0x54, 0x160, 0x262, 0xf, 0x303, 0x238, 0x239, 0x26c, 0x359, 0xe, 0x356, 0x30d, 0x16e, 0x134, 0x302, 0x26d, 0x30c, 0x13b, 0x1, 0x55, 0x135, 0x357, 0x358, 0x5b, 0x263, 0x5a, 0x236, 0x16f, 0x161, 0x237, 0x13a, 0x54, 0x160, 0x262, 0xf, 0x303, 0x238, 0x239, 0x26c, 0x359, 0xe, 0x356, 0x30d, 0x16e, 0x134, 0x302, 0x26d, 0x30c, 0x13b, 0x1, 0x55, 0x135, 0x357, 0x358, 0x5b, 0x263, 0x5a, 0x236, 0x16f, 0x161, 0x237, 0x13a, 0x54, 0x160, 0x262, 0xf, 0x303, 0x238, 0x239, 0x26c, 0x359, 0xaa, 0xdd, 0x28e, 0x1e5, 0x372, 0x1d6, 0x153, 0x2ec, 0x306, 0x27b, 0x35f, 0x3e0, 0x38d, 0x361, 0x29a, 0x1ff, 0x1cd, 0x346, 0xa1, 0x7a, 0x108, 0x223, 0x26e, 0x3ef, 0x182, 0x393, 0x376, 0x37e, 0x227, 0xc6, 0x9b, 0x3a8, 0xe, 0x2a5, 0x2f, 0x362, 0x364, 0x98, 0x256, 0x169, 0x13e, 0x200, 0x2fd, 0x11e, 0x36d, 0x16b, 0x6a, 0x3ba, 0x3e8, 0x2d4, 0x180, 0x2c7, 0x2cc, 0x26b, 0x1ed, 0x22b, 0x337, 0x10e, 0x1df, 0xa0, 0xd0, 0x1d5, 0xad, 0x38b, 0x9d, 0x54, 0x2c0, 0x19a, 0x78, 0x5c, 0x399, 0x37b, 0x25, 0x36f, 0x3f, 0x1d0, 0x2af, 0x22, 0x39, 0x22c, 0x61, 0x31d, 0x6e, 0x112, 0x9c, 0xfe, 0x21d, 0x314, 0x19d, 0x32e, 0x24f, 0x228, 0x2c9, 0x69, 0x244, 0x28f, 0x14f, 0x3af, 0x358, 0xb6, 0x19e, 0x2d0, 0x328, 0x1b3, 0xe6, 0x1f6, 0x3e, 0x17a, 0x272, 0x2ac, 0x1dc, 0x15e, 0x1b7, 0x24e, 0x154, 0x374, 0x5d, 0x26f, 0x283, 0x175, 0xfa, 0x16a, 0x180, 0x187, 0x322, 0x37c, 0x2ef, 0x1f9, 0x6b, 0x229, 0xcf, 0x2d0, 0x259, 0x2c5, 0x339, 0x35f, 0x3c9, 0x22f, 0x33e, 0x1fa, 0x397, 0x3bc, 0x28, 0x68, 0x1d5, 0x15a, 0x237, 0xe1, 0x149, 0xa6, 0x251, 0x77, 0xaf, 0x1b7, 0x95, 0x21a, 0x84, 0x223, 0xd5, 0x3a7, 0xb, 0x14e, 0x203, 0x20f, 0x1e4, 0x3b9, 0x25, 0x2d7, 0xfc, 0x29b, 0x2aa, 0x49, 0x25b, 0x6d, 0x1d8, 0x3e5, 0x31e, 0x320, 0x1d4, 0xe, 0x143, 0xbc, 0x326, 0x225, 0x324, 0x8d, 0x1c5, 0x37, 0x112, 0x138, 0x3f8, 0xcc, 0x12c, 0x3cc, 0x222, 0x181, 0xd3, 0x56, 0x321, 0x80, 0x37a, 0x11e, 0x2d3, 0x1a5, 0x350, 0x3de, 0x1e7, 0x45, 0x1b0, 0x230, 0x244, 0x117, 0x135, 0x147, 0x1e5, 0x2ed, 0x351, 0x28a, 0x293, 0x18, 0x3df, 0xb3, 0x331, 0x1ed, 0x5f, 0xc7, 0x62, 0x1cf, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0x159, 0x325, 0x36d, 0x34a, 0x2b6, 0x32e, 0x25c, 0x332, 0x56, 0x9f, 0x12, 0x30f, 0x7f, 0x66, 0x258, 0x25f, 0xd9, 0x130, 0x121, 0x1c5, 0xdc, 0x104, 0x28b, 0x307, 0x2a5, 0x178, 0x106, 0x39, 0x144, 0x76, 0x3e5, 0x63, 0x26c, 0x1f5, 0x21b, 0x349, 0x15d, 0x248, 0x3e2, 0x2e5, 0x385, 0x1e4, 0x2ff, 0x250, 0x85, 0x1c7, 0x26e, 0x347, 0x58, 0x19a, 0x3c0, 0x32d, 0x1b7, 0x254, 0x1e8, 0x148, 0x3c1, 0x274, 0x292, 0x139, 0x2a2, 0x3fe, 0xef, 0x28, 0x1a0, 0x16f, 0x23d, 0x3ec, 0x3e0, 0x57, 0x1c6, 0x337, 0x62, 0x335, 0x2d0, 0x176, 0x3, 0x3eb, 0x166, 0x1be, 0x1d7, 0x3d3, 0x17b, 0x2ed, 0x15f, 0xfa, 0x1a1, 0x36, 0x118, 0x81, 0xaa, 0x2e1, 0x2e8, 0x16b, 0x350, 0x363, 0x24f, 0x164, 0x30c, 0x394, 0x100, 0x3e6, 0x388, 0x30a, 0x4b, 0x3cc, 0x9a, 0x26, 0xa5, 0x2bd, 0x21f, 0x224, 0x1d2, 0x3e7, 0x2b2, 0x8f, 0x35e, 0xc5, 0x27d, 0x222, 0x13, 0xa5, 0x173, 0x6e, 0x104, 0x11f, 0x7, 0x105, 0x3ad, 0x88, 0x25b, 0x368, 0x2f5, 0x79, 0x37b, 0x250, 0x10a, 0x315, 0x354, 0x15, 0x312, 0x251, 0x3b8, 0x39a, 0xa, 0xd0, 0x16f, 0x73, 0x3ab, 0x33f, 0x179, 0xbe, 0x6b, 0x16c, 0x3ac, 0x23a, 0x2d4, 0x36, 0x230, 0x204, 0x159, 0x243, 0x1af, 0x266, 0x33a, 0x111, 0x20d, 0x256, 0x2bd, 0x37, 0x82, 0x28b, 0x207, 0x286, 0x3d2, 0x44, 0x329, 0x1b4, 0x37e, 0x238, 0x3b9, 0x128, 0x85, 0x38e, 0x1aa, 0x20e, 0x189, 0x32c, 0x1dc, 0x1cd, 0x5, 0x68, 0x2b3, 0x23d, 0x3d1, 0x39b, 0x2b8, 0x5f, 0x231, 0xb6, 0x1d6, 0x11d, 0x16a, 0x1b, 0x118, 0x102, 0x2a8, 0x325, 0x2d3, 0x133, 0x19d, 0x28c, 0x302, 0x12b, 0x35a, 0x21f, 0x41, 0x341, 0x307, 0x143, 0x1e9, 0x22, 0x390, 0xda, 0x1bf, 0x11c, 0x3d8, 0x94, 0x16d, 0x23c, 0x2c6, 0x4b, 0x32b, 0x1b2, 0x192, 0x61, 0x378, 0x31e, 0x26c, 0x3dd, 0x1f8, 0x3d4, 0x3ef, 0x2c, 0x334, 0x23f, 0x171, 0x206, 0x68, 0x16f, 0xe6, 0x2b7, 0x1ce, 0x3bd, 0x3ed, 0x2f6, 0x345, 0x3ba, 0x1e7, 0x59, 0x30c, 0x24b, 0x24, 0x4e, 0x3fb, 0x36c, 0x5e, 0x106, 0xe4, 0x6d, 0x1bf, 0x238, 0x37b, 0xa9, 0x21, 0x9e, 0x125, 0x2a0, 0x139, 0x29a, 0x397, 0x3be, 0x5a, 0xbb, 0x6, 0x367, 0x93, 0x28f, 0x1ba, 0x2e8, 0x1a5, 0x165, 0x146, 0x302, 0x256, 0x173, 0xdc, 0x19, 0xea, 0x70, 0xe8, 0x2aa, 0x99, 0x32f, 0xf, 0x170, 0x36b, 0x254, 0x3a9, 0xad, 0x19c, 0x7c, 0x22f, 0x38c, 0x18e, 0x5b, 0x1d6, 0x23a, 0x1a1, 0xd8, 0x1a4, 0x8, 0x37a, 0x1c4, 0x21d, 0x258, 0x16e, 0x18b, 0x8b, 0x308, 0x3f6, 0xc6, 0x344, 0x2d7, 0x3db, 0x29f, 0x347, 0x160, 0x196, 0x1dc, 0x39a, 0x14, 0x2da, 0xe2, 0x21d, 0xb9, 0x1b1, 0x43, 0xa2, 0x1d8, 0x47, 0x3d8, 0x250, 0x21, 0x13c, 0x9d, 0x12d, 0x3b4, 0x3f4, 0x31, 0xcf, 0x2a6, 0xb5, 0x36, 0xd2, 0x8, 0x2fd, 0x319, 0xcc, 0x1c1, 0x193, 0x218, 0x119, 0x2db, 0x238, 0x2ff, 0x2a4, 0x108, 0x1f2, 0xe1, 0x17a, 0x19f, 0x39f, 0x188, 0x271, 0x11d, 0x1a1, 0x1b0, 0x299, 0x40, 0x3c5, 0xfe, 0x269, 0x213, 0x83, 0xe4, 0xda, 0x2f5, 0x1e4, 0x3d5, 0x10d, 0x52, 0x38b, 0x301, 0x3c2, 0xe3, 0xc7, 0x5b, 0x3ac, 0xfa, 0x113, 0x19b, 0xe5, 0x200, 0x217, 0x3f9, 0x36c, 0xbc, 0x11, 0x329, 0x2d9, 0x385, 0x33b, 0x297, 0x7a, 0x290, 0x67, 0x3e, 0x22f, 0x311, 0x231, 0x2d8, 0x15f, 0x3d9, 0x8a, 0xc3, 0x321, 0x24, 0x9c, 0x3f7, 0x356, 0x1e9, 0x88, 0x17e, 0x2e5, 0x17, 0x1ee, 0x95, 0x3d0, 0xad, 0x338, 0x1f0, 0x15c, 0xbe, 0x1ac, 0x2ed, 0x1bd, 0x388, 0xcc, 0x382, 0x245, 0xe4, 0x1b4, 0x3c6, 0x33b, 0x127, 0x1e8, 0xad, 0x279, 0x3c9, 0x2f2, 0x3f2, 0x1e5, 0x21e, 0x3b5, 0x25c, 0x34c, 0x2bd, 0x1b8, 0xc8, 0x17f, 0x7e, 0x3d4, 0x3a7, 0x2c0, 0xab, 0x3fe, 0x2eb, 0x5a, 0x2ec, 0x60, 0x46, 0x204, 0x2da, 0x1c4, 0x66, 0x1c1, 0x326, 0x72, 0xda, 0x1e3, 0x399, 0x297, 0xf4, 0x252, 0x338, 0x3e0, 0x179, 0x1f9, 0x2f6, 0x10f, 0x3de, 0x12e, 0x1a6, 0x35a, 0xdc, 0x64, 0x2bb, 0x3f, 0x1ea, 0x3d7, 0x160, 0x251, 0x1ff, 0x371, 0x2d, 0x176, 0x30, 0x23, 0x102, 0x16d, 0xe2, 0x33, 0x2e4, 0x193, 0x39, 0x6d, 0x2f5, 0x3c8, 0x34f, 0x7a, 0x129, 0x19c, 0x1f0, 0x2b8, 0x2f8, 0x17b, 0x283, 0x1ef, 0x97, 0xd3, 0x1ad, 0x6e, 0x32, 0x359, 0x21b, 0xf5, 0x3ef, 0xb0, 0x32c, 0x2fb, 0x3bc, 0x212, 0xbb, 0x18, 0x215, 0x81, 0x2b2, 0x71, 0x21d, 0x37a, 0x23b, 0x269, 0x5e, 0x22, 0x17e, 0x386, 0x170, 0x36e, 0xd, 0x16f, 0x339, 0xb3, 0x3d6, 0x1ba, 0x36d, 0x18a, 0x32b, 0x18b, 0x51, 0x3b0, 0x238, 0x3ee, 0x21a, 0x290, 0x19c, 0x3e0, 0x2f2, 0x3ed, 0x39d, 0xd4, 0x32e, 0x302, 0x294, 0x6f, 0x31e, 0x344, 0x295, 0x315, 0x125, 0x12d, 0x2cb, 0x337, 0x5b, 0x2ab, 0x3bb, 0x59, 0x56, 0x3c4, 0x82, 0xea, 0x380, 0x27e, 0x3ef, 0x160, 0xab, 0x3f5, 0x3be, 0x2d0, 0x293, 0x1b, 0x1a4, 0x40, 0x30f, 0x3fb, 0x356, 0x3ad, 0x92, 0x32f, 0x78, 0xaf, 0x206, 0x340, 0x366, 0x3eb, 0x93, 0x55, 0x243, 0x2c6, 0x258, 0x362, 0x218, 0x6d, 0x1e3, 0x33b, 0x24e, 0x3a9, 0x161, 0x3d1, 0x1ce, 0x1d7, 0x28e, 0x2b1, 0x165, 0x222, 0x130, 0x61, 0x3f6, 0x239, 0x94, 0x21, 0xf9, 0x1c2, 0x3c2, 0x38c, 0x6b, 0x2ed, 0x3ba, 0x323, 0x26d, 0x1ad, 0xdc, 0xc8, 0x2fe, 0x2fd, 0xfe, 0x36c, 0x1e9, 0x49, 0x32f, 0xf0, 0x2bc, 0x14, 0x65, 0x3, 0x30e, 0x102, 0x1bd, 0x23b, 0xdb, 0x178, 0x110, 0x3cd, 0x3c, 0xaf, 0x5, 0x11b, 0x306, 0x2c7, 0x244, 0x16d, 0x388, 0x330, 0x5e, 0x44, 0x1f1, 0xf, 0x32d, 0x103, 0x340, 0x2c5, 0x3b7, 0x91, 0x159, 0xe2, 0xcc, 0x213, 0x11, 0x17e, 0x305, 0x1c9, 0x346, 0xd0, 0x1b3, 0x3eb, 0x126, 0x154, 0x23c, 0x33, 0x382, 0x106, 0x25b, 0x1c3, 0x170, 0x2d5, 0x34, 0x36a, 0x3fc, 0x24d, 0x55, 0x8f, 0x30a, 0x2e4, 0x245, 0x390, 0x376, 0x5c, 0x1b7, 0xd, 0x2de, 0xff, 0x191, 0x117, 0x325, 0x2c6, 0xb9, 0x193, 0xe4, 0x2d9, 0x17, 0x36b, 0x101, 0x2b3, 0x339, 0x166, 0x343, 0x1cb, 0x2b5, 0x12c, 0x362, 0x39, 0x1b4, 0x303, 0x3dc, 0x142, 0x3aa, 0x1cc, 0x25d, 0x3d6, 0x374, 0x1af, 0x4b, 0x2dc, 0x10c, 0x6d, 0x3c6, 0xf7, 0x254, 0x1f3, 0x3f8, 0x356, 0x2af, 0x132, 0x262, 0xee, 0x1de, 0x5a, 0x34d, 0x36, 0x13b, 0x12, 0xe9, 0xe, 0x3a0, 0x3fd, 0x160, 0x2ac, 0x327, 0x263, 0x11d, 0x226, 0x30c, 0x1e2, 0x104, 0x359, 0xfc, 0x137, 0x54, 0xed, 0x3cb, 0x5b, 0x2be, 0x3ce, 0x26d, 0x2bd, 0x1db, 0x26c, 0x34e, 0x223, 0x13a, 0x1e1, 0x311, 0x358, 0x10f, 0x2cf, 0x302, 0x242, 0x2f9, 0x239, 0x250, 0x210, 0x237, 0x1f0, 0x1ed, 0x357, 0x35c, 0x2ca, 0x134, 0x241, 0xec, 0x238, 0x3a3, 0x1e8, 0x161, 0x35f, 0xdf, 0x135, 0x3b2, 0x314, 0x16e, 0x10c, 0xda, 0x303, 0x3b1, 0x101, 0x16f, 0xff, 0x322, 0x55, 0x11e, 0x33, 0x30d, 0x11, 0x2fc, 0xf, 0x253, 0x5, 0x236, 0x3, 0x215, 0x1, 0x1f3, 0x3f8, 0x356, 0x2af, 0x132, 0x262, 0xee, 0x1de, 0x5a, 0x34d, 0x36, 0x13b, 0x12, 0xe9, 0xe, 0x3a0, 0x3fd, 0x160, 0x2ac, 0x327, 0x263, 0x3e6, 0x3fb, 0x286, 0x2aa, 0x201, 0x196, 0x3f5, 0x1cf, 0x145, 0x113, 0x30c, 0x3c4, 0x19, 0x2fe, 0x3db, 0x2a1, 0x12d, 0x275, 0x6b, 0x345, 0x363, 0x302, 0x8d, 0x3f6, 0x1ec, 0x141, 0x290, 0xfb, 0x1ce, 0x2a3, 0x2e8, 0x18a, 0x16e, 0x218, 0x368, 0x2e, 0x36e, 0x68, 0x366, 0x367, 0x81, 0x37a, 0x1fc, 0x356, 0x157, 0xc1, 0x334, 0x2fb, 0x3be, 0x2ad, 0x1a1, 0x265, 0x27c, 0x82, 0x359, 0x1f8, 0xd5, 0x2a0, 0x2cb, 0x18e, 0x2ed, 0x1ef, 0x162, 0x294, 0x378, 0x239, 0xa9, 0x52, 0x19c, 0x33f, 0x1d7, 0x5d, 0x133, 0x32b, 0x43, 0x6d, 0x303, 0x36b, 0xd, 0x36a, 0x3eb, 0x91, 0x16d, 0x23b, 0x36c, 0x3ad, 0x99, 0x262, 0x1dc, 0x371, 0x2d0, 0xb5, 0x2c9, 0x24b, 0x112, 0xea, 0x3f, 0x29f, 0x54, 0x1da, 0x337, 0x2d8, 0x3ba, 0x12e, 0x256, 0x6f, 0xc6, 0x94, 0x108, 0x237, 0x3e0, 0x3bd, 0x28e, 0x1a5, 0x3c5, 0x3f7, 0x1d, 0x2fa, 0xb0, 0x151, 0x10e, 0xeb, 0x3bb, 0x199, 0x2bd, 0x365, 0x281, 0x214, 0x3c1, 0xf8, 0x3da, 0x28e, 0x34a, 0x391, 0x43, 0xda, 0x17, 0x36e, 0xd0, 0x183, 0x30e, 0x2, 0x383, 0x3e7, 0x3a, 0x1fd, 0x160, 0x2a2, 0x21c, 0x1d6, 0x37f, 0x332, 0x173, 0x2c3, 0x10b, 0x21, 0x38b, 0x1f0, 0x3bd, 0x115, 0x29d, 0x32b, 0x86, 0x1b4, 0x2e, 0x2d5, 0x1a0, 0x306, 0x215, 0x4, 0x30f, 0x3c7, 0x74, 0x3fa, 0x2c0, 0x14d, 0x31, 0x3ac, 0x2f7, 0x26d, 0x2e6, 0x18f, 0x216, 0x42, 0x31f, 0x3e0, 0x373, 0x22a, 0x133, 0x25f, 0x10c, 0x368, 0x5c, 0x1a3, 0x340, 0x205, 0x23, 0x8, 0x217, 0x387, 0xe8, 0x3fd, 0x189, 0x29a, 0x62, 0x351, 0x1e7, 0xd3, 0x1c5, 0x31e, 0x25, 0x84, 0x237, 0x3c9, 0x2ef, 0x5d, 0x266, 0xb7, 0x218, 0x2d9, 0xb8, 0x346, 0x289, 0x3, 0x46, 0x10, 0x27, 0x307, 0x383, 0x3c7, 0xe8, 0x3f3, 0x22d, 0xfd, 0x229, 0x2ea, 0x12e, 0x14a, 0x2f9, 0x1ec, 0x10d, 0x15a, 0x2b7, 0x1eb, 0x396, 0x21d, 0x2f, 0x220, 0x14e, 0xee, 0x2eb, 0x2ad, 0x28d, 0x211, 0x21f, 0x320, 0x1a7, 0x9e, 0x301, 0x2b8, 0x357, 0x2d6, 0x3cc, 0x43, 0x1b4, 0x5c, 0x346, 0x11b, 0xc, 0x230, 0x100, 0xe9, 0x70, 0x1ea, 0x15, 0x1da, 0xc7, 0x1d3, 0x363, 0x13, 0xc2, 0x47, 0x3a3, 0x35b, 0xe6, 0x2cc, 0xaa, 0x1c4, 0x1b6, 0x353, 0xc1, 0xcb, 0x3e3, 0x263, 0xfa, 0xb2, 0x1ad, 0x3b6, 0x281, 0x21, 0x31f, 0x3c9, 0x1d7, 0x174, 0x314, 0x362, 0x390, 0x305, 0xaf, 0x50, 0x176, 0x1b, 0xe5, 0x240, 0xea, 0xfc, 0x1aa, 0x12d, 0x1c6, 0x2b9, 0xd4, 0x111, 0x324, 0x3b0, 0x399, 0xa1, 0x16f, 0x3f1, 0x122, 0x37a, 0x3f9, 0x105, 0x17d, 0xb0, 0x2a2, 0x31, 0x351, 0x3ce, 0x34c, 0x233, 0x18c, 0xa9, 0x30f, 0x307, 0x349, 0x347, 0x139, 0x337, 0x2ed, 0x363, 0x26, 0x308, 0x238, 0x24e, 0x3aa, 0x1fe, 0x91, 0x37a, 0x3fb, 0x1d, 0x3fa, 0x312, 0xfd, 0x5b, 0x3ba, 0x162, 0x8d, 0x38f, 0x3ee, 0x3a9, 0xe6, 0x191, 0x2a8, 0x23b, 0x356, 0x2aa, 0x2c, 0x151, 0x31, 0x2ab, 0x323, 0x256, 0x378, 0x1ec, 0x21a, 0x161, 0x195, 0x28f, 0x23c, 0x269, 0x3ad, 0xc1, 0x196, 0x397, 0x33c, 0x3bb, 0x26d, 0x38a, 0xc6, 0xa9, 0x290, 0x3d1, 0x37c, 0x1cb, 0x21d, 0x5e, 0x92, 0x262, 0x2fb, 0x1cf, 0x23a, 0x59, 0x1ad, 0x365, 0x216, 0x108, 0x19c, 0x1ce, 0x135, 0x35e, 0x2e4, 0x22, 0x32f, 0x23f, 0x371, 0x2ad, 0x113, 0x56, 0xdc, 0x26c, 0x85, 0x3c1, 0x3e0, 0x1d7, 0x2e8, 0x4b, 0x326, 0x17e, 0x78, 0x39a, 0x5a, 0xb5, 0x265, 0x3c4, 0xc8, 0x2d7, 0x9e, 0x20b, 0x2f2, 0x28e, 0x133, 0x16e, 0xe4, 0x386, 0xaf, 0xa0, 0x217, 0x7, 0x27e, 0x15, 0x361, 0x6b, 0x35, 0x111, 0x8b, 0x37e, 0x3b1, 0x68, 0x205, 0x118, 0x200, 0x341, 0x21b, 0xd5, 0x25a, 0x22b, 0x39d, 0x2ca, 0x2c1, 0x6d, 0x5c, 0x103, 0x194, 0x300, 0xe5, 0x112, 0x2bb, 0x377, 0x13a, 0x57, 0x3af, 0x1a5, 0x25f, 0x72, 0x386, 0x15e, 0x280, 0x293, 0x19b, 0x1e2, 0xc8, 0x1a7, 0x278, 0x7c, 0x373, 0x174, 0x4b, 0x245, 0x1f1, 0x3c0, 0x1de, 0x352, 0x113, 0xac, 0x370, 0x344, 0x42, 0xce, 0x1ce, 0x26a, 0x163, 0x30d, 0x220, 0x131, 0x2fb, 0x39e, 0xfa, 0x2c8, 0x2e6, 0x63, 0xa9, 0x129, 0x35f, 0x3d6, 0x8f, 0x330, 0x3ad, 0x182, 0x251, 0x87, 0x3ac, 0x395, 0x256, 0x2f9, 0x3b9, 0xf4, 0x23d, 0x2cc, 0x2a8, 0x7f, 0x143, 0x17d, 0x2c0, 0x27a, 0x5b, 0x37d, 0x181, 0x61, 0x8e, 0x127, 0x3aa, 0x3fc, 0x244, 0x3e6, 0x3c7, 0x3a0, 0x347, 0x272, 0xc7, 0x345, 0x27, 0x1c, 0x3d4, 0x150, 0xe3, 0x2f6, 0x2b6, 0x364, 0x6d, 0xb8, 0x5, 0xbb, 0x6c, 0x9f, 0x19, 0x36f, 0x13c, 0x7c, 0x2ef, 0x1d9, 0x258, 0x11, 0x257, 0x1dc, 0x2e3, 0x7d, 0x2c8, 0x1c5, 0x18c, 0x141, 0x2b4, 0x32a, 0x55, 0x319, 0x2a5, 0x17d, 0x189, 0x1fa, 0x2d8, 0x3b5, 0x4c, 0x76, 0x399, 0x101, 0x366, 0x23, 0x80, 0x3a4, 0x21b, 0x1aa, 0x17a, 0x17c, 0x1ae, 0x1e6, 0x10c, 0x2e5, 0xaf, 0x280, 0x12f, 0x265, 0x30b, 0x9b, 0x85, 0x31f, 0x277, 0x135, 0x163, 0x213, 0x92, 0x19a, 0x3e3, 0x33c, 0x2f7, 0x291, 0x378, 0x3b9, 0x1e8, 0xe6, 0x24d, 0x2da, 0x3fb, 0x74, 0x3d7, 0x139, 0xc7, 0x283, 0x146, 0x241, 0x37e, 0x36b, 0x1a0, 0xc, 0x1a4, 0x90, 0x1d4, 0x3db, 0x9d, 0x57, 0x357, 0x29d, 0x2dc, 0x329, 0x3c, 0x33d, 0x2d0, 0x28d, 0xac, 0x2e9, 0x10b, 0x210, 0xfb, 0x1be, 0x396, 0xcc, 0x4e, 0x70, 0x29f, 0x12d, 0x5f, 0xd7, 0x1e6, 0x218, 0x386, 0x171, 0x5a, 0x1a1, 0x56, 0x2e9, 0x216, 0x52, 0x3d1, 0x3d6, 0x23c, 0x36c, 0x2aa, 0x160, 0xfd, 0x2d8, 0x363, 0x130, 0x3b0, 0x1ee, 0x68, 0x6, 0x1a4, 0x120, 0x359, 0x2e7, 0x1c2, 0x2f2, 0x5d, 0x4b, 0x106, 0x32f, 0x1dc, 0x1cf, 0x1f4, 0x26d, 0x6f, 0x1ec, 0xf4, 0xe6, 0x93, 0x37a, 0x3e7, 0x349, 0x20e, 0x2cb, 0x358, 0x2a9, 0x1b2, 0x6d, 0x170, 0x14, 0x1d1, 0x2c9, 0x3c4, 0x249, 0x85, 0x237, 0x1ce, 0x1ba, 0x21d, 0x2f0, 0xc1, 0xab, 0x31, 0x175, 0x162, 0x61, 0x238, 0x254, 0x36a, 0x30e, 0x40, 0x3a4, 0x3f, 0x2a1, 0x3c2, 0x3ed, 0x1a5, 0x16e, 0x329, 0x78, 0xef, 0x2ad, 0x8a, 0x1ad, 0x31e, 0xa9, 0xad, 0x195, 0x55, 0x23b, 0x286, 0x3fa, 0xa6, 0x337, 0x345, 0x146, 0x8b, 0x1e3, 0x36e, 0x236, 0x180, 0x1ca, 0x82, 0x3dd, 0x9c, 0x1c0, 0xd5, 0x2f4, 0x3f2, 0x1a5, 0x2dc, 0xbf, 0x3c0, 0x2eb, 0x11d, 0x2c8, 0x31d, 0xf6, 0xf4, 0x1cc, 0x24c, 0x3e6, 0x207, 0x1ea, 0x2a0, 0x311, 0x26f, 0x1e6, 0x39, 0x203, 0x39a, 0x1a9, 0x45, 0x1ad, 0x235, 0x2a4, 0x161, 0x166, 0x2b2, 0x3fb, 0x1d0, 0x107, 0x2cb, 0x2b9, 0x2b6, 0x18b, 0x2d9, 0x253, 0x109, 0x16a, 0x2b, 0x2e9, 0x25, 0x148, 0x2b7, 0x117, 0x319, 0x286, 0x3fd, 0x298, 0x18e, 0x35, 0x9a, 0x288, 0x5c, 0xa, 0x1d1, 0x19b, 0x30b, 0x26c, 0x42, 0x279, 0x37c, 0x8f, 0x1b6, 0x2aa, 0x2c0, 0x3f4, 0x2ed, 0x255, 0x241, 0x1e3, 0x2d5, 0xca, 0x1b, 0x9f, 0x64, 0x295, 0x38b, 0xe7, 0x1ba, 0x33, 0x3d2, 0x201, 0x2a2, 0x229, 0x1ef, 0x4c, 0x1d8, 0x1ee, 0xd0, 0x18, 0x13b, 0x224, 0x3ea, 0x9e, 0xf8, 0x355, 0x35e, 0x213, 0x248, 0x196, 0x10e, 0x2be, 0x162, 0xc2, 0xf2, 0x284, 0x138, 0x309, 0x2a1, 0x313, 0x2a7, 0x18a, 0x83, 0x257, 0x2fb, 0x19e, 0x3ce, 0x294, 0x227, 0x95, 0x36a, 0x23, 0x9, 0xea, 0x377, 0x384, 0x3bd, 0x3b2, 0x1c1, 0x92, 0xcb, 0x10e, 0x175, 0x181, 0x219, 0x33b, 0x34, 0xc, 0x13b, 0x41, 0x3b3, 0xf9, 0x39b, 0x26a, 0x21d, 0x3d2, 0xb, 0x29a, 0x16c, 0x2cf, 0x192, 0x2f5, 0x2d5, 0x194, 0x6c, 0xf1, 0x249, 0x214, 0x338, 0x37c, 0x11e, 0x2d1, 0x17d, 0x53, 0x267, 0x21e, 0x9a, 0x119, 0x170, 0x50, 0x12f, 0x30c, 0x370, 0x25, 0x290, 0x2ce, 0xaa, 0x1fc, 0x74, 0x287, 0x2cb, 0x17b, 0x2ca, 0x43, 0x1c3, 0x2e2, 0x2d0, 0x45, 0x35a, 0xc6, 0x10d, 0x23d, 0x93, 0x1f3, 0x207, 0x3d4, 0x292, 0xbe, 0x2b1, 0xb7, 0x25b, 0x3c0, 0x1df, 0x7d, 0x26d, 0x1bc, 0x2ff, 0x177, 0x3f1, 0x2, 0x270, 0x21b, 0x14b, 0x22f, 0x147, 0x314, 0x106, 0xa7, 0x1ff, 0x33c, 0x270, 0x3f, 0x125, 0x15c, 0x5d, 0x258, 0x110, 0x334, 0x87, 0x175, 0x302, 0x76, 0x1ee, 0x340, 0x180, 0x24b, 0xc8, 0x85, 0x19c, 0x37c, 0x23c, 0x356, 0x3fa, 0x139, 0x6b, 0x2a9, 0x18b, 0x376, 0x171, 0x2d0, 0x8a, 0x173, 0x239, 0xf4, 0x339, 0x81, 0x4e, 0x380, 0x2a1, 0x22f, 0x28e, 0x4b, 0x22, 0x262, 0x397, 0x2ab, 0x162, 0x308, 0x33b, 0x68, 0x30, 0x1ca, 0x19, 0x295, 0x237, 0x26b, 0x243, 0x36c, 0x17d, 0xa6, 0x18e, 0xd4, 0x1b2, 0x368, 0xaf, 0x5a, 0x113, 0x1ad, 0xc6, 0x21a, 0xe6, 0x91, 0x30f, 0x70, 0xd5, 0x3c2, 0x357, 0x18a, 0x106, 0x14e, 0x3f5, 0x1d6, 0x12e, 0x61, 0x1e4, 0xd, 0x6, 0x13b, 0x82, 0x2d7, 0x3c1, 0x1ce, 0x1cb, 0x269, 0x2aa, 0x312, 0x337, 0x21e, 0x134, 0x6d, 0x392, 0x109, 0x1a1, 0x2b0, 0x31e, 0x141, 0x31a, 0x93, 0x3e6, 0xe, 0x29f, 0x17a, 0x3ed, 0x133, 0xe9, 0xfc, 0x13a, 0x1ed, 0x3b2, 0x30d, 0x132, 0x2ac, 0x5b, 0x2cf, 0x241, 0x303, 0x5, 0x34d, 0x30c, 0x1db, 0x250, 0x161, 0x322, 0x1f3, 0xe, 0x137, 0x1e1, 0x357, 0x314, 0x11, 0x262, 0x327, 0x2be, 0x302, 0xec, 0x3b1, 0x236, 0x36, 0x1e2, 0x26c, 0x210, 0x35f, 0x55, 0x3f8, 0x3a0, 0x54, 0x311, 0x35c, 0x16e, 0x2fc, 0xee, 0x263, 0x3ce, 0x242, 0x238, 0x101, 0x3, 0x13b, 0x104, 0x34e, 0x237, 0xdf, 0x11e, 0x356, 0x3fd, 0xed, 0x358, 0x2ca, 0x10c, 0xf, 0x1de, 0x11d, 0x26d, 0x2f9, 0x3a3, 0x16f, 0x215, 0x12, 0x359, 0x223, 0x1f0, 0x135, 0x33, 0x2af, 0x160, 0x3cb, 0x10f, 0x134, 0xda, 0x253, 0x5a, 0x226, 0x2bd, 0x239, 0x1e8, 0xff, 0x1, 0xe9, 0xfc, 0x13a, 0x1ed, 0x3b2, 0x30d, 0x132, 0x2ac, 0x5b, 0x2cf, 0x241, 0x303, 0x5, 0x34d, 0x30c, 0x1db, 0x250, 0x161, 0x322, 0x1f3, 0xe, 0x1d2, 0x3f0, 0x1c2, 0x2ef, 0x2b5, 0x2f0, 0x16, 0x1fa, 0x345, 0x9a, 0xda, 0xaf, 0x168, 0x114, 0x38a, 0x3b9, 0x2ee, 0x367, 0x100, 0x1d4, 0x315, 0x1f0, 0x26a, 0xcc, 0x155, 0x22d, 0x18e, 0x350, 0x316, 0x386, 0x273, 0x28a, 0x26d, 0x1fb, 0x297, 0x36a, 0x118, 0x240, 0x3dd, 0x3e4, 0x39c, 0x243, 0x1ab, 0x3fd, 0x1da, 0x17b, 0x27d, 0xe4, 0x1e0, 0x375, 0x3bb, 0x14a, 0x8e, 0x284, 0x3, 0x276, 0x19, 0x246, 0x338, 0x3d6, 0x319, 0x3a, 0x20e, 0x1c6, 0x1ae, 0x16e, 0x1f1, 0x3b8, 0x33c, 0x97, 0xc2, 0x33b, 0x1a0, 0x300, 0x27c, 0x136, 0x210, 0x2b7, 0x154, 0x3ff, 0x27e, 0x292, 0x1f9, 0x133, 0x83, 0x29c, 0x397, 0x2be, 0x20d, 0x3b0, 0x1b7, 0x328, 0x2c9, 0x6e, 0x25, 0xad, 0x2cc, 0x2fd, 0xe, 0x26e, 0x38d, 0x28e, 0x12c, 0x220, 0x196, 0xc4, 0x3de, 0x192, 0x385, 0x5, 0x293, 0x2b, 0x2c3, 0x141, 0x3a4, 0x3db, 0x20b, 0x2a3, 0x21d, 0x157, 0x312, 0x18e, 0x2a9, 0x43, 0xf, 0x371, 0x1f4, 0x256, 0x47, 0x284, 0x6, 0x1ca, 0xc8, 0x21, 0x3d1, 0x55, 0x3fb, 0x27e, 0x12d, 0x3ed, 0x18a, 0x22, 0x334, 0x31, 0x1ef, 0x192, 0x303, 0x14, 0xb5, 0x2b0, 0xc6, 0xf4, 0x1fe, 0x8, 0x11f, 0x2e7, 0x7c, 0x135, 0xcc, 0x2aa, 0xa6, 0x6b, 0x165, 0x218, 0x78, 0x3be, 0x3bb, 0x294, 0x238, 0xd, 0x30, 0x24b, 0x249, 0x108, 0x2b7, 0x2a8, 0x3e7, 0x3d4, 0x17a, 0x357, 0x4b, 0x110, 0x196, 0x188, 0x363, 0x8b, 0x2e, 0xa0, 0x1a1, 0x1ad, 0x239, 0x3a9, 0x3eb, 0x40, 0xea, 0x315, 0x3e0, 0x1ba, 0x269, 0x17d, 0x139, 0x358, 0x33a, 0xe4, 0x3c0, 0x1cf, 0x1e7, 0x8d, 0x1e4, 0x68, 0x180, 0x27c, 0x26c, 0x52, 0x195, 0x16d, 0x307, 0x29f, 0x3c2, 0x28e, 0x258, 0x92, 0xab, 0x5b, 0x32e, 0x51, 0x170, 0x109, 0x341, 0x377, 0x7c, 0x26a, 0x330, 0x17d, 0x272, 0x17b, 0x1e6, 0x25b, 0xee, 0x33c, 0x25c, 0x3b, 0x36b, 0x328, 0x336, 0x2e9, 0x152, 0x73, 0x81, 0xe9, 0x3e9, 0x20b, 0x14f, 0x66, 0x2aa, 0x14c, 0x1ac, 0x33a, 0x1c8, 0x31b, 0x263, 0x24f, 0x184, 0x1ee, 0x65, 0x360, 0xdc, 0x128, 0x18d, 0x91, 0x9c, 0xfc, 0x1c2, 0x3ae, 0x30a, 0x157, 0x22d, 0x231, 0x165, 0x39, 0x1e0, 0x1cf, 0x3ce, 0x234, 0x33b, 0x289, 0x6c, 0x21f, 0x25, 0x2b4, 0x93, 0x217, 0x21b, 0x13a, 0x373, 0x163, 0x3ad, 0x2c0, 0xc7, 0x2a9, 0x86, 0x3c, 0x3be, 0x37f, 0x242, 0x1e4, 0xd0, 0x209, 0x3c4, 0x281, 0x252, 0x191, 0x3c5, 0x1c0, 0x125, 0x1ed, 0x1af, 0x2f0, 0x58, 0x39f, 0xd4, 0x316, 0x203, 0x371, 0x3e8, 0x14a, 0x238, 0x1a, 0xc0, 0x27c, 0xd1, 0x148, 0xb3, 0x2fd, 0x38, 0x2a1, 0x2b8, 0x3b2, 0x5e, 0xb, 0x3f4, 0x21e, 0x28b, 0x1c7, 0x3e0, 0x2e1, 0x2d1, 0x3ef, 0x33e, 0x1ae, 0x362, 0xa7, 0x327, 0x3ba, 0xc9, 0x20f, 0xa0, 0x28d, 0x2e6, 0x37b, 0x2b3, 0x8c, 0x112, 0x34e, 0x338, 0x28f, 0x3f9, 0xf5, 0x17a, 0x147, 0xb9, 0x99, 0x14d, 0x1d3, 0x134, 0x1bb, 0x33d, 0x23a, 0x12b, 0x8e, 0xd, 0xc0, 0xf1, 0x344, 0x252, 0x322, 0x30f, 0x21b, 0x274, 0x1d7, 0x30a, 0x2ae, 0xa6, 0x1ac, 0x27d, 0x329, 0xee, 0x271, 0x162, 0x1d8, 0x2d5, 0x1d1, 0x2b, 0x235, 0xf4, 0x3f1, 0x80, 0x359, 0x278, 0x39c, 0x23c, 0x20a, 0x15, 0x5f, 0x29d, 0x20c, 0x334, 0xc4, 0x2cf, 0x51, 0x1c9, 0xb4, 0x59, 0x1bc, 0x297, 0x366, 0x299, 0x32, 0x21, 0x35f, 0x159, 0x307, 0x26e, 0x57, 0x2e8, 0x2f, 0xb, 0x3e1, 0x6a, 0x316, 0xf, 0x1df, 0x37f, 0x8d, 0x399, 0x289, 0xd8, 0x6e, 0x128, 0x31a, 0x244, 0xe9, 0x3db, 0x3e, 0x26a, 0x269, 0x11f, 0x315, 0x33f, 0x243, 0x286, 0x20e, 0x5f, 0x133, 0x22, 0x196, 0x5b, 0x146, 0x6d, 0x171, 0x145, 0x34c, 0x47, 0xd, 0x180, 0x3c4, 0x216, 0x161, 0x91, 0x270, 0x3db, 0x7c, 0x1ba, 0x36c, 0x3ef, 0x275, 0x2b1, 0x326, 0x262, 0x31, 0x363, 0x51, 0x392, 0x2d0, 0x2c8, 0x3f6, 0x254, 0x6, 0x24b, 0x26c, 0x290, 0x191, 0x30f, 0x3f, 0x1c2, 0x2a3, 0xcc, 0x17d, 0x1da, 0x39d, 0x16e, 0x32f, 0x397, 0x3ba, 0x192, 0x2e, 0x109, 0x8a, 0x6f, 0x34f, 0x366, 0x13b, 0xc8, 0x108, 0x195, 0x37a, 0x70, 0x125, 0x3bd, 0x2c6, 0x157, 0xa6, 0x358, 0x1e6, 0x17e, 0x2fb, 0x2ab, 0x26, 0x1e3, 0x14, 0x1a1, 0x173, 0x37b, 0x16f, 0x230, 0x82, 0x85, 0x3d1, 0x2a8, 0x307, 0xd5, 0x15c, 0x36d, 0x2f0, 0x160, 0x18e, 0x165, 0xe4, 0x23f, 0x33c, 0x162, 0x3b0, 0x346, 0x293, 0x2b0, 0x239, 0x177, 0x30e, 0x120, 0x2d7, 0x23e, 0x4f, 0x1ce, 0x71, 0x74, 0x2a0, 0x3d3, 0x12c, 0x99, 0x13d, 0x10f, 0x18b, 0x1e, 0x2e3, 0x323, 0x219, 0x1b7, 0x1d1, 0xac, 0x318, 0x177, 0x215, 0x89, 0x295, 0x1f6, 0x154, 0x307, 0x1aa, 0x179, 0x35e, 0x353, 0x53, 0x358, 0x3cc, 0x1f1, 0x3f5, 0x2ea, 0xc9, 0x2e, 0x212, 0x228, 0x378, 0x95, 0x3, 0x24b, 0xd1, 0x252, 0x93, 0x9c, 0x3e9, 0x7c, 0x374, 0x1ab, 0x347, 0x311, 0x29d, 0x22, 0x32c, 0x16c, 0x222, 0x2d9, 0x273, 0x1f4, 0x121, 0x399, 0x236, 0x19b, 0x3b6, 0x21a, 0x3fc, 0x100, 0x2fe, 0x38b, 0x1eb, 0x1fc, 0xf5, 0x1e1, 0x5d, 0x213, 0x16, 0x337, 0x15b, 0x72, 0x23f, 0x271, 0x181, 0x1bf, 0x5, 0x2d4, 0x173, 0x2ff, 0x1b5, 0x1a4, 0x32, 0x84, 0x195, 0x2fd, 0x1c0, 0x13a, 0x3ae, 0x66, 0x17d, 0x3b4, 0x26f, 0x362, 0x29c, 0x21c, 0x363, 0xa2, 0x253, 0x2ad, 0xd3, 0x227, 0xd, 0x75, 0x13c, 0x26b, 0x319, 0x29b, 0x17a, 0x22a, 0x213, 0x2c, 0xc7, 0x2ca, 0x329, 0x379, 0x15f, 0x130, 0x17, 0x212, 0x59, 0x1fb, 0xa1, 0x30, 0x1e2, 0x25, 0x31a, 0x204, 0x23e, 0x9e, 0x331, 0x388, 0x349, 0xbd, 0x115, 0x30d, 0x16, 0x267, 0x165, 0x390, 0x3b8, 0x2ab, 0x98, 0x20f, 0x109, 0x228, 0x2f9, 0x254, 0x18, 0xf1, 0x216, 0x18d, 0x102, 0x11f, 0x4f, 0x39c, 0x1c4, 0x3a0, 0x25a, 0x28e, 0x382, 0xb, 0x337, 0x2b6, 0x1c8, 0x1dc, 0x351, 0x4c, 0x303, 0x280, 0x114, 0x378, 0x12a, 0xc, 0x27c, 0x10b, 0x2c2, 0x81, 0x28b, 0x223, 0x1ce, 0xe2, 0x1d0, 0x12d, 0x147, 0x1c1, 0x201, 0x39f, 0x15b, 0xe4, 0xee, 0x3ac, 0x26, 0x385, 0x140, 0x8a, 0x1bc, 0x95, 0x6, 0x13e, 0x281, 0x161, 0x244, 0x341, 0x315, 0xe7, 0x71, 0xe8, 0x292, 0x2a7, 0x2e4, 0x304, 0x3cb, 0x2a9, 0x72, 0x77, 0x1d6, 0xea, 0xf9, 0x37c, 0x1fc, 0x3d4, 0x22f, 0x36d, 0x3ad, 0xa6, 0x2f6, 0x16e, 0x14e, 0x31, 0x32e, 0x6d, 0x39a, 0x1f4, 0x8d, 0x1ee, 0xbb, 0x56, 0x239, 0x3aa, 0x230, 0x19, 0x108, 0xb3, 0x30f, 0x1f8, 0x7c, 0x1cb, 0x286, 0x54, 0x3ed, 0x258, 0xc1, 0x3e1, 0x2a9, 0xe4, 0x1dc, 0x2ab, 0x130, 0x2e, 0x5a, 0x2c8, 0x38f, 0xd, 0x1b, 0xdc, 0x141, 0x1fe, 0x200, 0x3dd, 0x19c, 0x55, 0x307, 0x2a1, 0x3bd, 0x21d, 0x17d, 0x2cb, 0x2b1, 0x106, 0x196, 0x2d8, 0x134, 0x386, 0x3be, 0x323, 0x76, 0x346, 0xb5, 0x173, 0x3ee, 0x366, 0x1ca, 0x26c, 0xad, 0x91, 0x3a4, 0x315, 0x1ce, 0x1c4, 0x349, 0x17a, 0x5d, 0x5e, 0x160, 0x6b, 0x1e6, 0x3e2, 0x397, 0x1ef, 0x51, 0xaf, 0x145, 0x256, 0x1e4, 0x236, 0x265, 0x31e, 0x3a9, 0x30e, 0x112, 0x85, 0x2b7, 0x37a, 0x380, 0x1c2, 0x135, 0x36c, 0x347, 0x5f, 0x18a, 0x1d4, 0x3e4, 0x3d6, 0x3ff, 0x26e, 0x2f2, 0x185, 0x2ba, 0x2cb, 0x16b, 0x11, 0xab, 0x1d3, 0x2c1, 0x78, 0xcf, 0x181, 0x1e3, 0x140, 0x228, 0x3f6, 0x101, 0x209, 0xdc, 0x282, 0x3f1, 0x24, 0x1a7, 0x3ec, 0x16d, 0xe0, 0xe1, 0x135, 0x2d1, 0x107, 0x2f8, 0x96, 0x264, 0x3e1, 0x15b, 0x390, 0x2fb, 0x2ea, 0x241, 0x392, 0x153, 0x12b, 0x1e4, 0x65, 0x186, 0xc6, 0x2ee, 0x118, 0x19, 0x210, 0x2cc, 0x4e, 0x3bf, 0x39b, 0x23c, 0x1d0, 0xbd, 0x5d, 0xbc, 0x189, 0x358, 0x25f, 0xa7, 0x31, 0x255, 0x1b4, 0xef, 0x37f, 0x184, 0x36e, 0x12f, 0x2bd, 0x3ee, 0x2c5, 0x321, 0x344, 0x2c2, 0x204, 0xea, 0x1f2, 0x1eb, 0x3fb, 0x137, 0x179, 0x2c6, 0x15d, 0x361, 0x2b1, 0x20c, 0x251, 0x2ed, 0x364, 0x3c, 0x263, 0x2c4, 0x2f5, 0xa0, 0x114, 0x1fb, 0x284, 0x300, 0x6e, 0x141, 0x3fc, 0x12, 0x2d7, 0x1f6, 0x2b2, 0x70, 0x3a8, 0x38b, 0x28f, 0x387, 0x14b, 0x1d7, 0x330, 0x3d7, 0x5f, 0x221, 0x132, 0x3e1, 0x2b6, 0x25b, 0x3f5, 0x2f3, 0xa2, 0x171, 0xfa, 0x11a, 0x36b, 0x34d, 0x35a, 0x3ee, 0x183, 0x9f, 0x216, 0x73, 0x10, 0x2fe, 0xce, 0xaa, 0xe, 0x9d, 0x14f, 0x36c, 0x107, 0x1f9, 0x258, 0x304, 0x267, 0x33a, 0x1f1, 0x327, 0x363, 0x232, 0x33d, 0x3bb, 0x184, 0x2d5, 0xb5, 0x1c5, 0x297, 0x6, 0x1e2, 0x128, 0x339, 0x100, 0x3b3, 0xfb, 0x2b2, 0xe0, 0x1c2, 0xdd, 0x2a5, 0x54, 0x3af, 0x1c1, 0x2c, 0x231, 0x3cc, 0x32f, 0x21c, 0x255, 0x368, 0x3bc, 0x3ce, 0x76, 0x103, 0x342, 0x6f, 0x12a, 0x60, 0x21f, 0x2a4, 0x3fc, 0x24, 0x34e, 0x3ab, 0x37a, 0x21b, 0x1f, 0x1cb, 0x20a, 0x149, 0x28e, 0x2f, 0x2c0, 0x358, 0xb7, 0x29c, 0x188, 0x111, 0x2e5, 0x3be, 0x97, 0x369, 0x14, 0x45, 0x2f9, 0x284, 0x209, 0x1b8, 0x21a, 0x359, 0x237, 0x55, 0xe, 0x13a, 0x135, 0x356, 0x54, 0x357, 0x30d, 0x160, 0x358, 0x16e, 0x262, 0x5b, 0x134, 0xf, 0x263, 0x302, 0x303, 0x5a, 0x26d, 0x238, 0x236, 0x30c, 0x239, 0x16f, 0x13b, 0x26c, 0x161, 0x1, 0x359, 0x237, 0x55, 0xe, 0x13a, 0x135, 0x356, 0x54, 0x357, 0x30d, 0x160, 0x358, 0x16e, 0x262, 0x5b, 0x134, 0xf, 0x263, 0x302, 0x303, 0x5a, 0x26d, 0x238, 0x236, 0x30c, 0x239, 0x16f, 0x13b, 0x26c, 0x161, 0x1, 0x359, 0x237, 0x55, 0xe, 0x13a, 0x135, 0x356, 0x54, 0x357, 0x30d, 0x160, 0x358, 0x16e, 0x262, 0x5b, 0x134, 0xf, 0x263, 0x302, 0x303, 0x5a, 0x26d, 0x238, 0x236, 0x30c, 0x239, 0x16f, 0x13b, 0x26c, 0x161, 0x1, 0x359, 0x237, 0x55, 0xe, 0x13a, 0x135, 0x356, 0x54, 0x357, 0x30d, 0x160, 0x358, 0x16e, 0x262, 0x5b, 0x134, 0xf, 0x263, 0x302, 0x303, 0x5a, 0x2bb, 0xce, 0x2a8, 0xe0, 0x301, 0x1cb, 0x3a, 0xbd, 0x2e8, 0x353, 0xed, 0x2b1, 0x44, 0x14d, 0xd4, 0x1c8, 0x3fe, 0x1ef, 0x119, 0x273, 0x1e7, 0xec, 0xa, 0x8a, 0x3e5, 0x34, 0x2c9, 0x235, 0x1d5, 0x1a4, 0x9b, 0x2b4, 0x1, 0x2bb, 0xce, 0x2a8, 0xe0, 0x301, 0x1cb, 0x3a, 0xbd, 0x2e8, 0x353, 0xed, 0x2b1, 0x44, 0x14d, 0xd4, 0x1c8, 0x3fe, 0x1ef, 0x119, 0x273, 0x1e7, 0xec, 0xa, 0x8a, 0x3e5, 0x34, 0x2c9, 0x235, 0x1d5, 0x1a4, 0x9b, 0x2b4, 0x1, 0x2bb, 0xce, 0x2a8, 0xe0, 0x301, 0x1cb, 0x3a, 0xbd, 0x2e8, 0x353, 0xed, 0x2b1, 0x44, 0x14d, 0xd4, 0x1c8, 0x3fe, 0x1ef, 0x119, 0x273, 0x1e7, 0xec, 0xa, 0x8a, 0x3e5, 0x34, 0x2c9, 0x235, 0x1d5, 0x1a4, 0x9b, 0x2b4, 0x1, 0x2bb, 0xce, 0x2a8, 0xe0, 0x301, 0x1cb, 0x3a, 0xbd, 0x2e8, 0x353, 0xed, 0x2b1, 0x44, 0x14d, 0xd4, 0x17f, 0x338, 0x16d, 0x21b, 0xf8, 0x23c, 0x13f, 0x57, 0x2c6, 0x1fd, 0x311, 0x4b, 0x304, 0x31c, 0x32b, 0x131, 0xb6, 0x1b2, 0x1e0, 0x3ac, 0x192, 0x253, 0x7d, 0x61, 0x1a3, 0x342, 0x378, 0x202, 0x1b0, 0x31e, 0x1d5, 0x348, 0x26c, 0x18d, 0x10, 0x3dd, 0x3ec, 0x2fd, 0x1f8, 0x39b, 0x388, 0x3d4, 0x179, 0x33, 0x3ef, 0x17c, 0xb9, 0x2c, 0x1ac, 0x2dc, 0x334, 0x372, 0x316, 0x23f, 0x2be, 0x116, 0x171, 0x3d9, 0x219, 0x206, 0x45, 0x3e5, 0x68, 0x336, 0x18c, 0x16f, 0xe5, 0x281, 0xe6, 0x100, 0x1a7, 0x2b7, 0x383, 0x3bf, 0x1ce, 0xfe, 0x137, 0x3bd, 0x330, 0x287, 0x3ed, 0x382, 0x2c0, 0x2f6, 0x193, 0x32c, 0x345, 0x10c, 0x3b8, 0x3ba, 0x144, 0x33d, 0x1e7, 0x1d8, 0x28, 0x59, 0x227, 0x289, 0x30c, 0xf6, 0x2dd, 0x24b, 0x4a, 0x27b, 0x24, 0x246, 0x32a, 0x4e, 0x38e, 0xdf, 0x3fb, 0x354, 0x3ae, 0x36c, 0x2fe, 0xfb, 0x37a, 0x1f8, 0x33f, 0x23b, 0x29f, 0x3bd, 0x269, 0x20e, 0x357, 0x5e, 0xa6, 0xd7, 0x22, 0x29a, 0x2a9, 0x17e, 0x87, 0x146, 0x386, 0x263, 0x26, 0x170, 0x145, 0x8d, 0x36e, 0x1a1, 0x378, 0xd, 0x2c9, 0xc6, 0x16f, 0x1ca, 0x216, 0x339, 0x24, 0x85, 0xb3, 0x270, 0x9e, 0x3d6, 0x307, 0x13a, 0x1ba, 0x1d, 0x17a, 0x36d, 0x2aa, 0x275, 0x18a, 0xc1, 0x18e, 0x32b, 0x262, 0x2d8, 0x18b, 0x23f, 0x175, 0x51, 0x39a, 0x1e7, 0x3b0, 0xa0, 0x2c8, 0x238, 0x194, 0x2b0, 0x3ee, 0x6, 0x21f, 0x21a, 0x30e, 0x19, 0x290, 0x81, 0x359, 0x19c, 0x16d, 0x3f, 0x3e0, 0x1c4, 0x3d4, 0x2f2, 0xcc, 0x347, 0x3ed, 0x30d, 0x312, 0x39d, 0x106, 0x151, 0xd4, 0x329, 0x397, 0x32e, 0x376, 0x1cf, 0x302, 0x2e, 0x2ad, 0x294, 0x36b, 0xb5, 0x6f, 0x284, 0xd8, 0x31e, 0x3aa, 0x13b, 0x344, 0xe6, 0x200, 0x295, 0x1f5, 0x3ec, 0x3e6, 0x3bf, 0x331, 0x3fb, 0x14b, 0x29e, 0x286, 0x25a, 0x3b2, 0x2aa, 0xe3, 0x221, 0x201, 0xd6, 0x1b1, 0x196, 0x283, 0x72, 0x3f5, 0x2cf, 0x1bb, 0x1cf, 0x20d, 0xb8, 0x145, 0x11a, 0x1a3, 0x113, 0x3e5, 0x1a0, 0x30c, 0x3d8, 0x183, 0x3c4, 0x282, 0x187, 0x19, 0x129, 0x204, 0x2fe, 0x1f6, 0x1f3, 0x3db, 0x39c, 0x3f9, 0x2a1, 0x14f, 0x143, 0x12d, 0x1d9, 0x155, 0x275, 0x314, 0x304, 0x6b, 0x2dc, 0xcb, 0x345, 0x39, 0x3fe, 0x363, 0x2d9, 0x2e3, 0x302, 0x5c, 0x2a6, 0x8d, 0x2d5, 0x28d, 0x3f6, 0xd0, 0x186, 0x1ec, 0x2c5, 0x1e2, 0x141, 0x2c7, 0x208, 0x290, 0x102, 0x17f, 0xfb, 0x2fd, 0x3e9, 0x1ce, 0x3f8, 0x354, 0x2a3, 0x2a5, 0x292, 0x2e8, 0x2ae, 0x33e, 0x18a, 0x182, 0x231, 0x16e, 0x261, 0x3a6, 0x218, 0x1ff, 0x3b5, 0x368, 0x375, 0x181, 0x2e, 0x153, 0x242, 0x36e, 0x342, 0x1fb, 0x68, 0x3ea, 0x3ab, 0x30f, 0x38e, 0x2f1, 0x307, 0xe1, 0x396, 0x349, 0xae, 0x33, 0x347, 0x3af, 0xbc, 0x139, 0x2d6, 0x124, 0x337, 0x391, 0xcd, 0x2ed, 0x10c, 0x1ff, 0x363, 0x1bb, 0x39e, 0x26, 0x1c9, 0x7d, 0x308, 0xa, 0xb2, 0x238, 0x259, 0x35a, 0x24e, 0x209, 0x2c3, 0x3aa, 0xe5, 0x25, 0x1fe, 0x89, 0x210, 0x91, 0x3a8, 0x338, 0x37a, 0x3e9, 0x39c, 0x3fb, 0x296, 0x26a, 0x1d, 0x1e1, 0x2b5, 0x3fa, 0x17c, 0x1c1, 0x312, 0x26f, 0x44, 0xfd, 0x19d, 0x257, 0x5b, 0x2c1, 0x77, 0x3ba, 0x232, 0x2eb, 0x162, 0x17, 0x153, 0x8d, 0x1a3, 0x226, 0x38f, 0x11b, 0xac, 0x3ee, 0x18, 0x1b8, 0x3a9, 0xd2, 0xd1, 0xe6, 0x12, 0x10a, 0x191, 0x28b, 0x38b, 0x2a8, 0x21b, 0x3c9, 0x23b, 0x26e, 0x3ae, 0x356, 0x292, 0x1d9, 0x2aa, 0x1c6, 0x96, 0x2c, 0x17b, 0x245, 0x151, 0x350, 0x2fc, 0x31, 0x9a, 0xf0, 0x2ab, 0x3dd, 0x2b7, 0x4e, 0x9e, 0x28f, 0x70, 0x7c, 0x1c4, 0x29f, 0x1d7, 0x356, 0x12d, 0x36d, 0x17d, 0x5f, 0x2e4, 0x312, 0xd7, 0x110, 0x3e1, 0x1e6, 0x262, 0x2ed, 0x218, 0x3f5, 0x32e, 0x386, 0x33c, 0x192, 0x171, 0x1e7, 0x1bf, 0x5a, 0x256, 0x36b, 0x1a1, 0x3f6, 0x340, 0x56, 0x3ee, 0x30, 0x2e9, 0x177, 0x13b, 0x216, 0x1fe, 0x112, 0x52, 0x81, 0x2fe, 0x3d1, 0x30f, 0x315, 0x3d6, 0xe, 0x20b, 0x23c, 0x3d4, 0x3bd, 0x36c, 0x2a0, 0x2e8, 0x2aa, 0x38c, 0x258, 0x160, 0x39d, 0x22, 0xfd, 0x33a, 0x14e, 0x2d8, 0x43, 0x2fb, 0x363, 0x376, 0x263, 0x130, 0xaf, 0x3bb, 0x3b0, 0x109, 0x34c, 0x1ee, 0xb5, 0x378, 0x68, 0x30c, 0x37b, 0x6, 0xdc, 0x3a9, 0x1a4, 0x344, 0x339, 0x120, 0x108, 0x91, 0x359, 0xfb, 0x3e6, 0x2e7, 0x37c, 0x307, 0x1c2, 0x243, 0x27e, 0x2f2, 0x269, 0x54, 0x5d, 0x157, 0x275, 0x4b, 0x3b3, 0x2ce, 0x270, 0x1f2, 0x154, 0x3f, 0x277, 0x3f9, 0x125, 0x374, 0x3a0, 0x15c, 0x198, 0x2a, 0x5d, 0x2ae, 0x1c6, 0x258, 0x2c0, 0x26f, 0x110, 0x3cb, 0x391, 0x334, 0x283, 0x390, 0x87, 0x4d, 0x1e0, 0x175, 0x119, 0x1df, 0x302, 0x2e0, 0xfa, 0x76, 0x140, 0x1a6, 0x1ee, 0x16a, 0x1fb, 0x340, 0xac, 0x3a3, 0x180, 0x2c3, 0x2b3, 0x24b, 0x152, 0x187, 0xc8, 0x2c2, 0x100, 0x85, 0x322, 0x75, 0x19c, 0x2fd, 0x377, 0x37c, 0x207, 0x301, 0x23c, 0x3a1, 0x2ef, 0x356, 0x25a, 0x1af, 0x3fa, 0x1f9, 0x2f, 0x139, 0x34a, 0x264, 0x6b, 0x2cd, 0x2ac, 0x2a9, 0x3cd, 0x229, 0x18b, 0x3b8, 0x3b5, 0x376, 0xcf, 0xc9, 0x171, 0x3ce, 0x2f5, 0x2d0, 0x121, 0x1a3, 0x8a, 0x8e, 0x259, 0x173, 0xa1, 0x360, 0x239, 0x2c5, 0x30b, 0xf4, 0x69, 0x1a2, 0x339, 0x240, 0x29, 0x81, 0x1f5, 0x35f, 0x4e, 0x13c, 0x22e, 0x380, 0x36f, 0x32a, 0x3a4, 0x31f, 0x2da, 0x3db, 0x1be, 0x207, 0x20b, 0xe2, 0x137, 0x2a3, 0x20a, 0x38d, 0x21d, 0x107, 0x115, 0x157, 0x1c6, 0xb9, 0x312, 0x35c, 0x124, 0x18e, 0x1b1, 0x156, 0x2a9, 0x393, 0xb6, 0x43, 0x3fe, 0x255, 0xf, 0x351, 0xa2, 0x371, 0x181, 0x2e0, 0x1f4, 0x1d8, 0x212, 0x256, 0x1b7, 0x226, 0x47, 0x259, 0x2e6, 0x284, 0x336, 0x3d8, 0x6, 0x370, 0x2ee, 0x1ca, 0x250, 0x2c7, 0xc8, 0x18d, 0x9, 0x21, 0x24c, 0x2bb, 0x3d1, 0x27, 0x13c, 0x55, 0x21b, 0x277, 0x3fb, 0x9d, 0x396, 0x27e, 0x3da, 0x2d1, 0x12d, 0x1af, 0x3fd, 0x3ed, 0x178, 0x3b4, 0x18a, 0x16, 0x1e5, 0x22, 0x3f4, 0x3cc, 0x334, 0x10f, 0x25b, 0x31, 0xd9, 0x77, 0x1ef, 0x1bb, 0xcf, 0x192, 0x1cd, 0x24f, 0x303, 0x2a6, 0xc2, 0x14, 0x332, 0x27f, 0xb5, 0x1fb, 0x289, 0x2b0, 0x127, 0x36, 0xc6, 0x1b3, 0x381, 0xf4, 0x2d7, 0xb3, 0x11f, 0x19c, 0x3e6, 0x315, 0x28f, 0x380, 0x33f, 0x3fb, 0x13a, 0x243, 0x3d4, 0x1d7, 0x286, 0x3c2, 0x21d, 0x20e, 0x5d, 0x2aa, 0x5f, 0x30d, 0x139, 0x133, 0x201, 0x2f6, 0x22, 0x3e1, 0x32b, 0x196, 0xd4, 0x3e2, 0x5b, 0x43, 0x3f5, 0x146, 0x78, 0x175, 0x6d, 0x1cf, 0x130, 0x171, 0x323, 0x303, 0x145, 0x308, 0xa0, 0x34c, 0x36b, 0x113, 0x47, 0xbb, 0x38a, 0xd, 0x30c, 0x3ee, 0x180, 0x31e, 0x36a, 0x3c4, 0xf4, 0x1a4, 0x216, 0x3eb, 0x19, 0x161, 0x200, 0x21, 0x91, 0x2fe, 0x2b7, 0x270, 0x3c1, 0x16d, 0x3db, 0x37c, 0xe, 0x7c, 0x23b, 0x2a1, 0x1ba, 0x349, 0x2f2, 0x36c, 0x12d, 0x35e, 0x3ef, 0x357, 0x3ad, 0x275, 0x258, 0x312, 0x2b1, 0x99, 0x6b, 0x326, 0x29a, 0x33a, 0x262, 0x345, 0x329, 0x31, 0x1b2, 0x1dc, 0x363, 0x386, 0x1d6, 0x51, 0x371, 0x302, 0x392, 0x3bb, 0x1bf, 0x2d0, 0x1a7, 0x2cc, 0xea, 0x1f6, 0x27, 0xf9, 0x159, 0x3e9, 0x37c, 0x1c, 0x1f0, 0x1fc, 0x24a, 0x325, 0x3d4, 0x3ae, 0x20a, 0x22f, 0x198, 0x150, 0x36d, 0x3fd, 0x3af, 0x3ad, 0xe3, 0x172, 0xa6, 0x34a, 0x304, 0x2f6, 0x44, 0x39f, 0x16e, 0x156, 0x2b6, 0x14e, 0x1d3, 0x390, 0x31, 0x364, 0x379, 0x32e, 0x1e, 0x2be, 0x6d, 0x39e, 0xc9, 0x39a, 0x25c, 0xb8, 0x1f4, 0x369, 0x168, 0x8d, 0x5, 0x332, 0x1ee, 0x342, 0x227, 0xbb, 0x31d, 0x34, 0x56, 0x297, 0x6c, 0x239, 0x205, 0x370, 0x3aa, 0x9f, 0x10d, 0x230, 0x281, 0x3f1, 0x19, 0x2c2, 0x12, 0x108, 0x102, 0x36f, 0xb3, 0x23e, 0x279, 0x30f, 0x13c, 0x154, 0x1f8, 0xdf, 0x7, 0x7c, 0x7f, 0x296, 0x1cb, 0xf5, 0x2ef, 0x286, 0x38d, 0x66, 0x54, 0x1d9, 0x1fd, 0x3ed, 0x1e9, 0x33e, 0x258, 0x22d, 0x2d6, 0xc1, 0x2b9, 0x11, 0x3e1, 0x25f, 0x251, 0x2a9, 0x34e, 0x322, 0x359, 0x35f, 0xe9, 0x237, 0x1f3, 0x223, 0x55, 0xfc, 0xdf, 0xe, 0x1f0, 0x3f8, 0x13a, 0x11e, 0x137, 0x135, 0x3a0, 0x1ed, 0x356, 0x1e1, 0x33, 0x54, 0x3b2, 0x3fd, 0x357, 0x2af, 0x311, 0x30d, 0xed, 0x314, 0x160, 0x35c, 0x132, 0x358, 0x11, 0x3cb, 0x16e, 0x2ac, 0x2ca, 0x262, 0x10f, 0x2fc, 0x5b, 0x10c, 0x327, 0x134, 0xee, 0x2cf, 0xf, 0x2be, 0xda, 0x263, 0x241, 0x1de, 0x302, 0x253, 0x3ce, 0x303, 0x11d, 0xec, 0x5a, 0x242, 0x5, 0x26d, 0x3b1, 0x226, 0x238, 0x34d, 0x2f9, 0x236, 0x2bd, 0x101, 0x30c, 0x3a3, 0x36, 0x239, 0x3, 0x1db, 0x16f, 0x1e2, 0x1e8, 0x13b, 0x250, 0x215, 0x26c, 0xff, 0x104, 0x161, 0x12, 0x210, 0x1, 0x34e, 0x322, 0x359, 0x35f, 0xe9, 0x237, 0x1f3, 0x223, 0x55, 0xfc, 0xdf, 0xe, 0x1f0, 0x3f8, 0x13a, 0x11e, 0x137, 0x135, 0x3a0, 0x1ed, 0x356, 0x295, 0x93, 0x2fe, 0x195, 0x11f, 0xfb, 0x4e, 0x3c1, 0x37a, 0x315, 0x55, 0x1f8, 0x37c, 0x70, 0x33f, 0x3e7, 0x20b, 0x23b, 0x125, 0x243, 0x29f, 0x135, 0x349, 0x3bd, 0x286, 0x22f, 0x269, 0x12d, 0x2c6, 0x20e, 0x2e8, 0x3fa, 0x357, 0x157, 0x5f, 0x5e, 0x2cb, 0x258, 0xa6, 0x133, 0x2c, 0xd7, 0x99, 0x358, 0x22, 0x337, 0x362, 0x29a, 0x1e6, 0x196, 0x2a9, 0x14e, 0x345, 0x17e, 0x5b, 0x218, 0x87, 0x1b2, 0x2fb, 0x146, 0x3c0, 0x1ef, 0x386, 0x2ab, 0x6d, 0x263, 0x8b, 0x371, 0x26, 0x171, 0x12e, 0x170, 0x3bb, 0x1e3, 0x145, 0x76, 0x5a, 0x8d, 0x14, 0x34c, 0x36e, 0x59, 0x33b, 0x1a1, 0x47, 0x1d1, 0x378, 0x236, 0x173, 0xd, 0x56, 0x24e, 0x2c9, 0x37b, 0x180, 0xc6, 0x306, 0x2e9, 0x16f, 0x3c4, 0x3a9, 0x1ca, 0x141, 0x230, 0x216, 0x367, 0x249, 0x339, 0x82, 0x161, 0x24, 0x52, 0x8, 0x85, 0x123, 0x24c, 0x3dd, 0x166, 0x3a8, 0x2b7, 0x341, 0x279, 0x4e, 0x38b, 0x1f3, 0x9e, 0x159, 0x377, 0x28f, 0x7e, 0x1be, 0x70, 0x277, 0x387, 0x7c, 0x3f8, 0xe1, 0x1c4, 0x14b, 0x325, 0x29f, 0x26a, 0x13f, 0x1d7, 0x3a, 0x179, 0x356, 0x38d, 0x330, 0x12d, 0x185, 0x2a, 0x36d, 0x3d7, 0x22a, 0x17d, 0x3d3, 0x2af, 0x5f, 0xbc, 0x33e, 0x2e4, 0x272, 0x221, 0x312, 0x34a, 0x16, 0xd7, 0x132, 0x17b, 0x110, 0x31c, 0x83, 0x3e1, 0x2dc, 0x14d, 0x1e6, 0x32c, 0x2b6, 0x262, 0x35, 0x393, 0x2ed, 0x25b, 0x229, 0x218, 0x10e, 0x2c1, 0x3f5, 0x4d, 0xee, 0x32e, 0xf0, 0x2f3, 0x386, 0x15f, 0x1b4, 0x33c, 0xa2, 0x2e3, 0x192, 0x1de, 0x13, 0x171, 0x25c, 0x1c9, 0x1e7, 0x20f, 0xfa, 0x1bf, 0x153, 0x3b, 0x5a, 0x11a, 0x50, 0x256, 0x285, 0x332, 0x36b, 0x114, 0x399, 0x1a1, 0x8e, 0x34d, 0x3f6, 0x328, 0x233, 0x340, 0x246, 0x122, 0x2d7, 0x24d, 0x1f5, 0xb3, 0x3a8, 0x167, 0x11f, 0x3ec, 0xe9, 0x19c, 0x27, 0x38b, 0x3e6, 0x278, 0x2da, 0x315, 0x154, 0x3bf, 0x28f, 0xfc, 0x2f1, 0x380, 0x331, 0x1c, 0x33f, 0x387, 0xf8, 0x3fb, 0x301, 0x7f, 0x13a, 0xe2, 0x14b, 0x243, 0x26e, 0x374, 0x3d4, 0x29e, 0x29b, 0x1d7, 0x74, 0x1ed, 0x286, 0xae, 0x2d1, 0x3c2, 0x330, 0x25a, 0x21d, 0x150, 0x2b5, 0x20e, 0x3b2, 0x3d7, 0x5d, 0x1fd, 0x2a7, 0x2aa, 0x3f2, 0x353, 0x5f, 0x178, 0xe3, 0x30d, 0x361, 0xb9, 0x139, 0x221, 0x22d, 0x133, 0xb0, 0x16b, 0x201, 0x26f, 0x132, 0x2f6, 0x49, 0xd6, 0x22, 0xc7, 0x245, 0x3e1, 0x1b1, 0x13d, 0x32b, 0x2ac, 0x27d, 0x196, 0x2b6, 0xcd, 0xd4, 0xa7, 0x283, 0x3e2, 0x372, 0x25b, 0x5b, 0x72, 0x62, 0x43, 0x247, 0x364, 0x3f5, 0x9a, 0x3b8, 0x146, 0x31b, 0x2cf, 0x78, 0x2f3, 0x305, 0x175, 0x85, 0x81, 0x295, 0x91, 0x2d7, 0x93, 0x3dd, 0x191, 0x2fe, 0xb3, 0x359, 0x195, 0xea, 0x2b7, 0x11f, 0x3d1, 0x3a4, 0xfb, 0x270, 0x19c, 0x4e, 0x237, 0x30f, 0x3c1, 0x3e6, 0xf9, 0x37a, 0x9e, 0x16d, 0x315, 0x2a8, 0x2e7, 0x55, 0x3db, 0x28f, 0x1f8, 0x3d6, 0x3f, 0x37c, 0x380, 0x26b, 0x70, 0x1ce, 0xe, 0x33f, 0x307, 0x3e0, 0x3e7, 0x7c, 0x3fb, 0x20b, 0x1fc, 0x1c2, 0x23b, 0x13a, 0x1c4, 0x125, 0x23c, 0x2a1, 0x243, 0xd5, 0x1cb, 0x29f, 0x1ba, 0x3d4, 0x135, 0x27e, 0x2a3, 0x349, 0x1d7, 0xe8, 0x3bd, 0x1d, 0x2f2, 0x286, 0x15c, 0x356, 0x22f, 0x36c, 0x3c2, 0x269, 0x17a, 0xcc, 0x12d, 0x21d, 0x2a0, 0x2c6, 0x54, 0x35e, 0x20e, 0x36d, 0x347, 0x2e8, 0x3ef, 0x5d, 0x3fa, 0x28e, 0x17d, 0x357, 0x2aa, 0x3ed, 0x157, 0x2f8, 0x3ad, 0x5f, 0x2f0, 0x38c, 0x5e, 0x275, 0x30d, 0x2cb, 0x2e4, 0x1da, 0x258, 0x10a, 0x204, 0x85, 0x102, 0x246, 0x81, 0x123, 0x244, 0x295, 0x122, 0x34e, 0x91, 0x1a7, 0x24c, 0x2d7, 0x126, 0x36f, 0x93, 0x3b3, 0x24d, 0x3dd, 0x322, 0x3ea, 0x191, 0x1f5, 0x2cc, 0x2fe, 0x166, 0x17f, 0xb3, 0x2bb, 0x25d, 0x359, 0x32a, 0x3a8, 0x195, 0x1d4, 0x2ce, 0xea, 0x167, 0x75, 0x2b7, 0x23e, 0x35f, 0x11f, 0x3ab, 0x28b, 0x3d1, 0x341, 0x3ec, 0x3a4, 0x1f6, 0x1d2, 0xfb, 0xe9, 0x279, 0x270, 0x338, 0x138, 0x19c, 0x9c, 0xce, 0x4e, 0x67, 0x27, 0x237, 0x217, 0x31f, 0x30f, 0x38b, 0x383, 0x3c1, 0x3c5, 0x3e4, 0x3e6, 0x1f2, 0x1f3, 0xf9, 0x2fd, 0x278, 0x37a, 0x13c, 0x1bd, 0x9e, 0x2da, 0x4f, 0x16d, 0x223, 0x2b2, 0x315, 0x159, 0x38e, 0x2a8, 0x1c7, 0x154, 0x2e7, 0xaa, 0x377, 0x55, 0x3bf, 0x22e, 0x3db, 0x117, 0x3e9, 0x28f, 0x3f0, 0x343, 0x1f8, 0x3a5, 0xfc, 0x3d6, 0x7e, 0x1eb, 0x3f, 0x214, 0x2, 0x21, 0x4, 0x42, 0x8, 0x84, 0x10, 0x108, 0x20, 0x210, 0x40, 0x29, 0x80, 0x52, 0x100, 0xa4, 0x200, 0x148, 0x9, 0x290, 0x12, 0x129, 0x24, 0x252, 0x48, 0xad, 0x90, 0x15a, 0x120, 0x2b4, 0x240, 0x161, 0x89, 0x2c2, 0x112, 0x18d, 0x224, 0x31a, 0x41, 0x23d, 0x82, 0x73, 0x104, 0xe6, 0x208, 0x1cc, 0x19, 0x398, 0x32, 0x339, 0x64, 0x27b, 0xc8, 0xff, 0x190, 0x1fe, 0x320, 0x3fc, 0x249, 0x3f1, 0x9b, 0x3eb, 0x136, 0x3df, 0x26c, 0x3b7, 0xd1, 0x367, 0x1a2, 0x2c7, 0x344, 0x187, 0x281, 0x30e, 0x10b, 0x215, 0x216, 0x23, 0x25, 0x46, 0x4a, 0x8c, 0x94, 0x118, 0x128, 0x230, 0x250, 0x69, 0xa9, 0xd2, 0x152, 0x1a4, 0x2a4, 0x348, 0x141, 0x299, 0x282, 0x13b, 0x10d, 0x276, 0x21a, 0xe5, 0x3d, 0x1ca, 0x7a, 0x394, 0xf4, 0x321, 0x1e8, 0x24b, 0x3d0, 0x9f, 0x3a9, 0x21, 0x8, 0x108, 0x40, 0x52, 0x200, 0x290, 0x24, 0xad, 0x120, 0x161, 0x112, 0x31a, 0x82, 0xe6, 0x19, 0x339, 0xc8, 0x1fe, 0x249, 0x3eb, 0x26c, 0x367, 0x344, 0x30e, 0x216, 0x46, 0x94, 0x230, 0xa9, 0x1a4, 0x141, 0x13b, 0x21a, 0x1ca, 0xf4, 0x24b, 0x3a9, 0x27c, 0x177, 0x3c4, 0x3aa, 0x21f, 0x16f, 0xdc, 0x36a, 0x2e9, 0x366, 0x365, 0x306, 0x31e, 0x6, 0xc6, 0x30, 0x239, 0x180, 0x1ec, 0x1b, 0x37b, 0xd8, 0x3ee, 0x2c9, 0x34f, 0x265, 0x24e, 0x30c, 0x254, 0x56, 0x284, 0x2b0, 0xd, 0x1ad, 0x68, 0x173, 0x340, 0x38a, 0x236, 0x6f, 0x194, 0x378, 0xbb, 0x3f6, 0x1d1, 0x38f, 0x293, 0x47, 0xb5, 0x238, 0x1a1, 0x1e4, 0x113, 0x33b, 0x8a, 0x1ee, 0x59, 0x36b, 0x2c8, 0x36e, 0x26d, 0x346, 0x34c, 0x206, 0x256, 0x14, 0x294, 0xa0, 0x8d, 0x109, 0x61, 0x5a, 0x308, 0x2d0, 0x76, 0x2ad, 0x42, 0x20, 0x52, 0x9, 0x252, 0x120, 0x2c2, 0x41, 0xe6, 0x32, 0xff, 0x249, 0x3df, 0x1a2, 0x30e, 0x25, 0x118, 0xa9, 0x348, 0x10d, 0x1ca, 0x1e8, 0x13e, 0x177, 0x381, 0x2b3, 0xdc, 0x2dd, 0x3b6, 0x306, 0x235, 0x18, 0x239, 0x300, 0x3b9, 0xd8, 0x3d5, 0x336, 0x24e, 0x211, 0x142, 0x2b0, 0x1a, 0x2bd, 0x340, 0x31d, 0xca, 0x378, 0x176, 0x3c3, 0x293, 0x8e, 0x2d4, 0x1e4, 0x226, 0xf7, 0x59, 0x2df, 0x332, 0x346, 0x291, 0xa, 0x294, 0x140, 0x234, 0x5a, 0x219, 0x352, 0x3b0, 0x28a, 0x2f5, 0x1f4, 0x20f, 0x2f7, 0x170, 0x24f, 0x253, 0x162, 0x2e2, 0x13, 0xef, 0x260, 0x1df, 0x8b, 0x39e, 0x144, 0x33c, 0xda, 0x351, 0x376, 0x2ea, 0x203, 0x1ef, 0xf0, 0x197, 0x23f, 0x28c, 0x379, 0x134, 0x3e3, 0x2c1, 0x87, 0x86, 0xc4, 0xe4, 0xb6, 0xbf, 0x2ed, 0x3cd, 0x10f, 0x14e, 0x1a8, 0x19a, 0x165, 0x84, 0x80, 0x290, 0x90, 0x2c2, 0x82, 0x398, 0x190, 0x3eb, 0x1a2, 0x215, 0x94, 0xd2, 0x282, 0x1ca, 0x3d0, 0xf1, 0x3aa, 0x6e, 0x2dd, 0x365, 0x3, 0x18c, 0x180, 0x3b9, 0x1b0, 0x34f, 0x186, 0xa1, 0x2b0, 0x34, 0x2e6, 0x236, 0x1bc, 0x176, 0x38f, 0x25e, 0x79, 0x113, 0xf7, 0xb2, 0x36e, 0x1a6, 0x5, 0x294, 0x280, 0xc2, 0x2d0, 0x1d8, 0x28a, 0x1e3, 0x3d9, 0x5c, 0x323, 0x253, 0x2c4, 0x39a, 0x98, 0x2eb, 0x8b, 0x335, 0x119, 0x1d6, 0x1bb, 0x2ea, 0xf, 0x3b5, 0x389, 0x146, 0x379, 0x268, 0x397, 0x225, 0x62, 0xe4, 0x16c, 0x2fc, 0x345, 0xa7, 0x1a8, 0x334, 0x19d, 0x156, 0x32b, 0x27a, 0x2cd, 0x337, 0x11, 0xd6, 0x92, 0x3ca, 0x182, 0x2b1, 0xb0, 0x266, 0xa6, 0x12c, 0x3b4, 0x30d, 0x1c6, 0x1e9, 0x2f8, 0x155, 0x2a7, 0x3fa, 0x174, 0x287, 0x35e, 0x150, 0x33, 0x17a, 0x1b6, 0x57, 0x286, 0x108, 0x200, 0xad, 0x112, 0xe6, 0xc8, 0x3eb, 0x344, 0x46, 0xa9, 0x13b, 0xf4, 0x27c, 0x3aa, 0xdc, 0x366, 0x31e, 0x30, 0x1ec, 0xd8, 0x34f, 0x30c, 0x284, 0x1ad, 0x340, 0x6f, 0xbb, 0x38f, 0xb5, 0x1e4, 0x8a, 0x36b, 0x26d, 0x206, 0x294, 0x109, 0x308, 0x2ad, 0x1bf, 0x1f4, 0x2e, 0x323, 0xaf, 0x302, 0xef, 0x192, 0x1cf, 0x288, 0x1d6, 0x376, 0x3ba, 0x78, 0x32e, 0x1dc, 0x134, 0x397, 0x43, 0x188, 0x329, 0x2ed, 0x32f, 0xd4, 0x334, 0x33a, 0x151, 0x16e, 0x3e1, 0x106, 0x6b, 0x92, 0x39d, 0x201, 0x1a5, 0x312, 0x4b, 0x1da, 0x30d, 0x38c, 0x3ad, 0x3ed, 0x17d, 0x5d, 0x347, 0x35e, 0x2a0, 0xcc, 0x3c2, 0x356, 0x2f2, 0xe8, 0x2a3, 0x3d4, 0x1cb, 0x2a1, 0x1c4, 0x1c2, 0x3fb, 0x3e0, 0xe, 0x26b, 0x3f, 0x28f, 0x2e7, 0x16d, 0xf9, 0x30f, 0x19c, 0x3a4, 0x2b7, 0x359, 0x191, 0x2d7, 0x81, 0x21, 0x210, 0x12, 0x161, 0x104, 0xff, 0x26c, 0x215, 0x250, 0x13b, 0x1e8, 0x1e2, 0x16f, 0x1db, 0x3, 0x239, 0x36, 0x3a3, 0x30c, 0x101, 0x2bd, 0x236, 0x2f9, 0x34d, 0x238, 0x226, 0x3b1, 0x26d, 0x5, 0x242, 0x5a, 0xec, 0x11d, 0x303, 0x3ce, 0x253, 0x302, 0x1de, 0x241, 0x263, 0xda, 0x2be, 0xf, 0x2cf, 0xee, 0x134, 0x327, 0x10c, 0x5b, 0x2fc, 0x10f, 0x262, 0x2ca, 0x2ac, 0x16e, 0x3cb, 0x11, 0x358, 0x132, 0x35c, 0x160, 0x314, 0xed, 0x30d, 0x311, 0x2af, 0x357, 0x3fd, 0x3b2, 0x54, 0x33, 0x1e1, 0x356, 0x1ed, 0x3a0, 0x135, 0x137, 0x11e, 0x13a, 0x3f8, 0x1f0, 0xe, 0xdf, 0xfc, 0x55, 0x223, 0x1f3, 0x237, 0xe9, 0x35f, 0x359, 0x322, 0x34e, 0x1, 0x210, 0x12, 0x161, 0x104, 0xff, 0x26c, 0x215, 0x250, 0x13b, 0x1e8, 0x1e2, 0x16f, 0x1db, 0x3, 0x239, 0x36, 0x3a3, 0x30c, 0x101, 0x2bd, 0x236, 0x29, 0x48, 0x31a, 0x64, 0x3df, 0x216, 0xd2, 0x3d, 0x27c, 0x2b3, 0x1db, 0x6, 0xf6, 0x1b0, 0x24e, 0x158, 0xd0, 0x6f, 0x2ec, 0x8e, 0x113, 0x3b1, 0xd3, 0x14, 0x234, 0x1a9, 0x1bf, 0x3d9, 0x2e0, 0x162, 0x273, 0x324, 0x263, 0x1b4, 0x2ea, 0x78, 0xa3, 0x1ff, 0x18b, 0xc4, 0x25b, 0x345, 0x131, 0x2ca, 0x151, 0x1b1, 0x267, 0x110, 0x3ca, 0xb, 0x133, 0x298, 0x1c1, 0x38c, 0x2af, 0x2a7, 0x3ef, 0x1af, 0x149, 0x269, 0xae, 0x3a, 0x2a3, 0x34b, 0x8f, 0x13a, 0x3f9, 0x3c9, 0x70, 0x1eb, 0x3bf, 0x16d, 0x3e4, 0x9c, 0x3d1, 0x3a8, 0x322, 0x295, 0x4, 0xa4, 0x120, 0x73, 0x190, 0x367, 0x4a, 0x348, 0xf4, 0x1e2, 0x2de, 0x365, 0x18, 0x3d8, 0x2c9, 0x12a, 0x169, 0x340, 0x1bc, 0x3a2, 0x238, 0x45, 0x2df, 0x34c, 0x50, 0xc2, 0x2ad, 0x2f5, 0x37f, 0x392, 0x181, 0x1de, 0x8b, 0x19e, 0x2d9, 0x3ba, 0x52, 0x120, 0xe6, 0x249, 0x30e, 0xa9, 0x1ca, 0x177, 0xdc, 0x306, 0x239, 0xd8, 0x24e, 0x2b0, 0x340, 0x378, 0x293, 0x1e4, 0x59, 0x346, 0x294, 0x5a, 0x3b0, 0x1f4, 0x170, 0x162, 0xef, 0x8b, 0x33c, 0x376, 0x1ef, 0x23f, 0x134, 0x87, 0xe4, 0x2ed, 0x14e, 0x165, 0x151, 0x362, 0x18e, 0x92, 0xd7, 0x160, 0x4b, 0x2cb, 0x2f0, 0x3ed, 0x3fa, 0x36d, 0x2a0, 0x269, 0x15c, 0xe8, 0x135, 0xd5, 0x1c4, 0x20b, 0x307, 0x26b, 0x1f8, 0x2a8, 0xf9, 0x4e, 0x3d1, 0x359, 0x93, 0x85, 0x40, 0xad, 0x82, 0x1fe, 0x344, 0x230, 0x21a, 0x27c, 0x16f, 0x365, 0x30, 0x37b, 0x265, 0x284, 0x173, 0x194, 0x38f, 0x1a1, 0x1ee, 0x26d, 0x14, 0x61, 0x2ad, 0x1e3, 0x1e7, 0xaf, 0x26, 0x3be, 0x288, 0x2ab, 0xf, 0x32e, 0x2fb, 0x18b, 0x188, 0x17e, 0x21e, 0x334, 0x1e6, 0xfd, 0x106, 0x358, 0xc1, 0x1a5, 0xa6, 0x2e4, 0xa4, 0x89, 0x339, 0xd1, 0x118, 0x21a, 0xf1, 0x1b5, 0x31e, 0x300, 0x3a3, 0x56, 0xd0, 0x1bc, 0x293, 0x3c8, 0x164, 0x206, 0x11a, 0x352, 0x1e3, 0x3ce, 0x2bc, 0x130, 0x39e, 0x1b4, 0x3ba, 0x389, 0x9a, 0x87, 0x1c8, 0x3a6, 0x262, 0x27d, 0x27a, 0x106, 0x2b9, 0x304, 0x133, 0x272, 0x2f, 0x2f8, 0x2fa, 0x3b2, 0x2a0, 0xdb, 0x179, 0x349, 0x374, 0x296, 0x1fc, 0x3c9, 0x1c0, 0x28f, 0x223, 0x383, 0xfb, 0x1d4, 0x24d, 0x85, 0x80, 0x2b4, 0x19, 0x3df, 0x4a, 0x13b, 0x35b, 0x6e, 0x306, 0x7b, 0x360, 0x254, 0x35a, 0xca, 0x38f, 0x342, 0x3b1, 0x34c, 0x140, 0x3b, 0x23a, 0x5c, 0xb1, 0xef, 0x116, 0xeb, 0x386, 0x2cf, 0x379, 0x18b, 0x310, 0x1f1, 0xd4, 0x32c, 0xb7, 0x337, 0x220, 0x26f, 0x160, 0x96, 0x33e, 0x3ad, 0x2a7, 0x3a7, 0x2c6, 0x2f4, 0x143, 0x1d7, 0x3a1, 0x11e, 0x1c2, 0x3c7, 0x331, 0x1f8, 0x148, 0x224, 0x1fe, 0x10b, 0x348, 0x3a9, 0x6e, 0x205, 0x1ec, 0x336, 0x101, 0x38a, 0x2ec, 0x79, 0x59, 0x103, 0x11a, 0x2ad, 0x385, 0x24f, 0x39a, 0x241, 0x271, 0x386, 0x197, 0x1ff, 0x43, 0x16c, 0x257, 0x165, 0x14d, 0x245, 0x358, 0x304, 0x266, 0x1da, 0x178, 0x3d3, 0x3ef, 0x163, 0x2f4, 0x286, 0x355, 0x137, 0x1c4, 0x3e, 0x1c, 0x3d6, 0x38e, 0x3c5, 0xfb, 0x3a8, 0x126, 0x21, 0x12, 0x23d, 0x249, 0x23, 0x282, 0x27c, 0x1b5, 0x235, 0x1b, 0x127, 0x169, 0x236, 0x3c3, 0x342, 0x36b, 0x12b, 0x212, 0x3b0, 0x3d9, 0x32d, 0x26, 0x2e3, 0xda, 0x3ba, 0x31b, 0x268, 0x31, 0xbf, 0x35, 0x196, 0xb7, 0x267, 0x92, 0x35c, 0x22d, 0x2e4, 0x22b, 0x15d, 0x2e8, 0x150, 0xdb, 0x2f2, 0x13f, 0x396, 0x13a, 0x3f7, 0x39c, 0x1f8, 0x2b2, 0x38b, 0x3a4, 0x25d, 0x1a7, 0x8, 0x252, 0x104, 0x3eb, 0x4a, 0x276, 0x177, 0x290, 0x82, 0x3eb, 0x94, 0x1ca, 0x3aa, 0x365, 0x180, 0x34f, 0x2b0, 0x236, 0x38f, 0x113, 0x36e, 0x294, 0x2d0, 0x1e3, 0x323, 0x39a, 0x8b, 0x1d6, 0xf, 0x146, 0x397, 0xe4, 0x345, 0x334, 0x32b, 0x337, 0x92, 0x2b1, 0xa6, 0x30d, 0x2f8, 0x3fa, 0x35e, 0x17a, 0x286, 0x2a3, 0xd5, 0x23b, 0x3e0, 0x380, 0x55, 0xf9, 0x270, 0x195, 0x2d7, 0x8, 0xad, 0x19, 0x367, 0xa9, 0x24b, 0x16f, 0x31e, 0x1b, 0x24e, 0x1ad, 0x194, 0x47, 0x8a, 0x346, 0x8d, 0x2ad, 0x303, 0x12e, 0xef, 0x51, 0x2ab, 0x78, 0x222, 0x87, 0x329, 0x21e, 0x196, 0x16e, 0x18e, 0x99, 0x1a5, 0x139, 0x5e, 0x3ed, 0x3ef, 0x2c6, 0x3c2, 0x1d, 0x135, 0x2a1, 0x1fc, 0x33f, 0x3f, 0x2a8, 0x3c1, 0x3a4, 0xb3, 0x295, 0x40, 0x161, 0xc8, 0x30e, 0x141, 0x27c, 0x36a, 0xc6, 0xd8, 0x254, 0x173, 0xbb, 0x238, 0x59, 0x206, 0x61, 0x145, 0x129, 0x208, 0x367, 0x152, 0x13e, 0x36a, 0x18c, 0x360, 0x284, 0x31d, 0x34d, 0x33b, 0xd3, 0x280, 0x3b0, 0x37f, 0x2bc, 0x192, 0x271, 0x203, 0x146, 0x327, 0x390, 0x21e, 0x32c, 0x1b1, 0x6b, 0x182, 0xc5, 0x2cb, 0x353, 0x22a, 0x54, 0xdb, 0x3da, 0x3d4, 0x71, 0x3e, 0x70, 0x117, 0x278, 0x270, 0x32a, 0x34e, 0x40, 0x2c2, 0x320, 0x46, 0x3d, 0x30b, 0x306, 0x3d8, 0x186, 0x68, 0x2f9, 0x2d4, 0x36b, 0xa5, 0x168, 0x1e3, 0x24f, 0x273, 0x51, 0x15f, 0x1e0, 0x134, 0x62, 0x1f1, 0x2a9, 0x2a2, 0x83, 0x2f6, 0x58, 0x12c, 0x38c, 0x15d, 0x3b2, 0x12d, 0x2a5, 0x355, 0xd5, 0x7f, 0x39b, 0x3f, 0x159, 0x31f, 0x11f, 0x322, 0x214, 0x24, 0x1cc, 0x1a2, 0x1a4, 0x35b, 0x370, 0x30, 0x3d5, 0x158, 0x236, 0x317, 0x45, 0x346, 0x11a, 0x2a6, 0x2e, 0x2c4, 0x1df, 0x6d, 0x37d, 0xee, 0x18b, 0xb6, 0xa7, 0x33a, 0x252, 0x32, 0x30e, 0x10d, 0x381, 0x306, 0x3b9, 0x211, 0x340, 0x3c3, 0x226, 0x346, 0x234, 0x28a, 0x170, 0x13, 0x39e, 0x376, 0x197, 0x3e3, 0xe4, 0x10f, 0x32c, 0x362, 0x1ac, 0xb, 0x4b, 0x1c6, 0x15d, 0x36d, 0xbd, 0x105, 0x135, 0x296, 0x3ff, 0x26b, 0x377, 0x3c5, 0x3d1, 0x3ea, 0x2, 0xad, 0x64, 0x215, 0x21a, 0x30b, 0x205, 0x37b, 0x2b, 0x289, 0x38f, 0x45, 0x285, 0x61, 0x11d, 0x2e0, 0x26, 0x335, 0x2e5, 0x32e, 0x3cf, 0x1c8, 0x21e, 0x251, 0x2cd, 0x358, 0x16, 0x96, 0x38c, 0x2ba, 0x2d3, 0x17a, 0x20a, 0x26a, 0x125, 0x3f7, 0xdf, 0x2e7, 0x383, 0x3ab, 0x3dd, 0x4, 0x15a, 0xc8, 0x23, 0x3d, 0x21f, 0x3, 0x2ff, 0x56, 0x11b, 0x317, 0x8a, 0x103, 0xc2, 0x23a, 0x1c9, 0x4c, 0x263, 0x1c3, 0x255, 0x397, 0x390, 0x35, 0xab, 0x193, 0x2b9, 0x2c, 0x12c, 0x311, 0x17d, 0x1af, 0x2f4, 0x1d, 0xad, 0xc8, 0x46, 0xf4, 0xdc, 0x30, 0x34f, 0x1ad, 0xbb, 0x1e4, 0x26d, 0x109, 0x1bf, 0x323, 0xef, 0x288, 0x3ba, 0x1dc, 0x43, 0x2ed, 0x334, 0x16e, 0x6b, 0x201, 0x4b, 0x38c, 0x17d, 0x35e, 0x3c2, 0xe8, 0x1cb, 0x1c2, 0xe, 0x28f, 0xf9, 0x3a4, 0x191, 0x21, 0x120, 0x1fe, 0x94, 0x24b, 0x36a, 0x239, 0x265, 0x68, 0x3f6, 0x113, 0x346, 0x61, 0x23a, 0x392, 0x130, 0x33c, 0xf, 0x222, 0x31, 0x3e2, 0x165, 0xfd, 0x110, 0x2b1, 0x139, 0x2f0, 0x28e, 0x54, 0x36c, 0x1d7, 0xd5, 0x1fc, 0x1ce, 0x3db, 0x3e6, 0x3d1, 0x3dd, 0x8, 0x161, 0x249, 0x230, 0x3a9, 0x2e9, 0x180, 0x24e, 0x173, 0x1d1, 0x33b, 0x34c, 0x5a, 0x1e3, 0x12e, 0x371, 0x6d, 0x1ef, 0x2fb, 0x218, 0x345, 0x196, 0x362, 0x358, 0x2c, 0x258, 0x5f, 0x3fa, 0x2c6, 0x22f, 0x349, 0x243, 0x20b, 0x70, 0x55, 0x3c1, 0x11f, 0x93, 0x108, 0x15a, 0x320, 0x230, 0x35b, 0x3b6, 0x1b, 0xa1, 0x233, 0xb5, 0x2df, 0x242, 0x145, 0x2e0, 0x98, 0x33c, 0x1e, 0x9a, 0x188, 0x257, 0xf3, 0x337, 0x132, 0xc5, 0x275, 0x15d, 0x1af, 0x3c2, 0x1d0, 0x325, 0x20b, 0xe0, 0x154, 0x237, 0x1d4, 0x244, 0x290, 0x32, 0x23, 0xf4, 0x1b8, 0xc0, 0x24e, 0x2e6, 0x34d, 0x1ee, 0xa5, 0x352, 0x2e, 0x20d, 0x335, 0x386, 0x28c, 0x21c, 0x3e2, 0x2ca, 0x3f4, 0x92, 0x34a, 0x361, 0x157, 0x1d9, 0xbd, 0x1d, 0x374, 0xe1, 0xe, 0x117, 0x3e4, 0x11f, 0x126, 0x29, 0x82, 0x2c7, 0x10d, 0x21f, 0xc, 0x3a3, 0x1ad, 0x176, 0x399, 0x34c, 0xb4, 0x385, 0x162, 0x375, 0x1bb, 0x32e, 0x327, 0xbf, 0x2a9, 0x13d, 0x88, 0x2b1, 0x272, 0x3d2, 0x5d, 0x149, 0x143, 0x135, 0x24a, 0x387, 0x3d6, 0x13c, 0x1d2, 0x191, 0x42, 0x89, 0x3eb, 0x152, 0x1e2, 0x306, 0x2ff, 0x158, 0x194, 0x2b4, 0x9b, 0x1a4, 0x1d5, 0x235, 0x2c9, 0x34, 0x3e5, 0x8a, 0xa, 0xec, 0x1e7, 0x273, 0x119, 0x1ef, 0x3fe, 0x1c8, 0xd4, 0x14d, 0x44, 0x2b1, 0xed, 0x353, 0x2e8, 0xbd, 0x3a, 0x1cb, 0x301, 0xe0, 0x2a8, 0xce, 0x2bb, 0x1, 0x2b4, 0x9b, 0x1a4, 0x1d5, 0x235, 0x2c9, 0x34, 0x3e5, 0x8a, 0xa, 0xec, 0x1e7, 0x273, 0x119, 0x1ef, 0x3fe, 0x1c8, 0xd4, 0x14d, 0x44, 0x2b1, 0xed, 0x353, 0x2e8, 0xbd, 0x3a, 0x1cb, 0x301, 0xe0, 0x2a8, 0xce, 0x2bb, 0x1, 0x2b4, 0x9b, 0x1a4, 0x1d5, 0x235, 0x2c9, 0x34, 0x3e5, 0x8a, 0xa, 0xec, 0x1e7, 0x273, 0x119, 0x1ef, 0x3fe, 0x1c8, 0xd4, 0x14d, 0x44, 0x2b1, 0xed, 0x353, 0x2e8, 0xbd, 0x3a, 0x1cb, 0x301, 0xe0, 0x2a8, 0xce, 0x2bb, 0x1, 0x2b4, 0x9b, 0x1a4, 0x1d5, 0x235, 0x2c9, 0x34, 0x3e5, 0x8a, 0xa, 0xec, 0x1e7, 0x273, 0x119, 0x1ef, 0x161, 0x26c, 0x13b, 0x16f, 0x239, 0x30c, 0x236, 0x238, 0x26d, 0x5a, 0x303, 0x302, 0x263, 0xf, 0x134, 0x5b, 0x262, 0x16e, 0x358, 0x160, 0x30d, 0x357, 0x54, 0x356, 0x135, 0x13a, 0xe, 0x55, 0x237, 0x359, 0x1, 0x161, 0x26c, 0x13b, 0x16f, 0x239, 0x30c, 0x236, 0x238, 0x26d, 0x5a, 0x303, 0x302, 0x263, 0xf, 0x134, 0x5b, 0x262, 0x16e, 0x358, 0x160, 0x30d, 0x357, 0x54, 0x356, 0x135, 0x13a, 0xe, 0x55, 0x237, 0x359, 0x1, 0x161, 0x26c, 0x13b, 0x16f, 0x239, 0x30c, 0x236, 0x238, 0x26d, 0x5a, 0x303, 0x302, 0x263, 0xf, 0x134, 0x5b, 0x262, 0x16e, 0x358, 0x160, 0x30d, 0x357, 0x54, 0x356, 0x135, 0x13a, 0xe, 0x55, 0x237, 0x359, 0x1, 0x161, 0x26c, 0x13b, 0x16f, 0x239, 0x30c, 0x236, 0x238, 0x26d, 0x5a, 0x303, 0x302, 0x263, 0xf, 0x134, 0x5b, 0x262, 0x16e, 0x358, 0x160, 0x30d, 0x2c2, 0x1a2, 0x1ca, 0x2dd, 0x3b9, 0x2b0, 0x176, 0xf7, 0x294, 0x28a, 0x253, 0x8b, 0x2ea, 0x379, 0xe4, 0x1a8, 0x27a, 0x92, 0x266, 0x1c6, 0x3fa, 0x33, 0x3da, 0xd5, 0x3ff, 0x1eb, 0xf9, 0x23e, 0x244, 0xad, 0x9b, 0x299, 0x16f, 0x7b, 0x2b, 0x194, 0x3c8, 0x12b, 0x2ad, 0x2e0, 0xc9, 0x2ab, 0x77, 0x10c, 0x21e, 0x2a2, 0x88, 0x1a5, 0x19f, 0x2ba, 0x2c6, 0x2b8, 0x34b, 0x1fc, 0xdf, 0x4f, 0x3a4, 0x126, 0x148, 0xc8, 0x69, 0x1d5, 0xc6, 0xc3, 0x11b, 0x238, 0xd3, 0x168, 0x2e, 0x4c, 0xeb, 0x3c0, 0x316, 0x3a6, 0xab, 0x20c, 0x35c, 0x1da, 0x2ae, 0x1af, 0x22f, 0xf5, 0x319, 0x1ce, 0x1c7, 0x138, 0x191, 0x210, 0x208, 0x46, 0x35b, 0x18f, 0x2c9, 0xd0, 0x227, 0x2c8, 0x212, 0x385, 0x302, 0xcf, 0x3c, 0x1b2, 0x1b9, 0xcb, 0x326, 0x333, 0x298, 0x3ad, 0x1d9, 0x1e1, 0x349, 0x71, 0x39b, 0x3db, 0x18d, 0x281, 0x24b, 0x183, 0x3d5, 0x173, 0x25e, 0x2d5, 0x308, 0x2f7, 0x1de, 0x368, 0xa3, 0x62, 0x14e, 0xb7, 0x2b9, 0x312, 0x178, 0xba, 0x17a, 0x3a0, 0x71, 0x33f, 0x377, 0x9c, 0x191, 0x29, 0x32, 0x230, 0x1d5, 0x18c, 0x30c, 0xca, 0x3c8, 0x256, 0x2a6, 0x32d, 0x8b, 0x1dd, 0x1ff, 0x329, 0x2b6, 0x3cb, 0xc1, 0x12c, 0x1f9, 0x20e, 0x1ab, 0x26a, 0x1c2, 0x1c0, 0x2da, 0x3d1, 0x34e, 0x48, 0x3eb, 0x10d, 0x1b8, 0x1b, 0x202, 0x3e5, 0x59, 0x280, 0x3c6, 0x302, 0x19e, 0xf0, 0x18b, 0x3a6, 0x156, 0x22, 0x2d6, 0x19f, 0x17d, 0x30a, 0x1ed, 0xd5, 0x3f7, 0x3a5, 0x3c1, 0x3a8, 0x2, 0x31a, 0x10b, 0x9f, 0x306, 0x3a3, 0x2e6, 0xb5, 0x1a3, 0x219, 0x1e7, 0x3bc, 0x2d9, 0x146, 0xc4, 0x29c, 0x16e, 0x17b, 0x22d, 0x2f0, 0x174, 0x2f4, 0x349, 0xe2, 0x277, 0x2e7, 0x138, 0x322, 0x52, 0x64, 0x69, 0x3aa, 0x31a, 0x216, 0x27c, 0x6, 0x24e, 0x6f, 0x113, 0x14, 0x1bf, 0x162, 0x263, 0x78, 0x18b, 0x345, 0x151, 0x110, 0x133, 0x38c, 0x3ef, 0x269, 0x2a3, 0x13a, 0x70, 0x16d, 0x3d1, 0x295, 0x120, 0x367, 0xf4, 0x365, 0x2c9, 0x340, 0x238, 0x34c, 0x2ad, 0x392, 0x8b, 0x3ba, 0x3f5, 0x17e, 0x33a, 0x18e, 0x2c, 0x30d, 0x28e, 0x12d, 0xe8, 0x23c, 0x33f, 0x2e7, 0x270, 0x93, 0x290, 0x249, 0x13b, 0x36a, 0x37b, 0x1ad, 0x293, 0x36e, 0x308, 0x1e7, 0x371, 0x376, 0x222, 0x5b, 0x334, 0x326, 0xd7, 0x1da, 0x2aa, 0x2c6, 0x2f2, 0xd5, 0x3e7, 0x28f, 0x237, 0x2fe, 0x40, 0x339, 0xa9, 0x21f, 0x180, 0x284, 0x3f6, 0x59, 0x109, 0x303, 0x26, 0x1d6, 0x23f, 0x218, 0xd4, 0xfd, 0x99, 0x4b, 0x2f8, 0x20e, 0x356, 0x1ba, 0x20b, 0x3f, 0x3e6, 0x195, 0x21, 0x82, 0x46, 0x177, 0xc6, 0x30c, 0x194, 0x33b, 0x294, 0x23a, 0x23d, 0x4a, 0x3c4, 0x60, 0x142, 0x3f6, 0xb2, 0x2d, 0x2e, 0x260, 0x2be, 0x2fb, 0x25b, 0x19d, 0x18e, 0x58, 0x2f, 0x5d, 0x2f4, 0x13f, 0x23b, 0xdf, 0x278, 0xea, 0x2, 0x73, 0x94, 0x381, 0xc0, 0x284, 0x3e5, 0x164, 0x5a, 0x5c, 0xc9, 0x175, 0x1ff, 0xbf, 0x33a, 0x31c, 0xb0, 0x5e, 0xba, 0x1e1, 0x27e, 0x7f, 0x1be, 0xf9, 0x1d4, 0x4, 0xe6, 0x128, 0x30b, 0x180, 0x101, 0x3c3, 0x2c8, 0xb4, 0xb8, 0x192, 0x2ea, 0x3fe, 0x17e, 0x27d, 0x231, 0x160, 0xbc, 0x174, 0x3c2, 0xf5, 0xfe, 0x37c, 0x1f2, 0x3a8, 0x8, 0x1cc, 0x250, 0x21f, 0x300, 0x202, 0x38f, 0x199, 0x168, 0x170, 0x324, 0x1dd, 0x3f5, 0x2fc, 0xf3, 0x6b, 0x2c0, 0x178, 0x2e8, 0x38d, 0x1ea, 0x1fc, 0x2f1, 0x3e4, 0x359, 0x10, 0x398, 0xa9, 0x37, 0x209, 0xd, 0x317, 0x332, 0x2d0, 0x2e0, 0x241, 0x3ba, 0x3e3, 0x1f1, 0x1e6, 0x73, 0x128, 0x21f, 0x209, 0x1a, 0x47, 0x1a6, 0x153, 0xaf, 0x144, 0x2cf, 0x31, 0x131, 0x2cd, 0xd7, 0x361, 0x2fa, 0xcc, 0x355, 0x274, 0x380, 0x1f3, 0x32a, 0x108, 0x64, 0x348, 0x36a, 0x1f7, 0x2e6, 0x1a1, 0xa, 0x37e, 0x302, 0xeb, 0x77, 0xe4, 0x2b6, 0x267, 0x2c, 0x2f, 0xba, 0x3c2, 0x1ea, 0x3f8, 0x3d6, 0x31f, 0x1f5, 0x200, 0x3f1, 0x3d, 0x365, 0x336, 0x65, 0x33b, 0x242, 0x3e8, 0xef, 0x1bb, 0x4d, 0x2d8, 0x251, 0x44, 0x133, 0x22b, 0x287, 0x356, 0x2e1, 0xf8, 0x3db, 0x138, 0x126, 0xad, 0x1a2, 0x9f, 0x6, 0x12a, 0x2f9, 0x59, 0x2d, 0x5c, 0x192, 0x1dd, 0x3e3, 0x3e2, 0x391, 0x2b9, 0xa6, 0x2af, 0x2b5, 0x2f2, 0x354, 0x207, 0x2a8, 0x3ec, 0x123, 0x112, 0x23, 0x2ee, 0x239, 0x158, 0x3a2, 0x36e, 0x3b, 0x24f, 0x1cf, 0x3c, 0x316, 0x21e, 0x27a, 0x132, 0x258, 0x3af, 0x149, 0xe8, 0xe6, 0xa9, 0xdc, 0xd8, 0x340, 0x1e4, 0x294, 0x1f4, 0xef, 0x376, 0x134, 0x2ed, 0x151, 0x92, 0x4b, 0x3ed, 0x2a0, 0xe8, 0x1c4, 0x26b, 0xf9, 0x359, 0x40, 0x1fe, 0x21a, 0x365, 0x265, 0x194, 0x1ee, 0x61, 0x1e7, 0x3be, 0xf, 0x18b, 0x21e, 0xfd, 0xc1, 0x2e4, 0x28e, 0x17a, 0x27e, 0x1fc, 0x3d6, 0x237, 0x3dd, 0x24, 0x367, 0x3a9, 0xc6, 0x56, 0x1d1, 0x36e, 0x76, 0x12e, 0x263, 0x3c0, 0x218, 0x2a9, 0x337, 0x2c, 0x5e, 0x2e8, 0x22f, 0x29f, 0x3e7, 0x55, 0xfb, 0x295, 0x112, 0x46, 0x3aa, 0x1ec, 0x1ad, 0xb5, 0x206, 0x1bf, 0x302, 0x1d6, 0x1dc, 0x329, 0x33a, 0x6b, 0x312, 0x3ad, 0x35e, 0x2f2, 0x2a1, 0xe, 0x16d, 0x2b7, 0x21, 0x19, 0x1a4, 0x36a, 0x3ee, 0x38a, 0x113, 0xa0, 0x303, 0x130, 0x175, 0x3f5, 0x3e2, 0x32b, 0x2f6, 0x139, 0x2aa, 0x21d, 0x1d7, 0x13a, 0x380, 0x3e6, 0xb3, 0x52, 0x1cc, 0x2a4, 0x2e9, 0x19b, 0xca, 0x1ee, 0xc2, 0x395, 0x1cf, 0xf0, 0x10c, 0x2a9, 0x267, 0xb0, 0x2f0, 0x2d3, 0x179, 0x2a1, 0x1c, 0x1bd, 0x195, 0x210, 0x320, 0x1ca, 0x205, 0x12a, 0x3f6, 0x199, 0x352, 0xaf, 0x119, 0xa3, 0x5b, 0x32c, 0x88, 0x18a, 0x1f9, 0x150, 0xe8, 0x388, 0x1be, 0x3c1, 0x1f5, 0x12, 0x367, 0x35b, 0x318, 0x2b0, 0x12f, 0x103, 0x1bf, 0x20d, 0x351, 0x2fb, 0x2fc, 0x391, 0x2f6, 0x272, 0x2ba, 0xcc, 0x14f, 0x301, 0x1f8, 0x9c, 0x24c, 0x161, 0x25, 0x30b, 0x1b, 0xd0, 0xf2, 0x294, 0x3e8, 0x3bc, 0x386, 0x364, 0x10f, 0xfd, 0x182, 0x382, 0x5d, 0x38d, 0x34b, 0x3e7, 0xaa, 0x3ec, 0x85, 0x104, 0xd2, 0x36a, 0x3d5, 0x233, 0x8a, 0x212, 0xb8, 0x8b, 0x3de, 0x21c, 0x262, 0x245, 0x2d6, 0x38c, 0x287, 0x143, 0x243, 0x277, 0x4f, 0xea, 0x10, 0xff, 0x21a, 0x2c3, 0x186, 0xbb, 0x398, 0x282, 0x365, 0x186, 0x176, 0x36e, 0x1d8, 0x2c4, 0x1d6, 0x379, 0x2fc, 0x32b, 0x3ca, 0x3b4, 0x3fa, 0x1b6, 0x374, 0x3e0, 0x38e, 0x23e, 0x8, 0xff, 0x3d, 0x31e, 0x2b, 0x3a2, 0x346, 0x2db, 0x20d, 0x2ab, 0x3fe, 0x3cd, 0x16e, 0x26f, 0x19f, 0x3ef, 0x1ab, 0x396, 0x33f, 0x4f, 0x1d4, 0x40, 0x3f1, 0x1e8, 0xc6, 0x158, 0x12f, 0x206, 0x2f5, 0x4c, 0x175, 0x3cf, 0x257, 0x362, 0x35c, 0xe3, 0x347, 0x143, 0x8f, 0x1ce, 0x278, 0x2bb, 0x200, 0x3b7, 0x35b, 0x239, 0x2d2, 0x16a, 0x14, 0x385, 0x260, 0x3ba, 0x247, 0x29c, 0x326, 0x2d6, 0x311, 0x20e, 0x20a, 0x71, 0x26b, 0x3e4, 0x1f5, 0x24, 0x187, 0x2ee, 0x1ec, 0x2bd, 0x342, 0xa0, 0x17, 0x324, 0x1ef, 0x21c, 0xcd, 0x106, 0x29d, 0xbe, 0x54, 0x74, 0x388, 0x37c, 0x31f, 0x3b3, 0x120, 0x23, 0x35d, 0x37b, 0x1c5, 0x226, 0x109, 0xb8, 0x116, 0x363, 0x339, 0x21a, 0x31e, 0x56, 0x293, 0x206, 0x1e3, 0x130, 0x3ba, 0x87, 0x262, 0x106, 0x133, 0x2f8, 0x2a0, 0x349, 0x1fc, 0x28f, 0xfb, 0x85, 0x19, 0x13b, 0x306, 0x254, 0x38f, 0x34c, 0x23a, 0xef, 0x386, 0x18b, 0xd4, 0x337, 0x160, 0x3ad, 0x2c6, 0x1d7, 0x1c2, 0x1f8, 0x270, 0x81, 0xe6, 0x141, 0x365, 0x30c, 0x1d1, 0x346, 0x1bf, 0x26, 0x175, 0x397, 0x14e, 0x326, 0x1a5, 0x5f, 0x54, 0xe8, 0x23b, 0x3d6, 0x19c, 0x295, 0x82, 0x1a4, 0x366, 0x24e, 0x3f6, 0x26d, 0x145, 0x39a, 0x376, 0x1b2, 0x21e, 0x3e1, 0x2c, 0x2f0, 0x35e, 0x3bd, 0x13a, 0x3f, 0x4e, 0x91, 0x31a, 0xa9, 0x2e9, 0x265, 0xbb, 0x36e, 0x3b0, 0x302, 0x2ab, 0x3f5, 0x32f, 0x362, 0x2b1, 0x38c, 0x20e, 0x1d, 0x1c4, 0x37c, 0x237, 0x2d7, 0x112, 0x230, 0x36a, 0x34f, 0x378, 0x2c8, 0x2ad, 0x171, 0x368, 0x134, 0x345, 0xfd, 0x201, 0x5e, 0x27b, 0x7a, 0xc6, 0x169, 0x2d4, 0xa0, 0x5c, 0x22c, 0x32e, 0xb6, 0x2ac, 0x99, 0x1c1, 0x174, 0x15c, 0x14b, 0x1c0, 0x30f, 0x126, 0x18d, 0xa9, 0x1db, 0x186, 0x1d1, 0x285, 0x2f5, 0x130, 0x37d, 0x21c, 0x334, 0x44, 0x221, 0x357, 0x2f4, 0x34b, 0x307, 0x2da, 0x25d, 0x290, 0x281, 0x30b, 0xd8, 0x65, 0x3b1, 0x76, 0x2c4, 0x351, 0x3f5, 0x257, 0x193, 0x1a5, 0xbe, 0x150, 0x349, 0x3f8, 0x22e, 0x3d1, 0x42, 0x320, 0x24b, 0x60, 0x34, 0x1e4, 0x11a, 0x395, 0x263, 0x77, 0xbf, 0x32b, 0x333, 0x33e, 0x347, 0x105, 0xe2, 0x37c, 0x67, 0x34e, 0x82, 0x348, 0x183, 0x254, 0x317, 0x12b, 0x1f4, 0x2eb, 0x3c, 0x218, 0x2ca, 0x1ac, 0x139, 0x2fa, 0x1b6, 0x1cb, 0x277, 0x278, 0x2fe, 0x48, 0x23, 0x16f, 0x3d5, 0x1bc, 0x2c8, 0x153, 0x1cd, 0x376, 0x364, 0x6a, 0x337, 0x2c0, 0x2af, 0x21d, 0x14f, 0x3e, 0x2e7, 0xff, 0x1e8, 0x239, 0x2bd, 0x226, 0x5a, 0x253, 0xda, 0x134, 0x10f, 0x3cb, 0x160, 0x2af, 0x33, 0x135, 0x1f0, 0x223, 0x359, 0x12, 0x215, 0x16f, 0x3a3, 0x2f9, 0x26d, 0x11d, 0x1de, 0xf, 0x10c, 0x2ca, 0x358, 0xed, 0x3fd, 0x356, 0x11e, 0xdf, 0x237, 0x34e, 0x104, 0x13b, 0x3, 0x101, 0x238, 0x242, 0x3ce, 0x263, 0xee, 0x2fc, 0x16e, 0x35c, 0x311, 0x54, 0x3a0, 0x3f8, 0x55, 0x35f, 0x210, 0x26c, 0x1e2, 0x36, 0x236, 0x3b1, 0xec, 0x302, 0x2be, 0x327, 0x262, 0x11, 0x314, 0x357, 0x1e1, 0x137, 0xe, 0x1f3, 0x322, 0x161, 0x250, 0x1db, 0x30c, 0x34d, 0x5, 0x303, 0x241, 0x2cf, 0x5b, 0x2ac, 0x132, 0x30d, 0x3b2, 0x1ed, 0x13a, 0xfc, 0xe9, 0x1, 0xff, 0x1e8, 0x239, 0x2bd, 0x226, 0x5a, 0x253, 0xda, 0x134, 0x10f, 0x3cb, 0x160, 0x2af, 0x33, 0x135, 0x1f0, 0x223, 0x359, 0x12, 0x215, 0x16f, 0x1fe, 0x3a9, 0x1ec, 0x38a, 0x59, 0x2ad, 0x39a, 0x386, 0x43, 0x165, 0x358, 0x1da, 0x3ef, 0x286, 0x1c4, 0x3d6, 0xfb, 0x21, 0x249, 0x27c, 0x1b, 0x236, 0x36b, 0x3b0, 0x26, 0x3ba, 0x31, 0x196, 0x92, 0x2e4, 0x2e8, 0x2f2, 0x13a, 0x1f8, 0x3a4, 0x8, 0x3eb, 0x177, 0x37b, 0x6f, 0x2c8, 0x145, 0xef, 0xf, 0x218, 0x33a, 0x2f6, 0x2cb, 0x347, 0x1d, 0x23b, 0x28f, 0x3d1, 0x108, 0x26c, 0x3c4, 0xd8, 0x194, 0x36e, 0x1bf, 0x130, 0x1ef, 0x188, 0xab, 0x99, 0x30d, 0x36d, 0x3bd, 0x1c2, 0x3db, 0x11f, 0x40, 0x367, 0x3aa, 0x3ee, 0x378, 0x26d, 0x23a, 0x371, 0x78, 0xe4, 0x1e6, 0x39d, 0x275, 0x20e, 0xe8, 0x1fc, 0x55, 0x2b7, 0x52, 0x344, 0x21f, 0x2c9, 0xbb, 0x346, 0x1e3, 0x192, 0x363, 0x5b, 0x151, 0xc1, 0x5e, 0x35e, 0x1d7, 0x20b, 0x2e7, 0xea, 0x200, 0x30e, 0x16f, 0x34f, 0x3f6, 0x34c, 0x1f4, 0x3fc, 0x2bf, 0x37b, 0xde, 0x332, 0x23a, 0x2eb, 0x1e0, 0x329, 0x25f, 0x35c, 0x5f, 0x149, 0x1ea, 0x307, 0x2fd, 0x24d, 0x31a, 0x282, 0x63, 0x1ad, 0x226, 0x168, 0x171, 0x2e5, 0x225, 0x165, 0x2b9, 0x361, 0x347, 0x3a, 0xfe, 0x55, 0x167, 0x148, 0x216, 0x1b8, 0x186, 0x293, 0x28, 0xb8, 0x288, 0x4d, 0x10f, 0x337, 0x22d, 0x2ba, 0x36c, 0x8f, 0x1be, 0x19c, 0x10a, 0x320, 0x27c, 0x36, 0xca, 0x36e, 0x37e, 0xc9, 0x363, 0xb6, 0x14d, 0x201, 0x1e9, 0x30a, 0x135, 0x3c9, 0x278, 0x3dd, 0x224, 0x299, 0x6, 0x1a, 0x399, 0x308, 0x2c4, 0x2be, 0x87, 0x261, 0x49, 0x2e4, 0x1d9, 0x3da, 0x1c2, 0x3bf, 0x75, 0x200, 0x215, 0x1b5, 0x24e, 0x317, 0x14a, 0x1e7, 0xcf, 0x379, 0x32f, 0x245, 0xc5, 0x357, 0x38d, 0x354, 0x380, 0x9c, 0x204, 0x1fe, 0x35b, 0x3b9, 0x6f, 0x199, 0x11d, 0x371, 0xf0, 0x390, 0x32b, 0x3f1, 0x2ee, 0x3ee, 0x1fb, 0x291, 0x3bb, 0x335, 0x3b8, 0x32f, 0x83, 0x314, 0x28e, 0xae, 0x24a, 0x1f8, 0x28b, 0x80, 0x30e, 0x1b5, 0x95, 0x47, 0x242, 0x24f, 0x1d6, 0x3cf, 0xcd, 0x110, 0x172, 0x1d9, 0x3bd, 0x301, 0x1c7, 0x359, 0x90, 0x69, 0x306, 0x202, 0x3c8, 0x308, 0x181, 0x2ea, 0x31, 0x251, 0x132, 0x5e, 0x163, 0x14f, 0x3e0, 0x278, 0x3b3, 0x82, 0xe5, 0x60, 0x340, 0x3b1, 0x369, 0x130, 0x3b5, 0xb6, 0x29a, 0x16, 0x353, 0xcc, 0x2e1, 0x39c, 0x237, 0x246, 0x190, 0x27c, 0x6c, 0x328, 0x346, 0x385, 0x116, 0x146, 0x3a6, 0x3cb, 0x312, 0x2ba, 0x2d1, 0x23c, 0x1eb, 0x1f6, 0x108, 0x1a2, 0x37, 0x265, 0x34d, 0x28, 0x170, 0x232, 0x268, 0xd4, 0x231, 0x272, 0x3ef, 0x20a, 0x7f, 0x55, 0x2ce, 0x129, 0x94, 0x3b6, 0xac, 0x1a1, 0x2d, 0x15e, 0x376, 0x225, 0x2ca, 0x2f6, 0x33e, 0x15, 0x349, 0x3eb, 0x3aa, 0x34f, 0x38f, 0x294, 0x323, 0x1d6, 0x397, 0x334, 0x92, 0x30d, 0x35e, 0x2a3, 0x3e0, 0xf9, 0x2d7, 0x19, 0x24b, 0x1b, 0x194, 0x346, 0x303, 0x51, 0x222, 0x21e, 0x18e, 0x139, 0x3ef, 0x1d, 0x1fc, 0x2a8, 0xb3, 0x161, 0x141, 0xc6, 0x173, 0x59, 0x145, 0x371, 0x3c0, 0x17e, 0x362, 0x133, 0x357, 0x22f, 0x125, 0x1f8, 0x11f, 0x200, 0x46, 0x366, 0x284, 0x1e4, 0x308, 0x302, 0x3ba, 0x188, 0x151, 0x201, 0x3ad, 0xcc, 0x1cb, 0x26b, 0x19c, 0x21, 0x26c, 0x21f, 0x265, 0x293, 0xa0, 0x392, 0x368, 0x18b, 0x165, 0x2f6, 0x275, 0x54, 0x27e, 0x307, 0x3e6, 0x91, 0x339, 0x3a9, 0x37b, 0x378, 0x34c, 0x3bb, 0x263, 0x2fb, 0x14e, 0x22, 0x258, 0x2e8, 0x3bd, 0x20b, 0x315, 0x2fe, 0x112, 0x13b, 0x30, 0x340, 0x36b, 0x1bf, 0x192, 0x32e, 0x2ed, 0x3e1, 0x312, 0x17d, 0x356, 0x1c4, 0x28f, 0x2b7, 0x290, 0x3df, 0x2b3, 0x24e, 0x8e, 0x234, 0x162, 0x2ea, 0xc4, 0x151, 0xb, 0x2af, 0x269, 0x8f, 0x1eb, 0x3d1, 0xa4, 0x4a, 0x365, 0x169, 0x45, 0x2ad, 0x1de, 0x1e0, 0x17e, 0x2cd, 0xc5, 0x28e, 0x2b8, 0xe1, 0x2e7, 0x2bb, 0x89, 0x13b, 0x60, 0x11b, 0x36e, 0x3c6, 0x22c, 0x222, 0x35, 0x231, 0x1da, 0x287, 0x3a0, 0x3e7, 0x2fd, 0x24c, 0x339, 0x35b, 0x1f7, 0x3f6, 0xa5, 0x395, 0x1d6, 0x327, 0xcb, 0x99, 0xbc, 0x30a, 0x1ba, 0x39c, 0xce, 0x21, 0xd1, 0x6e, 0x30c, 0x16a, 0x2d, 0x171, 0x305, 0x72, 0x32b, 0x16b, 0x3f2, 0x3c2, 0x14b, 0xfc, 0x11f, 0x9, 0x118, 0x306, 0x1a, 0xf7, 0x3b0, 0x260, 0x197, 0x2ed, 0x3cb, 0x53, 0x3fa, 0x105, 0xfe, 0x2a8, 0x166, 0x18d, 0x21a, 0x7b, 0x233, 0x26d, 0x3e8, 0x335, 0x2fb, 0x29c, 0x88, 0x2e4, 0x2d3, 0x355, 0x3e0, 0x1f2, 0x34e, 0xc8, 0xf1, 0x360, 0x1d1, 0x3b7, 0x2de, 0x254, 0xf2, 0x219, 0x26, 0x3b5, 0x1b9, 0x3e1, 0x53, 0x3fd, 0x1d, 0x3f9, 0x2da, 0x93, 0x398, 0x35b, 0x3ee, 0x3c3, 0x121, 0x12e, 0x2be, 0x62, 0x151, 0x16, 0x2ae, 0x36c, 0xe2, 0x117, 0x195, 0x2b4, 0x282, 0x239, 0x233, 0xd3, 0x3bb, 0x19e, 0x3e3, 0x334, 0x248, 0xbc, 0x21d, 0x2e1, 0xdf, 0xfb, 0x29, 0x25, 0x365, 0x2d2, 0x114, 0x145, 0x1df, 0x77, 0x32f, 0x11, 0xb9, 0x36d, 0x355, 0x3c9, 0x3c1, 0x246, 0x9b, 0x21f, 0x186, 0x16a, 0x5a, 0x1cd, 0x1e, 0x329, 0x1b1, 0x266, 0x28e, 0x179, 0x384, 0x315, 0x3ea, 0x104, 0x24b, 0x6c, 0x176, 0x14, 0x1c9, 0x2d9, 0x43, 0xf3, 0x1ae, 0x2f8, 0x1e1, 0x14b, 0x1f8, 0x75, 0x48, 0x1a4, 0x18, 0x289, 0x36e, 0x385, 0xa2, 0x134, 0x350, 0x2b9, 0x275, 0x150, 0x3a1, 0x70, 0x138, 0x10, 0x30e, 0x1b3, 0x101, 0x33b, 0x1d8, 0x260, 0x32e, 0x367, 0x36a, 0x284, 0x33b, 0x3b0, 0x192, 0x146, 0x21e, 0x6b, 0x2cb, 0x54, 0x3d4, 0x70, 0x270, 0x40, 0x46, 0x306, 0x68, 0x36b, 0x1e3, 0x51, 0x134, 0x2a9, 0x2f6, 0x38c, 0x12d, 0xd5, 0x3f, 0x11f, 0x24, 0x1a4, 0x30, 0x236, 0x346, 0x2e, 0x6d, 0x18b, 0x33a, 0xd7, 0x2f8, 0x3c2, 0x125, 0x3db, 0x359, 0x112, 0x1ca, 0x1b, 0xbb, 0x14, 0x392, 0x376, 0x218, 0x32b, 0x1a5, 0x357, 0x15c, 0x1c2, 0x315, 0x3dd, 0x19, 0x27c, 0x2c9, 0x293, 0x109, 0x171, 0xf, 0x329, 0x362, 0x18a, 0x5d, 0x3bd, 0x7c, 0xf9, 0x295, 0x249, 0x21f, 0x30c, 0x1a1, 0x2d0, 0xef, 0x3c0, 0x3e2, 0x106, 0x258, 0x36d, 0x2a3, 0x33f, 0x237, 0x21, 0x344, 0x2e9, 0x2b0, 0x8a, 0x145, 0x3be, 0x1dc, 0x14e, 0x110, 0x30d, 0x2c6, 0x1ba, 0x26b, 0xfb, 0x52, 0x94, 0x31e, 0x173, 0x2c8, 0x1f4, 0x263, 0x3f5, 0x334, 0x99, 0x2f0, 0x2c7, 0x1b3, 0xd, 0x3dc, 0x2f5, 0x51, 0x268, 0x2b6, 0x39d, 0xbe, 0x1e1, 0x125, 0x3bf, 0x17f, 0x82, 0x9f, 0x360, 0x293, 0x212, 0x1cd, 0x78, 0x2fc, 0x83, 0x258, 0x2d3, 0x29e, 0x1ce, 0x338, 0x29, 0x94, 0x235, 0x1c5, 0x26d, 0x37f, 0xeb, 0x87, 0x156, 0x16, 0x2aa, 0x2a5, 0xfe, 0x16d, 0x126, 0xff, 0x3aa, 0x95, 0xf2, 0x76, 0x260, 0xa3, 0x21e, 0xd6, 0x33e, 0x2a0, 0x137, 0x21b, 0x11f, 0x48, 0x299, 0x180, 0x328, 0xa, 0x392, 0x2e5, 0x72, 0x16e, 0x266, 0x22a, 0x3bd, 0xf8, 0x3e4, 0x85, 0xd1, 0x370, 0x2b0, 0x114, 0x11d, 0x1cf, 0x1ff, 0x19a, 0x99, 0x1e9, 0x330, 0x23c, 0x117, 0x25d, 0x31a, 0x1e8, 0x1f7, 0x38f, 0x11a, 0x181, 0x1ef, 0x1b9, 0x39f, 0x139, 0x287, 0x13f, 0xe, 0x9c, 0x20, 0x46, 0x205, 0x1a0, 0x36e, 0x20f, 0x232, 0x18b, 0x27d, 0x35c, 0x3ed, 0x57, 0xe1, 0x315, 0x187, 0x2c5, 0x68, 0x1b7, 0x20f, 0x6d, 0x225, 0x3cc, 0x1a5, 0x147, 0x1ed, 0x7c, 0x3e4, 0x10a, 0x344, 0x3b6, 0x35a, 0x2c8, 0x3d9, 0x271, 0x87, 0x2ac, 0x58, 0x17d, 0x20a, 0x3ff, 0x3e6, 0x204, 0x2c7, 0x366, 0x34, 0x2df, 0x303, 0x232, 0x316, 0x1e6, 0x2d6, 0x2a7, 0x2f2, 0x3e, 0x1f2, 0x85, 0x1a2, 0x1db, 0x1ad, 0x164, 0x3e8, 0x33c, 0x247, 0x156, 0x2c, 0x2ba, 0x105, 0x3fb, 0x1f3, 0x102, 0x367, 0x1b3, 0x1a, 0x36b, 0x385, 0x119, 0x18b, 0xf3, 0x16b, 0x357, 0x179, 0x1f, 0xf9, 0x246, 0xd1, 0x2e9, 0x2d2, 0xb2, 0x1f4, 0x19e, 0x327, 0xab, 0x16, 0x15d, 0x286, 0x3f9, 0x2fd, 0x81, 0x3b7, 0x2dd, 0xd, 0x3b1, 0x3c6, 0x288, 0x2c1, 0x27d, 0x2b1, 0x3af, 0x2b8, 0x20b, 0x278, 0x123, 0x26c, 0x370, 0x169, 0x59, 0xfa, 0xcf, 0x397, 0x251, 0xb, 0x2aa, 0x143, 0x3f8, 0x37a, 0x244, 0x3df, 0x36a, 0x30e, 0x306, 0x340, 0x346, 0x170, 0x376, 0xe4, 0x362, 0x4b, 0x36d, 0x135, 0x26b, 0x3d1, 0xad, 0x21a, 0x37b, 0x38f, 0x61, 0x26, 0x32e, 0x21e, 0x358, 0x38c, 0x17a, 0x125, 0x2e7, 0x3dd, 0xc8, 0x21f, 0x56, 0x8a, 0x23a, 0x263, 0x397, 0xab, 0x2c, 0x17d, 0x1d, 0x3e7, 0x30f, 0x8, 0x46, 0x6, 0x236, 0x206, 0x392, 0x386, 0x329, 0x326, 0x258, 0x35e, 0x1ba, 0x37c, 0x2b7, 0x161, 0xf4, 0x3ee, 0x47, 0x308, 0x130, 0x146, 0xd4, 0x2f6, 0x5f, 0x3c2, 0x13a, 0x315, 0x2d7, 0x249, 0xdc, 0x2b0, 0x59, 0x1f4, 0x33c, 0x87, 0x151, 0x160, 0x3fa, 0xe8, 0x307, 0x4e, 0x40, 0x230, 0x30, 0x194, 0x14, 0xaf, 0xf, 0x17e, 0x106, 0x2e4, 0x2c6, 0x1cb, 0x3d6, 0x195, 0x31a, 0x3a9, 0x34f, 0x238, 0x76, 0x192, 0x222, 0x2a9, 0x39d, 0x2f8, 0x22f, 0x1c2, 0x9e, 0x295, 0x26c, 0x2e9, 0x1ad, 0x2c8, 0x3bb, 0x215, 0x3, 0x236, 0x5, 0x253, 0xf, 0x2fc, 0x11, 0x30d, 0x33, 0x11e, 0x55, 0x322, 0xff, 0x16f, 0x101, 0x3b1, 0x303, 0xda, 0x10c, 0x16e, 0x314, 0x3b2, 0x135, 0xdf, 0x35f, 0x161, 0x1e8, 0x3a3, 0x238, 0xec, 0x241, 0x134, 0x2ca, 0x35c, 0x357, 0x1ed, 0x1f0, 0x237, 0x210, 0x250, 0x239, 0x2f9, 0x242, 0x302, 0x2cf, 0x10f, 0x358, 0x311, 0x1e1, 0x13a, 0x223, 0x34e, 0x26c, 0x1db, 0x2bd, 0x26d, 0x3ce, 0x2be, 0x5b, 0x3cb, 0xed, 0x54, 0x137, 0xfc, 0x359, 0x104, 0x1e2, 0x30c, 0x226, 0x11d, 0x263, 0x327, 0x2ac, 0x160, 0x3fd, 0x3a0, 0xe, 0xe9, 0x12, 0x13b, 0x36, 0x34d, 0x5a, 0x1de, 0xee, 0x262, 0x132, 0x2af, 0x356, 0x3f8, 0x1f3, 0x1, 0x215, 0x3, 0x236, 0x5, 0x253, 0xf, 0x2fc, 0x11, 0x30d, 0x33, 0x11e, 0x55, 0x322, 0xff, 0x16f, 0x101, 0x3b1, 0x303, 0xda, 0x10c, 0x16e, 0x23, 0xc, 0x194, 0x50, 0x2e2, 0x3c0, 0xa7, 0x124, 0x3ad, 0x1ab, 0x3f8, 0x3e6, 0x4, 0x8c, 0x30, 0x259, 0x140, 0x39a, 0x31b, 0x29c, 0x99, 0x2af, 0x2a5, 0x3fb, 0x383, 0x10, 0x230, 0xc0, 0x176, 0x109, 0x273, 0x77, 0x262, 0x264, 0x2ae, 0x286, 0x3f7, 0x217, 0x40, 0xd2, 0x300, 0x1d1, 0x2d, 0x1de, 0x1dc, 0x19a, 0x182, 0x2aa, 0x20a, 0x3c7, 0x4e, 0x100, 0x348, 0x1b, 0x34d, 0xb4, 0x371, 0x379, 0x261, 0x201, 0x2ba, 0x3a, 0x307, 0x138, 0x9, 0x13b, 0x6c, 0x12f, 0x2d0, 0x1df, 0x1ff, 0x196, 0x16, 0x2fa, 0xe8, 0x7, 0xe9, 0x24, 0xe5, 0x1b0, 0xb5, 0x352, 0x375, 0x3f5, 0x251, 0x58, 0x3fa, 0x3a0, 0x1c, 0x3a4, 0x90, 0x394, 0x2c9, 0x2d4, 0x153, 0x1cf, 0x3cf, 0x156, 0x160, 0x3f3, 0x29b, 0x70, 0x28b, 0x240, 0x24b, 0x336, 0x342, 0x145, 0x335, 0x327, 0x151, 0x189, 0x3d7, 0x27e, 0x46, 0x30, 0xbb, 0x109, 0xef, 0x1dc, 0x334, 0x201, 0x17d, 0xe8, 0xe, 0x3a4, 0x120, 0x24b, 0x265, 0x113, 0x23a, 0x33c, 0x31, 0xfd, 0x139, 0x54, 0xd5, 0x3db, 0x3dd, 0x249, 0x2e9, 0x173, 0x34c, 0x12e, 0x1ef, 0x345, 0x358, 0x5f, 0x22f, 0x20b, 0x3c1, 0x108, 0xa9, 0x1ec, 0x38f, 0x308, 0x192, 0x134, 0x33a, 0x1a5, 0x5d, 0x2a3, 0x26b, 0x2b7, 0x31a, 0x177, 0x254, 0x1ee, 0x303, 0x368, 0xe4, 0x326, 0x2e4, 0x21d, 0x23c, 0x2a8, 0x91, 0x367, 0x306, 0x236, 0x14, 0x171, 0x3c0, 0x14e, 0x99, 0x157, 0x286, 0x3e7, 0x4e, 0x200, 0x13b, 0xd8, 0xb5, 0x2ad, 0x1cf, 0x397, 0x151, 0x312, 0x347, 0x3d4, 0x3f, 0x359, 0x19, 0x21f, 0x2b0, 0x2c8, 0x1e7, 0x175, 0x2d8, 0x18e, 0x275, 0x17a, 0x13a, 0x9e, 0x85, 0x216, 0xc6, 0x378, 0x8d, 0x26, 0x146, 0x2a9, 0xd7, 0x357, 0x3bd, 0x33f, 0xfb, 0xad, 0x8c, 0xc0, 0x1d1, 0xb4, 0x1df, 0x3f5, 0x156, 0x189, 0x347, 0x3a1, 0xfc, 0x2fe, 0x190, 0x370, 0x173, 0x291, 0xb1, 0x363, 0x35, 0x3ca, 0x3ed, 0x1ed, 0x39b, 0xfb, 0x15a, 0x3d0, 0x24e, 0x27f, 0x385, 0x368, 0x1c8, 0x83, 0x30d, 0x198, 0x319, 0x37a, 0x2, 0x118, 0x180, 0x3a2, 0x168, 0x3be, 0x3e3, 0x2ac, 0x312, 0x287, 0x34b, 0x1f8, 0x1f5, 0x320, 0x2e9, 0x2e6, 0x12b, 0x162, 0x2cf, 0x6a, 0x39d, 0x3d3, 0x3da, 0x33f, 0x1f6, 0x2b4, 0x3a9, 0x95, 0xf7, 0x303, 0x2d9, 0x390, 0x106, 0x213, 0x330, 0x23b, 0x2fd, 0x4, 0x230, 0x300, 0x34d, 0x2d0, 0x375, 0x3cf, 0x151, 0x22d, 0x107, 0x29f, 0x3f0, 0x3ea, 0x249, 0x1db, 0x1c5, 0x256, 0x2c4, 0x197, 0xd4, 0x333, 0x3af, 0x3bd, 0x277, 0x3ec, 0x161, 0x35b, 0x12a, 0x1ee, 0x20f, 0x1bb, 0x329, 0x20c, 0x2f, 0x269, 0x7f, 0x1f3, 0x8, 0x69, 0x209, 0x293, 0x118, 0x300, 0x293, 0x352, 0x39e, 0x87, 0x27a, 0x272, 0x2a0, 0x296, 0x223, 0x85, 0x4a, 0x7b, 0x38f, 0x3b, 0x116, 0x18b, 0xb7, 0x96, 0x2c6, 0x11e, 0x159, 0x81, 0x23, 0x60, 0x1d1, 0x168, 0x375, 0x397, 0x14d, 0x14c, 0x54, 0x354, 0x1c7, 0x295, 0x10b, 0x18c, 0x3f6, 0x184, 0x324, 0x1b2, 0x391, 0x314, 0x35e, 0x325, 0xaa, 0x91, 0x187, 0xc, 0xbb, 0x2d, 0x2eb, 0x3f5, 0x2ac, 0x22d, 0x20e, 0x26e, 0x3bf, 0x2d7, 0x1a2, 0x235, 0x378, 0x234, 0x260, 0x134, 0xf3, 0x266, 0x36d, 0x2e1, 0x117, 0x93, 0x3b7, 0x205, 0x194, 0x280, 0x1de, 0x2fb, 0x251, 0x2c0, 0x347, 0x34b, 0x3f0, 0x3dd, 0x136, 0x2c3, 0x6f, 0x242, 0x4c, 0x222, 0x19d, 0x34a, 0x2e8, 0xdd, 0x3a5, 0x191, 0x3f1, 0x2c5, 0x236, 0x50, 0x33d, 0x1dc, 0xcb, 0x58, 0x3ef, 0x1ea, 0x7e, 0x2fe, 0x320, 0x1db, 0x38a, 0x14a, 0x20d, 0x146, 0x230, 0x1b, 0xb5, 0x145, 0x33c, 0x188, 0x337, 0x275, 0x3c2, 0x20b, 0x237, 0x290, 0xf4, 0x24e, 0x1ee, 0x2e, 0x386, 0x3e2, 0x92, 0x157, 0x1d, 0xe, 0x11f, 0x82, 0x21f, 0x1ad, 0x34c, 0x162, 0x32e, 0x2a9, 0x2b1, 0x5d, 0x135, 0x3d6, 0x191, 0x3eb, 0x306, 0x194, 0x109, 0x371, 0x3f5, 0x151, 0xa6, 0x54, 0x2a1, 0x315, 0x85, 0x94, 0x1ec, 0x47, 0x3b0, 0x288, 0x218, 0x326, 0x30d, 0x269, 0x1fc, 0x30f, 0x200, 0x1ca, 0x265, 0x8a, 0x3bb, 0x175, 0x2ed, 0x358, 0x2f8, 0x2f2, 0x33f, 0x3d1, 0x31a, 0x3aa, 0xd, 0x346, 0xaf, 0x3c0, 0x262, 0x201, 0x3fa, 0x27e, 0x3f, 0x2fe, 0x249, 0x365, 0x6f, 0x8d, 0x130, 0x134, 0x1e6, 0x18a, 0x35e, 0x243, 0x2a8, 0x81, 0x46, 0x180, 0x293, 0x2ad, 0x263, 0x31, 0x3e1, 0x2cb, 0x17a, 0x1c2, 0x3c1, 0x52, 0x21a, 0x34f, 0x33b, 0x303, 0x376, 0x17e, 0x110, 0x3ad, 0x69, 0x6c, 0x1a1, 0x7d, 0x351, 0x2d8, 0xd6, 0x17c, 0x2f2, 0x277, 0x35f, 0xe6, 0x2de, 0x1a0, 0x14, 0x33d, 0x379, 0xab, 0x22d, 0x2a, 0x2a1, 0x223, 0x214, 0xa9, 0x2ff, 0xf2, 0x1e3, 0x2d9, 0xbf, 0x110, 0x353, 0x20a, 0xe, 0x23e, 0x208, 0xdc, 0x2e6, 0x14a, 0x26, 0x4d, 0xf3, 0x18a, 0x2b5, 0x11e, 0x16d, 0x2, 0xd2, 0xd8, 0x342, 0xfa, 0x2ab, 0x1b9, 0x1ac, 0x2f8, 0x1ed, 0xe7, 0x2b7, 0x1cc, 0x1b5, 0x340, 0x28, 0x273, 0x2fb, 0x156, 0x53, 0x54, 0x14b, 0x4f, 0x21, 0x152, 0x1f7, 0x1e4, 0x3c6, 0x1bb, 0x17e, 0x220, 0x2af, 0x1d, 0x1c, 0x75, 0x19, 0x1b8, 0x1c5, 0x294, 0x4c, 0x9a, 0x1e6, 0x314, 0x163, 0x23c, 0x2da, 0x4, 0x1a4, 0x1b0, 0x28d, 0x1f4, 0x15f, 0x372, 0x358, 0x1f9, 0x3da, 0x1ce, 0x167, 0x398, 0x36a, 0x289, 0x50, 0xef, 0x1ff, 0x2ac, 0xa6, 0xa8, 0x296, 0x9e, 0xd2, 0x1b0, 0x113, 0x3d9, 0x2ea, 0x345, 0x3ca, 0x2a7, 0x2a3, 0x1eb, 0x322, 0x367, 0x18, 0x3a2, 0x2ad, 0x19e, 0x310, 0x18e, 0x22b, 0x2b8, 0x33f, 0x35f, 0x1cc, 0x36a, 0x11b, 0x140, 0x371, 0x3cf, 0x13d, 0x1da, 0xbd, 0x384, 0x237, 0x252, 0x35b, 0x284, 0x1a3, 0x15e, 0x23f, 0xcb, 0x2c0, 0x20e, 0x354, 0x223, 0x21, 0x2a4, 0x3d5, 0x33b, 0x17, 0x305, 0x32f, 0x264, 0x2fa, 0x27e, 0xfc, 0x3b3, 0x344, 0x318, 0x317, 0x3b0, 0x232, 0x1c8, 0x22, 0x3d2, 0x105, 0xe, 0x75, 0x32, 0x2e9, 0x233, 0x11a, 0x192, 0x2c1, 0x2dc, 0x2e4, 0x330, 0x3f8, 0x4e, 0x90, 0xf1, 0x2b0, 0x1a6, 0x2c4, 0x146, 0x19d, 0x266, 0x35e, 0x11e, 0x2da, 0x8, 0x299, 0x19b, 0x8a, 0x2f7, 0x37d, 0x21e, 0x26f, 0x115, 0x135, 0x343, 0x126, 0x30e, 0xc0, 0x12f, 0x145, 0xeb, 0xb6, 0x6b, 0x17c, 0x1ed, 0x1ce, 0x2ce, 0x27b, 0x366, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x348, 0x336, 0x59, 0x24f, 0x197, 0x165, 0x266, 0x163, 0x1c4, 0x3c5, 0x12, 0x27c, 0x169, 0x12b, 0x26, 0x268, 0xb7, 0x2e4, 0xdb, 0x3f7, 0x3a4, 0x104, 0x370, 0x6f, 0xc2, 0x22c, 0x218, 0x20c, 0x3d2, 0x1d, 0xe0, 0x17f, 0x26c, 0x18c, 0x227, 0x1bf, 0x2d9, 0x1f1, 0x99, 0x2fa, 0x1ea, 0x3db, 0x123, 0x250, 0x3ee, 0x27f, 0xb8, 0x78, 0xcd, 0xb0, 0x20e, 0x14b, 0x278, 0x52, 0x1e8, 0x142, 0x346, 0x2e2, 0x379, 0x151, 0x272, 0xbd, 0x20b, 0x338, 0x18d, 0x16f, 0x289, 0x280, 0x3be, 0x10e, 0x39f, 0x38c, 0x2b8, 0xe7, 0x195, 0x3fc, 0x3, 0x1d1, 0x153, 0xeb, 0x2d8, 0x2b9, 0x3af, 0x2a3, 0x3a5, 0x24c, 0x46, 0x36, 0x28d, 0x3bb, 0x37d, 0x6a, 0x2b1, 0x1d9, 0x325, 0x16d, 0x10, 0xe5, 0x30c, 0x199, 0xb1, 0x146, 0x27d, 0x221, 0x21d, 0x7f, 0x27, 0x120, 0x381, 0x2bd, 0x294, 0x260, 0x2c1, 0x362, 0x299, 0xc3, 0x2c8, 0xb1, 0x28c, 0x1e6, 0x12c, 0x198, 0x3fb, 0x1d2, 0x104, 0x2e9, 0x1bc, 0x219, 0x288, 0x390, 0x220, 0x2aa, 0x13f, 0x3f0, 0x295, 0x250, 0x3d5, 0x1ee, 0x1c9, 0x389, 0x196, 0x53, 0x149, 0x1c2, 0xce, 0x2c2, 0x16f, 0x11b, 0x212, 0x1cf, 0xc4, 0x31c, 0x2f8, 0x2ef, 0x2f1, 0x93, 0x23, 0x36, 0x113, 0x2f7, 0x3de, 0x2a9, 0x29d, 0x2b5, 0x1c4, 0x383, 0x48, 0x3c4, 0x2bd, 0x121, 0x192, 0x225, 0x245, 0x2f0, 0x20a, 0xe0, 0x2fe, 0x1a2, 0x7b, 0x238, 0x385, 0x305, 0x14e, 0x16, 0x287, 0x2a1, 0x278, 0xa4, 0x3a9, 0x202, 0x5, 0xef, 0x3cf, 0x1fa, 0x275, 0xae, 0x277, 0x195, 0x3f1, 0xc, 0x293, 0x11d, 0x15f, 0x345, 0x26f, 0xba, 0x1cb, 0x2b2, 0x10, 0x1ca, 0x2b, 0xd3, 0x302, 0x9a, 0x25f, 0x2e4, 0x1b6, 0x3c7, 0x11f, 0x64, 0x2c3, 0x3f6, 0x1d8, 0xda, 0x17e, 0x248, 0x2fa, 0x3d4, 0x13b, 0x30c, 0x26d, 0x302, 0x134, 0x16e, 0x30d, 0x356, 0xe, 0x359, 0x26c, 0x239, 0x238, 0x303, 0xf, 0x262, 0x160, 0x54, 0x13a, 0x237, 0x161, 0x16f, 0x236, 0x5a, 0x263, 0x5b, 0x358, 0x357, 0x135, 0x55, 0x1, 0x13b, 0x30c, 0x26d, 0x302, 0x134, 0x16e, 0x30d, 0x356, 0xe, 0x359, 0x26c, 0x239, 0x238, 0x303, 0xf, 0x262, 0x160, 0x54, 0x13a, 0x237, 0x161, 0x16f, 0x236, 0x5a, 0x263, 0x5b, 0x358, 0x357, 0x135, 0x55, 0x1, 0x13b, 0x30c, 0x26d, 0x302, 0x134, 0x16e, 0x30d, 0x356, 0xe, 0x359, 0x26c, 0x239, 0x238, 0x303, 0xf, 0x262, 0x160, 0x54, 0x13a, 0x237, 0x161, 0x16f, 0x236, 0x5a, 0x263, 0x5b, 0x358, 0x357, 0x135, 0x55, 0x1, 0x13b, 0x30c, 0x26d, 0x302, 0x134, 0x16e, 0x30d, 0x356, 0xe, 0x359, 0x26c, 0x239, 0x238, 0x303, 0xf, 0x262, 0x160, 0x54, 0x13a, 0x237, 0x161, 0x276, 0x2b, 0x34c, 0x4c, 0x2c1, 0x326, 0x1e9, 0x74, 0x3f, 0x1a7, 0x250, 0x34f, 0x2df, 0x2bc, 0x2fb, 0x13d, 0x33e, 0x15c, 0x39c, 0x2cc, 0x30e, 0x36, 0x45, 0x323, 0x255, 0xf3, 0x258, 0xdb, 0x387, 0xea, 0x9b, 0x318, 0x238, 0x20f, 0x3c, 0x334, 0x22d, 0x292, 0x20b, 0x1f6, 0x398, 0x306, 0x3a2, 0x11d, 0x175, 0x35, 0x2d6, 0x35e, 0x388, 0x27, 0x112, 0x1b8, 0x1bc, 0x76, 0xda, 0x1f1, 0xc1, 0x3d7, 0x354, 0xf9, 0x129, 0x1d5, 0x340, 0x212, 0x335, 0x5b, 0x2b9, 0x147, 0x1ba, 0x159, 0x20, 0x24b, 0x169, 0x14a, 0x192, 0x86, 0x11, 0x157, 0x29b, 0x3e9, 0x85, 0x282, 0x12a, 0x346, 0x33d, 0x3cf, 0x3e1, 0x311, 0x3da, 0x37c, 0x126, 0x118, 0x2c9, 0xb2, 0xb1, 0x222, 0x25f, 0x382, 0x356, 0x1c, 0x17f, 0x344, 0x3d8, 0x399, 0x170, 0x389, 0x251, 0x139, 0x2f4, 0x1f0, 0x2b7, 0x3fc, 0x18, 0xb5, 0xe5, 0xac, 0x256, 0xc9, 0x86, 0x22, 0x155, 0xf5, 0x2e7, 0x84, 0x1e8, 0xd, 0x50, 0x375, 0x188, 0x1ac, 0x2a7, 0x1ba, 0x2b2, 0x80, 0x27c, 0x2bd, 0x11a, 0x51, 0x390, 0x124, 0x3fa, 0x26e, 0x13c, 0x290, 0x1d5, 0x289, 0x5a, 0x19e, 0x1b9, 0x39d, 0x174, 0x8f, 0x3e6, 0x90, 0x37, 0x6f, 0x3b, 0xda, 0x3e2, 0x304, 0x287, 0x125, 0x31f, 0x2c2, 0x36a, 0x259, 0x153, 0x2ab, 0x10f, 0x16b, 0x35e, 0x319, 0x9c, 0x82, 0x3b6, 0x3e5, 0x1bf, 0x1c3, 0x29c, 0x160, 0x150, 0x384, 0xfb, 0x398, 0x205, 0x293, 0xfa, 0x37d, 0x2a9, 0xc5, 0x33, 0x3fb, 0x28b, 0x190, 0xc6, 0x11c, 0x20f, 0x78, 0xcb, 0x14c, 0x17a, 0x1f0, 0x167, 0x3eb, 0xc0, 0x342, 0x1e7, 0x197, 0x27d, 0x258, 0x1b6, 0x207, 0x359, 0x1a2, 0x3d8, 0x33b, 0x1c9, 0x77, 0x151, 0x361, 0x57, 0x1ce, 0x2cc, 0x215, 0xd8, 0x228, 0x25c, 0x222, 0x1ca, 0x2b0, 0x294, 0x8b, 0xe4, 0x92, 0x3fa, 0xd5, 0xf9, 0xad, 0x16f, 0x194, 0x2ad, 0x2ab, 0x21e, 0x1a5, 0x2c6, 0x1fc, 0x3a4, 0xc8, 0xc6, 0x238, 0x2e, 0x3c0, 0xab, 0x1da, 0x22f, 0x1ce, 0x191, 0x46, 0x2c9, 0x2c8, 0x302, 0x1b2, 0x326, 0x3ad, 0x349, 0x3db, 0x21, 0xf4, 0xd, 0xa0, 0x1cf, 0x5b, 0x2f6, 0x5d, 0x243, 0x3e6, 0x120, 0xdc, 0x378, 0x3b0, 0x376, 0x14e, 0x160, 0x2a0, 0x20b, 0x3d1, 0x1fe, 0x30, 0x1a1, 0x1e7, 0x32e, 0x1e6, 0x2e4, 0x356, 0x70, 0x3dd, 0x94, 0x34f, 0x36e, 0x39a, 0x397, 0x337, 0x2f8, 0x2a3, 0x55, 0x8, 0x24b, 0x1ad, 0x8d, 0x51, 0x329, 0x99, 0x3ef, 0x2a1, 0x3c1, 0x161, 0x36a, 0xbb, 0x145, 0x175, 0xd4, 0x133, 0x21d, 0x3fb, 0x11f, 0x249, 0x239, 0x1e4, 0x170, 0x23f, 0x151, 0x2cb, 0x15c, 0x26b, 0x93, 0x230, 0x265, 0x26d, 0x26, 0x18b, 0x106, 0x157, 0x394, 0x2d2, 0x8d, 0xa2, 0xbf, 0xc1, 0x287, 0x9d, 0x19c, 0x1cc, 0x3, 0xb5, 0x37f, 0x197, 0x1e6, 0x1c1, 0x143, 0x380, 0x1a7, 0x2a4, 0x254, 0x5, 0x1df, 0x188, 0x2b9, 0x22a, 0x243, 0x3c5, 0x89, 0x2e9, 0x3e5, 0x2f5, 0xf, 0x261, 0x298, 0x3c2, 0x277, 0x2cc, 0x46, 0x19b, 0x332, 0x26, 0x316, 0x11, 0x2aa, 0x3a1, 0x4f, 0x290, 0x35d, 0xca, 0x2ad, 0x15f, 0x6a, 0x133, 0x33, 0x3f7, 0xea, 0xd1, 0x3b9, 0x1ee, 0x15e, 0x3fe, 0x3e1, 0xbe, 0x355, 0x55, 0x10, 0x13e, 0x173, 0xc2, 0x232, 0x3e2, 0xb, 0x2a, 0x1c2, 0x1f6, 0xff, 0x30, 0x342, 0x395, 0x146, 0x25f, 0x2f, 0x1d, 0x7e, 0x246, 0x21a, 0x101, 0x50, 0x1cf, 0xb6, 0x3ca, 0x2e8, 0x71, 0x27, 0x82, 0x2c3, 0x227, 0x303, 0xf0, 0x251, 0x1da, 0x57, 0x331, 0x93, 0x69, 0x186, 0x34c, 0x260, 0x10c, 0x110, 0x2fa, 0x26e, 0xf9, 0x321, 0x35a, 0x61, 0x232, 0x3cd, 0x2c, 0x150, 0x1f, 0x2b7, 0x3b7, 0x36, 0x59, 0x181, 0x364, 0x106, 0x155, 0x3a1, 0x9e, 0x252, 0x2de, 0xbb, 0x11d, 0x37d, 0x165, 0x12c, 0x2d1, 0x70, 0x36f, 0x152, 0x254, 0xa, 0x375, 0x5b, 0x3ca, 0x1d9, 0x1c4, 0x138, 0x32, 0xc6, 0xf2, 0x2e0, 0x1dc, 0x27a, 0x311, 0x1d7, 0x22e, 0x10, 0x27c, 0x1c5, 0x219, 0x368, 0xa7, 0x2c0, 0x12d, 0x1f0, 0x32a, 0x30e, 0x360, 0x199, 0x26, 0x225, 0x44, 0x17d, 0x26e, 0x1f2, 0x161, 0x1b3, 0x3a2, 0x1f4, 0x3b5, 0x27d, 0x2e4, 0x143, 0x309, 0x295, 0x10d, 0x101, 0xa0, 0x335, 0x1b9, 0xd7, 0x1af, 0x7f, 0x3a4, 0x320, 0x7b, 0x33b, 0x253, 0x1ff, 0x3e1, 0x17c, 0x14f, 0x2a8, 0x100, 0x381, 0x6f, 0x1d8, 0x2e5, 0x262, 0x53, 0x2f4, 0x33f, 0x2cc, 0x8c, 0x265, 0x1a6, 0x260, 0x218, 0x49, 0x3fd, 0x2a1, 0x31f, 0x23d, 0x306, 0x24b, 0x173, 0x308, 0x368, 0x14e, 0x312, 0x17a, 0x33f, 0x191, 0x230, 0x30c, 0x256, 0x8b, 0x329, 0xc1, 0x20e, 0x1c2, 0x3d1, 0x3eb, 0x1b, 0x59, 0x302, 0x18b, 0x22, 0x17d, 0xd5, 0x3c1, 0x31a, 0x306, 0xb5, 0x1e7, 0x146, 0x16e, 0x2f0, 0x349, 0x2e7, 0x52, 0x3aa, 0x194, 0x145, 0x3ba, 0x165, 0x258, 0x356, 0x380, 0x295, 0x21a, 0xd, 0x109, 0x33c, 0x345, 0x1a5, 0x21d, 0x3e7, 0x359, 0x216, 0x34f, 0x346, 0x371, 0x188, 0x2f6, 0x2e8, 0x1c4, 0x270, 0xc8, 0x239, 0x33b, 0xaf, 0x3f5, 0x337, 0x3ed, 0x1ba, 0x37a, 0x120, 0x2e9, 0x38f, 0x303, 0x3c0, 0x151, 0x275, 0x3bd, 0x28f, 0x8, 0x27c, 0x38a, 0x76, 0x376, 0x262, 0xa6, 0x3c2, 0x1ce, 0x93, 0x1a4, 0x56, 0x294, 0x51, 0x17e, 0x201, 0x54, 0x20b, 0x2b7, 0x367, 0xd8, 0x2c8, 0x26, 0x43, 0x110, 0x3fa, 0x2a1, 0x237, 0xe6, 0x6, 0x1a1, 0x323, 0x9f, 0x1c5, 0x76, 0x2e5, 0x19a, 0x139, 0x57, 0x1be, 0x81, 0x394, 0x2bd, 0x308, 0x2d9, 0x131, 0xa6, 0x38d, 0x331, 0x91, 0x276, 0x2d2, 0x61, 0xda, 0xa7, 0x312, 0x2f4, 0xe7, 0x93, 0x348, 0x158, 0x8d, 0x119, 0x393, 0x160, 0x25a, 0x39b, 0x191, 0x69, 0x2b, 0x294, 0xa2, 0x1f1, 0x2c, 0x149, 0x1f0, 0xb3, 0x8c, 0x186, 0x256, 0x116, 0xbf, 0x201, 0xa8, 0x3e, 0x195, 0x215, 0x336, 0x34c, 0x324, 0x390, 0xc1, 0x15, 0x301, 0x2b7, 0x2c7, 0x360, 0x26d, 0x260, 0x72, 0x99, 0x287, 0xe1, 0x3d1, 0x3df, 0x6c, 0x2c8, 0x4c, 0x10c, 0x92, 0x3d7, 0x9d, 0xfb, 0x3fc, 0x209, 0x59, 0x20d, 0x225, 0x110, 0x3fd, 0x296, 0x19c, 0x27b, 0xc0, 0x8a, 0x2c4, 0x2c1, 0x22, 0x2fa, 0x354, 0x237, 0x1cc, 0x18, 0x113, 0x25c, 0xd9, 0x106, 0x15d, 0x26e, 0x3c1, 0x23d, 0x3, 0x1a1, 0x24f, 0x9a, 0x326, 0x13e, 0x31d, 0x3b0, 0x203, 0x32c, 0x2cb, 0x3da, 0x117, 0x40, 0x30b, 0x2f9, 0x1e3, 0x1e0, 0x2a2, 0x38c, 0x355, 0x159, 0x24, 0x370, 0x317, 0x2e, 0xee, 0x1fa, 0x2f8, 0xdd, 0x2fd, 0x112, 0x18f, 0x79, 0x392, 0x3fe, 0x267, 0x357, 0x325, 0x217, 0x19, 0x318, 0x27f, 0x171, 0x247, 0xd6, 0x5d, 0xe2, 0xe9, 0x249, 0x3b9, 0x2df, 0xef, 0xc4, 0x1e5, 0x36d, 0xfe, 0x23e, 0x344, 0x3a3, 0x285, 0x3be, 0x16c, 0x1ae, 0x2c6, 0x3f7, 0x2bb, 0x94, 0x12a, 0x28, 0x263, 0x3a6, 0x34a, 0xcc, 0x7, 0x3b3, 0x141, 0x202, 0x212, 0x1d6, 0x6a, 0x314, 0x36c, 0x1c0, 0x123, 0xf4, 0x1a0, 0x1a9, 0x175, 0x2b6, 0xb9, 0x286, 0xfc, 0x42, 0x177, 0xca, 0x28a, 0x1ef, 0xf3, 0x213, 0xe8, 0x377, 0xa4, 0x16f, 0x2ec, 0x3e8, 0x32e, 0xb7, 0x1e9, 0x27e, 0x4f, 0x15a, 0x366, 0x25e, 0x3ce, 0x222, 0x193, 0x2ae, 0x29f, 0x27c, 0x6f, 0x1bf, 0x78, 0x151, 0x38c, 0x2a3, 0x16d, 0x120, 0x365, 0x238, 0x392, 0x3f5, 0x18e, 0x28e, 0x23c, 0x270, 0x249, 0x37b, 0x36e, 0x371, 0x5b, 0xd7, 0x2c6, 0x3e7, 0x2fe, 0xa9, 0x284, 0x109, 0x1d6, 0xd4, 0x4b, 0x356, 0x3f, 0x21, 0x177, 0x194, 0x23a, 0x363, 0x32b, 0x2f0, 0x27e, 0x9e, 0x161, 0x306, 0x1a1, 0x12e, 0x1b2, 0x22, 0x3fa, 0x125, 0xfb, 0x3eb, 0xd8, 0x26d, 0x192, 0x329, 0x201, 0x2a0, 0x3e0, 0x191, 0x1a4, 0x2b0, 0x61, 0x368, 0x262, 0x139, 0x15c, 0x3d6, 0x8, 0x3c4, 0x378, 0x1e3, 0x3c0, 0x29a, 0x5f, 0x135, 0x37a, 0x112, 0x31e, 0x1e4, 0xaf, 0x397, 0x6b, 0x5d, 0x1c4, 0x3a4, 0x26c, 0x3ee, 0x346, 0x3be, 0x2d8, 0x2b1, 0x21d, 0x307, 0x3dd, 0x141, 0xd, 0x5a, 0x2ab, 0x2a9, 0x258, 0x286, 0x1f8, 0x108, 0x3aa, 0xbb, 0x1f4, 0x32e, 0x16e, 0x3ad, 0x3d4, 0xf9, 0x31a, 0xf1, 0x1bc, 0x1e3, 0x389, 0x27a, 0x2f8, 0x374, 0x383, 0x19, 0x7b, 0x3b1, 0xef, 0x310, 0x26f, 0x2c6, 0x3c7, 0x3ea, 0x141, 0x1a, 0x168, 0x175, 0x2ca, 0x382, 0xe8, 0x1c7, 0x252, 0x366, 0x16a, 0x97, 0x1b2, 0x44, 0x3f3, 0x13a, 0x3ab, 0x187, 0x265, 0xa5, 0x144, 0x32f, 0x22d, 0x313, 0x37c, 0x2, 0x1e2, 0x378, 0x3c6, 0x31b, 0xfd, 0x1f9, 0x2e1, 0x30f, 0x32, 0xf6, 0x36b, 0x1de, 0x229, 0xd7, 0x185, 0x387, 0x3dd, 0x282, 0x34, 0x2d0, 0x2ea, 0x19d, 0x30d, 0x1d0, 0x38e, 0xad, 0x2c5, 0x2d4, 0x12e, 0x364, 0x88, 0x3ef, 0x274, 0x35f, 0x30e, 0xc3, 0x14a, 0x288, 0x257, 0x53, 0x22f, 0x2f1, 0x4, 0x3c4, 0x2f9, 0x385, 0x23f, 0x1fa, 0x3f2, 0x1cb, 0x217, 0x64, 0x1ec, 0x2df, 0x3bc, 0x5b, 0x1ae, 0x30a, 0x307, 0x3b3, 0x10d, 0x68, 0x1a9, 0x1dd, 0x33a, 0x213, 0x3a0, 0x315, 0x15a, 0x183, 0x1a1, 0x1e2, 0x2f9, 0x303, 0xee, 0x3cb, 0x357, 0x11e, 0xe9, 0x26c, 0x3a3, 0x5, 0x263, 0x10f, 0x314, 0x356, 0xfc, 0x210, 0x16f, 0x34d, 0x3ce, 0x134, 0x11, 0x3fd, 0x13a, 0x35f, 0x215, 0x30c, 0x242, 0xda, 0x262, 0xed, 0x1ed, 0x55, 0x12, 0x1db, 0x238, 0x253, 0x327, 0x358, 0x3b2, 0x3f8, 0x359, 0x250, 0x101, 0x5a, 0x2be, 0x2ca, 0x30d, 0x3a0, 0x223, 0x161, 0x3, 0x226, 0x302, 0x10c, 0x132, 0x54, 0x1f0, 0x322, 0x13b, 0x2bd, 0xec, 0xf, 0x2ac, 0x311, 0x135, 0x1f3, 0x104, 0x239, 0x3b1, 0x1de, 0x5b, 0x35c, 0x33, 0xe, 0x34e, 0x1e8, 0x236, 0x11d, 0x2cf, 0x16e, 0x2af, 0x137, 0x237, 0xff, 0x36, 0x26d, 0x241, 0x2fc, 0x160, 0x1e1, 0xdf, 0x1, 0x1e2, 0x2f9, 0x303, 0xee, 0x3cb, 0x357, 0x11e, 0xe9, 0x26c, 0x3a3, 0x5, 0x263, 0x10f, 0x314, 0x356, 0xfc, 0x210, 0x16f, 0x34d, 0x3ce, 0x134, 0x3c4, 0x3f6, 0x2e, 0x2fb, 0x18e, 0x5d, 0x23b, 0xea, 0x94, 0x284, 0x5a, 0x175, 0x33a, 0x5e, 0x27e, 0xf9, 0xe6, 0x180, 0x2c8, 0x192, 0x17e, 0x160, 0x3c2, 0x37c, 0x8, 0x21f, 0x38f, 0x170, 0x3f5, 0x6b, 0x2e8, 0x1fc, 0x359, 0xa9, 0xd, 0x2d0, 0x3ba, 0x1e6, 0x2f0, 0x3d4, 0x3c1, 0x339, 0x1b, 0x26d, 0x8b, 0x3e2, 0x312, 0x22f, 0x3d6, 0x40, 0xdc, 0x47, 0x392, 0x397, 0x358, 0x36d, 0x3fb, 0x2fe, 0x141, 0x68, 0x2ad, 0x1ef, 0x32b, 0x3ad, 0x29f, 0x237, 0x1fe, 0xd8, 0x34c, 0x51, 0x32f, 0xa6, 0x15c, 0x28f, 0x200, 0x2e9, 0x238, 0xaf, 0x87, 0x2f6, 0x35e, 0x3e7, 0x3dd, 0x21a, 0x340, 0x145, 0x363, 0x16e, 0x157, 0xd5, 0x19c, 0x3eb, 0x2c9, 0x256, 0x288, 0x14e, 0x139, 0x2f2, 0x55, 0x24, 0x365, 0x1e4, 0x171, 0x31, 0x39d, 0x2c6, 0x307, 0x2d7, 0xf4, 0x236, 0x23a, 0x32e, 0x362, 0x2aa, 0x381, 0x3c3, 0x170, 0x3e3, 0x1ac, 0x36d, 0x3ff, 0x3ea, 0x21a, 0x289, 0x11d, 0x32e, 0x2cd, 0x2ba, 0x125, 0x3ab, 0x23, 0x56, 0xc2, 0x1c3, 0xab, 0x311, 0xdd, 0x30f, 0x190, 0x1f7, 0x206, 0xcf, 0x6a, 0x258, 0x3a, 0x38e, 0x161, 0xc, 0x228, 0x130, 0x25b, 0xb0, 0x3c2, 0x2f1, 0x20, 0xdc, 0x8e, 0x253, 0x87, 0x1e5, 0x163, 0x307, 0x1a7, 0x3d0, 0x194, 0x3e8, 0x111, 0x106, 0x3fd, 0xe1, 0x195, 0x69, 0x2d2, 0x76, 0x1e, 0x14d, 0x2f8, 0x396, 0x138, 0x26c, 0x297, 0x50, 0x1d6, 0x15b, 0x382, 0x349, 0x13c, 0x73, 0x180, 0x199, 0x241, 0x3e2, 0x22d, 0xae, 0x28f, 0x9, 0x3b6, 0x1e4, 0x2e2, 0xc4, 0xd7, 0x33, 0x38, 0x85, 0x2ee, 0x2ec, 0x1e7, 0x268, 0x88, 0x347, 0x1f, 0x2cc, 0x13b, 0x2e6, 0x2db, 0x3c0, 0x1fa, 0x3af, 0x23c, 0x341, 0x10b, 0x254, 0x212, 0x2be, 0x33a, 0xbc, 0x1ea, 0x3c1, 0x30b, 0x317, 0x392, 0x247, 0x1e5, 0x2c6, 0x7, 0x123, 0x177, 0x2ec, 0x3ce, 0x1b2, 0x49, 0x15, 0x3e0, 0x24c, 0x9f, 0x378, 0x17, 0x1ff, 0x6b, 0x3b2, 0x3ff, 0x3dd, 0x7a, 0x65, 0x1f4, 0x111, 0x20c, 0x3ef, 0x301, 0x166, 0x13b, 0x1c5, 0x37e, 0x23f, 0x39f, 0x115, 0x23b, 0x3a8, 0x152, 0x68, 0x2a6, 0x2cf, 0x362, 0x2ba, 0x24a, 0x2b7, 0x118, 0x169, 0x76, 0x3c, 0x13d, 0x3ed, 0x11e, 0x341, 0x216, 0x142, 0xb4, 0x3ba, 0x391, 0x353, 0xd5, 0x279, 0x2c7, 0x30c, 0x234, 0x2e5, 0xab, 0x22b, 0x374, 0x4e, 0x136, 0x297, 0xa0, 0x351, 0x2ca, 0x5e, 0x1ea, 0x38b, 0x1fe, 0x360, 0xa5, 0x6d, 0x19a, 0x19f, 0x2a3, 0x1f3, 0x32, 0x37b, 0x103, 0xcf, 0xd4, 0x172, 0x1d0, 0x9e, 0x73, 0x300, 0x26d, 0x22c, 0x257, 0x139, 0x3da, 0x159, 0x112, 0x318, 0x2df, 0x3be, 0x3a6, 0x314, 0x286, 0x377, 0x15a, 0x6, 0x21f, 0x47, 0xaf, 0x31, 0xd7, 0xcc, 0x380, 0x108, 0x36a, 0x1a1, 0x302, 0xe4, 0x2c, 0x3c2, 0x3d6, 0x200, 0x365, 0x33b, 0xef, 0x2d8, 0x133, 0x356, 0x3db, 0xad, 0x6, 0x59, 0x192, 0x3e2, 0xa6, 0x2f2, 0x2a8, 0x112, 0x239, 0x36e, 0x1cf, 0x21e, 0x258, 0xe8, 0x9e, 0xe6, 0x1b, 0x34c, 0x288, 0x262, 0x2cb, 0x2a3, 0x3e6, 0xc8, 0x3ee, 0x14, 0x1d6, 0x165, 0x5e, 0x3d4, 0x237, 0x3eb, 0x265, 0x8d, 0x376, 0xab, 0x5f, 0x1cb, 0x270, 0x344, 0x254, 0x5a, 0x3ba, 0x32b, 0x157, 0x2a1, 0x3d1, 0x46, 0x2b0, 0x76, 0x78, 0xfd, 0x357, 0x1c4, 0xea, 0xa9, 0x68, 0x145, 0x32e, 0x326, 0x3fa, 0x1c2, 0xb3, 0x13b, 0x38a, 0x1e3, 0x1dc, 0x18e, 0x2e8, 0x3fb, 0x3dd, 0xf4, 0x194, 0x3bb, 0x134, 0x110, 0x20e, 0x3e0, 0x91, 0x27c, 0x3f6, 0x170, 0x397, 0x2f6, 0x2c6, 0xe, 0x85, 0x3aa, 0x293, 0x12e, 0x37, 0x11c, 0x171, 0x310, 0x2d6, 0x36c, 0x3f0, 0x252, 0x6, 0xb2, 0x241, 0x32f, 0x272, 0x2ef, 0x37a, 0x32, 0x1f7, 0x14, 0x3ac, 0x19d, 0x2f0, 0x137, 0x279, 0x30e, 0xac, 0x3b, 0x78, 0x1fa, 0x147, 0x23b, 0x2bb, 0x10d, 0x236, 0x3e8, 0x9a, 0x110, 0x15, 0x39b, 0x81, 0x381, 0x227, 0xaf, 0x62, 0x35c, 0x269, 0x7e, 0x148, 0x306, 0x114, 0xc9, 0x3e2, 0x14c, 0x3da, 0x16d, 0x104, 0x3b9, 0x206, 0x271, 0x2b6, 0x5e, 0x3a1, 0xce, 0x367, 0x211, 0x184, 0xf, 0x13d, 0x3af, 0x1c4, 0x1d4, 0x2a4, 0x340, 0x7d, 0x111, 0x22, 0x287, 0x1f0, 0x91, 0xf1, 0x3c3, 0x392, 0x10e, 0x26f, 0xcc, 0x309, 0x29, 0x366, 0x226, 0x98, 0x17e, 0x22d, 0x179, 0x2a8, 0x224, 0xf6, 0x346, 0xcf, 0x350, 0x30d, 0xf5, 0x31f, 0x3eb, 0xc3, 0x234, 0x386, 0x2a2, 0x3f2, 0x23c, 0x23e, 0x250, 0x68, 0x28a, 0xa3, 0x106, 0x6e, 0x79, 0x39a, 0x16c, 0x266, 0x286, 0x38e, 0x23d, 0x1b, 0x12b, 0xda, 0x196, 0x22b, 0x396, 0x3a4, 0x4a, 0x1a, 0x145, 0xa3, 0x20c, 0x347, 0x1f0, 0x122, 0x3c4, 0x227, 0x15e, 0x188, 0x2d6, 0x2d1, 0x3db, 0x2b4, 0x60, 0x26d, 0x144, 0xcd, 0x275, 0xdd, 0x9c, 0x344, 0x142, 0x1a9, 0x363, 0x193, 0x3fd, 0x20b, 0x24d, 0x9f, 0x3f6, 0x1c9, 0x10e, 0xd7, 0x330, 0x7e, 0x290, 0x3, 0xb2, 0x8b, 0xa7, 0x3b4, 0x2a3, 0x383, 0x9b, 0x24e, 0x2d, 0x37d, 0x16e, 0x2ba, 0x274, 0xb3, 0xe5, 0xde, 0x2e, 0x3cf, 0x1e5, 0x21d, 0x1c0, 0x210, 0x366, 0x45, 0x260, 0x3e2, 0x298, 0x373, 0x37a, 0x64, 0x3d5, 0xa0, 0x2be, 0x3cc, 0x157, 0x296, 0x167, 0x1a4, 0x1c5, 0x3c6, 0x2fb, 0x1ac, 0x2b5, 0xe, 0x214, 0x2de, 0x1a1, 0x13, 0x25b, 0x312, 0x179, 0x159, 0x82, 0x3b9, 0x5, 0x1d6, 0x19d, 0x1e9, 0xd5, 0xdc, 0x1e4, 0xef, 0x2ed, 0x4b, 0xe8, 0xf9, 0x1fe, 0x265, 0x61, 0xf, 0xfd, 0x28e, 0x1fc, 0x3dd, 0x3a9, 0x1d1, 0x12e, 0x218, 0x2c, 0x22f, 0x55, 0x112, 0x1ec, 0x206, 0x1d6, 0x33a, 0x3ad, 0x2a1, 0x2b7, 0x1a4, 0x38a, 0x303, 0x3f5, 0x2f6, 0x21d, 0x380, 0x52, 0x306, 0x59, 0x8b, 0x14e, 0x2cb, 0x135, 0x4e, 0x344, 0x284, 0x2ad, 0x32e, 0x106, 0x347, 0x3e0, 0x81, 0x21f, 0x238, 0x39a, 0x2d8, 0x18a, 0x1d, 0x9e, 0x339, 0x2c9, 0x8d, 0x386, 0x29a, 0x357, 0x23b, 0x2fe, 0xf4, 0xbb, 0x323, 0x43, 0x201, 0x3c2, 0x28f, 0x120, 0x239, 0x346, 0x33c, 0x165, 0x2f0, 0xd5, 0x3d1, 0x230, 0x173, 0x1e3, 0x2fb, 0x358, 0x2c6, 0x70, 0x108, 0x366, 0x8a, 0x192, 0x32f, 0x1da, 0x2a3, 0x30f, 0x26c, 0x254, 0x2d0, 0x363, 0x326, 0x3ef, 0x7c, 0x91, 0x3c4, 0x47, 0x171, 0x5b, 0x133, 0x286, 0x315, 0xe6, 0x1b8, 0x399, 0x371, 0x283, 0x172, 0x27e, 0x67, 0x187, 0x2b0, 0x369, 0xee, 0x6b, 0x2b5, 0x38, 0x108, 0x2c5, 0x228, 0x8b, 0x29c, 0x33e, 0x1ba, 0xe9, 0x4a, 0x68, 0x7d, 0x9a, 0x92, 0x149, 0x1be, 0x200, 0x235, 0x1b7, 0x263, 0x15b, 0x178, 0xd5, 0x3ab, 0xd2, 0x38a, 0x20f, 0x3cf, 0x39d, 0x198, 0xfc, 0xad, 0x60, 0x1a6, 0x6d, 0x32c, 0x17c, 0x23c, 0x1d4, 0x10d, 0x194, 0x3ce, 0x225, 0x201, 0x38d, 0x22e, 0x112, 0x3d8, 0xa, 0x2ab, 0x3cc, 0x155, 0x13a, 0x166, 0x321, 0x3f6, 0x32d, 0xc4, 0x1a5, 0x2a5, 0x38e, 0xe6, 0x1b0, 0x242, 0x386, 0x13d, 0x147, 0x1fc, 0x3b3, 0x2bf, 0x293, 0x2c4, 0x390, 0x312, 0x1ed, 0x1bd, 0xc8, 0x297, 0x2d, 0x1ef, 0x2cd, 0x3f3, 0x7c, 0x122, 0x30b, 0x238, 0x33d, 0x372, 0x4b, 0x1d0, 0x3e4, 0x3eb, 0x211, 0x3b, 0x3c0, 0x267, 0x3b2, 0x307, 0x10a, 0x1b5, 0x113, 0x370, 0x27f, 0x3be, 0x6a, 0x213, 0x29f, 0x3ec, 0x69, 0x38a, 0x17, 0x327, 0xd7, 0x1b6, 0x3bf, 0x31a, 0x6c, 0x121, 0x386, 0x27a, 0x115, 0x3fb, 0x34e, 0x35d, 0x1a1, 0x98, 0x3cd, 0x1da, 0x29e, 0x9c, 0x216, 0x34, 0x7d, 0x134, 0x248, 0x25a, 0x3d6, 0x90, 0x7b, 0x206, 0x351, 0x3cc, 0x2aa, 0xe1, 0x322, 0x27c, 0x227, 0x2e2, 0x2d8, 0x221, 0x1d0, 0x3c1, 0x3b7, 0xac, 0x3b0, 0xee, 0xd6, 0x2c6, 0x1c0, 0xa4, 0x6, 0x332, 0x119, 0x196, 0x17c, 0x71, 0x359, 0x7a, 0x176, 0x12e, 0x72, 0x2c0, 0x2f2, 0x1bd, 0x190, 0x24e, 0x168, 0x2cf, 0x106, 0x107, 0x277, 0x8, 0x3b6, 0x3dc, 0x1cf, 0x350, 0xbc, 0xd5, 0x35f, 0x348, 0x6f, 0xb8, 0x10e, 0x2b1, 0x1ab, 0x1c7, 0xe6, 0x360, 0x11a, 0xf, 0x3f4, 0xba, 0x3e7, 0x246, 0x2de, 0x113, 0xc9, 0x257, 0x2cb, 0xdd, 0xe9, 0x94, 0x1a0, 0x3e8, 0x1b2, 0x2e9, 0x1ee, 0x1cf, 0x2a9, 0x2f0, 0x2a1, 0x195, 0x1ca, 0x3f6, 0xaf, 0x5b, 0x18a, 0xe8, 0x3c1, 0x367, 0x2b0, 0x1bf, 0x2fb, 0x2f6, 0xcc, 0x1f8, 0x161, 0x1b, 0x294, 0x386, 0xfd, 0x5d, 0x3e7, 0x85, 0x36a, 0x8a, 0x8b, 0x262, 0x38c, 0x243, 0xea, 0x21a, 0xbb, 0x12e, 0xe4, 0x312, 0x3bd, 0x3e6, 0x26c, 0x284, 0x145, 0x222, 0x92, 0x12d, 0x3d6, 0x120, 0x1ec, 0x14, 0x175, 0x16e, 0x3fa, 0x7c, 0x81, 0xdc, 0x33b, 0x3be, 0xd4, 0x5e, 0xd5, 0x2b7, 0x13b, 0x378, 0x392, 0x188, 0x133, 0x1d, 0xf9, 0x3eb, 0x56, 0x3b0, 0x1dc, 0x358, 0x21d, 0x3f, 0xad, 0x180, 0x256, 0x376, 0x29a, 0x28e, 0x3fb, 0x295, 0x16f, 0x113, 0x192, 0x14e, 0x275, 0x1cb, 0x11f, 0x141, 0x194, 0x323, 0x218, 0x160, 0x2f2, 0x37a, 0x249, 0x254, 0x2ad, 0x146, 0x110, 0x2a0, 0x37c, 0x24, 0x239, 0x206, 0x2ab, 0x32b, 0x17d, 0x1db, 0x3b1, 0x263, 0x2ca, 0x2af, 0x13a, 0x322, 0x1e2, 0x238, 0x1de, 0x10f, 0x30d, 0x137, 0x35f, 0x13b, 0x2f9, 0x253, 0x5b, 0x314, 0x3a0, 0x237, 0x215, 0x2bd, 0x303, 0x327, 0x35c, 0x356, 0x223, 0xff, 0x30c, 0xec, 0xee, 0x358, 0x33, 0xfc, 0x161, 0x36, 0x242, 0xf, 0x3cb, 0x3b2, 0xe, 0x210, 0x3, 0x26d, 0xda, 0x2ac, 0x357, 0x3f8, 0x34e, 0x16f, 0x226, 0x241, 0x262, 0x311, 0x11e, 0x359, 0x1e8, 0x34d, 0x302, 0x2fc, 0xed, 0x135, 0xe9, 0x250, 0x236, 0x3ce, 0x10c, 0x160, 0x1ed, 0x1f3, 0x26c, 0x101, 0x11d, 0x134, 0x132, 0x1e1, 0x55, 0x104, 0x3a3, 0x5a, 0x2cf, 0x11, 0x54, 0xdf, 0x12, 0x239, 0x5, 0x2be, 0x16e, 0x3fd, 0x1f0, 0x1, 0x1db, 0x3b1, 0x263, 0x2ca, 0x2af, 0x13a, 0x322, 0x1e2, 0x238, 0x1de, 0x10f, 0x30d, 0x137, 0x35f, 0x13b, 0x2f9, 0x253, 0x5b, 0x314, 0x3a0, 0x237, 0x3b6, 0x2df, 0x33c, 0xf3, 0x15d, 0x20b, 0x244, 0x1b8, 0x1ee, 0x335, 0x2ca, 0x157, 0xe1, 0x126, 0x21f, 0x399, 0x375, 0x2a9, 0x3d2, 0x24a, 0x191, 0x1e2, 0x79, 0x371, 0x6a, 0xbc, 0x2a1, 0x25d, 0x9f, 0x47, 0x273, 0x283, 0x30d, 0x26e, 0x167, 0x1ca, 0x3c3, 0x2e2, 0x2ed, 0x172, 0x3a1, 0x3d1, 0x299, 0x2f9, 0xaf, 0x16c, 0x96, 0x27e, 0x279, 0x69, 0x6f, 0x1c9, 0x310, 0x18a, 0x3a0, 0x67, 0x46, 0x1c5, 0x5c, 0x31, 0x29d, 0x3a, 0x3c1, 0x187, 0x35a, 0x303, 0x247, 0x16b, 0x286, 0x278, 0x3df, 0x2b0, 0x2f5, 0x3e3, 0xd7, 0x1ab, 0x223, 0x1fe, 0x2b, 0x369, 0x2fb, 0x3ca, 0xdb, 0x2e7, 0x398, 0xc3, 0x76, 0xee, 0x2b9, 0xcc, 0x3e9, 0x23d, 0x2c9, 0x184, 0x389, 0x6b, 0x30a, 0x7e, 0x161, 0x6c, 0x11a, 0x78, 0xc7, 0x2b5, 0x380, 0x252, 0x300, 0x294, 0x203, 0x3cb, 0x36d, 0x38, 0xa4, 0x30, 0x365, 0x36e, 0x1d6, 0x32b, 0x3fa, 0x3e0, 0x8, 0x31e, 0x346, 0x2ab, 0x16e, 0x3ef, 0x33f, 0x40, 0xc6, 0x206, 0x175, 0x362, 0x347, 0x1ce, 0x200, 0x239, 0x14, 0x3ba, 0x326, 0x20e, 0x26b, 0x24, 0x1ec, 0xa0, 0x1ef, 0x106, 0x54, 0x37c, 0x120, 0x37b, 0x109, 0x363, 0x22, 0x2a0, 0x3d6, 0x112, 0x3ee, 0x5a, 0x32e, 0x110, 0x12d, 0x28f, 0x82, 0x34f, 0x2d0, 0x146, 0x92, 0x17a, 0x55, 0x19, 0x24e, 0x2ad, 0x222, 0x99, 0x3c2, 0x2a8, 0xc8, 0x254, 0x145, 0x134, 0xc1, 0x22f, 0x16d, 0x249, 0x284, 0x23a, 0x1b2, 0x201, 0x15c, 0x37a, 0x26c, 0xd, 0x1f4, 0x18b, 0x2c, 0x2f2, 0x3e6, 0x344, 0x68, 0x3bb, 0x43, 0x160, 0x3bd, 0x30f, 0x216, 0x340, 0x1e7, 0x218, 0x312, 0x1d7, 0x4e, 0x94, 0x236, 0x323, 0xe4, 0xa6, 0x2a3, 0x270, 0xa9, 0x194, 0x12e, 0x329, 0x139, 0x135, 0x3a4, 0x141, 0xbb, 0x162, 0x2c3, 0x1a3, 0x2ab, 0x2dc, 0x3a7, 0x1ce, 0x9, 0xf6, 0xa0, 0x3de, 0x11, 0x2a0, 0x3a5, 0x41, 0x34f, 0x1a9, 0x111, 0x99, 0x38d, 0x2b2, 0x249, 0x101, 0xfa, 0x18b, 0x58, 0x3da, 0x30f, 0x25, 0x11b, 0x323, 0x1c8, 0x298, 0x135, 0x341, 0x10d, 0x1d1, 0x20d, 0x393, 0x275, 0x8f, 0x17f, 0x177, 0x342, 0x241, 0x334, 0x1f9, 0xfe, 0x295, 0x2dd, 0x164, 0x6d, 0x2a2, 0x22a, 0x307, 0x210, 0x18, 0x256, 0x305, 0x39f, 0x35e, 0x309, 0x2b4, 0xd8, 0xc2, 0x31b, 0x358, 0x198, 0x377, 0x339, 0x211, 0x2db, 0x3f5, 0x1ae, 0x143, 0xf9, 0x2c7, 0x2bd, 0x2e, 0x62, 0xc5, 0x349, 0x338, 0xd2, 0x378, 0x15e, 0x372, 0x2e4, 0x137, 0x2ce, 0x24b, 0x8e, 0x3bc, 0xd4, 0x1e9, 0x9d, 0x93, 0x37, 0xf7, 0x263, 0x27d, 0x2ba, 0x7c, 0x2, 0x18f, 0x346, 0x15f, 0x1b1, 0x347, 0x39c, 0x12, 0x1ec, 0x140, 0x3b5, 0x22, 0x18f, 0x285, 0x175, 0x193, 0x15, 0x37c, 0x89, 0x3d5, 0x2d0, 0x111, 0x132, 0x22f, 0x1bd, 0xd1, 0x68, 0x2f7, 0x39, 0xa6, 0x29e, 0x341, 0x21a, 0x34d, 0x4c, 0x14e, 0x22b, 0x388, 0x2d7, 0x1b5, 0xb2, 0x6d, 0x14d, 0xba, 0xe, 0x148, 0x300, 0x8d, 0x1e0, 0xd6, 0xcc, 0x377, 0x27b, 0x56, 0x2f5, 0x327, 0x1a5, 0x74, 0x67, 0x230, 0x1bc, 0x15e, 0x2ed, 0x382, 0x1aa, 0xb3, 0x1e2, 0x3c8, 0x1cf, 0x19d, 0x15d, 0x7c, 0x4, 0x235, 0x206, 0x1dd, 0x245, 0x54, 0x1eb, 0x224, 0x34f, 0x352, 0x4d, 0xc1, 0xae, 0x2fd, 0x344, 0x1a0, 0x3ce, 0xe4, 0x298, 0x26a, 0x11f, 0x7a, 0x12f, 0x130, 0x131, 0xbe, 0x23b, 0x34e, 0x2dd, 0x2c8, 0x1b4, 0x13d, 0x2e8, 0x38, 0x129, 0x1b, 0x234, 0x389, 0x358, 0x330, 0x1c7, 0x1fe, 0x158, 0x3c6, 0x87, 0x29d, 0x1d0, 0x19c, 0xd2, 0x2f9, 0x171, 0x3a6, 0x213, 0x2a1, 0x31e, 0x206, 0x3ba, 0x106, 0x2a0, 0x28f, 0x19, 0x254, 0x23a, 0x18b, 0x160, 0x1d7, 0x270, 0x141, 0x1d1, 0x26, 0x14e, 0x5f, 0x23b, 0x295, 0x366, 0x26d, 0x376, 0x3e1, 0x35e, 0x3f, 0x31a, 0x265, 0x3b0, 0x3f5, 0x2b1, 0x1d, 0x237, 0x230, 0x378, 0x171, 0x345, 0x5e, 0x125, 0x93, 0xdc, 0x36b, 0x1d6, 0x16e, 0x347, 0x26b, 0x120, 0x3ee, 0x2d0, 0x222, 0xc1, 0x15c, 0x3e6, 0x216, 0x236, 0x12e, 0x17e, 0x2cb, 0x243, 0x2fe, 0x3aa, 0x8a, 0x288, 0x151, 0x5d, 0xe, 0x290, 0x1b, 0x61, 0x23f, 0x2f6, 0x36c, 0x9e, 0x367, 0x173, 0x170, 0x5b, 0x258, 0x29f, 0x195, 0x27c, 0x1e4, 0x1cf, 0x33a, 0x17d, 0x3e0, 0x40, 0x239, 0xa0, 0x363, 0x110, 0x17a, 0x2a8, 0x249, 0xd, 0x3bb, 0x218, 0xa6, 0x135, 0x11f, 0xf4, 0xb5, 0x192, 0x334, 0x3ed, 0x3fb, 0x21, 0x6, 0x256, 0xf, 0x18e, 0x21d, 0x3db, 0x339, 0x235, 0xa, 0x1ef, 0x44, 0xbd, 0x2a8, 0x9b, 0x34, 0x1e7, 0x1c8, 0xed, 0x1cb, 0x2bb, 0x1d5, 0x8a, 0x119, 0x14d, 0x2e8, 0xe0, 0x2b4, 0x2c9, 0xec, 0x3fe, 0x2b1, 0x3a, 0xce, 0x1a4, 0x3e5, 0x273, 0xd4, 0x353, 0x301, 0x1, 0x235, 0xa, 0x1ef, 0x44, 0xbd, 0x2a8, 0x9b, 0x34, 0x1e7, 0x1c8, 0xed, 0x1cb, 0x2bb, 0x1d5, 0x8a, 0x119, 0x14d, 0x2e8, 0xe0, 0x2b4, 0x2c9, 0xec, 0x3fe, 0x2b1, 0x3a, 0xce, 0x1a4, 0x3e5, 0x273, 0xd4, 0x353, 0x301, 0x1, 0x235, 0xa, 0x1ef, 0x44, 0xbd, 0x2a8, 0x9b, 0x34, 0x1e7, 0x1c8, 0xed, 0x1cb, 0x2bb, 0x1d5, 0x8a, 0x119, 0x14d, 0x2e8, 0xe0, 0x2b4, 0x2c9, 0xec, 0x3fe, 0x2b1, 0x3a, 0xce, 0x1a4, 0x3e5, 0x273, 0xd4, 0x353, 0x301, 0x1, 0x235, 0xa, 0x1ef, 0x44, 0xbd, 0x2a8, 0x9b, 0x34, 0x1e7, 0x1c8, 0xed, 0x1cb, 0x2bb, 0x1d5, 0x8a, 0x63, 0x28, 0x363, 0x49, 0x38d, 0x37a, 0x10b, 0x65, 0x162, 0x393, 0x311, 0x23b, 0x246, 0x205, 0x256, 0x3c, 0xd6, 0x269, 0x4f, 0x2c7, 0x38a, 0x253, 0x1d3, 0x5e, 0x9d, 0x122, 0x365, 0x103, 0x37d, 0x22, 0xbd, 0x159, 0x26c, 0x1a0, 0x24f, 0x17e, 0x33e, 0x71, 0x2d7, 0x1b3, 0xd3, 0x386, 0xc7, 0x33, 0x2e7, 0x3f1, 0x35a, 0x170, 0x16c, 0x1c1, 0x2a1, 0x24d, 0x1b8, 0x36e, 0x2be, 0x245, 0x2a0, 0x22e, 0x190, 0xd, 0x2f7, 0x1c8, 0x1da, 0x325, 0x1f5, 0x16f, 0x164, 0x2d9, 0x3e1, 0x163, 0x3f0, 0x339, 0x158, 0x20f, 0x188, 0x12c, 0x137, 0xb3, 0x30b, 0x3dc, 0x1d6, 0x1b1, 0x15, 0x3d6, 0x208, 0xa1, 0x1f4, 0x10c, 0x14c, 0x1ba, 0x3a8, 0x2ee, 0x8a, 0x232, 0x13d, 0x36d, 0x21b, 0x23d, 0x30c, 0x2f5, 0x10e, 0x18a, 0x1ea, 0x167, 0x27c, 0x399, 0xcf, 0x32b, 0x3a7, 0xdf, 0x112, 0x127, 0x28a, 0x18b, 0xc6, 0xa0, 0x32e, 0x99, 0x15c, 0x30f, 0xa9, 0x1d1, 0x130, 0x334, 0x357, 0x307, 0x290, 0xd8, 0x76, 0x3f5, 0x1a5, 0x349, 0x3d1, 0x24b, 0x1e4, 0x263, 0x32b, 0x347, 0x37c, 0x82, 0x254, 0x1f4, 0x218, 0x139, 0x1cb, 0x2fe, 0x16f, 0x2c8, 0x376, 0x337, 0x21d, 0x2e7, 0x3eb, 0x173, 0x392, 0x2ed, 0x5e, 0x13a, 0x81, 0x31e, 0x14, 0x363, 0x92, 0x22f, 0x3e6, 0x94, 0xbb, 0x26, 0x262, 0x3ed, 0x3e7, 0x52, 0x1b, 0x308, 0x2fb, 0x2b1, 0xe8, 0xfb, 0x1ca, 0x238, 0x1cf, 0x1e6, 0x3ef, 0x26b, 0x112, 0x24e, 0x23a, 0x43, 0xa6, 0x1ba, 0x359, 0x3aa, 0x59, 0x368, 0x3e1, 0x2c6, 0x3db, 0x1fe, 0x1ad, 0x170, 0x2d8, 0x30d, 0x125, 0x91, 0x365, 0x206, 0x1ef, 0x110, 0x3c2, 0x37a, 0x216, 0x194, 0x302, 0x14e, 0x2f8, 0x3fb, 0x108, 0x180, 0x61, 0x1dc, 0xd7, 0x1d, 0x19c, 0x13b, 0x47, 0x3be, 0x33a, 0x3fa, 0x18c, 0x280, 0x146, 0x182, 0x3da, 0x270, 0x3d, 0x2d4, 0x51, 0x2a2, 0x3b2, 0x3f, 0x1cc, 0x158, 0x2e, 0xb6, 0x382, 0x125, 0x122, 0x18f, 0x14, 0x2cf, 0x248, 0x15c, 0x217, 0x2a4, 0x293, 0x324, 0x251, 0x5d, 0xe0, 0x18d, 0x30c, 0x3c6, 0xc4, 0x258, 0x1aa, 0x24d, 0x2e9, 0x285, 0x2f3, 0x110, 0x38d, 0x1f3, 0x94, 0x176, 0x98, 0x334, 0x2a7, 0x7, 0xad, 0x19b, 0x2db, 0x87, 0x314, 0x34b, 0xb3, 0x37, 0x1b7, 0x175, 0x20c, 0xbd, 0x16d, 0x281, 0xca, 0x302, 0x29c, 0x3f2, 0x3e7, 0xa4, 0x6c, 0x76, 0x3e3, 0x29d, 0x27e, 0x167, 0x1e2, 0x1ee, 0x3ac, 0x193, 0x2a0, 0xaa, 0x136, 0x340, 0x25c, 0x393, 0x5f, 0x3f8, 0x84, 0x180, 0xc2, 0x379, 0x2b1, 0x1d0, 0x3ec, 0x24b, 0x3c8, 0x19e, 0x16e, 0x15, 0x343, 0xc8, 0x1a, 0x395, 0x17e, 0xe3, 0x319, 0x85, 0xc, 0x242, 0x23f, 0x333, 0x20a, 0x19c, 0x318, 0x212, 0x222, 0x16, 0x3ae, 0x11f, 0x2bf, 0x114, 0x368, 0x39f, 0x33, 0x315, 0x187, 0xde, 0x39a, 0x350, 0x15d, 0x33f, 0x90, 0x297, 0x23a, 0x10c, 0x272, 0x243, 0x36f, 0x2c5, 0x256, 0x1e0, 0x1e5, 0x286, 0xce, 0x276, 0x238, 0x335, 0x25f, 0x20e, 0x343, 0x190, 0x68, 0x97, 0x3cd, 0x5f, 0x3f9, 0x210, 0x1b, 0x3b, 0x3e3, 0x133, 0x1ea, 0x32a, 0x21f, 0x1b7, 0x2ea, 0x22, 0x1e1, 0x2fd, 0x94, 0x2ec, 0x260, 0x196, 0x22a, 0xe0, 0x31a, 0x2b, 0x20f, 0x5b, 0x382, 0x24a, 0x81, 0x63, 0x140, 0x146, 0x304, 0x373, 0x3a4, 0x3d0, 0x226, 0x6d, 0x3f4, 0x185, 0x2e7, 0x3b7, 0x31d, 0x171, 0x6a, 0x2ae, 0x3e0, 0x12, 0x3d5, 0x145, 0x225, 0x14c, 0x1cb, 0x3ea, 0x2dd, 0x34c, 0x3c, 0x2b9, 0x356, 0x31f, 0x348, 0x47, 0x2e3, 0x3cc, 0x347, 0x1eb, 0x32, 0xd, 0x395, 0x2fc, 0x38c, 0xfe, 0x42, 0x180, 0x239, 0x5a, 0x134, 0x160, 0x135, 0x359, 0x16f, 0x26d, 0xf, 0x358, 0x356, 0x237, 0x13b, 0x238, 0x263, 0x16e, 0x54, 0x55, 0x26c, 0x236, 0x302, 0x262, 0x357, 0xe, 0x161, 0x30c, 0x303, 0x5b, 0x30d, 0x13a, 0x1, 0x239, 0x5a, 0x134, 0x160, 0x135, 0x359, 0x16f, 0x26d, 0xf, 0x358, 0x356, 0x237, 0x13b, 0x238, 0x263, 0x16e, 0x54, 0x55, 0x26c, 0x236, 0x302, 0x262, 0x357, 0xe, 0x161, 0x30c, 0x303, 0x5b, 0x30d, 0x13a, 0x1, 0x239, 0x5a, 0x134, 0x160, 0x135, 0x359, 0x16f, 0x26d, 0xf, 0x358, 0x356, 0x237, 0x13b, 0x238, 0x263, 0x16e, 0x54, 0x55, 0x26c, 0x236, 0x302, 0x262, 0x357, 0xe, 0x161, 0x30c, 0x303, 0x5b, 0x30d, 0x13a, 0x1, 0x239, 0x5a, 0x134, 0x160, 0x135, 0x359, 0x16f, 0x26d, 0xf, 0x358, 0x356, 0x237, 0x13b, 0x238, 0x263, 0x16e, 0x54, 0x55, 0x26c, 0x236, 0x302, 0x7b, 0x168, 0x1b2, 0x22d, 0x2e1, 0x3dd, 0x2c5, 0x14a, 0x23f, 0x1ae, 0x3a0, 0x2b7, 0x381, 0x1b7, 0x3ba, 0x220, 0xae, 0x4e, 0x3d, 0x28d, 0x6d, 0x3cb, 0x66, 0x9e, 0x8c, 0x3c3, 0x3be, 0x3cc, 0x107, 0x28f, 0x9b, 0x11b, 0x302, 0xcd, 0x147, 0x70, 0x23d, 0x158, 0x170, 0x1d3, 0x3d2, 0x7c, 0x9, 0x3a3, 0x23a, 0x39, 0x361, 0x1c4, 0x10a, 0xc0, 0x308, 0x3e3, 0xc5, 0x29f, 0x322, 0x3b6, 0x14, 0x255, 0x304, 0x1d7, 0x23e, 0x1d5, 0x2c8, 0x305, 0x1ac, 0x356, 0x67, 0xe5, 0x1e4, 0x271, 0x193, 0x12d, 0x2da, 0x4a, 0x1d1, 0x324, 0x2ac, 0x36d, 0x3f0, 0x3f1, 0x38a, 0x2e2, 0x350, 0x17d, 0x39c, 0x41, 0x284, 0x3ce, 0x1f1, 0x5f, 0x3ff, 0x148, 0x2c9, 0x37e, 0xc4, 0x2e4, 0x24a, 0x204, 0x239, 0xb4, 0xd9, 0x312, 0x374, 0x3ea, 0x366, 0xa5, 0x31b, 0xd7, 0x1d0, 0x35f, 0x3c4, 0x2df, 0x1dd, 0x110, 0xf6, 0x1a9, 0x18b, 0x298, 0x8f, 0x295, 0x18, 0xc2, 0x3f5, 0xc5, 0x137, 0x93, 0x18f, 0x140, 0x222, 0xb0, 0x26a, 0x2fe, 0x1b3, 0xa5, 0x23f, 0x35c, 0x29b, 0x195, 0x6e, 0x285, 0x363, 0x264, 0x373, 0x11f, 0x1d5, 0x199, 0xf, 0x17b, 0x105, 0xfb, 0x13e, 0x3dc, 0x175, 0x88, 0x57, 0x4e, 0x7a, 0x226, 0x368, 0xc7, 0xdb, 0x3c1, 0x299, 0x79, 0x33c, 0x193, 0x25a, 0x37a, 0x250, 0x12f, 0x51, 0x27a, 0x185, 0x315, 0x23, 0x3e5, 0x3be, 0x391, 0x15, 0x55, 0x1a2, 0x328, 0x130, 0x251, 0x1d9, 0x1f8, 0x3f1, 0x31d, 0x39a, 0x2b6, 0x3fd, 0x37c, 0x64, 0xd0, 0x162, 0x131, 0x2a7, 0x70, 0x73, 0x169, 0x392, 0x10f, 0x2ae, 0x33f, 0x89, 0xa1, 0x1e7, 0x1f1, 0xbe, 0x3e7, 0x252, 0xc3, 0x303, 0x16c, 0xbc, 0x20b, 0x100, 0x3d5, 0x23a, 0x72, 0x19f, 0x23b, 0x84, 0x36, 0x3b0, 0x21c, 0xb9, 0x125, 0x1ec, 0x2ad, 0x43, 0x1da, 0x1c4, 0x21, 0x1b, 0x3b0, 0x31, 0x2e4, 0x13a, 0x8, 0x37b, 0x145, 0x218, 0x2cb, 0x23b, 0x108, 0xd8, 0x1bf, 0x188, 0x30d, 0x1c2, 0x40, 0x3ee, 0x23a, 0xe4, 0x275, 0x1fc, 0x52, 0x2c9, 0x1e3, 0x5b, 0x5e, 0x20b, 0x200, 0x34f, 0x1f4, 0x329, 0x38c, 0x3fb, 0x290, 0x265, 0x303, 0x2d8, 0x2f0, 0x7c, 0x24, 0x24e, 0x3bb, 0x17e, 0x5f, 0x3e7, 0xad, 0x30c, 0x2e, 0x2ed, 0x3ad, 0x3e0, 0x120, 0x254, 0x1e7, 0x3e2, 0x2f8, 0x307, 0x161, 0x56, 0x170, 0x345, 0x157, 0x33f, 0x112, 0x284, 0x323, 0x32f, 0x3ed, 0xe, 0x31a, 0x2b0, 0x392, 0x21e, 0x2aa, 0x1ce, 0x82, 0xd, 0x12e, 0x14e, 0x357, 0x70, 0xe6, 0x1ad, 0xaf, 0xd4, 0x17d, 0x26b, 0x19, 0x68, 0x162, 0x262, 0x28e, 0x380, 0x339, 0x173, 0x171, 0x2a9, 0x3fa, 0x37c, 0xc8, 0x340, 0x302, 0x334, 0x5d, 0x3f, 0x1fe, 0x3d8, 0x2a6, 0x218, 0x19f, 0xfe, 0x52, 0x19b, 0x385, 0x2d8, 0x1e9, 0x1f0, 0x120, 0xa1, 0x395, 0x32f, 0x3d3, 0x38, 0xe6, 0x35a, 0x2bc, 0x2a9, 0x3fd, 0x1eb, 0x249, 0x65, 0x98, 0xab, 0x2d3, 0x377, 0x30e, 0x3e5, 0x2e3, 0x16e, 0x149, 0x1bd, 0xa9, 0x16a, 0x232, 0x337, 0xdb, 0x31f, 0x1ca, 0x27f, 0x2be, 0x110, 0x2b8, 0x1d2, 0x177, 0x199, 0x3c, 0x39d, 0x1d0, 0x2ce, 0xdc, 0x5, 0xa3, 0x2c, 0x26a, 0x3ea, 0x306, 0x11a, 0x3fe, 0x18a, 0x1aa, 0x244, 0x239, 0x1a9, 0x225, 0x1da, 0x388, 0x84, 0xd8, 0x37e, 0x229, 0x5e, 0x1f, 0x12, 0x24e, 0x37f, 0x1f1, 0x2f8, 0x207, 0x18d, 0x2b0, 0x32d, 0x6a, 0x17d, 0xdf, 0x64, 0x340, 0x20d, 0xcb, 0x2e8, 0x3f0, 0x3b7, 0x378, 0x2eb, 0x391, 0x54, 0x159, 0x4a, 0x293, 0xa2, 0x3f4, 0xcc, 0x1f2, 0x299, 0x1e4, 0x3ac, 0x11, 0x22f, 0x9c, 0x3d0, 0x59, 0x3b9, 0x28a, 0xe4, 0x1c6, 0x3ff, 0xad, 0x2b, 0x2e0, 0x21e, 0x2ba, 0xdf, 0xc8, 0x11b, 0x4c, 0xab, 0x1af, 0x1c7, 0x46, 0x227, 0xcf, 0x326, 0x1e1, 0x217, 0xf4, 0x228, 0x305, 0x2f6, 0x74, 0x167, 0xdc, 0xa, 0x28c, 0x160, 0x2e1, 0x1a7, 0x30, 0x3b, 0x10e, 0x2e4, 0xe1, 0x80, 0x34f, 0x3d9, 0x2fc, 0x2f8, 0x7, 0x23d, 0x1ad, 0x2bc, 0x15b, 0x3ef, 0x343, 0xd1, 0xbb, 0x241, 0x13d, 0x21d, 0x278, 0x348, 0x1e4, 0x351, 0x44, 0x15c, 0x1d2, 0x2ee, 0x26d, 0x1e0, 0x1ae, 0x27e, 0x2cc, 0x2c3, 0x109, 0xd9, 0x14c, 0x23c, 0x214, 0x36, 0x1bf, 0x229, 0xbc, 0x7c, 0x90, 0xa1, 0x323, 0xa7, 0x2a7, 0x380, 0xff, 0x31d, 0xef, 0xf3, 0x15, 0x2a8, 0x4a, 0x12f, 0x288, 0x39f, 0xdb, 0x237, 0x321, 0x3dc, 0x3ba, 0x248, 0x373, 0xea, 0x1b5, 0xa5, 0x1dc, 0x29d, 0x137, 0x91, 0x318, 0x1a9, 0x43, 0x37b, 0x23a, 0x329, 0x5f, 0x307, 0x31a, 0x1ad, 0x171, 0x165, 0x347, 0x55, 0x216, 0x293, 0x288, 0x337, 0x36c, 0x19c, 0x27c, 0x36e, 0x363, 0x201, 0x135, 0x3dd, 0x6, 0x308, 0x87, 0x2e4, 0x1c2, 0x200, 0x24e, 0x1e7, 0x32f, 0x357, 0x380, 0x1fe, 0x6f, 0x371, 0x32b, 0x2a0, 0x37a, 0x141, 0x113, 0x376, 0x358, 0x1d, 0x2b7, 0xdc, 0x14, 0x222, 0x312, 0x243, 0x85, 0x1b, 0x1bf, 0x5b, 0x2f0, 0x3e0, 0x112, 0xd, 0x162, 0x334, 0x2e8, 0x3db, 0x30e, 0x38f, 0x263, 0x326, 0x3c2, 0x4e, 0x3a9, 0x2c8, 0x78, 0xd7, 0x27e, 0x191, 0x31e, 0x5a, 0x18b, 0x1da, 0x23b, 0x52, 0x265, 0x2e, 0x345, 0x2aa, 0x26b, 0xc8, 0x236, 0x130, 0x151, 0x2c6, 0x9e, 0x1a4, 0x1e4, 0x2ab, 0x110, 0x2f2, 0x11f, 0x16f, 0x256, 0x1dc, 0x133, 0xd5, 0x81, 0x1ec, 0x145, 0xe4, 0x38c, 0x3e7, 0x161, 0x2b0, 0xaf, 0x2a9, 0x3ef, 0x2ff, 0xfa, 0x17e, 0x1f9, 0x38, 0x339, 0x31d, 0x3bc, 0x32b, 0x149, 0x1f3, 0x21a, 0x114, 0x203, 0x39d, 0x29b, 0x2cc, 0x31e, 0xb4, 0x225, 0x2cb, 0x3f8, 0x252, 0x56, 0x32d, 0x350, 0x3ef, 0x117, 0x10b, 0x293, 0x119, 0xc7, 0x356, 0x1f6, 0x30b, 0x206, 0x28c, 0x189, 0x243, 0x10a, 0x6c, 0x1e3, 0x1b9, 0x2af, 0x1ce, 0x32, 0x11b, 0x130, 0x2a2, 0x30a, 0xf9, 0x276, 0xf7, 0x3ba, 0x132, 0x355, 0x2fe, 0x205, 0x184, 0x87, 0x1c1, 0x301, 0x24, 0xa1, 0x97, 0x262, 0xba, 0x3e9, 0x30e, 0x317, 0x19e, 0x106, 0x57, 0x1d2, 0x3aa, 0x291, 0xee, 0x133, 0x1aa, 0x204, 0x37b, 0x7d, 0xbf, 0x2f8, 0x1c, 0x398, 0x38a, 0x1de, 0x391, 0x2a0, 0x2fd, 0x10d, 0x8a, 0x305, 0x3ca, 0x349, 0x166, 0x18f, 0x5a, 0x316, 0x361, 0x1fc, 0x129, 0x2b, 0x392, 0x1a8, 0x3f3, 0x28f, 0x281, 0x34d, 0x288, 0x267, 0x1ab, 0xfb, 0x1f7, 0x3e8, 0x3e2, 0x3af, 0x309, 0x3eb, 0x1fb, 0x39e, 0x326, 0x313, 0xe9, 0x3aa, 0x12b, 0x3b8, 0x18a, 0x296, 0x10, 0x34f, 0x2f7, 0x257, 0x28e, 0xfc, 0x2c7, 0x38f, 0x19e, 0x20c, 0x15c, 0x28b, 0x2de, 0x294, 0x3fe, 0x96, 0x13a, 0x100, 0x95, 0x323, 0x131, 0xba, 0x3db, 0x23, 0x8e, 0x1d6, 0x88, 0x1ed, 0xea, 0x1b3, 0x11a, 0x397, 0x172, 0x384, 0x24, 0x142, 0x25c, 0x334, 0x3b2, 0x1c7, 0x230, 0xf2, 0x15f, 0x92, 0x2ef, 0x2bb, 0x306, 0x184, 0x10e, 0x30d, 0x3e, 0x240, 0xd, 0x181, 0x32c, 0x35e, 0x4f, 0x348, 0x33b, 0x1dd, 0x132, 0x2a3, 0x3ea, 0xc, 0x76, 0xc4, 0xbc, 0x3e0, 0x41, 0xd0, 0x26, 0x2ac, 0x185, 0xf9, 0xe5, 0x3dc, 0x1ef, 0x304, 0x26a, 0x2d7, 0xc0, 0x369, 0x5b, 0x3d2, 0x277, 0x19, 0x11b, 0x260, 0x29a, 0x66, 0x38b, 0x24b, 0x1b7, 0x2cf, 0x2c, 0x2e1, 0x123, 0x1b, 0x3ee, 0x3bb, 0x32f, 0x28e, 0x1f8, 0x30e, 0x47, 0x1d6, 0x110, 0x3bd, 0x359, 0x306, 0x308, 0x31, 0x5e, 0x3e0, 0x82, 0x340, 0x130, 0x29a, 0xcc, 0x237, 0x27c, 0x346, 0x146, 0x312, 0x23c, 0x108, 0x265, 0x170, 0xd4, 0x3ef, 0x55, 0x94, 0x1a1, 0x376, 0x2f6, 0x349, 0x191, 0xc6, 0x2ad, 0xe4, 0x5f, 0xe, 0x339, 0x6f, 0x3be, 0x362, 0x3c2, 0x270, 0x3aa, 0x256, 0x2fb, 0x4b, 0x13a, 0x200, 0x254, 0x12e, 0x334, 0x36d, 0x315, 0x1a4, 0x33b, 0x3ba, 0xc1, 0x135, 0x2d7, 0x180, 0x1bf, 0x2d8, 0x157, 0x26b, 0x249, 0xbb, 0x51, 0x337, 0x356, 0x3d1, 0xdc, 0xa0, 0x1b2, 0x1da, 0x1fc, 0xad, 0x2b0, 0x171, 0x33a, 0x54, 0x37a, 0x21a, 0x59, 0x78, 0x2b1, 0x29f, 0x81, 0x37b, 0x1f4, 0x3e2, 0x357, 0x3f, 0x367, 0x38f, 0x33c, 0x22, 0x2f2, 0xea, 0x366, 0x61, 0x87, 0x30d, 0x7c, 0x112, 0x68, 0x26, 0x3d5, 0x2f7, 0x14e, 0xba, 0x377, 0x230, 0x3c8, 0x1dd, 0xc1, 0x26a, 0x34e, 0x1b, 0x3c6, 0x3a6, 0x17d, 0x3a5, 0x10b, 0xb5, 0x2d9, 0x17b, 0x349, 0x322, 0x318, 0x145, 0x25b, 0x3f2, 0x380, 0x3df, 0x3c3, 0x33c, 0x44, 0x3da, 0x359, 0x205, 0x3b, 0x188, 0x1e9, 0xe7, 0xc8, 0x328, 0x22c, 0x337, 0x2a5, 0x35f, 0x2e9, 0x212, 0x225, 0x275, 0x3c7, 0x73, 0x38a, 0x2eb, 0x1b1, 0x3c2, 0xe9, 0x2b3, 0x294, 0x3e3, 0x172, 0x20b, 0x240, 0x34, 0x26, 0x2a2, 0x66, 0x237, 0xf1, 0x103, 0x222, 0x14c, 0x319, 0x290, 0xac, 0x2bc, 0x33a, 0xa8, 0x1f3, 0xf4, 0x199, 0x31b, 0x133, 0x14b, 0x20, 0x24e, 0x24f, 0x19a, 0x36d, 0x223, 0x299, 0x1ee, 0x3de, 0x16, 0x1cb, 0x10a, 0x360, 0x2e, 0x35, 0x3f3, 0x55, 0x128, 0x28d, 0x386, 0x333, 0x1ea, 0x91, 0x3d8, 0xfa, 0x3e2, 0x2a7, 0xfc, 0x30e, 0x8e, 0x351, 0x92, 0x3a3, 0x3ce, 0x262, 0x3b2, 0x223, 0x13b, 0x3b1, 0x2cf, 0x160, 0x11e, 0x210, 0x30c, 0x253, 0x2ca, 0x54, 0x1f3, 0x1e8, 0x26d, 0xee, 0x314, 0x13a, 0x12, 0x101, 0x302, 0x2ac, 0x33, 0x237, 0x1e2, 0x5, 0x134, 0xed, 0x3f8, 0x161, 0x2bd, 0x1de, 0x16e, 0x1e1, 0xe9, 0x16f, 0x242, 0x327, 0x30d, 0x1f0, 0x104, 0x236, 0x241, 0x3cb, 0x356, 0x35f, 0x1db, 0x5a, 0x10c, 0x311, 0xe, 0xff, 0x2f9, 0x263, 0x11, 0x1ed, 0x359, 0x3, 0xec, 0x5b, 0x2af, 0xdf, 0x26c, 0x34d, 0xda, 0x358, 0x3a0, 0x322, 0x239, 0x11d, 0x2fc, 0x357, 0xfc, 0x215, 0x238, 0x2be, 0x132, 0x135, 0x34e, 0x36, 0x303, 0x10f, 0x3fd, 0x55, 0x250, 0x226, 0xf, 0x35c, 0x137, 0x1, 0x3a3, 0x3ce, 0x262, 0x3b2, 0x223, 0x13b, 0x3b1, 0x2cf, 0x160, 0x11e, 0x210, 0x30c, 0x253, 0x2ca, 0x54, 0x1f3, 0x1e8, 0x26d, 0xee, 0x314, 0x13a, 0x34f, 0x323, 0x334, 0x35e, 0xf9, 0x24b, 0x346, 0x222, 0x139, 0x1fc, 0x161, 0x173, 0x371, 0x362, 0x22f, 0x11f, 0x366, 0x308, 0x188, 0x3ad, 0x26b, 0x26c, 0x293, 0x368, 0x2f6, 0x27e, 0x91, 0x37b, 0x3bb, 0x14e, 0x2e8, 0x315, 0x13b, 0x36b, 0x32e, 0x312, 0x1c4, 0x290, 0x2b0, 0x39a, 0x32b, 0x17a, 0x270, 0x16f, 0x8d, 0x87, 0x5e, 0x33f, 0xc8, 0xbb, 0x288, 0x6b, 0xe8, 0x191, 0x239, 0x23a, 0x3e2, 0x28e, 0x3db, 0x230, 0x33b, 0x1ef, 0x2c, 0x243, 0x108, 0x30c, 0xaf, 0x33a, 0x2a0, 0x30f, 0x177, 0x256, 0x3f5, 0x2e4, 0x7c, 0x82, 0x236, 0x8b, 0x337, 0x286, 0x195, 0x31e, 0x2ad, 0x329, 0x3ed, 0x3f, 0x30e, 0x238, 0x175, 0xc1, 0x1ba, 0x85, 0x2c9, 0x170, 0x2a9, 0x20e, 0x37a, 0xf4, 0x26d, 0x1dc, 0x4b, 0x1c2, 0x120, 0x68, 0x130, 0xfd, 0x36c, 0x3d1, 0x2e9, 0x5a, 0x218, 0x5f, 0x70, 0x3eb, 0x297, 0x97, 0x196, 0x185, 0x31f, 0x3c4, 0x28, 0x2c1, 0x275, 0x207, 0xff, 0x3f6, 0x271, 0x49, 0x2a3, 0x1a7, 0x6c, 0x2e, 0x1a8, 0x107, 0x37a, 0x1e8, 0x1a6, 0x2fb, 0xb9, 0x3e, 0x82, 0x65, 0x22c, 0x18e, 0x3a, 0x2cc, 0x239, 0x7d, 0x393, 0x5d, 0x1c7, 0x299, 0x36b, 0x255, 0x53, 0x23b, 0x15a, 0x2bd, 0x371, 0x2cd, 0xae, 0xea, 0x205, 0x1d8, 0x2d8, 0x15d, 0x343, 0x94, 0x226, 0x3c, 0x1a5, 0x14b, 0x100, 0x284, 0x20d, 0x14d, 0x269, 0x1f6, 0x370, 0x5a, 0x39, 0x17c, 0x380, 0x2c7, 0x11c, 0x175, 0x182, 0x2e1, 0x21, 0xc3, 0x253, 0x33a, 0x149, 0x27, 0x3aa, 0x121, 0x247, 0x5e, 0x277, 0x320, 0x1d1, 0xda, 0x17b, 0x27e, 0x122, 0x1f7, 0x1e7, 0xcd, 0x1af, 0xf9, 0x9f, 0x103, 0x134, 0x3b4, 0x3f7, 0xe6, 0xde, 0x335, 0x22, 0x373, 0x3ea, 0x180, 0x3c6, 0x10f, 0x3ef, 0x159, 0x10d, 0x2c8, 0x127, 0x25c, 0xab, 0x66, 0x338, 0xdc, 0x2d, 0x39, 0x2f8, 0x21b, 0x215, 0x1e4, 0x2f3, 0x58, 0x23c, 0x148, 0x169, 0xef, 0x1b1, 0x57, 0xea, 0x3, 0x369, 0x2ed, 0x1fd, 0xaa, 0x141, 0x164, 0x77, 0x4b, 0x301, 0x224, 0x236, 0x22c, 0x31c, 0xe8, 0x24d, 0x3d8, 0x3bb, 0x131, 0x2d3, 0xf9, 0x13e, 0x5, 0x1b2, 0x33e, 0x207, 0x1fe, 0x3c3, 0x3ac, 0x99, 0xdd, 0x10a, 0x265, 0x253, 0x27d, 0x12d, 0x138, 0x2de, 0x61, 0xc4, 0x353, 0x37c, 0x10b, 0x342, 0xf, 0x2d6, 0x14b, 0x200, 0x202, 0x4c, 0xfd, 0x1ab, 0x167, 0x31e, 0x2a6, 0x2fc, 0x28e, 0x377, 0x348, 0x36b, 0xa3, 0x14c, 0x1fc, 0x18d, 0x31d, 0x1cf, 0x11, 0x373, 0x3dd, 0x209, 0x20f, 0xd4, 0x107, 0x2fd, 0x3a9, 0x12b, 0x3e3, 0x30d, 0x39b, 0x190, 0x1d1, 0x1b4, 0x1e5, 0x3d4, 0x204, 0x297, 0x12e, 0x251, 0x33, 0x19c, 0x6e, 0x212, 0x218, 0x24e, 0x162, 0x151, 0x269, 0x3d1, 0x365, 0x2ad, 0x17e, 0x28e, 0x2e7, 0x13b, 0x36e, 0x222, 0x1da, 0x3e7, 0x339, 0x3f6, 0x1d6, 0x99, 0x1ba, 0x21, 0x30c, 0x171, 0x32b, 0x3c2, 0x11f, 0x306, 0x3b0, 0x2ed, 0x3fa, 0x2a8, 0x21a, 0x26d, 0x2fb, 0x2e4, 0x3e0, 0xc8, 0x1d1, 0x368, 0x39d, 0x29f, 0x8, 0x254, 0x302, 0x29a, 0x36c, 0x2b7, 0x31e, 0x145, 0x3e2, 0x5d, 0x315, 0x1ca, 0x346, 0x134, 0x2cb, 0x307, 0x1fe, 0x38f, 0x2ab, 0xc1, 0x1cb, 0x108, 0x56, 0x39a, 0x16e, 0x22f, 0xea, 0x6, 0x1bf, 0x345, 0x3ef, 0x16d, 0xf4, 0x34c, 0x3f5, 0x30d, 0x33f, 0x249, 0x293, 0x376, 0xd7, 0xd5, 0x40, 0x284, 0x26, 0xfd, 0x356, 0x195, 0xc6, 0x23a, 0x32f, 0x2e8, 0x9e, 0x24b, 0x206, 0x1b2, 0x275, 0xe, 0x3eb, 0x47, 0x175, 0x201, 0x243, 0x52, 0x2b0, 0xef, 0x362, 0x15c, 0x359, 0x30, 0x1e3, 0x21e, 0x347, 0x95, 0x181, 0x29a, 0x2d1, 0x2ce, 0xc6, 0x7d, 0xa7, 0x36d, 0x1f2, 0x1e2, 0xa0, 0x86, 0x17c, 0x3f, 0x8c, 0xf7, 0x32e, 0x14c, 0x3f9, 0xe6, 0x2f9, 0xeb, 0x99, 0x374, 0x84, 0x56, 0x33d, 0x1b1, 0x15c, 0x2bb, 0xc0, 0x303, 0x1a8, 0x2a, 0x30f, 0x35d, 0x234, 0x188, 0x2ae, 0x343, 0xa9, 0xb2, 0xee, 0x258, 0xf8, 0x64, 0x1d1, 0x2d9, 0x26f, 0xd5, 0x80, 0x202, 0x130, 0x3cb, 0x20a, 0x191, 0x3d8, 0x2f7, 0x334, 0x185, 0xce, 0xdc, 0xb4, 0x390, 0x357, 0x3bf, 0x299, 0x36e, 0x4d, 0x361, 0x307, 0x3fc, 0x227, 0x175, 0xb, 0x11e, 0x290, 0x35a, 0x1df, 0x106, 0x373, 0x36f, 0xd8, 0x2e0, 0x19d, 0x12d, 0xe9, 0x1b3, 0x76, 0x1b9, 0x1fd, 0x2a8, 0x3d, 0x1a6, 0x3f5, 0x213, 0xe7, 0x26c, 0x16a, 0x203, 0x1a5, 0x24a, 0x90, 0x340, 0x116, 0x231, 0x349, 0x122, 0x3a3, 0x12e, 0x156, 0x330, 0x3d1, 0x12a, 0x20d, 0xfd, 0x143, 0x166, 0x1ec, 0x2f7, 0x261, 0x21d, 0x279, 0x1db, 0x2ad, 0x1f1, 0xba, 0x9e, 0x13e, 0x28, 0x43, 0x17c, 0x7e, 0x230, 0x3b1, 0x28c, 0x1da, 0x387, 0x3fc, 0x47, 0x1dd, 0x58, 0x1c4, 0x2b4, 0x31d, 0x263, 0x49, 0x26a, 0x21, 0x2b, 0x33d, 0x362, 0x179, 0x1f5, 0x1b, 0xb8, 0x2ca, 0x12d, 0x1d2, 0x2c5, 0x3b0, 0x3a6, 0x3d7, 0x37a, 0x2bf, 0x121, 0x31, 0x2af, 0x3a5, 0xa9, 0x164, 0x3b8, 0x2e4, 0x39b, 0x9b, 0xb5, 0x203, 0x34a, 0x13a, 0x89, 0x65, 0x288, 0x17b, 0x3a1, 0x8, 0x142, 0x4c, 0x3e1, 0x20a, 0x322, 0x37b, 0x395, 0x32c, 0xcc, 0x3ec, 0x2c3, 0x145, 0x393, 0x1d9, 0xf9, 0x1e2, 0x140, 0x218, 0x3f2, 0x3f0, 0x1a4, 0x1b7, 0x4d, 0x2cb, 0x7, 0x3df, 0x238, 0x2f3, 0x2c0, 0x23b, 0x18d, 0xde, 0x33c, 0x248, 0x374, 0x108, 0x158, 0x1de, 0x326, 0x3da, 0x3b3, 0xd8, 0x254, 0x26, 0x3e1, 0x1d, 0x93, 0x3ee, 0x12e, 0x151, 0x36c, 0x195, 0x239, 0x3bb, 0x334, 0x21d, 0xfb, 0x365, 0x145, 0x32f, 0x36d, 0x3c1, 0x21f, 0x5a, 0x329, 0x28e, 0x315, 0x24b, 0x14, 0x43, 0x2f8, 0x1f8, 0x1a4, 0x36e, 0x134, 0x275, 0x70, 0x30e, 0x33b, 0x32e, 0x139, 0x3e7, 0x1fe, 0x47, 0x3ba, 0x160, 0x23b, 0x31a, 0x378, 0x1d6, 0xc1, 0x243, 0x290, 0x173, 0x1cf, 0x110, 0x135, 0x21, 0x56, 0xef, 0x326, 0x3bd, 0x2d7, 0x2c9, 0xaf, 0x32b, 0x22f, 0x359, 0x180, 0x2e, 0x165, 0x12d, 0x3a4, 0x306, 0x1bf, 0x21e, 0x20e, 0x30f, 0x16f, 0x308, 0x2d8, 0x3fa, 0x16d, 0x3a9, 0x294, 0x31, 0x157, 0x28f, 0x141, 0x26d, 0x3f5, 0x5e, 0x26b, 0x216, 0x8a, 0x23f, 0x258, 0x3e0, 0x249, 0xb5, 0xf, 0x133, 0x1c2, 0x82, 0xbb, 0x368, 0xd7, 0x2a1, 0x24, 0x340, 0x51, 0x358, 0x3d4, 0x8, 0x284, 0x130, 0xa1, 0x98, 0x337, 0x1d0, 0x244, 0x24e, 0x20d, 0x3f4, 0x1d, 0x126, 0x3a3, 0x162, 0x13d, 0x143, 0x191, 0x2ff, 0x97, 0x151, 0x2d1, 0x25d, 0x1ec, 0x3ce, 0x251, 0x269, 0x167, 0x318, 0x3bb, 0x261, 0x66, 0x3d1, 0x235, 0xfa, 0x262, 0x185, 0x279, 0x365, 0x28a, 0xa7, 0x35e, 0x67, 0x370, 0x2ad, 0x3cd, 0x3b2, 0x3c1, 0x37, 0x168, 0x17e, 0xba, 0x278, 0x3c4, 0x212, 0x390, 0x28e, 0x223, 0x13e, 0xa0, 0x39, 0x3af, 0x2e7, 0x394, 0xa, 0x43, 0x1f9, 0x3e9, 0x13b, 0x285, 0x2c1, 0x5f, 0x7e, 0xd2, 0x36e, 0x268, 0x1c6, 0x380, 0x8c, 0x3b1, 0x222, 0x19f, 0x38, 0x30e, 0x27f, 0xa3, 0x1da, 0x207, 0x3b7, 0x1e4, 0x2cf, 0x298, 0x3e7, 0x3fc, 0x11c, 0x1ef, 0x22d, 0x3f9, 0x339, 0x317, 0x1dd, 0x160, 0x7f, 0x73, 0x3f6, 0x15f, 0x16, 0x1c4, 0x2c2, 0x1bc, 0x1d6, 0x182, 0x11e, 0xad, 0x31d, 0x19e, 0x99, 0x142, 0x260, 0x18e, 0x13f, 0x2, 0x284, 0xc9, 0x31c, 0x27e, 0x4, 0x101, 0x192, 0x231, 0xf5, 0x8, 0x202, 0x324, 0x6b, 0x1ea, 0x10, 0xd, 0x241, 0xd6, 0x3d4, 0x20, 0x1a, 0x8b, 0x1ac, 0x3a1, 0x40, 0x34, 0x116, 0x358, 0x34b, 0x80, 0x68, 0x22c, 0x2b9, 0x29f, 0x100, 0xd0, 0x51, 0x17b, 0x137, 0x200, 0x1a0, 0xa2, 0x2f6, 0x26e, 0x9, 0x340, 0x144, 0x1e5, 0xd5, 0x12, 0x289, 0x288, 0x3ca, 0x1aa, 0x24, 0x11b, 0x119, 0x39d, 0x354, 0x48, 0x236, 0x232, 0x333, 0x2a1, 0x90, 0x65, 0x6d, 0x26f, 0x14b, 0x120, 0xca, 0xda, 0xd7, 0x296, 0x240, 0x194, 0x1b4, 0x1ae, 0x125, 0x89, 0x328, 0x368, 0x35c, 0x24a, 0x112, 0x259, 0x2d9, 0x2b1, 0x9d, 0x224, 0xbb, 0x1bb, 0x16b, 0x13a, 0x41, 0x176, 0x376, 0x2d6, 0x274, 0x82, 0x2ec, 0x2e5, 0x1a5, 0xe1, 0x104, 0x1d1, 0x1c3, 0x34a, 0x1c2, 0x284, 0x192, 0x6b, 0x3d4, 0x40, 0x68, 0x51, 0x2f6, 0xd5, 0x24, 0x236, 0x6d, 0xd7, 0x125, 0x112, 0xbb, 0x376, 0x1a5, 0x1c2, 0x19, 0x293, 0xf, 0x18a, 0x7c, 0x249, 0x1a1, 0x3c0, 0x258, 0x33f, 0x344, 0x8a, 0x1dc, 0x30d, 0x26b, 0x94, 0x2c8, 0x3f5, 0x2f0, 0x3d6, 0x141, 0x34c, 0x87, 0x157, 0x55, 0xf4, 0x294, 0x188, 0x17d, 0x16d, 0x177, 0x61, 0x2d8, 0x3ef, 0x3e6, 0x16f, 0x76, 0x345, 0x20e, 0x4e, 0x366, 0x1bf, 0xd4, 0x2a0, 0x3a4, 0x6, 0x303, 0x165, 0x17a, 0xea, 0x180, 0x170, 0x1e6, 0x22f, 0x2fe, 0xd8, 0xaf, 0x16e, 0x2f2, 0x2d7, 0x265, 0x39a, 0x326, 0x1d7, 0x85, 0x56, 0x371, 0x22, 0x135, 0x108, 0x1ad, 0x1cf, 0x92, 0x1cb, 0x290, 0x38a, 0x33c, 0xc1, 0x23c, 0x161, 0x378, 0x2ab, 0x2c, 0x23b, 0xe6, 0x38f, 0x3ba, 0x312, 0x3fb, 0x1fe, 0x238, 0x363, 0x139, 0x307, 0x367, 0x101, 0x241, 0x358, 0x137, 0x12, 0x236, 0xda, 0x35c, 0x13a, 0x104, 0x34d, 0xf, 0x314, 0x1f0, 0x26c, 0x226, 0xee, 0x30d, 0xdf, 0x250, 0x26d, 0x327, 0x2af, 0x55, 0x1e8, 0x242, 0x5b, 0x3fd, 0x1f3, 0x16f, 0xec, 0x10f, 0x54, 0xe9, 0x3, 0x303, 0x2ca, 0x1e1, 0x359, 0x36, 0x253, 0x16e, 0x1ed, 0x34e, 0x30c, 0x1de, 0x11, 0x135, 0x210, 0x2bd, 0x263, 0x132, 0x11e, 0x161, 0x2f9, 0x2be, 0x160, 0x3f8, 0xff, 0x238, 0x2cf, 0xed, 0xe, 0x215, 0x3b1, 0x134, 0x311, 0xfc, 0x13b, 0x5, 0x10c, 0x357, 0x223, 0x1e2, 0x5a, 0x2fc, 0x3b2, 0x237, 0x1db, 0x11d, 0x262, 0x33, 0x35f, 0x239, 0x3ce, 0x2ac, 0x356, 0x322, 0x3a3, 0x302, 0x3cb, 0x3a0, 0x1, 0x101, 0x241, 0x358, 0x137, 0x12, 0x236, 0xda, 0x35c, 0x13a, 0x104, 0x34d, 0xf, 0x314, 0x1f0, 0x26c, 0x226, 0xee, 0x30d, 0xdf, 0x250, 0x26d, 0x202, 0x116, 0x2f6, 0x354, 0x240, 0xbb, 0x1c3, 0x266, 0x7c, 0x136, 0x226, 0x1dc, 0x2f, 0x2f1, 0x141, 0x12b, 0x62, 0x17d, 0x1bd, 0x35d, 0x76, 0x10f, 0xa8, 0x3a4, 0x18, 0x5c, 0x1e6, 0xae, 0x3b3, 0x265, 0x273, 0x20c, 0x135, 0x29, 0x2e6, 0x33c, 0x304, 0x388, 0xe6, 0x227, 0x3de, 0x139, 0x7, 0x215, 0x36b, 0xd9, 0xbe, 0x3db, 0x321, 0x140, 0x329, 0x174, 0x38b, 0x2e9, 0x11d, 0xcd, 0xcc, 0x2ce, 0x3d8, 0x12e, 0x27a, 0x3a, 0x81, 0x142, 0x324, 0x358, 0x26e, 0x48, 0x194, 0x1bb, 0x34a, 0x20b, 0x320, 0x342, 0x23f, 0x382, 0xdf, 0xa9, 0x1a6, 0x10e, 0x2aa, 0x2b2, 0x2ee, 0x308, 0x3a6, 0x15, 0x270, 0x3, 0x20f, 0x33a, 0x313, 0x1f5, 0x2c9, 0x1cd, 0x245, 0x2a3, 0x84, 0x35a, 0x263, 0x264, 0x71, 0x31a, 0x3c3, 0x37d, 0xa6, 0x387, 0x2c7, 0x1ee, 0x9a, 0x311, 0x1f8, 0xe5, 0x28, 0xe4, 0xd, 0x51, 0x39d, 0x125, 0x82, 0x293, 0x78, 0x258, 0x1ce, 0x94, 0x26d, 0x87, 0x2aa, 0x16d, 0x3aa, 0x76, 0x21e, 0x2a0, 0x11f, 0x180, 0x392, 0x16e, 0x3bd, 0x85, 0x2b0, 0x1cf, 0x99, 0x23c, 0x31a, 0x38f, 0x1ef, 0x139, 0xe, 0x46, 0x36e, 0x18b, 0x3ed, 0x315, 0x3c4, 0x2d0, 0x32f, 0x2c6, 0x3d1, 0x239, 0x323, 0x29a, 0x1d, 0x81, 0x284, 0x8b, 0x2f6, 0x2a1, 0x112, 0x1d1, 0xf, 0x4b, 0x33f, 0x216, 0x2c8, 0x397, 0x157, 0x2a8, 0x177, 0x308, 0x345, 0x54, 0x3a4, 0x30, 0x170, 0x32b, 0x2f2, 0x295, 0x56, 0x3be, 0x92, 0x243, 0x161, 0x3f6, 0x3ba, 0xa6, 0x307, 0x30e, 0x36b, 0x1b2, 0x2f8, 0x2e7, 0x27c, 0x5a, 0x3e2, 0x35e, 0xfb, 0xc6, 0x1e7, 0x151, 0x286, 0x91, 0x254, 0x192, 0x358, 0xd5, 0x120, 0xbb, 0x386, 0x18a, 0x3e0, 0x344, 0x59, 0x3f5, 0x3ad, 0x55, 0x3a9, 0x61, 0x2ed, 0x20e, 0x1a, 0x144, 0xd7, 0x274, 0x64, 0x1a1, 0x77, 0x2f, 0x3d6, 0x3d, 0x242, 0x2d8, 0x287, 0x138, 0x6, 0x5c, 0x391, 0x2f2, 0x123, 0x158, 0x1cf, 0x132, 0xe2, 0xe6, 0x8e, 0x197, 0x2cb, 0x309, 0x299, 0x14, 0x1c8, 0x174, 0x237, 0x2c3, 0x3d9, 0xab, 0x2a5, 0x24c, 0x254, 0x324, 0x17b, 0x2a1, 0x224, 0x34d, 0x78, 0xb9, 0x331, 0xa9, 0x291, 0xc4, 0x3fa, 0x3c5, 0x1b3, 0x1e3, 0x2ca, 0x313, 0x3dd, 0xc3, 0x3bc, 0x110, 0x396, 0x2b4, 0x3f6, 0x37d, 0x298, 0xe, 0x8c, 0x1a3, 0x43, 0x2a7, 0x278, 0xdc, 0x28a, 0x19a, 0x269, 0x166, 0x3a3, 0x26, 0x31c, 0x34b, 0x24, 0x328, 0x1c3, 0x18a, 0x3c9, 0x10b, 0x2c8, 0x327, 0x155, 0x16d, 0x35d, 0x1d8, 0xd4, 0x25a, 0x3a8, 0xd8, 0x2e2, 0x83, 0x135, 0xa4, 0x233, 0x2ab, 0x2c0, 0x3f7, 0x367, 0x3dc, 0xd9, 0x2f8, 0x1c7, 0x1e2, 0x2d0, 0x257, 0x30a, 0x2b7, 0x34, 0x119, 0x2b1, 0x301, 0x9b, 0x8a, 0x3fe, 0x353, 0x2a8, 0x1d5, 0xec, 0xd4, 0xbd, 0x2bb, 0x2c9, 0x273, 0x44, 0x1cb, 0x2b4, 0x3e5, 0x1ef, 0xed, 0xe0, 0x1a4, 0xa, 0x1c8, 0x2e8, 0xce, 0x235, 0x1e7, 0x14d, 0x3a, 0x1, 0x34, 0x119, 0x2b1, 0x301, 0x9b, 0x8a, 0x3fe, 0x353, 0x2a8, 0x1d5, 0xec, 0xd4, 0xbd, 0x2bb, 0x2c9, 0x273, 0x44, 0x1cb, 0x2b4, 0x3e5, 0x1ef, 0xed, 0xe0, 0x1a4, 0xa, 0x1c8, 0x2e8, 0xce, 0x235, 0x1e7, 0x14d, 0x3a, 0x1, 0x34, 0x119, 0x2b1, 0x301, 0x9b, 0x8a, 0x3fe, 0x353, 0x2a8, 0x1d5, 0xec, 0xd4, 0xbd, 0x2bb, 0x2c9, 0x273, 0x44, 0x1cb, 0x2b4, 0x3e5, 0x1ef, 0xed, 0xe0, 0x1a4, 0xa, 0x1c8, 0x2e8, 0xce, 0x235, 0x1e7, 0x14d, 0x3a, 0x1, 0x34, 0x119, 0x2b1, 0x301, 0x9b, 0x8a, 0x3fe, 0x353, 0x2a8, 0x1d5, 0xec, 0xd4, 0xbd, 0x2bb, 0x2c9, 0x68, 0x6d, 0x1a5, 0x7c, 0x344, 0x2c8, 0x87, 0x17d, 0x3e6, 0x366, 0x303, 0x1e6, 0x2f2, 0x85, 0x1ad, 0x33c, 0x2c, 0x3fb, 0x367, 0x36b, 0x18b, 0x357, 0xf9, 0x2e9, 0x1f4, 0xab, 0x286, 0x81, 0xd, 0x288, 0x2b1, 0x20b, 0x26c, 0x59, 0x397, 0x2aa, 0x37a, 0x36a, 0x1e3, 0x33a, 0x15c, 0x295, 0x2b0, 0x263, 0x201, 0x1fc, 0x3eb, 0x1ee, 0x1b2, 0x3ed, 0x9e, 0xdc, 0x23a, 0x196, 0x356, 0x91, 0x284, 0x51, 0xd7, 0x1c2, 0x249, 0x8a, 0x3f5, 0x157, 0x16d, 0x16f, 0x1bf, 0x165, 0x22f, 0x2d7, 0x56, 0x1cf, 0xc1, 0x23b, 0x1fe, 0x33b, 0x134, 0x2f8, 0x315, 0x21f, 0x145, 0x334, 0x36c, 0x93, 0x254, 0x8b, 0x39d, 0x13a, 0xc8, 0x113, 0x2fb, 0x3ad, 0x2a8, 0x3aa, 0x3b0, 0x2a9, 0x3c2, 0x3dd, 0x30c, 0x3be, 0x99, 0x1c4, 0x339, 0x1e4, 0x222, 0x5f, 0x2e7, 0x3c4, 0x2ad, 0x262, 0x269, 0x191, 0x24e, 0x192, 0xd0, 0x1b4, 0x133, 0x3c9, 0x4a, 0x34c, 0x310, 0x3a7, 0x270, 0x60, 0x253, 0x326, 0x26a, 0x252, 0x3f6, 0x3de, 0x361, 0x3f, 0x394, 0x2d, 0x32f, 0x33, 0x25d, 0x34f, 0x260, 0x17b, 0x125, 0x32, 0x28d, 0x2fb, 0x353, 0x2b2, 0x16f, 0x37e, 0x19d, 0x15c, 0x123, 0x2d2, 0x33c, 0x58, 0x3f7, 0x30e, 0x2d5, 0x10c, 0x5d, 0x67, 0x63, 0x323, 0x1fa, 0x13f, 0x200, 0x328, 0x203, 0x258, 0xdf, 0x10d, 0x8d, 0x1d3, 0x150, 0xea, 0x1b0, 0x273, 0x110, 0x8f, 0x73, 0x238, 0x28c, 0x22b, 0x2e7, 0x381, 0x2a6, 0x334, 0x2d1, 0x24c, 0x284, 0xa2, 0x35c, 0x20b, 0xd1, 0x164, 0x87, 0x2fa, 0x383, 0x306, 0x5c, 0xb7, 0x1d7, 0x210, 0x233, 0x175, 0x14c, 0x38, 0x1a4, 0x28, 0xbf, 0x35e, 0x3ab, 0x3b9, 0x302, 0x31c, 0x26e, 0x112, 0x12f, 0x31b, 0x5e, 0x117, 0x2bf, 0x76, 0x1a8, 0x1e1, 0x3dd, 0x211, 0x2e3, 0xc1, 0x1a0, 0x2d9, 0x18a, 0xe7, 0x152, 0x294, 0x372, 0xa8, 0xea, 0x360, 0x1de, 0x92, 0xe2, 0x27b, 0x33b, 0xd9, 0x3d3, 0xf9, 0x3b6, 0x37f, 0x29a, 0x3a0, 0x80, 0x194, 0x203, 0xb9, 0x37c, 0x7a, 0xc2, 0x21e, 0xbd, 0x1f5, 0x30c, 0x2e3, 0x182, 0x1fc, 0x3b7, 0x2df, 0x43, 0x22a, 0x67, 0xc6, 0x97, 0x3cb, 0x3d4, 0x90, 0x3a2, 0x3c0, 0x2f, 0x117, 0x177, 0x1d8, 0x15b, 0x22f, 0x34e, 0x169, 0x33c, 0xb0, 0x3c7, 0x46, 0x103, 0x1c8, 0x36d, 0x3ec, 0x3d8, 0x302, 0x231, 0x1aa, 0x82, 0x2d4, 0x3b8, 0x3ad, 0x2b2, 0x2de, 0x1e3, 0xf3, 0x1ed, 0x21, 0x1c5, 0x15f, 0xa6, 0x38, 0x348, 0xa0, 0x1f1, 0x185, 0x195, 0x3a3, 0x260, 0x2f6, 0x9d, 0x190, 0x8a, 0x3cf, 0x15d, 0x3e6, 0x183, 0x5c, 0x16e, 0x355, 0xa4, 0x378, 0x2f3, 0x3b4, 0x3f, 0x321, 0xb4, 0x14e, 0x330, 0x322, 0x254, 0x22c, 0x1ae, 0x20b, 0x340, 0x376, 0x4b, 0x26b, 0x21a, 0x61, 0x21e, 0x17a, 0x3dd, 0x56, 0x263, 0x2c, 0x3e7, 0x46, 0x206, 0x329, 0x35e, 0x2b7, 0x3ee, 0x130, 0x2f6, 0x13a, 0x249, 0x59, 0x87, 0x3fa, 0x4e, 0x30, 0xaf, 0x106, 0x1cb, 0x31a, 0x238, 0x222, 0x2f8, 0x9e, 0x2e9, 0x3bb, 0x29a, 0x349, 0x200, 0xbb, 0x78, 0x30d, 0x28f, 0x177, 0x3b0, 0x165, 0x15c, 0x85, 0x173, 0x2ab, 0xa6, 0x70, 0x13b, 0x109, 0x32f, 0xcc, 0x191, 0x254, 0x51, 0x2b1, 0x7c, 0x216, 0x34c, 0x5b, 0x20e, 0x11f, 0xd8, 0xef, 0x92, 0x1c4, 0x1fe, 0x1ee, 0x18b, 0x28e, 0x237, 0xc6, 0x12e, 0x337, 0x29f, 0x112, 0xb5, 0x1dc, 0x3ad, 0x16d, 0x36a, 0x303, 0x32b, 0x1d7, 0x52, 0x378, 0x1ef, 0x2cb, 0x1f8, 0x27c, 0x2ad, 0x334, 0x356, 0x81, 0x68, 0x368, 0x18a, 0x1ce, 0x141, 0x8d, 0x345, 0x12d, 0x2fe, 0x30c, 0x1cf, 0x201, 0x3fb, 0x30e, 0x289, 0x1c3, 0x258, 0x2f1, 0x3d0, 0x76, 0x15b, 0xae, 0x85, 0x2e6, 0x2be, 0x139, 0x309, 0x321, 0x2d0, 0xcd, 0x1ab, 0x81, 0xd0, 0x1bb, 0x4b, 0xdf, 0x7a, 0x308, 0x1a8, 0x313, 0x295, 0x35a, 0x351, 0xa6, 0xe0, 0xe5, 0x5a, 0x29c, 0x1b6, 0x91, 0x1a, 0x1b4, 0x18a, 0x39c, 0x10d, 0x61, 0x35, 0x1e1, 0x2d7, 0x169, 0xeb, 0x312, 0x1c, 0x299, 0x109, 0x257, 0x330, 0x93, 0x101, 0x232, 0x133, 0x277, 0x2a4, 0x8d, 0x283, 0xbd, 0x3dd, 0xac, 0x19e, 0x160, 0x207, 0xd2, 0xa0, 0x3cd, 0x66, 0x191, 0xa1, 0x144, 0x1a5, 0x3c9, 0x250, 0x294, 0x1d3, 0x292, 0x2fe, 0x211, 0x335, 0x2c, 0x3c7, 0x118, 0x14, 0x2fc, 0x30a, 0xb3, 0x95, 0x22c, 0x2b1, 0xf8, 0x4a, 0x256, 0x1b9, 0x150, 0x359, 0xc3, 0x2e3, 0x201, 0x3ff, 0x23, 0x206, 0x25b, 0x163, 0x195, 0x297, 0x241, 0xd7, 0x1f, 0x10b, 0x34c, 0x11b, 0x305, 0x2e4, 0x343, 0x2ee, 0x1bf, 0xf3, 0x373, 0x52, 0x1fb, 0x2cf, 0x38c, 0x38e, 0x1b8, 0x3bb, 0x27a, 0xf5, 0x120, 0x25e, 0x3b8, 0x157, 0x1f3, 0x205, 0x392, 0x83, 0x396, 0xe6, 0x399, 0x364, 0x28e, 0xce, 0x7b, 0x302, 0x1ac, 0x24a, 0x249, 0x164, 0x62, 0x347, 0x28b, 0x1b0, 0x371, 0x264, 0x3f8, 0x30e, 0x103, 0x25b, 0x2c6, 0x25d, 0x95, 0x51, 0x2d6, 0x3c9, 0xa9, 0x242, 0x283, 0x17a, 0x36f, 0x169, 0x1d6, 0x53, 0xe0, 0x1ca, 0x168, 0xcd, 0x356, 0x204, 0x289, 0x386, 0x172, 0x3a5, 0x177, 0x2db, 0x27d, 0x3bd, 0x29, 0x2f9, 0x363, 0x1c6, 0x1c7, 0xdc, 0x3d9, 0x13d, 0x27e, 0x90, 0x12f, 0x1dc, 0x2af, 0x2fd, 0x306, 0x1c9, 0x245, 0x1cb, 0x73, 0x3c8, 0x1b2, 0x147, 0x67, 0x239, 0x181, 0xd6, 0x125, 0x320, 0xb2, 0x31, 0x3a7, 0x341, 0xd8, 0x3bc, 0x132, 0x1fc, 0x187, 0x285, 0x329, 0x236, 0xf, 0x30d, 0x55, 0x16f, 0x303, 0x16e, 0x135, 0x161, 0x238, 0x134, 0x357, 0x237, 0x239, 0x302, 0x358, 0x13a, 0x26c, 0x26d, 0x5b, 0x54, 0x359, 0x30c, 0x263, 0x160, 0xe, 0x13b, 0x5a, 0x262, 0x356, 0x1, 0x236, 0xf, 0x30d, 0x55, 0x16f, 0x303, 0x16e, 0x135, 0x161, 0x238, 0x134, 0x357, 0x237, 0x239, 0x302, 0x358, 0x13a, 0x26c, 0x26d, 0x5b, 0x54, 0x359, 0x30c, 0x263, 0x160, 0xe, 0x13b, 0x5a, 0x262, 0x356, 0x1, 0x236, 0xf, 0x30d, 0x55, 0x16f, 0x303, 0x16e, 0x135, 0x161, 0x238, 0x134, 0x357, 0x237, 0x239, 0x302, 0x358, 0x13a, 0x26c, 0x26d, 0x5b, 0x54, 0x359, 0x30c, 0x263, 0x160, 0xe, 0x13b, 0x5a, 0x262, 0x356, 0x1, 0x236, 0xf, 0x30d, 0x55, 0x16f, 0x303, 0x16e, 0x135, 0x161, 0x238, 0x134, 0x357, 0x237, 0x239, 0x302, 0x358, 0x13a, 0x26c, 0x26d, 0x5b, 0x54, 0x65, 0x3c, 0x5e, 0x159, 0x1b3, 0x170, 0x245, 0x325, 0x339, 0x3dc, 0x10c, 0x36d, 0x167, 0x127, 0x51, 0x34a, 0xe7, 0x21a, 0x219, 0x2b6, 0x2f2, 0x210, 0x1fb, 0x32e, 0xbe, 0x278, 0x31e, 0x25c, 0x231, 0x125, 0x9b, 0x332, 0x5b, 0xa8, 0x17f, 0x56, 0x271, 0x53, 0x380, 0x9f, 0x2a6, 0xab, 0x1d0, 0x12, 0x293, 0x3b8, 0x155, 0x30f, 0x60, 0x1cd, 0x92, 0x7f, 0x187, 0x206, 0x2fc, 0x66, 0x93, 0x1a, 0x1bb, 0x258, 0x3a5, 0x1d5, 0x1e3, 0x25f, 0x29e, 0x161, 0x79, 0xd9, 0x28e, 0x338, 0x3b9, 0x130, 0x333, 0x3e, 0x94, 0x121, 0x10f, 0x3c2, 0x123, 0x1c5, 0x3ba, 0x19f, 0x377, 0xdc, 0x37f, 0x3f4, 0x29f, 0x104, 0x45, 0x87, 0x3d7, 0x28b, 0x2c9, 0x375, 0x16, 0x307, 0x348, 0x2d, 0x262, 0x2a5, 0x4, 0x194, 0xf0, 0x178, 0x16d, 0x2c5, 0x1c9, 0x106, 0x8f, 0xff, 0x36b, 0x39, 0x1af, 0x195, 0xca, 0xf0, 0x2f0, 0x1bd, 0x205, 0xaf, 0x88, 0x388, 0x367, 0x103, 0x2fc, 0xcc, 0x24c, 0xd0, 0x386, 0x382, 0xaa, 0x36a, 0xb8, 0x245, 0x243, 0xff, 0x2df, 0xe4, 0x163, 0x166, 0x284, 0x1b4, 0x96, 0x3d6, 0x1d5, 0x3c6, 0x16e, 0xdd, 0x23d, 0x33b, 0x225, 0x1d9, 0x2b7, 0x127, 0xa2, 0x133, 0x331, 0x1e8, 0x3b0, 0xf3, 0x3ae, 0xad, 0x11c, 0x268, 0x28e, 0x279, 0x2ff, 0x192, 0x35c, 0x3c9, 0x141, 0x184, 0x15b, 0x2f2, 0x29, 0x3e5, 0x146, 0x3f2, 0x38b, 0x239, 0x13, 0x1e5, 0x20b, 0x4a, 0x121, 0x21e, 0x313, 0x10a, 0x6f, 0x3b5, 0x311, 0x9e, 0x18f, 0x25c, 0x6b, 0x9d, 0xd1, 0x34c, 0x372, 0x25a, 0x2d7, 0x2bd, 0x2ea, 0x2cb, 0x377, 0x1b8, 0x1e7, 0x39f, 0x1aa, 0xc8, 0x164, 0x310, 0x54, 0x17f, 0xac, 0x1d6, 0x298, 0x7e, 0x3c4, 0xfa, 0x13d, 0x3d4, 0x41, 0x226, 0x87, 0x3a7, 0x23e, 0x265, 0x194, 0x3c0, 0x3ad, 0x3e6, 0x30, 0x39a, 0x99, 0x3fb, 0x230, 0x109, 0x262, 0x286, 0x40, 0x1d1, 0x1dc, 0x2aa, 0x4e, 0x1b, 0x371, 0x201, 0x307, 0x13b, 0x2d0, 0x196, 0xe8, 0x24, 0xb5, 0x3f5, 0x3fa, 0x3a4, 0x2c9, 0x1cf, 0x160, 0x70, 0x24b, 0x145, 0x151, 0x27e, 0x112, 0x113, 0x87, 0x347, 0xea, 0x30c, 0x33c, 0xa6, 0x3f, 0x3c4, 0x1f4, 0xfd, 0x29f, 0x19, 0x59, 0x188, 0x54, 0x2fe, 0x2b0, 0x2ab, 0x1da, 0x3db, 0xdc, 0x1e7, 0x337, 0x2a1, 0x249, 0x26d, 0x2d8, 0x12d, 0x2d7, 0x173, 0x3ba, 0x275, 0x315, 0x365, 0x12e, 0x6b, 0x13a, 0x344, 0x256, 0x345, 0x3c2, 0x85, 0x6f, 0x363, 0x5f, 0xf9, 0xc6, 0x302, 0x2f6, 0x20b, 0x94, 0x8d, 0xd4, 0x15c, 0x108, 0x3f6, 0x146, 0x3ed, 0x237, 0x1ec, 0x130, 0xd7, 0x3e0, 0x141, 0x308, 0x165, 0x3bd, 0x290, 0x47, 0x134, 0x28e, 0xfb, 0x3ee, 0x8b, 0x328, 0x31b, 0x157, 0x217, 0x209, 0x371, 0xb, 0x7, 0x1ca, 0x153, 0x2ac, 0x27e, 0x224, 0x45, 0x31, 0x15, 0x17f, 0x2b0, 0x15f, 0x361, 0x2e7, 0x1db, 0x97, 0x6b, 0x274, 0x10b, 0x294, 0x35, 0xae, 0x108, 0x3e5, 0x111, 0x357, 0x338, 0x1f7, 0x8b, 0x34a, 0x331, 0x3a9, 0x37e, 0xb7, 0x1ba, 0x1cc, 0x3b1, 0xe4, 0x185, 0x24d, 0x68, 0x305, 0x2f, 0x16d, 0x205, 0x2bc, 0x92, 0x3f8, 0x118, 0x109, 0xcd, 0x20a, 0x200, 0x12f, 0x3fe, 0x3fa, 0x341, 0x336, 0x263, 0x22d, 0x21b, 0x3c4, 0x3e8, 0x3f4, 0xd5, 0x190, 0x332, 0x2d8, 0x25a, 0x34e, 0x38a, 0x3de, 0x22b, 0xf9, 0x18c, 0x13, 0x39d, 0xf8, 0x2a4, 0x308, 0x2ca, 0x2ef, 0xad, 0x79, 0x2c1, 0x2e8, 0x167, 0x12a, 0x6d, 0x96, 0x343, 0x16f, 0x5c, 0x83, 0x23c, 0x3df, 0x103, 0x3e2, 0xdb, 0x204, 0x194, 0x389, 0x2af, 0x30f, 0x300, 0x3bc, 0x201, 0x259, 0x77, 0x2aa, 0x138, 0x1b0, 0x1cf, 0x189, 0x309, 0x3c4, 0x3d9, 0x3cb, 0x2a1, 0x136, 0x291, 0x345, 0x313, 0x42, 0x3f6, 0x111, 0x2a7, 0xfb, 0x3a3, 0xa2, 0x18a, 0x1eb, 0x35d, 0x2e, 0x83, 0x71, 0x367, 0xa, 0x257, 0x356, 0x20, 0x3a2, 0x2fb, 0x1fd, 0x341, 0x265, 0x19e, 0x14c, 0x1f8, 0x6e, 0x3ce, 0x18e, 0x9d, 0x281, 0x294, 0x6a, 0x2b8, 0x52, 0x227, 0x268, 0x5d, 0x35f, 0x95, 0x6d, 0x12c, 0x117, 0x36a, 0x1c9, 0x44, 0x23b, 0x23, 0x140, 0x262, 0x20a, 0x9, 0xb5, 0x3cf, 0x3d7, 0xea, 0x2b, 0x3ac, 0x1da, 0x377, 0x1db, 0x12e, 0x1ac, 0x384, 0x94, 0x234, 0x15b, 0x3bd, 0x252, 0x79, 0x18b, 0x3b2, 0x32a, 0x284, 0x1bb, 0x1c1, 0x2a8, 0x183, 0x15e, 0x92, 0x3f9, 0x69, 0x5a, 0xcb, 0x1d0, 0x120, 0x28d, 0x10e, 0x20e, 0x17f, 0x169, 0x175, 0x33e, 0x223, 0x31e, 0x181, 0x1e5, 0x7c, 0xbb, 0x1dc, 0x17d, 0x3a4, 0x265, 0x33c, 0x139, 0x3db, 0x2e9, 0x12e, 0x358, 0x20b, 0xa9, 0x308, 0x33a, 0x2a3, 0x31a, 0x1ee, 0xe4, 0x21d, 0x91, 0x236, 0x3c0, 0x157, 0x4e, 0xd8, 0x1cf, 0x312, 0x3f, 0x21f, 0x1e7, 0x18e, 0x13a, 0x216, 0x8d, 0x2a9, 0x3bd, 0xad, 0x1e4, 0x43, 0x35e, 0x191, 0x68, 0xf, 0x2f0, 0x3e6, 0x180, 0x371, 0x2c, 0x70, 0x27c, 0x1f4, 0x3e1, 0x2a1, 0x26c, 0x256, 0x21e, 0x15c, 0x52, 0x47, 0x1b2, 0x2e8, 0x195, 0x284, 0x376, 0x30d, 0x16d, 0x6, 0x39a, 0xc1, 0x307, 0x1ca, 0x145, 0x29a, 0x29f, 0xc8, 0x26d, 0x2ed, 0x3c2, 0x21, 0x3f6, 0x222, 0x28e, 0x3d1, 0x24e, 0x6d, 0x258, 0x55, 0x366, 0xaf, 0x92, 0x3fb, 0x1a4, 0x2d0, 0xab, 0x27e, 0x82, 0x59, 0x5b, 0x12d, 0x295, 0x6f, 0x32e, 0x3ed, 0x19c, 0x3ee, 0x51, 0x18a, 0x3d6, 0x16f, 0x170, 0x22, 0x23b, 0x46, 0x176, 0x379, 0x3fa, 0x23e, 0x2b, 0x2ab, 0x19f, 0x4f, 0xc6, 0x4c, 0x35c, 0x1ce, 0x35b, 0x385, 0x326, 0x71, 0x187, 0xa0, 0xcd, 0x74, 0x120, 0x226, 0xc4, 0x2a0, 0x1a7, 0x233, 0x32e, 0x3d3, 0x279, 0x34f, 0x119, 0x12c, 0x55, 0x2c5, 0x2bc, 0x99, 0x3c7, 0xe5, 0x145, 0x13d, 0x26e, 0x249, 0x291, 0x10f, 0x15c, 0xa4, 0x11c, 0x18b, 0x2d3, 0x2cc, 0x68, 0x1e, 0x3d2, 0x30f, 0x36, 0x2e3, 0x312, 0x7e, 0x6e, 0x323, 0xd6, 0x301, 0xa9, 0x219, 0xf3, 0x135, 0x1cc, 0x1b7, 0x17e, 0xdb, 0x4, 0x1d1, 0x1ff, 0x3f3, 0xea, 0xac, 0x2be, 0x275, 0x13c, 0x318, 0x130, 0x16b, 0x331, 0x177, 0x20f, 0x83, 0x1c4, 0x215, 0x280, 0x334, 0x1d0, 0x89, 0x8a, 0x310, 0x292, 0x295, 0xde, 0xa3, 0x357, 0x1f6, 0x127, 0x6d, 0xb9, 0x154, 0x306, 0x2e2, 0x264, 0x307, 0x394, 0x11d, 0xfd, 0x1aa, 0x136, 0x256, 0x2ec, 0x1ff, 0x3ef, 0x3a8, 0x169, 0x3ba, 0x22b, 0x38b, 0x37b, 0x22c, 0x314, 0x28f, 0x1b3, 0x15e, 0x99, 0x387, 0x394, 0x23a, 0x3f4, 0x14b, 0x344, 0x242, 0x15b, 0x1d7, 0x18d, 0x3dc, 0x329, 0x330, 0x2, 0x1d1, 0x3fe, 0x3d7, 0x359, 0x2d2, 0x37d, 0x5f, 0x31f, 0x2ff, 0x51, 0x221, 0x117, 0x366, 0x2bc, 0x132, 0x307, 0x321, 0x7d, 0x3e1, 0x296, 0x281, 0x8d, 0x2b6, 0x3ae, 0x31a, 0x3b1, 0x25b, 0x269, 0x4, 0x3a2, 0x3f5, 0x3a7, 0x2bb, 0x1ad, 0x2f3, 0xbe, 0x237, 0x1f7, 0xa2, 0x4b, 0x22e, 0x2c5, 0x171, 0x264, 0x207, 0x24b, 0xfa, 0x3cb, 0x125, 0x10b, 0x11a, 0x165, 0x355, 0x23d, 0x36b, 0xbf, 0xdb, 0x8, 0x34d, 0x3e3, 0x347, 0x17f, 0x35a, 0x1ef, 0x17c, 0x67, 0x3ee, 0x144, 0x96, 0x55, 0x183, 0x2e2, 0xc1, 0x7, 0x9f, 0x1f4, 0x39f, 0x24a, 0x216, 0x234, 0x2ca, 0x2a3, 0x73, 0x2df, 0x17e, 0x1d1, 0x3f5, 0x347, 0x2fe, 0x173, 0x363, 0x3ed, 0xfb, 0x24e, 0x368, 0x30d, 0x37a, 0x180, 0x3be, 0x312, 0x1f8, 0x2e9, 0x162, 0x39d, 0x33f, 0x3a9, 0x303, 0x106, 0x23b, 0x230, 0x2d0, 0x151, 0x29f, 0x249, 0x256, 0xd4, 0x3bd, 0x161, 0x1ee, 0x329, 0x269, 0x8, 0x293, 0x397, 0x20e, 0x3dd, 0x38a, 0x32e, 0x357, 0x3d1, 0x254, 0x376, 0x5e, 0x3e6, 0x1b, 0x1cf, 0xa6, 0x3db, 0x365, 0x302, 0xd7, 0x1ce, 0x177, 0x2e, 0x22, 0x1fc, 0x1a4, 0x2ad, 0x29a, 0xd5, 0x26c, 0x294, 0x2a9, 0x1d7, 0x31a, 0x36b, 0x17e, 0x36c, 0x40, 0xb5, 0x87, 0x54, 0x2d7, 0x6f, 0x146, 0x28e, 0x2b7, 0x284, 0x386, 0x2f0, 0x30f, 0xd8, 0x263, 0x139, 0x2e7, 0x31e, 0x26, 0x2b1, 0x26b, 0x3aa, 0x170, 0x110, 0x3fb, 0x13b, 0x145, 0xfd, 0x2a1, 0x344, 0x8d, 0x165, 0x2a3, 0xe6, 0x36e, 0x3e2, 0x356, 0x200, 0x1a1, 0x31, 0x2a0, 0x3a2, 0x3cf, 0x20e, 0x3b3, 0x233, 0x146, 0x115, 0x2ce, 0xd, 0x1e, 0x2af, 0x270, 0xc3, 0x351, 0x275, 0x1f2, 0x3b9, 0x51, 0x96, 0x154, 0x6, 0x1de, 0xb0, 0x3f, 0x1b8, 0xb1, 0x39d, 0x277, 0x2bf, 0x2e, 0x44, 0x3f9, 0x13b, 0x28a, 0x3f4, 0x125, 0x25, 0x184, 0x1e6, 0x374, 0x3f1, 0x14, 0xcd, 0x3a0, 0x82, 0x199, 0x3a6, 0x15c, 0x129, 0x399, 0xe4, 0x198, 0x4, 0x293, 0x327, 0x2a, 0x2d7, 0xde, 0x111, 0x5d, 0x32a, 0x34, 0x78, 0x2ae, 0x1d2, 0x30c, 0x15f, 0x1c6, 0x3c1, 0x2ff, 0x144, 0x258, 0x159, 0x18, 0x371, 0x2c0, 0xfc, 0x2e9, 0x2c4, 0x26f, 0x1ce, 0x2ee, 0xb8, 0x110, 0x3ff, 0xe5, 0x23a, 0x3cb, 0x9d, 0x94, 0x219, 0x391, 0x1cb, 0x3df, 0x50, 0x334, 0x29b, 0x208, 0x26d, 0x283, 0x179, 0xad, 0x27f, 0x390, 0x269, 0x10, 0x25e, 0x87, 0xa8, 0x34e, 0x378, 0x4d, 0x174, 0xb3, 0x34d, 0x327, 0x54, 0x34e, 0x2f9, 0x134, 0x3b2, 0x322, 0x236, 0xee, 0x3fd, 0x359, 0x2bd, 0x2cf, 0x357, 0x35f, 0x101, 0xf, 0x2af, 0xe9, 0x30c, 0x2be, 0x311, 0x237, 0x3a3, 0xda, 0x30d, 0x1f3, 0x36, 0x263, 0xed, 0x223, 0x239, 0x241, 0x314, 0x55, 0x3, 0x1de, 0x160, 0xfc, 0x1db, 0x302, 0x35c, 0xdf, 0x16f, 0x253, 0x132, 0xe, 0x1e2, 0x3ce, 0x358, 0x1f0, 0x1e8, 0x303, 0x11, 0x3f8, 0x13b, 0x11d, 0x3cb, 0x13a, 0x250, 0xec, 0x16e, 0x11e, 0x215, 0x5a, 0x2ac, 0x137, 0x26c, 0x242, 0x2ca, 0x135, 0xff, 0x5, 0x262, 0x3a0, 0x104, 0x26d, 0x10f, 0x1ed, 0x161, 0x3b1, 0x2fc, 0x356, 0x12, 0x226, 0x5b, 0x1e1, 0x210, 0x238, 0x10c, 0x33, 0x1, 0x34d, 0x327, 0x54, 0x34e, 0x2f9, 0x134, 0x3b2, 0x322, 0x236, 0xee, 0x3fd, 0x359, 0x2bd, 0x2cf, 0x357, 0x35f, 0x101, 0xf, 0x2af, 0xe9, 0x30c, 0x293, 0x87, 0x2a0, 0x85, 0x38f, 0x18b, 0x2c6, 0x81, 0x1d1, 0x397, 0x54, 0x295, 0x3f6, 0x1b2, 0x35e, 0x91, 0xbb, 0x3f5, 0x20e, 0x2d7, 0x378, 0x134, 0x36d, 0x93, 0x194, 0x2fb, 0x347, 0x3dd, 0x6f, 0x222, 0x2e8, 0x191, 0x236, 0x1dc, 0x3ef, 0x2fe, 0x38a, 0x146, 0x5d, 0xb3, 0x340, 0x23f, 0x3fa, 0x359, 0x173, 0x32e, 0x28e, 0x195, 0x68, 0x3c0, 0x17d, 0xea, 0x1ad, 0x363, 0x357, 0x2b7, 0xd, 0x78, 0x2aa, 0x11f, 0x2b0, 0x1ef, 0x3ed, 0x3d1, 0x284, 0xf, 0x157, 0x3a4, 0x56, 0x3ba, 0x2f8, 0xfb, 0x254, 0x386, 0x3ad, 0x270, 0x30c, 0x175, 0x5f, 0x19c, 0x24e, 0x376, 0x2f0, 0x4e, 0x265, 0x2ab, 0x38c, 0x237, 0x34f, 0x368, 0x5e, 0x30f, 0x2c9, 0x1d6, 0x275, 0x3c1, 0x3ee, 0x6d, 0x30d, 0x3e6, 0xd8, 0x33c, 0x2cb, 0xf9, 0x37b, 0x288, 0x2e4, 0x37a, 0x1b, 0x263, 0x1da, 0x9e, 0x1ec, 0x51, 0x12f, 0x21c, 0x12d, 0x42, 0x11c, 0x218, 0x198, 0x20, 0x1a1, 0x310, 0x1e1, 0x52, 0x3c8, 0x390, 0x36c, 0x9, 0x45, 0x2d8, 0x57, 0x252, 0x1ee, 0x2fc, 0x143, 0x120, 0xb2, 0x3a6, 0x2f2, 0x2c2, 0x1b7, 0x32f, 0x3a, 0x41, 0x26d, 0x35, 0x2ef, 0xe6, 0x285, 0x131, 0x349, 0x32, 0x12b, 0x2a9, 0x14f, 0xff, 0x14, 0x261, 0x1ea, 0x249, 0x121, 0x19d, 0x1ba, 0x3df, 0x280, 0xab, 0x137, 0x1a2, 0x61, 0x3cc, 0x325, 0x30e, 0xb4, 0x14d, 0x2a1, 0x25, 0x3b, 0x16e, 0x71, 0x118, 0x2ad, 0x1fa, 0x9d, 0xa9, 0x369, 0x193, 0x23b, 0x348, 0x11d, 0x337, 0x384, 0x10d, 0x1e3, 0x20c, 0x3f9, 0x1ca, 0x3e8, 0x231, 0x7c, 0x1e8, 0x17, 0x110, 0x3c7, 0x13e, 0x1e7, 0x2b9, 0x39b, 0x177, 0x2e0, 0x248, 0xe, 0x381, 0x97, 0x39d, 0x39c, 0x2b3, 0xaf, 0x182, 0x1c0, 0xdc, 0x2c4, 0x35c, 0x37c, 0x2dd, 0x1cd, 0x2c, 0x25e, 0x62, 0x17a, 0x29, 0x3c8, 0x329, 0x1ab, 0x48, 0x59, 0x3a6, 0x1ed, 0x31a, 0x1a3, 0x29c, 0x349, 0x64, 0xa5, 0x165, 0xdd, 0x3df, 0x109, 0x2ac, 0x1aa, 0x216, 0x3b, 0x2dc, 0x1c4, 0xd2, 0x28a, 0x337, 0x301, 0x3d, 0x303, 0x88, 0x3c7, 0x27c, 0x395, 0x1e5, 0x1ce, 0x2b3, 0x15e, 0x201, 0x21b, 0x1db, 0x26, 0x29d, 0x117, 0x6, 0x1df, 0x14c, 0x315, 0xf6, 0xa2, 0x2e4, 0x1f3, 0x1b0, 0x1d6, 0x1c6, 0x67, 0x24e, 0x1c3, 0x353, 0x3a4, 0x158, 0x3de, 0x357, 0x2ce, 0xd0, 0x23f, 0x3f3, 0x1f5, 0x6f, 0x9a, 0x2d3, 0x91, 0x2ec, 0x327, 0x2a0, 0x214, 0x8e, 0x218, 0x330, 0x80, 0x113, 0x16c, 0x57, 0xad, 0x3b1, 0x3cd, 0x1d, 0x41, 0xd3, 0xd4, 0x355, 0x27b, 0x14, 0xcb, 0x3a1, 0x26c, 0x234, 0x3cc, 0x243, 0x23, 0x1a9, 0xfd, 0x9d, 0x152, 0x1bf, 0x83, 0x3f8, 0x1ca, 0x3d9, 0xd6, 0x3e0, 0xb5, 0x188, 0x3c2, 0x290, 0x1ee, 0x3e2, 0x1d, 0x82, 0x34c, 0x2a9, 0x135, 0x3eb, 0x109, 0x151, 0x2a1, 0x94, 0x3b0, 0x326, 0x1fc, 0x1ca, 0x3bb, 0x358, 0x33f, 0x3aa, 0xaf, 0x201, 0x3f, 0x365, 0x130, 0x18a, 0x2a8, 0x180, 0x263, 0x2cb, 0x3c1, 0x34f, 0x376, 0x3ad, 0x3a4, 0x2b0, 0x363, 0x28e, 0xb3, 0x236, 0x2fb, 0x20e, 0x295, 0x38f, 0x43, 0xcc, 0x40, 0x113, 0x2d8, 0x15c, 0x161, 0x36e, 0x14e, 0x349, 0xc8, 0x294, 0x33a, 0x1cb, 0x30e, 0x2d0, 0xfd, 0x13a, 0x141, 0x1e3, 0x22, 0x3e7, 0x27c, 0x323, 0x39d, 0x26b, 0x36a, 0x39a, 0x160, 0x3db, 0xc6, 0x8b, 0x258, 0x37a, 0xd8, 0x1d6, 0x38c, 0x19c, 0x254, 0xf, 0x2aa, 0xea, 0x173, 0x146, 0x2e8, 0x93, 0xbb, 0x397, 0x2a0, 0x21, 0x238, 0xe4, 0x36c, 0x24, 0x59, 0x345, 0x3bd, 0xe6, 0x206, 0x334, 0x3d4, 0x26c, 0x61, 0x32b, 0x23c, 0x230, 0x16a, 0x229, 0x22f, 0x15a, 0x1b7, 0x14e, 0x29b, 0x320, 0x8d, 0x3cc, 0x11e, 0x230, 0x28a, 0xc7, 0x7c, 0x35b, 0x1c9, 0xc1, 0x309, 0x3b6, 0x130, 0x314, 0x2b2, 0x1b, 0x271, 0x1c6, 0x19c, 0xa1, 0x3c, 0x17d, 0x2bb, 0x233, 0x134, 0x2b5, 0x204, 0xb5, 0x310, 0x313, 0xad, 0x2df, 0xa7, 0x349, 0x190, 0x242, 0x1e6, 0x8f, 0x118, 0x145, 0x267, 0x3e, 0x3a9, 0x2e0, 0x264, 0x380, 0x1db, 0x98, 0x18a, 0x159, 0x209, 0x33c, 0xe3, 0xce, 0x254, 0x1e, 0x2ba, 0x359, 0x31d, 0x9a, 0x35e, 0x102, 0x25e, 0x188, 0x38d, 0x252, 0x36b, 0x257, 0x3a0, 0xc8, 0x121, 0xf3, 0x243, 0x8c, 0x2a6, 0x337, 0x1f, 0x3d0, 0x170, 0x132, 0x1c0, 0x2e9, 0x4c, 0xc5, 0x2a8, 0x300, 0x19e, 0x275, 0x67, 0x12a, 0xf, 0x15d, 0x3a8, 0x38a, 0x4d, 0x1af, 0x81, 0x12f, 0xc4, 0x3c2, 0x129, 0x3b1, 0x32f, 0x1d0, 0x64, 0x294, 0x2d4, 0xb6, 0x15c, 0x18d, 0x285, 0x334, 0x34b, 0x281, 0x76, 0x193, 0x3f8, 0x24b, 0x395, 0x333, 0x37c, 0x183, 0x2eb, 0x139, 0x278, 0x3d5, 0x376, 0x2af, 0x23e, 0x173, 0x111, 0x2d3, 0x81, 0x25e, 0x310, 0x22f, 0x2b4, 0x2d5, 0x262, 0x1ea, 0xd1, 0x308, 0x1b1, 0x7f, 0x1ca, 0x2f7, 0x1e5, 0x26b, 0x1b3, 0x1de, 0xa6, 0x4f, 0x2ff, 0x368, 0x3d2, 0x341, 0x1ad, 0xa3, 0x1d9, 0x91, 0x34d, 0x62, 0x3c2, 0x252, 0x2df, 0x14e, 0x13f, 0x9b, 0x61, 0xb7, 0x388, 0x13b, 0x3d9, 0x2b9, 0x1ce, 0x1b5, 0x33d, 0x312, 0x38e, 0x3d8, 0x6d, 0x178, 0xe9, 0x2b0, 0x197, 0xba, 0x93, 0x2ec, 0x10e, 0x17a, 0x148, 0x3dc, 0x32f, 0x3a0, 0x190, 0x8d, 0x391, 0x71, 0x1a4, 0xfa, 0xd6, 0x33f, 0x2b3, 0x2e2, 0x160, 0x377, 0x7b, 0x288, 0x2f, 0x9c, 0x56, 0x3b5, 0x115, 0x191, 0x259, 0x327, 0x12d, 0x29, 0x27f, 0x3e2, 0x1a1, 0x2d8, 0x2f2, 0xe6, 0x14, 0xab, 0x2a1, 0xa9, 0x1e3, 0x110, 0xe, 0xdc, 0x26, 0x18a, 0x16d, 0xd8, 0x2ab, 0x2f8, 0x2b7, 0x340, 0x2fb, 0x54, 0x21, 0x1e4, 0x17e, 0x1d, 0x19, 0x294, 0x1e6, 0x23c, 0x1a4, 0x1f4, 0x358, 0x1ce, 0x36a, 0xef, 0xa6, 0x9e, 0x3ee, 0x376, 0x157, 0xea, 0x38a, 0x134, 0x2c6, 0x8, 0x113, 0x2ed, 0x3bd, 0x339, 0xa0, 0x151, 0x125, 0x141, 0x303, 0x92, 0x70, 0x2e9, 0x130, 0x4b, 0x37a, 0x2c9, 0x175, 0x3ed, 0x195, 0x236, 0x3f5, 0x2a0, 0x108, 0x33b, 0x3e2, 0xe8, 0xc8, 0x8d, 0x32b, 0x1c4, 0x13b, 0x3bb, 0x2f6, 0x26b, 0x366, 0x371, 0x139, 0xf9, 0x34f, 0x386, 0x2aa, 0x359, 0x6f, 0x1b2, 0x21d, 0x40, 0x8a, 0x345, 0x1d7, 0x1fe, 0x109, 0x29a, 0x13a, 0x21a, 0x2e, 0x99, 0x380, 0x365, 0x192, 0x258, 0x3e6, 0x265, 0x3ba, 0x357, 0xb3, 0x194, 0x397, 0x12d, 0x342, 0x372, 0x3bd, 0x27b, 0x280, 0x29a, 0x274, 0x7a, 0x170, 0x182, 0xfc, 0xc6, 0xa2, 0x2f, 0x270, 0x169, 0xa3, 0x36d, 0x102, 0x2d4, 0x2d8, 0x1ed, 0x398, 0xa0, 0x2a2, 0x9d, 0x21a, 0x5c, 0x264, 0x3f, 0x235, 0x22c, 0x30d, 0x9c, 0x158, 0x32e, 0x1d9, 0x244, 0xb5, 0xb6, 0x179, 0xe6, 0x28, 0x2ac, 0x125, 0x282, 0x17, 0x99, 0x309, 0x18f, 0x8b, 0x1c1, 0x27, 0x56, 0x2cf, 0x174, 0x91, 0x12f, 0x229, 0x15c, 0x23d, 0xa, 0xab, 0x14b, 0x2a4, 0x303, 0x124, 0x1c0, 0x365, 0x324, 0x172, 0x30f, 0x211, 0x3b5, 0x5d, 0x126, 0x34d, 0x188, 0x57, 0x18d, 0x206, 0x32c, 0x354, 0xa9, 0x3c6, 0x49, 0x70, 0x1db, 0xc9, 0x258, 0x3c5, 0x186, 0x1ef, 0x115, 0x24d, 0x1d1, 0x62, 0x313, 0x161, 0x285, 0xcb, 0xd5, 0x128, 0x2f5, 0x110, 0x1c, 0x370, 0x130, 0x96, 0x1f3, 0x265, 0x37d, 0x147, 0x191, 0x28d, 0x1d3, 0x1d7, 0x3f1, 0xb4, 0x3e1, 0x3e, 0x2ee, 0x171, 0x189, 0x223, 0x3ee, 0x1c3, 0x15d, 0x2fe, 0x1fb, 0x86, 0x36c, 0x89, 0x291, 0x33a, 0x11e, 0x348, 0x3bb, 0x3ca, 0x2f1, 0x6, 0x335, 0xe3, 0xfb, 0x34, 0x3b8, 0x54, 0x84, 0x27f, 0x32f, 0x13f, 0xd1, 0x76, 0x83, 0x3c7, 0x21f, 0x13, 0x314, 0x37a, 0x336, 0x37d, 0x28e, 0x24d, 0x3a2, 0x188, 0xae, 0x23d, 0x14, 0x2ac, 0x24a, 0x21a, 0xb8, 0x182, 0x1f8, 0x318, 0x119, 0x2f0, 0x28b, 0x2e6, 0x134, 0x30a, 0x80, 0x59, 0x6a, 0x26a, 0x30e, 0x2a6, 0x31c, 0x33f, 0x1b5, 0x1de, 0x139, 0x3e4, 0x95, 0x78, 0x3f3, 0x1a7, 0x47, 0x390, 0x105, 0x19, 0x242, 0x25f, 0x23b, 0x321, 0x24f, 0x2b1, 0x22e, 0x300, 0x1d6, 0x17c, 0x167, 0x236, 0x3cf, 0x25a, 0x290, 0x1b7, 0xcd, 0x29f, 0x4a, 0x37e, 0x110, 0x38, 0x1db, 0x192, 0x172, 0x217, 0x56, 0x113, 0x345, 0x2a3, 0x367, 0x2ad, 0x18e, 0x33f, 0x36a, 0x371, 0x1da, 0x237, 0x284, 0x23f, 0x20e, 0x21, 0x33b, 0x32f, 0x27e, 0x344, 0x3b0, 0x22, 0xe, 0x2e9, 0x192, 0x2e4, 0x4e, 0x2b0, 0x146, 0x35e, 0x8, 0x8a, 0x21e, 0x135, 0x30e, 0x145, 0x6b, 0x1ce, 0x366, 0x3be, 0x2cb, 0x19c, 0xd, 0x1dc, 0x54, 0x108, 0x1ee, 0x14e, 0x3d4, 0x216, 0x1bf, 0x110, 0x70, 0x365, 0x8b, 0x30d, 0x270, 0x1ad, 0x222, 0x2c6, 0x40, 0x59, 0xd4, 0x1ba, 0x46, 0x23a, 0x358, 0x26b, 0x306, 0x1cf, 0x275, 0xfb, 0x68, 0x2fb, 0x2a0, 0x52, 0x36b, 0x262, 0x29f, 0x94, 0x1e3, 0x92, 0x380, 0x31e, 0x51, 0x5e, 0x3a4, 0x173, 0x134, 0x21d, 0x200, 0x2c8, 0x2a9, 0x1cb, 0x230, 0x1f4, 0x2f6, 0x37c, 0x6, 0x263, 0x38c, 0x3d1, 0x340, 0x3f5, 0x12d, 0x290, 0x36e, 0x334, 0xd5, 0xa9, 0x303, 0x99, 0x3f, 0xc6, 0x288, 0x226, 0x10f, 0x135, 0x215, 0x11d, 0x358, 0xdf, 0x3, 0x263, 0x311, 0x35f, 0x236, 0x327, 0x1e1, 0x161, 0x5, 0x2ac, 0x13a, 0x1e8, 0x253, 0x160, 0x223, 0x3a3, 0xf, 0x3fd, 0x34e, 0x238, 0x2fc, 0x3a0, 0x26c, 0xec, 0x11, 0xe, 0x1db, 0x241, 0x30d, 0xe9, 0x2bd, 0x134, 0x33, 0x12, 0x26d, 0x2ca, 0x11e, 0x13b, 0x3ce, 0x35c, 0x55, 0x36, 0x2be, 0x357, 0x322, 0x34d, 0x5b, 0x1ed, 0xff, 0x5a, 0x3cb, 0x1f0, 0x16f, 0x1de, 0xed, 0x237, 0x101, 0xee, 0x54, 0x210, 0x3b1, 0x262, 0x137, 0x250, 0x303, 0x132, 0xfc, 0x239, 0xda, 0x2af, 0x359, 0x2f9, 0x10c, 0x356, 0x104, 0x242, 0x16e, 0x3f8, 0x1e2, 0x302, 0x314, 0x1f3, 0x30c, 0x2cf, 0x3b2, 0x1, 0x226, 0x10f, 0x135, 0x215, 0x11d, 0x358, 0xdf, 0x3, 0x263, 0x311, 0x35f, 0x236, 0x327, 0x1e1, 0x161, 0x5, 0x2ac, 0x13a, 0x1e8, 0x253, 0x160, 0x45, 0x35, 0x1ba, 0x118, 0x3e8, 0x39d, 0x343, 0x300, 0x2ab, 0x3af, 0x322, 0x293, 0x16c, 0x373, 0x3eb, 0x352, 0x31c, 0x1ce, 0x183, 0x39e, 0x38c, 0x35f, 0x65, 0x87, 0x313, 0x23d, 0xa0, 0x27a, 0x1f, 0x3aa, 0x273, 0x272, 0x237, 0x202, 0x3b8, 0x2a0, 0x148, 0x2d5, 0x196, 0x296, 0x3d, 0x392, 0xb0, 0x223, 0x34f, 0x3c, 0x3d7, 0x85, 0x399, 0x257, 0x3d4, 0x4a, 0x3c6, 0x99, 0xfc, 0x7b, 0x368, 0x155, 0x1f5, 0x38f, 0x390, 0x3a, 0x249, 0x3b, 0x20c, 0xe, 0x3b6, 0x116, 0x5e, 0x28b, 0x31d, 0x18b, 0x1b6, 0x224, 0x294, 0xb7, 0x3f8, 0x3c4, 0x13, 0x96, 0x30f, 0x158, 0x28c, 0x2c6, 0x100, 0x199, 0x165, 0x11e, 0x276, 0x323, 0x2d6, 0x159, 0x2c9, 0x2f3, 0xba, 0x81, 0x28d, 0x283, 0x135, 0x23, 0x7d, 0x2f6, 0x1eb, 0x60, 0x1d6, 0x3f2, 0x166, 0x1d1, 0x229, 0x1ed, 0x1fe, 0x168, 0x267, 0x33f, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x114, 0x350, 0x243, 0x276, 0x97, 0x133, 0x2fd, 0x2b, 0x146, 0x185, 0x12, 0x34c, 0x3cc, 0xfe, 0x3c4, 0x4c, 0x172, 0x270, 0x2e6, 0x2c1, 0x36c, 0x104, 0x234, 0x326, 0x207, 0x3b6, 0x51, 0x1e9, 0x3a8, 0x3f6, 0x1c8, 0x74, 0x26c, 0x369, 0x49, 0x3f, 0x7b, 0x1bb, 0x17d, 0x1a7, 0xf2, 0x32f, 0x3a1, 0x250, 0x2e, 0xb, 0x38e, 0x34f, 0xf0, 0x107, 0x108, 0x2df, 0xcb, 0x125, 0x1e8, 0x2bc, 0xa6, 0x38b, 0x202, 0x2fb, 0x25a, 0x2b4, 0x14, 0x13d, 0x3e, 0x16f, 0x2eb, 0x33e, 0x3d1, 0x65, 0x21c, 0x15c, 0x27b, 0x168, 0x18e, 0x39c, 0x3, 0x33c, 0x1f9, 0x2cc, 0x293, 0x1b9, 0x355, 0x30e, 0x7d, 0x3ca, 0x28f, 0x36, 0x1dd, 0x5d, 0x102, 0x45, 0xd4, 0x396, 0x299, 0x323, 0x34a, 0x1bd, 0x30c, 0x255, 0x163, 0x200, 0xd3, 0xf3, 0x23b, 0xf1, 0x13, 0x258, 0x9c, 0x2bd, 0x1b2, 0xdb, 0x41, 0x8d, 0x228, 0x15b, 0x23c, 0x321, 0x2c4, 0x4b, 0x27, 0x35a, 0x1b2, 0x1b6, 0x104, 0x61, 0x83, 0x1c, 0x31e, 0x232, 0x2ae, 0x3dd, 0x11c, 0x3cd, 0x3d4, 0x250, 0x5c, 0x2c, 0x4f, 0x95, 0x23f, 0x150, 0x129, 0x206, 0x14d, 0x1f, 0x16f, 0x1df, 0xe3, 0x2b7, 0x259, 0x310, 0x3bd, 0x3b7, 0x28a, 0x2f6, 0x343, 0x36, 0x3ba, 0x174, 0x2, 0x59, 0x2b6, 0x71, 0x24b, 0x181, 0x96, 0x4e, 0x2bd, 0x364, 0x36c, 0x208, 0xc2, 0x106, 0x38, 0x235, 0x6d, 0x155, 0x3b3, 0x238, 0x393, 0x3a1, 0xa9, 0xb8, 0x58, 0x9e, 0x12a, 0x77, 0x2a0, 0x252, 0x5, 0x29a, 0x3e, 0x2de, 0x3be, 0x1c6, 0x167, 0xbb, 0x229, 0x373, 0x367, 0x11d, 0x1e5, 0x28f, 0x6c, 0x37d, 0x2e8, 0x4, 0xb2, 0x165, 0xe2, 0x9f, 0x302, 0x12c, 0x9c, 0x173, 0x2c1, 0x2d1, 0x19, 0x184, 0x20c, 0x70, 0x63, 0xda, 0x2aa, 0x36f, 0x79, 0x32f, 0x59, 0x165, 0x1c4, 0x27c, 0x26, 0x2e4, 0x3a4, 0x6f, 0x218, 0x1d, 0x26c, 0x1bf, 0x99, 0x3db, 0x3ee, 0x78, 0x20e, 0x52, 0x346, 0x151, 0x20b, 0x16f, 0x3be, 0x38c, 0x195, 0x1d1, 0x2d8, 0x2a3, 0x46, 0x3bb, 0x2b1, 0x16d, 0x30c, 0x146, 0x21d, 0x120, 0x294, 0x362, 0x307, 0x365, 0x288, 0x157, 0x3dd, 0x238, 0x32f, 0x29f, 0x141, 0x392, 0x312, 0x3c1, 0xd, 0x3f5, 0x3c2, 0xe6, 0x5a, 0x18e, 0x26b, 0x30, 0x2ab, 0x28e, 0x81, 0x8a, 0x2a9, 0x23c, 0x24b, 0x302, 0x258, 0x270, 0x38a, 0x43, 0x286, 0x249, 0x3b0, 0x92, 0x1f8, 0x37b, 0xf, 0x347, 0x108, 0x36e, 0xab, 0x1c2, 0x3aa, 0x371, 0x275, 0x2b7, 0xbb, 0x5b, 0x1d7, 0x30e, 0x1f4, 0xd7, 0x2a8, 0x265, 0x32e, 0x2c6, 0x24, 0x256, 0x16e, 0x3e7, 0x2e9, 0x51, 0x3ad, 0x2fe, 0x47, 0x3e2, 0x3d4, 0xa9, 0x170, 0x160, 0xf9, 0x284, 0x2fb, 0x17a, 0xb2, 0x19d, 0x23b, 0x381, 0xc9, 0x5e, 0x1d4, 0x3c3, 0x17e, 0xf5, 0x250, 0x170, 0x2c0, 0x3e4, 0xd, 0x3e3, 0x313, 0x339, 0x1a9, 0x1ac, 0x3d6, 0x36, 0x2f3, 0x36d, 0x80, 0x1a6, 0x32b, 0x3ff, 0x370, 0x51, 0x353, 0x3ea, 0x238, 0x257, 0x26e, 0x21a, 0x15e, 0x298, 0x19c, 0x289, 0x21c, 0x2f2, 0x3df, 0x11d, 0x39d, 0xaa, 0x336, 0x32e, 0x185, 0x90, 0x294, 0x2cd, 0x7, 0x31e, 0xda, 0x2ba, 0x295, 0x27f, 0x19a, 0x125, 0x35b, 0x273, 0x2cb, 0x3ab, 0x259, 0x5b, 0x3ae, 0x23, 0x3bb, 0x16b, 0x1bd, 0x56, 0x4d, 0x330, 0x82, 0xc2, 0x11, 0x380, 0x7b, 0x1c3, 0x3ef, 0x42, 0x1b7, 0xab, 0x384, 0x2b3, 0x3be, 0x311, 0x25d, 0x293, 0x1d3, 0xdd, 0x1a4, 0x24f, 0xc5, 0x30f, 0x35a, 0x2c1, 0x356, 0x190, 0x1d8, 0x92, 0x3f0, 0x1f7, 0x78, 0x15, 0x148, 0x206, 0x13d, 0x1f0, 0x366, 0xcf, 0x3f2, 0x93, 0x164, 0x27d, 0x1fc, 0x6e, 0x116, 0x3ad, 0x3ea, 0x79, 0x14e, 0x354, 0x1e8, 0x39a, 0x361, 0x3ab, 0xbb, 0x16c, 0x14f, 0x230, 0x395, 0x266, 0x30f, 0x2bd, 0x316, 0x286, 0x136, 0x37e, 0xc1, 0x38e, 0x95, 0x1dc, 0xbd, 0x23d, 0x5a, 0x231, 0x2f1, 0x1b, 0x2f3, 0x2d3, 0x200, 0x12b, 0x2dc, 0x307, 0x18f, 0xda, 0x17d, 0x246, 0x3dc, 0x196, 0xe1, 0x35d, 0x3be, 0x22b, 0x166, 0xb5, 0x10f, 0x396, 0x1ca, 0x181, 0xb9, 0x3a4, 0x1bc, 0x1c8, 0x349, 0x4a, 0x5c, 0x160, 0x3e4, 0x1a, 0x397, 0xae, 0x3fc, 0x145, 0x3ca, 0xaa, 0x265, 0xa3, 0x33, 0x112, 0x234, 0x20c, 0x380, 0xf6, 0x305, 0x347, 0x29, 0x285, 0x29a, 0x1f0, 0x2c5, 0x33c, 0x3af, 0x122, 0x8a, 0x2b6, 0x388, 0x3c4, 0xc9, 0xbc, 0x359, 0x227, 0x3cd, 0x29f, 0x10d, 0x15e, 0x139, 0x279, 0x65, 0x188, 0x2ef, 0x215, 0x3bb, 0x2d6, 0x2fd, 0x2b0, 0x2c8, 0x1e6, 0x3fb, 0x2e9, 0x288, 0x2aa, 0x295, 0x1ee, 0x196, 0x1c2, 0x16f, 0x1cf, 0x2f8, 0x93, 0x113, 0x2a9, 0x1c4, 0x3c4, 0x192, 0x2f0, 0x2fe, 0x238, 0x14e, 0x2a1, 0x3a9, 0xef, 0x275, 0x195, 0x293, 0x345, 0x1cb, 0x1ca, 0x302, 0x2e4, 0x11f, 0x3f6, 0x17e, 0x3d4, 0x141, 0xaf, 0x139, 0xfb, 0x194, 0x5b, 0x2a3, 0x230, 0x323, 0x18a, 0x4e, 0x38a, 0x218, 0xe8, 0x216, 0x2e, 0x160, 0x3c1, 0x68, 0x87, 0x2f2, 0x367, 0x1f4, 0x2b1, 0x37a, 0x2b0, 0x1b2, 0x356, 0x249, 0x1bf, 0xc1, 0x315, 0x254, 0x2fb, 0x3c2, 0x339, 0x2ad, 0x2f6, 0x55, 0x265, 0x146, 0xcc, 0x82, 0x308, 0x110, 0x1f8, 0x3ee, 0x3c0, 0x2a0, 0x161, 0x109, 0x18e, 0x37c, 0x1b, 0x1ef, 0x35e, 0x24, 0x294, 0x326, 0x70, 0x239, 0x386, 0x347, 0x52, 0x206, 0xfd, 0x33f, 0x6, 0x2ab, 0x5d, 0x8, 0x26d, 0x32b, 0x3e7, 0x365, 0x6d, 0x199, 0x391, 0x3e7, 0x2c3, 0x1b4, 0x3fa, 0x42, 0x1a3, 0x29a, 0x3c9, 0x3, 0x2ab, 0xba, 0x20, 0x34c, 0x2dc, 0x7, 0xc6, 0x2e5, 0x3a7, 0x52, 0x5, 0x3f4, 0x1ce, 0x60, 0x1dd, 0x36d, 0x9, 0x14a, 0x326, 0xe0, 0xf6, 0xf, 0x15, 0x252, 0xa0, 0x267, 0x1be, 0x1b, 0x3de, 0x163, 0x120, 0x11a, 0x11, 0x3f, 0x2ff, 0x1e0, 0x2a0, 0x2c2, 0x2d, 0x6b, 0x3a5, 0x360, 0x32e, 0x33, 0x41, 0x308, 0x220, 0x3e9, 0x34f, 0x77, 0xbd, 0xe6, 0x1a9, 0x17b, 0x55, 0xc3, 0x111, 0x269, 0x32, 0x1d8, 0x99, 0x1c7, 0x12a, 0x2fb, 0x38d, 0xff, 0x145, 0x333, 0x2b2, 0x56, 0x268, 0x1ab, 0x249, 0x37e, 0x304, 0x9e, 0x101, 0x3cf, 0x15c, 0x3df, 0xfa, 0x2b1, 0x2fd, 0x2d2, 0x18b, 0x105, 0x1a2, 0x303, 0x58, 0x3e4, 0x68, 0x10e, 0x3da, 0x30e, 0x37f, 0x29d, 0x30f, 0x2e6, 0x10c, 0xe8, 0x25, 0xb8, 0x312, 0x332, 0x25f, 0x307, 0x63, 0x2e5, 0x347, 0x148, 0x28, 0x337, 0x1be, 0x36, 0x363, 0x30a, 0x224, 0x308, 0x49, 0x3bf, 0x24e, 0x379, 0x38d, 0x1fe, 0x11d, 0x1ae, 0x37a, 0x2d2, 0x316, 0x1d, 0x10b, 0x5c, 0x312, 0xce, 0x65, 0x5b, 0x29e, 0x348, 0x162, 0x172, 0x23e, 0x38f, 0x393, 0x1aa, 0x3a9, 0x3bc, 0x311, 0x191, 0x28d, 0x15b, 0x23b, 0x6e, 0xa2, 0x2aa, 0x246, 0x2df, 0x151, 0x1f0, 0x205, 0x2ab, 0x174, 0x80, 0x256, 0x193, 0xe0, 0x1ec, 0x3c, 0xa8, 0x161, 0x2d, 0xd6, 0x28f, 0x336, 0x28c, 0x269, 0x64, 0x369, 0xc1, 0x4f, 0x101, 0x397, 0x179, 0x2c7, 0x3bb, 0x29d, 0x217, 0x38a, 0x72, 0x29b, 0xa9, 0x253, 0x272, 0x3d1, 0x2ec, 0x1d3, 0x1cb, 0x321, 0x4c, 0x5e, 0x17f, 0x79, 0x262, 0x9d, 0x35d, 0x1cf, 0x3f2, 0x122, 0x59, 0xf3, 0x3ff, 0x365, 0x1b4, 0x3fd, 0x108, 0x103, 0x1fa, 0x1ce, 0x26d, 0x16e, 0xe, 0x239, 0xf, 0x54, 0x161, 0x5a, 0x358, 0x55, 0x30c, 0x134, 0x356, 0x26c, 0x303, 0x160, 0x237, 0x236, 0x5b, 0x135, 0x13b, 0x302, 0x30d, 0x359, 0x238, 0x262, 0x13a, 0x16f, 0x263, 0x357, 0x1, 0x26d, 0x16e, 0xe, 0x239, 0xf, 0x54, 0x161, 0x5a, 0x358, 0x55, 0x30c, 0x134, 0x356, 0x26c, 0x303, 0x160, 0x237, 0x236, 0x5b, 0x135, 0x13b, 0x302, 0x30d, 0x359, 0x238, 0x262, 0x13a, 0x16f, 0x263, 0x357, 0x1, 0x26d, 0x16e, 0xe, 0x239, 0xf, 0x54, 0x161, 0x5a, 0x358, 0x55, 0x30c, 0x134, 0x356, 0x26c, 0x303, 0x160, 0x237, 0x236, 0x5b, 0x135, 0x13b, 0x302, 0x30d, 0x359, 0x238, 0x262, 0x13a, 0x16f, 0x263, 0x357, 0x1, 0x26d, 0x16e, 0xe, 0x239, 0xf, 0x54, 0x161, 0x5a, 0x358, 0x55, 0x30c, 0x134, 0x356, 0x26c, 0x303, 0x160, 0x237, 0x236, 0x5b, 0x135, 0x13b, 0xd3, 0x1b1, 0x70, 0x3d8, 0x1e0, 0x12d, 0x1cc, 0x2a6, 0xd7, 0x2fd, 0x2bd, 0x218, 0x29b, 0x2a4, 0x171, 0x19f, 0x25d, 0x1a1, 0x15b, 0xfe, 0x2e9, 0xda, 0x3f3, 0x52, 0x28, 0xc7, 0x3d6, 0x19b, 0x111, 0x36c, 0x9b, 0x385, 0x160, 0x67, 0xca, 0x2d8, 0x374, 0x321, 0x130, 0x1e9, 0x36f, 0x1ee, 0x156, 0x1f0, 0x6, 0x2ea, 0x1af, 0x120, 0xc2, 0x49, 0x2e7, 0xa1, 0x3cf, 0x2f2, 0x215, 0x395, 0x4b, 0x341, 0x3c3, 0x32f, 0x14b, 0x1d5, 0x1cf, 0x3d3, 0x204, 0x26d, 0x2dc, 0x38, 0x1ec, 0xf0, 0x292, 0xe6, 0x153, 0x26f, 0x37a, 0x35a, 0x10c, 0x349, 0x152, 0x2bc, 0x2cb, 0x32a, 0x2d4, 0x2a9, 0x7f, 0x370, 0x6d, 0x3fd, 0x29, 0x14, 0x267, 0x1eb, 0x2c9, 0x28c, 0x1b6, 0x249, 0x3c6, 0xb0, 0x237, 0x65, 0x16c, 0x1ba, 0x394, 0x98, 0x2f0, 0x3b3, 0xf7, 0xab, 0xf8, 0x3, 0x175, 0x2d3, 0x90, 0x61, 0x1a6, 0x2cd, 0x380, 0x1f7, 0x77, 0x3c2, 0x3f1, 0x3e8, 0x133, 0x138, 0x2f9, 0x3e2, 0x354, 0x2ee, 0x1cf, 0x3af, 0x2, 0x34c, 0x193, 0x309, 0x3ee, 0xee, 0x38d, 0x3eb, 0x3d9, 0x266, 0x270, 0x1fb, 0x3cd, 0x2a1, 0x1d5, 0x39e, 0x357, 0x4, 0x291, 0x326, 0x21b, 0x3d5, 0x1dc, 0x313, 0x3df, 0x3bb, 0xc5, 0xe9, 0x3f6, 0x393, 0x14b, 0x3aa, 0x335, 0x2a7, 0x8, 0x12b, 0x245, 0x3f, 0x3a3, 0x3b8, 0x22f, 0x3b7, 0x37f, 0x18a, 0x1d2, 0x3e5, 0x32f, 0x296, 0x35d, 0x263, 0x147, 0x10, 0x256, 0x83, 0x7e, 0x34f, 0x379, 0x57, 0x367, 0x2f7, 0x314, 0x3a4, 0x3c3, 0x257, 0x125, 0x2b3, 0xcf, 0x28e, 0x20, 0xa5, 0x106, 0xfc, 0x297, 0x2fb, 0xae, 0x2c7, 0x1e7, 0x221, 0x341, 0x38f, 0xa7, 0x24a, 0x16f, 0x19e, 0x115, 0x40, 0x14a, 0x20c, 0x1f8, 0x127, 0x1ff, 0x15c, 0x187, 0x3ce, 0x4b, 0x28b, 0x317, 0x14e, 0x34c, 0x326, 0x3f, 0x34f, 0x2fb, 0x15c, 0x30e, 0x323, 0x258, 0xea, 0x238, 0x334, 0x20b, 0x306, 0x175, 0x35e, 0x112, 0x76, 0xc1, 0xf9, 0x340, 0x5b, 0x1ba, 0x24b, 0x192, 0x157, 0x85, 0x346, 0x3e1, 0x37c, 0x2c9, 0x222, 0x356, 0x344, 0x170, 0x139, 0x2b7, 0xb5, 0x2a9, 0x1fc, 0x365, 0x376, 0x20e, 0x161, 0x2d0, 0x39d, 0x37a, 0x173, 0xe4, 0x3d4, 0xf4, 0x371, 0x2f8, 0x81, 0x26d, 0x362, 0x380, 0x3ee, 0x1dc, 0x22f, 0x367, 0x1e7, 0x4b, 0x11f, 0x47, 0x262, 0x1c2, 0x366, 0x2ab, 0x36d, 0x120, 0x308, 0x99, 0x9e, 0x68, 0x188, 0x135, 0x1ca, 0x130, 0x3ad, 0x295, 0x36e, 0xfd, 0x26b, 0xd8, 0x146, 0x36c, 0x26c, 0x2e, 0xa6, 0x3d1, 0x293, 0xd4, 0x23b, 0x2e9, 0x368, 0x347, 0xad, 0x5a, 0x2f6, 0x16d, 0x1ad, 0x218, 0x27e, 0x21a, 0xef, 0x5f, 0x91, 0x2c8, 0x16e, 0x70, 0x37b, 0x23f, 0x3c2, 0x291, 0x83, 0x1f8, 0x95, 0x3cf, 0x3bd, 0x69, 0x181, 0x5e, 0x3b3, 0x3b1, 0x29a, 0x39c, 0x6c, 0x146, 0x2d1, 0x1a2, 0x170, 0x272, 0x2ce, 0x1a1, 0x2ca, 0x3f7, 0xc6, 0x1e, 0x292, 0x339, 0x7d, 0x29d, 0x270, 0x3e5, 0xa7, 0x13a, 0x2dd, 0x351, 0x36d, 0x240, 0x3b, 0xc1, 0x1f2, 0x11b, 0x2d8, 0x396, 0x1e2, 0x51, 0x2fa, 0x29, 0xa0, 0xd6, 0x154, 0x2b0, 0x86, 0x13f, 0x21a, 0x1de, 0x17c, 0x81, 0xd3, 0x193, 0x3f, 0x297, 0x3fe, 0x2f2, 0x8c, 0xb1, 0x30d, 0x1f5, 0xf7, 0x151, 0x277, 0x209, 0x32e, 0xdb, 0x136, 0x2e, 0x14c, 0x35f, 0xb5, 0x15b, 0x3f9, 0x31e, 0x305, 0x150, 0xe6, 0x28a, 0x2d6, 0x4e, 0x2f9, 0x393, 0x125, 0x2de, 0xeb, 0x2e8, 0x48, 0x184, 0x99, 0x13c, 0x1a0, 0x5b, 0x374, 0x13e, 0x8b, 0x15d, 0x84, 0x14, 0x31c, 0x22e, 0x56, 0x316, 0x3a0, 0x141, 0x33d, 0x22b, 0x91, 0x12b, 0x20c, 0x3db, 0x142, 0x10e, 0x2a3, 0xe5, 0x260, 0x157, 0x214, 0x5, 0x18e, 0x22e, 0xac, 0x43, 0x13f, 0x3d, 0x371, 0x3f2, 0x2, 0x256, 0x11, 0x3bf, 0x284, 0x21c, 0x14f, 0x1ca, 0xc9, 0x2ae, 0x21, 0xa, 0x31c, 0x55, 0x158, 0x86, 0x27e, 0x7a, 0x2eb, 0x3ed, 0x4, 0xa5, 0x22, 0x377, 0x101, 0x31, 0x29e, 0x394, 0x192, 0x155, 0x42, 0x14, 0x231, 0xaa, 0x2b0, 0x10c, 0xf5, 0xf4, 0x1df, 0x3d3, 0x8, 0x14a, 0x44, 0x2e7, 0x202, 0x62, 0x135, 0x321, 0x324, 0x2aa, 0x84, 0x28, 0x6b, 0x154, 0x169, 0x218, 0x1ea, 0x1e8, 0x3be, 0x3af, 0x10, 0x294, 0x88, 0x1c7, 0xd, 0xc4, 0x26a, 0x24b, 0x241, 0x15d, 0x108, 0x50, 0xd6, 0x2a8, 0x2d2, 0x39, 0x3d4, 0x3d0, 0x375, 0x357, 0x20, 0x121, 0x110, 0x38e, 0x1a, 0x188, 0xdd, 0x9f, 0x8b, 0x2ba, 0x210, 0xa0, 0x1ac, 0x159, 0x1ad, 0x256, 0x22, 0x2e7, 0xd, 0x188, 0x1ba, 0x27c, 0x51, 0x3fa, 0x290, 0x5a, 0x39d, 0x3e6, 0x6f, 0x3e2, 0x125, 0x36a, 0x2ab, 0x35e, 0x82, 0x1bf, 0x160, 0xfb, 0x293, 0x2a9, 0x3fb, 0xc6, 0x78, 0x17a, 0x3eb, 0x1e7, 0x258, 0x359, 0x33b, 0x151, 0x1ce, 0xd8, 0x222, 0x286, 0x94, 0x171, 0x38c, 0x91, 0x26d, 0x326, 0x1f8, 0x254, 0x87, 0x2a3, 0x1ca, 0x192, 0x2aa, 0x108, 0xa0, 0x358, 0x16d, 0x173, 0x329, 0xd5, 0x3aa, 0x33c, 0x2e8, 0x120, 0x76, 0x201, 0x237, 0xbb, 0x21e, 0x23b, 0x365, 0x386, 0x2a0, 0x339, 0x1f4, 0x18a, 0x11f, 0x238, 0x196, 0x3e0, 0x180, 0x32e, 0x36c, 0x344, 0x392, 0x2cb, 0x191, 0x59, 0x16e, 0x380, 0x34f, 0x3f5, 0x3bd, 0x1a4, 0x26, 0x3ad, 0x85, 0x206, 0x18e, 0x55, 0x2b0, 0x218, 0x3d4, 0x3a9, 0x1cf, 0x28e, 0x200, 0x61, 0x99, 0xf9, 0x236, 0x2ed, 0x23c, 0xdc, 0x368, 0xa5, 0x88, 0x315, 0xd0, 0x16c, 0x243, 0x37, 0x1b4, 0x20e, 0x23d, 0x11d, 0x133, 0x341, 0x11c, 0x196, 0x3c9, 0x209, 0x146, 0x2a5, 0x4a, 0x171, 0x311, 0x244, 0x34c, 0x20c, 0x377, 0xd, 0x310, 0x2e1, 0x3c4, 0x119, 0x3a7, 0x161, 0x153, 0x2d6, 0x270, 0x317, 0x19a, 0x7c, 0x60, 0x197, 0x36c, 0x281, 0x253, 0x275, 0x126, 0x332, 0x326, 0x3f0, 0x142, 0x31, 0x26a, 0x13e, 0x51, 0x3fd, 0x252, 0x2d0, 0x1ae, 0x27, 0x3f6, 0x29c, 0x301, 0x6, 0x3de, 0x330, 0x26c, 0x2e0, 0x361, 0x191, 0xb2, 0x1b1, 0x3f, 0x95, 0x247, 0x2a3, 0x394, 0x241, 0x17d, 0xa4, 0x2d, 0x39d, 0x3c5, 0x1bc, 0x32f, 0x274, 0x183, 0x3ba, 0x33, 0x320, 0x2e, 0x272, 0x25d, 0x8a, 0x25f, 0x1c0, 0x34f, 0x3e3, 0x2ef, 0x13b, 0x260, 0x155, 0x108, 0x140, 0x17b, 0x37a, 0x31d, 0x1f1, 0x125, 0x2dd, 0x2be, 0x2c6, 0x32, 0x385, 0xa6, 0x14a, 0x220, 0x9e, 0x11b, 0x1d3, 0x1c4, 0x3b6, 0x305, 0x12d, 0x3f1, 0x3ce, 0x2e4, 0x3ea, 0x2df, 0x3e1, 0x343, 0xac, 0x218, 0x34b, 0x2ee, 0x33c, 0x3b2, 0x224, 0x1bf, 0x189, 0x3ab, 0x1a1, 0xf3, 0x1c, 0x3ee, 0x3fe, 0x373, 0x13b, 0xc9, 0x15d, 0x52, 0x2d, 0x333, 0x30f, 0x1fb, 0x29c, 0x20b, 0x18, 0x2cf, 0x36c, 0x10b, 0x15e, 0x38c, 0x244, 0x291, 0x22, 0x38e, 0xd0, 0x2d8, 0x11e, 0x1b8, 0x376, 0x150, 0x27b, 0x3bb, 0x12c, 0x2bb, 0x1ee, 0x27a, 0x2f1, 0x30c, 0x225, 0xf5, 0x3a9, 0x335, 0xba, 0x120, 0x1d8, 0x58, 0xfb, 0x25e, 0x2ca, 0x307, 0x3b9, 0x3b8, 0x2f2, 0xd2, 0x4c, 0x157, 0x84, 0x140, 0x2f6, 0x1f3, 0xde, 0x32f, 0xe1, 0x205, 0x1ef, 0x330, 0xd1, 0x392, 0x33e, 0x126, 0x26d, 0x83, 0x3bf, 0xd, 0x229, 0x396, 0x21f, 0x1b4, 0x15, 0xe6, 0xfa, 0x314, 0xea, 0x399, 0x2a2, 0x26b, 0x294, 0x92, 0xf9, 0x194, 0x21e, 0x1fc, 0xc6, 0x3c0, 0x22f, 0x46, 0x302, 0x3ad, 0x21, 0xa0, 0x2f6, 0x3e6, 0x378, 0x14e, 0x20b, 0x30, 0x32e, 0x356, 0x94, 0x39a, 0x2f8, 0x8, 0x8d, 0x99, 0x3c1, 0xbb, 0xd4, 0x3fb, 0x239, 0x23f, 0x15c, 0x230, 0x26, 0x157, 0x108, 0x109, 0x39d, 0x30f, 0x3f6, 0x262, 0x7c, 0x180, 0x146, 0x286, 0xa9, 0xef, 0x3ed, 0x40, 0x61, 0xc1, 0x237, 0x1d1, 0x2a9, 0x3e7, 0x1ec, 0x1dc, 0x2f2, 0x1a4, 0x130, 0x2aa, 0x52, 0x5a, 0xd7, 0x4e, 0x38f, 0x334, 0x3e0, 0x1b, 0x222, 0x1d, 0x141, 0x371, 0x357, 0x200, 0x308, 0x201, 0x19c, 0x293, 0x165, 0x307, 0x37b, 0x2fb, 0x3bd, 0x13b, 0x192, 0x17d, 0x290, 0x2d0, 0x2b1, 0x270, 0x47, 0x196, 0x33f, 0xd8, 0x134, 0xe8, 0x21a, 0x3be, 0x28e, 0x24, 0x76, 0x2c, 0xfb, 0xb5, 0x33a, 0xe, 0x3ee, 0x3f5, 0x1d7, 0x1ca, 0x121, 0x248, 0x3c1, 0x176, 0x350, 0x3e7, 0x3d8, 0x379, 0x3bd, 0x276, 0x241, 0x3fa, 0x15a, 0x2a6, 0x133, 0x23e, 0x399, 0x29a, 0x2f1, 0x2b, 0x218, 0x137, 0x2b3, 0x2ab, 0x185, 0x320, 0x170, 0x19f, 0x24c, 0x34c, 0x44, 0x4f, 0x236, 0x283, 0xfe, 0xc6, 0x389, 0xae, 0x230, 0x4c, 0x155, 0x52, 0xb4, 0x35c, 0x270, 0x8e, 0x251, 0x1ce, 0x19b, 0x2c1, 0x27e, 0x35b, 0x19e, 0x36d, 0x104, 0x385, 0x139, 0x166, 0x164, 0x326, 0x3bf, 0x34, 0x2d8, 0x71, 0x3b6, 0xf, 0x2f4, 0x187, 0x162, 0x1e9, 0x214, 0xa0, 0x1e5, 0x383, 0x3f6, 0xcd, 0x1f0, 0x1b, 0x4d, 0x74, 0x21a, 0x375, 0x22a, 0x120, 0x369, 0x189, 0x2b7, 0x226, 0xb7, 0x3f, 0xa1, 0xc4, 0x1cb, 0x37, 0x1bb, 0x2a0, 0x3fc, 0x395, 0x30d, 0x1a7, 0x103, 0x6b, 0x2da, 0x233, 0x32f, 0x384, 0x18, 0x32e, 0x2a5, 0x250, 0xef, 0x3d3, 0x100, 0x308, 0x242, 0x132, 0x237, 0x34d, 0x2ca, 0xe, 0x3a3, 0x327, 0x135, 0x1e2, 0xda, 0x54, 0xff, 0x3ce, 0x30d, 0x34e, 0x5, 0x358, 0x1f3, 0x2f9, 0x262, 0x1f0, 0x36, 0x134, 0x3a0, 0x1e8, 0x263, 0x3b2, 0x104, 0x303, 0xed, 0x322, 0x26d, 0x11, 0x223, 0x236, 0x10f, 0x3f8, 0x239, 0xee, 0x1ed, 0x13b, 0x241, 0x3fd, 0x161, 0x11d, 0x314, 0x359, 0x3b1, 0x3cb, 0x55, 0x2bd, 0x2fc, 0x13a, 0x3, 0x2cf, 0x356, 0x250, 0x1de, 0x357, 0x12, 0xec, 0x160, 0x35f, 0x226, 0x16e, 0xfc, 0x101, 0x5b, 0x11e, 0x1db, 0xf, 0x1e1, 0x215, 0x302, 0x2af, 0x210, 0x5a, 0x35c, 0xe9, 0x238, 0x2ac, 0xdf, 0x30c, 0x10c, 0x137, 0x16f, 0x2be, 0x33, 0x26c, 0x253, 0x311, 0x1, 0x242, 0x132, 0x237, 0x34d, 0x2ca, 0xe, 0x3a3, 0x327, 0x135, 0x1e2, 0xda, 0x54, 0xff, 0x3ce, 0x30d, 0x34e, 0x5, 0x358, 0x1f3, 0x2f9, 0x262, 0x8d, 0xc1, 0x19c, 0xb5, 0x1e6, 0x380, 0x254, 0x188, 0x243, 0x2e9, 0xf, 0x3c2, 0x46, 0x26, 0x2aa, 0x290, 0x2ad, 0x133, 0xea, 0x1ee, 0x3e1, 0x55, 0x173, 0x3e2, 0x1c2, 0x30, 0x146, 0x1d, 0x21a, 0x1cf, 0x2e8, 0x82, 0x303, 0x1da, 0x93, 0x34c, 0x110, 0xf9, 0xbb, 0x2a9, 0x307, 0x3ee, 0x397, 0x135, 0x3c4, 0x368, 0x2a0, 0x3eb, 0x12e, 0x2f0, 0x21, 0x109, 0xd7, 0x270, 0x238, 0x151, 0x37c, 0x56, 0xe4, 0x2a1, 0x366, 0x1ef, 0x36c, 0x94, 0xef, 0x357, 0x24, 0x3b0, 0x312, 0x195, 0x59, 0x326, 0x2e7, 0x340, 0x345, 0x1fc, 0x239, 0x1dc, 0x3bd, 0x1ca, 0x51, 0x347, 0xe6, 0x3bb, 0x2e4, 0x2d7, 0x206, 0x358, 0x3e6, 0x3f6, 0x334, 0x33f, 0x2c9, 0x18b, 0x3d4, 0x3aa, 0x2ab, 0x21d, 0x26c, 0xaf, 0x5f, 0x8, 0x61, 0x201, 0xfb, 0x1a1, 0x32b, 0x3f, 0x284, 0x5b, 0x23c, 0x365, 0x78, 0x22f, 0x11a, 0x304, 0xfb, 0x342, 0xb7, 0x1f8, 0x1a, 0x372, 0x23b, 0x18c, 0xee, 0x3bd, 0x394, 0x144, 0x20e, 0x27b, 0x395, 0x5e, 0x10a, 0x280, 0xd7, 0xe9, 0xf2, 0x29a, 0x3a5, 0x2d2, 0x17e, 0x274, 0x18, 0x146, 0x3a, 0x7a, 0x263, 0x2d3, 0x64, 0x170, 0xe3, 0x204, 0x8d, 0x182, 0x279, 0x1a1, 0x25f, 0xfc, 0xd, 0x1b9, 0x319, 0xc6, 0x77, 0x3da, 0x1ca, 0xa2, 0x107, 0x339, 0x3ce, 0x2f, 0x85, 0x140, 0x26f, 0x270, 0x79, 0x14d, 0x3d6, 0x169, 0xbf, 0x13a, 0xc, 0xa3, 0x1d, 0x3d, 0x335, 0x36d, 0x32, 0xb8, 0x275, 0x102, 0x242, 0xc1, 0x338, 0x2d4, 0x32b, 0x7e, 0x202, 0x2d8, 0x388, 0x63, 0x23f, 0x1ed, 0xe5, 0x51, 0x287, 0x398, 0x1e7, 0x213, 0x246, 0xa0, 0x333, 0x138, 0x238, 0x2a2, 0x1eb, 0x2b0, 0x25b, 0x9d, 0x6, 0x255, 0x20a, 0x21a, 0x39e, 0x3b2, 0x19, 0x5c, 0x33e, 0x81, 0x234, 0xb, 0x3d1, 0x45, 0x2cd, 0x2e7, 0x11b, 0x35, 0x3e7, 0x1f7, 0x327, 0x1ba, 0x6e, 0x305, 0x3c2, 0x118, 0x260, 0x3fa, 0x18d, 0x3e8, 0x2e4, 0x34e, 0x28, 0x39d, 0x138, 0x79, 0x29a, 0x343, 0x35a, 0x3e2, 0x301, 0x300, 0x134, 0x13f, 0x2ee, 0x2ab, 0x66, 0x281, 0x39a, 0x3af, 0x48, 0x1bf, 0x298, 0x322, 0x34c, 0x49, 0x38b, 0x293, 0xf3, 0x309, 0x284, 0x16c, 0x388, 0xc6, 0xee, 0x373, 0x24b, 0x232, 0xa8, 0x3eb, 0xb1, 0x353, 0x52, 0x352, 0x266, 0x359, 0x1b7, 0x31c, 0x37a, 0x1fb, 0x261, 0x1ce, 0x186, 0x39, 0x2a1, 0x183, 0x2cf, 0x286, 0x10d, 0x39e, 0x36d, 0x64, 0x2e0, 0x38c, 0x4, 0xc2, 0x2c, 0x35f, 0x114, 0x326, 0x38e, 0x65, 0xd4, 0x387, 0x3d5, 0x87, 0x2e1, 0x1b8, 0xf, 0x313, 0x69, 0x192, 0x3f3, 0x23d, 0x3bb, 0x382, 0x123, 0xa0, 0x26f, 0xe9, 0x1e4, 0x27a, 0x117, 0x173, 0x61, 0x2c, 0x2b7, 0x59, 0x106, 0x9e, 0xbb, 0x165, 0x70, 0x254, 0x5b, 0x1c4, 0xc6, 0x1dc, 0x1d7, 0x27c, 0x368, 0x12d, 0x30e, 0x26, 0x17d, 0x161, 0x1f4, 0x2e4, 0x295, 0xa0, 0xd7, 0x3a4, 0x33b, 0x3e1, 0x2a8, 0x6f, 0x262, 0x33f, 0x265, 0x218, 0x2a1, 0x306, 0x32e, 0x1d, 0xf4, 0x33c, 0x2c6, 0x26c, 0x171, 0x3ed, 0x24, 0x1bf, 0x139, 0x93, 0x256, 0x99, 0x19c, 0x1a1, 0x16e, 0x3db, 0x340, 0x21e, 0x3e7, 0x3ee, 0x87, 0x1cb, 0x2e9, 0x78, 0x15c, 0x13b, 0x51, 0x20e, 0x1fe, 0x12e, 0x3ad, 0x52, 0x2ad, 0x18a, 0x2fe, 0x346, 0x358, 0x30f, 0x47, 0x151, 0x3d6, 0x1ad, 0x3e2, 0x20b, 0x1b, 0x1b2, 0x3d4, 0x16f, 0x3ba, 0x36c, 0xa9, 0x3be, 0x2e8, 0x19, 0x170, 0x38c, 0x8, 0x308, 0x160, 0x195, 0x2c8, 0x22, 0xf9, 0x1d1, 0x33a, 0x380, 0x284, 0x2d8, 0x23b, 0x239, 0x2fb, 0x2a3, 0x3c4, 0x376, 0xc2, 0xb0, 0x195, 0x199, 0x88, 0x3c1, 0x12f, 0x391, 0x1f8, 0xd0, 0x10f, 0x3e7, 0x3d5, 0x21c, 0x243, 0x2c3, 0x31b, 0x3bd, 0x9f, 0x1b4, 0x12d, 0x215, 0x98, 0x3fa, 0x23d, 0x2f7, 0x5e, 0x42, 0x168, 0x133, 0x2bb, 0x1a3, 0x358, 0x217, 0x11c, 0x29a, 0x117, 0x1c5, 0x14e, 0x3c9, 0x336, 0x218, 0x14b, 0x3, 0x146, 0x1d0, 0x2bf, 0x2ab, 0x198, 0x4a, 0x371, 0xba, 0x208, 0x170, 0x311, 0x20, 0x76, 0x22d, 0x2cc, 0x34c, 0x124, 0xce, 0x1a1, 0x2dc, 0x377, 0x236, 0x1a8, 0x7, 0x24e, 0x310, 0xe2, 0xc6, 0x3b8, 0x355, 0x3c4, 0x2e5, 0x1e1, 0x230, 0x324, 0x3a7, 0x339, 0x24f, 0x3d2, 0x52, 0x153, 0x221, 0x3dd, 0x5, 0x3ca, 0x270, 0x3c8, 0x3f4, 0x2a8, 0xde, 0x19a, 0x1ce, 0x211, 0x390, 0x13a, 0x60, 0x9a, 0x27e, 0x35d, 0x1dd, 0x36c, 0x152, 0x2e3, 0x36d, 0x190, 0x253, 0x2f8, 0x9, 0x2db, 0x139, 0x184, 0x2c0, 0xb3, 0x1a6, 0x124, 0x19c, 0x28d, 0x2cd, 0x315, 0x259, 0x2ca, 0x380, 0x202, 0x1d3, 0x3fb, 0x1f7, 0x10e, 0x243, 0x18f, 0x77, 0x1d7, 0x1e2, 0x2e5, 0x3c2, 0xd2, 0x116, 0x20e, 0x3f1, 0x2c4, 0x2aa, 0x2b4, 0x3e8, 0x30d, 0x214, 0xb4, 0x133, 0x17f, 0x285, 0x2f6, 0x138, 0x3c8, 0x3e1, 0x2b2, 0x2f9, 0x196, 0x1be, 0x169, 0x3e2, 0x3e, 0x1b0, 0x43, 0x354, 0x205, 0x146, 0x3a0, 0x2ee, 0x175, 0x1b6, 0x152, 0x1cf, 0x1af, 0x9b, 0x171, 0x3af, 0x240, 0x303, 0x33e, 0x2, 0x308, 0x189, 0x166, 0x34c, 0x248, 0x338, 0x113, 0x193, 0x223, 0xbb, 0x19d, 0x309, 0xd, 0x3a6, 0x3ff, 0x3ee, 0x21c, 0x8f, 0x31e, 0xee, 0x3ae, 0x3c4, 0x1c3, 0x38d, 0x1a4, 0x22c, 0x15, 0x3eb, 0x181, 0x15d, 0x161, 0x3d9, 0x213, 0x21, 0x168, 0x266, 0x2fe, 0x103, 0x1e5, 0x270, 0x399, 0x3cb, 0x16d, 0x1fb, 0x32c, 0x37c, 0x308, 0x312, 0x191, 0x256, 0xc1, 0x3d1, 0x59, 0x22, 0x3c1, 0xb5, 0x16e, 0x2e7, 0x194, 0x165, 0x380, 0xd, 0x345, 0x3e7, 0x34f, 0x188, 0x1c4, 0x239, 0x3f5, 0x1ba, 0x2e9, 0x3c0, 0x3bd, 0x27c, 0x376, 0x3c2, 0x1a4, 0x51, 0x54, 0x367, 0x26, 0x3fa, 0xe6, 0x323, 0x3ad, 0x290, 0x23a, 0x2e4, 0x85, 0x5a, 0x133, 0x2fe, 0x206, 0x39d, 0x3a4, 0x1ee, 0x18e, 0x3e6, 0x47, 0x29a, 0x55, 0x6f, 0x334, 0x26b, 0x2b0, 0x3e2, 0x7c, 0x2c9, 0x218, 0x125, 0x30, 0x134, 0x3d4, 0x36a, 0x363, 0x1d, 0x3a9, 0x2ab, 0x269, 0xa9, 0x1cf, 0x35e, 0x26c, 0x39a, 0x28e, 0x82, 0x170, 0x5f, 0x200, 0x1bf, 0x1da, 0x81, 0x61, 0x160, 0xb3, 0x34c, 0x99, 0xfb, 0x8a, 0x106, 0xf9, 0x293, 0x32b, 0x3db, 0x236, 0x2a9, 0x70, 0x284, 0x2ed, 0x3fb, 0x3ee, 0x31, 0x23c, 0xc6, 0x2fb, 0x135, 0xdc, 0x78, 0x2f2, 0x24b, 0x219, 0x53, 0x93, 0x121, 0x16, 0x195, 0xd3, 0x248, 0xfb, 0x114, 0x11, 0x3c1, 0x16a, 0x1b1, 0x315, 0x176, 0xf3, 0x1f8, 0x289, 0x350, 0x70, 0x101, 0x3a6, 0x3e7, 0x297, 0x229, 0x23b, 0x3d8, 0x247, 0x243, 0x235, 0x379, 0x135, 0x1b8, 0x1e0, 0x3bd, 0xf1, 0x1c3, 0x22f, 0x276, 0x232, 0x12d, 0x8c, 0x241, 0x20e, 0x3df, 0x13, 0x3fa, 0x1cc, 0x97, 0x157, 0x15a, 0x3d9, 0x5e, 0x210, 0x2a6, 0x258, 0x123, 0x2d, 0x133, 0x1f5, 0xa, 0xd7, 0x23e, 0x1b7, 0x358, 0x9c, 0x399, 0x337, 0x2fd, 0x227, 0x29a, 0xaa, 0x1bc, 0x196, 0x2f1, 0x2bd, 0x14e, 0x277, 0x2b, 0x17e, 0x1f, 0x360, 0x218, 0x24a, 0xc0, 0x1b2, 0x137, 0x183, 0x146, 0x29b, 0x2b3, 0x1ef, 0x105, 0x3d0, 0x2ab, 0xdb, 0x2a4, 0x263, 0x185, 0x10b, 0x371, 0x1d9, 0x320, 0x171, 0x2a7, 0x41, 0x170, 0xbe, 0x12, 0x1e3, 0x19f, 0x4, 0x76, 0x3b, 0x14c, 0x91, 0x234, 0x2c0, 0x191, 0x14a, 0xb, 0x195, 0x1a6, 0x132, 0x3d1, 0x164, 0x220, 0x19c, 0x45, 0x20c, 0x3c1, 0x2d4, 0x2cd, 0x9e, 0x34d, 0x25f, 0x2e7, 0x259, 0x27d, 0x1f8, 0x11b, 0x15b, 0x380, 0x34, 0x35, 0xe, 0x142, 0x1d3, 0x3e7, 0x127, 0xb6, 0x1fc, 0x1f7, 0x62, 0x1c4, 0xf6, 0x327, 0x243, 0x63, 0x1ff, 0x1ba, 0x3b6, 0x77, 0x2a3, 0x6e, 0xf0, 0x3bd, 0x1e2, 0x305, 0x15c, 0x321, 0x2d9, 0x3c2, 0x299, 0x119, 0x12d, 0x118, 0x116, 0x54, 0x187, 0x260, 0x347, 0x3f1, 0x20d, 0x3fa, 0x398, 0x25c, 0x2aa, 0x18d, 0x3ce, 0x3ad, 0x252, 0x3e8, 0x5e, 0x29, 0x28a, 0x2e4, 0x214, 0x1a9, 0x4b, 0x34e, 0x212, 0x133, 0x3ea, 0x28, 0x2b1, 0x3a8, 0x285, 0x39d, 0x28b, 0x2df, 0x358, 0x138, 0x27f, 0x18e, 0x383, 0x79, 0x3e1, 0x1bd, 0x317, 0x29a, 0x154, 0x2f9, 0xab, 0x343, 0x31d, 0x334, 0x76, 0x139, 0x81, 0x308, 0xa6, 0x91, 0x61, 0x312, 0x93, 0x8d, 0x160, 0x191, 0x294, 0x2c, 0xb3, 0x256, 0x201, 0x195, 0x34c, 0xc1, 0x2b7, 0x26d, 0x99, 0x3d1, 0x2c8, 0x92, 0xfb, 0x59, 0x110, 0x19c, 0x8a, 0x22, 0x237, 0x113, 0x106, 0x3c1, 0x1a1, 0x326, 0xf9, 0xb5, 0x362, 0x9e, 0x293, 0x16e, 0x315, 0x1d1, 0x32b, 0x2e7, 0xbb, 0x1e6, 0x3db, 0x194, 0x33a, 0x1f8, 0x236, 0x165, 0x3f, 0x340, 0x2a9, 0x380, 0x68, 0xd4, 0x70, 0xd, 0x21e, 0xe, 0x284, 0x345, 0x307, 0x254, 0x2ed, 0x3e7, 0x24e, 0x2d8, 0x3fb, 0x34f, 0x5b, 0x1fc, 0x3ee, 0x188, 0x23b, 0x37b, 0x31, 0x1c4, 0x1ec, 0x87, 0x23c, 0x239, 0x397, 0x243, 0xc6, 0x3f5, 0x1cb, 0x31e, 0x2fb, 0x1ba, 0x365, 0x1dc, 0x135, 0x2e9, 0x23f, 0x2a3, 0xdc, 0x3c0, 0x1d7, 0x21f, 0x78, 0x3bd, 0x3c4, 0xf, 0x2f2, 0x27c, 0x386, 0x15c, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0x1d8, 0x3b4, 0x8, 0x2db, 0x19f, 0x40, 0x2f5, 0xe3, 0x200, 0x385, 0x311, 0x24, 0x17, 0xbe, 0x120, 0xb8, 0x1f9, 0x112, 0x1c9, 0x3d3, 0x82, 0x253, 0x2a7, 0x19, 0x2bc, 0x115, 0xc8, 0x1cd, 0xba, 0x249, 0x273, 0x1d9, 0x26c, 0x3bc, 0x2d3, 0x344, 0x1df, 0x2b5, 0x216, 0x2e3, 0x185, 0x94, 0x335, 0x33, 0xa9, 0x19e, 0x198, 0x141, 0xeb, 0xdb, 0x21a, 0x351, 0x2d1, 0xf4, 0x2be, 0x2a5, 0x3a9, 0x1dd, 0x105, 0x177, 0x2f3, 0x3a, 0x3aa, 0x3b5, 0x1d0, 0x16f, 0x197, 0x29b, 0x36a, 0xa3, 0xf5, 0x366, 0x111, 0x3a1, 0x306, 0x9a, 0x137, 0x6, 0xd9, 0x1aa, 0x30, 0x2c1, 0x14b, 0x180, 0x225, 0x24a, 0x1b, 0x10c, 0x274, 0xd8, 0x72, 0x384, 0x2c9, 0x390, 0x1f, 0x265, 0xbf, 0xf8, 0x30c, 0x1f1, 0x3c9, 0x56, 0x393, 0x277, 0x2b0, 0xa7, 0x39c, 0x1ad, 0x131, 0xdf, 0x173, 0x19a, 0x2f1, 0x38a, 0x3b0, 0x2cb, 0x40, 0x1e3, 0x38c, 0x24, 0x2e, 0x2f8, 0x112, 0x392, 0x357, 0x19, 0x171, 0x5d, 0x249, 0xef, 0x36d, 0x344, 0x3be, 0x2c6, 0x94, 0x263, 0xcc, 0x141, 0x1d6, 0x36c, 0xf4, 0x175, 0x286, 0x177, 0x1ef, 0xe8, 0x16f, 0x32e, 0x27e, 0x366, 0x222, 0x29f, 0x6, 0x1b2, 0x2a1, 0x180, 0x43, 0x13a, 0xd8, 0xe4, 0x20b, 0x265, 0x17e, 0x3e0, 0x56, 0x32f, 0x1ce, 0x1ad, 0x262, 0x37c, 0x38a, 0x196, 0x28f, 0x378, 0x151, 0x2a8, 0x38f, 0xfd, 0x37a, 0x238, 0x337, 0x30f, 0x33b, 0x6b, 0x270, 0x36b, 0x2f6, 0x11f, 0x346, 0xd7, 0x359, 0x14, 0x1a5, 0x3dd, 0x109, 0x18a, 0x295, 0x2d0, 0x258, 0x21, 0x145, 0x30d, 0x52, 0x1f4, 0x2f0, 0xad, 0x1e7, 0x157, 0x31a, 0x12e, 0x17d, 0x339, 0x302, 0x3ef, 0x3eb, 0x130, 0x20e, 0x30e, 0x8b, 0x2a0, 0x230, 0x288, 0x17a, 0x13b, 0x368, 0x22f, 0x24b, 0x386, 0x369, 0x33e, 0x200, 0x20f, 0x17c, 0x112, 0x32d, 0x147, 0xc8, 0x33d, 0x3b2, 0x344, 0x375, 0x30a, 0xa9, 0x271, 0x1b6, 0xf4, 0x2ea, 0x20a, 0x3aa, 0x2cf, 0x13f, 0x366, 0x4d, 0x26e, 0x30, 0x316, 0x9d, 0xd8, 0x1c8, 0x3e, 0x30c, 0x3cd, 0xe7, 0x1ad, 0xcd, 0x1eb, 0x6f, 0x156, 0x154, 0x38f, 0x1fa, 0x1f3, 0x1e4, 0x31c, 0x138, 0x36b, 0x1e5, 0x75, 0x206, 0x16b, 0x3ea, 0x109, 0x314, 0x246, 0x2ad, 0x1c1, 0x29, 0x1f4, 0x1e9, 0x2b4, 0x323, 0x15d, 0x398, 0x302, 0x3d7, 0x3b7, 0x192, 0xa8, 0x118, 0x288, 0x2f4, 0xe5, 0x376, 0x2b8, 0x1e2, 0x78, 0x3ae, 0x370, 0x1dc, 0x374, 0x63, 0x397, 0x71, 0x3b9, 0x188, 0x3f8, 0x127, 0x2ed, 0x207, 0x202, 0xd4, 0x309, 0x11b, 0x33a, 0x3bf, 0x2ec, 0x16e, 0x13c, 0x2d4, 0x106, 0x67, 0x228, 0x92, 0x3ab, 0x1a6, 0x201, 0x166, 0x242, 0x312, 0x122, 0x3b, 0x1da, 0x2db, 0xe3, 0x24, 0xb8, 0x3d3, 0x19, 0x1cd, 0x1d9, 0x344, 0x2e3, 0x33, 0x141, 0x351, 0x2a5, 0x177, 0x3b5, 0x29b, 0x366, 0x9a, 0x1aa, 0x180, 0x10c, 0x384, 0x265, 0x1f1, 0x277, 0x1ad, 0x19a, 0x3a5, 0x378, 0x14d, 0x2da, 0x238, 0xc7, 0x9c, 0x36b, 0x3ca, 0x1d4, 0x14, 0x29d, 0x1a7, 0x2d0, 0x172, 0x210, 0x1f4, 0x3d2, 0x2c2, 0x12e, 0x1fd, 0x3fc, 0x130, 0x2a, 0x8c, 0x288, 0x1e1, 0x394, 0x386, 0x3da, 0x37, 0x23f, 0xdd, 0x235, 0x397, 0xe2, 0x2ff, 0x5b, 0x3f7, 0xa1, 0x21e, 0x1c0, 0x289, 0x33a, 0x377, 0x3a2, 0x362, 0x3e4, 0x226, 0x110, 0x3ec, 0xd3, 0x201, 0x2cc, 0x11a, 0xa6, 0x204, 0x369, 0x275, 0x12, 0x5c, 0x3ed, 0x208, 0x2e2, 0x2e8, 0x1a2, 0x375, 0x21d, 0x2a4, 0x3ac, 0x356, 0x2bf, 0x3de, 0x349, 0x1b3, 0x4d, 0xd5, 0xc0, 0x86, 0x1c2, 0x336, 0x2fc, 0x33f, 0x2d2, 0xcd, 0x3d6, 0x1bf, 0x38c, 0x120, 0x392, 0x28e, 0x249, 0x371, 0x2c6, 0xa9, 0x1d6, 0x356, 0x177, 0x363, 0x27e, 0x306, 0x1b2, 0x125, 0xd8, 0x329, 0x3e0, 0x2b0, 0x262, 0x3d6, 0x378, 0x29a, 0x37a, 0x1e4, 0x6b, 0x3a4, 0x346, 0x2b1, 0x3dd, 0x5a, 0x258, 0x108, 0x1f4, 0x3ad, 0x31a, 0x162, 0x3ef, 0x367, 0x8b, 0x12d, 0x13b, 0x376, 0x2f2, 0x21f, 0x23f, 0x1ba, 0xc6, 0x87, 0x23b, 0x34f, 0x2ed, 0xe, 0x68, 0x165, 0x3db, 0x1d1, 0x362, 0x3c1, 0x8a, 0x92, 0x2b7, 0x256, 0x160, 0x91, 0x76, 0x2cb, 0x200, 0x2e, 0x3ed, 0x19, 0x39a, 0x36d, 0x216, 0x263, 0x269, 0xf4, 0x3ba, 0xe8, 0x36a, 0x222, 0xd5, 0x180, 0x218, 0x20b, 0x30c, 0x32f, 0x26b, 0x38a, 0xab, 0x2a8, 0x47, 0x337, 0x4e, 0x36b, 0x39d, 0x359, 0xa0, 0x18a, 0x85, 0x145, 0x5e, 0xad, 0x323, 0x17d, 0x1fe, 0x130, 0x54, 0x230, 0x6d, 0x22f, 0x27c, 0x37e, 0x22b, 0x112, 0x15e, 0x174, 0x344, 0x39e, 0x330, 0xf4, 0x37d, 0x3a0, 0x366, 0x268, 0x296, 0xd8, 0x25b, 0x39b, 0x1ad, 0x261, 0x22e, 0x38f, 0x3cb, 0x27, 0x36b, 0x333, 0x17f, 0x109, 0x96, 0x84, 0x1f4, 0x353, 0x73, 0x302, 0x287, 0x23, 0x288, 0x38d, 0x13e, 0x78, 0x14f, 0x18f, 0x397, 0x388, 0x3a3, 0x2ed, 0x1c, 0x1a0, 0x33a, 0x1c7, 0x25e, 0x106, 0x338, 0x332, 0x201, 0x322, 0x184, 0x1da, 0x80, 0x17, 0x3ed, 0x32, 0x273, 0x35e, 0x128, 0xeb, 0x356, 0x2ee, 0x197, 0x3d4, 0xc, 0x225, 0x1c2, 0xc3, 0x393, 0x26b, 0x31d, 0x2ac, 0x16d, 0x79, 0x231, 0x3a4, 0x285, 0x2d6, 0x2d7, 0x1a9, 0x382, 0x290, 0x3ce, 0x2ba, 0x1fe, 0x260, 0x150, 0x1a4, 0x2d9, 0x179, 0x21f, 0x77, 0x2e1, 0x239, 0x62, 0x3f9, 0x254, 0x35, 0x21b, 0x194, 0x25f, 0x278, 0x113, 0x220, 0x35f, 0x256, 0x2c0, 0x244, 0x3b0, 0x2f5, 0xbe, 0x82, 0x1cd, 0x2d3, 0x94, 0xeb, 0x2a5, 0x3aa, 0xa3, 0x137, 0x180, 0x72, 0xf8, 0x2b0, 0x19a, 0x117, 0x38f, 0x39f, 0x9c, 0x36e, 0x35c, 0x3b3, 0x2d0, 0x382, 0x129, 0x323, 0x1fd, 0x3df, 0x8b, 0xbd, 0x394, 0xf, 0x355, 0x2c3, 0x397, 0x319, 0x297, 0x345, 0x1c0, 0x65, 0x32b, 0x278, 0x226, 0x92, 0x2ce, 0x121, 0xa6, 0x4, 0x3c6, 0x2f8, 0x208, 0x33d, 0x35e, 0x250, 0x3ac, 0x286, 0x2b3, 0x28c, 0xd5, 0x209, 0x1c8, 0x3e0, 0x2d2, 0x261, 0x55, 0x227, 0x267, 0x270, 0x1a3, 0x16b, 0x2d7, 0x352, 0x213, 0xad, 0x97, 0x3fd, 0x367, 0x22c, 0x2f4, 0x24b, 0x3c, 0x14f, 0x31e, 0x247, 0x7f, 0x24e, 0x10f, 0x309, 0x194, 0xb7, 0x1f2, 0x8a, 0x248, 0x32a, 0x8d, 0x298, 0x10, 0x303, 0x3f2, 0x32, 0xef, 0x163, 0x152, 0x2ab, 0x20a, 0x2de, 0x222, 0x354, 0x36, 0x329, 0x39b, 0x35a, 0x196, 0x1e3, 0x2f8, 0x19, 0xef, 0x2c6, 0x141, 0x175, 0xe8, 0x366, 0x1b2, 0x13a, 0x265, 0x32f, 0x37c, 0x378, 0xfd, 0x30f, 0x36b, 0xd7, 0x3dd, 0x2d0, 0x30d, 0xad, 0x12e, 0x3ef, 0x30e, 0x288, 0x22f, 0x3c4, 0x23f, 0x1cb, 0x1ec, 0x5b, 0x307, 0x68, 0x33a, 0x315, 0x1a1, 0x110, 0x2b7, 0x294, 0xa6, 0x8, 0x303, 0x3ed, 0xc8, 0x371, 0x21d, 0x21a, 0x3ba, 0x349, 0x306, 0x18b, 0x1c2, 0x30c, 0x14e, 0x3d6, 0x3f6, 0x3e1, 0x4e, 0x36e, 0x2b1, 0x2d7, 0x2ad, 0x5e, 0x161, 0x162, 0x347, 0x46, 0x6d, 0x15c, 0x21f, 0x1dc, 0x243, 0x37b, 0x2d8, 0xe, 0x340, 0x1e6, 0x9e, 0x113, 0x92, 0x195, 0x8d, 0x139, 0x40, 0x2e, 0x357, 0x249, 0x3be, 0xcc, 0xf4, 0x1ef, 0x27e, 0x6, 0x43, 0x20b, 0x56, 0x262, 0x28f, 0x38f, 0x337, 0x270, 0x346, 0x1a5, 0x295, 0x145, 0x2f0, 0x31a, 0x302, 0x20e, 0x230, 0x368, 0x2f2, 0x3c6, 0x3f2, 0xc8, 0x2eb, 0x66, 0xf4, 0x3de, 0x1ea, 0x30, 0x39, 0x1f0, 0x1ad, 0x32c, 0x2b2, 0x1e4, 0x2b9, 0x3a8, 0x109, 0xb9, 0x148, 0x323, 0x3fd, 0x187, 0x288, 0x57, 0x30b, 0x1dc, 0x8f, 0x1f7, 0x2ed, 0xe0, 0xca, 0x16e, 0x38b, 0x164, 0x201, 0x126, 0x1d8, 0x38c, 0x224, 0x1cd, 0x35e, 0x152, 0x2be, 0xe8, 0x2c5, 0x2c1, 0x1c2, 0x211, 0x131, 0x28f, 0x317, 0xc7, 0x3a4, 0x5, 0xc5, 0x21, 0x3e8, 0x155, 0x1fe, 0x324, 0xbd, 0x24b, 0xf0, 0xdd, 0x239, 0x310, 0x387, 0x68, 0x27d, 0x4f, 0x113, 0x124, 0x25d, 0x61, 0x3b4, 0x12, 0x392, 0xba, 0x10b, 0x33c, 0x2a5, 0x2b3, 0x222, 0x14b, 0x360, 0x3e2, 0xdf, 0x1bc, 0xfd, 0x217, 0x1b7, 0x2b1, 0x1a7, 0x2a6, 0x2f0, 0x23d, 0x13, 0x54, 0x348, 0x1c3, 0x1d7, 0x2c3, 0x247, 0x1fc, 0xa1, 0x350, 0x3db, 0x12f, 0x11, 0x3d1, 0xa5, 0x53, 0x8, 0x385, 0x3d3, 0x249, 0x2e3, 0xdb, 0x177, 0xa3, 0x1aa, 0xd8, 0x1f1, 0xdf, 0x378, 0x3f4, 0x9c, 0x346, 0x29d, 0x10a, 0x1f4, 0x155, 0x3fc, 0x8b, 0x1e1, 0xf1, 0x23f, 0x325, 0x2ff, 0x2ed, 0x1c0, 0x328, 0x362, 0xce, 0xd3, 0x160, 0x204, 0x3c6, 0x3ed, 0x320, 0x375, 0x269, 0x2bf, 0x255, 0xd5, 0x6c, 0x2fc, 0x26b, 0x1bc, 0x1fa, 0x4e, 0x1a3, 0x34a, 0x85, 0xfa, 0x2ae, 0x1fe, 0x241, 0x2f4, 0x27c, 0x31b, 0x396, 0x37b, 0x372, 0xe0, 0x194, 0x1b1, 0x67, 0x26d, 0xb0, 0x102, 0x1e3, 0x3f2, 0x190, 0x3be, 0x330, 0x35b, 0x32e, 0x26e, 0x36, 0x17e, 0x331, 0xde, 0xfd, 0x27, 0x2d5, 0x1a5, 0x246, 0x7d, 0x157, 0xff, 0x324, 0x17a, 0x13e, 0x389, 0x1cb, 0x3b9, 0x1b9, 0x70, 0xca, 0x2dc, 0x237, 0x332, 0x58, 0x81, 0x2f5, 0x1f9, 0xc8, 0x1df, 0x198, 0x3a9, 0x197, 0x137, 0x1b, 0xbf, 0x39c, 0x6f, 0x303, 0x357, 0x26c, 0x263, 0x356, 0x16f, 0x134, 0x13a, 0x30c, 0x262, 0x55, 0x238, 0x358, 0x359, 0x5a, 0x30d, 0x161, 0x302, 0x54, 0x13b, 0xf, 0x135, 0x239, 0x5b, 0xe, 0x236, 0x16e, 0x237, 0x26d, 0x160, 0x1, 0x303, 0x357, 0x26c, 0x263, 0x356, 0x16f, 0x134, 0x13a, 0x30c, 0x262, 0x55, 0x238, 0x358, 0x359, 0x5a, 0x30d, 0x161, 0x302, 0x54, 0x13b, 0xf, 0x135, 0x239, 0x5b, 0xe, 0x236, 0x16e, 0x237, 0x26d, 0x160, 0x1, 0x303, 0x357, 0x26c, 0x263, 0x356, 0x16f, 0x134, 0x13a, 0x30c, 0x262, 0x55, 0x238, 0x358, 0x359, 0x5a, 0x30d, 0x161, 0x302, 0x54, 0x13b, 0xf, 0x135, 0x239, 0x5b, 0xe, 0x236, 0x16e, 0x237, 0x26d, 0x160, 0x1, 0x303, 0x357, 0x26c, 0x263, 0x356, 0x16f, 0x134, 0x13a, 0x30c, 0x262, 0x55, 0x238, 0x358, 0x359, 0x5a, 0x30d, 0x161, 0x302, 0x54, 0x13b, 0xf, 0x20f, 0x147, 0x344, 0x271, 0x20a, 0x366, 0x316, 0x3e, 0x1ad, 0x156, 0x1f3, 0x36b, 0x16b, 0x246, 0x1f4, 0x15d, 0x3b7, 0x288, 0x2b8, 0x370, 0x397, 0x3f8, 0x202, 0x33a, 0x13c, 0x228, 0x201, 0x122, 0x2f5, 0x3ed, 0x9b, 0x335, 0x356, 0x2de, 0xd9, 0x1c2, 0xac, 0xcb, 0x16d, 0x27f, 0x26f, 0x2d7, 0x28a, 0x2af, 0x1fe, 0x116, 0x313, 0x21f, 0x1ff, 0x319, 0x254, 0x15b, 0x38e, 0x113, 0x132, 0x24d, 0x3b0, 0xbe, 0x64, 0x3be, 0xdb, 0x1d5, 0x222, 0x24a, 0x186, 0x262, 0xaa, 0xf2, 0x2f6, 0x1f5, 0x352, 0x2f0, 0x1cc, 0xc9, 0x17a, 0xf1, 0xee, 0x23c, 0x297, 0x6a, 0x3db, 0x16a, 0x49, 0xb3, 0x219, 0x1c6, 0x82, 0x1de, 0x66, 0x3a9, 0x255, 0x354, 0x2c9, 0x257, 0x343, 0x47, 0xd6, 0x3a8, 0x5a, 0x213, 0x18d, 0x26, 0x149, 0x321, 0x3c0, 0x396, 0x1f7, 0x345, 0x7e, 0x34d, 0x22, 0x167, 0x234, 0x2cb, 0x17, 0x115, 0x216, 0x351, 0x1d0, 0x6, 0x72, 0x277, 0x6f, 0x3f4, 0xe9, 0x14, 0x12c, 0x129, 0x162, 0x2a, 0x276, 0x78, 0x2e1, 0x2ff, 0x345, 0xfc, 0x12f, 0x110, 0x25d, 0x219, 0x38c, 0x208, 0x2eb, 0x269, 0x1d5, 0x4d, 0x13a, 0x2b, 0x261, 0x16d, 0xf7, 0x1ae, 0x295, 0xfa, 0x15d, 0x367, 0x232, 0x1ed, 0x365, 0x21c, 0x3c7, 0x340, 0xb7, 0x67, 0x34c, 0x53, 0x80, 0x392, 0x3b2, 0x152, 0x3ba, 0x1ea, 0x300, 0x17e, 0x1be, 0x3e5, 0x18e, 0x75, 0x212, 0x30d, 0x18d, 0x4c, 0x12d, 0x13e, 0x77, 0x23c, 0x127, 0x1a8, 0x2e7, 0x28d, 0x132, 0x93, 0x2db, 0x1f9, 0x249, 0x335, 0x2a5, 0x36a, 0x2c1, 0x1f, 0x1ad, 0x2ac, 0x3c5, 0x36e, 0x29d, 0x42, 0x1e7, 0x3f3, 0x8c, 0x376, 0x355, 0x18c, 0x5b, 0x38, 0x328, 0x326, 0x3ec, 0x121, 0x1da, 0x90, 0x2e2, 0x2c6, 0x7a, 0x2cf, 0xd5, 0x360, 0x257, 0x28f, 0x2e, 0x5d, 0x94, 0x175, 0x27e, 0x180, 0x17e, 0x37c, 0x38f, 0x6b, 0x359, 0x2d0, 0x2f0, 0x339, 0x8b, 0x22f, 0xdc, 0x397, 0x3fb, 0x68, 0x32b, 0x237, 0x34c, 0xa6, 0x200, 0xaf, 0x35e, 0x21a, 0x363, 0xd5, 0x2c9, 0x14e, 0x55, 0x1e4, 0x39d, 0x2d7, 0x23a, 0x2aa, 0x367, 0x6d, 0x3bd, 0x31e, 0x188, 0xe, 0x194, 0x326, 0x3d1, 0x8d, 0x2cb, 0x112, 0xef, 0xcc, 0x177, 0x222, 0x13a, 0x56, 0x196, 0x37a, 0x36b, 0x1a5, 0x21, 0x1e7, 0x3ef, 0x230, 0x386, 0x135, 0x1ec, 0x2ed, 0x3f, 0x293, 0x110, 0xb3, 0x76, 0x5f, 0xc8, 0x1cf, 0x356, 0x36a, 0x18b, 0x7c, 0x173, 0x29a, 0x4e, 0x206, 0x4b, 0x290, 0x162, 0x54, 0x1ca, 0x3c0, 0x243, 0x34f, 0xd4, 0x2e7, 0x113, 0xc1, 0x91, 0x1e3, 0x357, 0x344, 0x1d6, 0xe8, 0x6, 0xe4, 0x1ce, 0x378, 0x337, 0x11f, 0x109, 0x30d, 0x31a, 0x130, 0x17a, 0x3c4, 0x5c, 0x174, 0xa9, 0x37d, 0x34b, 0xd8, 0x257, 0x22e, 0x1e4, 0x333, 0x34e, 0x1f4, 0x2fa, 0x23, 0x376, 0x14f, 0xf6, 0x2ed, 0x7e, 0x25e, 0x92, 0x322, 0x2db, 0x3ed, 0xd1, 0xeb, 0xe8, 0xc, 0x390, 0x26b, 0x3e5, 0x231, 0x359, 0x1a9, 0x3d2, 0x1fe, 0xa2, 0x179, 0x365, 0x62, 0x7, 0x194, 0x245, 0x35f, 0x61, 0xe3, 0x208, 0x3be, 0x2d1, 0x1b5, 0x18b, 0xf8, 0x1c5, 0xfd, 0xe9, 0x50, 0x2e4, 0x2c2, 0x98, 0x17a, 0x381, 0x3fe, 0x1fc, 0x1a, 0x391, 0x237, 0x291, 0x298, 0x24, 0x2e2, 0x30a, 0x3a9, 0x28c, 0x9d, 0x56, 0x32c, 0x1f3, 0x36e, 0x266, 0x29, 0x12e, 0x15, 0xe5, 0x3c0, 0x8f, 0x127, 0x2a9, 0x223, 0x228, 0x2c, 0x2, 0xb8, 0x2e8, 0x152, 0x2f3, 0x29f, 0x1b0, 0xa7, 0x55, 0x3c8, 0x26f, 0x295, 0x3e8, 0x1fd, 0x46, 0x2e5, 0x29e, 0x1ec, 0x1d3, 0xfc, 0xb5, 0x124, 0x24d, 0x1bf, 0xb8, 0x1d9, 0x141, 0x3b5, 0x1aa, 0x265, 0x19a, 0x2da, 0x36b, 0x29d, 0x210, 0x12e, 0x2a, 0x394, 0x23f, 0xe2, 0xa1, 0x33a, 0x3e4, 0xd3, 0xa6, 0x12, 0x2e2, 0x21d, 0x2bf, 0x4d, 0x1c2, 0x2d2, 0x2a2, 0x4e, 0xa, 0xb9, 0x161, 0x98, 0x2f4, 0x21f, 0x3cf, 0x3ff, 0x340, 0x1b1, 0x1f6, 0x8d, 0x33e, 0x104, 0x3be, 0x1ab, 0x2dd, 0x43, 0x39b, 0xde, 0x337, 0x75, 0xb4, 0x2f0, 0xff, 0xa2, 0x2f2, 0x18f, 0x310, 0x70, 0x2ec, 0x44, 0xb3, 0x1d8, 0x1f9, 0x26c, 0xeb, 0x1d0, 0x30, 0xbf, 0x2f1, 0x47, 0x17b, 0x3b3, 0x23a, 0x2ba, 0x215, 0x376, 0x29e, 0x3d8, 0x345, 0x3e9, 0x342, 0xc1, 0x244, 0x20f, 0x5d, 0x250, 0x37d, 0x29f, 0x360, 0x29c, 0x2a8, 0xf7, 0x16b, 0x21, 0x395, 0x287, 0x13b, 0x1e0, 0x8f, 0x24e, 0x2b6, 0x13c, 0x2c8, 0x189, 0x80, 0xaf, 0x163, 0x1e8, 0x146, 0x9d, 0xac, 0xab, 0x170, 0x36d, 0x21a, 0x32e, 0x125, 0x56, 0xab, 0x30f, 0x206, 0x258, 0x161, 0x130, 0x3c2, 0xdc, 0x87, 0x307, 0x194, 0x106, 0x195, 0x76, 0x2f8, 0x26c, 0x1d6, 0x349, 0x180, 0x3e2, 0x28f, 0x1e4, 0xd7, 0x85, 0x1e7, 0x347, 0x13b, 0x3c0, 0x23c, 0x254, 0x33a, 0x3c1, 0x34c, 0x139, 0x120, 0xef, 0x269, 0x16f, 0x18b, 0x3e0, 0x6f, 0x337, 0xea, 0x2d0, 0x3ad, 0x3eb, 0x6d, 0x1d7, 0x239, 0x2ed, 0x1f8, 0x1a1, 0xc1, 0x81, 0x2e, 0x2e8, 0x141, 0x363, 0x2a1, 0x30c, 0x196, 0x3e6, 0x346, 0x4b, 0xad, 0x26, 0x17a, 0x21f, 0x397, 0x3e7, 0x236, 0x326, 0x2b7, 0x308, 0x5f, 0x249, 0x33c, 0xe8, 0x30, 0x17e, 0x3d6, 0x238, 0x39d, 0x295, 0x3bb, 0x3ef, 0x1a4, 0x78, 0x243, 0x24e, 0x165, 0xf9, 0x26d, 0xa6, 0x24, 0x39a, 0xcc, 0x3aa, 0x1b2, 0x7c, 0x38a, 0x3e1, 0x11f, 0x5a, 0x2f0, 0x1fe, 0x288, 0x3bd, 0x2e0, 0x1af, 0xf4, 0x28c, 0xe1, 0x1ad, 0x13d, 0x1d2, 0x109, 0xbc, 0xff, 0x288, 0x373, 0x318, 0x2ed, 0x3f0, 0x28d, 0x201, 0x2, 0x1c9, 0x35e, 0x1e8, 0x111, 0x1c2, 0x35a, 0x27a, 0x3a4, 0x212, 0x178, 0x1fe, 0x119, 0x2ef, 0x239, 0x1d3, 0x3e9, 0x113, 0xb, 0x4, 0x392, 0x2b5, 0x3d0, 0x222, 0x384, 0x2bd, 0xfd, 0x341, 0x2d, 0x2f0, 0x3fc, 0x232, 0x1d7, 0x7b, 0x3a6, 0x3db, 0x226, 0x16, 0x8, 0x32d, 0x163, 0x3a9, 0x4d, 0x301, 0x173, 0x1fa, 0x28b, 0x5a, 0x1e9, 0x3f1, 0x6d, 0x3ae, 0xf6, 0x345, 0x3bf, 0x45, 0x2c, 0x10, 0x253, 0x2c6, 0x35b, 0x9a, 0x20b, 0x2e6, 0x3f4, 0x11f, 0xb4, 0x3d2, 0x3eb, 0xda, 0x355, 0x1ec, 0x283, 0x377, 0x8a, 0x58, 0x20, 0xaf, 0x185, 0x2bf, 0x134, 0x1f, 0x1c5, 0x3e1, 0x23e, 0x168, 0x3ad, 0x3df, 0x1b4, 0x2a3, 0x3d8, 0x10f, 0x2e7, 0x114, 0xb0, 0x40, 0x1c9, 0x2b5, 0x3a9, 0x9a, 0x1f, 0x38a, 0x39f, 0x1d4, 0x2ad, 0x155, 0x215, 0x386, 0x2e1, 0x297, 0x165, 0x3e4, 0x291, 0x1da, 0x41, 0x375, 0x286, 0x3, 0x25b, 0x3d6, 0xf2, 0x1ae, 0x21, 0x97, 0xa8, 0x27c, 0x3fe, 0x3ff, 0x236, 0x83, 0x32a, 0x3b0, 0x3af, 0x25, 0x3ba, 0x26e, 0xc3, 0x196, 0x383, 0x5, 0x2e4, 0x73, 0x116, 0x2f2, 0x63, 0x1b9, 0x1f8, 0x28d, 0xb, 0x8, 0x253, 0x185, 0x177, 0xd9, 0xf8, 0x6f, 0xc7, 0x2bb, 0x145, 0x2ba, 0x8c, 0xf, 0x325, 0x95, 0x33a, 0x31f, 0xa5, 0x2cb, 0x208, 0x39e, 0x1d, 0x18, 0x2fc, 0x28f, 0x399, 0x16b, 0x108, 0xb1, 0x149, 0x3c4, 0x3cf, 0x3c7, 0x194, 0x11, 0x166, 0x1bf, 0x147, 0x128, 0x1ef, 0x354, 0x211, 0xab, 0x27, 0x28, 0x30d, 0x398, 0xa2, 0x3bd, 0x318, 0x1d3, 0x3db, 0x45, 0x58, 0x40, 0x2bc, 0x33, 0x3aa, 0x2c1, 0x3c9, 0x378, 0x392, 0x2c6, 0x177, 0x1b2, 0x3e0, 0x378, 0x6b, 0x3dd, 0x1f4, 0x3ef, 0x13b, 0x23f, 0x23b, 0x68, 0x362, 0x2b7, 0x76, 0x3ed, 0x216, 0x3ba, 0xd5, 0x30c, 0xab, 0x4e, 0xa0, 0x5e, 0x1fe, 0x6d, 0x2a3, 0x37b, 0xd4, 0x9e, 0x26d, 0x139, 0x112, 0x3be, 0x286, 0x6, 0x17e, 0x28f, 0x33b, 0x1a5, 0x52, 0x302, 0x17a, 0xdc, 0x31, 0x70, 0x293, 0x99, 0x81, 0x170, 0x35e, 0x3a9, 0x134, 0x7c, 0x6f, 0x18e, 0x2fe, 0x23a, 0x3fa, 0x1a4, 0x3c0, 0x1c4, 0xd, 0x16e, 0x3d1, 0x308, 0x2f8, 0x344, 0x175, 0x29f, 0x265, 0x196, 0x30f, 0x14, 0x30d, 0x339, 0x288, 0x1d7, 0x1ec, 0x21e, 0x315, 0x2c8, 0xa6, 0x120, 0x371, 0x356, 0x306, 0x329, 0x3d6, 0x1e4, 0x2b1, 0x108, 0x162, 0x12d, 0x21f, 0x87, 0xe, 0x1d1, 0x92, 0x91, 0x2e, 0x36d, 0xf4, 0x222, 0x20b, 0x38a, 0x337, 0x359, 0x145, 0x17d, 0x230, 0x78, 0x32d, 0x30a, 0x3aa, 0x316, 0xe7, 0x38f, 0x1e5, 0x246, 0x323, 0xa8, 0x1e2, 0x397, 0x207, 0x2ec, 0x92, 0x122, 0xb8, 0x35e, 0x35b, 0xd9, 0x3e0, 0x2f9, 0x1ac, 0x2d7, 0x37f, 0x107, 0x24b, 0x1ff, 0x3f7, 0x194, 0x44, 0x24d, 0x303, 0x1d9, 0x7a, 0x222, 0x1f, 0x233, 0x18e, 0x1f5, 0xfa, 0x3ef, 0x276, 0xee, 0x1fc, 0x289, 0x83, 0xb3, 0x37e, 0x22a, 0x141, 0x255, 0xe1, 0x173, 0x3cb, 0x3a8, 0x145, 0x2fa, 0xd2, 0x3c0, 0x388, 0x34, 0x362, 0x167, 0x1d8, 0x357, 0x128, 0x3b5, 0x125, 0x169, 0x27a, 0x11f, 0x1a9, 0x155, 0x46, 0x1e, 0x11e, 0x284, 0x25f, 0x3ec, 0x308, 0x1f9, 0x10b, 0x3ba, 0x1aa, 0x2b, 0x151, 0xe9, 0x2d, 0x3ad, 0x2c7, 0x1c3, 0x1cb, 0x95, 0xf3, 0x19c, 0x11a, 0x22b, 0x26c, 0x15f, 0x34b, 0x265, 0x32c, 0x27, 0xa0, 0xbc, 0x3f1, 0x368, 0x26a, 0x3a3, 0x165, 0x38b, 0x14a, 0x275, 0x253, 0x33, 0x16f, 0x10c, 0xdf, 0x238, 0x35c, 0x210, 0x302, 0x1e1, 0x1db, 0x5b, 0xfc, 0x226, 0x160, 0x12, 0x1de, 0x356, 0x3, 0x2fc, 0x55, 0x3b1, 0x314, 0x161, 0x241, 0x1ed, 0x239, 0x10f, 0x223, 0x26d, 0xed, 0x104, 0x263, 0x3a0, 0x36, 0x262, 0x1f3, 0x5, 0x30d, 0xff, 0xda, 0x135, 0x3a3, 0x2ca, 0x237, 0x242, 0x311, 0x26c, 0x2be, 0x137, 0x30c, 0x2ac, 0xe9, 0x5a, 0x2af, 0x215, 0xf, 0x11e, 0x101, 0x16e, 0x35f, 0xec, 0x357, 0x250, 0x2cf, 0x13a, 0x2bd, 0x3cb, 0x359, 0x11d, 0x3fd, 0x13b, 0xee, 0x3f8, 0x236, 0x11, 0x322, 0x303, 0x3b2, 0x1e8, 0x134, 0x1f0, 0x2f9, 0x358, 0x34e, 0x3ce, 0x54, 0x1e2, 0x327, 0xe, 0x34d, 0x132, 0x1, 0x253, 0x33, 0x16f, 0x10c, 0xdf, 0x238, 0x35c, 0x210, 0x302, 0x1e1, 0x1db, 0x5b, 0xfc, 0x226, 0x160, 0x12, 0x1de, 0x356, 0x3, 0x2fc, 0x55, 0xaf, 0xcc, 0x36a, 0xe4, 0x3d6, 0x33b, 0x133, 0xad, 0x192, 0x2f2, 0x239, 0x21e, 0x9e, 0x34c, 0x2cb, 0xc8, 0x1d6, 0x3d4, 0x265, 0xab, 0x270, 0x5a, 0x157, 0x46, 0x78, 0x1c4, 0x68, 0x326, 0xb3, 0x1e3, 0x2e8, 0xf4, 0x134, 0x3e0, 0x3f6, 0x2f6, 0x85, 0x12e, 0x12d, 0xdc, 0x188, 0x3f, 0x113, 0x160, 0x24, 0x371, 0x286, 0x30, 0x32f, 0x16d, 0x346, 0x2e4, 0x339, 0x6d, 0x135, 0x34f, 0x33a, 0x19c, 0x61, 0x2f8, 0x216, 0x1ef, 0x125, 0x1ad, 0x3e1, 0x359, 0x23a, 0x3ef, 0x1ca, 0x2fb, 0x3e7, 0xbb, 0x92, 0x81, 0x392, 0x21d, 0x16f, 0x218, 0x37c, 0x1e4, 0x1a5, 0x290, 0x130, 0x15c, 0xc6, 0x345, 0x315, 0x26d, 0x1da, 0x19, 0x33c, 0x27e, 0x2c9, 0x196, 0x4e, 0x109, 0x3ad, 0x30e, 0xf, 0x23c, 0xd, 0x362, 0x195, 0x1bf, 0x5d, 0x21a, 0x222, 0x7c, 0x378, 0x358, 0x295, 0x323, 0x2a0, 0x21f, 0x15e, 0x330, 0x366, 0x25b, 0x22e, 0x36b, 0x96, 0x73, 0x288, 0x14f, 0x3a3, 0x33a, 0x338, 0x184, 0x3ed, 0x128, 0x197, 0x1c2, 0x31d, 0x231, 0x2d7, 0x3ce, 0x150, 0x21f, 0x62, 0x21b, 0x113, 0x2c0, 0x90, 0x3be, 0x3a, 0x209, 0x262, 0x3c5, 0x50, 0x2f0, 0x2c7, 0x203, 0x23c, 0x1a, 0x193, 0xb3, 0x3c6, 0x3b2, 0x3a9, 0x364, 0xe7, 0x47, 0x1ae, 0x29, 0x26, 0x57, 0x63, 0x345, 0x223, 0x1a6, 0x2cb, 0x190, 0x351, 0x29f, 0x211, 0x14d, 0x11f, 0x153, 0x1fd, 0x13b, 0x3b8, 0x3f7, 0xbb, 0x124, 0x204, 0xaf, 0x198, 0x1b3, 0x329, 0x117, 0x3b1, 0x4b, 0x23d, 0x144, 0x2a3, 0x3d5, 0x19d, 0x19c, 0xc2, 0x3f2, 0x94, 0x2cf, 0xe1, 0x38a, 0x31c, 0x36f, 0x1e7, 0xa8, 0x30b, 0x31, 0x309, 0x28d, 0x160, 0x48, 0x1df, 0x1d, 0x300, 0x131, 0x3e6, 0x28, 0x178, 0x367, 0x305, 0x11e, 0xd, 0x2cd, 0x25d, 0x1e3, 0x2bc, 0xdb, 0x306, 0x1f1, 0x159, 0x346, 0x382, 0x3fc, 0x376, 0x325, 0x101, 0x362, 0x25d, 0x3c6, 0x36d, 0x2bf, 0x316, 0x26b, 0xf2, 0x34a, 0xad, 0x241, 0x373, 0x37b, 0x2b6, 0x67, 0x61, 0x3f2, 0x128, 0x32e, 0x301, 0xde, 0x358, 0x246, 0x25c, 0x17a, 0x3b6, 0x1b9, 0x2e7, 0x332, 0x3b4, 0xc8, 0x351, 0x137, 0x56, 0x27a, 0x1d4, 0x23a, 0x3a7, 0x9f, 0x397, 0x38, 0x16a, 0x2c, 0x12, 0x2eb, 0x1d, 0x209, 0xcd, 0x30f, 0x280, 0x353, 0x46, 0x1e0, 0x7f, 0x236, 0x88, 0x122, 0x392, 0x66, 0x2dd, 0x329, 0x22e, 0x2df, 0x258, 0x398, 0xda, 0x1ba, 0x12a, 0x25f, 0x2b7, 0x2db, 0xba, 0xf4, 0xd9, 0x277, 0x47, 0x35c, 0xa4, 0x130, 0x179, 0x7b, 0xd4, 0x3e4, 0x121, 0x5f, 0x10b, 0x3de, 0x13a, 0x1c5, 0x31c, 0x2d7, 0x395, 0x149, 0xdc, 0x229, 0x3f0, 0x59, 0x298, 0x104, 0x33c, 0x1ea, 0xc3, 0x151, 0x171, 0x36c, 0x6, 0x32f, 0x37a, 0x14, 0x2f0, 0x30e, 0x78, 0x23b, 0x236, 0x110, 0x81, 0xaf, 0x269, 0x306, 0x3e2, 0x16d, 0x206, 0x5e, 0x367, 0xf, 0x1c4, 0x340, 0x22, 0x91, 0x392, 0xcc, 0x366, 0x17e, 0x2a8, 0x346, 0x30d, 0x3eb, 0x386, 0x23c, 0x68, 0x106, 0x93, 0x170, 0x21d, 0x36a, 0x329, 0x55, 0x36e, 0x2e4, 0x1fe, 0x376, 0x243, 0xd, 0x326, 0x191, 0x2e, 0x2c6, 0x16f, 0xe4, 0x28f, 0x36b, 0x258, 0x339, 0x368, 0x1cb, 0x284, 0x362, 0xb3, 0x303, 0x35e, 0x3aa, 0x218, 0x3d6, 0x1ee, 0x4b, 0xe6, 0x6d, 0x1ba, 0x254, 0x16e, 0x195, 0x1e3, 0x36d, 0x177, 0x43, 0x37c, 0x33b, 0x18a, 0x31a, 0x288, 0x135, 0x24e, 0x32b, 0x2b7, 0x1bf, 0x2e8, 0x3a9, 0x18b, 0x26b, 0x1e4, 0x133, 0x161, 0x51, 0x2a3, 0x34f, 0x1e6, 0x3d1, 0x3b0, 0x5d, 0xf4, 0x1b2, 0x1ce, 0x238, 0x1a5, 0xad, 0x8b, 0x1d7, 0x2e2, 0x1ab, 0x30, 0x29c, 0x383, 0x109, 0x2ae, 0xd2, 0x1dc, 0x3c7, 0x34d, 0x201, 0x9, 0x1df, 0xe8, 0x1b0, 0x251, 0x3a4, 0x153, 0x3f3, 0x24b, 0x327, 0x1c0, 0x113, 0x22d, 0x41, 0x33c, 0x3a1, 0x2b, 0xfd, 0x2bb, 0x3d9, 0x54, 0x37, 0x229, 0x3db, 0x199, 0x361, 0x249, 0x2ea, 0x296, 0x173, 0x31c, 0x34e, 0x12e, 0x2f4, 0x18f, 0x345, 0x13c, 0x14a, 0x5f, 0x25, 0x197, 0x20b, 0x2f9, 0x3ca, 0x108, 0x4c, 0x179, 0x1ec, 0x15b, 0xce, 0x308, 0x2a7, 0x10d, 0x134, 0x277, 0x11c, 0x1a5, 0x15a, 0x22c, 0x2a3, 0x297, 0x391, 0x2b7, 0x37e, 0x3b2, 0x177, 0x86, 0x1eb, 0x1ee, 0x96, 0x398, 0x368, 0x396, 0x202, 0x326, 0x322, 0xb8, 0x21d, 0x2dd, 0xbf, 0x2a8, 0x285, 0x2f, 0x367, 0x1e, 0x319, 0x236, 0x220, 0x204, 0x171, 0x2d1, 0x18, 0x14e, 0x3c5, 0x280, 0x157, 0x69, 0xee, 0x3e7, 0x3a2, 0x304, 0x200, 0x1cd, 0x2a5, 0x180, 0x19a, 0x9c, 0x2d0, 0x1fd, 0x394, 0x397, 0x1c0, 0x226, 0xa6, 0x208, 0x3ac, 0xd5, 0x2d2, 0x267, 0x2d7, 0x97, 0x2f4, 0x31e, 0x10f, 0x1f2, 0x8d, 0x3f2, 0x152, 0x222, 0x39b, 0x8e, 0x1a5, 0x2b4, 0xa2, 0x135, 0x12a, 0x2dc, 0xb3, 0x17, 0x185, 0x36a, 0xbf, 0x159, 0x206, 0x178, 0x215, 0x3c0, 0x3f9, 0x176, 0xc1, 0x100, 0x2eb, 0xe8, 0x360, 0x156, 0x11f, 0x11d, 0x287, 0x3c4, 0xc4, 0x3f0, 0x2c8, 0x361, 0x9b, 0x3ba, 0x9d, 0x31d, 0x358, 0x214, 0x20d, 0x15c, 0xf6, 0x15b, 0x19c, 0x3b, 0x115, 0xf4, 0x2c1, 0xdf, 0x33b, 0x221, 0x1cc, 0x368, 0x325, 0x1a, 0x106, 0x24c, 0x32d, 0x269, 0x3, 0x257, 0x3e6, 0x280, 0x2ae, 0x1a4, 0x379, 0x207, 0xb5, 0xb0, 0x240, 0x263, 0x1ea, 0x211, 0xfd, 0x17f, 0x37f, 0x2a0, 0x370, 0x1b9, 0x315, 0x12b, 0x311, 0x216, 0x197, 0x1f, 0x3f6, 0x39a, 0x286, 0x1b, 0x196, 0x3a4, 0x145, 0x347, 0x3c4, 0x188, 0x3db, 0x26d, 0x275, 0x344, 0x363, 0x20b, 0x3f6, 0xd7, 0x290, 0x8b, 0x2a3, 0x24e, 0x16e, 0xb3, 0x2e, 0x21d, 0x366, 0x3e2, 0x37a, 0xa0, 0x157, 0x1a4, 0x2fb, 0xe, 0x1a1, 0x312, 0x82, 0x1d6, 0xd5, 0x1ad, 0x18e, 0x295, 0x162, 0x22f, 0x239, 0x2a9, 0x19c, 0x76, 0x5d, 0x3a9, 0x43, 0x3d6, 0x36b, 0x2e4, 0x3eb, 0xf, 0x23b, 0x194, 0x99, 0x40, 0x371, 0xe8, 0x2c9, 0x151, 0xea, 0x1f4, 0x54, 0xdc, 0x2d8, 0x315, 0x256, 0x5f, 0x94, 0x146, 0x3e0, 0x47, 0x1a5, 0x161, 0x288, 0x1ba, 0x284, 0x326, 0x93, 0x392, 0x269, 0x6, 0x14e, 0x30f, 0x5a, 0x17d, 0x1ca, 0x397, 0x380, 0x8a, 0x139, 0xc8, 0x175, 0x125, 0x38a, 0x358, 0x21, 0x26, 0x2f2, 0x37b, 0x33a, 0x3d1, 0x1bf, 0x36d, 0x3aa, 0xe4, 0x55, 0x346, 0x5e, 0x30e, 0x3c0, 0x33d, 0x20a, 0xd8, 0x156, 0x75, 0x1f4, 0xa8, 0x370, 0x2ed, 0x13c, 0x242, 0x3ed, 0x282, 0xd9, 0x26b, 0x27f, 0x12c, 0x1fe, 0x305, 0x319, 0x194, 0x132, 0x100, 0x3be, 0x29b, 0x186, 0xfd, 0x1f5, 0x395, 0x17a, 0x235, 0x6a, 0x237, 0x219, 0x22a, 0x3a9, 0x86, 0x343, 0x36e, 0x213, 0x187, 0x3c0, 0x3ff, 0x34d, 0x2c, 0x240, 0x19e, 0x29f, 0x169, 0xc7, 0x295, 0x2c4, 0xae, 0x1ec, 0x2ca, 0x3ec, 0x1bf, 0x2d3, 0x2b3, 0x329, 0x159, 0xa, 0x3ad, 0x69, 0x379, 0xe, 0x342, 0x53, 0x19, 0x15f, 0x296, 0x38a, 0x2b9, 0x84, 0x130, 0x373, 0x3a3, 0x32b, 0x32a, 0x17, 0x21d, 0x2c5, 0x393, 0x3e6, 0x212, 0x2ba, 0x1ca, 0x327, 0x21b, 0x59, 0x3b4, 0x136, 0x1ef, 0x384, 0x1fb, 0xd7, 0x129, 0x22c, 0x135, 0xa1, 0x193, 0x93, 0x32d, 0x1b6, 0x30, 0xcd, 0x138, 0x2ad, 0x3d7, 0x1e2, 0x188, 0x3bf, 0x1a6, 0x38c, 0x273, 0x3a, 0x2c9, 0x14d, 0x2bb, 0x1e7, 0xbd, 0x235, 0xd4, 0xce, 0xec, 0x2e8, 0x1d5, 0x1c8, 0x2a8, 0xa, 0x353, 0x1a4, 0x3fe, 0xe0, 0x8a, 0xed, 0x9b, 0x1ef, 0x301, 0x3e5, 0x2b1, 0x2b4, 0x119, 0x1cb, 0x34, 0x44, 0x1, 0x273, 0x3a, 0x2c9, 0x14d, 0x2bb, 0x1e7, 0xbd, 0x235, 0xd4, 0xce, 0xec, 0x2e8, 0x1d5, 0x1c8, 0x2a8, 0xa, 0x353, 0x1a4, 0x3fe, 0xe0, 0x8a, 0xed, 0x9b, 0x1ef, 0x301, 0x3e5, 0x2b1, 0x2b4, 0x119, 0x1cb, 0x34, 0x44, 0x1, 0x273, 0x3a, 0x2c9, 0x14d, 0x2bb, 0x1e7, 0xbd, 0x235, 0xd4, 0xce, 0xec, 0x2e8, 0x1d5, 0x1c8, 0x2a8, 0xa, 0x353, 0x1a4, 0x3fe, 0xe0, 0x8a, 0xed, 0x9b, 0x1ef, 0x301, 0x3e5, 0x2b1, 0x2b4, 0x119, 0x1cb, 0x34, 0x44, 0x1, 0x273, 0x3a, 0x2c9, 0x14d, 0x2bb, 0x1e7, 0xbd, 0x235, 0xd4, 0xce, 0xec, 0x2e8, 0x1d5, 0x1c8, 0x2a8, 0xef, 0xe8, 0x265, 0xfd, 0x3dd, 0x12e, 0x22f, 0x1ec, 0x33a, 0x2b7, 0x303, 0x21d, 0x306, 0x14e, 0x4e, 0x2ad, 0x347, 0x21f, 0x2d8, 0x9e, 0x8d, 0x357, 0xf4, 0x43, 0x28f, 0x346, 0x2f0, 0x230, 0x2fb, 0x70, 0x8a, 0x1da, 0x26c, 0x363, 0x7c, 0x47, 0x133, 0xe6, 0x376, 0x1c4, 0x194, 0xc1, 0x24, 0x263, 0x29f, 0x1ad, 0x6b, 0x21, 0x130, 0x1d7, 0x24e, 0x362, 0x93, 0xaf, 0x356, 0x1b, 0xab, 0xea, 0x3bb, 0x12d, 0x31e, 0xd4, 0x19c, 0x3b0, 0x36d, 0x16f, 0x17e, 0x37a, 0x109, 0x17d, 0x24b, 0x31, 0x3db, 0x34c, 0x5f, 0xa9, 0x134, 0x26b, 0x1ee, 0x2e4, 0x367, 0x3c0, 0x3e7, 0xb5, 0x312, 0x19, 0x175, 0x13a, 0x378, 0xd7, 0xad, 0x288, 0x1cb, 0x68, 0x110, 0x8, 0x371, 0x349, 0x30c, 0x3e1, 0x2d7, 0x162, 0x15c, 0x37b, 0x1e6, 0x195, 0x2e, 0xcc, 0x6, 0x262, 0x270, 0x145, 0x20e, 0xdc, 0x1de, 0x3a0, 0x30c, 0x3cb, 0x34e, 0x302, 0x1ed, 0x3a3, 0x16e, 0x322, 0x253, 0x356, 0x36, 0x2ac, 0x359, 0x3ce, 0x1e1, 0x239, 0x2ca, 0x35f, 0x303, 0x33, 0x3, 0x262, 0xe9, 0x11d, 0x54, 0x1db, 0x10f, 0x237, 0xec, 0x3b2, 0x16f, 0x2fc, 0x1f3, 0x5a, 0x3fd, 0x1e2, 0x5b, 0x223, 0x242, 0x357, 0x1e8, 0x10c, 0x55, 0x5, 0x2af, 0x13b, 0x327, 0xfc, 0x26d, 0x311, 0x250, 0x134, 0xdf, 0x3b1, 0x30d, 0x215, 0xee, 0xe, 0x226, 0xed, 0x26c, 0x2cf, 0x1f0, 0x238, 0x314, 0xff, 0xf, 0x3f8, 0x34d, 0x160, 0x104, 0x2be, 0x13a, 0x2f9, 0x35c, 0x161, 0xda, 0x11e, 0x236, 0x132, 0x12, 0x263, 0x137, 0x2bd, 0x358, 0x210, 0x241, 0x135, 0x101, 0x11, 0x1, 0x1de, 0x3a0, 0x30c, 0x3cb, 0x34e, 0x302, 0x1ed, 0x3a3, 0x16e, 0x322, 0x253, 0x356, 0x36, 0x2ac, 0x359, 0x3ce, 0x1e1, 0x239, 0x2ca, 0x35f, 0x303, 0x3bc, 0x29b, 0x56, 0xc7, 0x10a, 0x130, 0x355, 0xa1, 0x106, 0x204, 0x1de, 0x349, 0x2b, 0x267, 0x85, 0x98, 0x3ae, 0x254, 0x83, 0x102, 0xef, 0x3a0, 0x211, 0x337, 0x246, 0x4c, 0x1d7, 0x12a, 0x245, 0x81, 0x273, 0x1d0, 0x30c, 0x39f, 0x123, 0x26, 0x2ef, 0x95, 0x326, 0x244, 0x33d, 0xe8, 0x186, 0x3cb, 0x295, 0x13, 0x373, 0x24e, 0x193, 0x122, 0x39a, 0x74, 0xc3, 0x3e1, 0x34e, 0x20d, 0x3bd, 0x127, 0x2cd, 0x91, 0x1cd, 0x3a, 0x265, 0x3f4, 0x1a7, 0x302, 0x3da, 0x297, 0x362, 0x24c, 0x2e2, 0x1d, 0x336, 0x1fa, 0x2d7, 0x181, 0x1ed, 0x34f, 0x1b1, 0x126, 0x171, 0x20a, 0x19b, 0xfd, 0x36f, 0x2c4, 0x2f2, 0x3a3, 0x2dc, 0x93, 0x2bc, 0x105, 0x2c9, 0x27a, 0x3b3, 0x162, 0x179, 0x3d5, 0x16e, 0x24d, 0x15e, 0x286, 0x360, 0x13d, 0x3dd, 0xb1, 0x2b8, 0x3ee, 0xb7, 0x322, 0xaf, 0x143, 0x1b0, 0x29a, 0x371, 0x27e, 0x2b0, 0x6b, 0x108, 0x8b, 0x1ba, 0x68, 0x92, 0x200, 0x263, 0xd5, 0x38a, 0x39d, 0xad, 0x6d, 0x23c, 0x194, 0x201, 0x112, 0x2ab, 0x13a, 0x3f6, 0x1a5, 0xe6, 0x386, 0x1fc, 0x293, 0x312, 0xc8, 0x1ef, 0x7c, 0x238, 0x4b, 0x3eb, 0x3c0, 0x307, 0x113, 0x1da, 0x344, 0x146, 0x1ce, 0x1ee, 0x30d, 0x46, 0x2fb, 0x380, 0x2c8, 0x38c, 0xa9, 0x1b2, 0x3d6, 0x346, 0x3ad, 0x13b, 0x87, 0x3db, 0x256, 0x3ed, 0xf4, 0x218, 0x2a8, 0xa0, 0x17d, 0x27c, 0x5b, 0x9e, 0x61, 0x5d, 0x3aa, 0x17e, 0x3e6, 0x2d0, 0x347, 0xdc, 0x345, 0x237, 0x3b0, 0x35e, 0x366, 0x14e, 0x270, 0x23a, 0x2a0, 0x31e, 0x2a9, 0x3d1, 0x303, 0xcc, 0x30, 0x196, 0xea, 0x1e7, 0x3c2, 0x1ec, 0x1e6, 0xb3, 0x392, 0x356, 0xd8, 0x29a, 0x3dd, 0x162, 0x2f2, 0x34f, 0x362, 0x91, 0x39a, 0xe8, 0x30c, 0x337, 0x85, 0x130, 0x2a3, 0x2eb, 0x1ea, 0x1ad, 0x2b9, 0x148, 0x288, 0x8f, 0xca, 0x201, 0x224, 0x2be, 0x1c2, 0x317, 0xc5, 0x1fe, 0xf0, 0x387, 0x113, 0x3b4, 0x10b, 0x222, 0xdf, 0x1b7, 0x2f0, 0x348, 0x247, 0x3db, 0xa5, 0x3af, 0x3a9, 0x1c8, 0x1bd, 0x5a, 0x3d7, 0x6e, 0x345, 0x67, 0x2db, 0x2c6, 0x205, 0x19a, 0x11f, 0x37f, 0x1e1, 0x1ec, 0x3cc, 0x2cc, 0xaf, 0x105, 0x336, 0x3e1, 0x123, 0x98, 0x2a3, 0x101, 0x88, 0x40, 0x39e, 0x26e, 0x38a, 0x333, 0x2b4, 0x368, 0x388, 0x2ec, 0x160, 0x32, 0x2f3, 0x7c, 0x79, 0x12c, 0x367, 0x77, 0x38, 0x59, 0xe3, 0x250, 0x1b2, 0x3a5, 0x103, 0x157, 0x394, 0xc4, 0x315, 0x11a, 0x22a, 0x3aa, 0x2fc, 0x383, 0x2ad, 0x15, 0x3b6, 0xd4, 0x1f6, 0x385, 0xcc, 0x60, 0x251, 0x359, 0x24f, 0xae, 0x3ee, 0x2dc, 0x24c, 0x39a, 0x1d0, 0x2b, 0x18e, 0x42, 0x241, 0x1ba, 0xd0, 0x248, 0x24, 0x1df, 0x3a1, 0x173, 0x3ca, 0x15a, 0x368, 0x319, 0x3a2, 0x312, 0x320, 0x2cf, 0x33f, 0xf7, 0x213, 0x230, 0x3cf, 0x3f0, 0x256, 0x3af, 0x35b, 0x329, 0x1f3, 0x1a9, 0x20e, 0x3b6, 0x1a8, 0x3d1, 0x17, 0xdb, 0x1b, 0x14d, 0x3b3, 0x302, 0x2ef, 0xa1, 0x22, 0x20, 0x39e, 0xd5, 0x233, 0x1ae, 0x31a, 0x1c3, 0x3f8, 0xb5, 0x298, 0xd1, 0x146, 0x331, 0x2df, 0x2f0, 0x299, 0x10e, 0x2e7, 0x242, 0x115, 0x3aa, 0x1f1, 0x217, 0x145, 0x150, 0x235, 0x165, 0x2ce, 0x2e0, 0x356, 0x360, 0x1fa, 0x295, 0x98, 0x14f, 0xd, 0x49, 0x9, 0x33c, 0x296, 0x2f9, 0x1a5, 0x398, 0x1e, 0x3e7, 0x28d, 0x3b4, 0x216, 0x9a, 0x2f1, 0x346, 0x2af, 0x394, 0x188, 0x4f, 0xc2, 0x2e8, 0x1b5, 0x257, 0x270, 0xfa, 0x25a, 0x239, 0xf3, 0x166, 0xaf, 0x20a, 0xc3, 0x337, 0x214, 0x324, 0x1ba, 0x1a0, 0x132, 0x120, 0x351, 0x274, 0x38f, 0x3be, 0x29f, 0x38a, 0xd7, 0x31a, 0x386, 0x3fb, 0x1a1, 0x1da, 0x216, 0x134, 0x3d6, 0x206, 0x2aa, 0x27c, 0x2d8, 0x3c1, 0x3b0, 0x2c6, 0x6, 0x196, 0x359, 0x12e, 0x2f2, 0x24e, 0x106, 0x8, 0x1cf, 0xd5, 0x6f, 0x2b1, 0xe6, 0xf, 0x3e7, 0x113, 0x2cb, 0x94, 0x1b2, 0x28f, 0x14, 0x17d, 0x3c4, 0x2ed, 0x237, 0x1bf, 0x21d, 0x30, 0xab, 0x2fe, 0x162, 0x3bd, 0x254, 0x22, 0x40, 0x263, 0x2a1, 0x378, 0x1a5, 0x339, 0x78, 0x307, 0x8a, 0x275, 0xa9, 0x18b, 0x55, 0xa0, 0x3fa, 0x21f, 0x345, 0x19c, 0x1e3, 0xcc, 0x180, 0x151, 0x3dd, 0x302, 0x1d7, 0x284, 0x110, 0x200, 0x33c, 0x125, 0x3f6, 0x133, 0x1fe, 0x3c0, 0xe, 0x59, 0x38c, 0x141, 0x43, 0x2a8, 0x109, 0x3ef, 0xdc, 0x21e, 0xfb, 0x303, 0x269, 0x1b, 0x29a, 0x2d7, 0x26, 0x2a3, 0xd, 0x92, 0x24, 0x1d6, 0x13a, 0x38f, 0x18a, 0x3eb, 0x23f, 0x375, 0x26e, 0x6f, 0x16b, 0x398, 0x78, 0x207, 0x228, 0x38c, 0x282, 0x10c, 0x16d, 0xb4, 0x107, 0x365, 0x15b, 0x2ce, 0x392, 0x105, 0x186, 0x18e, 0x210, 0x144, 0x23c, 0x176, 0x189, 0x249, 0x255, 0x331, 0x36e, 0x353, 0x321, 0x5b, 0x1f2, 0x1d8, 0x2c6, 0xc, 0x251, 0x2fe, 0x2c4, 0x2ef, 0x284, 0x220, 0x12, 0x1d6, 0x274, 0x227, 0x4b, 0x2c7, 0x379, 0x3f, 0x291, 0x3af, 0x177, 0x2fc, 0x27, 0x23a, 0x25a, 0xf6, 0x32b, 0x126, 0x273, 0x27e, 0x35a, 0x3ca, 0x161, 0x2e5, 0x3f9, 0x1a1, 0x3b4, 0x4a, 0x1b2, 0x117, 0x50, 0x3fa, 0x37, 0x10f, 0xfb, 0x20f, 0x1b6, 0xd8, 0x1fa, 0x246, 0x192, 0x374, 0x11b, 0x201, 0x104, 0x2f3, 0x3e0, 0x27f, 0x2f, 0x1a4, 0x10e, 0x38e, 0x61, 0x1d9, 0x1b3, 0x262, 0x23e, 0x395, 0x15c, 0x297, 0x83, 0x8, 0x39e, 0x354, 0x378, 0x34a, 0xff, 0x3c0, 0x1c, 0x164, 0x5f, 0x2e3, 0x1aa, 0x378, 0x29d, 0x3fc, 0x23f, 0x1c0, 0xd3, 0x3ed, 0x2bf, 0x2fc, 0x4e, 0xfa, 0x2f4, 0x37b, 0x1b1, 0x102, 0x3be, 0x26e, 0xde, 0x1a5, 0xff, 0x389, 0x70, 0x332, 0x1f9, 0x3a9, 0xbf, 0x217, 0x23a, 0xbd, 0x3d8, 0x16e, 0x244, 0x2eb, 0x29f, 0x233, 0x16b, 0x339, 0x1e0, 0x1c, 0x2c8, 0x17c, 0x1e8, 0x329, 0x383, 0x28a, 0x12d, 0xf6, 0x25f, 0x91, 0x3bc, 0x3a1, 0x38a, 0x35c, 0x1cc, 0x78, 0x7, 0xb2, 0x5f, 0x7a, 0x1c8, 0x3e6, 0x2a6, 0x149, 0x239, 0x391, 0x126, 0xef, 0x1ea, 0x2e6, 0xd7, 0x73, 0x1e, 0x307, 0x228, 0x311, 0x21a, 0x72, 0x2fd, 0x2ad, 0x150, 0x18c, 0x1e6, 0x24d, 0x33d, 0x27e, 0x2bd, 0x333, 0x31a, 0x203, 0x3c7, 0x8a, 0x1c6, 0x282, 0x218, 0x1bd, 0x1a9, 0x54, 0x63, 0x27d, 0x191, 0x1cd, 0x29b, 0x1ad, 0x3ca, 0x2c2, 0x386, 0x3f7, 0x226, 0x275, 0x2a4, 0x86, 0x16d, 0x1cf, 0x2a1, 0x3f6, 0x18a, 0x367, 0x2fb, 0x1f8, 0x294, 0x5d, 0x36a, 0x262, 0xea, 0x12e, 0x3bd, 0x284, 0x92, 0x120, 0x175, 0x7c, 0x33b, 0x5e, 0x13b, 0x188, 0xf9, 0x3b0, 0x21d, 0x180, 0x29a, 0x295, 0x192, 0x1cb, 0x194, 0x160, 0x249, 0x146, 0x37c, 0x206, 0x17d, 0x21f, 0x21e, 0x3d1, 0x170, 0x286, 0x30c, 0x6b, 0x290, 0x368, 0x1fc, 0x1a1, 0x2cb, 0xa9, 0x43, 0x16d, 0x2d0, 0x54, 0xc6, 0x1e6, 0x93, 0xef, 0x3d4, 0x38a, 0x2b1, 0x339, 0x3c0, 0x70, 0x26d, 0x3ed, 0x177, 0x3e2, 0x270, 0x3bb, 0x22f, 0x34f, 0x106, 0x40, 0x33c, 0x13a, 0x47, 0x258, 0x46, 0x397, 0x2e7, 0x61, 0x36d, 0x306, 0x196, 0x2fe, 0x302, 0x2a3, 0x68, 0xc1, 0x82, 0x1ef, 0x33f, 0x36b, 0x3ad, 0x24b, 0x2d8, 0x237, 0x1e3, 0x269, 0xd8, 0x3e1, 0x21, 0x51, 0x23c, 0x1d1, 0xa6, 0x344, 0x134, 0x28f, 0xa0, 0x3ef, 0x2e9, 0x39e, 0x296, 0x38f, 0x96, 0x23, 0x397, 0x1c7, 0x184, 0x35e, 0xc, 0x2ac, 0x2d7, 0x260, 0x2e1, 0x194, 0x2c0, 0x136, 0x222, 0x3a5, 0x50, 0x3ef, 0x1db, 0x2b6, 0xb3, 0x2e2, 0x13f, 0x173, 0x1ae, 0x398, 0x3c0, 0xe0, 0x1a6, 0x357, 0x35d, 0xa7, 0x11f, 0x24f, 0x3da, 0x284, 0x124, 0x89, 0x3ba, 0x3c9, 0x3b1, 0x3ad, 0x9f, 0x372, 0x19c, 0x20f, 0x1ab, 0x265, 0x31c, 0x148, 0x368, 0x3f8, 0x28d, 0x275, 0x282, 0x72, 0x3e6, 0x28a, 0xbd, 0x37b, 0x2cd, 0x4, 0x263, 0x24a, 0x227, 0x258, 0x8c, 0x247, 0x315, 0x219, 0x163, 0x30, 0x2a2, 0x34e, 0x192, 0x396, 0x259, 0x312, 0xd1, 0x9a, 0x28f, 0x140, 0x3a7, 0x365, 0x2ca, 0x2cc, 0x39a, 0xf5, 0x1c5, 0x2b1, 0x27b, 0x31b, 0x380, 0x291, 0x147, 0x16f, 0x29c, 0x75, 0x12e, 0x373, 0x202, 0x99, 0x224, 0x2f3, 0x33f, 0x2df, 0x2af, 0x27c, 0x1d3, 0x279, 0x2e, 0x335, 0x24a, 0x47, 0x172, 0x69, 0x31, 0x278, 0x369, 0xcc, 0x6c, 0x3cb, 0x108, 0x232, 0x7f, 0x1a1, 0x33e, 0x282, 0xe4, 0x383, 0x7d, 0x3c2, 0x3a3, 0x20c, 0x200, 0x351, 0x1f, 0x33b, 0x178, 0x394, 0x2d8, 0xce, 0x20f, 0x356, 0x186, 0xd6, 0xad, 0x1c3, 0x3c7, 0x59, 0x17c, 0x35b, 0x3e2, 0x1d2, 0x3ce, 0x2f2, 0x142, 0x124, 0x112, 0x2f3, 0x277, 0x36e, 0x155, 0x381, 0x21e, 0x35f, 0x32d, 0xe8, 0x2d2, 0x333, 0xe6, 0x1e0, 0xe0, 0x34c, 0x147, 0x2de, 0x262, 0x3a8, 0x2c4, 0x2a3, 0x1a0, 0xb, 0xc8, 0xa3, 0x2f1, 0x14, 0x3f3, 0x1db, 0x165, 0x2cc, 0x33d, 0x3d4, 0x233, 0x34a, 0x3eb, 0x379, 0x3f0, 0x8d, 0x3b2, 0x205, 0xab, 0x36f, 0x260, 0x1cb, 0x259, 0x22d, 0x344, 0xd9, 0xaa, 0x5a, 0x2a, 0x18c, 0x32b, 0x244, 0x375, 0x2a1, 0x3c3, 0x96, 0x46, 0x247, 0x223, 0x76, 0x30a, 0x300, 0xfd, 0x263, 0x13a, 0x238, 0x30d, 0x13b, 0x5b, 0x237, 0x303, 0x356, 0x30c, 0x358, 0x161, 0xf, 0xe, 0x26d, 0x357, 0x16f, 0x262, 0x359, 0x302, 0x135, 0x236, 0x160, 0x26c, 0x134, 0x55, 0x5a, 0x54, 0x239, 0x16e, 0x1, 0x263, 0x13a, 0x238, 0x30d, 0x13b, 0x5b, 0x237, 0x303, 0x356, 0x30c, 0x358, 0x161, 0xf, 0xe, 0x26d, 0x357, 0x16f, 0x262, 0x359, 0x302, 0x135, 0x236, 0x160, 0x26c, 0x134, 0x55, 0x5a, 0x54, 0x239, 0x16e, 0x1, 0x263, 0x13a, 0x238, 0x30d, 0x13b, 0x5b, 0x237, 0x303, 0x356, 0x30c, 0x358, 0x161, 0xf, 0xe, 0x26d, 0x357, 0x16f, 0x262, 0x359, 0x302, 0x135, 0x236, 0x160, 0x26c, 0x134, 0x55, 0x5a, 0x54, 0x239, 0x16e, 0x1, 0x263, 0x13a, 0x238, 0x30d, 0x13b, 0x5b, 0x237, 0x303, 0x356, 0x30c, 0x358, 0x161, 0xf, 0xe, 0x26d, 0x357, 0x16f, 0x262, 0x359, 0x302, 0x135, 0xcf, 0xe1, 0x1e4, 0xbc, 0x321, 0x2ed, 0x1f6, 0x1c9, 0xe8, 0x35a, 0x35c, 0x1fe, 0x3b8, 0x3e9, 0x61, 0x2b5, 0xc0, 0xfd, 0x42, 0x232, 0x1fc, 0x226, 0x22b, 0x3a9, 0x3cd, 0x28b, 0x12e, 0x3ae, 0x1a0, 0x2c, 0x9b, 0x9a, 0x55, 0xb4, 0x150, 0x1ec, 0x2cd, 0x20, 0x1d6, 0x1f, 0xf7, 0x3ad, 0xf1, 0x10f, 0x2b7, 0x15e, 0x13f, 0x38a, 0x34a, 0x3b7, 0x3f5, 0x1c7, 0x3b, 0x21d, 0x36, 0x39f, 0x52, 0x2d9, 0x3f7, 0x59, 0x1f9, 0x1d5, 0x14e, 0x1d4, 0x181, 0x135, 0x65, 0x189, 0x344, 0x364, 0x2b2, 0x2ad, 0x25a, 0x1f7, 0x106, 0x9, 0x2be, 0x3e0, 0x2df, 0x155, 0x21f, 0x1a8, 0x25d, 0x39a, 0x3a1, 0x1bc, 0x18a, 0x215, 0x247, 0x9e, 0x369, 0x330, 0x2c9, 0x31c, 0x252, 0x386, 0x207, 0x332, 0x357, 0x2de, 0x19a, 0x2fe, 0x4c, 0x2e1, 0xbb, 0x14c, 0x4a, 0x43, 0x2fd, 0x11d, 0x3c2, 0x297, 0x88, 0x120, 0x19e, 0x384, 0x33b, 0x3d2, 0xf1, 0x21e, 0x2ce, 0x2e2, 0x3d4, 0x1bc, 0x314, 0x46, 0x21c, 0x1f2, 0x1e3, 0x1ab, 0x211, 0x2f6, 0x73, 0x389, 0x3f, 0x242, 0x2d3, 0x30, 0x27a, 0x42, 0x6d, 0x3f9, 0x114, 0x2f8, 0x1d5, 0x29c, 0x359, 0x13, 0x374, 0xbb, 0x298, 0x128, 0x218, 0x383, 0x3e8, 0x15c, 0x142, 0x132, 0x19, 0xa3, 0x3a5, 0x109, 0x2a, 0x7b, 0x362, 0x20, 0x3ac, 0x7c, 0x3b1, 0x2ae, 0x21f, 0x350, 0x166, 0xef, 0x26e, 0x3e5, 0x258, 0xd2, 0x310, 0x237, 0x17, 0x105, 0x2b0, 0x26f, 0x27b, 0x1dc, 0x3e9, 0xc2, 0x2c6, 0x209, 0x3cb, 0x52, 0x1bb, 0x3c7, 0x2c8, 0x3af, 0x2de, 0x334, 0x3ea, 0x260, 0x243, 0x34d, 0x3b4, 0x141, 0x390, 0x9c, 0x1e7, 0x3da, 0x1a, 0x201, 0x320, 0x4d, 0x55, 0x168, 0x149, 0x37b, 0x83, 0x9, 0x175, 0x39b, 0x2d5, 0x17d, 0x370, 0x2ca, 0x93, 0x1df, 0x14b, 0x47, 0x33c, 0x20b, 0x1ee, 0x157, 0x21f, 0x2a9, 0x191, 0x371, 0x2a1, 0x47, 0x30d, 0x1ca, 0x2ed, 0x3d1, 0xaf, 0x27e, 0x6f, 0x18a, 0x46, 0x31, 0x3c1, 0x303, 0x286, 0x2b0, 0xd7, 0x1fe, 0x2fb, 0x2e7, 0x76, 0xcc, 0x2c9, 0x6b, 0x161, 0x78, 0x380, 0x294, 0x36d, 0x30, 0xfd, 0x108, 0x368, 0x3e7, 0x2c8, 0x357, 0x36a, 0x196, 0x2d7, 0x8b, 0x1c4, 0x1a1, 0x38c, 0x3a9, 0x32f, 0xea, 0x302, 0x1ba, 0xbb, 0x139, 0xa9, 0xe4, 0x4e, 0x1e7, 0x3bd, 0x68, 0x2c, 0x26c, 0x1b2, 0x16d, 0x145, 0x3c2, 0x24e, 0x92, 0x82, 0x32e, 0x3d6, 0x109, 0x54, 0x1ec, 0x326, 0x200, 0x175, 0x33f, 0x346, 0x3fa, 0x365, 0x1e6, 0x81, 0x263, 0x1c2, 0x33b, 0x3ad, 0x3c4, 0xd4, 0xb3, 0xef, 0xd5, 0x38f, 0x2e4, 0x13b, 0x2d8, 0xfb, 0x392, 0x349, 0x38a, 0x133, 0x30e, 0x87, 0xf9, 0x1e3, 0x356, 0x56, 0x39d, 0x339, 0x1dc, 0x271, 0x3e, 0x36b, 0x15d, 0x370, 0x33a, 0x122, 0x335, 0x1c2, 0x27f, 0x2af, 0x21f, 0x15b, 0x24d, 0x3be, 0x24a, 0xf2, 0x2f0, 0xf1, 0x6a, 0xb3, 0x1de, 0x354, 0x47, 0x213, 0x321, 0x345, 0x167, 0x1cd, 0x29f, 0x3e5, 0x172, 0x13b, 0x1b9, 0x3ec, 0xaf, 0xf5, 0x1bc, 0x4b, 0x69, 0x229, 0x19c, 0x2e0, 0x3a0, 0x38a, 0x266, 0x23, 0x31, 0x38b, 0x17, 0x1d, 0x35a, 0x2d6, 0x367, 0x327, 0x278, 0x1e3, 0x2a5, 0x158, 0xd7, 0x3fc, 0x3fe, 0x315, 0x369, 0x1b6, 0x30c, 0x1e5, 0x398, 0x1dc, 0x3bf, 0x3b, 0xcc, 0x19b, 0x1ac, 0x31a, 0x389, 0xfc, 0x61, 0x185, 0x6c, 0x18e, 0x15a, 0x3c, 0x380, 0x121, 0x1af, 0x180, 0x3cb, 0x148, 0x386, 0x1c, 0x12b, 0x2e8, 0xc, 0x27a, 0x108, 0x2d9, 0x387, 0x26d, 0x115, 0x183, 0x151, 0x10a, 0x232, 0x3fb, 0xb2, 0x3af, 0x36a, 0x32c, 0x34e, 0x51, 0x7f, 0x45, 0x2f8, 0xeb, 0xf8, 0x36e, 0x1fd, 0x2c3, 0x32b, 0x4, 0x3ac, 0x3e0, 0x1a3, 0x3fd, 0x31e, 0xb7, 0x10, 0x2ab, 0x39b, 0x285, 0x3ef, 0x63, 0x2dc, 0x40, 0x2be, 0x277, 0x206, 0x3a7, 0x18c, 0x362, 0x100, 0x2ea, 0x1ce, 0xa, 0x287, 0x239, 0x193, 0x9, 0x3ba, 0x331, 0x28, 0x20e, 0xf6, 0x245, 0x24, 0x2f3, 0xdf, 0xa0, 0x2a, 0x3d8, 0x106, 0x90, 0x3de, 0x37c, 0x280, 0xa8, 0x37b, 0x11, 0x240, 0x363, 0x1eb, 0x212, 0x2a0, 0x1f7, 0x44, 0x112, 0x197, 0x3a5, 0x5a, 0x292, 0x3d5, 0x110, 0x41, 0x255, 0x28f, 0x168, 0x25a, 0x34f, 0x49, 0x104, 0x146, 0x22e, 0x1a9, 0x17a, 0x127, 0x124, 0x19, 0x111, 0xaa, 0x2ad, 0x1e1, 0x95, 0x99, 0x64, 0x4d, 0x2a8, 0x2a6, 0x38d, 0x254, 0x264, 0x190, 0x134, 0x2b2, 0x28a, 0x22f, 0x142, 0x182, 0x249, 0xd9, 0x2da, 0x23a, 0xae, 0x101, 0x201, 0x136, 0x364, 0x37a, 0x1d6, 0x3e0, 0x346, 0x3ef, 0xc6, 0x362, 0x200, 0x3ba, 0x26b, 0xa0, 0x54, 0x37b, 0x22, 0x112, 0x32e, 0x28f, 0x2d0, 0x17a, 0x24e, 0x99, 0xc8, 0x134, 0x16d, 0x23a, 0x15c, 0xd, 0x2c, 0x344, 0x43, 0x30f, 0x1e7, 0x1d7, 0x236, 0xa6, 0xa9, 0x329, 0x3a4, 0x162, 0x1ba, 0x1d1, 0x2cb, 0xf4, 0x32f, 0x359, 0x130, 0x23c, 0x1a1, 0x5f, 0x3aa, 0x334, 0x2d7, 0x51, 0x1fc, 0x59, 0x357, 0x366, 0x151, 0x21, 0x368, 0x307, 0x34c, 0x2e8, 0x30, 0x3e1, 0x290, 0xf, 0x380, 0x8d, 0x2c6, 0xd8, 0x6b, 0x31a, 0x23f, 0x3db, 0x76, 0x269, 0x30c, 0x39d, 0x1fe, 0x3f5, 0x9e, 0x1e3, 0x286, 0x1ad, 0x1a5, 0x30e, 0x31, 0x237, 0x170, 0x349, 0x6f, 0x4b, 0x1a4, 0x2d8, 0x3d1, 0x171, 0x29f, 0x38f, 0x30d, 0x24b, 0x21e, 0xb3, 0x371, 0x125, 0x1e4, 0x3ad, 0x21f, 0x165, 0x91, 0x263, 0x20b, 0x36b, 0x17d, 0x365, 0x3ac, 0x39b, 0x206, 0x287, 0xf6, 0x106, 0x240, 0x197, 0x28f, 0x1a9, 0x1e1, 0x254, 0x182, 0x136, 0x18b, 0x3c5, 0x2f7, 0x1d7, 0x65, 0x298, 0x141, 0x2fc, 0x75, 0x26, 0x8f, 0x2d4, 0x5f, 0x35d, 0xcb, 0x295, 0x119, 0x3f7, 0x26d, 0xba, 0x18, 0x3e1, 0x129, 0x3c, 0x3f, 0xc2, 0x66, 0x265, 0x1e5, 0xff, 0x3f5, 0x13c, 0x385, 0x1d, 0x2e6, 0xc5, 0x230, 0xb6, 0x3ec, 0x171, 0x137, 0x227, 0x5e, 0xf1, 0x350, 0x93, 0x39e, 0x301, 0x36b, 0x2fa, 0x18f, 0x16e, 0x80, 0x1dd, 0x26b, 0x140, 0x150, 0x3ee, 0x220, 0x208, 0x222, 0x159, 0x11d, 0x15c, 0x1a, 0xb0, 0x216, 0x39, 0x138, 0x12e, 0x26a, 0x2ec, 0x2cb, 0x1e8, 0xa7, 0x2fe, 0x324, 0x319, 0x8a, 0x3d3, 0x1b3, 0x151, 0x42, 0x1bb, 0xe, 0xa5, 0x1af, 0x1b, 0x31c, 0x18d, 0x23f, 0x3bf, 0x1d8, 0x36c, 0xac, 0x35c, 0x367, 0x10e, 0x31f, 0x170, 0x351, 0x277, 0x14, 0x2a, 0x2ff, 0x110, 0x208, 0x4d, 0x16d, 0xfa, 0x1ed, 0x340, 0x53, 0x152, 0x17e, 0x75, 0x4c, 0x23c, 0x28d, 0x1f9, 0x36a, 0x2ac, 0x42, 0x376, 0x38, 0x121, 0x2c6, 0x360, 0x2b9, 0x339, 0x3fe, 0x13c, 0x303, 0x74, 0x31d, 0x4b, 0x299, 0x1d3, 0x195, 0x3bc, 0x24a, 0x33b, 0x155, 0x1db, 0x32b, 0x20, 0x2ea, 0x26b, 0x280, 0x149, 0x34f, 0x248, 0x190, 0x1b2, 0x1f3, 0x37f, 0x1d7, 0xca, 0x272, 0x21a, 0x393, 0x2bb, 0x192, 0x319, 0x114, 0x357, 0x183, 0x13d, 0x52, 0x203, 0x309, 0x61, 0x66, 0xc3, 0x39d, 0x3f1, 0x327, 0x3c1, 0xb8, 0x29b, 0x378, 0x172, 0x394, 0x21e, 0x2cc, 0x375, 0x1c2, 0x3b1, 0x2fa, 0x31e, 0x1b1, 0x9, 0x1ef, 0x1eb, 0xb4, 0x17a, 0x12a, 0x182, 0x26c, 0x225, 0x217, 0x323, 0x29e, 0x176, 0x2cb, 0x3d0, 0x29c, 0x3dd, 0x22c, 0x3f8, 0x2c8, 0x22a, 0xc, 0x3e1, 0x2ab, 0x1ce, 0xa0, 0x2a0, 0x34f, 0x99, 0x249, 0x18b, 0x30f, 0x323, 0x135, 0x1d1, 0x275, 0x177, 0x334, 0x295, 0x6d, 0x307, 0x256, 0x35e, 0xd8, 0x358, 0x339, 0x3f5, 0xf9, 0x2e, 0x349, 0x378, 0x2e4, 0x24b, 0xd4, 0x93, 0x263, 0x7c, 0x346, 0x347, 0x1ec, 0x22, 0x82, 0x222, 0x16d, 0x1f4, 0x3bd, 0x236, 0x139, 0x21a, 0x32f, 0x2fe, 0x8b, 0x1fc, 0x2c8, 0x5d, 0x30, 0x337, 0x161, 0x23f, 0x2e7, 0x1bf, 0x286, 0x173, 0x18a, 0x1a4, 0x2ed, 0x195, 0x371, 0x13a, 0x1ee, 0x17d, 0x31e, 0x362, 0x24, 0x363, 0x28f, 0x2ad, 0x22f, 0xd, 0x160, 0x94, 0x329, 0x11f, 0x26, 0x23c, 0x113, 0x3ed, 0x366, 0x29a, 0x52, 0xf, 0x3f, 0x308, 0x269, 0x56, 0x2b1, 0x30e, 0x188, 0xfb, 0x171, 0xd5, 0x238, 0x3ad, 0xdc, 0x1e6, 0x8, 0x175, 0x26b, 0x109, 0x12d, 0x24e, 0xc1, 0x26c, 0x43, 0x4e, 0x12e, 0x1ba, 0x15f, 0x331, 0x109, 0x25a, 0x12a, 0x201, 0x281, 0x72, 0x3a4, 0x20d, 0x11e, 0x113, 0x3d3, 0x183, 0xfd, 0x129, 0x1e0, 0x3db, 0x369, 0x143, 0x173, 0x314, 0x299, 0x345, 0x166, 0x2e3, 0x20b, 0x2d5, 0x3a7, 0x1ec, 0x44, 0x208, 0x134, 0x2fd, 0x2f7, 0x2a3, 0x176, 0x33e, 0x177, 0x261, 0x246, 0x368, 0x1c, 0x242, 0x21d, 0xc3, 0x26f, 0x367, 0x62, 0x279, 0x171, 0x1aa, 0xf2, 0x157, 0x1db, 0xb7, 0x200, 0x3de, 0x343, 0x2ad, 0x57, 0x34, 0x312, 0x152, 0x1f1, 0x359, 0x324, 0xfe, 0x2c8, 0xba, 0xc0, 0x18e, 0x23d, 0x379, 0x9e, 0x20f, 0x3a0, 0x378, 0x1c1, 0x13e, 0x2a9, 0x122, 0xeb, 0x33f, 0x28, 0x150, 0x34f, 0x132, 0x136, 0x43, 0x9c, 0xb1, 0x1cb, 0x16a, 0x17c, 0x36a, 0x2a2, 0x29, 0xf, 0x7e, 0x3b, 0x36c, 0x169, 0x29d, 0x230, 0x1b9, 0x2ce, 0x371, 0x274, 0x3b1, 0x3fa, 0x18c, 0x83, 0x112, 0x2be, 0xdf, 0x5a, 0x1e1, 0x101, 0x160, 0x250, 0x2fc, 0x359, 0x241, 0x3f8, 0x26d, 0x3b2, 0x36, 0x358, 0xff, 0x327, 0x237, 0x253, 0x137, 0x238, 0x2af, 0x1db, 0x16e, 0x12, 0x2cf, 0x55, 0x11d, 0x1ed, 0x236, 0xed, 0x1e8, 0x262, 0x34e, 0xda, 0xe, 0x242, 0x33, 0x30c, 0x35c, 0x215, 0x5b, 0x35f, 0x1de, 0x13a, 0x3b1, 0x3fd, 0x239, 0x11, 0x104, 0x134, 0x1f3, 0x3ce, 0x135, 0x34d, 0x311, 0x16f, 0x2ac, 0x210, 0xf, 0xfc, 0xec, 0x356, 0x2bd, 0x314, 0x13b, 0x10f, 0x322, 0x263, 0x1f0, 0x5, 0x54, 0x3a3, 0x132, 0x26c, 0x10c, 0xe9, 0x302, 0x11e, 0x226, 0x357, 0x3, 0x3cb, 0x161, 0xee, 0x223, 0x303, 0x3a0, 0x2f9, 0x30d, 0x1e2, 0x2ca, 0x1, 0x2be, 0xdf, 0x5a, 0x1e1, 0x101, 0x160, 0x250, 0x2fc, 0x359, 0x241, 0x3f8, 0x26d, 0x3b2, 0x36, 0x358, 0xff, 0x327, 0x237, 0x253, 0x137, 0x238, 0x175, 0x37c, 0x2d0, 0x22f, 0x68, 0xa6, 0x21a, 0x14e, 0x2d7, 0x6d, 0xe, 0x8d, 0xcc, 0x56, 0x1a5, 0x230, 0x2ed, 0xb3, 0x1cf, 0x7c, 0x206, 0x54, 0x34f, 0xc1, 0x344, 0xe4, 0x11f, 0x130, 0x23b, 0x2c8, 0x2e8, 0x1b, 0x358, 0x1fe, 0x87, 0x19c, 0x171, 0x2a1, 0x33b, 0x17d, 0xc6, 0x106, 0x82, 0x134, 0x3e6, 0x323, 0x1ba, 0xb5, 0x2f8, 0x366, 0xfd, 0xad, 0x23f, 0x315, 0x303, 0x349, 0x3f6, 0x5e, 0x21f, 0x1e6, 0x40, 0x1ef, 0x28f, 0x145, 0x2f2, 0x236, 0x1da, 0x3a9, 0x334, 0x85, 0x376, 0x380, 0x308, 0x36c, 0x1ad, 0x18a, 0x13b, 0x21e, 0x93, 0x33c, 0x33f, 0xa0, 0x12d, 0x254, 0x2c, 0x94, 0x17e, 0x359, 0x8b, 0x3fb, 0x34c, 0x35e, 0x2c9, 0x39d, 0x367, 0x188, 0x3d1, 0xef, 0x13a, 0x36b, 0x3ef, 0x1ec, 0x110, 0xc8, 0x18b, 0x4e, 0x162, 0x243, 0x113, 0x357, 0x6, 0x337, 0x31a, 0x2fb, 0x2ea, 0x1eb, 0x2ad, 0x2b8, 0x11b, 0x1da, 0x35b, 0xcb, 0x21, 0x305, 0xfc, 0x3b0, 0x105, 0x233, 0x2e4, 0xf1, 0x19d, 0x8, 0x37d, 0x343, 0x145, 0x1ed, 0xca, 0x2cb, 0x2ee, 0x251, 0x108, 0x1e, 0x3e9, 0x1bf, 0x3a, 0x1bc, 0x30d, 0x381, 0xf3, 0x40, 0x3de, 0x22e, 0x23a, 0x373, 0x259, 0x275, 0x35d, 0x2ac, 0x52, 0xf0, 0x377, 0x1e3, 0x1d0, 0x1fb, 0x5e, 0x37, 0x391, 0x200, 0x2cf, 0x154, 0x1f4, 0x3ae, 0x2ec, 0x38c, 0x2de, 0x14d, 0x290, 0x389, 0x38e, 0x303, 0x29b, 0x3c3, 0x2f0, 0x1b8, 0xb7, 0x24, 0x255, 0x2b2, 0x3bb, 0x14f, 0x34d, 0x5f, 0x2dd, 0x27a, 0xad, 0x77, 0x4f, 0x2e, 0xf5, 0x227, 0x3ad, 0x1db, 0x1b1, 0x120, 0x28c, 0x1bd, 0x1e7, 0x26a, 0x25e, 0x2f8, 0x2c5, 0x3f4, 0x161, 0x3b8, 0x278, 0x170, 0x3a1, 0x11c, 0x157, 0x2c3, 0x193, 0x112, 0x4d, 0x1f3, 0x323, 0x374, 0x2d4, 0x3ed, 0x1dd, 0x3a5, 0x145, 0x3da, 0x328, 0x275, 0x2b3, 0x2a2, 0x290, 0x31b, 0x223, 0x2e, 0x1ea, 0x8e, 0x157, 0x18f, 0x245, 0x82, 0xd9, 0x217, 0x162, 0x11e, 0x114, 0x5d, 0x209, 0x2b9, 0x3eb, 0xc4, 0x3ab, 0x371, 0x301, 0x285, 0x54, 0x127, 0xb, 0x94, 0x1f1, 0x1f5, 0x288, 0x7, 0x11a, 0x269, 0x2d2, 0x314, 0x1ca, 0x350, 0x102, 0x175, 0x1eb, 0x153, 0x2f2, 0xca, 0x19f, 0x3aa, 0x2ac, 0xa4, 0x3c0, 0x38e, 0x20f, 0x27e, 0x227, 0x353, 0x365, 0x193, 0x224, 0x134, 0x383, 0x25c, 0x243, 0x45, 0x115, 0x180, 0x1ac, 0x3fc, 0x31, 0x3ec, 0x1de, 0x1c2, 0x1a3, 0x15, 0x34f, 0x304, 0x25, 0x17e, 0x17f, 0xa2, 0x307, 0x242, 0x198, 0x2b0, 0xc5, 0x276, 0xd4, 0x244, 0x15f, 0x37c, 0x352, 0x2b8, 0x236, 0x361, 0x2ee, 0xab, 0x29, 0xf0, 0x2e7, 0x385, 0x29b, 0x38f, 0x3d2, 0x1db, 0x362, 0x89, 0x4d, 0x3e6, 0x3ba, 0x28f, 0x23a, 0x1d7, 0x1d1, 0x5f, 0x366, 0x3e1, 0x31a, 0x3f5, 0x237, 0x171, 0x125, 0x36b, 0x347, 0x3ee, 0xc1, 0x216, 0x17e, 0x2fe, 0x288, 0xe, 0x61, 0x36c, 0x173, 0x258, 0x27c, 0x33a, 0x40, 0x363, 0x2a8, 0x3bb, 0x135, 0xb5, 0x3ed, 0x6, 0x18e, 0x339, 0x87, 0xfb, 0xef, 0x1c2, 0x346, 0x54, 0x24e, 0x2c, 0xa9, 0x32f, 0x2d7, 0x368, 0x380, 0x76, 0x286, 0x6f, 0x30d, 0x21f, 0x32b, 0x24, 0x146, 0x37a, 0x323, 0x1cb, 0x113, 0x28e, 0x180, 0x358, 0x3eb, 0x188, 0x2b7, 0x3be, 0x7c, 0x14, 0x12d, 0x284, 0x312, 0x21a, 0x262, 0x85, 0x386, 0x1f8, 0x1bf, 0xe8, 0x3f6, 0x2f0, 0x2e9, 0x362, 0x112, 0x134, 0x30f, 0x162, 0x23c, 0x59, 0x2e8, 0xd8, 0x39d, 0x30e, 0x2d8, 0xb3, 0x263, 0x33f, 0x109, 0x3c2, 0x68, 0x139, 0x3a9, 0x196, 0x108, 0x78, 0x2e7, 0x303, 0x27e, 0x47, 0x157, 0x31e, 0x37d, 0x22e, 0x1f4, 0x14f, 0x25e, 0x3ed, 0xc, 0x231, 0x1fe, 0x62, 0x35f, 0x3be, 0xf8, 0x50, 0x17a, 0x1a, 0x298, 0x3a9, 0x32c, 0x29, 0x3c0, 0x223, 0xb8, 0x29f, 0x3c8, 0x1fd, 0x1ec, 0x124, 0x1a2, 0x329, 0x2bb, 0x144, 0xe, 0xc2, 0x1ab, 0x38a, 0x1c1, 0x30b, 0x32b, 0x48, 0x111, 0x3e6, 0x25c, 0x11e, 0x59, 0x1d9, 0x360, 0xd7, 0x8c, 0x3a6, 0x93, 0x3ac, 0x1be, 0x2ad, 0x1ed, 0x259, 0x38c, 0x2dd, 0x3f4, 0x31a, 0x3e3, 0xce, 0x39a, 0x274, 0x1a3, 0x54, 0x95, 0xb0, 0x141, 0x29c, 0x246, 0x386, 0x3f0, 0x2f5, 0x349, 0x317, 0x2af, 0x31e, 0x20c, 0x64, 0x43, 0x341, 0xc9, 0x3fb, 0xa5, 0x66, 0x2b0, 0x314, 0x321, 0x165, 0x10, 0x3b5, 0x2a8, 0x37f, 0xdd, 0x1a1, 0x2a7, 0xc0, 0x358, 0x3df, 0x229, 0x195, 0x39e, 0x39b, 0x109, 0x38d, 0x1a0, 0x1da, 0x2ee, 0x2ac, 0x290, 0x77, 0x278, 0x392, 0x2f3, 0xaa, 0x3bb, 0xdd, 0x342, 0x28e, 0x209, 0x1e5, 0x30e, 0x372, 0x322, 0x1d6, 0x1be, 0x153, 0x3bd, 0x2ec, 0xbe, 0x306, 0xc7, 0x27b, 0x31, 0x35f, 0x375, 0x3e0, 0x280, 0x38d, 0x340, 0x361, 0x35d, 0x29a, 0x2b4, 0x1ff, 0x237, 0x1cd, 0x274, 0x346, 0x150, 0xa1, 0x312, 0x7a, 0x261, 0x108, 0x1e0, 0x223, 0x170, 0x26e, 0x27f, 0x3ef, 0x1f7, 0x182, 0x94, 0x393, 0x1a7, 0x376, 0xfc, 0x37e, 0x349, 0x227, 0x2ae, 0xc6, 0x88, 0x9b, 0xe4, 0x3a8, 0xa2, 0xe, 0x184, 0x2a5, 0x6f, 0x2f, 0x1b8, 0x362, 0x41, 0x364, 0x270, 0x98, 0x3f8, 0x256, 0x66, 0x169, 0x4b, 0x13e, 0x27d, 0x200, 0xa3, 0x2fd, 0x12e, 0x11e, 0xb2, 0x36d, 0x336, 0x16b, 0x1a4, 0x6a, 0x102, 0x3ba, 0x22e, 0x3e8, 0x135, 0x2d4, 0x2a7, 0x180, 0x17b, 0x2c7, 0x2d8, 0x2cc, 0x271, 0x26b, 0x352, 0x1ed, 0xbb, 0x22b, 0x2c5, 0x337, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x3de, 0x2b2, 0x323, 0x8f, 0x164, 0x35e, 0x211, 0xc5, 0x24b, 0x27d, 0x12, 0x222, 0x217, 0x13, 0x1fc, 0xa5, 0x330, 0x173, 0x1c1, 0x6e, 0x362, 0x104, 0x225, 0x11f, 0x116, 0x7, 0x308, 0x105, 0x1fb, 0x3ad, 0x235, 0x88, 0x26c, 0x25b, 0x3ea, 0x368, 0x7e, 0x2f5, 0x27e, 0x79, 0x1fd, 0x37b, 0x182, 0x250, 0x14e, 0x10a, 0x3c, 0x315, 0x2e0, 0x354, 0x36b, 0x15, 0x12a, 0x312, 0x1e8, 0x251, 0x290, 0x3b8, 0x31f, 0x39a, 0x384, 0xa, 0x17a, 0xd0, 0x361, 0x16f, 0x1fa, 0x73, 0x87, 0x3ab, 0x2e3, 0x33f, 0xb4, 0x179, 0xbb, 0xbe, 0x3, 0x6b, 0x3df, 0x16c, 0x191, 0x3ac, 0x1eb, 0x23a, 0x14f, 0x2d4, 0x28e, 0x36, 0x26f, 0x230, 0x35, 0x204, 0x1ef, 0x159, 0x395, 0x243, 0xb2, 0x1af, 0x30c, 0x266, 0x321, 0x33a, 0x9, 0x111, 0x30f, 0x20d, 0xfe, 0x256, 0x198, 0x2bd, 0x2e4, 0x37, 0x1b1, 0x82, 0x3b5, 0x2da, 0x12e, 0xe2, 0xd3, 0x21d, 0x2d2, 0xb9, 0x21f, 0x1b1, 0x104, 0x43, 0x75, 0xa2, 0x70, 0x1d8, 0x1d0, 0x47, 0x2ba, 0x3d8, 0xc1, 0x250, 0x29c, 0x21, 0x1e0, 0x13c, 0xaf, 0x9d, 0x285, 0x12d, 0x34, 0x3b4, 0x16f, 0x3f4, 0x1cc, 0x31, 0x2ce, 0xcf, 0x26b, 0x2a6, 0x3ae, 0xb5, 0x147, 0x36, 0xd7, 0xd2, 0x1a8, 0x8, 0x197, 0x2fd, 0x162, 0x319, 0x291, 0xcc, 0x2bd, 0x1c1, 0xdc, 0x193, 0x32, 0x218, 0x3a8, 0x119, 0x380, 0x2db, 0x29b, 0x238, 0x1fd, 0x2ff, 0x201, 0x2a4, 0xcd, 0x108, 0x31b, 0x1f2, 0x171, 0xe1, 0x5, 0x17a, 0x1a0, 0x19f, 0x36a, 0x39f, 0x27b, 0x188, 0x25d, 0x271, 0x37c, 0x11d, 0x14f, 0x1a1, 0x22a, 0x1b0, 0x2b1, 0x299, 0x15b, 0x40, 0xa3, 0x3c5, 0x302, 0xfe, 0xa5, 0x269, 0x1c5, 0x213, 0x2e9, 0x83, 0x190, 0xe4, 0x17f, 0xda, 0x3f, 0x2f5, 0xf5, 0x1e4, 0x363, 0x37a, 0x162, 0x23b, 0x256, 0x269, 0x38a, 0x5e, 0x365, 0x22, 0x26c, 0x17e, 0x2d7, 0x386, 0x2e7, 0x170, 0x2a1, 0x36e, 0x2a0, 0xd, 0x1da, 0x16f, 0x3e1, 0x339, 0x188, 0xb3, 0x1d6, 0x3d6, 0x1f4, 0x1ba, 0x8a, 0x36d, 0x30c, 0x18a, 0x27c, 0x32b, 0x112, 0x18b, 0x11f, 0x51, 0x70, 0x3b0, 0x349, 0x238, 0x3fa, 0x3ee, 0x2c, 0x21a, 0x196, 0x290, 0x2fb, 0x19c, 0x371, 0x3e0, 0x5a, 0x2f2, 0x1d1, 0x3ed, 0x180, 0x39d, 0x230, 0xd4, 0x8, 0x32e, 0x3e6, 0x302, 0x1fc, 0x294, 0x36c, 0x6f, 0x2f0, 0x31e, 0x110, 0x344, 0x3e2, 0x295, 0xf, 0x315, 0x392, 0x125, 0x346, 0x12d, 0x68, 0x2cb, 0x36a, 0x337, 0x1fe, 0x5b, 0x191, 0x2ab, 0x28f, 0x3bb, 0x1cb, 0x59, 0x35e, 0x56, 0x4b, 0x3c4, 0x16e, 0x82, 0x43, 0xea, 0x288, 0x380, 0x1bf, 0x27e, 0x1e4, 0x3ef, 0x34f, 0x160, 0xf4, 0xab, 0xad, 0x3f5, 0x2cf, 0x1f3, 0x302, 0x3f8, 0x242, 0x356, 0x2f9, 0x2af, 0x239, 0x132, 0x250, 0x262, 0x210, 0xee, 0x237, 0x1de, 0x1f0, 0x5a, 0x1ed, 0x34d, 0x357, 0x36, 0x35c, 0x13b, 0x2ca, 0x12, 0x134, 0xe9, 0x241, 0xe, 0xec, 0x3a0, 0x238, 0x3fd, 0x3a3, 0x160, 0x1e8, 0x2ac, 0x161, 0x327, 0x35f, 0x263, 0xdf, 0x11d, 0x135, 0x226, 0x3b2, 0x30c, 0x314, 0x1e2, 0x16e, 0x104, 0x10c, 0x359, 0xda, 0xfc, 0x303, 0x137, 0x3b1, 0x54, 0x101, 0xed, 0x16f, 0x3cb, 0xff, 0x5b, 0x322, 0x2be, 0x55, 0x3ce, 0x11e, 0x26d, 0x33, 0x2bd, 0x30d, 0x1db, 0x11, 0x26c, 0x2fc, 0x34e, 0xf, 0x223, 0x253, 0x13a, 0x5, 0x1e1, 0x236, 0x311, 0x3, 0x358, 0x215, 0x10f, 0x1, 0x2cf, 0x1f3, 0x302, 0x3f8, 0x242, 0x356, 0x2f9, 0x2af, 0x239, 0x132, 0x250, 0x262, 0x210, 0xee, 0x237, 0x1de, 0x1f0, 0x5a, 0x1ed, 0x34d, 0x357, 0x197, 0x3c5, 0x26, 0x3f7, 0xc2, 0x1d, 0x227, 0x2fa, 0x3ee, 0xb0, 0x1e8, 0x151, 0x18d, 0x10e, 0x195, 0xeb, 0x3a5, 0x3bb, 0x325, 0x199, 0x21d, 0x2bd, 0x213, 0x365, 0x88, 0x281, 0x32f, 0x214, 0x389, 0x3c1, 0x273, 0xf8, 0x5a, 0x3da, 0x12f, 0x28e, 0x360, 0x34a, 0x24b, 0x391, 0x224, 0x43, 0x3a8, 0xda, 0x1f8, 0x17, 0x1aa, 0x36e, 0x292, 0xd0, 0x275, 0x183, 0xd6, 0x30e, 0x10f, 0x2, 0x32e, 0x383, 0x4c, 0x3e7, 0x184, 0x3a, 0x47, 0x1fd, 0x3d5, 0x160, 0x3d0, 0x2a2, 0x31a, 0x21c, 0x32a, 0x1d6, 0x343, 0x37f, 0x243, 0x332, 0x33, 0x173, 0x2f, 0x2c3, 0x110, 0x10b, 0x257, 0x21, 0x31b, 0x38b, 0xef, 0x1f0, 0xb4, 0x3bd, 0x25e, 0x115, 0x2c9, 0x29d, 0x9f, 0x32b, 0x41, 0x86, 0x359, 0x1b4, 0x3f0, 0x2e, 0x354, 0x2d5, 0x12d, 0x1a0, 0xe3, 0x306, 0x1ac, 0x215, 0x21e, 0x4, 0x255, 0x30f, 0x32e, 0x30f, 0x130, 0x307, 0x76, 0x349, 0x1e4, 0x347, 0x254, 0x139, 0x16f, 0x337, 0x3eb, 0x2ed, 0x81, 0x363, 0x3e6, 0x26, 0x3e7, 0x308, 0xe8, 0x238, 0x3ef, 0x24e, 0xa6, 0x3aa, 0x3e1, 0x1fe, 0x2d8, 0x91, 0x1ef, 0x37a, 0x302, 0x3fb, 0x61, 0x1d, 0x47, 0x3fa, 0x34f, 0x312, 0x177, 0xfd, 0x339, 0x5b, 0x93, 0x3ba, 0x16d, 0x162, 0x1fc, 0x8d, 0x286, 0x38f, 0x17d, 0x3ee, 0x160, 0x3a9, 0x29a, 0xe6, 0x188, 0x191, 0x175, 0x2a8, 0x12e, 0x23b, 0x294, 0x356, 0x3f6, 0x2aa, 0x37b, 0x2c, 0xf4, 0x151, 0x31a, 0x31, 0xb3, 0x2ab, 0x55, 0x323, 0x1c4, 0x256, 0x36c, 0x378, 0x157, 0x1ec, 0x201, 0x21a, 0xab, 0x161, 0x87, 0x195, 0x1d6, 0x28f, 0x1e7, 0x23c, 0x34c, 0x269, 0x6f, 0x3ad, 0x239, 0xc1, 0x141, 0x196, 0xad, 0x397, 0x2b7, 0x33c, 0x3d6, 0x3bb, 0x243, 0x26d, 0xcc, 0x38a, 0x2f0, 0xc6, 0x255, 0x27, 0x192, 0x1c, 0x2db, 0x3d4, 0x3dc, 0x150, 0x68, 0xe3, 0x3, 0x2f6, 0x69, 0x2b6, 0x24, 0x364, 0x75, 0x6d, 0x3f0, 0xb8, 0x125, 0x5, 0x313, 0xbb, 0x3d3, 0x6c, 0x1a5, 0x9f, 0xb7, 0x19, 0x1c8, 0x36f, 0xf, 0x13c, 0x1cd, 0x7c, 0xb4, 0x2ef, 0x1a1, 0x1d9, 0x2b, 0x258, 0x1b8, 0x11, 0x344, 0x257, 0x84, 0x1dc, 0x338, 0x2e3, 0x26b, 0x7d, 0x2e1, 0x2c8, 0x33, 0x1c5, 0x2f0, 0x18c, 0x264, 0x141, 0x32c, 0x2b4, 0x87, 0x32a, 0x351, 0x55, 0x24f, 0x319, 0x294, 0x2a5, 0x3c3, 0x17d, 0x3d5, 0x189, 0x177, 0x1fa, 0xff, 0x2d8, 0x122, 0x3b5, 0x3e6, 0x4c, 0x387, 0x76, 0x29b, 0x399, 0x20e, 0x101, 0x361, 0x366, 0xd6, 0x23, 0xd4, 0x80, 0x9a, 0x3a4, 0xa2, 0x21b, 0x303, 0x1aa, 0x1a3, 0x17a, 0x65, 0x17c, 0x180, 0x1ae, 0xe5, 0x1e6, 0x224, 0x10c, 0x2fe, 0x2e5, 0x38e, 0xaf, 0xa3, 0x9c, 0x8b, 0x1c0, 0x3c6, 0xd5, 0x1a3, 0x2f4, 0x194, 0x3f2, 0x36, 0x1a5, 0x13e, 0x2dc, 0xc8, 0xbf, 0x123, 0x3c0, 0x31f, 0x2eb, 0x1ce, 0x11d, 0x374, 0x2c8, 0x66, 0x31d, 0x3ad, 0xf6, 0xb, 0xf4, 0x14d, 0x1cc, 0x5b, 0x24c, 0x3de, 0x3e6, 0x98, 0x207, 0x3b0, 0x1ea, 0x3dc, 0x2a0, 0x1a0, 0x311, 0x30, 0x26f, 0x276, 0x1e6, 0x41, 0x39, 0x3dd, 0x203, 0x13c, 0x39a, 0x1f0, 0x1a9, 0x2a3, 0x45, 0x2b5, 0x1ad, 0x2f, 0x235, 0x99, 0x2a4, 0x32c, 0x161, 0x21c, 0x166, 0x175, 0x2b2, 0x2c4, 0x3fb, 0x184, 0x1d0, 0x1e4, 0x107, 0x101, 0x2cb, 0x183, 0x2b9, 0x230, 0x2b6, 0x48, 0x18b, 0x3a8, 0x2d9, 0x2e7, 0x253, 0x384, 0x109, 0x3da, 0x16a, 0x2e8, 0x2b, 0xb9, 0x2e9, 0x88, 0x25, 0x262, 0x148, 0x3e3, 0x2b7, 0xeb, 0x117, 0x323, 0x319, 0x121, 0x286, 0x227, 0x3fd, 0x24e, 0x298, 0x2de, 0x18e, 0x146, 0x270, 0x51, 0x3f, 0x2e, 0x125, 0x14, 0x15c, 0x293, 0x5d, 0x30c, 0x258, 0x2e9, 0x110, 0x94, 0x334, 0xad, 0x87, 0xb3, 0x175, 0x16d, 0x302, 0x3e7, 0x76, 0x27e, 0x1ee, 0x2a0, 0x340, 0x5f, 0x180, 0x2b1, 0x24b, 0x16e, 0xc8, 0x17e, 0x85, 0x23f, 0x19c, 0x1cf, 0x37c, 0x3bb, 0x23c, 0x256, 0x356, 0x38f, 0x3fa, 0x24e, 0x139, 0x36a, 0x6b, 0x46, 0x2a9, 0x24, 0x18b, 0x359, 0x376, 0x315, 0x171, 0x7c, 0x2d0, 0x2a3, 0x8a, 0x2c6, 0x173, 0x2f0, 0x239, 0x201, 0xf4, 0x29a, 0x339, 0x2d8, 0x81, 0x32e, 0x4e, 0x8b, 0x380, 0x303, 0x2a1, 0x206, 0x22f, 0x1d1, 0x28e, 0x265, 0x4b, 0xdc, 0x22, 0x216, 0x262, 0x290, 0x397, 0x195, 0x2ab, 0x2a8, 0x162, 0x3fb, 0x308, 0x349, 0x33b, 0x54, 0x68, 0x38c, 0x30, 0xd7, 0x1ca, 0x32b, 0x19, 0x329, 0x295, 0x3c0, 0x237, 0x3be, 0x26b, 0x1f4, 0x243, 0x28c, 0x1d2, 0x288, 0x3f0, 0x1c9, 0x1c2, 0x212, 0x2ef, 0x113, 0x2b5, 0x2bd, 0x2f0, 0x7b, 0x16, 0x3a9, 0x1fa, 0x3f1, 0x345, 0x10, 0x9a, 0x11f, 0xda, 0x377, 0xaf, 0x1f, 0x168, 0x2a3, 0x114, 0x30a, 0x38a, 0x353, 0x3b9, 0x160, 0x2ee, 0x39f, 0x367, 0x35, 0x100, 0x1b2, 0x1d4, 0x1bb, 0x315, 0x2e2, 0x1f0, 0x2ad, 0x26a, 0x164, 0xcc, 0xde, 0x155, 0x3ee, 0x22d, 0x2b3, 0x18e, 0x215, 0x350, 0x24, 0x316, 0x17f, 0x386, 0x13c, 0x273, 0x33f, 0x28a, 0x2e1, 0x26d, 0xdb, 0x1fb, 0x17d, 0x297, 0x298, 0x36a, 0xd6, 0x118, 0x165, 0x240, 0x10c, 0x3dd, 0x1e, 0x3e4, 0x371, 0x39c, 0xfa, 0x243, 0x291, 0x1ab, 0x38f, 0x3fd, 0x12a, 0x1da, 0x2c5, 0x17b, 0x1a4, 0x27d, 0x41, 0xe4, 0x1a7, 0x1e0, 0x237, 0x375, 0x1be, 0x3bb, 0x71, 0x14a, 0x286, 0x8e, 0x3a7, 0x284, 0x19f, 0x3, 0x39d, 0x276, 0x391, 0x19, 0x111, 0x341, 0x6d, 0x377, 0x15e, 0x7c, 0x352, 0x26a, 0x2c8, 0x330, 0x2f9, 0x17d, 0x127, 0x272, 0x366, 0x17b, 0x348, 0x1e6, 0x208, 0x25b, 0x85, 0xee, 0x1f6, 0x33c, 0x22e, 0x25c, 0x3fb, 0x3b, 0xf5, 0x36b, 0xbd, 0x328, 0x357, 0x336, 0x96, 0x2e9, 0x49, 0x152, 0xab, 0x73, 0xb6, 0x81, 0xa3, 0xe9, 0x288, 0x3e9, 0x32d, 0x20b, 0x168, 0x14f, 0x59, 0x66, 0xde, 0x2aa, 0x3a3, 0x14c, 0x36a, 0x1ac, 0x69, 0x33a, 0x41, 0x1c8, 0x295, 0x31b, 0x338, 0x263, 0x343, 0x24f, 0x1fc, 0x184, 0x29b, 0x1ee, 0x292, 0x65, 0x3ed, 0x360, 0x314, 0xdc, 0x88, 0x128, 0x196, 0x18d, 0x310, 0x91, 0x197, 0x9c, 0x51, 0xfc, 0x2e0, 0x1c2, 0x2d, 0x3ae, 0x8a, 0x30a, 0x31d, 0x157, 0x1f7, 0x22d, 0x16f, 0x231, 0x8c, 0x165, 0x89, 0x39, 0x2d7, 0x1e0, 0x67, 0x1cf, 0x1eb, 0x3ce, 0x23b, 0x234, 0x1d0, 0x33b, 0x222, 0x11f, 0x368, 0x315, 0x39a, 0x33f, 0x23a, 0x243, 0x256, 0x286, 0x238, 0x20e, 0x68, 0x5f, 0x1b, 0x133, 0x21f, 0x22, 0x94, 0x196, 0x31a, 0x5b, 0x81, 0x146, 0x3a4, 0x6d, 0x2e7, 0x171, 0x3e0, 0x145, 0x1cb, 0x34c, 0x356, 0x47, 0x347, 0xd, 0x38c, 0x180, 0x1a5, 0x3c4, 0x106, 0x216, 0x334, 0x161, 0x188, 0x91, 0x32e, 0x270, 0x288, 0x3db, 0xaf, 0x7c, 0x2ad, 0x1ba, 0x26d, 0x36c, 0x38f, 0x3ef, 0x284, 0x275, 0x30, 0x2b1, 0x27c, 0x326, 0x344, 0x262, 0xad, 0x31, 0x93, 0x363, 0x4e, 0x51, 0x1f8, 0x392, 0x20b, 0x2d0, 0x135, 0x2c8, 0x269, 0x3f6, 0x3fa, 0x254, 0x2cb, 0x6, 0xd7, 0x24b, 0x362, 0x26c, 0x14e, 0x290, 0x87, 0x191, 0x1ef, 0x30f, 0x8b, 0x3f, 0x170, 0x1c2, 0x5a, 0x2a3, 0x59, 0xcc, 0x378, 0x17d, 0x24e, 0x1da, 0x306, 0x39d, 0x1ca, 0x16e, 0x249, 0x32f, 0x52, 0x397, 0x4d, 0x75, 0x376, 0x13c, 0x3bc, 0x26b, 0x37f, 0x319, 0x61, 0x29b, 0x3b1, 0x17a, 0x176, 0x22a, 0x56, 0x213, 0x318, 0x2c, 0x2ee, 0xc7, 0x46, 0x2ca, 0x41, 0x329, 0x10a, 0x379, 0x2b7, 0x15f, 0x1bd, 0x130, 0xe0, 0x17, 0x13a, 0x212, 0x355, 0x59, 0x198, 0x1fb, 0x3fa, 0xa1, 0x33e, 0x30, 0x16b, 0x1e2, 0x106, 0x25, 0xcb, 0x31a, 0xb6, 0x204, 0x222, 0x23e, 0x1bb, 0x9e, 0x1de, 0x331, 0x3bb, 0x388, 0x234, 0x349, 0x3dc, 0xbd, 0xbb, 0x115, 0x2b, 0x30d, 0x18c, 0x16, 0x177, 0x267, 0x23, 0x165, 0x224, 0x390, 0x85, 0x3b8, 0x35f, 0x2ab, 0x2da, 0x98, 0x70, 0x20f, 0x9d, 0x109, 0x3ae, 0x228, 0xcc, 0x2f9, 0x1fd, 0x254, 0x19f, 0x18, 0x2b1, 0xf1, 0x83, 0x216, 0x261, 0x18d, 0x5b, 0x102, 0x111, 0x11f, 0x2d9, 0x4f, 0xef, 0x39c, 0x3d9, 0x1c4, 0x11a, 0x3a0, 0x1ee, 0x25a, 0x259, 0x28e, 0x9a, 0x1d4, 0x386, 0x3e4, 0x375, 0x3d6, 0x97, 0x3ff, 0x3b0, 0x26e, 0x5, 0x2f2, 0x28d, 0x185, 0x6f, 0x2ba, 0x95, 0x2cb, 0x18, 0x16b, 0x3c4, 0x11, 0x128, 0xab, 0x398, 0x1d3, 0x40, 0x2c1, 0x1f5, 0x78, 0xce, 0xcf, 0x55, 0x181, 0x207, 0x1e3, 0x296, 0x140, 0x1d7, 0x228, 0x198, 0x3f6, 0x3f3, 0x101, 0x38c, 0x209, 0x266, 0xdc, 0x49, 0x282, 0x29a, 0x3f1, 0x35, 0x24, 0x10c, 0x1a7, 0x23f, 0x3ec, 0x3ac, 0x16d, 0x98, 0xe0, 0x2e, 0xe1, 0xb4, 0x135, 0x332, 0x2d1, 0x47, 0x107, 0xd0, 0x2f8, 0x360, 0x96, 0x365, 0x264, 0x1e8, 0x3e1, 0x187, 0x15b, 0x112, 0x390, 0x10a, 0x2fb, 0x2ce, 0x2ea, 0x3e6, 0x241, 0x7e, 0x392, 0x3e, 0x153, 0x1cb, 0x12b, 0x105, 0x1e4, 0x150, 0x65, 0x357, 0x186, 0x1c1, 0xc6, 0x16, 0x2ee, 0x18e, 0x118, 0x27d, 0x19, 0x1f1, 0x210, 0x397, 0x2cc, 0x3de, 0x4e, 0x134, 0x359, 0xf, 0x237, 0x263, 0x55, 0x302, 0xe, 0x303, 0x13a, 0x5a, 0x135, 0x26d, 0x356, 0x238, 0x54, 0x236, 0x357, 0x30c, 0x30d, 0x239, 0x160, 0x16f, 0x358, 0x13b, 0x16e, 0x26c, 0x262, 0x161, 0x5b, 0x1, 0x134, 0x359, 0xf, 0x237, 0x263, 0x55, 0x302, 0xe, 0x303, 0x13a, 0x5a, 0x135, 0x26d, 0x356, 0x238, 0x54, 0x236, 0x357, 0x30c, 0x30d, 0x239, 0x160, 0x16f, 0x358, 0x13b, 0x16e, 0x26c, 0x262, 0x161, 0x5b, 0x1, 0x134, 0x359, 0xf, 0x237, 0x263, 0x55, 0x302, 0xe, 0x303, 0x13a, 0x5a, 0x135, 0x26d, 0x356, 0x238, 0x54, 0x236, 0x357, 0x30c, 0x30d, 0x239, 0x160, 0x16f, 0x358, 0x13b, 0x16e, 0x26c, 0x262, 0x161, 0x5b, 0x1, 0x134, 0x359, 0xf, 0x237, 0x263, 0x55, 0x302, 0xe, 0x303, 0x13a, 0x5a, 0x135, 0x26d, 0x356, 0x238, 0x54, 0x236, 0x357, 0x30c, 0x30d, 0x239, 0x268, 0x17f, 0x78, 0x338, 0xeb, 0x16d, 0x260, 0x21b, 0x392, 0xf8, 0x11d, 0x23c, 0x11a, 0x13f, 0x36e, 0x57, 0x2d4, 0x2c6, 0xde, 0x1fd, 0x284, 0x311, 0x6c, 0x4b, 0x2c3, 0x304, 0x177, 0x31c, 0xd2, 0x32b, 0x9b, 0x131, 0x161, 0xb6, 0x4, 0x1b2, 0x1f5, 0x1e0, 0xfb, 0x3ac, 0x1bd, 0x192, 0x7e, 0x253, 0x3e0, 0x7d, 0xe2, 0x61, 0xf5, 0x1a3, 0x15c, 0x342, 0x30a, 0x378, 0x3fd, 0x202, 0x5f, 0x1b0, 0x12c, 0x31e, 0xb, 0x1d5, 0x6b, 0x348, 0xb7, 0x26c, 0xcd, 0x18d, 0x2d8, 0x10, 0x2c1, 0x3dd, 0x389, 0x3ec, 0x2ab, 0x2fd, 0x241, 0x1f8, 0x15e, 0x39b, 0x1f4, 0x388, 0x184, 0x3d4, 0x285, 0x179, 0x113, 0x33, 0x1fb, 0x3ef, 0x1a, 0x17c, 0x2c9, 0xb9, 0x63, 0x2c, 0x35d, 0x1ac, 0x13b, 0x2dc, 0x1a2, 0x334, 0x23d, 0x372, 0x40, 0x316, 0x36f, 0x23f, 0x3ab, 0x2be, 0x3e6, 0x116, 0x3e9, 0x171, 0xd9, 0x1f5, 0x3c0, 0x3ec, 0x15f, 0x3e6, 0x22c, 0x3bf, 0x39a, 0x331, 0x3ce, 0x3fb, 0x2db, 0x14b, 0x109, 0x29e, 0xd3, 0x286, 0x399, 0x25a, 0x1d1, 0x3b2, 0x2e6, 0x2aa, 0x12a, 0xe3, 0x1b, 0x221, 0x2c3, 0x201, 0x1d5, 0xd6, 0x13b, 0x1b1, 0x281, 0x196, 0x398, 0x283, 0x24, 0x72, 0x10a, 0x3f5, 0x2cc, 0x2cf, 0x3a4, 0x1bb, 0x1f2, 0x1cf, 0x22e, 0x20d, 0x70, 0xb8, 0x1f, 0x145, 0x11e, 0x11a, 0x27e, 0x1a3, 0x2b8, 0x113, 0x66, 0x3e5, 0x347, 0x1a0, 0x3d3, 0x30c, 0x2f, 0x3d8, 0xa6, 0x183, 0x1ae, 0x3c4, 0x88, 0x282, 0xfd, 0x187, 0x2ca, 0x19, 0x393, 0x129, 0x188, 0x204, 0x268, 0x2fe, 0x1e0, 0x1f6, 0x2ab, 0x1f3, 0x116, 0x3db, 0x1cd, 0x39c, 0x1e7, 0x3f9, 0x369, 0x2a1, 0x280, 0x14f, 0x26d, 0x143, 0x3c8, 0x12d, 0x2ec, 0x1d9, 0x173, 0x155, 0x95, 0x275, 0x209, 0x314, 0x365, 0x304, 0x2ee, 0x6b, 0x1b2, 0x3dd, 0x23f, 0x2b7, 0x3ba, 0x4e, 0x6d, 0x9e, 0x3be, 0x28f, 0x302, 0x70, 0x170, 0x7c, 0x23a, 0x1c4, 0x308, 0x29f, 0x14, 0x1d7, 0x2c8, 0x356, 0x1e4, 0x12d, 0x1d1, 0x36d, 0x38a, 0x17d, 0x284, 0x5f, 0x2c9, 0x2e4, 0x239, 0x312, 0x366, 0xd7, 0x3c4, 0x110, 0x21a, 0x3e1, 0x46, 0x1e6, 0x249, 0x262, 0x31a, 0x2ed, 0x200, 0x218, 0x85, 0x3f5, 0x191, 0x32e, 0x11f, 0x386, 0x237, 0x33c, 0x16d, 0x192, 0x1f8, 0x171, 0x1ce, 0x1e7, 0x3fb, 0x1bf, 0x125, 0x5a, 0x1ba, 0x256, 0xe8, 0x36b, 0x22f, 0x1a1, 0x21d, 0x3f6, 0x347, 0x340, 0x357, 0x56, 0x2f0, 0x3ee, 0x1da, 0x30, 0x133, 0x2e9, 0xc1, 0x177, 0x6b, 0x13b, 0x362, 0x216, 0xab, 0x1fe, 0xd4, 0x112, 0x17e, 0x52, 0x31, 0x81, 0x134, 0x2fe, 0x3c0, 0x3d1, 0x175, 0x30f, 0x288, 0x315, 0x371, 0x3d6, 0x162, 0xe, 0x2e, 0x20b, 0x145, 0x23c, 0x364, 0x36f, 0x1dc, 0x32a, 0x3b5, 0x3a4, 0x2e5, 0x31f, 0x33c, 0x2da, 0x241, 0x3db, 0x33d, 0x1be, 0x12e, 0x207, 0x17, 0x20b, 0x28a, 0xe2, 0x308, 0x137, 0x50, 0x2a3, 0xd3, 0x20a, 0x1ee, 0x38d, 0x2d4, 0x21d, 0x3e5, 0x107, 0x236, 0x115, 0x2d2, 0x157, 0x95, 0x1c6, 0xd8, 0xb9, 0x318, 0x312, 0x2c5, 0x35c, 0x21f, 0x124, 0x3d0, 0x18e, 0x348, 0x1b1, 0x216, 0x156, 0x3f1, 0x2a9, 0x104, 0x393, 0xad, 0xb6, 0x20, 0x43, 0x123, 0x3fe, 0x191, 0x255, 0x75, 0xf, 0x338, 0x351, 0x3e6, 0xa2, 0x38e, 0x371, 0x3a5, 0x181, 0x70, 0x2e0, 0x1f0, 0x1f4, 0x7f, 0x1d8, 0x2a1, 0x212, 0xdd, 0x256, 0x1d0, 0x1b7, 0x15c, 0x226, 0x330, 0x47, 0xa8, 0x259, 0x2e8, 0x2e6, 0x2ba, 0x284, 0xbe, 0x336, 0x30d, 0x3d8, 0x298, 0x6, 0x34a, 0x370, 0xc1, 0x2ee, 0x1ac, 0x1ca, 0x245, 0x250, 0x29a, 0x2c7, 0x19d, 0xc8, 0x2c1, 0x1a7, 0x2fb, 0x2cc, 0x255, 0xea, 0x3c, 0x1f6, 0x175, 0x27, 0xda, 0xf9, 0x335, 0x159, 0x192, 0x3e9, 0x33d, 0x37c, 0xb1, 0x1c, 0x170, 0x1f0, 0x3e8, 0x1fc, 0x2db, 0x24a, 0x2d0, 0x325, 0x11a, 0x3d4, 0xa, 0x3ae, 0x26d, 0x20a, 0x3dc, 0x22f, 0x28d, 0x198, 0x47, 0x150, 0x176, 0x36d, 0x233, 0x3fd, 0x68, 0x3af, 0xac, 0x3ad, 0x127, 0xe3, 0xd8, 0x172, 0x7b, 0xa6, 0x3, 0x34a, 0x2e9, 0x304, 0x35d, 0x2f6, 0x13e, 0x44, 0x21a, 0x39f, 0x69, 0x16e, 0x10b, 0x156, 0x3eb, 0x2b6, 0x32, 0x14e, 0x18d, 0x1d3, 0x24, 0x390, 0x210, 0x31, 0x204, 0x364, 0x2d7, 0x379, 0x166, 0x32e, 0x75, 0x1e, 0xfb, 0x2be, 0x217, 0x6d, 0x278, 0x39e, 0x2a8, 0xc9, 0x3f0, 0x39a, 0x1be, 0x25c, 0xe, 0xb8, 0xf8, 0x1f4, 0xfe, 0x369, 0x125, 0x168, 0x396, 0x8d, 0x1ea, 0x5, 0x1d7, 0x332, 0x105, 0x1ee, 0x18b, 0x295, 0x3f5, 0x93, 0x222, 0x2fe, 0x23f, 0x195, 0x363, 0x11f, 0xf, 0xfb, 0x175, 0x4e, 0x368, 0x3c1, 0x33c, 0x37a, 0x51, 0x315, 0x3be, 0x55, 0x130, 0x1f8, 0x39a, 0x37c, 0x162, 0x70, 0x392, 0x33f, 0x1e7, 0x3e7, 0x303, 0x20b, 0x23a, 0x23b, 0x3b0, 0x125, 0x2d0, 0x243, 0x61, 0x29f, 0xa0, 0x135, 0x256, 0x349, 0x346, 0x3bd, 0x2c8, 0x286, 0x1ee, 0x22f, 0x113, 0x269, 0x238, 0x12d, 0x293, 0x2c6, 0x3f6, 0x20e, 0x194, 0x2e8, 0x38a, 0x3fa, 0x68, 0x357, 0x2b0, 0x157, 0x254, 0x5f, 0x265, 0x5e, 0x3ee, 0x2cb, 0x1b, 0x258, 0x239, 0xa6, 0x6, 0x133, 0x365, 0x2c, 0x36a, 0xd7, 0x21f, 0x99, 0x177, 0x358, 0x24b, 0x22, 0x21a, 0x337, 0x1a4, 0x362, 0x94, 0x29a, 0x30e, 0x1e6, 0x26c, 0x196, 0x1fe, 0x2a9, 0x19, 0x14e, 0x31a, 0x345, 0x120, 0x17e, 0x290, 0x5b, 0x40, 0x218, 0x21, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,}; + +#endif diff --git a/crypto_kem/hqc-128/avx2/api.h b/crypto_kem/hqc-128/avx2/api.h new file mode 100644 index 00000000..8b53d235 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/api.h @@ -0,0 +1,25 @@ +#ifndef PQCLEAN_HQC128_AVX2_API_H +#define PQCLEAN_HQC128_AVX2_API_H +/** + * @file api.h + * @brief NIST KEM API used by the HQC_KEM IND-CCA2 scheme + */ + +#define PQCLEAN_HQC128_AVX2_CRYPTO_ALGNAME "HQC-128" + +#define PQCLEAN_HQC128_AVX2_CRYPTO_SECRETKEYBYTES 3064 +#define PQCLEAN_HQC128_AVX2_CRYPTO_PUBLICKEYBYTES 3024 +#define PQCLEAN_HQC128_AVX2_CRYPTO_BYTES 64 +#define PQCLEAN_HQC128_AVX2_CRYPTO_CIPHERTEXTBYTES 6017 + +// As a technicality, the public key is appended to the secret key in order to respect the NIST API. +// Without this constraint, PQCLEAN_HQC128_AVX2_CRYPTO_SECRETKEYBYTES would be defined as 32 + +int PQCLEAN_HQC128_AVX2_crypto_kem_keypair(unsigned char *pk, unsigned char *sk); + +int PQCLEAN_HQC128_AVX2_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk); + +int PQCLEAN_HQC128_AVX2_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-128/avx2/bch.c b/crypto_kem/hqc-128/avx2/bch.c new file mode 100644 index 00000000..8ba6050e --- /dev/null +++ b/crypto_kem/hqc-128/avx2/bch.c @@ -0,0 +1,367 @@ +#include "alpha_table.h" +#include "bch.h" +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include "vector.h" +#include +#include +#include +/** + * @file bch.c + * Constant time implementation of BCH codes + */ + + +static uint16_t mod(uint16_t i, uint16_t modulus); +static void compute_cyclotomic_cosets(uint16_t *cosets, uint16_t upper_bound); +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes); +static void message_from_codeword(uint64_t *message, const uint64_t *codeword); +static void compute_syndromes(__m256i *syndromes, const uint64_t *rcv); +static void compute_roots(uint64_t *error, const uint16_t *sigma); + +/** + * @brief Returns i modulo the given modulus. + * + * i must be less than 2*modulus. + * Therefore, the return value is either i or i-modulus. + * @returns i mod (modulus) + * @param[in] i The integer whose modulo is taken + * @param[in] modulus The modulus + */ +static uint16_t mod(uint16_t i, uint16_t modulus) { + uint16_t tmp = i - modulus; + + // mask = 0xffff if(i < PARAM_GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & modulus); +} + + + +/** + * @brief Computes the odd binary cyclotomic cosets modulo 2^m-1 for integers less than upper_bound. + * + * The array cosets of size 2^m-1 is filled by placing at index i the coset representative of i. + * @param[out] cosets Array receiving the coset representatives + * @param[in] upper_bound The upper bound + */ +static void compute_cyclotomic_cosets(uint16_t *cosets, uint16_t upper_bound) { + // Compute the odd cyclotomic classes + for (uint16_t i = 1 ; i < upper_bound ; i += 2) { + if (cosets[i] == 0) { // If i does not already belong to a class + uint16_t tmp = i; + size_t j = PARAM_M; + cosets[i] = i; + while (--j) { // Complete i's class + tmp = mod(2 * tmp, PARAM_GF_MUL_ORDER); + cosets[tmp] = i; + } + } + } +} + + + +/** + * @brief Computes the generator polynomial of the primitive BCH code with given parameters. + * + * Code length is 2^m-1.
+ * Parameter t is the targeted correction capacity of the code + * and receives the real correction capacity (which is at least equal to the target).
+ * exp and log are arrays giving antilog and log of GF(2^m) elements. + * @returns the degree of the generator polynomial + * @param[out] bch_poly Array of size (m*t + 1) receiving the coefficients of the generator polynomial + * @param[in,out] t Targeted correction capacity; receives the real correction capacity + * @param[in] exp Antilog table of GF(2^m) + * @param[in] log Log table of GF(2^m) + */ +size_t PQCLEAN_HQC128_AVX2_compute_bch_poly(uint16_t *bch_poly, size_t *t, const uint16_t *exp, const uint16_t *log) { + uint16_t cosets[PARAM_GF_MUL_ORDER]; + size_t deg_bch_poly = 0; + + memset(cosets, 0, 2 * PARAM_GF_MUL_ORDER); + compute_cyclotomic_cosets(cosets, 2 * *t); + + // Start with bch_poly(X) = 1 + bch_poly[0] = 1; + + for (uint16_t i = 1 ; i < PARAM_GF_MUL_ORDER ; ++i) { + if (cosets[i] == 0) { + continue; + } + + // Multiply bch_poly(X) by X-a^i + for (size_t j = deg_bch_poly ; j ; --j) { + int16_t mask = -((uint16_t) - bch_poly[j] >> 15); + bch_poly[j] = (mask & exp[mod(log[bch_poly[j]] + i, PARAM_GF_MUL_ORDER)]) ^ bch_poly[j - 1]; + } + bch_poly[0] = exp[mod(log[bch_poly[0]] + i, PARAM_GF_MUL_ORDER)]; + bch_poly[++deg_bch_poly] = 1; + } + + // Determine the real correction capacity + while (cosets[2 * *t + 1] != 0) { + ++*t; + } + + return deg_bch_poly; +} + + + +/** + * @brief Computes the values alpha^ij for decoding syndromes + * + * function to initialize a table which contains values alpha^ij for i in [0,N1[ and j in [1,2*PARAM_DELTA] + * these values are used in order to compute the syndromes of the received word v(x)=v_0+v_1x+...+v_{n1-1}x^{n1-1} + * value alpha^ij is stored in alpha_ij_table[2*PARAM_DELTA*i+j-1] + * The syndromes are equal to v(alpha^k) for k in [1,2*PARAM_DELTA] + * Size of the table is fixed to match 256 bit representation + * Useless values are filled with 0. + * + * @param[in] exp Exp look-up-table of GF + */ +void PQCLEAN_HQC128_AVX2_table_alphaij_generation(const uint16_t *exp) { + int32_t tmp_value; + int16_t *alpha_tmp; + + // pre-computation of alpha^ij for i in [0, N1[ and j in [1, 2*PARAM_DELTA] + // see comment of alpha_ij_table_init() function. + for (uint16_t i = 0; i < PARAM_N1 ; ++i) { + tmp_value = 0; + alpha_tmp = table_alpha_ij + i * (PARAM_DELTA << 1); + for (uint16_t j = 0 ; j < (PARAM_DELTA << 1) ; j++) { + tmp_value = PQCLEAN_HQC128_AVX2_gf_mod(tmp_value + i); + alpha_tmp[j] = exp[tmp_value]; + } + } +} + + + +/** + * @brief Computes the error locator polynomial (ELP) sigma + * + * This is a constant time implementation of Berlekamp's simplified algorithm (see @cite joiner1995decoding).
+ * We use the letter p for rho which is initialized at -1/2.
+ * The array X_sigma_p represents the polynomial X^(2(mu-rho))*sigma_p(X).
+ * Instead of maintaining a list of sigmas, we update in place both sigma and X_sigma_p.
+ * sigma_copy serves as a temporary save of sigma in case X_sigma_p needs to be updated.
+ * We can properly correct only if the degree of sigma does not exceed PARAM_DELTA. + * This means only the first PARAM_DELTA + 1 coefficients of sigma are of value + * and we only need to save its first PARAM_DELTA - 1 coefficients. + * + * @returns the degree of the ELP sigma + * @param[out] sigma Array of size (at least) PARAM_DELTA receiving the ELP + * @param[in] syndromes Array of size (at least) 2*PARAM_DELTA storing the syndromes + */ +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes) { + sigma[0] = 1; + size_t deg_sigma = 0; + size_t deg_sigma_p = 0; + uint16_t sigma_copy[PARAM_DELTA - 1] = {0}; + size_t deg_sigma_copy = 0; + uint16_t X_sigma_p[PARAM_DELTA + 1] = {0, 1}; + int32_t pp = -1; // 2*rho + uint16_t d_p = 1; + uint16_t d = syndromes[0]; + + for (size_t mu = 0 ; mu < PARAM_DELTA ; ++mu) { + // Save sigma in case we need it to update X_sigma_p + memcpy(sigma_copy, sigma, 2 * (PARAM_DELTA - 1)); + deg_sigma_copy = deg_sigma; + + uint16_t dd = PQCLEAN_HQC128_AVX2_gf_mul(d, PQCLEAN_HQC128_AVX2_gf_inverse(d_p)); // 0 if(d == 0) + for (size_t i = 1 ; (i <= 2 * mu + 1) && (i <= PARAM_DELTA) ; ++i) { + sigma[i] ^= PQCLEAN_HQC128_AVX2_gf_mul(dd, X_sigma_p[i]); + } + + size_t deg_X = 2 * mu - pp; // 2*(mu-rho) + size_t deg_X_sigma_p = deg_X + deg_sigma_p; + + // mask1 = 0xffff if(d != 0) and 0 otherwise + int16_t mask1 = -((uint16_t) - d >> 15); + + // mask2 = 0xffff if(deg_X_sigma_p > deg_sigma) and 0 otherwise + int16_t mask2 = -((uint16_t) (deg_sigma - deg_X_sigma_p) >> 15); + + // mask12 = 0xffff if the deg_sigma increased and 0 otherwise + int16_t mask12 = mask1 & mask2; + deg_sigma = (mask12 & deg_X_sigma_p) ^ (~mask12 & deg_sigma); + + if (mu == PARAM_DELTA - 1) { + break; + } + + // Update pp, d_p and X_sigma_p if needed + pp = (mask12 & (2 * mu)) ^ (~mask12 & pp); + d_p = (mask12 & d) ^ (~mask12 & d_p); + for (size_t i = PARAM_DELTA - 1 ; i ; --i) { + X_sigma_p[i + 1] = (mask12 & sigma_copy[i - 1]) ^ (~mask12 & X_sigma_p[i - 1]); + } + X_sigma_p[1] = 0; + X_sigma_p[0] = 0; + deg_sigma_p = (mask12 & deg_sigma_copy) ^ (~mask12 & deg_sigma_p); + + // Compute the next discrepancy + d = syndromes[2 * mu + 2]; + for (size_t i = 1 ; (i <= 2 * mu + 1) && (i <= PARAM_DELTA) ; ++i) { + d ^= PQCLEAN_HQC128_AVX2_gf_mul(sigma[i], syndromes[2 * mu + 2 - i]); + } + } + + return deg_sigma; +} + + + +/** + * @brief Retrieves the message message from the codeword codeword + * + * Since we performed a systematic encoding, the message is the last PARAM_K bits of the codeword. + * + * @param[out] message Array of size VEC_K_SIZE_BYTES receiving the message + * @param[in] codeword Array of size VEC_N1_SIZE_BYTES storing the codeword + */ +static void message_from_codeword(uint64_t *message, const uint64_t *codeword) { + int32_t val = PARAM_N1 - PARAM_K; + + uint64_t mask1 = (uint64_t) (0xffffffffffffffff << val % 64); + uint64_t mask2 = (uint64_t) (0xffffffffffffffff >> (64 - val % 64)); + size_t index = val / 64; + + for (size_t i = 0 ; i < VEC_K_SIZE_64 - 1 ; ++i) { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + uint64_t message2 = (codeword[++index] & mask2) << (64 - val % 64); + message[i] = message1 | message2; + } + + // Last byte (8-val % 8 is the number of bits given by message1) + if ((PARAM_K % 64 == 0) || (64 - val % 64 < PARAM_K % 64)) { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + uint64_t message2 = (codeword[++index] & mask2) << (64 - val % 64); + message[VEC_K_SIZE_64 - 1] = message1 | message2; + } else { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + message[VEC_K_SIZE_64 - 1] = message1; + } +} + + + +/** + * @brief Computes the 2^PARAM_DELTA syndromes from the received vector vector + * + * Syndromes are the sum of powers of alpha weighted by vector's coefficients. + * These powers have been pre-computed in table_alphaPARAM_DELTA.h + * Syndromes are 16-bits long , hence we can simultaneously compute 16 syndromes + * in a 256-bit register + * + * @param[out] syndromes Array of size 2^(PARAM_FFT_T) receiving the 2*PARAM_DELTA syndromes + * @param[in] rcv Array of size VEC_N1_SIZE_BYTES storing the received word + */ +void compute_syndromes(__m256i *syndromes, const uint64_t *rcv) { + const __m256i zero_256 = _mm256_set1_epi64x(0); + const __m256i mask_one = _mm256_set_epi64x(0x0303030303030303, 0x0202020202020202, 0x0101010101010101, 0x0); + const __m256i mask_two = _mm256_set1_epi64x(-0x7FBFDFEFF7FBFDFF); + const __m256i un_256 = _mm256_set1_epi64x(1); + + __m256i y; + __m256i S; + __m256i L; + __m256i tmp_repeat; + uint32_t *aux; + int16_t *alpha_tmp; + uint32_t i; + // static variable so that it is stored in the DATA segment + // not in the STACK segment + static uint8_t tmp_array[PARAM_N1 + 4]; // +4 to control overflow due to management of 256 bits + __m256i *z = (__m256i *) tmp_array; + // vectorized version of the separation of the coordinates of the vector v in order to put each coordinate in an unsigned char + // aux is used to consider 4 elements in v at each step of the loop + aux = (uint32_t *) rcv; + for (i = 0 ; i < ((VEC_N1_SIZE_BYTES >> 2) << 2) ; i += 4) { + // duplicate aux 8 times in y , i.e y= (aux aux aux .... aux) + y = _mm256_set1_epi32(*aux); + // shuffle the bytes of y so that if aux=(a0 a1 a2 a3) + // then y = (a0 a0 a0 a0 a0 a0 a0 a0 a1 a1 a1 a1 a1 a1 a1 a1 .... a3) + y = _mm256_shuffle_epi8(y, mask_one); + // apply a mask on each byte of y to determine if jth bit of a_k is 0 or 1 + z[i >> 2] = _mm256_and_si256(y, mask_two); + aux ++; + } + + // Evaluation of the polynomial corresponding to the vector v in alpha^i for i in {1, ..., 2 * PARAM_DELTA} + for (size_t j = 0 ; j < SYND_SIZE_256 ; ++j) { + S = zero_256; + alpha_tmp = table_alpha_ij + (j << 4); + + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + tmp_repeat = _mm256_set1_epi64x((long long)(tmp_array[i] != 0)); + L = _mm256_cmpeq_epi64(tmp_repeat, un_256); + tmp_repeat = _mm256_lddqu_si256((__m256i *)(alpha_tmp + i * (PARAM_DELTA << 1))); + L = _mm256_and_si256(L, tmp_repeat); + S = _mm256_xor_si256(L, S); + } + _mm256_storeu_si256(syndromes + j, S); + } +} + + +/** + * @brief Computes the error polynomial error from the error locator polynomial sigma + * + * See function PQCLEAN_HQC128_AVX2_fft for more details. + * + * @param[out] error Array of VEC_N1_SIZE_BYTES elements receiving the error polynomial + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + */ +static void compute_roots(uint64_t *error, const uint16_t *sigma) { + uint16_t w[1 << PARAM_M] = {0}; // w will receive the evaluation of sigma in all field elements + + PQCLEAN_HQC128_AVX2_fft(w, sigma, PARAM_DELTA + 1); + PQCLEAN_HQC128_AVX2_fft_retrieve_bch_error_poly(error, w); +} + + + +/** + * @brief Decodes the received word + * + * This function relies on four steps: + *
    + *
  1. The first step, done by additive FFT transpose, is the computation of the 2*PARAM_DELTA syndromes. + *
  2. The second step is the computation of the error-locator polynomial sigma. + *
  3. The third step, done by additive FFT, is finding the error-locator numbers by calculating the roots of the polynomial sigma and takings their inverses. + *
  4. The fourth step is the correction of the errors in the received polynomial. + *
+ * For a more complete picture on BCH decoding, see Shu. Lin and Daniel J. Costello in Error Control Coding: Fundamentals and Applications @cite lin1983error + * + * @param[out] message Array of size VEC_K_SIZE_BYTES receiving the decoded message + * @param[in] vector Array of size VEC_N1_SIZE_BYTES storing the received word + */ + +void PQCLEAN_HQC128_AVX2_bch_code_decode(uint64_t *message, uint64_t *vector) { + uint16_t sigma[1 << PARAM_FFT] = {0}; + uint64_t error[(1 << PARAM_M) / 8] = {0}; + static __m256i syndromes_256[SYND_SIZE_256]; + + // Calculate the 2*PARAM_DELTA syndromes + compute_syndromes(syndromes_256, vector); + + // Compute the error locator polynomial sigma + // Sigma's degree is at most PARAM_DELTA but the FFT requires the extra room + compute_elp(sigma, (uint16_t *)syndromes_256); + + // Compute the error polynomial error + compute_roots(error, sigma); + + // Add the error polynomial to the received polynomial + PQCLEAN_HQC128_AVX2_vect_add(vector, vector, error, VEC_N1_SIZE_64); + + // Retrieve the message from the decoded codeword + message_from_codeword(message, vector); + +} diff --git a/crypto_kem/hqc-128/avx2/bch.h b/crypto_kem/hqc-128/avx2/bch.h new file mode 100644 index 00000000..ad76e362 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/bch.h @@ -0,0 +1,23 @@ +#ifndef BCH_H +#define BCH_H + + +/** + * @file bch.h + * Header file of bch.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQC128_AVX2_bch_code_decode(uint64_t *message, uint64_t *vector); + + +size_t PQCLEAN_HQC128_AVX2_compute_bch_poly(uint16_t *bch_poly, size_t *t, const uint16_t *exp, const uint16_t *log); + +void PQCLEAN_HQC128_AVX2_table_alphaij_generation(const uint16_t *exp); + + +#endif diff --git a/crypto_kem/hqc-128/avx2/code.c b/crypto_kem/hqc-128/avx2/code.c new file mode 100644 index 00000000..291845db --- /dev/null +++ b/crypto_kem/hqc-128/avx2/code.c @@ -0,0 +1,104 @@ +#include "bch.h" +#include "code.h" +#include "gen_matrix.h" +#include "parameters.h" +#include "repetition.h" +#include +#include +#include +/** + * @file code.c + * @brief Implementation of tensor code + */ + + +static inline uint64_t mux(uint64_t a, uint64_t b, int64_t bit); + +static inline uint64_t mux(uint64_t a, uint64_t b, int64_t bit) { + uint64_t ret = a ^ b; + return (ret & (-bit >> 63)) ^ a; +} + + + +/** + * + * @brief Encoding the message m to a code word em using the tensor code + * + * We encode the message using the BCH code. For each bit obtained, + * we duplicate the bit PARAM_N2 times to apply repetition code. + * BCH encoding is done using the classical mG operation, + * columns of the matrix are stored in 256-bit registers + * + * @param[out] em Pointer to an array that is the tensor code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQC128_AVX2_code_encode(uint64_t *em, const uint64_t *m) { + uint64_t res; + uint32_t i; + static const uint64_t mask[2][2] = {{0x0UL, 0x0UL}, {0x7FFFFFFFUL, 0x3FFFFFFFUL}}; + + + __m256i *colonne, y, aux0; + __m256i msg = _mm256_lddqu_si256((const __m256i *) m); + colonne = ((__m256i *) gen_matrix); + + for (i = 0 ; i < PARAM_N1 - PARAM_K ; i++) { + // y is the and operation between m and ith column of G + y = _mm256_and_si256(colonne[i], msg); + // aux0 = (y2 y3 y0 y1) + aux0 = _mm256_permute2x128_si256(y, y, 1); + // y = (y0^y2 y1^y3 y2^y0 y3^y1) + y = _mm256_xor_si256(y, aux0); + // aux0 = (y1^y3 y0^y2 y1^y3 y0^y2) + aux0 = _mm256_shuffle_epi32(y, 0x4e); + // y = (y0^y1^y2^y3 repeated 4 times) + y = _mm256_xor_si256(aux0, y); + res = _mm_popcnt_u64(_mm256_extract_epi64(y, 0)) & 1; + + + uint16_t pos_r = PARAM_N2 * i; + uint16_t idx_r = (pos_r & 0x3f); + uint64_t *p64 = em; + p64 += pos_r >> 6; + uint64_t select = mux(mask[0][0], mask[1][0], res); + *p64 ^= select << idx_r; + select = mux(mask[0][1], mask[1][1], res); + *(p64 + 1) ^= select >> ((63 - idx_r)); + } + + /* now we add the message m */ + /* systematic encoding */ + for (int32_t i = 0 ; i < 4 ; i++) { + for (int32_t j = 0 ; j < 64 ; j++) { + uint8_t bit = (m[i] >> j) & 0x1; + uint32_t pos_r = PARAM_N2 * ((PARAM_N1 - PARAM_K) + ((i << 6) + j)); + uint16_t idx_r = (pos_r & 0x3f); + uint64_t *p64 = em; + + + p64 += pos_r >> 6; + uint64_t select = mux(mask[0][0], mask[1][0], bit); + *p64 ^= select << idx_r; + select = mux(mask[0][1], mask[1][1], bit); + *(p64 + 1) ^= select >> ((63 - idx_r)); + } + } + +} + + +/** + * @brief Decoding the code word em to a message m using the tensor code + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQC128_AVX2_code_decode(uint64_t *m, const uint64_t *em) { + + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQC128_AVX2_repetition_code_decode(tmp, em); + PQCLEAN_HQC128_AVX2_bch_code_decode(m, tmp); + +} diff --git a/crypto_kem/hqc-128/avx2/code.h b/crypto_kem/hqc-128/avx2/code.h new file mode 100644 index 00000000..97f48472 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/code.h @@ -0,0 +1,20 @@ +#ifndef CODE_H +#define CODE_H + + +/** + * @file code.h + * Header file of code.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQC128_AVX2_code_encode(uint64_t *em, const uint64_t *message); + +void PQCLEAN_HQC128_AVX2_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-128/avx2/fft.c b/crypto_kem/hqc-128/avx2/fft.c new file mode 100644 index 00000000..f402d991 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/fft.c @@ -0,0 +1,333 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include +#include +#include +/** + * @file fft.c + * Implementation of the additive FFT and its transpose. + * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + */ + + +static void compute_fft_betas(uint16_t *betas); +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size); +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f); +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); + + +/** + * @brief Computes the basis of betas (omitting 1) used in the additive FFT and its transpose + * + * @param[out] betas Array of size PARAM_M-1 + */ +static void compute_fft_betas(uint16_t *betas) { + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + betas[i] = 1 << (PARAM_M - 1 - i); + } +} + + + +/** + * @brief Computes the subset sums of the given set + * + * The array subset_sums is such that its ith element is + * the subset sum of the set elements given by the binary form of i. + * + * @param[out] subset_sums Array of size 2^set_size receiving the subset sums + * @param[in] set Array of set_size elements + * @param[in] set_size Size of the array set + */ +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size) { + subset_sums[0] = 0; + + for (size_t i = 0 ; i < set_size ; ++i) { + for (size_t j = 0 ; j < (1U << i) ; ++j) { + subset_sums[(1 << i) + j] = set[i] ^ subset_sums[j]; + } + } +} + + + +/** + * @brief Computes the radix conversion of a polynomial f in GF(2^m)[x] + * + * Computes f0 and f1 such that f(x) = f0(x^2-x) + x.f1(x^2-x) + * as proposed by Bernstein, Chou and Schwabe: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f0 Array half the size of f + * @param[out] f1 Array half the size of f + * @param[in] f Array of size a power of 2 + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f) { + switch (m_f) { + case 4: + f0[4] = f[8] ^ f[12]; + f0[6] = f[12] ^ f[14]; + f0[7] = f[14] ^ f[15]; + f1[5] = f[11] ^ f[13]; + f1[6] = f[13] ^ f[14]; + f1[7] = f[15]; + f0[5] = f[10] ^ f[12] ^ f1[5]; + f1[4] = f[9] ^ f[13] ^ f0[5]; + + f0[0] = f[0]; + f1[3] = f[7] ^ f[11] ^ f[15]; + f0[3] = f[6] ^ f[10] ^ f[14] ^ f1[3]; + f0[2] = f[4] ^ f0[4] ^ f0[3] ^ f1[3]; + f1[1] = f[3] ^ f[5] ^ f[9] ^ f[13] ^ f1[3]; + f1[2] = f[3] ^ f1[1] ^ f0[3]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 3: + f0[0] = f[0]; + f0[2] = f[4] ^ f[6]; + f0[3] = f[6] ^ f[7]; + f1[1] = f[3] ^ f[5] ^ f[7]; + f1[2] = f[5] ^ f[6]; + f1[3] = f[7]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 2: + f0[0] = f[0]; + f0[1] = f[2] ^ f[3]; + f1[0] = f[1] ^ f0[1]; + f1[1] = f[3]; + return; + + case 1: + f0[0] = f[0]; + f1[0] = f[1]; + return; + + default: + ; + size_t n = 1 << (m_f - 2); + + uint16_t Q[2 * (1 << (PARAM_FFT - 2))]; + uint16_t R[2 * (1 << (PARAM_FFT - 2))]; + + uint16_t Q0[1 << (PARAM_FFT - 2)]; + uint16_t Q1[1 << (PARAM_FFT - 2)]; + uint16_t R0[1 << (PARAM_FFT - 2)]; + uint16_t R1[1 << (PARAM_FFT - 2)]; + + memcpy(Q, f + 3 * n, 2 * n); + memcpy(Q + n, f + 3 * n, 2 * n); + memcpy(R, f, 4 * n); + + for (size_t i = 0 ; i < n ; ++i) { + Q[i] ^= f[2 * n + i]; + R[n + i] ^= Q[i]; + } + + radix(Q0, Q1, Q, m_f - 1); + radix(R0, R1, R, m_f - 1); + + memcpy(f0, R0, 2 * n); + memcpy(f0 + n, Q0, 2 * n); + memcpy(f1, R1, 2 * n); + memcpy(f1 + n, Q1, 2 * n); + } +} + + + +/** + * @brief Evaluates f at all subset sums of a given set + * + * This function is a subroutine of the function fft. + * + * @param[out] w Array + * @param[in] f Array + * @param[in] f_coeffs Number of coefficients of f + * @param[in] m Number of betas + * @param[in] m_f Number of coefficients of f (one more than its degree) + * @param[in] betas FFT constants + */ +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + uint16_t f0[1 << (PARAM_FFT - 2)]; + uint16_t f1[1 << (PARAM_FFT - 2)]; + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + size_t k = 1 << (m - 1); + uint16_t gammas_sums[1 << (PARAM_M - 2)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + uint16_t tmp[PARAM_M - (PARAM_FFT - 1)]; + for (size_t i = 0 ; i < m ; ++i) { + tmp[i] = PQCLEAN_HQC128_AVX2_gf_mul(betas[i], f[1]); + } + + w[0] = f[0]; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + w[(1 << j) + k] = w[k] ^ tmp[j]; + } + } + + return; + } + + // Step 2: compute g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQC128_AVX2_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQC128_AVX2_gf_mul(beta_m_pow, f[i]); + } + } + + // Step 3 + radix(f0, f1, f, m_f); + + // Step 4: compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQC128_AVX2_gf_mul(betas[i], PQCLEAN_HQC128_AVX2_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQC128_AVX2_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + + if (f_coeffs <= 3) { // 3-coefficient polynomial f case: f1 is constant + w[0] = u[0]; + w[k] = u[0] ^ f1[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC128_AVX2_gf_mul(gammas_sums[i], f1[0]); + w[k + i] = w[i] ^ f1[0]; + } + } else { + fft_rec(v, f1, f_coeffs / 2, m - 1, m_f - 1, deltas); + + // Step 6 + memcpy(w + k, v, 2 * k); + w[0] = u[0]; + w[k] ^= u[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC128_AVX2_gf_mul(gammas_sums[i], v[i]); + w[k + i] ^= w[i]; + } + } +} + + + +/** + * @brief Evaluates f on all fields elements using an additive FFT algorithm + * + * f_coeffs is the number of coefficients of f (one less than its degree).
+ * The FFT proceeds recursively to evaluate f at all subset sums of a basis B.
+ * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf
+ * Note that on this first call (as opposed to the recursive calls to fft_rec), gammas are equal to betas, + * meaning the first gammas subset sums are actually the subset sums of betas (except 1).
+ * Also note that f is altered during computation (twisted at each level). + * + * @param[out] w Array + * @param[in] f Array of 2^PARAM_FFT elements + * @param[in] f_coeffs Number coefficients of f (i.e. deg(f)+1) + */ +void PQCLEAN_HQC128_AVX2_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs) { + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + uint16_t f0[1 << (PARAM_FFT - 1)]; + uint16_t f1[1 << (PARAM_FFT - 1)]; + uint16_t deltas[PARAM_M - 1]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)]; + uint16_t v[1 << (PARAM_M - 1)]; + + // Follows Gao and Mateer algorithm + compute_fft_betas(betas); + + // Step 1: PARAM_FFT > 1, nothing to do + + // Compute gammas sums + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + // Step 2: beta_m = 1, nothing to do + + // Step 3 + radix(f0, f1, f, PARAM_FFT); + + // Step 4: Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQC128_AVX2_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + fft_rec(v, f1, f_coeffs / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + + // Step 6, 7 and error polynomial computation + memcpy(w + k, v, 2 * k); + + // Check if 0 is root + w[0] = u[0]; + + // Check if 1 is root + w[k] ^= u[0]; + + // Find other roots + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC128_AVX2_gf_mul(betas_sums[i], v[i]); + w[k + i] ^= w[i]; + } +} + + + +/** + * @brief Retrieves the error polynomial error from the evaluations w of the ELP (Error Locator Polynomial) on all field elements. + * + * @param[out] error Array of size VEC_N1_SIZE_BYTES + * @param[in] w Array of size 2^PARAM_M + */ +void PQCLEAN_HQC128_AVX2_fft_retrieve_bch_error_poly(uint64_t *error, const uint16_t *w) { + uint16_t gammas[PARAM_M - 1]; + uint16_t gammas_sums[1 << (PARAM_M - 1)]; + size_t k = 1 << (PARAM_M - 1); + size_t index = PARAM_GF_MUL_ORDER; + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + error[0] ^= ((uint64_t) 1) ^ ((uint16_t) - w[0] >> 15); + uint64_t bit = ((uint64_t) 1) ^ ((uint16_t) - w[k] >> 15); + error[index / 8] ^= bit << (index % 64); + + for (size_t i = 1 ; i < k ; ++i) { + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQC128_AVX2_gf_log(gammas_sums[i]); + bit = ((uint64_t) 1) ^ ((uint16_t) - w[i] >> 15); + error[index / 64] ^= bit << (index % 64); + + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQC128_AVX2_gf_log(gammas_sums[i] ^ 1); + bit = ((uint64_t) 1) ^ ((uint16_t) - w[k + i] >> 15); + error[index / 64] ^= bit << (index % 64); + } +} diff --git a/crypto_kem/hqc-128/avx2/fft.h b/crypto_kem/hqc-128/avx2/fft.h new file mode 100644 index 00000000..d7ca1b74 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/fft.h @@ -0,0 +1,20 @@ +#ifndef FFT_H +#define FFT_H + + +/** + * @file fft.h + * Header file of fft.c + */ + +#include + +#include +#include + +void PQCLEAN_HQC128_AVX2_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs); + +void PQCLEAN_HQC128_AVX2_fft_retrieve_bch_error_poly(uint64_t *error, const uint16_t *w); + + +#endif diff --git a/crypto_kem/hqc-128/avx2/gen_matrix.h b/crypto_kem/hqc-128/avx2/gen_matrix.h new file mode 100644 index 00000000..2db7c74b --- /dev/null +++ b/crypto_kem/hqc-128/avx2/gen_matrix.h @@ -0,0 +1,16 @@ +#ifndef GEN_MATRIX_H +#define GEN_MATRIX_H + + +/** + * @file gen_matrix.h + * Header file that contain precomputed generator matrix of the BCH code defined in the file parameters.h + */ + +#include "parameters.h" +#include "parameters.h" + + +uint64_t gen_matrix[(PARAM_N1 - PARAM_K) * 4] = {0x9901f502cd17fcafUL, 0xd2f8231a9952fc37UL, 0xb2a55153e9eb5bffUL, 0xb1c0755014aa5204UL, 0xab021f07573805f1UL, 0x7708652fabf70458UL, 0xd7eff3f43a3dec00UL, 0xd2409ff03dfef60dUL, 0x56043e0eae700be2UL, 0xee10ca5f57ee08b1UL, 0xafdfe7e8747bd800UL, 0xa4813fe07bfdec1bUL, 0xac087c1d5ce017c4UL, 0xdc2194beafdc1162UL, 0x5fbfcfd0e8f7b001UL, 0x49027fc0f7fbd837UL, 0x5810f83ab9c02f88UL, 0xb843297d5fb822c5UL, 0xbf7f9fa1d1ef6003UL, 0x9204ff81eff7b06eUL, 0xb021f07573805f10UL, 0x708652fabf70458aUL, 0x7eff3f43a3dec007UL, 0x2409ff03dfef60ddUL, 0xf94215e82a17428fUL, 0x33f486efe7b27722UL, 0x4f5b2fd4ae56dbf1UL, 0xf9d38b57ab7493beUL, 0xf2842bd0542e851eUL, 0x67e90ddfcf64ee45UL, 0x9eb65fa95cadb7e2UL, 0xf3a716af56e9277cUL, 0xe50857a0a85d0a3cUL, 0xcfd21bbf9ec9dc8bUL, 0x3d6cbf52b95b6fc4UL, 0xe74e2d5eadd24ef9UL, 0x53115a439dade8d7UL, 0x4d5c1465a4c14520UL, 0xc87c2ff69b5d8476UL, 0x7f5c2fed4f0ecff6UL, 0x3f234185f64c2d01UL, 0x48400bd1d0d07677UL, 0x225d0ebedf505313UL, 0x4f782a8a8ab7cde9UL, 0x7e46830bec985a02UL, 0x908017a3a1a0eceeUL, 0x44ba1d7dbea0a626UL, 0x9ef05515156f9bd2UL, 0x658cf315142748abUL, 0xf3f80c5dda1325ebUL, 0x3bd16ba894aa17b2UL, 0x8c20df7a3e7565a0UL, 0x52181328e5596df9UL, 0x35083ba12d74b7e1UL, 0xc5078602c0bf749aUL, 0xa981cba468409944UL, 0xa4302651cab2dbf2UL, 0x6a1077425ae96fc2UL, 0x8a0f0c05817ee934UL, 0x53039748d0813289UL, 0xd161b9a158724b4bUL, 0x6d8cd9e2c8023b2UL, 0xa6bb4958eb168997UL, 0x17c75bc1b5a83717UL, 0xa2c37342b0e49696UL, 0xdb19b3c59004765UL, 0x4d7692b1d62d132eUL, 0x2f8eb7836b506e2fUL, 0xdc871387acded183UL, 0xc99b15622b5272fcUL, 0x2848743045b17da3UL, 0xeedd1a56c20a8e5aUL, 0x200fd20d94aa5fa9UL, 0x41ce09decff619ceUL, 0xe235b9336289a0b8UL, 0x6c7a41fd90bf4eb0UL, 0x401fa41b2954bf52UL, 0x839c13bd9fec339cUL, 0xc46b7266c5134170UL, 0xd8f483fb217e9d61UL, 0x803f483652a97ea4UL, 0x738277b3fd86738UL, 0x88d6e4cd8a2682e1UL, 0xb1e907f642fd3ac3UL, 0x997f656e684501e7UL, 0xdc886dece6e23246UL, 0xa30898c8fda65e3dUL, 0xd2127abc91502783UL, 0x32fecadcd08a03ceUL, 0xb910dbd9cdc4648dUL, 0x46113191fb4cbc7bUL, 0xa424f57922a04f07UL, 0x65fd95b9a114079cUL, 0x7221b7b39b88c91aUL, 0x8c226323f69978f7UL, 0x4849eaf245409e0eUL, 0x52fade718f3ff397UL, 0x36bb4c7dae436e03UL, 0xaae1971404d9aa11UL, 0x2153a0b49e2b6e19UL, 0x3cf449e1d3681b81UL, 0xbf8ebbe1c5d42031UL, 0xe7667f7be0580fddUL, 0xf367343928fc8e37UL, 0xe0e966c16bc7cbadUL, 0xade554d912fabc55UL, 0x7c69afa4295b4444UL, 0x570e1d2245534e6bUL, 0x58d338801a986bf5UL, 0x89328aa8bca7849cUL, 0x4a760e1bbb5dd376UL, 0x1fdc4f149e0cced2UL, 0x28a78402f8272b45UL, 0xc09d364be01df50fUL, 0x26494d649f50fd12UL, 0x8e78eb7928b3cfa0UL, 0xc84efd073d59aa25UL, 0x53c24f8d59691629UL, 0xfe37cb9ad74aa1daUL, 0xad31a3a245cdcd44UL, 0x909dfa0e7ab3544aUL, 0xa7849f1ab2d22c53UL, 0xfc6f9735ae9543b4UL, 0x5a6347448b9b9a89UL, 0x213bf41cf566a894UL, 0x4f093e3565a458a7UL, 0xf8df2e6b5d2a8769UL, 0xb4c68e8917373513UL, 0xdb761d3b27daad87UL, 0x4cea5f70521a4d79UL, 0x431b0d8553be552dUL, 0xd84d68423ac43823UL, 0x2fedcf7482a2a7a1UL, 0x4b2c9dfa3d6666c4UL, 0x34934a594e97f1a5UL, 0x15aa5d461222242UL, 0x5fdb9ee905454f42UL, 0x96593bf47acccd88UL, 0x692694b29d2fe34aUL, 0x2b54ba8c2444484UL, 0x26b6c8d0c79d622bUL, 0xfe4a54f26ccb6727UL, 0x60e87836d3b49d6aUL, 0xb4aae2019022db0cUL, 0xd46c64a3422d38f9UL, 0x2e6c8afe40c43279UL, 0x7375a13e4e82612aUL, 0xd895b15334efe41cUL, 0x31d93c44494d8d5dUL, 0x8e2136e618da98c4UL, 0x544e132f74ef99abUL, 0xeb17f67d759a3cUL, 0xfab38d8a5f8ce615UL, 0xceba4ed6a8e7cdbfUL, 0x1a39770d003468a8UL, 0xb0165abcee41667cUL, 0xf5671b14bf19cc2aUL, 0x9d749dad51cf9b7fUL, 0x3472ee1a0068d151UL, 0x602cb579dc82ccf8UL, 0x73cfc32bb32464fbUL, 0xe81118403acdcac8UL, 0xda408d67e93af95cUL, 0x71991fa3adafcbf4UL, 0x7e9e7355ab5f3559UL, 0x2da139aecc969a7UL, 0x6244b9c3b9ea946UL, 0x52f24a174ff5c5edUL, 0x643d13a99ba9961dUL, 0xd74c042f40c02f79UL, 0xbeedc66b9ed60973UL, 0x1424e17e8b41d9deUL, 0x517bd251fa44d095UL, 0x7c602b4418d2a2c5UL, 0xcf7edd84d4474918UL, 0x9989b7ad0229e1b9UL, 0xa2f7a4a3f489a12aUL, 0xf8c0568831a5458aUL, 0x9efdbb09a88e9230UL, 0x33136f5a0453c373UL, 0xdceebc452404befbUL, 0x23788e0afa187722UL, 0x8f5e2740b8f67f9eUL, 0xd7e6abe41c0dd4e3UL, 0xb9dd788a48097df6UL, 0x46f11c15f430ee45UL, 0x1ebc4e8171ecff3cUL, 0xafcd57c8381ba9c7UL, 0x73baf1149012fbecUL, 0x8de2382be861dc8bUL, 0x3d789d02e3d9fe78UL, 0x5f9aaf907037538eUL, 0xe775e2292025f7d8UL, 0x1bc47057d0c3b916UL, 0x7af13a05c7b3fcf1UL, 0xbf355f20e06ea71cUL, 0x57ea31508d5c131fUL, 0xe570c3b538d58e1aUL, 0x47472558668ca21dUL, 0xcfaacb11d4771c3cUL, 0xafd462a11ab8263eUL, 0xcae1876a71ab1c34UL, 0x8e8e4ab0cd19443bUL, 0x9f559623a8ee3878UL, 0x5fa8c54235704c7cUL, 0x95c30ed4e3563869UL, 0x1d1c95619a328877UL, 0x3eab2c4751dc70f1UL, 0x26507f86a7f76457UL, 0xf97e3eb35ffe8ce5UL, 0x889c7b90dd8e4b10UL, 0xcc962ddeb712b3e6UL, 0xd5a10a0f82f93401UL, 0x20045e7c26afe5fdUL, 0xa39da67252f7cddeUL, 0x28ec2eed7a8f35c9UL, 0x3243e11dc8e594adUL, 0x92f09fe2d40d37ccUL, 0xf59e1db74c04c043UL, 0xe018288ae1b43997UL, 0x6487c23b91cb295aUL, 0x25e13fc5a81a6f98UL, 0xeb3c3b6e98098087UL, 0xc0305115c368732fUL, 0x500e7175ee81ae1bUL, 0x993a5c91c9662307UL, 0x64dd278ed9f85af1UL, 0x31a0d77b927ab45bUL, 0x391d17e91014a099UL, 0xe08c9a390b9eba39UL, 0x7b1f1e4e5a1bee1cUL, 0xd281dba7305f3ab2UL, 0x723a2fd220294132UL, 0xc1193472173d7472UL, 0xf63e3c9cb437dc39UL, 0xa503b74e60be7564UL, 0x7d75aaa68d457ecbUL, 0x50ca4bfeb72814d3UL, 0x5ed9286a8184e38cUL, 0xfbc71bccd5d6b8cdUL, 0xfaeb554d1a8afd96UL, 0xa19497fd6e5029a6UL, 0xbdb250d50309c718UL, 0xf78e3799abad719aUL, 0x6cd75f98f8020783UL, 0x91d10ce045f2af7aUL, 0xc9c1f0f9eff8d5ceUL, 0x5edc1a6343f0b131UL, 0x40af4a333d13f3a9UL, 0xf15a3ada12b7a2c3UL, 0x2126b0a0361af062UL, 0xc784196934b3067UL, 0x185f6164b7301bfdUL, 0x304c56aebc3db9b1UL, 0xf0e8301385debb3aUL, 0xa930f67d323c32caUL, 0x30bec2c96e6037faUL, 0x6098ad5d787b7362UL, 0xe1d060270bbd7674UL, 0x5261ecfa64786595UL, 0xf87c709011d7935bUL, 0x13c979a069a41af3UL, 0x7105911dfe91b717UL, 0x1503aca4dc5a992fUL, 0xf0f8e12023af26b6UL, 0x2792f340d34835e7UL, 0xe20b223bfd236e2eUL, 0x2a075949b8b5325eUL, 0x78f037428a49b1c3UL, 0x9dddc59b3fc297f8UL, 0x76b3152413ad87a3UL, 0xe5cec7c365c036b9UL, 0xf1e06e8514936386UL, 0x3bbb8b367f852ff0UL, 0xed662a48275b0f47UL, 0xcb9d8f86cb806d72UL, 0xe3c0dd0a2926c70cUL, 0x7777166cff0a5fe1UL, 0xdacc54904eb61e8eUL, 0x973b1f0d9700dae5UL, 0x5e804f169f5a72b7UL, 0x3c160fc3674643f4UL, 0x73df873748766e3UL, 0x9fb64b4b3aabe7cfUL, 0xbd009e2d3eb4e56eUL, 0x782c1f86ce8c87e8UL, 0xe7bf0e6e90ecdc6UL, 0x3f6c96967557cf9eUL, 0x7a013c5a7d69cadcUL, 0xf0583f0d9d190fd1UL, 0x1cf7e1cdd21d9b8cUL, 0x7ed92d2ceaaf9f3cUL, 0xf40278b4fad395b8UL, 0xe0b07e1b3a321fa2UL, 0x39efc39ba43b3719UL, 0xfdb25a59d55f3e78UL, 0xe804f169f5a72b70UL, 0xc160fc3674643f45UL, 0x73df873748766e33UL, 0xfb64b4b3aabe7cf0UL, 0x490817d12659aa4fUL, 0x5039db76719a82bcUL, 0x551a5f3d79078798UL, 0x47091c3741d6abe4UL, 0xb11daa081a4a831UL, 0x728b95f67a67f94fUL, 0x1891ef291be454cfUL, 0x3fd24d3e970705ccUL, 0x8f224043ce5eaccdUL, 0x37ef08f66d9d0ea9UL, 0x83868f01de23f261UL, 0xce64ef2d3aa4599cUL, 0x8745758551aaa535UL, 0xbd2632f64268e164UL, 0xb5a84f5055acbf3dUL, 0x2d09ab0a61e2e13dUL, 0xe8aeb0aa3554a6aUL, 0x7a4c65ec84d1c2c9UL, 0x6b509ea0ab597e7bUL, 0x5a135614c3c5c27bUL, 0x841423178bbd687bUL, 0x2660e8c390f179a5UL, 0x64046c12bf59a709UL, 0x5e6d9799321d6f2UL, 0x9129b32dda6d2c59UL, 0x9e39f29db8b00f7cUL, 0x7aad8976975815edUL, 0xba0dc7a332e9ffe0UL, 0xbb52935979cda41dUL, 0xee8bc621e832e2ceUL, 0x47fe43bec75b7024UL, 0xc5dbfa167179adc4UL, 0xefa4d3b03e8cb495UL, 0xfefaf59493739aaUL, 0x3d59d62e675dbbb6UL, 0x3a77817cf659098cUL, 0x46485262b00e9585UL, 0xcd277da80b3c8f62UL, 0xc816fd0f27502c93UL, 0xc52f77a9f818411cUL, 0x8c90a4c5601d2b0aUL, 0x9a4efb5016791ec4UL, 0x902dfa1e4ea05927UL, 0x8a5eef53f0308239UL, 0x1921498ac03a5614UL, 0x349df6a02cf23d89UL, 0x205bf43c9d40b24fUL, 0x14bddea7e0610473UL, 0x324293158074ac28UL, 0x693bed4059e47b12UL, 0x40b7e8793a81649eUL, 0x297bbd4fc0c208e6UL, 0x6485262b00e95850UL, 0xd277da80b3c8f624UL, 0x816fd0f27502c93cUL, 0x52f77a9f818411ccUL, 0x500bb954ccc54c0fUL, 0x7617961bfec3107fUL, 0xb07af0b703eec986UL, 0x142e806f17a2719dUL, 0xa01772a9998a981eUL, 0xec2f2c37fd8620feUL, 0x60f5e16e07dd930cUL, 0x285d00de2f44e33bUL, 0x402ee5533315303cUL, 0xd85e586ffb0c41fdUL, 0xc1ebc2dc0fbb2619UL, 0x50ba01bc5e89c676UL, 0x195c3fa4ab3d9cd7UL, 0x624493c56f4a7fcdUL, 0x3172d4ebf69d17ccUL, 0x10b47628a9b9dee9UL, 0x32b87f49567b39aeUL, 0xc489278ade94ff9aUL, 0x62e5a9d7ed3a2f98UL, 0x2168ec515373bdd2UL, 0x6570fe92acf6735cUL, 0x89124f15bd29ff34UL, 0xc5cb53afda745f31UL, 0x42d1d8a2a6e77ba4UL, 0x53e0082794fb1a17UL, 0xc0dcbd31e301025fUL, 0x3933f60c5d03e59cUL, 0x3463c4155964a54dUL, 0x3ec1e54de4e1c881UL, 0x534159795f50f889UL, 0xc0c2bd4b53ec90c6UL, 0xd907fd7aa663189eUL, 0xe4823f9904d46dadUL, 0x747a91e827f30d25UL, 0x33202bc54e327a73UL, 0x3cf8fa5586c6339UL, 0xc9047f3209a8db5aUL, 0xe8f523d04fe61a4bUL, 0x6640578a9c64f4e6UL, 0x79f1f4ab0d8c672UL, 0x9208fe641351b6b4UL, 0xd1ea47a09fcc3497UL, 0xcc80af1538c9e9cdUL, 0xf3e3e9561b18ce4UL, 0x2411fcc826a36d68UL, 0xa3d48f413f98692fUL, 0x99015e2a7193d39bUL, 0x1e7c7d2ac36319c9UL, 0xd1220c928051267fUL, 0x95513d98e6622e69UL, 0x80a7ed070accfcc8UL, 0x8d388f05926c6197UL, 0x3b45ec27cdb5b051UL, 0xf85a582b5596a0e4UL, 0xb3ea8b5dfc72a26eUL, 0xabb16b5b3072912bUL, 0x768bd84f9b6b60a2UL, 0xf0b4b056ab2d41c8UL, 0x67d516bbf8e544ddUL, 0x5762d6b660e52257UL, 0xed17b09f36d6c144UL, 0xe16960ad565a8390UL, 0xcfaa2d77f1ca89bbUL, 0xaec5ad6cc1ca44aeUL, 0x432e943ca0ba7e27UL, 0x102ae24035e7fb16UL, 0x2df10bbc0a7e4888UL, 0xec4b2f89973edb59UL, 0x865d28794174fc4eUL, 0x2055c4806bcff62cUL, 0x5be2177814fc9110UL, 0xd8965f132e7db6b2UL, 0x95bba5f04ffe0433UL, 0x9253aa1a4ecd106eUL, 0x5617fa3c01279dfUL, 0xeccb7648513f60UL, 0x2b774be09ffc0866UL, 0x24a754349d9a20ddUL, 0xac2ff478024f3bfUL, 0x1d996ec90a27ec0UL, 0x56ee97c13ff810ccUL, 0x494ea8693b3441baUL, 0x1585fe8f0049e77eUL, 0x3b32dd92144fd80UL, 0xaddd2f827ff02198UL, 0x929d50d276688374UL, 0x2b0bfd1e0093cefcUL, 0x7665bb24289fb00UL, 0xc2bbaa0632f7bf9fUL, 0xf7c282be7583fadeUL, 0xe4b2ab6fe8ccc606UL, 0xbf0cc23491b9a404UL, 0x8577540c65ef7f3eUL, 0xef85057ceb07f5bdUL, 0xc96556dfd1998c0dUL, 0x7e19846923734809UL, 0xaeea818cbdefe7cUL, 0xdf0a0af9d60feb7bUL, 0x92caadbfa333181bUL, 0xfc3308d246e69013UL, 0x15dd503197bdfcf8UL, 0xbe1415f3ac1fd6f6UL, 0x25955b7f46663037UL, 0xf86611a48dcd2027UL, 0x2bbaa0632f7bf9f0UL, 0x7c282be7583fadecUL, 0x4b2ab6fe8ccc606fUL, 0xf0cc23491b9a404eUL, 0xce74b5c493e00f4fUL, 0x2aa874d4292da7efUL, 0x24f03caef0739b21UL, 0x505833c2239ed298UL, 0x9ce96b8927c01e9eUL, 0x5550e9a8525b4fdfUL, 0x49e0795de0e73642UL, 0xa0b06784473da530UL, 0x39d2d7124f803d3cUL, 0xaaa1d350a4b69fbfUL, 0x93c0f2bbc1ce6c84UL, 0x4160cf088e7b4a60UL, 0x73a5ae249f007a78UL, 0x5543a6a1496d3f7eUL, 0x2781e577839cd909UL, 0x82c19e111cf694c1UL, 0x7e4aa94bf317085fUL, 0x787f6e580b8882cbUL, 0xfda69bbceed2e9edUL, 0xb44349722d477b86UL, 0xfc955297e62e10beUL, 0xf0fedcb017110596UL, 0xfb4d3779dda5d3daUL, 0x688692e45a8ef70dUL, 0x602b502d014bddd3UL, 0x33059a7ab770f71aUL, 0x443f3fa052a0fc4aUL, 0x60cd5098a1b7bc1fUL, 0x59575558cf804709UL, 0xb4f317eff7b31203UL, 0x3adb2e134caaa36bUL, 0x705ad46157c52a3aUL, 0xb2aeaab19f008e12UL, 0x69e62fdfef662406UL, 0x75b65c26995546d7UL, 0xe0b5a8c2af8a5474UL, 0x655d55633e011c24UL, 0xd3cc5fbfdecc480dUL, 0xeb6cb84d32aa8daeUL, 0xc16b51855f14a8e8UL, 0xcabaaac67c023848UL, 0xa798bf7fbd98901aUL, 0xd6d9709a65551b5dUL, 0x82d6a30abe2951d1UL, 0x9575558cf8047090UL, 0x4f317eff7b312035UL, 0xadb2e134caaa36bbUL, 0x5ad46157c52a3a3UL, 0xb3eb5e1b3d1f1d8fUL, 0x4c9adee46f30bc5cUL, 0xe9c0933a7cbf3689UL, 0xba9af97aec0f1543UL, 0xfed74934b729c7b1UL, 0x4bcd9ed24733848eUL, 0x61247727109536edUL, 0xc4f587a5ccb47883UL, 0xfdae92696e538f62UL, 0x979b3da48e67091dUL, 0xc248ee4e212a6ddaUL, 0x89eb0f4b9968f106UL, 0xfb5d24d2dca71ec4UL, 0x2f367b491cce123bUL, 0x8491dc9c4254dbb5UL, 0x13d61e9732d1e20dUL, 0x6fbbbca77459c127UL, 0x8c94d588a0ced840UL, 0xbb86e86b6d42ec95UL, 0x966c487e7109961fUL, 0x46768c4c25a47ee1UL, 0xcbd1880bd8cf4cb7UL, 0xc5a88185336e82d4UL, 0x9d18e5acf6b97e3bUL, 0x8ced18984b48fdc2UL, 0x97a31017b19e996eUL, 0x8b51030a66dd05a9UL, 0x3a31cb59ed72fc77UL, 0x80dbc4325b86072bUL, 0xfdbe0335fa6fceeaUL, 0xa4075747245150acUL, 0xc5a3e3e3ce4faaebUL, 0x1b78864b70c0e56UL, 0xfb7c066bf4df9dd5UL, 0x480eae8e48a2a159UL, 0x8b47c7c79c9f55d7UL, 0x9a6ee5cba30fe003UL, 0x24002fcd70edc79dUL, 0x22b80c4f78ae194cUL, 0xa74ffadf2d94f9aaUL, 0x34ddcb97461fc006UL, 0x48005f9ae1db8f3bUL, 0x4570189ef15c3298UL, 0x4e9ff5be5b29f354UL, 0xf0ba622c41287ca3UL, 0x42f89c2f5ae5e241UL, 0x3845606e0b533ecfUL, 0x2cff9e2ca2f9b4acUL, 0xe174c4588250f946UL, 0x85f1385eb5cbc483UL, 0x708ac0dc16a67d9eUL, 0x59ff3c5945f36958UL, 0x5be87db3c9b60e23UL, 0xd91a53a7f2c57530UL, 0x53b0d0ebc4a7a0c2UL, 0x23e0de29f4c80b4UL, 0x2ed10e655e7be0e9UL, 0x60cc84557cd81657UL, 0x15c4f08460a41a7aUL, 0xb5bc6e952a33536cUL, 0xc4a3e9c871e03d7dUL, 0x13612bb060e2d099UL, 0x992cb05b28a36f0bUL, 0xdab8a87a40ccf4dcUL, 0x104626922ed78655UL, 0xf43a747a58975d04UL, 0x80fc31e5b8ad85e9UL, 0x4b125a49533bbbdUL, 0x208c4d245daf0caaUL, 0xe874e8f4b12eba08UL, 0x1f863cb715b0bd3UL, 0x9624b492a67777bUL, 0xd8196f4a7649e5fbUL, 0x211f2f3fb0f8827UL, 0xb15596c50b5d4c58UL, 0xa304e3c24064bcf2UL, 0xb032de94ec93cbf6UL, 0x423e5e7f61f104fUL, 0x62ab2d8a16ba98b0UL, 0x4609c78480c979e5UL, 0x6065bd29d92797ecUL, 0x847cbcfec3e209fUL, 0xc5565b142d753160UL, 0x8c138f090192f3caUL, 0x59ca8f517f58d377UL, 0xc277b485412ebd09UL, 0x3809e77bb301393fUL, 0xa9e76b42178fb591UL, 0x2a94eba033a65a41UL, 0x56174a101b0f8625UL, 0xc2b69fa48fe92980UL, 0xe20ea3d43bb53926UL, 0x5529d740674cb482UL, 0xac2e9420361f0c4aUL, 0x856d3f491fd25300UL, 0xc41d47a8776a724dUL, 0x33525b82038e95abUL, 0x8aa50b5af56ce4a3UL, 0xb87f2fc1d64ffdfeUL, 0x39fafa00fa7eb69fUL, 0x66a4b704071d2b56UL, 0x154a16b5ead9c946UL, 0x70fe5f83ac9ffbfdUL, 0x73f5f401f4fd6d3fUL, 0x54489b0ac32daa03UL, 0xf86c0e714ce16ebbUL, 0x5359ee54b0d4ac05UL, 0x562b9d53fd50887aUL, 0x3190c3174b4ca8a9UL, 0x22203ff800902141UL, 0x14168dfa884203f4UL, 0x1d974ff7ee0b42f0UL, 0x6321862e96995152UL, 0x44407ff001204282UL, 0x282d1bf5108407e8UL, 0x3b2e9fefdc1685e0UL, 0xc6430c5d2d32a2a4UL, 0x8880ffe002408504UL, 0x505a37ea21080fd0UL, 0x765d3fdfb82d0bc0UL, 0x1587edb89772b9e7UL, 0xc3f9dcda9dd3f63eUL, 0x12113e87abfb445eUL, 0x5d7a0aef64f04584UL, 0xb20e2e73e3f28f61UL, 0x550b9aafa2f5104bUL, 0x96872c5cbe1dd342UL, 0xb34608edd4ad90cUL, 0x641c5ce7c7e51ec2UL, 0xaa17355f45ea2097UL, 0x2d0e58b97c3ba684UL, 0x1668c11dba95b219UL, 0x51394ccd42ddc12bUL, 0x86d649a41286bd19UL, 0xe8b9e021119c16f6UL, 0x9d11f76b61813636UL, 0x3b736c9848ac7ef9UL, 0xdf54b052bc5f8605UL, 0x63d69111cad37612UL, 0x8be39b86d7a83e69UL, 0xefe72c325c4f015dUL, 0x6c5143bfe1edf03dUL, 0x750873707c4db7daUL, 0xa607425dbbfa2ed6UL, 0x46cfad667589fe15UL, 0xa5aa4655a891c4cUL, 0x58b5b7b31170344bUL, 0xfdcef1eb635e0fa8UL, 0x149eafce26040085UL, 0xc64d6bd02c40c4afUL, 0x3ce3e35cb0b3369UL, 0x4a5d9686d2164d54UL, 0x293d5f9c4c08010aUL, 0x8c9ad7a05881895eUL, 0x79c7c6b961666d3UL, 0x94bb2d0da42c9aa8UL, 0xcb7b4a3a5507febbUL, 0xcbcd8c5a2851ee8bUL, 0xbd9da984c5c79658UL, 0x98b62f4b5cf36754UL, 0x96f69474aa0ffd76UL, 0x979b18b450a3dd17UL, 0x7b3b53098b8f2cb1UL, 0x316c5e96b9e6cea9UL, 0xb4ecddeb99080643UL, 0xfdce127238154618UL, 0x44d3f740fef5029cUL, 0xd318c87d6767cf56UL, 0xf0d84ed5ff07f029UL, 0x296407fee9787006UL, 0x3b02bfd214015ec6UL, 0x17f1e5aada65cca8UL, 0x78b168a933181cfdUL, 0x80302ce74ba21c3aUL, 0xc4a02ef7c1e9e673UL, 0x9e23be05a061cb54UL, 0xf162d152663039faUL, 0x6059ce97443874UL, 0x89405def83d3cce7UL, 0x3c477c0b40c396a9UL, 0x7bc457a601778f5bUL, 0xd2389087b7da8cdeUL, 0xa025ea8cee4cc231UL, 0xc94e8d46952d7f57UL, 0xf788af4c02ef1eb6UL, 0xa471210f6fb519bcUL, 0x404bd519dc998463UL, 0x929d1a8d2a5afeafUL, 0xef115e9805de3d6cUL, 0x48e2421edf6a3379UL, 0x8097aa33b93308c7UL, 0x253a351a54b5fd5eUL, 0xde22bd300bbc7ad8UL, 0x91c4843dbed466f3UL, 0x12f54677266118eUL, 0x4a746a34a96bfabdUL, 0x25448f62da6f091fUL, 0xf1712b61e4fa31d0UL, 0xb0fbf99d0d2778e2UL, 0x2528a139467da77eUL, 0xd388ebc779c9ee91UL, 0x301a75d950a69f97UL, 0xd352a269f3a5aa3aUL, 0xfb91372298511cf9UL, 0xa711d78ef393dd22UL, 0x6034ebb2a14d3f2fUL, 0xa6a544d3e74b5474UL, 0xf7226e4530a239f3UL, 0xd7225a1f2a3046ebUL, 0x1291f47fdbc88268UL, 0xffefd8f4277df317UL, 0x5f84a9da75ee21e3UL, 0x3745413c99777179UL, 0xf7dbcbe52ec3f8e6UL, 0x4d7ae0bba710bdd1UL, 0xec926e4ff7611c3UL, 0xf78b777bfff91e5dUL, 0x3d4fb4d0c4d50dfbUL, 0x28509024a7ca205cUL, 0xac523899ea467182UL, 0x76171bf532e5c015UL, 0xa8674abb10f8e7c0UL, 0xe204711aa67f1b47UL, 0xe9640463c026b100UL, 0xec2e37ea65cb802aUL, 0x50ce957621f1cf80UL, 0xc408e2354cfe368fUL, 0xd2c808c7804d6201UL, 0x415d9ad60680fcfbUL, 0x736509f6dab16336UL, 0x3ab49539701736e1UL, 0x145064df14309607UL, 0x1bbac0aec0160559UL, 0x343230f72c303a5bUL, 0xc7cc7b2109c5363dUL, 0x9960bcee3ccb7e0aUL, 0xae74745f4d3bf61dUL, 0xba9c42f4c1328881UL, 0x3d3da711fa613785UL, 0x83010c8c6d3cae11UL, 0xc5e91dbc57601095UL, 0xa7c0a6f31b37ed34UL, 0xc8de1f701d2934f4UL, 0xb7c26c48ced30e26UL, 0x8bd23b78aec0212aUL, 0x4f814de6366fda69UL, 0x91bc3ee03a5269e9UL, 0x6f84d8919da61c4dUL, 0x17a476f15d804254UL, 0x9f029bcc6cdfb4d3UL, 0x23787dc074a4d3d2UL, 0xdf09b1233b4c389bUL, 0x2f48ede2bb0084a8UL, 0x3e053798d9bf69a6UL, 0x46f0fb80e949a7a5UL, 0xbe13624676987136UL, 0x5e91dbc576010950UL, 0x7c0a6f31b37ed34cUL, 0x8de1f701d2934f4aUL, 0x7c26c48ced30e26cUL, 0x242242882115ee0fUL, 0x2aecfd79ffaf5aafUL, 0xa966bf504ccdc56bUL, 0x498dfc49cecb96ddUL, 0x48448510422bdc1eUL, 0x55d9faf3ff5eb55eUL, 0x52cd7ea0999b8ad6UL, 0x931bf8939d972dbbUL, 0x90890a208457b83cUL, 0xabb3f5e7febd6abcUL, 0xa59afd41333715acUL, 0x2637f1273b2e5b76UL, 0x2112144108af7078UL, 0x5767ebcffd7ad579UL, 0x4b35fa82666e2b59UL, 0x4c6fe24e765cb6edUL, 0x42242882115ee0f0UL, 0xaecfd79ffaf5aaf2UL, 0x966bf504ccdc56b2UL, 0x98dfc49cecb96ddaUL, 0x8448510422bdc1e0UL, 0x5d9faf3ff5eb55e4UL, 0x2cd7ea0999b8ad65UL, 0x31bf8939d972dbb5UL, 0x890a208457b83c0UL, 0xbb3f5e7febd6abc9UL, 0x59afd41333715acaUL, 0x637f1273b2e5b76aUL, 0x8820b11247e0fb2fUL, 0xa4869fe54effaba5UL, 0x1faf9758f09ee6aUL, 0x773e51b771613cd0UL, 0x104162248fc1f65eUL, 0x490d3fca9dff574bUL, 0x3f5f2eb1e13dcd5UL, 0xee7ca36ee2c279a0UL, 0x2082c4491f83ecbcUL, 0x921a7f953bfeae96UL, 0x7ebe5d63c27b9aaUL, 0xdcf946ddc584f340UL, 0x410588923f07d978UL, 0x2434ff2a77fd5d2cUL, 0xfd7cbac784f7355UL, 0xb9f28dbb8b09e680UL, 0x820b11247e0fb2f0UL, 0x4869fe54effaba58UL, 0x1faf9758f09ee6aaUL, 0x73e51b771613cd00UL, 0x4162248fc1f65e0UL, 0x90d3fca9dff574b1UL, 0x3f5f2eb1e13dcd54UL, 0xe7ca36ee2c279a00UL, 0x912db1933529376fUL, 0xf35fda4926b81555UL, 0xcc1b0c302b90c156UL, 0x7e54188c4ce56604UL, 0xbb5a9624a7459271UL, 0x34479788d422d69cUL, 0x2a934933becad952UL, 0x4d6844488d609e0dUL, 0xefb4d94b839cd84dUL, 0xba770c0b3117510eUL, 0xe783c334947ee95bUL, 0x2b10fdc10e6b6e1eUL, 0x46684795ca2e4c35UL, 0xa6163b0cfb7c5e2aUL, 0x7da2d73ac1168948UL, 0xe7e18ed2087c8e39UL, 0x8cd08f2b945c986aUL, 0x4c2c7619f6f8bc54UL, 0xfb45ae75822d1291UL, 0xcfc31da410f91c72UL, 0x19a11e5728b930d4UL, 0x9858ec33edf178a9UL, 0xf68b5ceb045a2522UL, 0x9f863b4821f238e5UL, 0xaa43c9ac9c659d07UL, 0xe249fb7d42b00d65UL, 0x5fb3e885e15f11baUL, 0x8ecc03c0574e23cfUL, 0xcd86665bf5dcc6a1UL, 0x166bd5e01c32e6fcUL, 0xdc280582b55788aUL, 0xac5872d0ba36159aUL, 0x9b0cccb7ebb98d42UL, 0x2cd7abc03865cdf9UL, 0x1b8500b056aaf114UL, 0x58b0e5a1746c2b34UL, 0xaf186c6d1a64e62bUL, 0x8b57749ae99967c4UL, 0x85af503344beb9d7UL, 0xa1be12fc72046cUL, 0x5e30d8da34c9cc56UL, 0x16aee935d332cf89UL, 0xb5ea066897d73afUL, 0x1437c25f8e408d9UL, 0xbc61b1b4699398acUL, 0x2d5dd26ba6659f12UL, 0x16bd40cd12fae75eUL, 0x286f84bf1c811b2UL, 0x78c36368d3273158UL, 0x5abba4d74ccb3e25UL, 0x2d7a819a25f5cebcUL, 0x50df097e3902364UL, 0xf186c6d1a64e62b0UL, 0xb57749ae99967c4aUL, 0x5af503344beb9d78UL, 0xa1be12fc72046c8UL, 0x7a0c78a1818b39cfUL, 0xb816b047aa7e04a2UL, 0x74f573b7e3c610eUL, 0xa5f7b70f9aeadf94UL, 0xf418f1430316739eUL, 0x702d608f54fc0944UL, 0xe9eae76fc78c21dUL, 0x4bef6e1f35d5bf28UL, 0xe831e286062ce73cUL, 0xe05ac11ea9f81289UL, 0x1d3d5cedf8f1843aUL, 0x97dedc3e6bab7e50UL, 0x4962300ec14e32d7UL, 0x124da127caa2d924UL, 0x88dfe8881808538aUL, 0x9e7dcd2cc3fcaea4UL, 0x92c4601d829c65aeUL, 0x249b424f9545b248UL, 0x11bfd1103010a714UL, 0x3cfb9a5987f95d49UL, 0x2588c03b0538cb5cUL, 0x4936849f2a8b6491UL, 0x237fa22060214e28UL, 0x79f734b30ff2ba92UL, 0xd2107574c7666a17UL, 0x40952a24cc443515UL, 0xf45a151329a9c7afUL, 0x422e1c360b4f2720UL, 0xa420eae98eccd42eUL, 0x812a544998886a2bUL, 0xe8b42a2653538f5eUL, 0x845c386c169e4e41UL, 0xd14020d1d08e54f3UL, 0xd0ac8b89a8422860UL, 0x63cd051f4f4c4542UL, 0xb97805883996ce87UL, 0xa28041a3a11ca9e6UL, 0xa1591713508450c1UL, 0xc79a0a3e9e988a85UL, 0x72f00b10732d9d0eUL, 0x45008347423953ccUL, 0x42b22e26a108a183UL, 0x8f34147d3d31150bUL, 0xe5e01620e65b3a1dUL, 0x1300f38c49655b37UL, 0x579c7f57db43bf31UL, 0xaccd79a9938971e9UL, 0x7a005911d81c263fUL, 0xbf00121a5fdd4ac1UL, 0x7dc0ddb52fd58255UL, 0xeb3fa200cef9b82dUL, 0x45c0c773a4921e7bUL, 0x7e002434bfba9582UL, 0xfb81bb6a5fab04abUL, 0xd67f44019df3705aUL, 0x8b818ee749243cf7UL, 0x6501bd6bb262d7abUL, 0x25fb55ce2604f561UL, 0x1e5bd950d20dbb4aUL, 0xa6c3689e86e22bebUL, 0xca037ad764c5af56UL, 0x4bf6ab9c4c09eac2UL, 0x3cb7b2a1a41b7694UL, 0x4d86d13d0dc457d6UL, 0xd0700ac049ca203UL, 0x45157422014129b2UL, 0xcbca3410a1ddb6d7UL, 0x2acdd72a0f22fda8UL, 0x830ff45ac42eb8a9UL, 0x58d2cb5e9bd0af53UL, 0x25313972aa503651UL, 0xe45bdb040aefa955UL, 0x9f1e1db7454a8dfdUL, 0x635db5a7aef3a290UL, 0xf8c723b6bd4b375dUL, 0x7977c358017500aeUL, 0xa73dce6c4782e755UL, 0x14434855c4b5b916UL, 0x432b163e937d3545UL, 0x432ff3e016405359UL, 0xd77a69da42123205UL, 0xfa7eb3b110398e1aUL, 0x34f37d2ecf113175UL, 0x379f9290382af4b6UL, 0xaef4d3b48424640aUL, 0xf4fd676220731c35UL, 0x69e6fa5d9e2262ebUL, 0x6f3f25207055e96cUL, 0xc4e8526bc55f34bbUL, 0x3b02edded9b4c45cUL, 0x6168a5e8d5af9e28UL, 0x6fbe3f10f40180dcUL, 0x10d151d547a995d9UL, 0xa4fdf8a72a3b748eUL, 0x70741a8242b467afUL, 0x6ebc0b71fca953bcUL, 0x21a2a3aa8f532bb2UL, 0x49fbf14e5476e91cUL, 0xe0e835048568cf5fUL, 0xdd7816e3f952a778UL, 0xda44b257d3b1abcbUL, 0x410fc18631bf2e0fUL, 0x73753b5ae33ac541UL, 0xb305897e60f1cf5UL, 0xb48964afa7635796UL, 0x821f830c637e5c1fUL, 0xe6ea76b5c6758a82UL, 0x1660b12fcc1e39eaUL, 0xf0133c5d83d15383UL, 0xd6c725025fae4408UL, 0x7f71bc3865004efaUL, 0x9d01170f8c9621d1UL, 0x79278db9cab55ba9UL, 0x7f76691e260e7426UL, 0x4c46292323ebc60aUL, 0x8bc25b4f0d8611a6UL, 0x6b4eee71587d4bfdUL, 0x2c14f126d54e147bUL, 0x2a290315ae3cd7ebUL, 0xa644c3ce0fa67148UL, 0x4f9c29e07ded6b55UL, 0x8ad1c15733ced4c1UL, 0xe6f75778b592f429UL, 0xfd49f2cc0be6b094UL, 0x639a6c236cd2a05UL, 0xc75ba1b4fecf55b5UL, 0x7f4bffa282ceb3acUL, 0x4b5390c80367332dUL, 0x9572b886a08da8a5UL, 0x5c4f607364cc575dUL, 0x4c32ae16ec763ca6UL, 0x276754c01264345eUL, 0x2ae5710d411b514aUL, 0xb89ec0e6c998aebbUL, 0x98655c2dd8ec794cUL, 0x4ecea98024c868bcUL, 0x55cae21a8236a294UL, 0x713d81cd93315d76UL, 0x30cab85bb1d8f299UL, 0x9d9d53004990d179UL, 0xab95c435046d4528UL, 0xe27b039b2662baecUL, 0x619570b763b1e532UL, 0x3b3aa6009321a2f2UL, 0xce2a7d68c5cd76ffUL, 0x160e242cd59789eeUL, 0x718fb03d2e88919aUL, 0xc7b5395132e917e0UL, 0x9c54fad18b9aedfeUL, 0x2c1c4859ab2f13ddUL, 0xe31f607a5d112334UL, 0x8f6a72a265d22fc0UL, 0xa1a800a1da222753UL, 0x8ac0b3a9cf0cdb8cUL, 0x749b91a753c91d97UL, 0xaf149014df0e0d85UL, 0xda51f4417953b209UL, 0xc7794449074b4b2eUL, 0x5b92721d4e7960d0UL, 0xefe95579aab6490eUL, 0x2da21d803fb098bdUL, 0x5c0aab8897c46a6aUL, 0x581b56975199a5eUL, 0x6e12dfa341c6c018UL, 0xc245ce02b276cdd5UL, 0x6aed740bb6da28e3UL, 0xb9a63b8103d86f43UL, 0x6de5ca169727d234UL, 0x1d8a6907a9fa6705UL, 0x722cb0df4e6adf0UL, 0xc1e92651ee5b8579UL, 0x6a0be17d3ae5f66dUL, 0xa215270d9ee332a5UL, 0xdcbdb501709fa7d7UL, 0x31771df0355c510dUL, 0x65d7b7aa6161bedfUL, 0x442a4e1b3dc6654aUL, 0xb97b6a02e13f4fafUL, 0x62ee3be06ab8a21bUL, 0xcbaf6f54c2c37dbeUL, 0x11556934b69b363bUL, 0xa00ef71f5b2c6369UL, 0x777926933c9a1fc8UL, 0x269eabf9912ca978UL, 0x22aad2696d366c76UL, 0x401dee3eb658c6d2UL, 0xeef24d2679343f91UL, 0x4d3d57f3225952f0UL, 0xdc5451d0177b2443UL, 0x52c3ff67f5e37193UL, 0x6f41cb1f1b8324ddUL, 0x2bbadab65018f7e5UL, 0xb8a8a3a02ef64886UL, 0xa587fecfebc6e327UL, 0xde83963e370649baUL, 0x5775b56ca031efcaUL, 0xe850b24290fb6da3UL, 0x99f7de854edf3a78UL, 0xfa27d2f87e7c88aUL, 0x1f2b1f8954c98d91UL, 0x49a09187ece127e9UL, 0xe1179e1004ec88c6UL, 0xade1ab0ce624caeaUL, 0x8f964a42bd394926UL, 0x9341230fd9c24fd2UL, 0xc22f3c2009d9118cUL, 0x5bc35619cc4995d5UL, 0x1f2c94857a72924dUL, 0x2682461fb3849fa4UL, 0x845e784013b22319UL, 0xb786ac3398932babUL, 0x3e59290af4e5249aUL, 0x4d048c3f67093f48UL, 0x8bcf08027644632UL, 0x6f0d586731265757UL, 0x7cb25215e9ca4935UL, 0x308ed7c0305823fUL, 0xc381c21ad79a7053UL, 0x6cbfe19d8ba7f551UL, 0x48a4d17bc73ec06eUL, 0x9f102ffacb1cf8d1UL, 0x55fba72f36661c91UL, 0x6bda9268fea4b15cUL, 0x2089d7a79ad7d2d8UL, 0x3e205ff59639f1a2UL, 0xabf74e5e6ccc3923UL, 0xd7b524d1fd4962b8UL, 0x4113af4f35afa5b0UL, 0x7c40bfeb2c73e344UL, 0x57ee9cbcd9987246UL, 0xaf6a49a3fa92c571UL, 0x82275e9e6b5f4b61UL, 0x61808ad495f03a27UL, 0x7d251a632a6218bbUL, 0xec71c2141cced11dUL, 0xb58ec86cc214c4c7UL, 0x5a00e0abe6f788e1UL, 0x28b217dccd96cd41UL, 0x6a46d57bd076f9c5UL, 0xdadde5899083db8bUL, 0xb401c157cdef11c2UL, 0x51642fb99b2d9a82UL, 0xd48daaf7a0edf38aUL, 0xb5bbcb132107b716UL, 0xf10277ad56c9df2bUL, 0x70307c69af09c932UL, 0x1bbe04bca830bcebUL, 0xdab7e37656a53c29UL, 0x7b051a58608442f9UL, 0x3298dbc9c7416e52UL, 0x85d9582ab98a2229UL, 0x4afb3bcb9e02a56UL, 0x6f0bc1b20c1f795dUL, 0xb7c9948917d02093UL, 0xb917e1069aff1fadUL, 0xb89f1229676a06a9UL, 0x47167666d5290e15UL, 0xbd6b0a08b6f2bd11UL, 0xc08a935edc1564a4UL, 0xc0fe5102da7e5f57UL, 0x172d19cf6745e085UL, 0xa82e370bf4b78615UL, 0x33b077ee51c192b6UL, 0x303cd755a056ecabUL, 0xb75bc69c039c3da5UL, 0x82a44d0d703df01dUL, 0xd5c5be8f4a687e92UL, 0xd1b9dbfb54078b52UL, 0xf7b6783aca2f87e5UL, 0xd7b0b90079291c0cUL, 0x192e2c4d7d3ba6daUL, 0x12b3c2a6bca544a1UL, 0xef6cf075945f0fcaUL, 0xaf617200f2523819UL, 0x325c589afa774db5UL, 0x2567854d794a8942UL, 0xded9e0eb28be1f94UL, 0x5ec2e401e4a47033UL, 0x64b8b135f4ee9b6bUL, 0x4acf0a9af2951284UL, 0xbdb3c1d6517c3f28UL, 0xbd85c803c948e067UL, 0xc971626be9dd36d6UL, 0x959e1535e52a2508UL, 0xe26676ae6fef82ffUL, 0xa9f3b31d0bc33cf8UL, 0x204795843a513652UL, 0x9afc5f3bdefe1815UL, 0x5dcd185e12c8f951UL, 0x811f45208ed485c6UL, 0xf22a7a5b9d49375aUL, 0x8438cb27a956622eUL, 0x229bc5bee8860e0dUL, 0xd0c6a95b84fbf7bbUL, 0x56f1a5e4d379354aUL, 0xb9b1e31f46069659UL, 0xdc367e7f1c1be0b5UL, 0x737571ad90a51341UL, 0x1f461a9a4f19316aUL, 0xc2a3b36e98a77eb6UL, 0xb86cfcfe3837c16aUL, 0xe6eae35b214a2683UL, 0x3e8c35349e3262d4UL, 0x854766dd314efd6cUL, 0xe9d80cfebd787e7bUL, 0x1f2de5acdbc6b130UL, 0xcfbd3b3ad58f9e56UL, 0xbb4eb8ea7637a8dcUL, 0xd3b019fd7af0fcf6UL, 0x3e5bcb59b78d6261UL, 0x9f7a7675ab1f3cacUL, 0x769d71d4ec6f51b9UL, 0xa76033faf5e1f9ecUL, 0x7cb796b36f1ac4c3UL, 0x3ef4eceb563e7958UL, 0xed3ae3a9d8dea373UL, 0x4ec067f5ebc3f3d8UL, 0xf96f2d66de358987UL, 0x7de9d9d6ac7cf2b0UL, 0xda75c753b1bd46e6UL, 0x4813ae91a901b1fUL, 0x202679d72539ef39UL, 0x4976e2feb112be9eUL, 0x52bfbf777d0dfc8UL, 0x90275d23520363eUL, 0x404cf3ae4a73de72UL, 0x92edc5fd62257d3cUL, 0xa57f7eeefa1bf90UL, 0x1204eba46a406c7cUL, 0x8099e75c94e7bce4UL, 0x25db8bfac44afa78UL, 0x14afefdddf437f21UL, 0xbd08224a19972457UL, 0xd3cbeda3b09d85ffUL, 0xf91246a6617eaf0eUL, 0x989faaebaa2cac46UL, 0xe311b196fe39b401UL, 0x756ff85df869f7c8UL, 0x4081dc1f2b1605e2UL, 0x80ff208740f30a89UL, 0xc623632dfc736802UL, 0xeadff0bbf0d3ef91UL, 0x8103b83e562c0bc4UL, 0x1fe410e81e61512UL, 0x1547335935f12cabUL, 0x747c26d78f52314UL, 0xb0a2212f45b34c76UL, 0xb23cf74d17667821UL, 0xb38f93b0a6f5a5f9UL, 0xdc77a7c068b8ba1fUL, 0xd3e1130d628dc313UL, 0xd5b99bca3a66a247UL, 0x671f27614deb4bf2UL, 0xb8ef4f80d171743fUL, 0xa7c2261ac51b8627UL, 0xab73379474cd448fUL, 0xce3e4ec29bd697e4UL, 0x71de9f01a2e2e87eUL, 0x4f844c358a370c4fUL, 0x56e66f28e99a891fUL, 0x57d6887fabad367UL, 0x31451d19dc972ccaUL, 0x2dadc938fd854361UL, 0x1c0cab01c79f403aUL, 0xafad10ff575a6ceUL, 0x628a3a33b92e5994UL, 0x5b5b9271fb0a86c2UL, 0x381956038f3e8074UL, 0x8cf4571d27fcb133UL, 0x17ec577deb0e4f1fUL, 0x41275b01ffe567bUL, 0xc1f2d9570ad752ecUL, 0x80e95b3882ee9ec9UL, 0xfd208de14f4e6208UL, 0xba81ba33d617f709UL, 0x3225c7fe0104f7dcUL, 0x1d2b67105dd3d92UL, 0xfa411bc29e9cc411UL, 0x75037467ac2fee13UL, 0x644b8ffc0209efb9UL, 0x9aa499e0c6ad878bUL, 0x267a149fa46b7415UL, 0x58a3b99cb1b487d8UL, 0x79576aa810b98d76UL, 0x354933c18d5b0f16UL, 0x4cf4293f48d6e82bUL, 0xb147733963690fb0UL, 0xf2aed55021731aecUL, 0xf3939281d7a1e283UL, 0x4b10716408ff2c61UL, 0xd02bb7212f39449fUL, 0x549ddff0564c67ddUL, 0xe7272503af43c506UL, 0x9620e2c811fe58c3UL, 0xa0576e425e72893eUL, 0xa93bbfe0ac98cfbbUL, 0x574fbf05939076a3UL, 0xfeb9e68abaae4db0UL, 0xf20b8dd7550e4982UL, 0xe3b70a914d9bcd73UL, 0x379e8b09ea3711e9UL, 0x2f8bee0fec0e6757UL, 0x56b24afd43f7c8faUL, 0x76ae60728f9dc8e3UL, 0x6f3d1613d46e23d2UL, 0x5f17dc1fd81cceaeUL, 0xad6495fa87ef91f4UL, 0xed5cc0e51f3b91c6UL, 0xde7a2c27a8dc47a4UL, 0xbe2fb83fb0399d5cUL, 0x5ac92bf50fdf23e8UL, 0xdab981ca3e77238dUL, 0xbcf4584f51b88f48UL, 0x7c5f707f60733ab9UL, 0xb59257ea1fbe47d1UL, 0xb57303947cee471aUL, 0x79e8b09ea3711e90UL, 0xf8bee0fec0e67573UL, 0x6b24afd43f7c8fa2UL, 0x6ae60728f9dc8e35UL, 0xf3d1613d46e23d20UL, 0xf17dc1fd81cceae6UL, 0xd6495fa87ef91f45UL, 0xd5cc0e51f3b91c6aUL, 0x7ea3377840d386efUL, 0x3003a0e19acb29faUL, 0x1e37ee0314196574UL, 0x1a5869f3f3d86ad1UL, 0x64479bf24cb0f171UL, 0xb2ff62d9acc4afc3UL, 0x8eca8d55c1d99117UL, 0x8570a6b7f31a87a6UL, 0x518ec2e654761e4dUL, 0xb706e6a9c0dba3b1UL, 0xaf304bf86a5879d0UL, 0xbb21383ff29f5d49UL, 0x3a1c70ce65fbc035UL, 0xbcf5ee4918e5bb55UL, 0xecc5c6a33d5ba85eUL, 0xc782052ff194e897UL, 0xed39149e06e07cc5UL, 0xab13ff88a8998a9dUL, 0x6b2edc15935c0b42UL, 0x3ec47f0ff783832bUL, 0x4373dc3ec0d70525UL, 0x84dfdc0bc861e90cUL, 0x64f8e978cf534d7aUL, 0xcc488b4ffbad5452UL, 0x1fe64d7f4cb9f6e5UL, 0xdb479b0d09912e2fUL, 0x7b5483a2774dc10aUL, 0x295163cfe3f0faa0UL, 0xa6cd6ffc54641165UL, 0x647715008a70a069UL, 0x440c56170770d9eaUL, 0xe362b2cfd34ba744UL, 0xd49b2afa65dfde65UL, 0x1a16091b8db3bce4UL, 0x3abdfd7de70ae82bUL, 0x770510cfb23d1c8cUL, 0x3037a0f606a84065UL, 0xe6d4312d823585feUL, 0xc7deaba827fe8ba9UL, 0x5fca54cf70d06b1cUL, 0x606f41ec0d5080caUL, 0xcda8625b046b0bfcUL, 0x8fbd57504ffd1753UL, 0xbf94a99ee1a0d639UL, 0x59df76dad7b6fd3bUL, 0x49a8e7ac9184ebcfUL, 0xaddffff376117558UL, 0xcee9266dd7ebfe77UL, 0x2abf18b7627a06d9UL, 0x41a9ec43ba5b2ba9UL, 0xe91aaeb505c9b14fUL, 0x2c12398bbb7daeebUL, 0x557e316ec4f40db2UL, 0x8353d88774b65752UL, 0xd2355d6a0b93629eUL, 0x5824731776fb5dd7UL, 0x33fd97df44ffe7cbUL, 0xd45f9214703e5293UL, 0x16cfeb87fecd9ec2UL, 0x188937ef95ce9abUL, 0x67fb2fbe89ffcf96UL, 0xa8bf2428e07ca526UL, 0x2d9fd70ffd9b3d85UL, 0x31126fdf2b9d356UL, 0x56f7aa7fdee86383UL, 0x83866b4b59abb67bUL, 0xe99aff4c12dd20f4UL, 0xb7e238abf1d9f4a8UL, 0x34eea1fd70c73ba9UL, 0xd5f4f58c2a0590c1UL, 0x6190afcbcc511a16UL, 0xde040407f719bb55UL, 0xf0dcb6f82c998bfdUL, 0x7911c802cd59ddb5UL, 0x71840ec471496fd2UL, 0xdc87d5ffa9924aeUL, 0x78b898f29424eb55UL, 0x20dbb31f03e1475cUL, 0x51ad4cdb0b79845bUL, 0xaa508fefe1981b58UL, 0x6870c4e7e55e2a05UL, 0x934f45249e90728fUL, 0x11ffc8e5ff185349UL, 0xe5616a8fd79a64b4UL, 0x49e07ccd07aba8a5UL, 0xf466a953a4721929UL, 0x915ac09817dbfd6cUL, 0x7b02a04fbb9e9b6cUL, 0xac10c98c240ade5UL, 0x3a3571bdd1b6ce65UL, 0x9010d063c65ca126UL, 0x47c535cf639764ddUL, 0x1582193184815bcaUL, 0x746ae37ba36d9ccaUL, 0x2021a0c78cb9424cUL, 0x8f8a6b9ec72ec9bbUL, 0xb205c761c4154b3bUL, 0x3a2de5eddf89c5a3UL, 0xf2e610dcf099df67UL, 0xaed4a26d9af7c172UL, 0xfd0a7bc1453d6ad9UL, 0xa6a3e8c126417770UL, 0x576970ea08d8e531UL, 0xec69318b2145d0e1UL, 0xfa14f7828a7ad5b2UL, 0x4d47d1824c82eee1UL, 0xaed2e1d411b1ca63UL, 0xd8d26316428ba1c2UL, 0x6d281a07d9e257cbUL, 0x4877801e005721f4UL, 0xef0092fbca88cf39UL, 0x64b37c91bd1181UL, 0x4351c10d7ed35339UL, 0x4217232699fcbfdfUL, 0x6ca474a47cfac58dUL, 0xb10913a937d07107UL, 0x86a3821afda6a672UL, 0x842e464d33f97fbeUL, 0xd948e948f9f58b1aUL, 0x621227526fa0e20eUL, 0xd470435fb4d4ce4UL, 0x85c8c9a67f2ff7dUL, 0xb291d291f3eb1635UL, 0xc4244ea4df41c41dUL, 0x1a8e086bf69a99c8UL, 0x10b91934cfe5fefaUL, 0x6523a523e7d62c6aUL, 0x88489d49be83883bUL, 0xac1de5d52022cf3fUL, 0xf38a1173069901c3UL, 0x78e21b142647032bUL, 0xa1514fc369ad4272UL, 0x583bcbaa40459e7eUL, 0xe71422e60d320387UL, 0xf1c436284c8e0657UL, 0x42a29f86d35a84e4UL, 0xb0779754808b3cfcUL, 0xce2845cc1a64070eUL, 0xe3886c50991c0cafUL, 0x85453f0da6b509c9UL, 0xf9eedbabcc018557UL, 0x4ea8a882ad9af22aUL, 0x75b589f2dbd342a0UL, 0xbb4a0b4b59c04197UL, 0x6adc42555514f601UL, 0x4fa9721fc2671862UL, 0x59ce42b65e4ddebfUL, 0xc75463c6a72ad12aUL, 0x4cb971a8673e10adUL, 0x4daac7251d9cccf3UL, 0x139d43f5570e681UL, 0x3f68b2dd5afff050UL, 0x731652036bddf5UL, 0x49adad50a26b65d1UL, 0xb0d6f92d430a96fdUL, 0xcf1110eaa155b2a4UL, 0x99e7d9a6cbc04745UL, 0x41a379bbdd843795UL, 0xd308a3096ffe7605UL, 0x2fe254855601374dUL, 0x33cfb34d97808e8aUL, 0x8346f377bb086f2bUL, 0xa6114612dffcec0aUL, 0x5fc4a90aac026e9bUL, 0xfe9e9399e216e1bbUL, 0xd475c5f5ef422261UL, 0xfe87dd76561283eaUL, 0xe4927454cae8f33UL, 0xfd3d2733c42dc376UL, 0xa8eb8bebde8444c3UL, 0xfd0fbaecac2507d5UL, 0x1c924e8a995d1e67UL, 0x637bbb65454c7a43UL, 0x832f34cd245a75b0UL, 0x48ba248ab1a15454UL, 0x88e4e84526106ecbUL, 0xc6f776ca8a98f486UL, 0x65e699a48b4eb60UL, 0x917449156342a8a9UL, 0x11c9d08a4c20dd96UL, 0x8deeed951531e90cUL, 0xcbcd3349169d6c1UL, 0x22e8922ac6855152UL, 0x2393a1149841bb2dUL, 0x1bdddb2a2a63d218UL, 0x1979a66922d3ad83UL, 0x45d124558d0aa2a4UL, 0x472742293083765aUL, 0x37bbb65454c7a430UL, 0x32f34cd245a75b06UL, 0x8ba248ab1a154548UL, 0x8e4e84526106ecb4UL, 0xf67699aa6498b4cfUL, 0xb71ebabe121c4a3bUL, 0xa5e1c005ddc1d16fUL, 0xad5d7df4d6a78b6dUL, 0xeced3354c931699eUL, 0x6e3d757c24389477UL, 0x4bc3800bbb83a2dfUL, 0x5abafbe9ad4f16dbUL, 0x40db93ab5f752f93UL, 0xe82c9e2d123d4d8UL, 0x252251449eec1e41UL, 0x4b582834e347fb2UL, 0x18b6d25473fda389UL, 0xcffdb0df3b155587UL, 0xf8e1f3dad433677dUL, 0xb8ab705688c2ad60UL, 0xa86c51aa2aecbbbdUL, 0x4d0342a4ef785739UL, 0x4366b6e6418d9504UL, 0xc09695fd052f08c5UL, 0xc9d9565698ce8bd5UL, 0x48fea65347a25244UL, 0x34683c9f6af071f7UL, 0x30ed5eaa1ef4438eUL, 0x93b2acad319d17aaUL, 0x91fd4ca68f44a489UL, 0x68d0793ed5e0e3eeUL, 0x61dabd543de8871cUL, 0xbe64ac58ae2dd3fbUL, 0xf102ba5787dbb524UL, 0x6305a32e422a9c22UL, 0x72750ff86f7b5c3cUL, 0x7cc958b15c5ba7f6UL, 0xe20574af0fb76a49UL, 0xc60b465c84553845UL, 0xe4ea1ff0def6b878UL, 0xf992b162b8b74fecUL, 0xc40ae95e1f6ed492UL, 0x8c168cb908aa708bUL, 0xc9d43fe1bded70f1UL, 0xf32562c5716e9fd8UL, 0x8815d2bc3edda925UL, 0x182d19721154e117UL, 0x93a87fc37bdae1e3UL, 0xe64ac58ae2dd3fb0UL, 0x102ba5787dbb524bUL, 0x305a32e422a9c22fUL, 0x2750ff86f7b5c3c6UL, 0xcc958b15c5ba7f60UL, 0x20574af0fb76a497UL, 0x60b465c84553845eUL, 0x4ea1ff0def6b878cUL, 0x2ae3294663026fUL, 0x9256b6fb6fbfb518UL, 0x73cd9ac3634c5343UL, 0x2c838b4bca7d5d1cUL, 0x55c6528cc604deUL, 0x24ad6df6df7f6a30UL, 0xe79b3586c698a687UL, 0x5907169794faba38UL, 0xab8ca5198c09bcUL, 0x495adbedbefed460UL, 0xcf366b0d8d314d0eUL, 0xb20e2d2f29f57471UL, 0x9856ec48fe0fefd7UL, 0x404d94c1e4af54f7UL, 0x2cc98748f389c1e3UL, 0xd5dc2f0e4740bae7UL, 0x30add891fc1fdfaeUL, 0x809b2983c95ea9efUL, 0x59930e91e71383c6UL, 0xabb85e1c8e8175ceUL, 0xf85a4421352843f3UL, 0xd3ce701d0befafe9UL, 0x1834c7027cc5c72UL, 0xe6b0c96909a8b998UL, 0x69b57d40a7477b49UL, 0x7564c3208e8da3e4UL, 0xb1a3c9b3a673e31aUL, 0x7ca1e78207fb2134UL, 0x4a6b0f8383990a3dUL, 0x3831a55b8449bbffUL, 0xd1e2c234a50c9dcbUL, 0x4883ba541b5c106dUL, 0xdd7ea05ca25e8d5UL, 0xa29b69ad91c18bc9UL, 0x1160d53aa3f26069UL, 0x20c701f8221272dfUL, 0x82ae2109595c2d05UL, 0x97cef041bad1eba5UL, 0x9064fb26ae0f9b2cUL, 0xf04e76a0508eb7baUL, 0x55c4212b2b85a0aUL, 0x2f9de08375a3d74bUL, 0x20c9f64d5c1f3659UL, 0xe09ced40a11d6f75UL, 0xab884256570b414UL, 0x5f3bc106eb47ae96UL, 0x4193ec9ab83e6cb2UL, 0xc139da81423adeeaUL, 0x1571084acae16828UL, 0xbe77820dd68f5d2cUL, 0x8327d935707cd964UL, 0x8273b5028475bdd4UL, 0x2ae2109595c2d050UL, 0x7cef041bad1eba58UL, 0x64fb26ae0f9b2c9UL, 0x4e76a0508eb7ba9UL, 0x55c4212b2b85a0a0UL, 0xf9de08375a3d74b0UL, 0xc9f64d5c1f36592UL, 0x9ced40a11d6f752UL, 0xab884256570b4140UL, 0xf3bc106eb47ae960UL, 0x193ec9ab83e6cb25UL, 0x139da81423adeea4UL, 0xce1171ae63017e2fUL, 0x358003c7f1a72ef6UL, 0x80d8c204ee26cdb4UL, 0x96fb257853f18f4cUL, 0x523165e0b1500f1UL, 0xb9f824957a1ca1daUL, 0xb314d55a35a6c097UL, 0x9c363fa0b3494c9dUL, 0x9347d9bedb3dfd4dUL, 0xa1086a306d6bbf83UL, 0xd48cfbe782a6dad0UL, 0x89ac0a117238cb3fUL, 0xbf8e467f7b6c0635UL, 0x90e8f77a43858330UL, 0x1bbca69ceca6ee5eUL, 0xa2986172f0dbc47bUL, 0xe61d79fc3bcff0c5UL, 0xf329cdee1e59fa56UL, 0x85dc1c6a30a68742UL, 0xf4f0b7b5f51ddaf2UL, 0xcc3af3f8779fe18aUL, 0xe6539bdc3cb3f4adUL, 0xbb838d4614d0e85UL, 0xe9e16f6bea3bb5e5UL, 0x17412f222283fbbUL, 0x1e5f14a2e035156cUL, 0xa5d520fb2b7146f4UL, 0x6202ab87c0dd39ceUL, 0x2e825e444507f76UL, 0x3cbe2945c06a2ad8UL, 0x4baa41f656e28de8UL, 0xc405570f81ba739dUL, 0x5d04bc888a0feecUL, 0x797c528b80d455b0UL, 0x975483ecadc51bd0UL, 0x880aae1f0374e73aUL, 0x92a16293dc560177UL, 0x2000860d98fa5757UL, 0x9c0c568ab2616c5fUL, 0xa1d5296e12439c71UL, 0x2542c527b8ac02eeUL, 0x40010c1b31f4aeafUL, 0x3818ad1564c2d8beUL, 0x43aa52dc248738e3UL, 0x4a858a4f715805dcUL, 0x8002183663e95d5eUL, 0x70315a2ac985b17cUL, 0x8754a5b8490e71c6UL, 0xc0ae19c2fa7f717UL, 0xd2fc13765e80468bUL, 0x52c7e5067ae03906UL, 0xbf693e2086b6b188UL, 0x8114363a92581281UL, 0x770005f624527121UL, 0x172a9b5f1c2b29f2UL, 0xcf12091119c73114UL, 0x2286c7524b02502UL, 0xee000bec48a4e243UL, 0x2e5536be385653e4UL, 0x9e241222338e6228UL, 0x9d512de88477b6abUL, 0xef834c2081b38b1UL, 0xee0f3c2f9947fc36UL, 0x8d88511473b69654UL, 0x3aa25bd108ef6d56UL, 0x1df0698410367163UL, 0xdc1e785f328ff86cUL, 0x1b10a228e76d2ca9UL, 0x7544b7a211dedaacUL, 0x3be0d308206ce2c6UL, 0xb83cf0be651ff0d8UL, 0x36214451ceda5953UL, 0xea896f4423bdb558UL, 0x77c1a61040d9c58cUL, 0x7079e17cca3fe1b0UL, 0x6c4288a39db4b2a7UL, 0xd512de88477b6ab0UL, 0xef834c2081b38b19UL, 0xe0f3c2f9947fc360UL, 0xd88511473b69654eUL, 0xaa25bd108ef6d560UL, 0xdf06984103671633UL, 0xc1e785f328ff86c1UL, 0xb10a228e76d2ca9dUL, 0x544b7a211dedaac0UL, 0xbe0d308206ce2c67UL, 0x83cf0be651ff0d83UL, 0x6214451ceda5953bUL, 0xa896f4423bdb5580UL, 0x7c1a61040d9c58ceUL, 0x79e17cca3fe1b07UL, 0xc4288a39db4b2a77UL, 0x512de88477b6ab00UL, 0xf834c2081b38b19dUL, 0xf3c2f9947fc360eUL, 0x88511473b69654eeUL, 0x3b5a240a227aaaafUL, 0x2291a70aaf239f0dUL, 0xacdd0e61661337e2UL, 0xa1625db77986fbd8UL, 0xefb5bd1689e2a9f1UL, 0x97db6d0fc715c22dUL, 0xeb1f4d9125cd343bUL, 0xf304ce3ee7a7a5b5UL, 0xdf6b7a2d13c553e2UL, 0x2fb6da1f8e2b845bUL, 0xd63e9b224b9a6877UL, 0xe6099c7dcf4f4b6bUL, 0xbed6f45a278aa7c4UL, 0x5f6db43f1c5708b7UL, 0xac7d36449734d0eeUL, 0xcc1338fb9e9e96d7UL, 0x7dade8b44f154f88UL, 0xbedb687e38ae116fUL, 0x58fa6c892e69a1dcUL, 0x982671f73d3d2dafUL, 0x625a246a533d63bfUL, 0xaf4ef3e6e80edee9UL, 0x3518841b5381846UL, 0x818c96be6ed0095aUL, 0x5db5bdd66b6d3bd1UL, 0x8c65c4d7494f41e5UL, 0xb40641d0839b6b72UL, 0xb2d9582cc90a40b0UL, 0x226a8eae1bcd8b0dUL, 0xca33aab40bcc7ffdUL, 0xdaa9d2f2eedd8d1aUL, 0xd472c50986bed365UL, 0x44d51d5c379b161aUL, 0x946755681798fffaUL, 0xb553a5e5ddbb1a35UL, 0xa8e58a130d7da6cbUL, 0x89aa3ab86f362c34UL, 0x28ceaad02f31fff4UL, 0x6aa74bcbbb76346bUL, 0x51cb14261afb4d97UL, 0x8a558072137ba4c7UL, 0x836576bac73103deUL, 0x67ebc6c49f073329UL, 0x12565d1c215cc92aUL, 0x8daaf5e6ebe0b521UL, 0xd432ce6f1730fb8aUL, 0x7d72dcdad7e53dacUL, 0x956ccf685613c050UL, 0x1b55ebcdd7c16a42UL, 0xa8659cde2e61f715UL, 0xfae5b9b5afca7b59UL, 0x2ad99ed0ac2780a0UL, 0x36abd79baf82d484UL, 0x50cb39bc5cc3ee2aUL, 0xf5cb736b5f94f6b3UL, 0x55b33da1584f0141UL, 0x6d57af375f05a908UL, 0xa1967378b987dc54UL, 0xeb96e6d6bf29ed66UL, 0xab667b42b09e0283UL, 0x43aeab6c731caebfUL, 0x91d4c5ebea5d449fUL, 0x65889cfe97b88132UL, 0xe70c83d575965703UL, 0x1e5ca3da2b2ea1d1UL, 0xf151a8cd4de87509UL, 0x79b468aec69a599aUL, 0x7fd972faff86fc02UL, 0x3cb947b4565d43a2UL, 0xe2a3519a9bd0ea12UL, 0xf368d15d8d34b335UL, 0xffb2e5f5ff0df804UL, 0xe0737a6a61ad7bebUL, 0x17be802faef32813UL, 0x5474f3e8f3823d94UL, 0x4ea5bebbeab1a20dUL, 0xc0e6f4d4c35af7d6UL, 0x2f7d005f5de65027UL, 0xa8e9e7d1e7047b28UL, 0x9d4b7d77d563441aUL, 0x81cde9a986b5efacUL, 0x5efa00bebbcca04fUL, 0x51d3cfa3ce08f650UL, 0x3a96faefaac68835UL, 0x9a9a2651c07c23f7UL, 0x6f0c2267eecbbca8UL, 0x1102ce1475fab75fUL, 0xc4ed808f4127426eUL, 0x35344ca380f847eeUL, 0xde1844cfdd977951UL, 0x22059c28ebf56ebeUL, 0x89db011e824e84dcUL, 0x6a68994701f08fdcUL, 0xbc30899fbb2ef2a2UL, 0x440b3851d7eadd7dUL, 0x13b6023d049d09b8UL, 0xd4d1328e03e11fb8UL, 0x7861133f765de544UL, 0x881670a3afd5bafbUL, 0x276c047a093a1370UL, 0x30a3901ecad5c3dfUL, 0x223a056475e936beUL, 0xa289b014b6402e09UL, 0xff187da406de74e5UL, 0x6147203d95ab87beUL, 0x44740ac8ebd26d7cUL, 0x451360296c805c12UL, 0xfe30fb480dbce9cbUL, 0x5b8fb579e640f3d3UL, 0x5a10368b4ef626cfUL, 0x3883910130ebe3dbUL, 0x4da183c00fd38192UL, 0xb71f6af3cc81e7a6UL, 0xb4206d169dec4d9eUL, 0x7107220261d7c7b6UL, 0x9b4307801fa70324UL, 0xf73f20e5541433e3UL, 0xbab8f937a28a670aUL, 0x50ab15572a44d492UL, 0x87467a502be4544cUL, 0xee7e41caa82867c6UL, 0x7571f26f4514ce15UL, 0xa1562aae5489a925UL, 0xe8cf4a057c8a898UL, 0xdcfc83955050cf8cUL, 0xeae3e4de8a299c2bUL, 0x42ac555ca913524aUL, 0x1d19e940af915131UL, 0xb9f9072aa0a19f18UL, 0xd5c7c9bd14533857UL, 0x8558aab95226a495UL, 0x3a33d2815f22a262UL, 0xeaf3fb578c54c29fUL, 0x7977b060b1f48c98UL, 0xb81404214da612d4UL, 0xc5a7d052aaef16c1UL, 0x4ce603add5be7991UL, 0x201743dbfabbe506UL, 0xc28d591172a77e57UL, 0x3a8fd5f541747f87UL, 0xcdf259666b0f8dUL, 0x92d6a4ad6c25363bUL, 0x37bfe3710ca5a751UL, 0xc4dfdeba9642ad0bUL, 0x989a11b001c1e3b5UL, 0xf7556a4041189041UL, 0xddda97b1f0a0155cUL, 0x387fc825382f0812UL, 0xa835d662ce943bc5UL, 0x3c52f79a1b63dcb4UL, 0x9107e3008ab7146UL, 0xc13fe51a64f44221UL, 0x506bacc59d28778aUL, 0x78a5ef3436c7b969UL, 0x1220fc601156e28cUL, 0x827fca34c9e88442UL, 0xa0d7598b3a50ef14UL, 0xf14bde686d8f72d2UL, 0x2441f8c022adc518UL, 0x4ff946993d10884UL, 0x41aeb31674a1de28UL, 0xe297bcd0db1ee5a5UL, 0x4883f180455b8a31UL, 0x9ff28d327a21108UL, 0x1a5c932e245440ffUL, 0x17d75abb2f6f377dUL, 0x23a2b253635c4f9cUL, 0xa23e24f65bee7014UL, 0x34b9265c48a881feUL, 0x2faeb5765ede6efaUL, 0x474564a6c6b89f38UL, 0x447c49ecb7dce028UL, 0x69724cb8915103fcUL, 0x5f5d6aecbdbcddf4UL, 0x8e8ac94d8d713e70UL, 0x88f893d96fb9c050UL, 0x4be56c73efb5fb57UL, 0x6c42f6c3e22b47dfUL, 0xafb0c3c8f309271fUL, 0xa03152e2cbd9d2a5UL, 0xecb2de5127c0a01UL, 0xa7dce9d5d047389UL, 0xedc4d6c20ff915c1UL, 0xf1a2d0958319f74fUL, 0x1d965bca24f81402UL, 0x14fb9d3aba08e712UL, 0xdb89ad841ff22b82UL, 0xe345a12b0633ee9fUL, 0xa22d429684e7d4abUL, 0xfb0f196fed433213UL, 0x5b60a5bd60f0cfbUL, 0x774b370618cd8f3bUL, 0xdd5b702fc4d855f9UL, 0x24e611c543d49810UL, 0xb9c945e445f54208UL, 0x5f561b5c25314c72UL, 0xbab6e05f89b0abf2UL, 0x49cc238a87a93021UL, 0x73928bc88bea8410UL, 0xbeac36b84a6298e5UL, 0x756dc0bf136157e4UL, 0x939847150f526043UL, 0xe725179117d50820UL, 0x7d586d7094c531caUL, 0x73da747cebd55367UL, 0xf5c8ad3087f63cb1UL, 0x7cef7e71c6414bbeUL, 0x4b70afb13d203191UL, 0xe7b4e8f9d7aaa6ceUL, 0xeb915a610fec7962UL, 0xf9defce38c82977dUL, 0x96e15f627a406322UL, 0x566824f16242b133UL, 0x5da97d8868a0ef2UL, 0x4118a894f0ee7504UL, 0x9c02cb94e02a9441UL, 0x35d1bce009929ec9UL, 0xd94d0cab9446e1d3UL, 0x3094007a0837b1f7UL, 0x89c5e279d4ff7a86UL, 0x6ba379c013253d92UL, 0xb29a1957288dc3a6UL, 0x612800f4106f63efUL, 0x138bc4f3a9fef50cUL, 0x4e470682eb5d878bUL, 0xb7cc11b4c8497b7bUL, 0x70f550bbc9359c20UL, 0x96d7fcb74757b81cUL, 0x58ff8071bacf3b9UL, 0xbd60007309c00ac1UL, 0x534ff0247b8063beUL, 0x9c6f8c3e9a05223cUL, 0x921e050cfa4e1bddUL, 0xa83823fc8ad2e9b5UL, 0x143ab11b1eeb9c82UL, 0x891f6d2d20a0167cUL, 0x243c0a19f49c37baUL, 0x507047f915a5d36bUL, 0x287562363dd73905UL, 0x123eda5a41402cf8UL, 0x48781433e9386f74UL, 0xa0e08ff22b4ba6d6UL, 0x50eac46c7bae720aUL, 0x247db4b4828059f0UL, 0x90f02867d270dee8UL, 0x41c11fe456974dacUL, 0xa1d588d8f75ce415UL, 0x48fb69690500b3e0UL, 0x21e050cfa4e1bdd0UL, 0x83823fc8ad2e9b59UL, 0x43ab11b1eeb9c82aUL, 0x91f6d2d20a0167c1UL, 0xdac1549d84d4870fUL, 0xd5fc5c8bc30fca85UL, 0x35f372303498cbaaUL, 0x922dd0f400a89d86UL, 0x2c835c39c4bef2b1UL, 0x79009a0d1f4d693cUL, 0xd943b53380daccaaUL, 0x959bd4b815fb6908UL, 0x5906b873897de562UL, 0xf201341a3e9ad278UL, 0xb2876a6701b59954UL, 0x2b37a9702bf6d211UL, 0x2b0c85e5dfec366bUL, 0x36fa4b2ee46758c7UL, 0xd7ab859dea806956UL, 0xe7af27b04347f627UL, 0xcf18fec972cf9079UL, 0xbf0cb547519c4db9UL, 0x1df25a683ceb8953UL, 0x7e9e3a309225be4bUL, 0x73008902888dc5dUL, 0xace149943a6a6744UL, 0x8941e583903c4958UL, 0x4cfc013130e12e92UL, 0xe6011205111b8baUL, 0x59c2932874d4ce88UL, 0x1283cb07207892b1UL, 0x99f8026261c25d25UL, 0x85c1d7426f348ddbUL, 0x617d054a70fb6127UL, 0x97a2c75da91a7e9dUL, 0x82307194d72ee84eUL, 0xb83ae84de691bb6UL, 0xc2fa0a94e1f6c24fUL, 0x2f458ebb5234fd3aUL, 0x460e329ae5dd09dUL, 0x17075d09bcd2376cUL, 0x85f41529c3ed849eUL, 0x5e8b1d76a469fa75UL, 0x8c1c6535cbba13aUL, 0x2e0eba1379a46ed8UL, 0xbe82a5387db093cUL, 0xbd163aed48d3f4ebUL, 0x11838ca6b9774274UL, 0x5c1d7426f348ddb0UL, 0x17d054a70fb61278UL, 0x7a2c75da91a7e9d6UL, 0x2307194d72ee84e9UL, 0x213b1d4f2b8647cfUL, 0xfd588a54863ed8c7UL, 0x46fdbae6caa48853UL, 0xf7ce47caf1775bd6UL, 0x42763a9e570c8f9eUL, 0xfab114a90c7db18eUL, 0x8dfb75cd954910a7UL, 0xef9c8f95e2eeb7acUL, 0x84ec753cae191f3cUL, 0xf562295218fb631cUL, 0x1bf6eb9b2a92214fUL, 0xdf391f2bc5dd6f59UL, 0x9d8ea795c323e78UL, 0xeac452a431f6c639UL, 0x37edd7365524429fUL, 0xbe723e578bbadeb2UL, 0x8ab021f07573805fUL, 0x7708652fabf7045UL, 0xdd7eff3f43a3dec0UL, 0xcd2409ff03dfef60UL, 0x156043e0eae700beUL, 0xee10ca5f57ee08bUL, 0xbafdfe7e8747bd80UL, 0x9a4813fe07bfdec1UL, 0x2ac087c1d5ce017cUL, 0x1dc2194beafdc116UL, 0x75fbfcfd0e8f7b00UL, 0x349027fc0f7fbd83UL, 0xcc80fa81668bfe57UL, 0xe97c118d4ca97e1bUL, 0x5952a8a9f4f5adffUL, 0xd8e03aa80a552902UL, }; + +#endif diff --git a/crypto_kem/hqc-128/avx2/gf.c b/crypto_kem/hqc-128/avx2/gf.c new file mode 100644 index 00000000..3022c732 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/gf.c @@ -0,0 +1,167 @@ +#include "gf.h" +#include "parameters.h" +#include +#include +#include +/** + * @file gf.c + * Galois field implementation with multiplication using the pclmulqdq instruction + */ + + +static uint16_t gf_reduce(uint64_t x, size_t deg_x); +static uint16_t gf_quad(uint64_t a); + + + +/** + * Logarithm of elements of GF(2^10) to the base alpha (root of x^10 + x^3 + 1). + * The logarithm of 0 is set to 1024 by convention. + */ +static const uint16_t log[1024] = { + 1024, 0, 1, 77, 2, 154, 78, 956, 3, 10, 155, 325, 79, 618, 957, 231, 4, 308, 11, 200, 156, 889, 326, 695, 80, 24, 619, 87, 958, 402, 232, 436, 5, 513, 309, 551, 12, 40, 201, 479, 157, 518, 890, 101, 327, 164, 696, 860, 81, 258, 25, 385, 620, 277, 88, 577, 959, 772, 403, 680, 233, 52, 437, 966, 6, 20, 514, 768, 310, 650, 552, 129, 13, 314, 41, 849, 202, 757, 480, 980, 158, 213, 519, 335, 891, 462, 102, 907, 328, 654, 165, 264, 697, 369, 861, 354, 82, 675, 259, 590, 26, 628, 386, 991, 621, 556, 278, 822, 89, 219, 578, 117, 960, 937, 773, 533, 404, 491, 681, 241, 234, 133, 53, 595, 438, 178, 967, 943, 7, 1020, 21, 305, 515, 510, 769, 255, 311, 17, 651, 210, 553, 672, 130, 934, 14, 1017, 315, 1014, 42, 610, 850, 191, 203, 318, 758, 31, 481, 428, 981, 568, 159, 613, 214, 752, 520, 667, 336, 788, 892, 45, 463, 801, 103, 525, 908, 705, 329, 194, 655, 1008, 166, 642, 265, 296, 698, 853, 370, 633, 862, 899, 355, 779, 83, 321, 676, 97, 260, 845, 591, 818, 27, 206, 629, 797, 387, 793, 992, 727, 622, 34, 557, 661, 279, 420, 823, 834, 90, 761, 220, 391, 579, 926, 118, 451, 961, 431, 938, 349, 774, 563, 534, 446, 405, 484, 492, 731, 682, 341, 242, 714, 235, 571, 134, 290, 54, 412, 596, 140, 439, 984, 179, 996, 968, 810, 944, 539, 8, 616, 1021, 152, 22, 400, 306, 887, 516, 162, 511, 38, 770, 50, 256, 275, 312, 755, 18, 648, 652, 367, 211, 460, 554, 217, 673, 626, 131, 176, 935, 489, 15, 670, 1018, 508, 316, 426, 1015, 608, 43, 523, 611, 665, 851, 897, 192, 640, 204, 791, 319, 843, 759, 924, 32, 418, 482, 339, 429, 561, 982, 808, 569, 410, 160, 48, 614, 398, 215, 174, 753, 365, 521, 895, 668, 424, 337, 806, 789, 922, 893, 804, 46, 172, 464, 872, 802, 870, 104, 466, 526, 283, 909, 874, 706, 736, 330, 528, 195, 380, 656, 285, 1009, 1003, 167, 106, 643, 838, 266, 468, 297, 66, 699, 708, 854, 111, 371, 738, 634, 60, 863, 911, 900, 827, 356, 876, 780, 497, 84, 197, 322, 74, 677, 382, 98, 548, 261, 332, 846, 765, 592, 530, 819, 587, 28, 1011, 207, 302, 630, 1005, 798, 749, 388, 658, 794, 94, 993, 287, 728, 346, 623, 645, 35, 149, 558, 840, 662, 505, 280, 169, 421, 395, 824, 108, 835, 377, 91, 299, 762, 71, 221, 68, 392, 146, 580, 268, 927, 224, 119, 470, 452, 687, 962, 856, 432, 227, 939, 113, 350, 976, 775, 701, 564, 930, 535, 710, 447, 723, 406, 636, 485, 271, 493, 62, 732, 918, 683, 373, 342, 583, 243, 740, 715, 719, 236, 902, 572, 690, 135, 829, 291, 186, 55, 865, 413, 455, 597, 913, 141, 744, 440, 782, 985, 473, 180, 499, 997, 602, 969, 358, 811, 122, 945, 878, 540, 247, 9, 324, 617, 230, 1022, 76, 153, 955, 23, 86, 401, 435, 307, 199, 888, 694, 517, 100, 163, 859, 512, 550, 39, 478, 771, 679, 51, 965, 257, 384, 276, 576, 313, 848, 756, 979, 19, 767, 649, 128, 653, 263, 368, 353, 212, 334, 461, 906, 555, 821, 218, 116, 674, 589, 627, 990, 132, 594, 177, 942, 936, 532, 490, 240, 16, 209, 671, 933, 1019, 304, 509, 254, 317, 30, 427, 567, 1016, 1013, 609, 190, 44, 800, 524, 704, 612, 751, 666, 787, 852, 632, 898, 778, 193, 1007, 641, 295, 205, 796, 792, 726, 320, 96, 844, 817, 760, 390, 925, 450, 33, 660, 419, 833, 483, 730, 340, 713, 430, 348, 562, 445, 983, 995, 809, 538, 570, 289, 411, 139, 161, 37, 49, 274, 615, 151, 399, 886, 216, 625, 175, 488, 754, 647, 366, 459, 522, 664, 896, 639, 669, 507, 425, 607, 338, 560, 807, 409, 790, 842, 923, 417, 894, 423, 805, 921, 47, 397, 173, 364, 465, 282, 873, 735, 803, 171, 871, 869, 105, 837, 467, 65, 527, 379, 284, 1002, 910, 826, 875, 496, 707, 110, 737, 59, 331, 764, 529, 586, 196, 73, 381, 547, 657, 93, 286, 345, 1010, 301, 1004, 748, 168, 394, 107, 376, 644, 148, 839, 504, 267, 223, 469, 686, 298, 70, 67, 145, 700, 929, 709, 722, 855, 226, 112, 975, 372, 582, 739, 718, 635, 270, 61, 917, 864, 454, 912, 743, 901, 689, 828, 185, 357, 121, 877, 246, 781, 472, 498, 601, 85, 434, 198, 693, 323, 229, 75, 954, 678, 964, 383, 575, 99, 858, 549, 477, 262, 352, 333, 905, 847, 978, 766, 127, 593, 941, 531, 239, 820, 115, 588, 989, 29, 566, 1012, 189, 208, 932, 303, 253, 631, 777, 1006, 294, 799, 703, 750, 786, 389, 449, 659, 832, 795, 725, 95, 816, 994, 537, 288, 138, 729, 712, 347, 444, 624, 487, 646, 458, 36, 273, 150, 885, 559, 408, 841, 416, 663, 638, 506, 606, 281, 734, 170, 868, 422, 920, 396, 363, 825, 495, 109, 58, 836, 64, 378, 1001, 92, 344, 300, 747, 763, 585, 72, 546, 222, 685, 69, 144, 393, 375, 147, 503, 581, 717, 269, 916, 928, 721, 225, 974, 120, 245, 471, 600, 453, 742, 688, 184, 963, 574, 857, 476, 433, 692, 228, 953, 940, 238, 114, 988, 351, 904, 977, 126, 776, 293, 702, 785, 565, 188, 931, 252, 536, 137, 711, 443, 448, 831, 724, 815, 407, 415, 637, 605, 486, 457, 272, 884, 494, 57, 63, 1000, 733, 867, 919, 362, 684, 143, 374, 502, 343, 746, 584, 545, 244, 599, 741, 183, 716, 915, 720, 973, 237, 987, 903, 125, 573, 475, 691, 952, 136, 442, 830, 814, 292, 784, 187, 251, 56, 999, 866, 361, 414, 604, 456, 883, 598, 182, 914, 972, 142, 501, 745, 544, 441, 813, 783, 250, 986, 124, 474, 951, 181, 971, 500, 543, 998, 360, 603, 882, 970, 542, 359, 881, 812, 249, 123, 950, 946, 947, 879, 948, 541, 880, 248, 949 +}; + + + +/** + * Returns the integer i such that elt = a^i + * where a is the primitive element of GF(2^GF_M). + *@returns the logarithm of the given element + */ +uint16_t PQCLEAN_HQC128_AVX2_gf_log(uint16_t elt) { + return log[elt]; +} + + + +/** + * Reduces polynomial x modulo primitive polynomial GF_POLY. + * @returns x mod GF_POLY + * @param[in] x Polynomial of degree less than 64 + * @param[in] deg_x The degree of polynomial x + */ +uint16_t gf_reduce(uint64_t x, size_t deg_x) { + // Compute the distance between the primitive polynomial first two set bits + size_t lz1 = __builtin_clz(PARAM_GF_POLY); + size_t lz2 = __builtin_clz(PARAM_GF_POLY ^ 1 << PARAM_M); + size_t dist = lz2 - lz1; + + // Deduce the number of steps of reduction + size_t steps = CEIL_DIVIDE(deg_x - (PARAM_M - 1), dist); + + // Reduce + for (size_t i = 0; i < steps; ++i) { + uint64_t mod = x >> PARAM_M; + x &= (1 << PARAM_M) - 1; + x ^= mod; + + size_t tz1 = 0; + uint16_t rmdr = PARAM_GF_POLY ^ 1; + for (size_t j = __builtin_popcount(PARAM_GF_POLY) - 2; j; --j) { + size_t tz2 = __builtin_ctz(rmdr); + size_t shift = tz2 - tz1; + mod <<= shift; + x ^= mod; + rmdr ^= 1 << tz2; + tz1 = tz2; + } + } + + return x; +} + + + +/** + * Multiplies two elements of GF(2^GF_M). + * @returns the product a*b + * @param[in] a Element of GF(2^GF_M) + * @param[in] b Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQC128_AVX2_gf_mul(uint16_t a, uint16_t b) { + __m128i va = _mm_cvtsi32_si128(a); + __m128i vb = _mm_cvtsi32_si128(b); + __m128i vab = _mm_clmulepi64_si128(va, vb, 0); + uint32_t ab = _mm_cvtsi128_si32(vab); + + return gf_reduce(ab, 2 * (PARAM_M - 1)); +} + + + +/** + * Squares an element of GF(2^GF_M). + * @returns a^2 + * @param[in] a Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQC128_AVX2_gf_square(uint16_t a) { + uint32_t b = a; + uint32_t s = b & 1; + for (size_t i = 1; i < PARAM_M; ++i) { + b <<= 1; + s ^= b & (1 << 2 * i); + } + + return gf_reduce(s, 2 * (PARAM_M - 1)); +} + + + +/** + * Computes the 4th power of an element of GF(2^GF_M). + * @returns a^4 + * @param[in] a Element of GF(2^GF_M) + */ +uint16_t gf_quad(uint64_t a) { + uint64_t q = a & 1; + for (size_t i = 1; i < PARAM_M; ++i) { + a <<= 3; + q ^= a & (1ull << 4 * i); + } + + return gf_reduce(q, 4 * (PARAM_M - 1)); +} + + + +/** + * Computes the inverse of an element of GF(2^10), + * using a shorter chain of squares and multiplications than fast exponentiation. + * @returns the inverse of a + * @param[in] a Element of GF(2^10) + */ +uint16_t PQCLEAN_HQC128_AVX2_gf_inverse(uint16_t a) { + uint16_t p; + uint16_t a2; + + a2 = PQCLEAN_HQC128_AVX2_gf_square(a); // a^2 + a = PQCLEAN_HQC128_AVX2_gf_mul(a2, a); // a^2.a + p = gf_quad(a); // a^8.a^4 + a = PQCLEAN_HQC128_AVX2_gf_mul(p, a); // a^8.a^4.a^2.a + p = gf_quad(a); // a^32.a^16.a^8.a^4 + p = gf_quad(p); // a^128.a^64.a^32.a^16 + a = PQCLEAN_HQC128_AVX2_gf_mul(p, a); // a^128.a^64.a^32.a^16.a^8.a^4.a^2.a + p = gf_quad(a); // a^512.a^256.a^128.a^64.a^32.a^16.a^8.a^4 + p = PQCLEAN_HQC128_AVX2_gf_mul(p, a2); // a^-1 + + return p; +} + + + +/** + * Returns i modulo 2^GF_M-1. + * i must be less than 2*(2^GF_M-1). + * Therefore, the return value is either i or i-2^GF_M+1. + * @returns i mod (2^GF_M-1) + * @param[in] i The integer whose modulo is taken + */ +uint16_t PQCLEAN_HQC128_AVX2_gf_mod(uint16_t i) { + uint16_t tmp = i - PARAM_GF_MUL_ORDER; + + // mask = 0xffff if (i < GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & PARAM_GF_MUL_ORDER); +} diff --git a/crypto_kem/hqc-128/avx2/gf.h b/crypto_kem/hqc-128/avx2/gf.h new file mode 100644 index 00000000..e08d8403 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/gf.h @@ -0,0 +1,29 @@ +#ifndef GF_H +#define GF_H + + +/** + * @file gf.h + * Header file of gf.c + */ + +#include + +#include +#include + +void PQCLEAN_HQC128_AVX2_gf_generate(uint16_t *exp, uint16_t *log, int16_t m); + + +uint16_t PQCLEAN_HQC128_AVX2_gf_log(uint16_t elt); + +uint16_t PQCLEAN_HQC128_AVX2_gf_mul(uint16_t a, uint16_t b); + +uint16_t PQCLEAN_HQC128_AVX2_gf_square(uint16_t a); + +uint16_t PQCLEAN_HQC128_AVX2_gf_inverse(uint16_t a); + +uint16_t PQCLEAN_HQC128_AVX2_gf_mod(uint16_t i); + + +#endif diff --git a/crypto_kem/hqc-128/avx2/gf2x.c b/crypto_kem/hqc-128/avx2/gf2x.c new file mode 100644 index 00000000..6a1f9bd1 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/gf2x.c @@ -0,0 +1,558 @@ +#include "gf2x.h" +#include "parameters.h" +#include +#include +#include + +/** + * \file gf2x.c + * \brief AVX2 implementation of multiplication of two polynomials + */ + + +// sizes for Toom-Cook +#define T_TM3_3W_256 32 +#define T_TM3_3W_64 128 + +#define VEC_N_ARRAY_SIZE_VEC CEIL_DIVIDE(PARAM_N, 256) /*!< The number of needed vectors to store PARAM_N bits*/ +#define WORD 64 +#define LAST64 (PARAM_N >> 6) +uint64_t a1_times_a2[2 * VEC_N_256_SIZE_64 + 1]; +uint64_t tmp_reduce[VEC_N_ARRAY_SIZE_VEC << 2]; +__m256i *o256 = (__m256i *) tmp_reduce; +uint64_t bloc64[PARAM_OMEGA_R]; // Allocation with the biggest possible weight +uint64_t bit64[PARAM_OMEGA_R]; // Allocation with the biggest possible weight + + +static inline void reduce(uint64_t *o, const uint64_t *a); +inline static void karat_mult_1(__m128i *C, __m128i *A, __m128i *B); +inline static void karat_mult_2(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_4(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_8(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_16(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_32(__m256i *C, __m256i *A, __m256i *B); +static inline void divByXplus1(__m256i *out, __m256i *in, int size); +static void TOOM3Mult(uint64_t *Out, const uint64_t *A, const uint64_t *B); + + + +/** + * @brief Compute o(x) = a(x) mod \f$ X^n - 1\f$ + * + * This function computes the modular reduction of the polynomial a(x) + * + * @param[out] o Pointer to the result + * @param[in] a Pointer to the polynomial a(x) + */ +static inline void reduce(uint64_t *o, const uint64_t *a) { + __m256i r256, carry256; + __m256i *a256 = (__m256i *) a; + static const int32_t dec64 = PARAM_N & 0x3f; + static const int32_t d0 = WORD - dec64; + int32_t i, i2; + + for (i = LAST64 ; i < (PARAM_N >> 5) - 4 ; i += 4) { + r256 = _mm256_lddqu_si256((__m256i const *) (& a[i])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_lddqu_si256((__m256i const *) (& a[i + 1])); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = a256[i2] ^ r256; + } + + r256 = (__m256i) { + a[i], a[i + 1], 0x0UL, 0x0UL + }; + carry256 = _mm256_lddqu_si256((__m256i const *) (& a[i + 1])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = (a256[i2] ^ r256); + tmp_reduce[LAST64] &= RED_MASK; + memcpy(o, tmp_reduce, VEC_N_SIZE_BYTES); +} + +/** + * @brief Compute C(x) = A(x)*B(x) + * A(x) and B(x) are stored in 128-bit registers + * This function computes A(x)*B(x) using Karatsuba + * + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_1(__m128i *C, __m128i *A, __m128i *B) { + __m128i D1[2]; + __m128i D0[2], D2[2]; + __m128i Al = _mm_loadu_si128(A); + __m128i Ah = _mm_loadu_si128(A + 1); + __m128i Bl = _mm_loadu_si128(B); + __m128i Bh = _mm_loadu_si128(B + 1); + + // Compute Al.Bl=D0 + __m128i DD0 = _mm_clmulepi64_si128(Al, Bl, 0); + __m128i DD2 = _mm_clmulepi64_si128(Al, Bl, 0x11); + __m128i AAlpAAh = _mm_xor_si128(Al, _mm_shuffle_epi32(Al, 0x4e)); + __m128i BBlpBBh = _mm_xor_si128(Bl, _mm_shuffle_epi32(Bl, 0x4e)); + __m128i DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D0[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D0[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Compute Ah.Bh=D2 + DD0 = _mm_clmulepi64_si128(Ah, Bh, 0); + DD2 = _mm_clmulepi64_si128(Ah, Bh, 0x11); + AAlpAAh = _mm_xor_si128(Ah, _mm_shuffle_epi32(Ah, 0x4e)); + BBlpBBh = _mm_xor_si128(Bh, _mm_shuffle_epi32(Bh, 0x4e)); + DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D2[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D2[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Compute AlpAh.BlpBh=D1 + // Initialisation of AlpAh and BlpBh + __m128i AlpAh = _mm_xor_si128(Al, Ah); + __m128i BlpBh = _mm_xor_si128(Bl, Bh); + DD0 = _mm_clmulepi64_si128(AlpAh, BlpBh, 0); + DD2 = _mm_clmulepi64_si128(AlpAh, BlpBh, 0x11); + AAlpAAh = _mm_xor_si128(AlpAh, _mm_shuffle_epi32(AlpAh, 0x4e)); + BBlpBBh = _mm_xor_si128(BlpBh, _mm_shuffle_epi32(BlpBh, 0x4e)); + DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D1[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D1[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Final comutation of C + __m128i middle = _mm_xor_si128(D0[1], D2[0]); + C[0] = D0[0]; + C[1] = middle ^ D0[0] ^ D1[0]; + C[2] = middle ^ D1[1] ^ D2[1]; + C[3] = D2[1]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_2(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[2], D1[2], D2[2], SAA, SBB; + __m128i *A128 = (__m128i *)A, *B128 = (__m128i *)B; + + karat_mult_1((__m128i *) D0, A128, B128); + karat_mult_1((__m128i *) D2, A128 + 2, B128 + 2); + + SAA = A[0] ^ A[1]; + SBB = B[0] ^ B[1]; + + karat_mult_1((__m128i *) D1, (__m128i *) &SAA, (__m128i *) &SBB); + __m256i middle = _mm256_xor_si256(D0[1], D2[0]); + + C[0] = D0[0]; + C[1] = middle ^ D0[0] ^ D1[0]; + C[2] = middle ^ D1[1] ^ D2[1]; + C[3] = D2[1]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_4(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[4], D1[4], D2[4], SAA[2], SBB[2]; + + karat_mult_2( D0, A, B); + karat_mult_2(D2, A + 2, B + 2); + + SAA[0] = A[0] ^ A[2]; + SBB[0] = B[0] ^ B[2]; + SAA[1] = A[1] ^ A[3]; + SBB[1] = B[1] ^ B[3]; + + karat_mult_2( D1, SAA, SBB); + + __m256i middle0 = _mm256_xor_si256(D0[2], D2[0]); + __m256i middle1 = _mm256_xor_si256(D0[3], D2[1]); + + C[0] = D0[0]; + C[1] = D0[1]; + C[2] = middle0 ^ D0[0] ^ D1[0]; + C[3] = middle1 ^ D0[1] ^ D1[1]; + C[4] = middle0 ^ D1[2] ^ D2[2]; + C[5] = middle1 ^ D1[3] ^ D2[3]; + C[6] = D2[2]; + C[7] = D2[3]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_8(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[8], D1[8], D2[8], SAA[4], SBB[4]; + + karat_mult_4( D0, A, B); + karat_mult_4(D2, A + 4, B + 4); + + for (int32_t i = 0 ; i < 4 ; i++) { + int is = i + 4; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_4(D1, SAA, SBB); + + for (int32_t i = 0 ; i < 4 ; i++) { + int32_t is = i + 4; + int32_t is2 = is + 4; + int32_t is3 = is2 + 4; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_16(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[16], D1[16], D2[16], SAA[8], SBB[8]; + + karat_mult_8( D0, A, B); + karat_mult_8(D2, A + 8, B + 8); + + for (int32_t i = 0 ; i < 8 ; i++) { + int32_t is = i + 8; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_8( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 8 ; i++) { + int32_t is = i + 8; + int32_t is2 = is + 8; + int32_t is3 = is2 + 8; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_32(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[32], D1[32], D2[32], SAA[16], SBB[16]; + + karat_mult_16( D0, A, B); + karat_mult_16(D2, A + 16, B + 16); + + for (int32_t i = 0 ; i < 16 ; i++) { + int is = i + 16; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_16( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 16 ; i++) { + int32_t is = i + 16; + int32_t is2 = is + 16; + int32_t is3 = is2 + 16; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + +/** + * @brief Compute B(x) = A(x)/(x+1) + * + * This function computes A(x)/(x+1) using a Quercia like algorithm + * @param[out] out Pointer to the result + * @param[in] in Pointer to the polynomial A(x) + * @param[in] size used to define the number of coeeficients of A + */ +static inline void divByXplus1(__m256i *out, __m256i *in, int size) { + uint64_t *A = (uint64_t *) in; + uint64_t *B = (uint64_t *) out; + + B[0] = A[0]; + + for (int32_t i = 1 ; i < 2 * (size << 2) ; i++) { + B[i] = B[i - 1] ^ A[i]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) using TOOM3Mult + * + * This function computes A(x)*B(x) using TOOM-COOK3 Multiplication + * last multiplication are done using Karatsuba + * @param[out] Out Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +static void TOOM3Mult(uint64_t *Out, const uint64_t *A, const uint64_t *B) { + static __m256i U0[T_TM3_3W_256], V0[T_TM3_3W_256], U1[T_TM3_3W_256], V1[T_TM3_3W_256], U2[T_TM3_3W_256], V2[T_TM3_3W_256]; + static __m256i W0[2 * (T_TM3_3W_256)], W1[2 * (T_TM3_3W_256)], W2[2 * (T_TM3_3W_256)], W3[2 * (T_TM3_3W_256)], W4[2 * (T_TM3_3W_256)]; + static __m256i tmp[2 * (T_TM3_3W_256)]; + static __m256i ro256[6 * (T_TM3_3W_256)]; + const __m256i zero = (__m256i) { + 0ul, 0ul, 0ul, 0ul + }; + int32_t T2 = T_TM3_3W_64 << 1; + + for (int32_t i = 0 ; i < T_TM3_3W_256 - 1 ; i++) { + int32_t i4 = i << 2; + int32_t i42 = i4 - 2; + U0[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4])); + V0[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4])); + U1[i] = _mm256_lddqu_si256((__m256i const *)(& A[i42 + T_TM3_3W_64])); + V1[i] = _mm256_lddqu_si256((__m256i const *)(& B[i42 + T_TM3_3W_64])); + U2[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4 + T2 - 4])); + V2[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4 + T2 - 4])); + } + + for (int32_t i = T_TM3_3W_256 - 1 ; i < T_TM3_3W_256 ; i++) { + int32_t i4 = i << 2; + int32_t i41 = i4 + 1; + U0[i] = (__m256i) { + A[i4], A[i41], 0x0ul, 0x0ul + }; + V0[i] = (__m256i) { + B[i4], B[i41], 0x0ul, 0x0ul + }; + U1[i] = (__m256i) { + A[i4 + T_TM3_3W_64 - 2], A[i41 + T_TM3_3W_64 - 2], 0x0ul, 0x0ul + }; + V1[i] = (__m256i) { + B[i4 + T_TM3_3W_64 - 2], B[i41 + T_TM3_3W_64 - 2], 0x0ul, 0x0ul + }; + U2[i] = (__m256i) { + A[i4 - 4 + T2], A[i4 - 3 + T2], 0x0ul, 0x0ul + }; + V2[i] = (__m256i) { + B[i4 - 4 + T2], B[i4 - 3 + T2], 0x0ul, 0x0ul + }; + } + + // Evaluation phase : x= X^64 + // P(X): P0=(0); P1=(1); P2=(x); P3=(1+x); P4=(\infty) + // Evaluation: 5*2 add, 2*2 shift; 5 mul (n) + //W3 = U2 + U1 + U0 ; W2 = V2 + V1 + V0 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W3[i] = U0[i] ^ U1[i] ^ U2[i]; + W2[i] = V0[i] ^ V1[i] ^ V2[i]; + } + + //W1 = W2 * W3 + karat_mult_32( W1, W2, W3); + + //W0 =(U1 + U2*x)*x ; W4 =(V1 + V2*x)*x (SIZE = T_TM3_3W_256 !) + int64_t *U1_64 = ((int64_t *) U1); + int64_t *U2_64 = ((int64_t *) U2); + + int64_t *V1_64 = ((int64_t *) V1); + int64_t *V2_64 = ((int64_t *) V2); + + W0[0] = _mm256_set_epi64x(U1_64[2] ^ U2_64[1], U1_64[1] ^ U2_64[0], U1_64[0], 0); + W4[0] = _mm256_set_epi64x(V1_64[2] ^ V2_64[1], V1_64[1] ^ V2_64[0], V1_64[0], 0); + + U1_64 = ((int64_t *) U1); + U2_64 = ((int64_t *) U2); + + V1_64 = ((int64_t *) V1); + V2_64 = ((int64_t *) V2); + + for (int32_t i = 1 ; i < T_TM3_3W_256 ; i++) { + int i4 = i << 2; + W0[i] = _mm256_lddqu_si256((__m256i const *)(& U1_64[i4 - 1])); + W0[i] ^= _mm256_lddqu_si256((__m256i const *)(& U2_64[i4 - 2])); + + W4[i] = _mm256_lddqu_si256((__m256i const *)(& V1_64[i4 - 1])); + W4[i] ^= _mm256_lddqu_si256((__m256i const *)(& V2_64[i4 - 2])); + } + + //W3 = W3 + W0 ; W2 = W2 + W4 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W3[i] ^= W0[i]; + W2[i] ^= W4[i]; + } + + //W0 = W0 + U0 ; W4 = W4 + V0 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W0[i] ^= U0[i]; + W4[i] ^= V0[i]; + } + + //W3 = W3 * W2 ; W2 = W0 * W4 + karat_mult_32(tmp, W3, W2); + + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W3[i] = tmp[i]; + } + + karat_mult_32(W2, W0, W4); + //W4 = U2 * V2 ; W0 = U0 * V0 + karat_mult_32(W4, U2, V2); + karat_mult_32(W0, U0, V0); + + // Interpolation phase + // 9 add, 1 shift, 1 Smul, 2 Sdiv (2n) + //W3 = W3 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W3[i] ^= W2[i]; + } + + //W1 = W1 + W0 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W1[i] ^= W0[i]; + } + + //W2 =(W2 + W0)/x -> x = X^64 + U1_64 = ((int64_t *) W2); + U2_64 = ((int64_t *) W0); + for (int32_t i = 0 ; i < (T_TM3_3W_256 << 1) ; i++) { + int32_t i4 = i << 2; + W2[i] = _mm256_lddqu_si256((__m256i const *)(& U1_64[i4 + 1])); + W2[i] ^= _mm256_lddqu_si256((__m256i const *)(& U2_64[i4 + 1])); + } + + //W2 =(W2 + W3 + W4*(x^3+1))/(x+1) + U1_64 = ((int64_t *) W4); + __m256i *U1_256 = (__m256i *) (U1_64 + 1); + tmp[0] = W2[0] ^ W3[0] ^ W4[0] ^ (__m256i) { + 0x0ul, 0x0ul, 0x0ul, U1_64[0] + }; + + for (int32_t i = 1 ; i < (T_TM3_3W_256 << 1) - 1 ; i++) { + tmp[i] = W2[i] ^ W3[i] ^ W4[i] ^ _mm256_lddqu_si256(&U1_256[i - 1]); + } + + divByXplus1(W2, tmp, T_TM3_3W_256); + W2[2 * (T_TM3_3W_256) - 1] = zero; + + //W3 =(W3 + W1)/(x*(x+1)) + U1_64 = (int64_t *) W3; + U1_256 = (__m256i *) (U1_64 + 1); + + U2_64 = (int64_t *) W1; + __m256i *U2_256 = (__m256i *) (U2_64 + 1); + + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) - 1 ; i++) { + tmp[i] = _mm256_lddqu_si256(&U1_256[i]) ^ _mm256_lddqu_si256(&U2_256[i]); + } + + divByXplus1(W3, tmp, T_TM3_3W_256); + W3[2 * (T_TM3_3W_256) - 1] = zero; + + //W1 = W1 + W4 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W1[i] ^= W2[i] ^ W4[i]; + } + + //W2 = W2 + W3 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W2[i] ^= W3[i]; + } + + // Recomposition + //W = W0+ W1*x+ W2*x^2+ W3*x^3 + W4*x^4 + //W0, W1, W4 of size 2*T_TM3_3W_256, W2 and W3 of size 2*(T_TM3_3W_256) + for (int32_t i = 0 ; i < (T_TM3_3W_256 << 1) - 1 ; i++) { + ro256[i] = W0[i]; + ro256[i + 2 * T_TM3_3W_256 - 1] = W2[i]; + ro256[i + 4 * T_TM3_3W_256 - 2] = W4[i]; + } + + ro256[(T_TM3_3W_256 << 1) - 1] = W0[(T_TM3_3W_256 << 1) - 1] ^ W2[0]; + ro256[(T_TM3_3W_256 << 2) - 2] = W2[(T_TM3_3W_256 << 1) - 1] ^ W4[0]; + ro256[(T_TM3_3W_256 * 6) - 3] = W4[(T_TM3_3W_256 << 1) - 1]; + + U1_64 = ((int64_t *) &ro256[T_TM3_3W_256]); + U1_256 = (__m256i *) (U1_64 - 2); + + U2_64 = ((int64_t *) &ro256[3 * T_TM3_3W_256 - 1]); + U2_256 = (__m256i *) (U2_64 - 2); + + for (int32_t i = 0 ; i < T_TM3_3W_256 << 1 ; i++) { + _mm256_storeu_si256(&U1_256[i], W1[i] ^ _mm256_lddqu_si256(&U1_256[i])); + _mm256_storeu_si256(&U2_256[i], W3[i] ^ _mm256_loadu_si256(&U2_256[i])); + } + + for (int32_t i = 0 ; i < 6 * T_TM3_3W_256 - 2 ; i++) { + uint64_t *out64 = Out + (i << 2); + _mm256_storeu_si256((__m256i *)out64, ro256[i]); + } +} + + +/** + * @brief Multiply two polynomials modulo \f$ X^n - 1\f$. + * + * This functions multiplies a sparse polynomial a1 (of Hamming weight equal to weight) + * and a dense polynomial a2. The multiplication is done modulo \f$ X^n - 1\f$. + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to a polynomial + * @param[in] a2 Pointer to a polynomial + */ +void PQCLEAN_HQC128_AVX2_vect_mul(uint64_t *o, const uint64_t *a1, const uint64_t *a2) { + TOOM3Mult(a1_times_a2, a1, a2); + reduce(o, a1_times_a2); + + // clear all + memset(a1_times_a2, 0, (VEC_N_SIZE_64 << 1) * sizeof(uint64_t)); +} diff --git a/crypto_kem/hqc-128/avx2/gf2x.h b/crypto_kem/hqc-128/avx2/gf2x.h new file mode 100644 index 00000000..fd5e77b7 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/gf2x.h @@ -0,0 +1,17 @@ +#ifndef GF2X_H +#define GF2X_H + + +/** + * @file gf2x.h + * @brief Header file for gf2x.c + */ + +#include + +#include + +void PQCLEAN_HQC128_AVX2_vect_mul(uint64_t *o, const uint64_t *a1, const uint64_t *a2); + + +#endif diff --git a/crypto_kem/hqc-128/avx2/hqc.c b/crypto_kem/hqc-128/avx2/hqc.c new file mode 100644 index 00000000..8747db89 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/hqc.c @@ -0,0 +1,138 @@ +#include "code.h" +#include "gf2x.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +/** + * @file hqc.c + * @brief Implementation of hqc.h + */ + + + +/** + * @brief Keygen of the HQC_PKE IND_CPA scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + */ +void PQCLEAN_HQC128_AVX2_hqc_pke_keygen(unsigned char *pk, unsigned char *sk) { + AES_XOF_struct sk_seedexpander; + AES_XOF_struct pk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + uint8_t pk_seed[SEED_BYTES] = {0}; + uint64_t x[VEC_N_256_SIZE_64] = {0}; + uint64_t y[VEC_N_256_SIZE_64] = {0}; + uint64_t h[VEC_N_256_SIZE_64] = {0}; + uint64_t s[VEC_N_256_SIZE_64] = {0}; + + // Create seed_expanders for public key and secret key + randombytes(sk_seed, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + randombytes(pk_seed, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute secret key + PQCLEAN_HQC128_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQC128_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, y, PARAM_OMEGA); + + // Compute public key + PQCLEAN_HQC128_AVX2_vect_set_random(&pk_seedexpander, h); + PQCLEAN_HQC128_AVX2_vect_mul(s, y, h); + PQCLEAN_HQC128_AVX2_vect_add(s, x, s, VEC_N_256_SIZE_64); + + // Parse keys to string + PQCLEAN_HQC128_AVX2_hqc_public_key_to_string(pk, pk_seed, s); + PQCLEAN_HQC128_AVX2_hqc_secret_key_to_string(sk, sk_seed, pk); + +} + + + +/** + * @brief Encryption of the HQC_PKE IND_CPA scheme + * + * The cihertext is composed of vectors u and v. + * + * @param[out] u Vector u (first part of the ciphertext) + * @param[out] v Vector v (second part of the ciphertext) + * @param[in] m Vector representing the message to encrypt + * @param[in] theta Seed used to derive randomness required for encryption + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC128_AVX2_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk) { + AES_XOF_struct seedexpander; + uint64_t h[VEC_N_256_SIZE_64] = {0}; + uint64_t s[VEC_N_256_SIZE_64] = {0}; + uint64_t r1[VEC_N_256_SIZE_64] = {0}; + uint64_t r2[VEC_N_256_SIZE_64] = {0}; + uint64_t e[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp1[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_256_SIZE_64] = {0}; + + // Create seed_expander from theta + seedexpander_init(&seedexpander, theta, theta + 32, SEEDEXPANDER_MAX_LENGTH); + + // Retrieve h and s from public key + PQCLEAN_HQC128_AVX2_hqc_public_key_from_string(h, s, pk); + + // Generate r1, r2 and e + PQCLEAN_HQC128_AVX2_vect_set_random_fixed_weight(&seedexpander, r1, PARAM_OMEGA_R); + PQCLEAN_HQC128_AVX2_vect_set_random_fixed_weight(&seedexpander, r2, PARAM_OMEGA_R); + PQCLEAN_HQC128_AVX2_vect_set_random_fixed_weight(&seedexpander, e, PARAM_OMEGA_E); + + // Compute u = r1 + r2.h + PQCLEAN_HQC128_AVX2_vect_mul(u, r2, h); + PQCLEAN_HQC128_AVX2_vect_add(u, r1, u, VEC_N_256_SIZE_64); + + // Compute v = m.G by encoding the message + PQCLEAN_HQC128_AVX2_code_encode(v, m); + PQCLEAN_HQC128_AVX2_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + + // Compute v = m.G + s.r2 + e + PQCLEAN_HQC128_AVX2_vect_mul(tmp2, r2, s); + PQCLEAN_HQC128_AVX2_vect_add(tmp2, e, tmp2, VEC_N_256_SIZE_64); + PQCLEAN_HQC128_AVX2_vect_add(tmp2, tmp1, tmp2, VEC_N_256_SIZE_64); + PQCLEAN_HQC128_AVX2_vect_resize(v, PARAM_N1N2, tmp2, PARAM_N); + +} + + + +/** + * @brief Decryption of the HQC_PKE IND_CPA scheme + * + * @param[out] m Vector representing the decrypted message + * @param[in] u Vector u (first part of the ciphertext) + * @param[in] v Vector v (second part of the ciphertext) + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQC128_AVX2_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk) { + uint64_t x[VEC_N_256_SIZE_64] = {0}; + uint64_t y[VEC_N_256_SIZE_64] = {0}; + uint8_t pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t tmp1[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_256_SIZE_64] = {0}; + + // Retrieve x, y, pk from secret key + PQCLEAN_HQC128_AVX2_hqc_secret_key_from_string(x, y, pk, sk); + + // Compute v - u.y + PQCLEAN_HQC128_AVX2_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + PQCLEAN_HQC128_AVX2_vect_mul(tmp2, y, u); + PQCLEAN_HQC128_AVX2_vect_add(tmp2, tmp1, tmp2, VEC_N_256_SIZE_64); + + + // Compute m by decoding v - u.y + PQCLEAN_HQC128_AVX2_code_decode(m, tmp2); +} diff --git a/crypto_kem/hqc-128/avx2/hqc.h b/crypto_kem/hqc-128/avx2/hqc.h new file mode 100644 index 00000000..6d52049c --- /dev/null +++ b/crypto_kem/hqc-128/avx2/hqc.h @@ -0,0 +1,21 @@ +#ifndef HQC_H +#define HQC_H + + +/** + * @file hqc.h + * @brief Functions of the HQC_PKE IND_CPA scheme + */ + +#include + +#include + +void PQCLEAN_HQC128_AVX2_hqc_pke_keygen(unsigned char *pk, unsigned char *sk); + +void PQCLEAN_HQC128_AVX2_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk); + +void PQCLEAN_HQC128_AVX2_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-128/avx2/kem.c b/crypto_kem/hqc-128/avx2/kem.c new file mode 100644 index 00000000..8a6b60c8 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/kem.c @@ -0,0 +1,138 @@ +#include "api.h" +#include "fips202.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "sha2.h" +#include "vector.h" +#include +#include +/** + * @file kem.c + * @brief Implementation of api.h + */ + + + +/** + * @brief Keygen of the HQC_KEM IND_CAA2 scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + * @returns 0 if keygen is successful + */ +int PQCLEAN_HQC128_AVX2_crypto_kem_keypair(unsigned char *pk, unsigned char *sk) { + + PQCLEAN_HQC128_AVX2_hqc_pke_keygen(pk, sk); + return 0; +} + + + +/** + * @brief Encapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ct String containing the ciphertext + * @param[out] ss String containing the shared secret + * @param[in] pk String containing the public key + * @returns 0 if encapsulation is successful + */ +int PQCLEAN_HQC128_AVX2_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk) { + + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint64_t u[VEC_N_256_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Computing m + PQCLEAN_HQC128_AVX2_vect_set_random_from_randombytes(m); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m + PQCLEAN_HQC128_AVX2_hqc_pke_encrypt(u, v, m, theta, pk); + + // Computing d + sha512(d, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Computing ciphertext + PQCLEAN_HQC128_AVX2_hqc_ciphertext_to_string(ct, u, v, d); + + + return 0; +} + + + +/** + * @brief Decapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ss String containing the shared secret + * @param[in] ct String containing the cipĥertext + * @param[in] sk String containing the secret key + * @returns 0 if decapsulation is successful, -1 otherwise + */ +int PQCLEAN_HQC128_AVX2_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk) { + + int8_t result = -1; + uint64_t u[VEC_N_256_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t u2[VEC_N_256_SIZE_64] = {0}; + uint64_t v2[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d2[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Retrieving u, v and d from ciphertext + PQCLEAN_HQC128_AVX2_hqc_ciphertext_from_string(u, v, d, ct); + + // Retrieving pk from sk + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); + + // Decryting + PQCLEAN_HQC128_AVX2_hqc_pke_decrypt(m, u, v, sk); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m' + PQCLEAN_HQC128_AVX2_hqc_pke_encrypt(u2, v2, m, theta, pk); + + // Computing d' + sha512(d2, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Abort if c != c' or d != d' + result = (PQCLEAN_HQC128_AVX2_vect_compare(u, u2, VEC_N_SIZE_BYTES) == 0 && PQCLEAN_HQC128_AVX2_vect_compare(v, v2, VEC_N1N2_SIZE_BYTES) == 0 && PQCLEAN_HQC128_AVX2_vect_compare((uint64_t *)d, (uint64_t *)d2, SHA512_BYTES) == 0); + for (size_t i = 0 ; i < SHARED_SECRET_BYTES ; i++) { + ss[i] = result * ss[i]; + } + result--; + + + return result; +} diff --git a/crypto_kem/hqc-128/avx2/parameters.h b/crypto_kem/hqc-128/avx2/parameters.h new file mode 100644 index 00000000..c222237b --- /dev/null +++ b/crypto_kem/hqc-128/avx2/parameters.h @@ -0,0 +1,127 @@ +#ifndef HQC_PARAMETERS_H +#define HQC_PARAMETERS_H +/** + * @file parameters.h + * @brief Parameters of the HQC_KEM IND-CCA2 scheme + */ + +#include "api.h" +#include "api.h" +#include "vector.h" + + +#define CEIL_DIVIDE(a, b) (((a)/(b)) + ((a) % (b) == 0 ? 0 : 1)) /*!< Divide a by b and ceil the result*/ +#define BITMASK(a, size) ((1UL << ((a) % (size))) - 1) /*!< Create a mask*/ + +/* + #define PARAM_N Define the parameter n of the scheme + #define PARAM_N1 Define the parameter n1 of the scheme (length of BCH code) + #define PARAM_N2 Define the parameter n2 of the scheme (length of the repetition code) + #define PARAM_N1N2 Define the parameter n1 * n2 of the scheme (length of the tensor code) + #define PARAM_OMEGA Define the parameter omega of the scheme + #define PARAM_OMEGA_E Define the parameter omega_e of the scheme + #define PARAM_OMEGA_R Define the parameter omega_r of the scheme + #define PARAM_SECURITY Define the security level corresponding to the chosen parameters + #define PARAM_DFR_EXP Define the decryption failure rate corresponding to the chosen parameters + + #define SECRET_KEY_BYTES Define the size of the secret key in bytes + #define PUBLIC_KEY_BYTES Define the size of the public key in bytes + #define SHARED_SECRET_BYTES Define the size of the shared secret in bytes + #define CIPHERTEXT_BYTES Define the size of the ciphertext in bytes + + #define UTILS_REJECTION_THRESHOLD Define the rejection threshold used to generate given weight vectors (see vector_set_random_fixed_weight function) + #define VEC_N_SIZE_BYTES Define the size of the array used to store a PARAM_N sized vector in bytes + #define VEC_K_SIZE_BYTES Define the size of the array used to store a PARAM_K sized vector in bytes + #define VEC_N1_SIZE_BYTES Define the size of the array used to store a PARAM_N1 sized vector in bytes + #define VEC_N1N2_SIZE_BYTES Define the size of the array used to store a PARAM_N1N2 sized vector in bytes + + #define VEC_N_SIZE_64 Define the size of the array used to store a PARAM_N_MULT sized vector in 64 bits + #define VEC_K_SIZE_64 Define the size of the array used to store a PARAM_K sized vector in 64 bits + #define VEC_N1_SIZE_64 Define the size of the array used to store a PARAM_N1 sized vector in 64 bits + #define VEC_N1N2_SIZE_64 Define the size of the array used to store a PARAM_N1N2 sized vector in 64 bits + + #define VEC_N_256_SIZE_64 Define the size of the array of 64 bits elements used to store an array of size PARAM_N considered as elements of 256 bits + #define VEC_N1N2_256_SIZE_64 Define the size of the array of 64 bits elements used to store an array of size PARAM_N1N2 considered as elements of 256 bits + + #define PARAM_T Define a threshold for decoding repetition code word (PARAM_T = (PARAM_N2 - 1) / 2) + + #define PARAM_DELTA Define the parameter delta of the scheme (correcting capacity of the BCH code) + #define PARAM_M Define a positive integer + #define PARAM_GF_POLY Generator polynomial of galois field GF(2^PARAM_M), represented in hexadecimial form + #define PARAM_GF_MUL_ORDER Define the size of the multiplicative group of GF(2^PARAM_M), i.e 2^PARAM_M -1 + #define PARAM_K Define the size of the information bits of the BCH code + #define PARAM_G Define the size of the generator polynomial of BCH code + #define PARAM_FFT The additive FFT takes a 2^PARAM_FFT polynomial as input + We use the FFT to compute the roots of sigma, whose degree if PARAM_DELTA=60 + The smallest power of 2 greater than 60+1 is 64=2^6 + #define PARAM_BCH_POLY Generator polynomial of the BCH code + + #define RED_MASK A mask fot the higher bits of a vector + #define SHA512_BYTES Define the size of SHA512 output in bytes + #define SEED_BYTES Define the size of the seed in bytes + #define SEEDEXPANDER_MAX_LENGTH Define the seed expander max length +*/ + +#define PARAM_N 23869 +#define PARAM_N1 766 +#define PARAM_N2 31 +#define PARAM_N1N2 23746 +#define PARAM_OMEGA 67 +#define PARAM_OMEGA_E 77 +#define PARAM_OMEGA_R 77 +#define PARAM_SECURITY 128 +#define PARAM_DFR_EXP 128 + +#define SECRET_KEY_BYTES PQCLEAN_HQC128_AVX2_CRYPTO_SECRETKEYBYTES +#define PUBLIC_KEY_BYTES PQCLEAN_HQC128_AVX2_CRYPTO_PUBLICKEYBYTES +#define SHARED_SECRET_BYTES PQCLEAN_HQC128_AVX2_CRYPTO_BYTES +#define CIPHERTEXT_BYTES PQCLEAN_HQC128_AVX2_CRYPTO_CIPHERTEXTBYTES + +#define UTILS_REJECTION_THRESHOLD 16756038 +#define VEC_N_SIZE_BYTES CEIL_DIVIDE(PARAM_N, 8) +#define VEC_K_SIZE_BYTES CEIL_DIVIDE(PARAM_K, 8) +#define VEC_N1_SIZE_BYTES CEIL_DIVIDE(PARAM_N1, 8) +#define VEC_N1N2_SIZE_BYTES CEIL_DIVIDE(PARAM_N1N2, 8) + +#define VEC_N_SIZE_64 CEIL_DIVIDE(PARAM_N, 64) +#define VEC_K_SIZE_64 CEIL_DIVIDE(PARAM_K, 64) +#define VEC_N1_SIZE_64 CEIL_DIVIDE(PARAM_N1, 64) +#define VEC_N1N2_SIZE_64 CEIL_DIVIDE(PARAM_N1N2, 64) + +#define PARAM_N_MULT 24192 +#define VEC_N_256_SIZE_64 (CEIL_DIVIDE(PARAM_N_MULT, 256) << 2) +#define VEC_N1N2_256_SIZE_64 (CEIL_DIVIDE(PARAM_N1N2, 256) << 2) + +#define PARAM_T 15 + +#define PARAM_DELTA 57 +#define PARAM_M 10 +#define PARAM_GF_POLY 0x409 +#define PARAM_GF_MUL_ORDER 1023 +#define PARAM_K 256 +#define PARAM_G 511 +#define PARAM_FFT 6 +#define PARAM_FFT_T 7 +#define PARAM_BCH_POLY { \ + 1,1,0,0,0,0,1,0,0,1,1,0,1,1,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,0,0,1,1,0,1,1, \ + 1,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,1,0,1,1,0,1,0,1,1,1,0,1,0,1,0,0,1,0,0,0, \ + 0,1,1,1,1,0,1,1,1,1,1,0,0,0,0,1,0,0,1,0,0,1,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, \ + 1,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1,1,0,1,0,1,0,1,0,1,1,1,1,0,1,0, \ + 0,1,1,0,1,0,1,1,0,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,0,1,1,1,1,0, \ + 1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,1,0, \ + 0,1,0,0,1,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,0,0,0,1,0,1, \ + 1,1,1,1,1,0,1,0,1,0,1,1,0,0,0,1,1,0,0,1,1,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,0, \ + 1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,0,1,1,0,1,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1, \ + 1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,0,1,0,0,1,1,1,1,1,0,1,0,1, \ + 0,0,0,0,1,0,1,1,1,1,0,1,0,0,0,0,0,1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1, \ + 1,0,1,0,0,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,1, \ + 0,1,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,1,1,1,1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,0,1, \ + 1,0,1,1,1,0,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,1 \ + }; + +#define RED_MASK 0x1fffffffffffffffUL +#define SHA512_BYTES 64 +#define SEED_BYTES 40 +#define SEEDEXPANDER_MAX_LENGTH 4294967295 + +#endif diff --git a/crypto_kem/hqc-128/avx2/parsing.c b/crypto_kem/hqc-128/avx2/parsing.c new file mode 100644 index 00000000..2c6d653f --- /dev/null +++ b/crypto_kem/hqc-128/avx2/parsing.c @@ -0,0 +1,121 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file parsing.c + * @brief Functions to parse secret key, public key and ciphertext of the HQC scheme + */ + + + +/** + * @brief Parse a secret key into a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] sk String containing the secret key + * @param[in] sk_seed Seed used to generate the secret key + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC128_AVX2_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk) { + memcpy(sk, sk_seed, SEED_BYTES); + memcpy(sk + SEED_BYTES, pk, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a secret key from a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] x uint64_t representation of vector x + * @param[out] y uint64_t representation of vector y + * @param[out] pk String containing the public key + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQC128_AVX2_hqc_secret_key_from_string(uint64_t *x, uint64_t *y, uint8_t *pk, const uint8_t *sk) { + AES_XOF_struct sk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + + memcpy(sk_seed, sk, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + PQCLEAN_HQC128_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQC128_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, y, PARAM_OMEGA); + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a public key into a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] pk String containing the public key + * @param[in] pk_seed Seed used to generate the public key + * @param[in] s uint8_t representation of vector s + */ +void PQCLEAN_HQC128_AVX2_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s) { + memcpy(pk, pk_seed, SEED_BYTES); + memcpy(pk + SEED_BYTES, s, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Parse a public key from a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] h uint8_t representation of vector h + * @param[out] s uint8_t representation of vector s + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC128_AVX2_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk) { + AES_XOF_struct pk_seedexpander; + uint8_t pk_seed[SEED_BYTES] = {0}; + + memcpy(pk_seed, pk, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + PQCLEAN_HQC128_AVX2_vect_set_random(&pk_seedexpander, h); + + memcpy(s, pk + SEED_BYTES, VEC_N_SIZE_BYTES); +} + + +/** + * @brief Parse a ciphertext into a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] ct String containing the ciphertext + * @param[in] u uint8_t representation of vector u + * @param[in] v uint8_t representation of vector v + * @param[in] d String containing the hash d + */ +void PQCLEAN_HQC128_AVX2_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d) { + memcpy(ct, u, VEC_N_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, d, SHA512_BYTES); +} + + +/** + * @brief Parse a ciphertext from a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] u uint8_t representation of vector u + * @param[out] v uint8_t representation of vector v + * @param[out] d String containing the hash d + * @param[in] ct String containing the ciphertext + */ +void PQCLEAN_HQC128_AVX2_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct) { + memcpy(u, ct, VEC_N_SIZE_BYTES); + memcpy(v, ct + VEC_N_SIZE_BYTES, VEC_N1N2_SIZE_BYTES); + memcpy(d, ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, SHA512_BYTES); +} diff --git a/crypto_kem/hqc-128/avx2/parsing.h b/crypto_kem/hqc-128/avx2/parsing.h new file mode 100644 index 00000000..4cb0f0a4 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/parsing.h @@ -0,0 +1,29 @@ +#ifndef PARSING_H +#define PARSING_H + + +/** + * @file parsing.h + * @brief Header file for parsing.c + */ + +#include + +#include + +void PQCLEAN_HQC128_AVX2_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk); + +void PQCLEAN_HQC128_AVX2_hqc_secret_key_from_string(uint64_t *x, uint64_t *y, uint8_t *pk, const uint8_t *sk); + + +void PQCLEAN_HQC128_AVX2_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s); + +void PQCLEAN_HQC128_AVX2_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk); + + +void PQCLEAN_HQC128_AVX2_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d); + +void PQCLEAN_HQC128_AVX2_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct); + + +#endif diff --git a/crypto_kem/hqc-128/avx2/repetition.c b/crypto_kem/hqc-128/avx2/repetition.c new file mode 100644 index 00000000..e9540c81 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/repetition.c @@ -0,0 +1,41 @@ +#include "parameters.h" +#include "repetition.h" +#include +#include +#include +#include +/** + * @file repetition.c + * @brief Implementation of repetition codes + */ + + +#define MASK_N2 ((1UL << PARAM_N2) - 1) + +/** + * @brief Decoding the code words to a message using the repetition code + * + * We use a majority decoding. In fact we have that PARAM_N2 = 2 * PARAM_T + 1, thus, + * if the Hamming weight of the vector is greater than PARAM_T, the code word is decoded + * to 1 and 0 otherwise. + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQC128_AVX2_repetition_code_decode(uint64_t *m, const uint64_t *em) { + size_t t = 0, b, bn, bi, c, cn, ci; + uint64_t cx, ones; + + for (b = 0 ; b < PARAM_N1N2 - PARAM_N2 + 1 ; b += PARAM_N2) { + bn = b >> 6; + bi = b & 63; + c = b + PARAM_N2 - 1; + cn = c >> 6; + ci = c & 63; + cx = em[cn] << (63 - ci); + int64_t verif = (cn == (bn + 1)); + ones = _mm_popcnt_u64(((em[bn] >> bi) & MASK_N2) | (cx * verif)); + m[t >> 6] |= ((uint64_t)(ones > PARAM_T)) << (t & 63); + t++; + } +} diff --git a/crypto_kem/hqc-128/avx2/repetition.h b/crypto_kem/hqc-128/avx2/repetition.h new file mode 100644 index 00000000..0502dfca --- /dev/null +++ b/crypto_kem/hqc-128/avx2/repetition.h @@ -0,0 +1,17 @@ +#ifndef REPETITION_H +#define REPETITION_H + + +/** + * @file repetition.h + * @brief Header file for repetition.c + */ + +#include + +#include + +void PQCLEAN_HQC128_AVX2_repetition_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-128/avx2/vector.c b/crypto_kem/hqc-128/avx2/vector.c new file mode 100644 index 00000000..6ba48234 --- /dev/null +++ b/crypto_kem/hqc-128/avx2/vector.c @@ -0,0 +1,200 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +#include +/** + * @file vector.c + * @brief Implementation of vectors sampling and some utilities for the HQC scheme + */ + + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC128_AVX2_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight) { + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; + uint32_t random_data = 0; + uint32_t tmp[PARAM_OMEGA_R] = {0}; + uint8_t exist = 0; + size_t j = 0; + __m256i bit256[PARAM_OMEGA_R]; + __m256i bloc256[PARAM_OMEGA_R]; + static __m256i posCmp256 = (__m256i) { + 0UL, 1UL, 2UL, 3UL + }; +#define LOOP_SIZE CEIL_DIVIDE(PARAM_N, 256) + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (tmp[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + tmp[i] = random_data; + } + } + + for (uint32_t i = 0 ; i < weight ; i++) { + // we store the bloc number and bit position of each vb[i] + uint64_t bloc = tmp[i] >> 6; + bloc256[i] = _mm256_set1_epi64x(bloc >> 2); + uint64_t pos = (bloc & 0x3UL); + __m256i pos256 = _mm256_set1_epi64x(pos); + __m256i mask256 = _mm256_cmpeq_epi64(pos256, posCmp256); + uint64_t bit64 = 1ULL << (tmp[i] & 0x3f); + __m256i bloc256 = _mm256_set1_epi64x(bit64); + bit256[i] = bloc256 & mask256; + } + + for (uint32_t i = 0 ; i < LOOP_SIZE ; i++) { + __m256i aux = _mm256_loadu_si256(((__m256i *)v) + i); + __m256i i256 = _mm256_set1_epi64x(i); + + for (uint32_t j = 0 ; j < weight ; j++) { + __m256i mask256 = _mm256_cmpeq_epi64(bloc256[j], i256); + aux ^= bit256[j] & mask256; + } + _mm256_storeu_si256(((__m256i *)v) + i, aux); + } + +#undef LOOP_SIZE +} + + + +/** + * @brief Generates a random vector of dimension PARAM_N + * + * This function generates a random binary vector of dimension PARAM_N. It generates a random + * array of bytes using the seedexpander function, and drop the extra bits using a mask. + * + * @param[in] v Pointer to an array + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC128_AVX2_vect_set_random(AES_XOF_struct *ctx, uint64_t *v) { + uint8_t rand_bytes[VEC_N_SIZE_BYTES] = {0}; + + seedexpander(ctx, rand_bytes, VEC_N_SIZE_BYTES); + + memcpy(v, rand_bytes, VEC_N_SIZE_BYTES); + v[VEC_N_SIZE_64 - 1] &= BITMASK(PARAM_N, 64); +} + + + +/** + * @brief Generates a random vector + * + * This function generates a random binary vector. It uses the the randombytes function. + * + * @param[in] v Pointer to an array + */ +void PQCLEAN_HQC128_AVX2_vect_set_random_from_randombytes(uint64_t *v) { + uint8_t rand_bytes [VEC_K_SIZE_BYTES] = {0}; + + randombytes(rand_bytes, VEC_K_SIZE_BYTES); + memcpy(v, rand_bytes, VEC_K_SIZE_BYTES); +} + + + +/** + * @brief Adds two vectors + * + * @param[out] o Pointer to an array that is the result + * @param[in] v1 Pointer to an array that is the first vector + * @param[in] v2 Pointer to an array that is the second vector + * @param[in] size Integer that is the size of the vectors + */ +void PQCLEAN_HQC128_AVX2_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size) { + for (uint32_t i = 0 ; i < size ; ++i) { + o[i] = v1[i] ^ v2[i]; + } +} + + + +/** + * @brief Compares two vectors + * + * @param[in] v1 Pointer to an array that is first vector + * @param[in] v2 Pointer to an array that is second vector + * @param[in] size Integer that is the size of the vectors + * @returns 0 if the vectors are equals and a negative/psotive value otherwise + */ +int PQCLEAN_HQC128_AVX2_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size) { + unsigned char diff = 0; + + for (uint32_t i = 0 ; i < size ; i++) { + diff |= ((uint8_t *) v1)[i] ^ ((uint8_t *) v2)[i]; + } + return diff != 0; +} + + + +/** + * @brief Resize a vector so that it contains size_o bits + * + * @param[out] o Pointer to the output vector + * @param[in] size_o Integer that is the size of the output vector in bits + * @param[in] v Pointer to the input vector + * @param[in] size_v Integer that is the size of the input vector in bits + */ +void PQCLEAN_HQC128_AVX2_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v) { + if (size_o < size_v) { + uint64_t mask = 0x7FFFFFFFFFFFFFFF; + int8_t val = 0; + + if (size_o % 64) { + val = 64 - (size_o % 64); + } + + memcpy(o, v, VEC_N1N2_SIZE_BYTES); + + for (int8_t i = 0 ; i < val ; ++i) { + o[VEC_N1N2_SIZE_64 - 1] &= (mask >> i); + } + } else { + memcpy(o, v, CEIL_DIVIDE(size_v, 8)); + } +} diff --git a/crypto_kem/hqc-128/avx2/vector.h b/crypto_kem/hqc-128/avx2/vector.h new file mode 100644 index 00000000..3fbb2ddc --- /dev/null +++ b/crypto_kem/hqc-128/avx2/vector.h @@ -0,0 +1,29 @@ +#ifndef VECTOR_H +#define VECTOR_H + + +/** + * @file vector.h + * @brief Header file for vector.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQC128_AVX2_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight); + +void PQCLEAN_HQC128_AVX2_vect_set_random(AES_XOF_struct *ctx, uint64_t *v); + +void PQCLEAN_HQC128_AVX2_vect_set_random_from_randombytes(uint64_t *v); + + +void PQCLEAN_HQC128_AVX2_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size); + +int PQCLEAN_HQC128_AVX2_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size); + +void PQCLEAN_HQC128_AVX2_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v); + + +#endif diff --git a/crypto_kem/hqc-128/clean/LICENSE b/crypto_kem/hqc-128/clean/LICENSE new file mode 100644 index 00000000..d5d21fff --- /dev/null +++ b/crypto_kem/hqc-128/clean/LICENSE @@ -0,0 +1 @@ +Public Domain diff --git a/crypto_kem/hqc-128/clean/Makefile b/crypto_kem/hqc-128/clean/Makefile new file mode 100644 index 00000000..a1bbedfc --- /dev/null +++ b/crypto_kem/hqc-128/clean/Makefile @@ -0,0 +1,19 @@ +# This Makefile can be used with GNU Make or BSD Make + +LIB=libhqc-128_clean.a +HEADERS=api.h bch.h code.h fft.h gf2x.h gf.h hqc.h parameters.h parsing.h repetition.h vector.h +OBJECTS=bch.o code.o fft.o gf2x.o gf.o hqc.o kem.o parsing.o repetition.o vector.o + +CFLAGS=-O3 -Wall -Wextra -Wpedantic -Wvla -Werror -Wredundant-decls -Wmissing-prototypes -std=c99 -I../../../common $(EXTRAFLAGS) + +all: $(LIB) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +$(LIB): $(OBJECTS) + $(AR) -r $@ $(OBJECTS) + +clean: + $(RM) $(OBJECTS) + $(RM) $(LIB) diff --git a/crypto_kem/hqc-128/clean/Makefile.Microsoft_nmake b/crypto_kem/hqc-128/clean/Makefile.Microsoft_nmake new file mode 100644 index 00000000..e9bf6d70 --- /dev/null +++ b/crypto_kem/hqc-128/clean/Makefile.Microsoft_nmake @@ -0,0 +1,19 @@ +# This Makefile can be used with Microsoft Visual Studio's nmake using the command: +# nmake /f Makefile.Microsoft_nmake + +LIBRARY=libhqc-128_clean.lib +OBJECTS=bch.obj code.obj fft.obj gf2x.obj gf.obj hqc.obj kem.obj parsing.obj repetition.obj vector.obj + +CFLAGS=/nologo /O2 /I ..\..\..\common /W4 /WX + +all: $(LIBRARY) + +# Make sure objects are recompiled if headers change. +$(OBJECTS): *.h + +$(LIBRARY): $(OBJECTS) + LIB.EXE /NOLOGO /WX /OUT:$@ $** + +clean: + -DEL $(OBJECTS) + -DEL $(LIBRARY) diff --git a/crypto_kem/hqc-128/clean/api.h b/crypto_kem/hqc-128/clean/api.h new file mode 100644 index 00000000..7d5b7dc5 --- /dev/null +++ b/crypto_kem/hqc-128/clean/api.h @@ -0,0 +1,25 @@ +#ifndef PQCLEAN_HQC128_CLEAN_API_H +#define PQCLEAN_HQC128_CLEAN_API_H +/** + * @file api.h + * @brief NIST KEM API used by the HQC_KEM IND-CCA2 scheme + */ + +#define PQCLEAN_HQC128_CLEAN_CRYPTO_ALGNAME "HQC-128" + +#define PQCLEAN_HQC128_CLEAN_CRYPTO_SECRETKEYBYTES 3064 +#define PQCLEAN_HQC128_CLEAN_CRYPTO_PUBLICKEYBYTES 3024 +#define PQCLEAN_HQC128_CLEAN_CRYPTO_BYTES 64 +#define PQCLEAN_HQC128_CLEAN_CRYPTO_CIPHERTEXTBYTES 6017 + +// As a technicality, the public key is appended to the secret key in order to respect the NIST API. +// Without this constraint, PQCLEAN_HQC128_CLEAN_CRYPTO_SECRETKEYBYTES would be defined as 32 + +int PQCLEAN_HQC128_CLEAN_crypto_kem_keypair(unsigned char *pk, unsigned char *sk); + +int PQCLEAN_HQC128_CLEAN_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk); + +int PQCLEAN_HQC128_CLEAN_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-128/clean/bch.c b/crypto_kem/hqc-128/clean/bch.c new file mode 100644 index 00000000..e53ce73f --- /dev/null +++ b/crypto_kem/hqc-128/clean/bch.c @@ -0,0 +1,383 @@ +#include "bch.h" +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include "vector.h" +#include +#include +/** + * @file bch.c + * Constant time implementation of BCH codes + */ + + +static uint16_t mod(uint16_t i, uint16_t modulus); +static void compute_cyclotomic_cosets(uint16_t *cosets, uint16_t upper_bound); +static void unpack_message(uint8_t *message_unpacked, const uint64_t *message); +static void lfsr_encode(uint8_t *codeword, const uint8_t *message); +static void pack_codeword(uint64_t *codeword, const uint8_t *codeword_unpacked); +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes); +static void message_from_codeword(uint64_t *message, const uint64_t *codeword); +static void compute_syndromes(uint16_t *syndromes, const uint64_t *vector); +static void compute_roots(uint64_t *error, const uint16_t *sigma); + +/** + * @brief Returns i modulo the given modulus. + * + * i must be less than 2*modulus. + * Therefore, the return value is either i or i-modulus. + * @returns i mod (modulus) + * @param[in] i The integer whose modulo is taken + * @param[in] modulus The modulus + */ +static uint16_t mod(uint16_t i, uint16_t modulus) { + uint16_t tmp = i - modulus; + + // mask = 0xffff if(i < PARAM_GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & modulus); +} + + + +/** + * @brief Computes the odd binary cyclotomic cosets modulo 2^m-1 for integers less than upper_bound. + * + * The array cosets of size 2^m-1 is filled by placing at index i the coset representative of i. + * @param[out] cosets Array receiving the coset representatives + * @param[in] upper_bound The upper bound + */ +static void compute_cyclotomic_cosets(uint16_t *cosets, uint16_t upper_bound) { + // Compute the odd cyclotomic classes + for (uint16_t i = 1 ; i < upper_bound ; i += 2) { + if (cosets[i] == 0) { // If i does not already belong to a class + uint16_t tmp = i; + size_t j = PARAM_M; + cosets[i] = i; + while (--j) { // Complete i's class + tmp = mod(2 * tmp, PARAM_GF_MUL_ORDER); + cosets[tmp] = i; + } + } + } +} + + + +/** + * @brief Computes the generator polynomial of the primitive BCH code with given parameters. + * + * Code length is 2^m-1.
+ * Parameter t is the targeted correction capacity of the code + * and receives the real correction capacity (which is at least equal to the target).
+ * exp and log are arrays giving antilog and log of GF(2^m) elements. + * @returns the degree of the generator polynomial + * @param[out] bch_poly Array of size (m*t + 1) receiving the coefficients of the generator polynomial + * @param[in,out] t Targeted correction capacity; receives the real correction capacity + * @param[in] exp Antilog table of GF(2^m) + * @param[in] log Log table of GF(2^m) + */ +size_t PQCLEAN_HQC128_CLEAN_compute_bch_poly(uint16_t *bch_poly, size_t *t, const uint16_t *exp, const uint16_t *log) { + uint16_t cosets[PARAM_GF_MUL_ORDER]; + size_t deg_bch_poly = 0; + + memset(cosets, 0, 2 * PARAM_GF_MUL_ORDER); + compute_cyclotomic_cosets(cosets, 2 * *t); + + // Start with bch_poly(X) = 1 + bch_poly[0] = 1; + + for (uint16_t i = 1 ; i < PARAM_GF_MUL_ORDER ; ++i) { + if (cosets[i] == 0) { + continue; + } + + // Multiply bch_poly(X) by X-a^i + for (size_t j = deg_bch_poly ; j ; --j) { + int16_t mask = -((uint16_t) - bch_poly[j] >> 15); + bch_poly[j] = (mask & exp[mod(log[bch_poly[j]] + i, PARAM_GF_MUL_ORDER)]) ^ bch_poly[j - 1]; + } + bch_poly[0] = exp[mod(log[bch_poly[0]] + i, PARAM_GF_MUL_ORDER)]; + bch_poly[++deg_bch_poly] = 1; + } + + // Determine the real correction capacity + while (cosets[2 * *t + 1] != 0) { + ++*t; + } + + return deg_bch_poly; +} + + + +/** + * @brief Unpacks the message message to the array message_unpacked where each byte stores a bit of the message + * + * @param[out] message_unpacked Array of VEC_K_SIZE_BYTES bytes receiving the unpacked message + * @param[in] message Array of PARAM_K bytes storing the packed message + */ +static void unpack_message(uint8_t *message_unpacked, const uint64_t *message) { + for (size_t i = 0 ; i < (VEC_K_SIZE_64 - (PARAM_K % 64 != 0)) ; ++i) { + for (size_t j = 0 ; j < 64 ; ++j) { + message_unpacked[j + 64 * i] = (message[i] >> j) & 0x0000000000000001; + } + } + + for (int8_t j = 0 ; j < PARAM_K % 64 ; ++j) { + message_unpacked[j + 64 * (VEC_K_SIZE_64 - 1)] = (message[VEC_K_SIZE_64 - 1] >> j) & 0x0000000000000001; + } +} + + +/** + * @brief Encodes the message message to a codeword codeword using the generator polynomial bch_poly of the code + * + * @param[out] codeword Array of PARAM_N1 bytes receiving the codeword + * @param[in] message Array of PARAM_K bytes storing the message to encode + */ +static void lfsr_encode(uint8_t *codeword, const uint8_t *message) { + uint8_t gate_value = 0; + uint8_t bch_poly[PARAM_G] = PARAM_BCH_POLY; + + // Compute the Parity-check digits + for (int16_t i = PARAM_K - 1 ; i >= 0 ; --i) { + gate_value = message[i] ^ codeword[PARAM_N1 - PARAM_K - 1]; + + for (size_t j = PARAM_N1 - PARAM_K - 1 ; j ; --j) { + codeword[j] = codeword[j - 1] ^ (-gate_value & bch_poly[j]); + } + + codeword[0] = gate_value; + } + + // Add the message + memcpy(codeword + PARAM_N1 - PARAM_K, message, PARAM_K); +} + + + +/** + * @brief Packs the codeword from an array codeword_unpacked where each byte stores a bit to a compact array codeword + * + * @param[out] codeword Array of VEC_N1_SIZE_BYTES bytes receiving the packed codeword + * @param[in] codeword_unpacked Array of PARAM_N1 bytes storing the unpacked codeword + */ +static void pack_codeword(uint64_t *codeword, const uint8_t *codeword_unpacked) { + for (size_t i = 0 ; i < (VEC_N1_SIZE_64 - (PARAM_N1 % 64 != 0)) ; ++i) { + for (size_t j = 0 ; j < 64 ; ++j) { + codeword[i] |= ((uint64_t) codeword_unpacked[j + 64 * i]) << j; + } + } + + for (size_t j = 0 ; j < PARAM_N1 % 64 ; ++j) { + codeword[VEC_N1_SIZE_64 - 1] |= ((uint64_t) codeword_unpacked[j + 64 * (VEC_N1_SIZE_64 - 1)]) << j; + } +} + + +/** + * @brief Encodes a message message of PARAM_K bits to a BCH codeword codeword of PARAM_N1 bits + * + * Following @cite lin1983error (Chapter 4 - Cyclic Codes), + * We perform a systematic encoding using a linear (PARAM_N1 - PARAM_K)-stage shift register + * with feedback connections based on the generator polynomial bch_poly of the BCH code. + * + * @param[out] codeword Array of size VEC_N1_SIZE_BYTES receiving the encoded message + * @param[in] message Array of size VEC_K_SIZE_BYTES storing the message + */ +void PQCLEAN_HQC128_CLEAN_bch_code_encode(uint64_t *codeword, const uint64_t *message) { + uint8_t message_unpacked[PARAM_K]; + uint8_t codeword_unpacked[PARAM_N1] = {0}; + + unpack_message(message_unpacked, message); + lfsr_encode(codeword_unpacked, message_unpacked); + pack_codeword(codeword, codeword_unpacked); +} + + +/** + * @brief Computes the error locator polynomial (ELP) sigma + * + * This is a constant time implementation of Berlekamp's simplified algorithm (see @cite joiner1995decoding).
+ * We use the letter p for rho which is initialized at -1/2.
+ * The array X_sigma_p represents the polynomial X^(2(mu-rho))*sigma_p(X).
+ * Instead of maintaining a list of sigmas, we update in place both sigma and X_sigma_p.
+ * sigma_copy serves as a temporary save of sigma in case X_sigma_p needs to be updated.
+ * We can properly correct only if the degree of sigma does not exceed PARAM_DELTA. + * This means only the first PARAM_DELTA + 1 coefficients of sigma are of value + * and we only need to save its first PARAM_DELTA - 1 coefficients. + * + * @returns the degree of the ELP sigma + * @param[out] sigma Array of size (at least) PARAM_DELTA receiving the ELP + * @param[in] syndromes Array of size (at least) 2*PARAM_DELTA storing the syndromes + */ +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes) { + sigma[0] = 1; + size_t deg_sigma = 0; + size_t deg_sigma_p = 0; + uint16_t sigma_copy[PARAM_DELTA - 1] = {0}; + size_t deg_sigma_copy = 0; + uint16_t X_sigma_p[PARAM_DELTA + 1] = {0, 1}; + int32_t pp = -1; // 2*rho + uint16_t d_p = 1; + uint16_t d = syndromes[0]; + + for (size_t mu = 0 ; mu < PARAM_DELTA ; ++mu) { + // Save sigma in case we need it to update X_sigma_p + memcpy(sigma_copy, sigma, 2 * (PARAM_DELTA - 1)); + deg_sigma_copy = deg_sigma; + + uint16_t dd = PQCLEAN_HQC128_CLEAN_gf_mul(d, PQCLEAN_HQC128_CLEAN_gf_inverse(d_p)); // 0 if(d == 0) + for (size_t i = 1 ; (i <= 2 * mu + 1) && (i <= PARAM_DELTA) ; ++i) { + sigma[i] ^= PQCLEAN_HQC128_CLEAN_gf_mul(dd, X_sigma_p[i]); + } + + size_t deg_X = 2 * mu - pp; // 2*(mu-rho) + size_t deg_X_sigma_p = deg_X + deg_sigma_p; + + // mask1 = 0xffff if(d != 0) and 0 otherwise + int16_t mask1 = -((uint16_t) - d >> 15); + + // mask2 = 0xffff if(deg_X_sigma_p > deg_sigma) and 0 otherwise + int16_t mask2 = -((uint16_t) (deg_sigma - deg_X_sigma_p) >> 15); + + // mask12 = 0xffff if the deg_sigma increased and 0 otherwise + int16_t mask12 = mask1 & mask2; + deg_sigma = (mask12 & deg_X_sigma_p) ^ (~mask12 & deg_sigma); + + if (mu == PARAM_DELTA - 1) { + break; + } + + // Update pp, d_p and X_sigma_p if needed + pp = (mask12 & (2 * mu)) ^ (~mask12 & pp); + d_p = (mask12 & d) ^ (~mask12 & d_p); + for (size_t i = PARAM_DELTA - 1 ; i ; --i) { + X_sigma_p[i + 1] = (mask12 & sigma_copy[i - 1]) ^ (~mask12 & X_sigma_p[i - 1]); + } + X_sigma_p[1] = 0; + X_sigma_p[0] = 0; + deg_sigma_p = (mask12 & deg_sigma_copy) ^ (~mask12 & deg_sigma_p); + + // Compute the next discrepancy + d = syndromes[2 * mu + 2]; + for (size_t i = 1 ; (i <= 2 * mu + 1) && (i <= PARAM_DELTA) ; ++i) { + d ^= PQCLEAN_HQC128_CLEAN_gf_mul(sigma[i], syndromes[2 * mu + 2 - i]); + } + } + + return deg_sigma; +} + + + +/** + * @brief Retrieves the message message from the codeword codeword + * + * Since we performed a systematic encoding, the message is the last PARAM_K bits of the codeword. + * + * @param[out] message Array of size VEC_K_SIZE_BYTES receiving the message + * @param[in] codeword Array of size VEC_N1_SIZE_BYTES storing the codeword + */ +static void message_from_codeword(uint64_t *message, const uint64_t *codeword) { + int32_t val = PARAM_N1 - PARAM_K; + + uint64_t mask1 = (uint64_t) (0xffffffffffffffff << val % 64); + uint64_t mask2 = (uint64_t) (0xffffffffffffffff >> (64 - val % 64)); + size_t index = val / 64; + + for (size_t i = 0 ; i < VEC_K_SIZE_64 - 1 ; ++i) { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + uint64_t message2 = (codeword[++index] & mask2) << (64 - val % 64); + message[i] = message1 | message2; + } + + // Last byte (8-val % 8 is the number of bits given by message1) + if ((PARAM_K % 64 == 0) || (64 - val % 64 < PARAM_K % 64)) { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + uint64_t message2 = (codeword[++index] & mask2) << (64 - val % 64); + message[VEC_K_SIZE_64 - 1] = message1 | message2; + } else { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + message[VEC_K_SIZE_64 - 1] = message1; + } +} + + +/** + * @brief Computes the 2^PARAM_DELTA syndromes from the received vector vector + * + * Syndromes are the sum of powers of alpha weighted by vector's coefficients. + * To do so, we use the additive FFT transpose, which takes as input a family w of GF(2^PARAM_M) elements + * and outputs the weighted power sums of these w.
+ * Therefore, this requires twisting and applying a permutation before feeding vector to the PQCLEAN_HQC128_CLEAN_fft transpose.
+ * For more details see Berstein, Chou and Schawbe's explanations: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] syndromes Array of size 2^(PARAM_FFT_T) receiving the 2*PARAM_DELTA syndromes + * @param[in] vector Array of size VEC_N1_SIZE_BYTES storing the received word + */ +static void compute_syndromes(uint16_t *syndromes, const uint64_t *vector) { + uint16_t w[1 << PARAM_M]; + + PQCLEAN_HQC128_CLEAN_fft_t_preprocess_bch_codeword(w, vector); + PQCLEAN_HQC128_CLEAN_fft_t(syndromes, w, 2 * PARAM_DELTA); +} + + +/** + * @brief Computes the error polynomial error from the error locator polynomial sigma + * + * See function PQCLEAN_HQC128_CLEAN_fft for more details. + * + * @param[out] error Array of VEC_N1_SIZE_BYTES elements receiving the error polynomial + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + */ +static void compute_roots(uint64_t *error, const uint16_t *sigma) { + uint16_t w[1 << PARAM_M] = {0}; // w will receive the evaluation of sigma in all field elements + + PQCLEAN_HQC128_CLEAN_fft(w, sigma, PARAM_DELTA + 1); + PQCLEAN_HQC128_CLEAN_fft_retrieve_bch_error_poly(error, w); +} + + + +/** + * @brief Decodes the received word + * + * This function relies on four steps: + *
    + *
  1. The first step, done by additive FFT transpose, is the computation of the 2*PARAM_DELTA syndromes. + *
  2. The second step is the computation of the error-locator polynomial sigma. + *
  3. The third step, done by additive FFT, is finding the error-locator numbers by calculating the roots of the polynomial sigma and takings their inverses. + *
  4. The fourth step is the correction of the errors in the received polynomial. + *
+ * For a more complete picture on BCH decoding, see Shu. Lin and Daniel J. Costello in Error Control Coding: Fundamentals and Applications @cite lin1983error + * + * @param[out] message Array of size VEC_K_SIZE_BYTES receiving the decoded message + * @param[in] vector Array of size VEC_N1_SIZE_BYTES storing the received word + */ +void PQCLEAN_HQC128_CLEAN_bch_code_decode(uint64_t *message, uint64_t *vector) { + uint16_t syndromes[1 << PARAM_FFT_T] = {0}; + uint16_t sigma[1 << PARAM_FFT] = {0}; + uint64_t error[(1 << PARAM_M) / 8] = {0}; + + // Calculate the 2*PARAM_DELTA syndromes + compute_syndromes(syndromes, vector); + + // Compute the error locator polynomial sigma + // Sigma's degree is at most PARAM_DELTA but the FFT requires the extra room + compute_elp(sigma, syndromes); + + // Compute the error polynomial error + compute_roots(error, sigma); + + // Add the error polynomial to the received polynomial + PQCLEAN_HQC128_CLEAN_vect_add(vector, vector, error, VEC_N1_SIZE_64); + + // Retrieve the message from the decoded codeword + message_from_codeword(message, vector); + +} diff --git a/crypto_kem/hqc-128/clean/bch.h b/crypto_kem/hqc-128/clean/bch.h new file mode 100644 index 00000000..34bf51e8 --- /dev/null +++ b/crypto_kem/hqc-128/clean/bch.h @@ -0,0 +1,23 @@ +#ifndef BCH_H +#define BCH_H + + +/** + * @file bch.h + * Header file of bch.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQC128_CLEAN_bch_code_encode(uint64_t *codeword, const uint64_t *message); + +void PQCLEAN_HQC128_CLEAN_bch_code_decode(uint64_t *message, uint64_t *vector); + + +size_t PQCLEAN_HQC128_CLEAN_compute_bch_poly(uint16_t *bch_poly, size_t *t, const uint16_t *exp, const uint16_t *log); + + +#endif diff --git a/crypto_kem/hqc-128/clean/code.c b/crypto_kem/hqc-128/clean/code.c new file mode 100644 index 00000000..5f42e98f --- /dev/null +++ b/crypto_kem/hqc-128/clean/code.c @@ -0,0 +1,49 @@ +#include "bch.h" +#include "code.h" +#include "parameters.h" +#include "repetition.h" +#include +#include +/** + * @file code.c + * @brief Implementation of tensor code + */ + + + +/** + * + * @brief Encoding the message m to a code word em using the tensor code + * + * First we encode the message using the BCH code, then with the repetition code to obtain + * a tensor code word. + * + * @param[out] em Pointer to an array that is the tensor code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQC128_CLEAN_code_encode(uint64_t *em, const uint64_t *m) { + + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQC128_CLEAN_bch_code_encode(tmp, m); + PQCLEAN_HQC128_CLEAN_repetition_code_encode(em, tmp); + +} + + + +/** + * @brief Decoding the code word em to a message m using the tensor code + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQC128_CLEAN_code_decode(uint64_t *m, const uint64_t *em) { + + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQC128_CLEAN_repetition_code_decode(tmp, em); + PQCLEAN_HQC128_CLEAN_bch_code_decode(m, tmp); + + +} diff --git a/crypto_kem/hqc-128/clean/code.h b/crypto_kem/hqc-128/clean/code.h new file mode 100644 index 00000000..a34da246 --- /dev/null +++ b/crypto_kem/hqc-128/clean/code.h @@ -0,0 +1,20 @@ +#ifndef CODE_H +#define CODE_H + + +/** + * @file code.h + * Header file of code.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQC128_CLEAN_code_encode(uint64_t *em, const uint64_t *message); + +void PQCLEAN_HQC128_CLEAN_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-128/clean/fft.c b/crypto_kem/hqc-128/clean/fft.c new file mode 100644 index 00000000..1a08fc8a --- /dev/null +++ b/crypto_kem/hqc-128/clean/fft.c @@ -0,0 +1,627 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include +#include +#include +/** + * @file fft.c + * Implementation of the additive FFT and its transpose. + * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + */ + + +static void compute_fft_betas(uint16_t *betas); +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size); +static void radix_t(uint16_t *f, const uint16_t *f0, const uint16_t *f1, uint32_t m_f); +static void fft_t_rec(uint16_t *f, const uint16_t *w, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f); +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); + + +/** + * @brief Computes the basis of betas (omitting 1) used in the additive FFT and its transpose + * + * @param[out] betas Array of size PARAM_M-1 + */ +static void compute_fft_betas(uint16_t *betas) { + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + betas[i] = 1 << (PARAM_M - 1 - i); + } +} + + + +/** + * @brief Computes the subset sums of the given set + * + * The array subset_sums is such that its ith element is + * the subset sum of the set elements given by the binary form of i. + * + * @param[out] subset_sums Array of size 2^set_size receiving the subset sums + * @param[in] set Array of set_size elements + * @param[in] set_size Size of the array set + */ +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size) { + subset_sums[0] = 0; + + for (size_t i = 0 ; i < set_size ; ++i) { + for (size_t j = 0 ; j < (1U << i) ; ++j) { + subset_sums[(1 << i) + j] = set[i] ^ subset_sums[j]; + } + } +} + + + +/** + * @brief Transpose of the linear radix conversion + * + * This is a direct transposition of the radix function + * implemented following the process of transposing a linear function as exposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f Array of size a power of 2 + * @param[in] f0 Array half the size of f + * @param[in] f1 Array half the size of f + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix_t(uint16_t *f, const uint16_t *f0, const uint16_t *f1, uint32_t m_f) { + switch (m_f) { + case 4: + f[0] = f0[0]; + f[1] = f1[0]; + f[2] = f0[1] ^ f1[0]; + f[3] = f[2] ^ f1[1]; + f[4] = f[2] ^ f0[2]; + f[5] = f[3] ^ f1[2]; + f[6] = f[4] ^ f0[3] ^ f1[2]; + f[7] = f[3] ^ f0[3] ^ f1[3]; + f[8] = f[4] ^ f0[4]; + f[9] = f[5] ^ f1[4]; + f[10] = f[6] ^ f0[5] ^ f1[4]; + f[11] = f[7] ^ f0[5] ^ f1[4] ^ f1[5]; + f[12] = f[8] ^ f0[5] ^ f0[6] ^ f1[4]; + f[13] = f[7] ^ f[9] ^ f[11] ^ f1[6]; + f[14] = f[6] ^ f0[6] ^ f0[7] ^ f1[6]; + f[15] = f[7] ^ f0[7] ^ f1[7]; + return; + + case 3: + f[0] = f0[0]; + f[1] = f1[0]; + f[2] = f0[1] ^ f1[0]; + f[3] = f[2] ^ f1[1]; + f[4] = f[2] ^ f0[2]; + f[5] = f[3] ^ f1[2]; + f[6] = f[4] ^ f0[3] ^ f1[2]; + f[7] = f[3] ^ f0[3] ^ f1[3]; + return; + + case 2: + f[0] = f0[0]; + f[1] = f1[0]; + f[2] = f0[1] ^ f1[0]; + f[3] = f[2] ^ f1[1]; + return; + + case 1: + f[0] = f0[0]; + f[1] = f1[0]; + return; + + default: + ; + + size_t n = 1 << (m_f - 2); + + uint16_t Q0[1 << (PARAM_FFT_T - 2)]; + uint16_t Q1[1 << (PARAM_FFT_T - 2)]; + uint16_t R0[1 << (PARAM_FFT_T - 2)]; + uint16_t R1[1 << (PARAM_FFT_T - 2)]; + + uint16_t Q[1 << 2 * (PARAM_FFT_T - 2)]; + uint16_t R[1 << 2 * (PARAM_FFT_T - 2)]; + + memcpy(Q0, f0 + n, 2 * n); + memcpy(Q1, f1 + n, 2 * n); + memcpy(R0, f0, 2 * n); + memcpy(R1, f1, 2 * n); + + radix_t (Q, Q0, Q1, m_f - 1); + radix_t (R, R0, R1, m_f - 1); + + memcpy(f, R, 4 * n); + memcpy(f + 2 * n, R + n, 2 * n); + memcpy(f + 3 * n, Q + n, 2 * n); + + for (size_t i = 0 ; i < n ; ++i) { + f[2 * n + i] ^= Q[i]; + f[3 * n + i] ^= f[2 * n + i]; + } + } +} + + + +/** + * @brief Recursively computes syndromes of family w + * + * This function is a subroutine of the function fft_t + * + * @param[out] f Array receiving the syndromes + * @param[in] w Array storing the family + * @param[in] f_coeffs Length of syndromes vector + * @param[in] m 2^m is the smallest power of 2 greater or equal to the length of family w + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the length of f + * @param[in] betas FFT constants + */ +static void fft_t_rec(uint16_t *f, const uint16_t *w, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + size_t k = 1 << (m - 1); + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + uint16_t gammas_sums[1 << (PARAM_M - 1)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t f0[1 << (PARAM_FFT_T - 2)] = {0}; + uint16_t f1[1 << (PARAM_FFT_T - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + f[0] = 0; + for (size_t i = 0 ; i < (1U << m) ; ++i) { + f[0] ^= w[i]; + } + f[1] = 0; + + uint16_t betas_sums[1 << (PARAM_M - 1)]; + betas_sums[0] = 0; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + size_t index = (1 << j) + k; + betas_sums[index] = betas_sums[k] ^ betas[j]; + f[1] ^= PQCLEAN_HQC128_CLEAN_gf_mul(betas_sums[index], w[index]); + } + } + + return; + } + + // Compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQC128_CLEAN_gf_mul(betas[i], PQCLEAN_HQC128_CLEAN_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQC128_CLEAN_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas subset sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + /* Step 6: Compute u and v from w (aka w) + * w[i] = u[i] + G[i].v[i] + * w[k+i] = w[i] + v[i] = u[i] + (G[i]+1).v[i] + * Transpose: + * u[i] = w[i] + w[k+i] + * v[i] = G[i].w[i] + (G[i]+1).w[k+i] = G[i].u[i] + w[k+i] */ + if (f_coeffs <= 3) { // 3-coefficient polynomial f case + // Step 5: Compute f0 from u and f1 from v + f1[1] = 0; + u[0] = w[0] ^ w[k]; + f1[0] = w[k]; + for (size_t i = 1 ; i < k ; ++i) { + u[i] = w[i] ^ w[k + i]; + f1[0] ^= PQCLEAN_HQC128_CLEAN_gf_mul(gammas_sums[i], u[i]) ^ w[k + i]; + } + fft_t_rec(f0, u, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + } else { + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + u[0] = w[0] ^ w[k]; + v[0] = w[k]; + + for (size_t i = 1 ; i < k ; ++i) { + u[i] = w[i] ^ w[k + i]; + v[i] = PQCLEAN_HQC128_CLEAN_gf_mul(gammas_sums[i], u[i]) ^ w[k + i]; + } + + // Step 5: Compute f0 from u and f1 from v + fft_t_rec(f0, u, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + fft_t_rec(f1, v, f_coeffs / 2, m - 1, m_f - 1, deltas); + } + + // Step 3: Compute g from g0 and g1 + radix_t(f, f0, f1, m_f); + + // Step 2: compute f from g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQC128_CLEAN_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQC128_CLEAN_gf_mul(beta_m_pow, f[i]); + } + } +} + + + +/** + * @brief Computes the syndromes f of the family w + * + * Since the syndromes linear map is the transpose of multipoint evaluation, + * it uses exactly the same constants, either hardcoded or precomputed by compute_fft_lut(...).
+ * This follows directives from Bernstein, Chou and Schwabe given here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f Array of size 2*(PARAM_FFT_T) elements receiving the syndromes + * @param[in] w Array of PARAM_GF_MUL_ORDER+1 elements + * @param[in] f_coeffs Length of syndromes vector f + */ +void PQCLEAN_HQC128_CLEAN_fft_t(uint16_t *f, const uint16_t *w, size_t f_coeffs) { + // Transposed from Gao and Mateer algorithm + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)] = {0}; + uint16_t v[1 << (PARAM_M - 1)] = {0}; + uint16_t deltas[PARAM_M - 1]; + uint16_t f0[1 << (PARAM_FFT_T - 1)]; + uint16_t f1[1 << (PARAM_FFT_T - 1)]; + + compute_fft_betas(betas); + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + /* Step 6: Compute u and v from w (aka w) + * + * We had: + * w[i] = u[i] + G[i].v[i] + * w[k+i] = w[i] + v[i] = u[i] + (G[i]+1).v[i] + * Transpose: + * u[i] = w[i] + w[k+i] + * v[i] = G[i].w[i] + (G[i]+1).w[k+i] = G[i].u[i] + w[k+i] */ + u[0] = w[0] ^ w[k]; + v[0] = w[k]; + for (size_t i = 1 ; i < k ; ++i) { + u[i] = w[i] ^ w[k + i]; + v[i] = PQCLEAN_HQC128_CLEAN_gf_mul(betas_sums[i], u[i]) ^ w[k + i]; + } + + // Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQC128_CLEAN_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5: Compute f0 from u and f1 from v + fft_t_rec(f0, u, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT_T - 1, deltas); + fft_t_rec(f1, v, f_coeffs / 2, PARAM_M - 1, PARAM_FFT_T - 1, deltas); + + // Step 3: Compute g from g0 and g1 + radix_t(f, f0, f1, PARAM_FFT_T); + + // Step 2: beta_m = 1 so f = g +} + + + +/** + * @brief Computes the radix conversion of a polynomial f in GF(2^m)[x] + * + * Computes f0 and f1 such that f(x) = f0(x^2-x) + x.f1(x^2-x) + * as proposed by Bernstein, Chou and Schwabe: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f0 Array half the size of f + * @param[out] f1 Array half the size of f + * @param[in] f Array of size a power of 2 + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f) { + switch (m_f) { + case 4: + f0[4] = f[8] ^ f[12]; + f0[6] = f[12] ^ f[14]; + f0[7] = f[14] ^ f[15]; + f1[5] = f[11] ^ f[13]; + f1[6] = f[13] ^ f[14]; + f1[7] = f[15]; + f0[5] = f[10] ^ f[12] ^ f1[5]; + f1[4] = f[9] ^ f[13] ^ f0[5]; + + f0[0] = f[0]; + f1[3] = f[7] ^ f[11] ^ f[15]; + f0[3] = f[6] ^ f[10] ^ f[14] ^ f1[3]; + f0[2] = f[4] ^ f0[4] ^ f0[3] ^ f1[3]; + f1[1] = f[3] ^ f[5] ^ f[9] ^ f[13] ^ f1[3]; + f1[2] = f[3] ^ f1[1] ^ f0[3]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 3: + f0[0] = f[0]; + f0[2] = f[4] ^ f[6]; + f0[3] = f[6] ^ f[7]; + f1[1] = f[3] ^ f[5] ^ f[7]; + f1[2] = f[5] ^ f[6]; + f1[3] = f[7]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 2: + f0[0] = f[0]; + f0[1] = f[2] ^ f[3]; + f1[0] = f[1] ^ f0[1]; + f1[1] = f[3]; + return; + + case 1: + f0[0] = f[0]; + f1[0] = f[1]; + return; + + default: + ; + size_t n = 1 << (m_f - 2); + + uint16_t Q[2 * (1 << (PARAM_FFT - 2))]; + uint16_t R[2 * (1 << (PARAM_FFT - 2))]; + + uint16_t Q0[1 << (PARAM_FFT - 2)]; + uint16_t Q1[1 << (PARAM_FFT - 2)]; + uint16_t R0[1 << (PARAM_FFT - 2)]; + uint16_t R1[1 << (PARAM_FFT - 2)]; + + memcpy(Q, f + 3 * n, 2 * n); + memcpy(Q + n, f + 3 * n, 2 * n); + memcpy(R, f, 4 * n); + + for (size_t i = 0 ; i < n ; ++i) { + Q[i] ^= f[2 * n + i]; + R[n + i] ^= Q[i]; + } + + radix(Q0, Q1, Q, m_f - 1); + radix(R0, R1, R, m_f - 1); + + memcpy(f0, R0, 2 * n); + memcpy(f0 + n, Q0, 2 * n); + memcpy(f1, R1, 2 * n); + memcpy(f1 + n, Q1, 2 * n); + } +} + + + +/** + * @brief Evaluates f at all subset sums of a given set + * + * This function is a subroutine of the function fft. + * + * @param[out] w Array + * @param[in] f Array + * @param[in] f_coeffs Number of coefficients of f + * @param[in] m Number of betas + * @param[in] m_f Number of coefficients of f (one more than its degree) + * @param[in] betas FFT constants + */ +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + uint16_t f0[1 << (PARAM_FFT - 2)]; + uint16_t f1[1 << (PARAM_FFT - 2)]; + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + size_t k = 1 << (m - 1); + uint16_t gammas_sums[1 << (PARAM_M - 2)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + uint16_t tmp[PARAM_M - (PARAM_FFT - 1)]; + for (size_t i = 0 ; i < m ; ++i) { + tmp[i] = PQCLEAN_HQC128_CLEAN_gf_mul(betas[i], f[1]); + } + + w[0] = f[0]; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + w[(1 << j) + k] = w[k] ^ tmp[j]; + } + } + + return; + } + + // Step 2: compute g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQC128_CLEAN_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQC128_CLEAN_gf_mul(beta_m_pow, f[i]); + } + } + + // Step 3 + radix(f0, f1, f, m_f); + + // Step 4: compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQC128_CLEAN_gf_mul(betas[i], PQCLEAN_HQC128_CLEAN_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQC128_CLEAN_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + + if (f_coeffs <= 3) { // 3-coefficient polynomial f case: f1 is constant + w[0] = u[0]; + w[k] = u[0] ^ f1[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC128_CLEAN_gf_mul(gammas_sums[i], f1[0]); + w[k + i] = w[i] ^ f1[0]; + } + } else { + fft_rec(v, f1, f_coeffs / 2, m - 1, m_f - 1, deltas); + + // Step 6 + memcpy(w + k, v, 2 * k); + w[0] = u[0]; + w[k] ^= u[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC128_CLEAN_gf_mul(gammas_sums[i], v[i]); + w[k + i] ^= w[i]; + } + } +} + + + +/** + * @brief Evaluates f on all fields elements using an additive FFT algorithm + * + * f_coeffs is the number of coefficients of f (one less than its degree).
+ * The FFT proceeds recursively to evaluate f at all subset sums of a basis B.
+ * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf
+ * Note that on this first call (as opposed to the recursive calls to fft_rec), gammas are equal to betas, + * meaning the first gammas subset sums are actually the subset sums of betas (except 1).
+ * Also note that f is altered during computation (twisted at each level). + * + * @param[out] w Array + * @param[in] f Array of 2^PARAM_FFT elements + * @param[in] f_coeffs Number coefficients of f (i.e. deg(f)+1) + */ +void PQCLEAN_HQC128_CLEAN_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs) { + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + uint16_t f0[1 << (PARAM_FFT - 1)]; + uint16_t f1[1 << (PARAM_FFT - 1)]; + uint16_t deltas[PARAM_M - 1]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)]; + uint16_t v[1 << (PARAM_M - 1)]; + + // Follows Gao and Mateer algorithm + compute_fft_betas(betas); + + // Step 1: PARAM_FFT > 1, nothing to do + + // Compute gammas sums + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + // Step 2: beta_m = 1, nothing to do + + // Step 3 + radix(f0, f1, f, PARAM_FFT); + + // Step 4: Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQC128_CLEAN_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + fft_rec(v, f1, f_coeffs / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + + // Step 6, 7 and error polynomial computation + memcpy(w + k, v, 2 * k); + + // Check if 0 is root + w[0] = u[0]; + + // Check if 1 is root + w[k] ^= u[0]; + + // Find other roots + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC128_CLEAN_gf_mul(betas_sums[i], v[i]); + w[k + i] ^= w[i]; + } +} + + + +/** + * @brief Arranges the received word vector in a form w such that applying the additive FFT transpose to w yields the BCH syndromes of the received word vector. + * + * Since the received word vector gives coefficients of the primitive element alpha, we twist accordingly.
+ * Furthermore, the additive FFT transpose needs elements indexed by their decomposition on the chosen basis, + * so we apply the adequate permutation. + * + * @param[out] w Array of size 2^PARAM_M + * @param[in] vector Array of size VEC_N1_SIZE_BYTES + */ +void PQCLEAN_HQC128_CLEAN_fft_t_preprocess_bch_codeword(uint16_t *w, const uint64_t *vector) { + uint16_t r[1 << PARAM_M]; + uint16_t gammas[PARAM_M - 1]; + uint16_t gammas_sums[1 << (PARAM_M - 1)]; + size_t k = 1 << (PARAM_M - 1); + + // Unpack the received word vector into array r + size_t i; + for (i = 0 ; i < VEC_N1_SIZE_64 - (PARAM_N1 % 64 != 0) ; ++i) { + for (size_t j = 0 ; j < 64 ; ++j) { + r[64 * i + j] = (uint8_t) ((vector[i] >> j) & 1); + } + } + + // Last byte + for (size_t j = 0 ; j < PARAM_N1 % 64 ; ++j) { + r[64 * i + j] = (uint8_t) ((vector[i] >> j) & 1); + } + + // Complete r with zeros + memset(r + PARAM_N1, 0, 2 * ((1 << PARAM_M) - PARAM_N1)); + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + // Twist and permute r adequately to obtain w + w[0] = 0; + w[k] = -r[0] & 1; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = -r[PQCLEAN_HQC128_CLEAN_gf_log(gammas_sums[i])] & gammas_sums[i]; + w[k + i] = -r[PQCLEAN_HQC128_CLEAN_gf_log(gammas_sums[i] ^ 1)] & (gammas_sums[i] ^ 1); + } +} + + + +/** + * @brief Retrieves the error polynomial error from the evaluations w of the ELP (Error Locator Polynomial) on all field elements. + * + * @param[out] error Array of size VEC_N1_SIZE_BYTES + * @param[in] w Array of size 2^PARAM_M + */ +void PQCLEAN_HQC128_CLEAN_fft_retrieve_bch_error_poly(uint64_t *error, const uint16_t *w) { + uint16_t gammas[PARAM_M - 1]; + uint16_t gammas_sums[1 << (PARAM_M - 1)]; + size_t k = 1 << (PARAM_M - 1); + size_t index = PARAM_GF_MUL_ORDER; + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + error[0] ^= ((uint64_t) 1) ^ ((uint16_t) - w[0] >> 15); + uint64_t bit = ((uint64_t) 1) ^ ((uint16_t) - w[k] >> 15); + error[index / 8] ^= bit << (index % 64); + + for (size_t i = 1 ; i < k ; ++i) { + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQC128_CLEAN_gf_log(gammas_sums[i]); + bit = ((uint64_t) 1) ^ ((uint16_t) - w[i] >> 15); + error[index / 64] ^= bit << (index % 64); + + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQC128_CLEAN_gf_log(gammas_sums[i] ^ 1); + bit = ((uint64_t) 1) ^ ((uint16_t) - w[k + i] >> 15); + error[index / 64] ^= bit << (index % 64); + } +} diff --git a/crypto_kem/hqc-128/clean/fft.h b/crypto_kem/hqc-128/clean/fft.h new file mode 100644 index 00000000..ea45988d --- /dev/null +++ b/crypto_kem/hqc-128/clean/fft.h @@ -0,0 +1,25 @@ +#ifndef FFT_H +#define FFT_H + + +/** + * @file fft.h + * Header file of fft.c + */ + +#include + +#include +#include + +void PQCLEAN_HQC128_CLEAN_fft_t(uint16_t *f, const uint16_t *w, size_t f_coeffs); + +void PQCLEAN_HQC128_CLEAN_fft_t_preprocess_bch_codeword(uint16_t *w, const uint64_t *vector); + + +void PQCLEAN_HQC128_CLEAN_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs); + +void PQCLEAN_HQC128_CLEAN_fft_retrieve_bch_error_poly(uint64_t *error, const uint16_t *w); + + +#endif diff --git a/crypto_kem/hqc-128/clean/gf.c b/crypto_kem/hqc-128/clean/gf.c new file mode 100644 index 00000000..9068f7c6 --- /dev/null +++ b/crypto_kem/hqc-128/clean/gf.c @@ -0,0 +1,132 @@ +#include "gf.h" +#include "parameters.h" +#include +/** + * @file gf.c + * Galois field implementation with multiplication using lookup tables + */ + + + +/** + * Powers of the root alpha of x^10 + x^3 + 1. + * The last two elements are needed by the PQCLEAN_HQC128_CLEAN_gf_mul function from gf_mul.c + * (for example if both elements to multiply are zero). + */ +static const uint16_t exp[1026] = { + 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 9, 18, 36, 72, 144, 288, 576, 137, 274, 548, 65, 130, 260, 520, 25, 50, 100, 200, 400, 800, 585, 155, 310, 620, 209, 418, 836, 641, 267, 534, 37, 74, 148, 296, 592, 169, 338, 676, 321, 642, 269, 538, 61, 122, 244, 488, 976, 937, 859, 703, 375, 750, 469, 938, 861, 691, 367, 734, 437, 874, 733, 435, 870, 709, 387, 774, 517, 3, 6, 12, 24, 48, 96, 192, 384, 768, 521, 27, 54, 108, 216, 432, 864, 713, 411, 822, 613, 195, 390, 780, 529, 43, 86, 172, 344, 688, 361, 722, 429, 858, 701, 371, 742, 453, 906, 797, 563, 111, 222, 444, 888, 761, 507, 1014, 997, 963, 911, 791, 551, 71, 142, 284, 568, 121, 242, 484, 968, 921, 827, 639, 247, 494, 988, 945, 875, 735, 439, 878, 725, 419, 838, 645, 259, 518, 5, 10, 20, 40, 80, 160, 320, 640, 265, 530, 45, 90, 180, 360, 720, 425, 850, 685, 339, 678, 325, 650, 285, 570, 125, 250, 500, 1000, 985, 955, 895, 759, 487, 974, 917, 803, 591, 151, 302, 604, 177, 354, 708, 385, 770, 525, 19, 38, 76, 152, 304, 608, 201, 402, 804, 577, 139, 278, 556, 81, 162, 324, 648, 281, 562, 109, 218, 436, 872, 729, 443, 886, 741, 451, 902, 773, 515, 15, 30, 60, 120, 240, 480, 960, 905, 795, 575, 119, 238, 476, 952, 889, 763, 511, 1022, 1013, 995, 975, 919, 807, 583, 135, 270, 540, 49, 98, 196, 392, 784, 553, 91, 182, 364, 728, 441, 882, 749, 467, 934, 837, 643, 271, 542, 53, 106, 212, 424, 848, 681, 347, 694, 357, 714, 413, 826, 637, 243, 486, 972, 913, 811, 607, 183, 366, 732, 433, 866, 717, 403, 806, 581, 131, 262, 524, 17, 34, 68, 136, 272, 544, 73, 146, 292, 584, 153, 306, 612, 193, 386, 772, 513, 11, 22, 44, 88, 176, 352, 704, 393, 786, 557, 83, 166, 332, 664, 313, 626, 237, 474, 948, 865, 715, 415, 830, 629, 227, 454, 908, 785, 555, 95, 190, 380, 760, 505, 1010, 1005, 979, 943, 855, 679, 327, 654, 277, 554, 93, 186, 372, 744, 473, 946, 877, 723, 431, 862, 693, 355, 710, 389, 778, 541, 51, 102, 204, 408, 816, 617, 219, 438, 876, 721, 427, 854, 677, 323, 646, 261, 522, 29, 58, 116, 232, 464, 928, 841, 667, 319, 638, 245, 490, 980, 929, 843, 671, 311, 622, 213, 426, 852, 673, 331, 662, 293, 586, 157, 314, 628, 225, 450, 900, 769, 523, 31, 62, 124, 248, 496, 992, 969, 923, 831, 631, 231, 462, 924, 817, 619, 223, 446, 892, 753, 491, 982, 933, 835, 655, 279, 558, 85, 170, 340, 680, 345, 690, 365, 730, 445, 890, 765, 499, 998, 965, 899, 783, 535, 39, 78, 156, 312, 624, 233, 466, 932, 833, 651, 287, 574, 117, 234, 468, 936, 857, 699, 383, 766, 501, 1002, 989, 947, 879, 727, 423, 846, 661, 291, 582, 133, 266, 532, 33, 66, 132, 264, 528, 41, 82, 164, 328, 656, 297, 594, 173, 346, 692, 353, 706, 397, 794, 573, 115, 230, 460, 920, 825, 635, 255, 510, 1020, 1009, 1003, 991, 951, 871, 711, 391, 782, 533, 35, 70, 140, 280, 560, 105, 210, 420, 840, 665, 315, 630, 229, 458, 916, 801, 587, 159, 318, 636, 241, 482, 964, 897, 779, 543, 55, 110, 220, 440, 880, 745, 475, 950, 869, 707, 399, 798, 565, 99, 198, 396, 792, 569, 123, 246, 492, 984, 953, 891, 767, 503, 1006, 981, 931, 847, 663, 295, 590, 149, 298, 596, 161, 322, 644, 257, 514, 13, 26, 52, 104, 208, 416, 832, 649, 283, 566, 101, 202, 404, 808, 601, 187, 374, 748, 465, 930, 845, 659, 303, 606, 181, 362, 724, 417, 834, 653, 275, 550, 69, 138, 276, 552, 89, 178, 356, 712, 409, 818, 621, 211, 422, 844, 657, 299, 598, 165, 330, 660, 289, 578, 141, 282, 564, 97, 194, 388, 776, 537, 59, 118, 236, 472, 944, 873, 731, 447, 894, 757, 483, 966, 901, 771, 527, 23, 46, 92, 184, 368, 736, 457, 914, 813, 595, 175, 350, 700, 369, 738, 461, 922, 829, 627, 239, 478, 956, 881, 747, 479, 958, 885, 739, 463, 926, 821, 611, 207, 414, 828, 625, 235, 470, 940, 849, 683, 351, 702, 373, 746, 477, 954, 893, 755, 495, 990, 949, 867, 719, 407, 814, 597, 163, 326, 652, 273, 546, 77, 154, 308, 616, 217, 434, 868, 705, 395, 790, 549, 67, 134, 268, 536, 57, 114, 228, 456, 912, 809, 603, 191, 382, 764, 497, 994, 973, 915, 815, 599, 167, 334, 668, 305, 610, 205, 410, 820, 609, 203, 406, 812, 593, 171, 342, 684, 337, 674, 333, 666, 317, 634, 253, 506, 1012, 993, 971, 927, 823, 615, 199, 398, 796, 561, 107, 214, 428, 856, 697, 379, 758, 485, 970, 925, 819, 623, 215, 430, 860, 689, 363, 726, 421, 842, 669, 307, 614, 197, 394, 788, 545, 75, 150, 300, 600, 185, 370, 740, 449, 898, 781, 531, 47, 94, 188, 376, 752, 489, 978, 941, 851, 687, 343, 686, 341, 682, 349, 698, 381, 762, 509, 1018, 1021, 1011, 1007, 983, 935, 839, 647, 263, 526, 21, 42, 84, 168, 336, 672, 329, 658, 301, 602, 189, 378, 756, 481, 962, 909, 787, 559, 87, 174, 348, 696, 377, 754, 493, 986, 957, 883, 751, 471, 942, 853, 675, 335, 670, 309, 618, 221, 442, 884, 737, 459, 918, 805, 579, 143, 286, 572, 113, 226, 452, 904, 793, 571, 127, 254, 508, 1016, 1017, 1019, 1023, 1015, 999, 967, 903, 775, 519, 7, 14, 28, 56, 112, 224, 448, 896, 777, 539, 63, 126, 252, 504, 1008, 1001, 987, 959, 887, 743, 455, 910, 789, 547, 79, 158, 316, 632, 249, 498, 996, 961, 907, 799, 567, 103, 206, 412, 824, 633, 251, 502, 1004, 977, 939, 863, 695, 359, 718, 405, 810, 605, 179, 358, 716, 401, 802, 589, 147, 294, 588, 145, 290, 580, 129, 258, 516, 1, 2, 4 +}; + + + +/** + * Logarithm of elements of GF(2^10) to the base alpha (root of x^10 + x^3 + 1). + * The logarithm of 0 is set to 1024 by convention. + */ +static const uint16_t log[1024] = { + 1024, 0, 1, 77, 2, 154, 78, 956, 3, 10, 155, 325, 79, 618, 957, 231, 4, 308, 11, 200, 156, 889, 326, 695, 80, 24, 619, 87, 958, 402, 232, 436, 5, 513, 309, 551, 12, 40, 201, 479, 157, 518, 890, 101, 327, 164, 696, 860, 81, 258, 25, 385, 620, 277, 88, 577, 959, 772, 403, 680, 233, 52, 437, 966, 6, 20, 514, 768, 310, 650, 552, 129, 13, 314, 41, 849, 202, 757, 480, 980, 158, 213, 519, 335, 891, 462, 102, 907, 328, 654, 165, 264, 697, 369, 861, 354, 82, 675, 259, 590, 26, 628, 386, 991, 621, 556, 278, 822, 89, 219, 578, 117, 960, 937, 773, 533, 404, 491, 681, 241, 234, 133, 53, 595, 438, 178, 967, 943, 7, 1020, 21, 305, 515, 510, 769, 255, 311, 17, 651, 210, 553, 672, 130, 934, 14, 1017, 315, 1014, 42, 610, 850, 191, 203, 318, 758, 31, 481, 428, 981, 568, 159, 613, 214, 752, 520, 667, 336, 788, 892, 45, 463, 801, 103, 525, 908, 705, 329, 194, 655, 1008, 166, 642, 265, 296, 698, 853, 370, 633, 862, 899, 355, 779, 83, 321, 676, 97, 260, 845, 591, 818, 27, 206, 629, 797, 387, 793, 992, 727, 622, 34, 557, 661, 279, 420, 823, 834, 90, 761, 220, 391, 579, 926, 118, 451, 961, 431, 938, 349, 774, 563, 534, 446, 405, 484, 492, 731, 682, 341, 242, 714, 235, 571, 134, 290, 54, 412, 596, 140, 439, 984, 179, 996, 968, 810, 944, 539, 8, 616, 1021, 152, 22, 400, 306, 887, 516, 162, 511, 38, 770, 50, 256, 275, 312, 755, 18, 648, 652, 367, 211, 460, 554, 217, 673, 626, 131, 176, 935, 489, 15, 670, 1018, 508, 316, 426, 1015, 608, 43, 523, 611, 665, 851, 897, 192, 640, 204, 791, 319, 843, 759, 924, 32, 418, 482, 339, 429, 561, 982, 808, 569, 410, 160, 48, 614, 398, 215, 174, 753, 365, 521, 895, 668, 424, 337, 806, 789, 922, 893, 804, 46, 172, 464, 872, 802, 870, 104, 466, 526, 283, 909, 874, 706, 736, 330, 528, 195, 380, 656, 285, 1009, 1003, 167, 106, 643, 838, 266, 468, 297, 66, 699, 708, 854, 111, 371, 738, 634, 60, 863, 911, 900, 827, 356, 876, 780, 497, 84, 197, 322, 74, 677, 382, 98, 548, 261, 332, 846, 765, 592, 530, 819, 587, 28, 1011, 207, 302, 630, 1005, 798, 749, 388, 658, 794, 94, 993, 287, 728, 346, 623, 645, 35, 149, 558, 840, 662, 505, 280, 169, 421, 395, 824, 108, 835, 377, 91, 299, 762, 71, 221, 68, 392, 146, 580, 268, 927, 224, 119, 470, 452, 687, 962, 856, 432, 227, 939, 113, 350, 976, 775, 701, 564, 930, 535, 710, 447, 723, 406, 636, 485, 271, 493, 62, 732, 918, 683, 373, 342, 583, 243, 740, 715, 719, 236, 902, 572, 690, 135, 829, 291, 186, 55, 865, 413, 455, 597, 913, 141, 744, 440, 782, 985, 473, 180, 499, 997, 602, 969, 358, 811, 122, 945, 878, 540, 247, 9, 324, 617, 230, 1022, 76, 153, 955, 23, 86, 401, 435, 307, 199, 888, 694, 517, 100, 163, 859, 512, 550, 39, 478, 771, 679, 51, 965, 257, 384, 276, 576, 313, 848, 756, 979, 19, 767, 649, 128, 653, 263, 368, 353, 212, 334, 461, 906, 555, 821, 218, 116, 674, 589, 627, 990, 132, 594, 177, 942, 936, 532, 490, 240, 16, 209, 671, 933, 1019, 304, 509, 254, 317, 30, 427, 567, 1016, 1013, 609, 190, 44, 800, 524, 704, 612, 751, 666, 787, 852, 632, 898, 778, 193, 1007, 641, 295, 205, 796, 792, 726, 320, 96, 844, 817, 760, 390, 925, 450, 33, 660, 419, 833, 483, 730, 340, 713, 430, 348, 562, 445, 983, 995, 809, 538, 570, 289, 411, 139, 161, 37, 49, 274, 615, 151, 399, 886, 216, 625, 175, 488, 754, 647, 366, 459, 522, 664, 896, 639, 669, 507, 425, 607, 338, 560, 807, 409, 790, 842, 923, 417, 894, 423, 805, 921, 47, 397, 173, 364, 465, 282, 873, 735, 803, 171, 871, 869, 105, 837, 467, 65, 527, 379, 284, 1002, 910, 826, 875, 496, 707, 110, 737, 59, 331, 764, 529, 586, 196, 73, 381, 547, 657, 93, 286, 345, 1010, 301, 1004, 748, 168, 394, 107, 376, 644, 148, 839, 504, 267, 223, 469, 686, 298, 70, 67, 145, 700, 929, 709, 722, 855, 226, 112, 975, 372, 582, 739, 718, 635, 270, 61, 917, 864, 454, 912, 743, 901, 689, 828, 185, 357, 121, 877, 246, 781, 472, 498, 601, 85, 434, 198, 693, 323, 229, 75, 954, 678, 964, 383, 575, 99, 858, 549, 477, 262, 352, 333, 905, 847, 978, 766, 127, 593, 941, 531, 239, 820, 115, 588, 989, 29, 566, 1012, 189, 208, 932, 303, 253, 631, 777, 1006, 294, 799, 703, 750, 786, 389, 449, 659, 832, 795, 725, 95, 816, 994, 537, 288, 138, 729, 712, 347, 444, 624, 487, 646, 458, 36, 273, 150, 885, 559, 408, 841, 416, 663, 638, 506, 606, 281, 734, 170, 868, 422, 920, 396, 363, 825, 495, 109, 58, 836, 64, 378, 1001, 92, 344, 300, 747, 763, 585, 72, 546, 222, 685, 69, 144, 393, 375, 147, 503, 581, 717, 269, 916, 928, 721, 225, 974, 120, 245, 471, 600, 453, 742, 688, 184, 963, 574, 857, 476, 433, 692, 228, 953, 940, 238, 114, 988, 351, 904, 977, 126, 776, 293, 702, 785, 565, 188, 931, 252, 536, 137, 711, 443, 448, 831, 724, 815, 407, 415, 637, 605, 486, 457, 272, 884, 494, 57, 63, 1000, 733, 867, 919, 362, 684, 143, 374, 502, 343, 746, 584, 545, 244, 599, 741, 183, 716, 915, 720, 973, 237, 987, 903, 125, 573, 475, 691, 952, 136, 442, 830, 814, 292, 784, 187, 251, 56, 999, 866, 361, 414, 604, 456, 883, 598, 182, 914, 972, 142, 501, 745, 544, 441, 813, 783, 250, 986, 124, 474, 951, 181, 971, 500, 543, 998, 360, 603, 882, 970, 542, 359, 881, 812, 249, 123, 950, 946, 947, 879, 948, 541, 880, 248, 949 +}; + + + +/** + * @brief Generates exp and log lookup tables of GF(2^m). + * + * The logarithm of 0 is defined as 2^PARAM_M by convention.
+ * The last two elements of the exp table are needed by the PQCLEAN_HQC128_CLEAN_gf_mul function from gf_lutmul.c + * (for example if both elements to multiply are zero). + * @param[out] exp Array of size 2^PARAM_M + 2 receiving the powers of the primitive element + * @param[out] log Array of size 2^PARAM_M receiving the logarithms of the elements of GF(2^m) + * @param[in] m Parameter of Galois field GF(2^m) + */ +void PQCLEAN_HQC128_CLEAN_gf_generate(uint16_t *exp, uint16_t *log, int16_t m) { + uint16_t elt = 1; + uint16_t alpha = 2; // primitive element of GF(2^PARAM_M) + uint16_t gf_poly = PARAM_GF_POLY; + + for (size_t i = 0 ; i < (1U << m) - 1 ; ++i) { + exp[i] = elt; + log[elt] = i; + + elt *= alpha; + if (elt >= 1 << m) { + elt ^= gf_poly; + } + } + + exp[(1 << m) - 1] = 1; + exp[1 << m] = 2; + exp[(1 << m) + 1] = 4; + log[0] = 1 << m; // by convention +} + + + +/** + * @brief Returns the integer i such that elt = a^i where a is the primitive element of GF(2^PARAM_M). + * + * @returns the logarithm of the given element + */ +uint16_t PQCLEAN_HQC128_CLEAN_gf_log(uint16_t elt) { + return log[elt]; +} + + + +/** + * @brief Multiplies nonzero element a by element b + * + * @returns the product a*b + * @param[in] a First element of GF(2^PARAM_M) to multiply (cannot be zero) + * @param[in] b Second element of GF(2^PARAM_M) to multiply (cannot be zero) + */ +uint16_t PQCLEAN_HQC128_CLEAN_gf_mul(uint16_t a, uint16_t b) { + // mask = 0xffff if neither a nor b is zero. Otherwise mask is 0. + int16_t mask = ((log[a] | log[b]) >> PARAM_M) - 1; + return mask & exp[PQCLEAN_HQC128_CLEAN_gf_mod(log[a] + log[b])]; +} + + + +/** + * @brief Squares an element of GF(2^PARAM_M) + * + * @returns a^2 + * @param[in] a Element of GF(2^PARAM_M) + */ +uint16_t PQCLEAN_HQC128_CLEAN_gf_square(uint16_t a) { + int16_t mask = (log[a] >> PARAM_M) - 1; + return mask & exp[PQCLEAN_HQC128_CLEAN_gf_mod(2 * log[a])]; +} + + + +/** + * @brief Computes the inverse of an element of GF(2^PARAM_M) + * + * @returns the inverse of a + * @param[in] a Element of GF(2^PARAM_M) + */ +uint16_t PQCLEAN_HQC128_CLEAN_gf_inverse(uint16_t a) { + return exp[PARAM_GF_MUL_ORDER - log[a]]; +} + + + +/** + * @brief Returns i modulo 2^PARAM_M-1 + * + * i must be less than 2*(2^PARAM_M-1). + * Therefore, the return value is either i or i-2^PARAM_M+1. + * + * @returns i mod (2^PARAM_M-1) + * @param[in] i The integer whose modulo is taken + */ +uint16_t PQCLEAN_HQC128_CLEAN_gf_mod(uint16_t i) { + uint16_t tmp = i - PARAM_GF_MUL_ORDER; + + // mask = 0xffff if(i < PARAM_GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & PARAM_GF_MUL_ORDER); +} diff --git a/crypto_kem/hqc-128/clean/gf.h b/crypto_kem/hqc-128/clean/gf.h new file mode 100644 index 00000000..387cf927 --- /dev/null +++ b/crypto_kem/hqc-128/clean/gf.h @@ -0,0 +1,29 @@ +#ifndef GF_H +#define GF_H + + +/** + * @file gf.h + * Header file of gf.c + */ + +#include + +#include +#include + +void PQCLEAN_HQC128_CLEAN_gf_generate(uint16_t *exp, uint16_t *log, int16_t m); + + +uint16_t PQCLEAN_HQC128_CLEAN_gf_log(uint16_t elt); + +uint16_t PQCLEAN_HQC128_CLEAN_gf_mul(uint16_t a, uint16_t b); + +uint16_t PQCLEAN_HQC128_CLEAN_gf_square(uint16_t a); + +uint16_t PQCLEAN_HQC128_CLEAN_gf_inverse(uint16_t a); + +uint16_t PQCLEAN_HQC128_CLEAN_gf_mod(uint16_t i); + + +#endif diff --git a/crypto_kem/hqc-128/clean/gf2x.c b/crypto_kem/hqc-128/clean/gf2x.c new file mode 100644 index 00000000..05f01dbe --- /dev/null +++ b/crypto_kem/hqc-128/clean/gf2x.c @@ -0,0 +1,155 @@ +#include "gf2x.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include +#include +#include +/** + * \file gf2x.c + * \brief Implementation of multiplication of two polynomials + */ + + +static inline void swap(uint16_t *tab, uint16_t elt1, uint16_t elt2); +static void reduce(uint64_t *o, const uint64_t *a); +static void fast_convolution_mult(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx); + +/** + * @brief swap two elements in a table + * + * This function exchanges tab[elt1] with tab[elt2] + * + * @param[in] tab Pointer to the table + * @param[in] elt1 Index of the first element + * @param[in] elt2 Index of the second element + */ +static inline void swap(uint16_t *tab, uint16_t elt1, uint16_t elt2) { + uint16_t tmp = tab[elt1]; + + tab[elt1] = tab[elt2]; + tab[elt2] = tmp; +} + + + +/** + * @brief Compute o(x) = a(x) mod \f$ X^n - 1\f$ + * + * This function computes the modular reduction of the polynomial a(x) + * + * @param[in] a Pointer to the polynomial a(x) + * @param[out] o Pointer to the result + */ +static void reduce(uint64_t *o, const uint64_t *a) { + uint64_t r; + uint64_t carry; + + for (uint32_t i = 0 ; i < VEC_N_SIZE_64 ; i++) { + r = a[i + VEC_N_SIZE_64 - 1] >> (PARAM_N & 63); + carry = (uint64_t) (a[i + VEC_N_SIZE_64] << (64 - (PARAM_N & 63))); + o[i] = a[i] ^ r ^ carry; + } + + o[VEC_N_SIZE_64 - 1] &= RED_MASK; +} + + + +/** + * @brief computes product of the polynomial a1(x) with the sparse polynomial a2 + * + * o(x) = a1(x)a2(x) + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to the sparse polynomial a2 (list of degrees of the monomials which appear in a2) + * @param[in] a2 Pointer to the polynomial a1(x) + * @param[in] weight Hamming wifht of the sparse polynomial a2 + * @param[in] ctx Pointer to a seed expander used to randomize the multiplication process + */ +static void fast_convolution_mult(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx) { +//static uint32_t fast_convolution_mult(const uint64_t *A, const uint32_t *vB, uint64_t *C, const uint16_t w, AES_XOF_struct *ctx) + uint64_t carry; + uint32_t dec, s; + uint64_t table[16 * (VEC_N_SIZE_64 + 1)]; + uint16_t permuted_table[16]; + uint16_t permutation_table[16]; + uint16_t permuted_sparse_vect[PARAM_OMEGA_E]; + uint16_t permutation_sparse_vect[PARAM_OMEGA_E]; + uint64_t *pt; + uint16_t *res_16; + + for (uint32_t i = 0 ; i < 16; i++) { + permuted_table[i] = i; + } + + seedexpander(ctx, (uint8_t *) permutation_table, 16 * sizeof(uint16_t)); + + for (uint32_t i = 0 ; i < 15 ; i++) { + swap(permuted_table + i, 0, permutation_table[i] % (16 - i)); + } + + pt = table + (permuted_table[0] * (VEC_N_SIZE_64 + 1)); + for (int32_t j = 0 ; j < VEC_N_SIZE_64 ; j++) { + pt[j] = a2[j]; + } + pt[VEC_N_SIZE_64] = 0x0; + + for (uint32_t i = 1 ; i < 16 ; i++) { + carry = 0; + pt = table + (permuted_table[i] * (VEC_N_SIZE_64 + 1)); + for (uint32_t j = 0 ; j < VEC_N_SIZE_64 ; j++) { + pt[j] = (a2[j] << i) ^ carry; + carry = (a2[j] >> ((64 - i))); + } + pt[VEC_N_SIZE_64] = carry; + } + + for (uint32_t i = 0 ; i < weight ; i++) { + permuted_sparse_vect[i] = i; + } + + seedexpander(ctx, (uint8_t *) permutation_sparse_vect, weight * sizeof(uint16_t)); + + for (uint32_t i = 0 ; i + 1 < weight ; i++) { + swap(permuted_sparse_vect + i, 0, permutation_sparse_vect[i] % (weight - i)); + } + + for (uint32_t i = 0 ; i < weight ; i++) { + dec = a1[permuted_sparse_vect[i]] & 0xf; + s = a1[permuted_sparse_vect[i]] >> 4; + res_16 = ((uint16_t *) o) + s; + pt = table + (permuted_table[dec] * (VEC_N_SIZE_64 + 1)); + + for (uint32_t j = 0 ; j < VEC_N_SIZE_64 + 1 ; j++) { + *res_16++ ^= (uint16_t) pt[j]; + *res_16++ ^= (uint16_t) (pt[j] >> 16); + *res_16++ ^= (uint16_t) (pt[j] >> 32); + *res_16++ ^= (uint16_t) (pt[j] >> 48); + } + } +} + + + +/** + * @brief Multiply two polynomials modulo \f$ X^n - 1\f$. + * + * This functions multiplies a sparse polynomial a1 (of Hamming weight equal to weight) + * and a dense polynomial a2. The multiplication is done modulo \f$ X^n - 1\f$. + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to the sparse polynomial + * @param[in] a2 Pointer to the dense polynomial + * @param[in] weight Integer that is the weigt of the sparse polynomial + * @param[in] ctx Pointer to the randomness context + */ +void PQCLEAN_HQC128_CLEAN_vect_mul(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx) { + uint64_t tmp[2 * VEC_N_SIZE_64 + 1]; + for (uint32_t j = 0 ; j < 2 * VEC_N_SIZE_64 + 1 ; j++) { + tmp[j] = 0; + } + + fast_convolution_mult(tmp, a1, a2, weight, ctx); + reduce(o, tmp); +} diff --git a/crypto_kem/hqc-128/clean/gf2x.h b/crypto_kem/hqc-128/clean/gf2x.h new file mode 100644 index 00000000..452c0f27 --- /dev/null +++ b/crypto_kem/hqc-128/clean/gf2x.h @@ -0,0 +1,18 @@ +#ifndef GF2X_H +#define GF2X_H + + +/** + * @file gf2x.h + * @brief Header file for gf2x.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQC128_CLEAN_vect_mul(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx); + + +#endif diff --git a/crypto_kem/hqc-128/clean/hqc.c b/crypto_kem/hqc-128/clean/hqc.c new file mode 100644 index 00000000..a16d0a93 --- /dev/null +++ b/crypto_kem/hqc-128/clean/hqc.c @@ -0,0 +1,143 @@ +#include "code.h" +#include "gf2x.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +/** + * @file hqc.c + * @brief Implementation of hqc.h + */ + + + +/** + * @brief Keygen of the HQC_PKE IND_CPA scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + */ +void PQCLEAN_HQC128_CLEAN_hqc_pke_keygen(unsigned char *pk, unsigned char *sk) { + AES_XOF_struct sk_seedexpander; + AES_XOF_struct pk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + uint8_t pk_seed[SEED_BYTES] = {0}; + uint64_t x[VEC_N_SIZE_64] = {0}; + uint32_t y[PARAM_OMEGA] = {0}; + uint64_t h[VEC_N_SIZE_64] = {0}; + uint64_t s[VEC_N_SIZE_64] = {0}; + + // Create seed_expanders for public key and secret key + randombytes(sk_seed, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + randombytes(pk_seed, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute secret key + PQCLEAN_HQC128_CLEAN_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQC128_CLEAN_vect_set_random_fixed_weight_by_coordinates(&sk_seedexpander, y, PARAM_OMEGA); + + // Compute public key + PQCLEAN_HQC128_CLEAN_vect_set_random(&pk_seedexpander, h); + PQCLEAN_HQC128_CLEAN_vect_mul(s, y, h, PARAM_OMEGA, &sk_seedexpander); + PQCLEAN_HQC128_CLEAN_vect_add(s, x, s, VEC_N_SIZE_64); + + // Parse keys to string + PQCLEAN_HQC128_CLEAN_hqc_public_key_to_string(pk, pk_seed, s); + PQCLEAN_HQC128_CLEAN_hqc_secret_key_to_string(sk, sk_seed, pk); + +} + + + +/** + * @brief Encryption of the HQC_PKE IND_CPA scheme + * + * The cihertext is composed of vectors u and v. + * + * @param[out] u Vector u (first part of the ciphertext) + * @param[out] v Vector v (second part of the ciphertext) + * @param[in] m Vector representing the message to encrypt + * @param[in] theta Seed used to derive randomness required for encryption + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC128_CLEAN_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk) { + AES_XOF_struct seedexpander; + uint64_t h[VEC_N_SIZE_64] = {0}; + uint64_t s[VEC_N_SIZE_64] = {0}; + uint64_t r1[VEC_N_SIZE_64] = {0}; + uint32_t r2[PARAM_OMEGA_R] = {0}; + uint64_t e[VEC_N_SIZE_64] = {0}; + uint64_t tmp1[VEC_N_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_SIZE_64] = {0}; + + // Create seed_expander from theta + seedexpander_init(&seedexpander, theta, theta + 32, SEEDEXPANDER_MAX_LENGTH); + + // Retrieve h and s from public key + PQCLEAN_HQC128_CLEAN_hqc_public_key_from_string(h, s, pk); + + // Generate r1, r2 and e + PQCLEAN_HQC128_CLEAN_vect_set_random_fixed_weight(&seedexpander, r1, PARAM_OMEGA_R); + PQCLEAN_HQC128_CLEAN_vect_set_random_fixed_weight_by_coordinates(&seedexpander, r2, PARAM_OMEGA_R); + PQCLEAN_HQC128_CLEAN_vect_set_random_fixed_weight(&seedexpander, e, PARAM_OMEGA_E); + + // Compute u = r1 + r2.h + PQCLEAN_HQC128_CLEAN_vect_mul(u, r2, h, PARAM_OMEGA_R, &seedexpander); + PQCLEAN_HQC128_CLEAN_vect_add(u, r1, u, VEC_N_SIZE_64); + + // Compute v = m.G by encoding the message + PQCLEAN_HQC128_CLEAN_code_encode(v, m); + PQCLEAN_HQC128_CLEAN_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + + // Compute v = m.G + s.r2 + e + PQCLEAN_HQC128_CLEAN_vect_mul(tmp2, r2, s, PARAM_OMEGA_R, &seedexpander); + PQCLEAN_HQC128_CLEAN_vect_add(tmp2, e, tmp2, VEC_N_SIZE_64); + PQCLEAN_HQC128_CLEAN_vect_add(tmp2, tmp1, tmp2, VEC_N_SIZE_64); + PQCLEAN_HQC128_CLEAN_vect_resize(v, PARAM_N1N2, tmp2, PARAM_N); + +} + + + +/** + * @brief Decryption of the HQC_PKE IND_CPA scheme + * + * @param[out] m Vector representing the decrypted message + * @param[in] u Vector u (first part of the ciphertext) + * @param[in] v Vector v (second part of the ciphertext) + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQC128_CLEAN_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk) { + uint64_t x[VEC_N_SIZE_64] = {0}; + uint32_t y[PARAM_OMEGA] = {0}; + uint8_t pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t tmp1[VEC_N_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_SIZE_64] = {0}; + AES_XOF_struct perm_seedexpander; + uint8_t perm_seed[SEED_BYTES] = {0}; + + // Retrieve x, y, pk from secret key + PQCLEAN_HQC128_CLEAN_hqc_secret_key_from_string(x, y, pk, sk); + + randombytes(perm_seed, SEED_BYTES); + seedexpander_init(&perm_seedexpander, perm_seed, perm_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute v - u.y + PQCLEAN_HQC128_CLEAN_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + PQCLEAN_HQC128_CLEAN_vect_mul(tmp2, y, u, PARAM_OMEGA, &perm_seedexpander); + PQCLEAN_HQC128_CLEAN_vect_add(tmp2, tmp1, tmp2, VEC_N_SIZE_64); + + + // Compute m by decoding v - u.y + PQCLEAN_HQC128_CLEAN_code_decode(m, tmp2); +} diff --git a/crypto_kem/hqc-128/clean/hqc.h b/crypto_kem/hqc-128/clean/hqc.h new file mode 100644 index 00000000..cef71327 --- /dev/null +++ b/crypto_kem/hqc-128/clean/hqc.h @@ -0,0 +1,21 @@ +#ifndef HQC_H +#define HQC_H + + +/** + * @file hqc.h + * @brief Functions of the HQC_PKE IND_CPA scheme + */ + +#include + +#include + +void PQCLEAN_HQC128_CLEAN_hqc_pke_keygen(unsigned char *pk, unsigned char *sk); + +void PQCLEAN_HQC128_CLEAN_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk); + +void PQCLEAN_HQC128_CLEAN_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-128/clean/kem.c b/crypto_kem/hqc-128/clean/kem.c new file mode 100644 index 00000000..4708f079 --- /dev/null +++ b/crypto_kem/hqc-128/clean/kem.c @@ -0,0 +1,138 @@ +#include "api.h" +#include "fips202.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "sha2.h" +#include "vector.h" +#include +#include +/** + * @file kem.c + * @brief Implementation of api.h + */ + + + +/** + * @brief Keygen of the HQC_KEM IND_CAA2 scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + * @returns 0 if keygen is successful + */ +int PQCLEAN_HQC128_CLEAN_crypto_kem_keypair(unsigned char *pk, unsigned char *sk) { + + PQCLEAN_HQC128_CLEAN_hqc_pke_keygen(pk, sk); + return 0; +} + + + +/** + * @brief Encapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ct String containing the ciphertext + * @param[out] ss String containing the shared secret + * @param[in] pk String containing the public key + * @returns 0 if encapsulation is successful + */ +int PQCLEAN_HQC128_CLEAN_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk) { + + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint64_t u[VEC_N_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Computing m + PQCLEAN_HQC128_CLEAN_vect_set_random_from_randombytes(m); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m + PQCLEAN_HQC128_CLEAN_hqc_pke_encrypt(u, v, m, theta, pk); + + // Computing d + sha512(d, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Computing ciphertext + PQCLEAN_HQC128_CLEAN_hqc_ciphertext_to_string(ct, u, v, d); + + + return 0; +} + + + +/** + * @brief Decapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ss String containing the shared secret + * @param[in] ct String containing the cipĥertext + * @param[in] sk String containing the secret key + * @returns 0 if decapsulation is successful, -1 otherwise + */ +int PQCLEAN_HQC128_CLEAN_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk) { + + int8_t result = -1; + uint64_t u[VEC_N_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t u2[VEC_N_SIZE_64] = {0}; + uint64_t v2[VEC_N1N2_SIZE_64] = {0}; + unsigned char d2[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Retrieving u, v and d from ciphertext + PQCLEAN_HQC128_CLEAN_hqc_ciphertext_from_string(u, v, d, ct); + + // Retrieving pk from sk + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); + + // Decryting + PQCLEAN_HQC128_CLEAN_hqc_pke_decrypt(m, u, v, sk); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m' + PQCLEAN_HQC128_CLEAN_hqc_pke_encrypt(u2, v2, m, theta, pk); + + // Computing d' + sha512(d2, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Abort if c != c' or d != d' + result = (PQCLEAN_HQC128_CLEAN_vect_compare(u, u2, VEC_N_SIZE_BYTES) == 0 && PQCLEAN_HQC128_CLEAN_vect_compare(v, v2, VEC_N1N2_SIZE_BYTES) == 0 && memcmp(d, d2, SHA512_BYTES) == 0); + for (size_t i = 0 ; i < SHARED_SECRET_BYTES ; i++) { + ss[i] = result * ss[i]; + } + result--; + + + return result; +} diff --git a/crypto_kem/hqc-128/clean/parameters.h b/crypto_kem/hqc-128/clean/parameters.h new file mode 100644 index 00000000..ec26b193 --- /dev/null +++ b/crypto_kem/hqc-128/clean/parameters.h @@ -0,0 +1,123 @@ +#ifndef HQC_PARAMETERS_H +#define HQC_PARAMETERS_H +/** + * @file parameters.h + * @brief Parameters of the HQC_KEM IND-CCA2 scheme + */ + +#include "api.h" +#include "api.h" +#include "vector.h" + + +#define CEIL_DIVIDE(a, b) (((a)/(b)) + ((a) % (b) == 0 ? 0 : 1)) /*!< Divide a by b and ceil the result*/ +#define BITMASK(a, size) ((1UL << ((a) % (size))) - 1) /*!< Create a mask*/ + +/* + #define PARAM_N Define the parameter n of the scheme + #define PARAM_N1 Define the parameter n1 of the scheme (length of BCH code) + #define PARAM_N2 Define the parameter n2 of the scheme (length of the repetition code) + #define PARAM_N1N2 Define the parameter n1 * n2 of the scheme (length of the tensor code) + #define PARAM_OMEGA Define the parameter omega of the scheme + #define PARAM_OMEGA_E Define the parameter omega_e of the scheme + #define PARAM_OMEGA_R Define the parameter omega_r of the scheme + #define PARAM_SECURITY Define the security level corresponding to the chosen parameters + #define PARAM_DFR_EXP Define the decryption failure rate corresponding to the chosen parameters + + #define SECRET_KEY_BYTES Define the size of the secret key in bytes + #define PUBLIC_KEY_BYTES Define the size of the public key in bytes + #define SHARED_SECRET_BYTES Define the size of the shared secret in bytes + #define CIPHERTEXT_BYTES Define the size of the ciphertext in bytes + + #define UTILS_REJECTION_THRESHOLD Define the rejection threshold used to generate given weight vectors (see vector_set_random_fixed_weight function) + #define VEC_N_SIZE_BYTES Define the size of the array used to store a PARAM_N sized vector in bytes + #define VEC_K_SIZE_BYTES Define the size of the array used to store a PARAM_K sized vector in bytes + #define VEC_N1_SIZE_BYTES Define the size of the array used to store a PARAM_N1 sized vector in bytes + #define VEC_N1N2_SIZE_BYTES Define the size of the array used to store a PARAM_N1N2 sized vector in bytes + + #define VEC_N_SIZE_64 Define the size of the array used to store a PARAM_N sized vector in 64 bits + #define VEC_K_SIZE_64 Define the size of the array used to store a PARAM_K sized vector in 64 bits + #define VEC_N1_SIZE_64 Define the size of the array used to store a PARAM_N1 sized vector in 64 bits + #define VEC_N1N2_SIZE_64 Define the size of the array used to store a PARAM_N1N2 sized vector in 64 bits + + #define PARAM_T Define a threshold for decoding repetition code word (PARAM_T = (PARAM_N2 - 1) / 2) + + #define PARAM_DELTA Define the parameter delta of the scheme (correcting capacity of the BCH code) + #define PARAM_M Define a positive integer + #define PARAM_GF_POLY Generator polynomial of galois field GF(2^PARAM_M), represented in hexadecimial form + #define PARAM_GF_MUL_ORDER Define the size of the multiplicative group of GF(2^PARAM_M), i.e 2^PARAM_M -1 + #define PARAM_K Define the size of the information bits of the BCH code + #define PARAM_G Define the size of the generator polynomial of BCH code + #define PARAM_FFT The additive FFT takes a 2^PARAM_FFT polynomial as input + We use the FFT to compute the roots of sigma, whose degree if PARAM_DELTA=60 + The smallest power of 2 greater than 60+1 is 64=2^6 + #define PARAM_FFT_T The additive FFT transpose computes a (2^PARAM_FFT_T)-sized syndrome vector + We want to compute 2*PARAM_DELTA=120 syndromes + The smallest power of 2 greater than 120 is 2^7 + #define PARAM_BCH_POLY Generator polynomial of the BCH code + + #define RED_MASK A mask fot the higher bits of a vector + #define SHA512_BYTES Define the size of SHA512 output in bytes + #define SEED_BYTES Define the size of the seed in bytes + #define SEEDEXPANDER_MAX_LENGTH Define the seed expander max length +*/ + +#define PARAM_N 23869 +#define PARAM_N1 766 +#define PARAM_N2 31 +#define PARAM_N1N2 23746 +#define PARAM_OMEGA 67 +#define PARAM_OMEGA_E 77 +#define PARAM_OMEGA_R 77 +#define PARAM_SECURITY 128 +#define PARAM_DFR_EXP 128 + +#define SECRET_KEY_BYTES PQCLEAN_HQC128_CLEAN_CRYPTO_SECRETKEYBYTES +#define PUBLIC_KEY_BYTES PQCLEAN_HQC128_CLEAN_CRYPTO_PUBLICKEYBYTES +#define SHARED_SECRET_BYTES PQCLEAN_HQC128_CLEAN_CRYPTO_BYTES +#define CIPHERTEXT_BYTES PQCLEAN_HQC128_CLEAN_CRYPTO_CIPHERTEXTBYTES + +#define UTILS_REJECTION_THRESHOLD 16756038 +#define VEC_N_SIZE_BYTES CEIL_DIVIDE(PARAM_N, 8) +#define VEC_K_SIZE_BYTES CEIL_DIVIDE(PARAM_K, 8) +#define VEC_N1_SIZE_BYTES CEIL_DIVIDE(PARAM_N1, 8) +#define VEC_N1N2_SIZE_BYTES CEIL_DIVIDE(PARAM_N1N2, 8) + +#define VEC_N_SIZE_64 CEIL_DIVIDE(PARAM_N, 64) +#define VEC_K_SIZE_64 CEIL_DIVIDE(PARAM_K, 64) +#define VEC_N1_SIZE_64 CEIL_DIVIDE(PARAM_N1, 64) +#define VEC_N1N2_SIZE_64 CEIL_DIVIDE(PARAM_N1N2, 64) + +#define PARAM_T 15 + +#define PARAM_DELTA 57 +#define PARAM_M 10 +#define PARAM_GF_POLY 0x409 +#define PARAM_GF_MUL_ORDER 1023 +#define PARAM_K 256 +#define PARAM_G 511 +#define PARAM_FFT 6 +#define PARAM_FFT_T 7 +#define PARAM_BCH_POLY { \ + 1,1,0,0,0,0,1,0,0,1,1,0,1,1,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,0,0,1,1,0,1,1, \ + 1,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,1,0,1,1,0,1,0,1,1,1,0,1,0,1,0,0,1,0,0,0, \ + 0,1,1,1,1,0,1,1,1,1,1,0,0,0,0,1,0,0,1,0,0,1,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, \ + 1,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1,1,0,1,0,1,0,1,0,1,1,1,1,0,1,0, \ + 0,1,1,0,1,0,1,1,0,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,0,1,1,1,1,0, \ + 1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,1,0, \ + 0,1,0,0,1,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,0,0,0,1,0,1, \ + 1,1,1,1,1,0,1,0,1,0,1,1,0,0,0,1,1,0,0,1,1,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,0, \ + 1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,0,1,1,0,1,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1, \ + 1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,0,1,0,0,1,1,1,1,1,0,1,0,1, \ + 0,0,0,0,1,0,1,1,1,1,0,1,0,0,0,0,0,1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1, \ + 1,0,1,0,0,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,1, \ + 0,1,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,1,1,1,1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,0,1, \ + 1,0,1,1,1,0,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,1 \ + }; + +#define RED_MASK 0x1fffffffffffffffUL +#define SHA512_BYTES 64 +#define SEED_BYTES 40 +#define SEEDEXPANDER_MAX_LENGTH 4294967295 + +#endif diff --git a/crypto_kem/hqc-128/clean/parsing.c b/crypto_kem/hqc-128/clean/parsing.c new file mode 100644 index 00000000..75b74bb5 --- /dev/null +++ b/crypto_kem/hqc-128/clean/parsing.c @@ -0,0 +1,121 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file parsing.c + * @brief Functions to parse secret key, public key and ciphertext of the HQC scheme + */ + + + +/** + * @brief Parse a secret key into a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] sk String containing the secret key + * @param[in] sk_seed Seed used to generate the secret key + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC128_CLEAN_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk) { + memcpy(sk, sk_seed, SEED_BYTES); + memcpy(sk + SEED_BYTES, pk, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a secret key from a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] x uint64_t representation of vector x + * @param[out] y uint32_t representation of vector y + * @param[out] pk String containing the public key + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQC128_CLEAN_hqc_secret_key_from_string(uint64_t *x, uint32_t *y, uint8_t *pk, const uint8_t *sk) { + AES_XOF_struct sk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + + memcpy(sk_seed, sk, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + PQCLEAN_HQC128_CLEAN_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQC128_CLEAN_vect_set_random_fixed_weight_by_coordinates(&sk_seedexpander, y, PARAM_OMEGA); + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a public key into a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] pk String containing the public key + * @param[in] pk_seed Seed used to generate the public key + * @param[in] s uint8_t representation of vector s + */ +void PQCLEAN_HQC128_CLEAN_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s) { + memcpy(pk, pk_seed, SEED_BYTES); + memcpy(pk + SEED_BYTES, s, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Parse a public key from a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] h uint8_t representation of vector h + * @param[out] s uint8_t representation of vector s + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC128_CLEAN_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk) { + AES_XOF_struct pk_seedexpander; + uint8_t pk_seed[SEED_BYTES] = {0}; + + memcpy(pk_seed, pk, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + PQCLEAN_HQC128_CLEAN_vect_set_random(&pk_seedexpander, h); + + memcpy(s, pk + SEED_BYTES, VEC_N_SIZE_BYTES); +} + + +/** + * @brief Parse a ciphertext into a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] ct String containing the ciphertext + * @param[in] u uint8_t representation of vector u + * @param[in] v uint8_t representation of vector v + * @param[in] d String containing the hash d + */ +void PQCLEAN_HQC128_CLEAN_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d) { + memcpy(ct, u, VEC_N_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, d, SHA512_BYTES); +} + + +/** + * @brief Parse a ciphertext from a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] u uint8_t representation of vector u + * @param[out] v uint8_t representation of vector v + * @param[out] d String containing the hash d + * @param[in] ct String containing the ciphertext + */ +void PQCLEAN_HQC128_CLEAN_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct) { + memcpy(u, ct, VEC_N_SIZE_BYTES); + memcpy(v, ct + VEC_N_SIZE_BYTES, VEC_N1N2_SIZE_BYTES); + memcpy(d, ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, SHA512_BYTES); +} diff --git a/crypto_kem/hqc-128/clean/parsing.h b/crypto_kem/hqc-128/clean/parsing.h new file mode 100644 index 00000000..e11cfaf8 --- /dev/null +++ b/crypto_kem/hqc-128/clean/parsing.h @@ -0,0 +1,29 @@ +#ifndef PARSING_H +#define PARSING_H + + +/** + * @file parsing.h + * @brief Header file for parsing.c + */ + +#include + +#include + +void PQCLEAN_HQC128_CLEAN_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk); + +void PQCLEAN_HQC128_CLEAN_hqc_secret_key_from_string(uint64_t *x, uint32_t *y, uint8_t *pk, const uint8_t *sk); + + +void PQCLEAN_HQC128_CLEAN_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s); + +void PQCLEAN_HQC128_CLEAN_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk); + + +void PQCLEAN_HQC128_CLEAN_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d); + +void PQCLEAN_HQC128_CLEAN_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct); + + +#endif diff --git a/crypto_kem/hqc-128/clean/repetition.c b/crypto_kem/hqc-128/clean/repetition.c new file mode 100644 index 00000000..654e34a1 --- /dev/null +++ b/crypto_kem/hqc-128/clean/repetition.c @@ -0,0 +1,92 @@ +#include "parameters.h" +#include "repetition.h" +#include +#include +#include +/** + * @file repetition.c + * @brief Implementation of repetition codes + */ + +#define MASK_N2 ((1UL << PARAM_N2) - 1) + +static inline int32_t popcount(uint64_t n); + +/** + * @brief Encoding each bit in the message m using the repetition code + * + * + * @param[out] em Pointer to an array that is the code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQC128_CLEAN_repetition_code_encode(uint64_t *em, const uint64_t *m) { + static const uint64_t mask[2][2] = {{0x0UL, 0x0UL}, {0x7FFFFFFFUL, 0x3FFFFFFFUL}}; + for (size_t i = 0 ; i < VEC_N1_SIZE_64 - 1 ; i++) { + for (size_t j = 0 ; j < 64 ; j++) { + uint8_t bit = (m[i] >> j) & 0x1; + uint32_t pos_r = PARAM_N2 * ((i << 6) + j); + uint16_t idx_r = (pos_r & 0x3f); + uint64_t *p64 = em; + p64 += pos_r >> 6; + *p64 ^= mask[bit][0] << idx_r; + *(p64 + 1) ^= mask[bit][1] >> ((63 - idx_r)); + } + } + + for (size_t j = 0 ; j < (PARAM_N1 & 0x3f) ; j++) { + uint8_t bit = (m[VEC_N1_SIZE_64 - 1] >> j) & 0x1; + uint32_t pos_r = PARAM_N2 * (((VEC_N1_SIZE_64 - 1) << 6) + j); + uint16_t idx_r = (pos_r & 0x3f); + uint64_t *p64 = em; + p64 += pos_r >> 6; + *p64 ^= mask[bit][0] << idx_r; + *(p64 + 1) ^= mask[bit][1] >> ((63 - idx_r)); + } +} + + + +/** + * @brief Compute the Hamming weight of the 64-bit integer n + * + * The Hamming weight is computed using a trick described in + * Henry S. Warren : "Hacker's Delight", chap 5., p. 66 + * @param[out] the Hamming weight of n + * @param[in] a 64-bit integer n + */ +static inline int32_t popcount(uint64_t n) { + n -= (n >> 1) & 0x5555555555555555UL; + n = (n & 0x3333333333333333UL) + ((n >> 2) & 0x3333333333333333UL); + n = (n + (n >> 4)) & 0x0f0f0f0f0f0f0f0fUL; + return (n * 0x0101010101010101UL) >> 56; +} + + + +/** + * @brief Decoding the code words to a message using the repetition code + * + * We use a majority decoding. In fact we have that PARAM_N2 = 2 * PARAM_T + 1, thus, + * if the Hamming weight of the vector is greater than PARAM_T, the code word is decoded + * to 1 and 0 otherwise. + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQC128_CLEAN_repetition_code_decode(uint64_t *m, const uint64_t *em) { + size_t t = 0, b, bn, bi, c, cn, ci; + uint64_t cx, ones; + + for (b = 0 ; b < PARAM_N1N2 - PARAM_N2 + 1 ; b += PARAM_N2) { + bn = b >> 6; + bi = b & 63; + c = b + PARAM_N2 - 1; + cn = c >> 6; + ci = c & 63; + cx = em[cn] << (63 - ci); + int64_t verif = (cn == (bn + 1)); + ones = popcount(((em[bn] >> bi) & MASK_N2) | (cx * verif)); + m[t >> 6] |= ((uint64_t) (ones > PARAM_T)) << (t & 63); + t++; + } +} diff --git a/crypto_kem/hqc-128/clean/repetition.h b/crypto_kem/hqc-128/clean/repetition.h new file mode 100644 index 00000000..f452057e --- /dev/null +++ b/crypto_kem/hqc-128/clean/repetition.h @@ -0,0 +1,19 @@ +#ifndef REPETITION_H +#define REPETITION_H + + +/** + * @file repetition.h + * @brief Header file for repetition.c + */ + +#include + +#include + +void PQCLEAN_HQC128_CLEAN_repetition_code_encode(uint64_t *em, const uint64_t *m); + +void PQCLEAN_HQC128_CLEAN_repetition_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-128/clean/vector.c b/crypto_kem/hqc-128/clean/vector.c new file mode 100644 index 00000000..4984f8b5 --- /dev/null +++ b/crypto_kem/hqc-128/clean/vector.c @@ -0,0 +1,226 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file vector.c + * @brief Implementation of vectors sampling and some utilities for the HQC scheme + */ + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. The vector + * is stored by position. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC128_CLEAN_vect_set_random_fixed_weight_by_coordinates(AES_XOF_struct *ctx, uint32_t *v, uint16_t weight) { + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; // weight is expected to be <= PARAM_OMEGA_R + uint32_t random_data = 0; + uint8_t exist = 0; + size_t j = 0; + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (v[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + v[i] = random_data; + } + } +} + + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC128_CLEAN_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight) { + + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; // weight is expected to be <= PARAM_OMEGA_R + uint32_t random_data = 0; + uint32_t tmp[PARAM_OMEGA_R] = {0}; + uint8_t exist = 0; + size_t j = 0; + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (tmp[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + tmp[i] = random_data; + } + } + + for (uint16_t i = 0 ; i < weight ; ++i) { + int32_t index = tmp[i] / 64; + int32_t pos = tmp[i] % 64; + v[index] |= ((uint64_t) 1) << pos; + } +} + + + +/** + * @brief Generates a random vector of dimension PARAM_N + * + * This function generates a random binary vector of dimension PARAM_N. It generates a random + * array of bytes using the seedexpander function, and drop the extra bits using a mask. + * + * @param[in] v Pointer to an array + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC128_CLEAN_vect_set_random(AES_XOF_struct *ctx, uint64_t *v) { + uint8_t rand_bytes[VEC_N_SIZE_BYTES] = {0}; + + seedexpander(ctx, rand_bytes, VEC_N_SIZE_BYTES); + + memcpy(v, rand_bytes, VEC_N_SIZE_BYTES); + v[VEC_N_SIZE_64 - 1] &= BITMASK(PARAM_N, 64); +} + + + +/** + * @brief Generates a random vector + * + * This function generates a random binary vector. It uses the the randombytes function. + * + * @param[in] v Pointer to an array + */ +void PQCLEAN_HQC128_CLEAN_vect_set_random_from_randombytes(uint64_t *v) { + uint8_t rand_bytes [VEC_K_SIZE_BYTES] = {0}; + + randombytes(rand_bytes, VEC_K_SIZE_BYTES); + memcpy(v, rand_bytes, VEC_K_SIZE_BYTES); +} + + + +/** + * @brief Adds two vectors + * + * @param[out] o Pointer to an array that is the result + * @param[in] v1 Pointer to an array that is the first vector + * @param[in] v2 Pointer to an array that is the second vector + * @param[in] size Integer that is the size of the vectors + */ +void PQCLEAN_HQC128_CLEAN_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size) { + for (uint32_t i = 0 ; i < size ; ++i) { + o[i] = v1[i] ^ v2[i]; + } +} + + +/** + * @brief Compares two vectors + * + * @param[in] v1 Pointer to an array that is first vector + * @param[in] v2 Pointer to an array that is second vector + * @param[in] size Integer that is the size of the vectors + * @returns 0 if the vectors are equals and a negative/psotive value otherwise + */ +int PQCLEAN_HQC128_CLEAN_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size) { + return memcmp(v1, v2, size); +} + + + +/** + * @brief Resize a vector so that it contains size_o bits + * + * @param[out] o Pointer to the output vector + * @param[in] size_o Integer that is the size of the output vector in bits + * @param[in] v Pointer to the input vector + * @param[in] size_v Integer that is the size of the input vector in bits + */ +void PQCLEAN_HQC128_CLEAN_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v) { + if (size_o < size_v) { + uint64_t mask = 0x7FFFFFFFFFFFFFFF; + int8_t val = 0; + + if (size_o % 64) { + val = 64 - (size_o % 64); + } + + memcpy(o, v, VEC_N1N2_SIZE_BYTES); + + for (int8_t i = 0 ; i < val ; ++i) { + o[VEC_N1N2_SIZE_64 - 1] &= (mask >> i); + } + } else { + memcpy(o, v, CEIL_DIVIDE(size_v, 8)); + } +} diff --git a/crypto_kem/hqc-128/clean/vector.h b/crypto_kem/hqc-128/clean/vector.h new file mode 100644 index 00000000..a336e8fa --- /dev/null +++ b/crypto_kem/hqc-128/clean/vector.h @@ -0,0 +1,31 @@ +#ifndef VECTOR_H +#define VECTOR_H + + +/** + * @file vector.h + * @brief Header file for vector.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQC128_CLEAN_vect_set_random_fixed_weight_by_coordinates(AES_XOF_struct *ctx, uint32_t *v, uint16_t weight); + +void PQCLEAN_HQC128_CLEAN_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight); + +void PQCLEAN_HQC128_CLEAN_vect_set_random(AES_XOF_struct *ctx, uint64_t *v); + +void PQCLEAN_HQC128_CLEAN_vect_set_random_from_randombytes(uint64_t *v); + + +void PQCLEAN_HQC128_CLEAN_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size); + +int PQCLEAN_HQC128_CLEAN_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size); + +void PQCLEAN_HQC128_CLEAN_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v); + + +#endif diff --git a/crypto_kem/hqc-192/META.yml b/crypto_kem/hqc-192/META.yml new file mode 100644 index 00000000..ca521a76 --- /dev/null +++ b/crypto_kem/hqc-192/META.yml @@ -0,0 +1,34 @@ +name: HQC-192 +type: kem +claimed-nist-level: 3 +claimed-security: IND-CCA2 +length-ciphertext: 11364 +length-public-key: 5690 +length-secret-key: 5730 +length-shared-secret: 64 +nistkat-sha256: b49351ae5bdab016521254af85a0df2072b81841722c0c422bb44af22cec4418 +principal-submitters: + - Carlos Aguilar Melchor + - Nicolas Aragon + - Slim Bettaieb + - Olivier Blazy + - Jurjen Bos + - Jean-Christophe Deneuville + - Philippe Gaborit + - Edoardo Persichetti + - Jean-Marc Robert + - Pascal Véron + - Gilles Zémor + - Loïc Bidoux +implementations: + - name: clean + version: 2020-05-29 + - name: avx2 + version: 2020-05-29 + supported_platforms: + - architecture: x86_64 + operating_systems: + - Linux + - Darwin + required_flags: + - avx2 diff --git a/crypto_kem/hqc-192/avx2/LICENSE b/crypto_kem/hqc-192/avx2/LICENSE new file mode 100644 index 00000000..d5d21fff --- /dev/null +++ b/crypto_kem/hqc-192/avx2/LICENSE @@ -0,0 +1 @@ +Public Domain diff --git a/crypto_kem/hqc-192/avx2/Makefile b/crypto_kem/hqc-192/avx2/Makefile new file mode 100644 index 00000000..8e0120ce --- /dev/null +++ b/crypto_kem/hqc-192/avx2/Makefile @@ -0,0 +1,22 @@ +# This Makefile can be used with GNU Make or BSD Make + +LIB=libhqc-192_avx2.a +HEADERS=alpha_table.h api.h bch.h code.h fft.h gen_matrix.h gf2x.h gf.h hqc.h parameters.h parsing.h repetition.h vector.h +OBJECTS=bch.o code.o fft.o gf2x.o gf.o hqc.o kem.o parsing.o repetition.o vector.o + +CFLAGS=-O3 -mavx2 -mbmi -mpclmul -Wall -Wextra -Wpedantic -Wvla -Werror -Wredundant-decls -Wmissing-prototypes -std=c99 -I../../../common $(EXTRAFLAGS) + +all: $(LIB) + +%.o: %.s $(HEADERS) + $(AS) -o $@ $< + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +$(LIB): $(OBJECTS) + $(AR) -r $@ $(OBJECTS) + +clean: + $(RM) $(OBJECTS) + $(RM) $(LIB) diff --git a/crypto_kem/hqc-192/avx2/alpha_table.h b/crypto_kem/hqc-192/avx2/alpha_table.h new file mode 100644 index 00000000..9b92134d --- /dev/null +++ b/crypto_kem/hqc-192/avx2/alpha_table.h @@ -0,0 +1,18 @@ +#ifndef ALPHA_TABLE_H +#define ALPHA_TABLE_H + + +/** + * @file alpha_table.h + * Header file that contain precomputed power of alpha the root of the generator poly og GF(2^PARAM_M) + */ + +#include "parameters.h" +#include "parameters.h" + + +#define SYND_SIZE_256 CEIL_DIVIDE(PARAM_DELTA, 8) + +static int16_t table_alpha_ij[PARAM_N1 * (SYND_SIZE_256 << 4)] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x9, 0x12, 0x24, 0x48, 0x90, 0x120, 0x240, 0x89, 0x112, 0x224, 0x41, 0x82, 0x104, 0x208, 0x19, 0x32, 0x64, 0xc8, 0x190, 0x320, 0x249, 0x9b, 0x136, 0x26c, 0xd1, 0x1a2, 0x344, 0x281, 0x10b, 0x216, 0x25, 0x4a, 0x94, 0x128, 0x250, 0xa9, 0x152, 0x2a4, 0x141, 0x282, 0x10d, 0x21a, 0x3d, 0x7a, 0xf4, 0x1e8, 0x3d0, 0x3a9, 0x35b, 0x2bf, 0x177, 0x2ee, 0x1d5, 0x3aa, 0x35d, 0x2b3, 0x16f, 0x2de, 0x1b5, 0x36a, 0x2dd, 0x1b3, 0x366, 0x2c5, 0x183, 0x306, 0x205, 0x3, 0x6, 0xc, 0x18, 0x30, 0x60, 0xc0, 0x180, 0x300, 0x209, 0x1b, 0x36, 0x6c, 0xd8, 0x1b0, 0x360, 0x2c9, 0x19b, 0x336, 0x265, 0xc3, 0x186, 0x30c, 0x211, 0x2b, 0x56, 0xac, 0x158, 0x2b0, 0x169, 0x2d2, 0x1ad, 0x35a, 0x2bd, 0x173, 0x2e6, 0x1c5, 0x38a, 0x4, 0x10, 0x40, 0x100, 0x9, 0x24, 0x90, 0x240, 0x112, 0x41, 0x104, 0x19, 0x64, 0x190, 0x249, 0x136, 0xd1, 0x344, 0x10b, 0x25, 0x94, 0x250, 0x152, 0x141, 0x10d, 0x3d, 0xf4, 0x3d0, 0x35b, 0x177, 0x1d5, 0x35d, 0x16f, 0x1b5, 0x2dd, 0x366, 0x183, 0x205, 0x6, 0x18, 0x60, 0x180, 0x209, 0x36, 0xd8, 0x360, 0x19b, 0x265, 0x186, 0x211, 0x56, 0x158, 0x169, 0x1ad, 0x2bd, 0x2e6, 0x38a, 0x233, 0xde, 0x378, 0x1fb, 0x3e5, 0x38f, 0x227, 0x8e, 0x238, 0xf2, 0x3c8, 0x33b, 0xf7, 0x3dc, 0x36b, 0x1b7, 0x2d5, 0x346, 0x103, 0x5, 0x14, 0x50, 0x140, 0x109, 0x2d, 0xb4, 0x2d0, 0x352, 0x153, 0x145, 0x11d, 0x7d, 0x1f4, 0x3d9, 0x37f, 0x1e7, 0x395, 0x24f, 0x12e, 0xb1, 0x2c4, 0x302, 0x13, 0x4c, 0x130, 0xc9, 0x324, 0x8b, 0x22c, 0xa2, 0x288, 0x232, 0xda, 0x368, 0x1bb, 0x2e5, 0x386, 0x8, 0x40, 0x200, 0x24, 0x120, 0x112, 0x82, 0x19, 0xc8, 0x249, 0x26c, 0x344, 0x216, 0x94, 0xa9, 0x141, 0x21a, 0xf4, 0x3a9, 0x177, 0x3aa, 0x16f, 0x36a, 0x366, 0x306, 0x6, 0x30, 0x180, 0x1b, 0xd8, 0x2c9, 0x265, 0x30c, 0x56, 0x2b0, 0x1ad, 0x173, 0x38a, 0x6f, 0x378, 0x3f6, 0x38f, 0x47, 0x238, 0x1e4, 0x33b, 0x1ee, 0x36b, 0x36e, 0x346, 0x206, 0x14, 0xa0, 0x109, 0x5a, 0x2d0, 0x2ad, 0x145, 0x23a, 0x1f4, 0x3bb, 0x1e7, 0x323, 0x12e, 0x162, 0x302, 0x26, 0x130, 0x192, 0x8b, 0x51, 0x288, 0x6d, 0x368, 0x376, 0x386, 0xf, 0x78, 0x3c0, 0x23f, 0x1dc, 0x2fb, 0x3f5, 0x397, 0x87, 0x31, 0x188, 0x5b, 0x2d8, 0x2ed, 0x345, 0x21e, 0xd4, 0x2a9, 0x165, 0x33a, 0x1e6, 0x32b, 0x16e, 0x362, 0x326, 0x106, 0x22, 0x110, 0x92, 0x99, 0xc1, 0x201, 0x2c, 0x160, 0x312, 0xa6, 0x139, 0x1da, 0x10, 0x100, 0x24, 0x240, 0x41, 0x19, 0x190, 0x136, 0x344, 0x25, 0x250, 0x141, 0x3d, 0x3d0, 0x177, 0x35d, 0x1b5, 0x366, 0x205, 0x18, 0x180, 0x36, 0x360, 0x265, 0x211, 0x158, 0x1ad, 0x2e6, 0x233, 0x378, 0x3e5, 0x227, 0x238, 0x3c8, 0xf7, 0x36b, 0x2d5, 0x103, 0x14, 0x140, 0x2d, 0x2d0, 0x153, 0x11d, 0x1f4, 0x37f, 0x395, 0x12e, 0x2c4, 0x13, 0x130, 0x324, 0x22c, 0x288, 0xda, 0x1bb, 0x386, 0x1e, 0x1e0, 0x23f, 0x3b8, 0x3fe, 0x397, 0x10e, 0xc4, 0x5b, 0x1b9, 0x3a6, 0x21e, 0x1a8, 0x2b6, 0x33a, 0x3cc, 0xb7, 0x362, 0x245, 0x11, 0x110, 0x124, 0x264, 0x201, 0x58, 0x189, 0xa6, 0x272, 0x361, 0x275, 0x311, 0x17c, 0x3ed, 0x2a7, 0x22a, 0x2e8, 0x2d3, 0x163, 0x21d, 0x198, 0x1b6, 0x356, 0x105, 0x74, 0x349, 0xf5, 0x34b, 0xd5, 0x14b, 0x9d, 0x1c2, 0x1f, 0x1f0, 0x33f, 0x39c, 0x1be, 0x3d6, 0x20, 0x9, 0x120, 0x41, 0x32, 0x249, 0x1a2, 0x25, 0xa9, 0x10d, 0x1e8, 0x177, 0x2b3, 0x2dd, 0x306, 0x18, 0x300, 0xd8, 0x336, 0x211, 0x2b0, 0x2bd, 0x31d, 0x378, 0x3c3, 0x8e, 0x1e4, 0xf7, 0x2df, 0x346, 0xa, 0x140, 0x5a, 0x352, 0x28a, 0x1f4, 0x2f7, 0x24f, 0x162, 0x13, 0x260, 0x8b, 0x144, 0xda, 0x376, 0x203, 0xf0, 0x23f, 0x379, 0x3e3, 0x87, 0xc4, 0xb6, 0x2ed, 0x10f, 0x1a8, 0x165, 0xf3, 0x25f, 0x362, 0x83, 0x44, 0x92, 0x264, 0xb, 0x160, 0x53, 0x272, 0x2cb, 0x1c6, 0xbe, 0x3ed, 0x147, 0xba, 0x36d, 0x163, 0x33, 0x269, 0x1ab, 0x105, 0xe8, 0x13f, 0x3a1, 0xd5, 0x296, 0x274, 0x20b, 0x1f0, 0x277, 0x26b, 0x1eb, 0x117, 0x2a8, 0x1bd, 0x3c5, 0x4e, 0x1d2, 0x23e, 0x359, 0x3ea, 0x1a7, 0x85, 0x84, 0xa4, 0xad, 0x18d, 0x1cc, 0x1fe, 0x3b7, 0x215, 0x230, 0x299, 0x394, 0x27c, 0x40, 0x24, 0x112, 0x19, 0x249, 0x344, 0x94, 0x141, 0xf4, 0x177, 0x16f, 0x366, 0x6, 0x180, 0xd8, 0x265, 0x56, 0x1ad, 0x38a, 0x378, 0x38f, 0x238, 0x33b, 0x36b, 0x346, 0x14, 0x109, 0x2d0, 0x145, 0x1f4, 0x1e7, 0x12e, 0x302, 0x130, 0x8b, 0x288, 0x368, 0x386, 0x78, 0x23f, 0x2fb, 0x397, 0x31, 0x5b, 0x2ed, 0x21e, 0x2a9, 0x33a, 0x32b, 0x362, 0x106, 0x110, 0x99, 0x201, 0x160, 0xa6, 0x1da, 0x275, 0x5f, 0x3ed, 0x28e, 0x2e8, 0x35e, 0x21d, 0x269, 0x356, 0x1d, 0x349, 0x3d4, 0xd5, 0x125, 0x1c2, 0x7c, 0x33f, 0x26b, 0x3d6, 0x55, 0x16d, 0x3e6, 0x4e, 0x3a4, 0xea, 0x2fe, 0x2d7, 0x85, 0x108, 0x290, 0x161, 0xe6, 0x1fe, 0x367, 0x46, 0x1a4, 0x1ca, 0x27c, 0x21f, 0x2e9, 0x31e, 0x239, 0x37b, 0x34f, 0x254, 0xd, 0x340, 0x194, 0x1d1, 0xb5, 0x113, 0x59, 0x26d, 0x256, 0x8d, 0x308, 0x3b0, 0x80, 0x90, 0x82, 0x190, 0x1a2, 0x94, 0x282, 0x3d0, 0x3aa, 0x2dd, 0x3, 0x180, 0x1b0, 0x186, 0x2b0, 0x2e6, 0x1bc, 0x38f, 0x79, 0xf7, 0x36e, 0x5, 0x280, 0x2d0, 0x28a, 0x3d9, 0x323, 0x2c4, 0x98, 0x8b, 0x119, 0x1bb, 0xf, 0x389, 0x379, 0x397, 0x62, 0x16c, 0x345, 0x1a8, 0x19d, 0x32b, 0x2cd, 0x11, 0x92, 0x182, 0xb0, 0xa6, 0x3b4, 0x1c6, 0x2f8, 0x2a7, 0x174, 0x35e, 0x33, 0x1b6, 0x286, 0x1d0, 0x1ea, 0xd5, 0x24a, 0x301, 0x3e0, 0x39c, 0x1eb, 0x55, 0x2da, 0x383, 0x270, 0x23e, 0x17f, 0x2d7, 0x10a, 0x29, 0xad, 0x23d, 0xff, 0x367, 0x8c, 0x299, 0x24b, 0x381, 0x370, 0x31e, 0x7b, 0x1f7, 0x24e, 0x101, 0x1a0, 0x194, 0x3a2, 0x2d4, 0x8a, 0x199, 0x12b, 0x8d, 0x219, 0x2db, 0x303, 0x2e0, 0x2bc, 0xef, 0x375, 0x19e, 0x2ab, 0x37d, 0x197, 0x222, 0x364, 0x10c, 0x329, 0x3cd, 0x131, 0x196, 0x100, 0x240, 0x19, 0x136, 0x25, 0x141, 0x3d0, 0x35d, 0x366, 0x18, 0x36, 0x265, 0x158, 0x2e6, 0x378, 0x227, 0x3c8, 0x36b, 0x103, 0x140, 0x2d0, 0x11d, 0x37f, 0x12e, 0x13, 0x324, 0x288, 0x1bb, 0x1e, 0x23f, 0x3fe, 0x10e, 0x5b, 0x3a6, 0x1a8, 0x33a, 0xb7, 0x245, 0x110, 0x264, 0x58, 0xa6, 0x361, 0x311, 0x3ed, 0x22a, 0x2d3, 0x21d, 0x1b6, 0x105, 0x349, 0x34b, 0x14b, 0x1c2, 0x1f0, 0x39c, 0x3d6, 0x154, 0x2fd, 0x4e, 0x28b, 0x2bb, 0x2d7, 0x214, 0xa4, 0x161, 0x398, 0x3df, 0x46, 0x299, 0x9f, 0x21f, 0x3b6, 0x18c, 0x37b, 0x127, 0x101, 0x340, 0x259, 0x12f, 0x113, 0x164, 0x291, 0x8d, 0x3b, 0x37e, 0x2e, 0x253, 0x33d, 0x3be, 0x19e, 0x15f, 0x1ef, 0xa3, 0x268, 0x43, 0x390, 0x3cd, 0x262, 0x251, 0x13d, 0x337, 0x1ac, 0x333, 0x1a5, 0x221, 0x1c1, 0x2f0, 0x155, 0x3fd, 0x20e, 0x292, 0x38d, 0x2f2, 0x200, 0x112, 0xc8, 0x344, 0xa9, 0xf4, 0x3aa, 0x366, 0x30, 0xd8, 0x30c, 0x1ad, 0x6f, 0x38f, 0x1e4, 0x36b, 0x206, 0x109, 0x2ad, 0x1f4, 0x323, 0x302, 0x192, 0x288, 0x376, 0x78, 0x1dc, 0x397, 0x188, 0x2ed, 0xd4, 0x33a, 0x16e, 0x106, 0x92, 0x201, 0x312, 0x1da, 0x38c, 0x3ed, 0x5d, 0x35e, 0xcc, 0x356, 0xe8, 0x3d4, 0x2a1, 0x1c2, 0x3e0, 0x26b, 0x28f, 0x16d, 0x30f, 0x3a4, 0x359, 0x2d7, 0x21, 0x290, 0x31a, 0x1fe, 0x30e, 0x1a4, 0x24b, 0x21f, 0x365, 0x239, 0x3ee, 0x254, 0x68, 0x194, 0x293, 0x113, 0x2c8, 0x256, 0x61, 0x3b0, 0x303, 0x392, 0x39a, 0x3be, 0x33c, 0x175, 0x363, 0x222, 0x18b, 0xe4, 0x3e2, 0x262, 0xab, 0xfd, 0x18e, 0x2f6, 0x2b1, 0x18a, 0x2e4, 0x2f0, 0x2aa, 0x3ef, 0x54, 0x17a, 0x15c, 0x1d7, 0x1ba, 0x23c, 0x1fc, 0x307, 0x380, 0x3db, 0x9e, 0x237, 0x3d1, 0xb3, 0x91, 0x8, 0x9, 0x41, 0x249, 0x25, 0x10d, 0x177, 0x2dd, 0x18, 0xd8, 0x211, 0x2bd, 0x378, 0x8e, 0xf7, 0x346, 0x140, 0x352, 0x1f4, 0x24f, 0x13, 0x8b, 0xda, 0x203, 0x23f, 0x3e3, 0xc4, 0x2ed, 0x1a8, 0xf3, 0x362, 0x44, 0x264, 0x160, 0x272, 0x1c6, 0x3ed, 0xba, 0x163, 0x269, 0x105, 0x13f, 0xd5, 0x274, 0x1f0, 0x26b, 0x117, 0x1bd, 0x4e, 0x23e, 0x3ea, 0x85, 0xa4, 0x18d, 0x1fe, 0x215, 0x299, 0x27c, 0x1b8, 0x63, 0x37b, 0x95, 0x34, 0x194, 0x12f, 0x45, 0x26d, 0x121, 0x3b, 0x1e3, 0x2e0, 0x1cd, 0x3be, 0x271, 0x1dd, 0x32e, 0x268, 0x10c, 0x17e, 0x29c, 0x251, 0xfd, 0x31c, 0x3ca, 0x1a5, 0x96, 0x2f, 0x157, 0x3fd, 0x2a, 0x17a, 0x2b8, 0x355, 0x1cb, 0x388, 0x3f7, 0x70, 0x3f0, 0x4f, 0x237, 0x3ab, 0x2cc, 0x81, 0x80, 0x89, 0xc8, 0x281, 0x2a4, 0x3a9, 0x2de, 0x3, 0x1b, 0xc3, 0x2d2, 0x6f, 0x12, 0x104, 0x26c, 0x250, 0x1e8, 0x16f, 0x3, 0x36, 0x30c, 0x2bd, 0x2f9, 0x238, 0x3b1, 0x5, 0x5a, 0x11d, 0x3ce, 0x302, 0x241, 0xda, 0xf, 0xee, 0x327, 0x5b, 0x10f, 0x2ca, 0x16e, 0x11, 0x132, 0x160, 0xed, 0x311, 0x357, 0x3b2, 0x33, 0x356, 0x3a0, 0x137, 0x13a, 0x1f0, 0xdf, 0x55, 0x1f3, 0xe9, 0x359, 0x34e, 0x210, 0x161, 0xff, 0x215, 0x13b, 0x1e2, 0x1db, 0x239, 0x3a3, 0x101, 0x236, 0x34d, 0x226, 0x26d, 0x242, 0xec, 0x303, 0x253, 0x1de, 0x263, 0x2be, 0x2cf, 0x134, 0x10c, 0x2fc, 0x262, 0x2ac, 0x3cb, 0x358, 0x35c, 0x314, 0x30d, 0x2af, 0x3fd, 0x54, 0x1e1, 0x1ed, 0x135, 0x11e, 0x3f8, 0xe, 0xfc, 0x223, 0x237, 0x35f, 0x322, 0x1, 0x12, 0x104, 0x26c, 0x250, 0x1e8, 0x16f, 0x3, 0x36, 0x30c, 0x2bd, 0x2f9, 0x238, 0x3b1, 0x5, 0x5a, 0x11d, 0x3ce, 0x302, 0x241, 0xda, 0xf, 0x24, 0x19, 0x344, 0x141, 0x177, 0x366, 0x180, 0x265, 0x1ad, 0x378, 0x238, 0x36b, 0x14, 0x2d0, 0x1f4, 0x12e, 0x130, 0x288, 0x386, 0x23f, 0x397, 0x5b, 0x21e, 0x33a, 0x362, 0x110, 0x201, 0xa6, 0x275, 0x3ed, 0x2e8, 0x21d, 0x356, 0x349, 0xd5, 0x1c2, 0x33f, 0x3d6, 0x16d, 0x4e, 0xea, 0x2d7, 0x108, 0x161, 0x1fe, 0x46, 0x1ca, 0x21f, 0x31e, 0x37b, 0x254, 0x340, 0x1d1, 0x113, 0x26d, 0x8d, 0x3b0, 0x2e, 0x171, 0x3be, 0x1d6, 0x1ef, 0x222, 0x43, 0x17e, 0x262, 0x151, 0x337, 0x2f6, 0x1a5, 0x258, 0x2f0, 0x17d, 0x20e, 0x17a, 0x2f2, 0x135, 0x23c, 0x3fb, 0x70, 0x3db, 0xf9, 0xfb, 0xb3, 0x81, 0x200, 0x82, 0x26c, 0xa9, 0x3a9, 0x36a, 0x30, 0x2c9, 0x2b0, 0x6f, 0x47, 0x1ee, 0x206, 0x5a, 0x23a, 0x323, 0x26, 0x51, 0x376, 0x3c0, 0x3f5, 0x188, 0x345, 0x165, 0x16e, 0x22, 0xc1, 0x312, 0x2cb, 0x48, 0x64, 0x216, 0x3d, 0x2b3, 0x6, 0x1b0, 0x158, 0x6f, 0x8e, 0x3b1, 0x14, 0x1a9, 0x3d9, 0x162, 0x324, 0x1b4, 0x78, 0x1ff, 0xc4, 0x345, 0x2ca, 0x1b1, 0x110, 0xb, 0x298, 0x38c, 0x2a7, 0x1af, 0x269, 0x3a, 0x34b, 0x13a, 0x3c9, 0x1eb, 0x16d, 0x9c, 0x3a8, 0x295, 0xa4, 0x73, 0x367, 0x348, 0x1e2, 0x365, 0x3d8, 0x12a, 0x340, 0x3a2, 0x45, 0x34c, 0xc2, 0x2f5, 0x392, 0x1de, 0x19e, 0x3ba, 0x28c, 0x225, 0x17e, 0xcd, 0x14d, 0x18e, 0x333, 0xc5, 0x30d, 0x2ae, 0x3a7, 0x12d, 0x2b8, 0x29e, 0x23c, 0x3ff, 0x1c0, 0x2e7, 0x38b, 0x35f, 0x93, 0x10, 0x89, 0x249, 0x128, 0x3d0, 0x36a, 0x60, 0x336, 0x1ad, 0x2f9, 0xf2, 0x36e, 0x140, 0x2a6, 0x1e7, 0x20d, 0x22c, 0x376, 0x389, 0x3cf, 0x5b, 0x35, 0xf3, 0x326, 0x124, 0xb0, 0x1da, 0xbe, 0x22a, 0x2c6, 0x2d1, 0x3a0, 0xd5, 0x384, 0xe7, 0x28f, 0x90, 0x190, 0x94, 0x3d0, 0x2dd, 0x180, 0x186, 0x2e6, 0x38f, 0xf7, 0x5, 0x2d0, 0x3d9, 0x2c4, 0x8b, 0x1bb, 0x389, 0x397, 0x16c, 0x1a8, 0x32b, 0x11, 0x182, 0xa6, 0x1c6, 0x2a7, 0x35e, 0x1b6, 0x1d0, 0xd5, 0x301, 0x39c, 0x55, 0x383, 0x23e, 0x2d7, 0x29, 0x23d, 0x367, 0x299, 0x381, 0x31e, 0x1f7, 0x101, 0x194, 0x2d4, 0x199, 0x8d, 0x2db, 0x2e0, 0xef, 0x19e, 0x37d, 0x222, 0x10c, 0x3cd, 0x196, 0x3f4, 0x2b9, 0x1a5, 0x172, 0x353, 0x3ef, 0x292, 0x2b8, 0x135, 0xe2, 0x3c7, 0x3f, 0x4f, 0x338, 0xb3, 0x204, 0x48, 0xc8, 0x4a, 0x1e8, 0x36a, 0xc0, 0xc3, 0x173, 0x3c3, 0x27f, 0x206, 0x168, 0x3e8, 0x162, 0x241, 0x2d9, 0x3c0, 0x3cf, 0xb6, 0xd4, 0x391, 0x20c, 0xc1, 0x53, 0xe3, 0x357, 0x1af, 0xdb, 0xe8, 0x26e, 0x384, 0x1ce, 0x22e, 0x3c5, 0x11f, 0x36f, 0x210, 0x31a, 0x3b7, 0x348, 0x3c4, 0x120, 0x249, 0xa9, 0x177, 0x306, 0xd8, 0x2b0, 0x378, 0x1e4, 0x346, 0x5a, 0x1f4, 0x162, 0x8b, 0x376, 0x23f, 0x87, 0x2ed, 0x165, 0x362, 0x92, 0x160, 0x2cb, 0x3ed, 0x36d, 0x269, 0xe8, 0xd5, 0x20b, 0x26b, 0x2a8, 0x4e, 0x359, 0x85, 0xad, 0x1fe, 0x230, 0x27c, 0x365, 0x37b, 0x284, 0x194, 0x1a1, 0x26d, 0x61, 0x1e3, 0xaf, 0x3be, 0x2ab, 0x32e, 0x18b, 0x17e, 0x334, 0xfd, 0x358, 0x1a5, 0x2e4, 0x157, 0x347, 0x17a, 0x3bd, 0x1cb, 0x1fc, 0x70, 0x2e7, 0x237, 0x195, 0x81, 0x24, 0xc8, 0x94, 0x3a9, 0x366, 0x1b, 0x56, 0x6f, 0x238, 0x36e, 0x109, 0x23a, 0x12e, 0x192, 0x368, 0x3c0, 0x397, 0x2d8, 0x2a9, 0x16e, 0x110, 0x2c, 0x1da, 0x2f8, 0x2e8, 0xcc, 0x1d, 0x29f, 0x1c2, 0x1ce, 0x55, 0x30f, 0xea, 0x295, 0x290, 0x339, 0x46, 0x24b, 0x2e9, 0x1ec, 0x254, 0x236, 0xb5, 0x2c8, 0x8d, 0x1bf, 0x240, 0x136, 0x141, 0x35d, 0x18, 0x265, 0x2e6, 0x227, 0x36b, 0x140, 0x11d, 0x12e, 0x324, 0x1bb, 0x23f, 0x10e, 0x3a6, 0x33a, 0x245, 0x264, 0xa6, 0x311, 0x22a, 0x21d, 0x105, 0x34b, 0x1c2, 0x39c, 0x154, 0x4e, 0x2bb, 0x214, 0x161, 0x3df, 0x299, 0x21f, 0x18c, 0x127, 0x340, 0x12f, 0x164, 0x8d, 0x37e, 0x253, 0x3be, 0x15f, 0xa3, 0x43, 0x3cd, 0x251, 0x337, 0x333, 0x221, 0x2f0, 0x3fd, 0x292, 0x2f2, 0x374, 0xfe, 0x70, 0x1c7, 0xce, 0xb3, 0x2, 0x89, 0x26c, 0x282, 0x2b3, 0x30, 0xc3, 0x1c5, 0x47, 0x2df, 0x280, 0x23a, 0x25c, 0x241, 0x376, 0x77, 0x21c, 0x345, 0x27d, 0x83, 0xc1, 0x14c, 0x22b, 0x5d, 0x33, 0x20a, 0x29f, 0x384, 0x331, 0x2a8, 0x9c, 0x17f, 0x21, 0x2c2, 0x3b7, 0x13b, 0x37, 0x318, 0x24e, 0x289, 0x25e, 0x2c8, 0x11a, 0x2f5, 0xaf, 0x375, 0x2be, 0x146, 0x86, 0x393, 0xab, 0x89, 0xd1, 0x21a, 0x1b5, 0x300, 0x56, 0x1bc, 0x3c8, 0x206, 0x352, 0x3ce, 0x130, 0x1b4, 0x389, 0x87, 0x3a6, 0x27d, 0x106, 0x304, 0x272, 0x2f8, 0x3b2, 0xdb, 0x349, 0x296, 0x3c9, 0x28f, 0x383, 0x1d4, 0x85, 0x2b4, 0x3df, 0x13b, 0x6e, 0x7b, 0x254, 0xca, 0x342, 0x34c, 0x3b, 0x5c, 0xef, 0xeb, 0x2cf, 0x18b, 0x1f1, 0x32c, 0x337, 0x26f, 0x96, 0x3ad, 0x3a7, 0x2f4, 0x1d7, 0x11e, 0x3c7, 0x1f8, 0x3e4, 0x167, 0x81, 0x90, 0x9b, 0x141, 0x2b3, 0x60, 0x30c, 0x233, 0x79, 0x346, 0x168, 0x37f, 0x26, 0x232, 0xf0, 0x397, 0x372, 0x2ca, 0x326, 0x264, 0x14c, 0x5f, 0x174, 0x198, 0xe8, 0x354, 0xf8, 0x3d6, 0x1f3, 0x23e, 0x295, 0x252, 0x3fc, 0x1a4, 0x30b, 0x18c, 0x24e, 0x11b, 0x16a, 0x26d, 0x184, 0x20f, 0x39a, 0x19e, 0x3de, 0x1b2, 0xbf, 0x261, 0x3e1, 0x3ca, 0x314, 0x2f0, 0x3f3, 0x25a, 0x3bd, 0x112, 0x344, 0xf4, 0x366, 0xd8, 0x1ad, 0x38f, 0x36b, 0x109, 0x1f4, 0x302, 0x288, 0x78, 0x397, 0x2ed, 0x33a, 0x106, 0x201, 0x1da, 0x3ed, 0x35e, 0x356, 0x3d4, 0x1c2, 0x26b, 0x16d, 0x3a4, 0x2d7, 0x290, 0x1fe, 0x1a4, 0x21f, 0x239, 0x254, 0x194, 0x113, 0x256, 0x3b0, 0x392, 0x3be, 0x175, 0x222, 0xe4, 0x262, 0xfd, 0x2f6, 0x18a, 0x2f0, 0x3ef, 0x17a, 0x1d7, 0x23c, 0x307, 0x3db, 0x237, 0xb3, 0x8, 0x82, 0x216, 0x3a9, 0x306, 0x2c9, 0x173, 0x47, 0x36e, 0x5a, 0x3bb, 0x26, 0x6d, 0x3c0, 0x87, 0x345, 0x1e6, 0x22, 0x2c, 0x2cb, 0x357, 0x2c6, 0x286, 0x29f, 0x20b, 0x37c, 0x37a, 0x11f, 0x295, 0xad, 0x3eb, 0x13b, 0xdc, 0x1ec, 0x284, 0xbb, 0x8a, 0x294, 0x1bf, 0xaf, 0x1cf, 0x3ba, 0x134, 0x329, 0x334, 0x3e1, 0x39d, 0x4b, 0x3ad, 0x347, 0x3c2, 0x2a3, 0x1c4, 0xe, 0x2e7, 0x19c, 0x191, 0x40, 0x224, 0x10b, 0x3a9, 0x205, 0x336, 0x38a, 0x79, 0x103, 0x2ad, 0x24f, 0x241, 0x386, 0x1ff, 0x16c, 0x165, 0x245, 0x304, 0x1da, 0x3d3, 0x163, 0x286, 0x137, 0x3e, 0x3d6, 0x3c5, 0x3a8, 0x21, 0x23d, 0x23, 0x27c, 0x235, 0x127, 0x236, 0x342, 0x12b, 0x3b0, 0x32d, 0x2e3, 0x3ba, 0x268, 0xbf, 0x196, 0x267, 0x35c, 0x2e4, 0x15d, 0x150, 0x2f2, 0x396, 0x3f7, 0x1f8, 0x38b, 0x25d, 0x8, 0x104, 0x4a, 0x177, 0xc, 0x186, 0x6f, 0x3c8, 0xa, 0x145, 0x25c, 0x22c, 0xf, 0x3e3, 0x372, 0x33a, 0x20c, 0x16, 0x2cb, 0x2a7, 0x30a, 0x1d, 0x1aa, 0x1f0, 0x28f, 0x217, 0x17f, 0x108, 0x1cc, 0x118, 0x3c4, 0x18c, 0x12a, 0x194, 0x226, 0x14a, 0x1bf, 0x15e, 0x335, 0x1ef, 0x364, 0x1f1, 0xab, 0x31c, 0x2d6, 0x30d, 0x2fa, 0x292, 0x3bd, 0x8f, 0x387, 0x3db, 0x67, 0x2cc, 0x40, 0x32, 0x250, 0x3aa, 0x60, 0x2b, 0x378, 0x41, 0x25, 0x177, 0x18, 0x211, 0x378, 0xf7, 0x140, 0x1f4, 0x13, 0xda, 0x23f, 0xc4, 0x1a8, 0x362, 0x264, 0x272, 0x3ed, 0x163, 0x105, 0xd5, 0x1f0, 0x117, 0x4e, 0x3ea, 0xa4, 0x1fe, 0x299, 0x1b8, 0x37b, 0x34, 0x12f, 0x26d, 0x3b, 0x2e0, 0x3be, 0x1dd, 0x268, 0x17e, 0x251, 0x31c, 0x1a5, 0x2f, 0x3fd, 0x17a, 0x355, 0x388, 0x70, 0x4f, 0x3ab, 0x81, 0x89, 0x281, 0x3a9, 0x3, 0xc3, 0x6f, 0x399, 0x28, 0x23a, 0x181, 0x119, 0x3c0, 0x21c, 0x35, 0x16e, 0x248, 0x14c, 0x2f8, 0x1af, 0x2a5, 0x29f, 0x3e, 0x3a5, 0x30f, 0x17f, 0x210, 0x339, 0xd2, 0x37, 0x1ec, 0x202, 0x3a2, 0x2c8, 0x184, 0x5c, 0x371, 0x2be, 0x4d, 0x329, 0xcb, 0x267, 0x2b1, 0x382, 0x2fa, 0x12d, 0x2ef, 0x71, 0xe, 0x38e, 0x1f6, 0x91, 0x90, 0xd1, 0xf4, 0x183, 0x19b, 0x38a, 0xf2, 0x5, 0x145, 0xb1, 0xa2, 0x78, 0x82, 0x94, 0x3aa, 0x180, 0x2b0, 0x38f, 0x36e, 0x2d0, 0x323, 0x8b, 0xf, 0x397, 0x345, 0x32b, 0x92, 0xa6, 0x2f8, 0x35e, 0x286, 0xd5, 0x3e0, 0x55, 0x270, 0x2d7, 0xad, 0x367, 0x24b, 0x31e, 0x24e, 0x194, 0x8a, 0x8d, 0x303, 0xef, 0x2ab, 0x222, 0x329, 0x196, 0x18e, 0x1a5, 0x5e, 0x3ef, 0x3c2, 0x135, 0x1fc, 0x3f, 0x3c1, 0xb3, 0x40, 0xc8, 0x141, 0x36a, 0xd8, 0x173, 0x238, 0x206, 0x145, 0x162, 0x288, 0x3c0, 0x31, 0xd4, 0x362, 0xc1, 0x1da, 0x357, 0x21d, 0xe8, 0x125, 0x1ce, 0x16d, 0x11f, 0x85, 0x31a, 0x46, 0x3c4, 0x239, 0x284, 0x1d1, 0x2c8, 0x308, 0x170, 0x3be, 0x3ba, 0x1b2, 0x3e2, 0x151, 0x358, 0x18a, 0x3ad, 0x20e, 0x15c, 0x1cb, 0x3e7, 0x3db, 0x19c, 0x93, 0x24, 0x26c, 0xf4, 0x306, 0x265, 0x6f, 0x33b, 0xa0, 0x1f4, 0x26, 0x368, 0x1dc, 0x5b, 0x165, 0x106, 0x2c, 0x275, 0x104, 0x250, 0x16f, 0x36, 0x2bd, 0x238, 0x5, 0x11d, 0x302, 0xda, 0xee, 0x5b, 0x2ca, 0x11, 0x160, 0x311, 0x3b2, 0x356, 0x137, 0x1f0, 0x55, 0xe9, 0x34e, 0x161, 0x215, 0x1e2, 0x239, 0x101, 0x34d, 0x26d, 0xec, 0x253, 0x263, 0x2cf, 0x10c, 0x262, 0x3cb, 0x35c, 0x30d, 0x3fd, 0x1e1, 0x135, 0x3f8, 0xfc, 0x237, 0x322, 0x12, 0x26c, 0x1e8, 0x3, 0x30c, 0x2f9, 0x3b1, 0x5a, 0x3ce, 0x241, 0xf, 0x327, 0x10f, 0x16e, 0x132, 0xed, 0x357, 0x33, 0x3a0, 0x13a, 0xdf, 0x1f3, 0x359, 0x210, 0xff, 0x13b, 0x1db, 0x3a3, 0x236, 0x226, 0x242, 0x303, 0x1de, 0x2be, 0x134, 0x2fc, 0x2ac, 0x358, 0x314, 0x2af, 0x54, 0x1ed, 0x11e, 0xe, 0x223, 0x35f, 0x1, 0x104, 0x250, 0x16f, 0x36, 0x2bd, 0x238, 0x5, 0x11d, 0x302, 0xda, 0xee, 0x5b, 0x2ca, 0x11, 0x160, 0x311, 0x3b2, 0x356, 0x137, 0x1f0, 0x55, 0x208, 0x152, 0x36a, 0x360, 0x31d, 0x33b, 0x280, 0x37f, 0x192, 0x203, 0x327, 0x21e, 0x1b1, 0x182, 0x2cb, 0x22a, 0xdb, 0x3d4, 0x3e, 0x117, 0x270, 0x34e, 0x2c2, 0x46, 0x30b, 0x3d8, 0x68, 0x2d4, 0xa5, 0x1e3, 0x273, 0x15f, 0x134, 0x1f1, 0x2a2, 0x2f6, 0x12c, 0x15d, 0x12d, 0x355, 0x7f, 0x3f, 0x31f, 0x322, 0x24, 0x1a2, 0x35b, 0x30, 0x158, 0x317, 0x346, 0x2a6, 0x2c4, 0x6d, 0xee, 0xb6, 0x33a, 0x88, 0x22d, 0x2f8, 0x163, 0x3a, 0x125, 0x331, 0x2fd, 0x359, 0x29, 0x3fc, 0x1ca, 0x18f, 0x95, 0xbb, 0x164, 0x219, 0x392, 0x335, 0x2cf, 0x218, 0x19a, 0x267, 0x1a5, 0x178, 0x287, 0x15c, 0x325, 0x207, 0x315, 0x35f, 0x2, 0x19, 0x2a4, 0x2dd, 0x2c9, 0x233, 0x27f, 0x109, 0x2f7, 0x324, 0xf, 0x247, 0x35, 0x362, 0x304, 0x19f, 0x5d, 0x1b6, 0x3a1, 0x7c, 0x22e, 0xe9, 0x295, 0x18d, 0x8c, 0x21f, 0x19, 0x141, 0x366, 0x265, 0x378, 0x36b, 0x2d0, 0x12e, 0x288, 0x23f, 0x5b, 0x33a, 0x110, 0xa6, 0x3ed, 0x21d, 0x349, 0x1c2, 0x3d6, 0x4e, 0x2d7, 0x161, 0x46, 0x21f, 0x37b, 0x340, 0x113, 0x8d, 0x2e, 0x3be, 0x1ef, 0x43, 0x262, 0x337, 0x1a5, 0x2f0, 0x20e, 0x2f2, 0x23c, 0x70, 0xf9, 0xb3, 0x200, 0x26c, 0x3a9, 0x30, 0x2b0, 0x47, 0x206, 0x23a, 0x26, 0x376, 0x3f5, 0x345, 0x16e, 0xc1, 0x2cb, 0x5d, 0x36c, 0x29f, 0x3e0, 0x2a8, 0x11f, 0x21, 0x339, 0x13b, 0x365, 0x24e, 0xbb, 0x2c8, 0x76, 0xaf, 0x33c, 0x146, 0x329, 0xab, 0x358, 0x4b, 0x2aa, 0x12d, 0x2a3, 0x1fc, 0x1f8, 0x19c, 0x91, 0x112, 0x94, 0x16f, 0xd8, 0x38a, 0x33b, 0x109, 0x1e7, 0x8b, 0x78, 0x31, 0x2a9, 0x106, 0x160, 0x5f, 0x35e, 0x1d, 0x125, 0x26b, 0x3e6, 0x2fe, 0x290, 0x367, 0x27c, 0x239, 0xd, 0xb5, 0x256, 0x1e3, 0x32, 0x10d, 0x306, 0x211, 0x3c3, 0x346, 0x28a, 0x13, 0x376, 0x3e3, 0x10f, 0x362, 0xb, 0x1c6, 0x36d, 0x105, 0x296, 0x26b, 0x3c5, 0x3ea, 0xad, 0x215, 0x30b, 0x37b, 0x289, 0x45, 0x61, 0x2e0, 0x335, 0x32e, 0x1c8, 0x251, 0x358, 0x96, 0x2ba, 0x17a, 0x26a, 0x3f7, 0x2e7, 0x3ab, 0x4, 0xc8, 0x3d, 0x3, 0x56, 0x317, 0x103, 0x23a, 0x4c, 0x1c3, 0x397, 0x35, 0x193, 0x2c, 0x311, 0x1af, 0x1d, 0x24a, 0x1be, 0x30f, 0x3b3, 0x2b4, 0x46, 0x37, 0x1f7, 0x236, 0x114, 0x184, 0x392, 0xcf, 0xa3, 0x329, 0x156, 0x17b, 0x258, 0x2fa, 0x1e1, 0x1ba, 0x3c7, 0x38e, 0x2b7, 0x10, 0x320, 0xf4, 0xc, 0x158, 0x47, 0x5, 0xfa, 0x130, 0x305, 0x247, 0xd4, 0x245, 0xb0, 0x5f, 0x2b5, 0x74, 0x13a, 0x2f1, 0x27, 0x2d7, 0x2c2, 0x118, 0xdc, 0x3d5, 0xca, 0x59, 0x219, 0x253, 0x33c, 0x28c, 0xbf, 0x151, 0x64, 0x3d, 0x6, 0x158, 0x8e, 0x14, 0x3d9, 0x324, 0x78, 0xc4, 0x2ca, 0x110, 0x298, 0x2a7, 0x269, 0x34b, 0x3c9, 0x16d, 0x3a8, 0xa4, 0x367, 0x1e2, 0x3d8, 0x340, 0x45, 0xc2, 0x392, 0x19e, 0x28c, 0x17e, 0x14d, 0x333, 0x30d, 0x3a7, 0x2b8, 0x23c, 0x1c0, 0x38b, 0x93, 0x89, 0x128, 0x36a, 0x336, 0x2f9, 0x36e, 0x2a6, 0x20d, 0x376, 0x3cf, 0x35, 0x326, 0xb0, 0xbe, 0x2c6, 0x3a0, 0x384, 0x28f, 0x1d2, 0x10a, 0x339, 0xe5, 0x235, 0x284, 0x25e, 0xa5, 0x303, 0x1df, 0x3de, 0x218, 0xcb, 0xd6, 0x4b, 0x2ba, 0x2f4, 0x1ba, 0x387, 0x223, 0x195, 0x100, 0xd1, 0x177, 0x209, 0x2e6, 0x33b, 0x2d, 0x24f, 0x288, 0xee, 0x1b9, 0x32b, 0x264, 0x19f, 0x2e8, 0x143, 0x14b, 0x26b, 0x383, 0x3b3, 0x161, 0x118, 0x1b8, 0x34f, 0x259, 0x199, 0x3b0, 0x1cd, 0x15f, 0x1b2, 0xa7, 0x3cb, 0x1a5, 0x3d2, 0xa8, 0x1d7, 0xc8, 0xf4, 0x30, 0x1ad, 0x1e4, 0x109, 0x323, 0x288, 0x1dc, 0x2ed, 0x16e, 0x201, 0x38c, 0x35e, 0xe8, 0x1c2, 0x28f, 0x3a4, 0x21, 0x1fe, 0x24b, 0x239, 0x68, 0x113, 0x61, 0x392, 0x33c, 0x222, 0x3e2, 0xfd, 0x2b1, 0x2f0, 0x54, 0x1d7, 0x1fc, 0x3db, 0x3d1, 0x8, 0x249, 0x3a9, 0x180, 0x173, 0x33b, 0x5a, 0x12e, 0x6d, 0x2fb, 0x345, 0x362, 0x2c, 0x5f, 0x2c6, 0x349, 0x20b, 0x55, 0x11f, 0x108, 0x3eb, 0x27c, 0x1ec, 0x340, 0x8a, 0x308, 0xaf, 0x1d6, 0x134, 0x32f, 0x3e1, 0x1a5, 0x3ad, 0x2a0, 0x2a3, 0x3fb, 0x2e7, 0x2b7, 0x40, 0x26c, 0x177, 0x1b, 0x38a, 0x1ee, 0x2d0, 0x162, 0x368, 0x3f5, 0x21e, 0x326, 0x160, 0x2f8, 0x21d, 0x27e, 0x7c, 0x2a8, 0xea, 0x52, 0x367, 0x3c4, 0x37b, 0x236, 0x59, 0x76, 0x171, 0x2ab, 0x1b2, 0x14e, 0x337, 0x133, 0x157, 0x12d, 0x135, 0x3e7, 0x315, 0x195, 0x200, 0x190, 0x3d0, 0x180, 0x2e6, 0xf7, 0x2d0, 0x2c4, 0x1bb, 0x397, 0x1a8, 0x11, 0xa6, 0x2a7, 0x1b6, 0xd5, 0x39c, 0x383, 0x2d7, 0x23d, 0x299, 0x31e, 0x101, 0x2d4, 0x8d, 0x2e0, 0x19e, 0x222, 0x3cd, 0x3f4, 0x1a5, 0x353, 0x292, 0x135, 0x3c7, 0x4f, 0xb3, 0x48, 0x4a, 0x36a, 0xc3, 0x3c3, 0x206, 0x3e8, 0x241, 0x3c0, 0xb6, 0x391, 0xc1, 0xe3, 0x1af, 0xe8, 0x384, 0x22e, 0x11f, 0x210, 0x3b7, 0x3c4, 0x2ff, 0xca, 0x2c8, 0x369, 0x273, 0x3ba, 0x86, 0xcb, 0x358, 0xb9, 0x3f3, 0x15c, 0x71, 0x21b, 0x19c, 0x102, 0x64, 0xf4, 0x60, 0x2bd, 0x33b, 0xb4, 0xb1, 0x368, 0x3e3, 0x6a, 0x106, 0x22d, 0x3af, 0x269, 0x137, 0xe7, 0x3e6, 0x3b3, 0x18d, 0x1a4, 0x2c3, 0x142, 0xb5, 0x121, 0xb8, 0x263, 0x28c, 0x1f1, 0xfd, 0x16b, 0x3d2, 0x2a0, 0x14f, 0x3f7, 0x315, 0x32a, 0x12, 0x216, 0x2de, 0x336, 0x3f6, 0x320, 0x35b, 0x1b, 0x233, 0x2df, 0x145, 0x98, 0x1e, 0x188, 0xf3, 0x132, 0x275, 0x1af, 0x1d0, 0x20b, 0x154, 0x1d4, 0x290, 0x23, 0x1b8, 0x24e, 0x34d, 0xa5, 0x2e, 0x335, 0x28c, 0x3e2, 0x3f4, 0x34a, 0x157, 0xbd, 0x374, 0xe, 0x3e4, 0x126, 0x82, 0x10d, 0xc, 0x1ad, 0x399, 0xb4, 0x162, 0x1bb, 0x327, 0x2a9, 0x88, 0x272, 0x5d, 0x143, 0x24a, 0x3d6, 0x1d2, 0x42, 0x3eb, 0x1e2, 0x2ff, 0x194, 0x332, 0x37e, 0x371, 0x3b5, 0x1c8, 0x151, 0x26f, 0xbc, 0x54, 0x355, 0x3ff, 0x315, 0x25d, 0x48, 0x94, 0x1b3, 0x211, 0x47, 0x50, 0x3ce, 0x288, 0x379, 0x283, 0x326, 0x189, 0x3d3, 0x269, 0x26e, 0x39c, 0x30f, 0x34e, 0x1cc, 0x1ca, 0x318, 0xd0, 0x8a, 0x3b, 0x2e2, 0x175, 0x225, 0x261, 0x358, 0x172, 0x3d7, 0x2f2, 0x319, 0x3f0, 0x3d1, 0x20, 0xd1, 0x3aa, 0x360, 0x2f9, 0x346, 0xfa, 0x324, 0x3c0, 0x249, 0x177, 0xd8, 0x378, 0x346, 0x1f4, 0x8b, 0x23f, 0x2ed, 0x362, 0x160, 0x3ed, 0x269, 0xd5, 0x26b, 0x4e, 0x85, 0x1fe, 0x27c, 0x37b, 0x194, 0x26d, 0x1e3, 0x3be, 0x32e, 0x17e, 0xfd, 0x1a5, 0x157, 0x17a, 0x1cb, 0x70, 0x237, 0x81, 0xc8, 0x3a9, 0x1b, 0x6f, 0x36e, 0x23a, 0x192, 0x3c0, 0x2d8, 0x16e, 0x2c, 0x2f8, 0xcc, 0x29f, 0x1ce, 0x30f, 0x295, 0x339, 0x24b, 0x1ec, 0x236, 0x2c8, 0x1bf, 0x371, 0x363, 0x329, 0x29a, 0x2b1, 0x3ad, 0x12d, 0x1ba, 0xe, 0x3c1, 0x91, 0x19, 0xf4, 0x180, 0x38a, 0x36b, 0x145, 0x130, 0x78, 0x5b, 0x32b, 0x201, 0x5f, 0x21d, 0x3d4, 0x33f, 0x3e6, 0x2d7, 0xe6, 0x1ca, 0x239, 0x340, 0x59, 0x3b0, 0xef, 0x1ef, 0xe4, 0x151, 0xd7, 0x2f0, 0x2a0, 0x135, 0x307, 0xf9, 0x93, 0x82, 0x21a, 0x30, 0x173, 0x1ee, 0x2ad, 0x26, 0xf, 0x188, 0x1e6, 0xc1, 0x38c, 0x9b, 0x1d5, 0x2c9, 0x3e5, 0xa, 0x1e7, 0x119, 0x3fe, 0xd4, 0x44, 0xed, 0x2e8, 0x3a, 0x301, 0x2a8, 0x2bb, 0x2b4, 0x1a4, 0x235, 0x34, 0x8a, 0xec, 0x273, 0x1ef, 0x1c8, 0x14d, 0x2b1, 0x353, 0xbd, 0x1cb, 0xe0, 0xce, 0x1, 0x9b, 0x1d5, 0x2c9, 0x3e5, 0xa, 0x1e7, 0x119, 0x3fe, 0xd4, 0x44, 0xed, 0x2e8, 0x3a, 0x301, 0x2a8, 0x2bb, 0x2b4, 0x1a4, 0x235, 0x34, 0x8a, 0xec, 0x273, 0x1ef, 0x1c8, 0x14d, 0x2b1, 0x353, 0xbd, 0x1cb, 0xe0, 0xce, 0x1, 0x9b, 0x1d5, 0x2c9, 0x3e5, 0xa, 0x1e7, 0x119, 0x3fe, 0xd4, 0x44, 0xed, 0x2e8, 0x3a, 0x301, 0x2a8, 0x2bb, 0x2b4, 0x1a4, 0x235, 0x34, 0x8a, 0xec, 0x273, 0x1ef, 0x1c8, 0x14d, 0x2b1, 0x353, 0xbd, 0x1cb, 0xe0, 0xce, 0x1, 0x9b, 0x1d5, 0x2c9, 0x3e5, 0xa, 0x1e7, 0x119, 0x3fe, 0xd4, 0x44, 0xed, 0x2e8, 0x3a, 0x301, 0x2a8, 0x136, 0x35d, 0x265, 0x227, 0x140, 0x12e, 0x1bb, 0x10e, 0x33a, 0x264, 0x311, 0x21d, 0x34b, 0x39c, 0x4e, 0x214, 0x3df, 0x21f, 0x127, 0x12f, 0x8d, 0x253, 0x15f, 0x43, 0x251, 0x333, 0x2f0, 0x292, 0x374, 0x70, 0xce, 0x2, 0x26c, 0x2b3, 0xc3, 0x47, 0x280, 0x25c, 0x376, 0x21c, 0x27d, 0xc1, 0x22b, 0x33, 0x29f, 0x331, 0x9c, 0x21, 0x3b7, 0x37, 0x24e, 0x25e, 0x11a, 0xaf, 0x2be, 0x86, 0xab, 0x26f, 0x1e9, 0x12d, 0x2e1, 0xe0, 0x19c, 0x4, 0xd1, 0x16f, 0x186, 0x8e, 0x109, 0xb1, 0x2e5, 0x31, 0xf3, 0x182, 0x5f, 0x66, 0x137, 0x26b, 0x138, 0x42, 0x367, 0x6e, 0x95, 0xb5, 0x234, 0x15e, 0x175, 0x10c, 0x156, 0xd7, 0x3d2, 0x25a, 0x1cb, 0x1c0, 0x338, 0x8, 0x1a2, 0x2de, 0x30c, 0x11c, 0x212, 0x162, 0x1c3, 0x62, 0x1e6, 0x304, 0xbe, 0xcc, 0x26e, 0xdf, 0x270, 0x84, 0x2c7, 0xdc, 0x26c, 0x16f, 0x30c, 0x238, 0x5a, 0x302, 0xf, 0x5b, 0x16e, 0x160, 0x357, 0x356, 0x13a, 0x55, 0x359, 0x161, 0x13b, 0x239, 0x236, 0x26d, 0x303, 0x263, 0x134, 0x262, 0x358, 0x30d, 0x54, 0x135, 0xe, 0x237, 0x1, 0x26c, 0x16f, 0x30c, 0x238, 0x5a, 0x302, 0xf, 0x5b, 0x16e, 0x160, 0x357, 0x356, 0x13a, 0x55, 0x359, 0x161, 0x13b, 0x239, 0x236, 0x26d, 0x303, 0x263, 0x134, 0x262, 0x358, 0x30d, 0x54, 0x135, 0xe, 0x237, 0x1, 0x26c, 0x16f, 0x30c, 0x238, 0x5a, 0x302, 0xf, 0x5b, 0x16e, 0x160, 0x357, 0x356, 0x13a, 0x55, 0x359, 0x161, 0x13b, 0x239, 0x236, 0x26d, 0x303, 0x263, 0x134, 0x262, 0x358, 0x30d, 0x54, 0x135, 0xe, 0x237, 0x1, 0x26c, 0x16f, 0x30c, 0x238, 0x5a, 0x302, 0xf, 0x5b, 0x16e, 0x160, 0x357, 0x356, 0x13a, 0x55, 0x359, 0x161, 0x13b, 0x239, 0x236, 0x26d, 0x303, 0xd1, 0x1b5, 0x56, 0x3c8, 0x352, 0x130, 0x389, 0x3a6, 0x106, 0x272, 0x3b2, 0x349, 0x3c9, 0x383, 0x85, 0x3df, 0x6e, 0x254, 0x342, 0x3b, 0xef, 0x2cf, 0x1f1, 0x337, 0x96, 0x3a7, 0x1d7, 0x3c7, 0x3e4, 0x81, 0x9b, 0x2b3, 0x30c, 0x79, 0x168, 0x26, 0xf0, 0x372, 0x326, 0x14c, 0x174, 0xe8, 0xf8, 0x1f3, 0x295, 0x3fc, 0x30b, 0x24e, 0x16a, 0x184, 0x39a, 0x3de, 0xbf, 0x3e1, 0x314, 0x3f3, 0x3bd, 0x3ff, 0x278, 0x91, 0x190, 0x1d5, 0x265, 0x8e, 0x2d, 0x302, 0x1e, 0x16c, 0x362, 0x22d, 0x22a, 0x1d, 0x1f, 0x1bd, 0x2d7, 0x27b, 0x1e2, 0x34f, 0x12f, 0x234, 0x171, 0x37d, 0x390, 0xfd, 0x266, 0x1fd, 0x2f2, 0x3f8, 0x4f, 0x93, 0x32, 0x2bf, 0x2c9, 0x317, 0x280, 0x162, 0x305, 0x229, 0x16e, 0x2c0, 0x147, 0x286, 0x384, 0x2b2, 0x3dd, 0x1cc, 0x13e, 0x3ee, 0x3a2, 0x242, 0xaf, 0x2ea, 0x72, 0x29a, 0x1a2, 0x2dd, 0x2b0, 0xf7, 0x28a, 0x8b, 0x379, 0x1a8, 0x92, 0x1c6, 0x33, 0xd5, 0x1eb, 0x23e, 0xad, 0x299, 0x7b, 0x194, 0x12b, 0x2e0, 0x2ab, 0x10c, 0x2a2, 0x1a5, 0x2ba, 0x2b8, 0x1fc, 0x4f, 0x126, 0xc8, 0x1d5, 0xc3, 0x238, 0x168, 0x4c, 0x3c0, 0x3a6, 0x20c, 0x1da, 0x1af, 0xf5, 0x1ce, 0x138, 0x210, 0x46, 0x18f, 0xd0, 0x2c8, 0x385, 0xcf, 0x1b2, 0xcb, 0x333, 0x3ad, 0x1e1, 0x71, 0x3db, 0x25d, 0x224, 0xf4, 0x6c, 0x3e5, 0xa0, 0xb1, 0x305, 0x5b, 0x1b1, 0x22d, 0x5d, 0x74, 0xf8, 0x3e6, 0x246, 0x3df, 0xdc, 0x142, 0x226, 0x3b0, 0x1df, 0x28c, 0x14e, 0x1ac, 0x213, 0x2a0, 0x2e1, 0x309, 0x3d1, 0x12, 0x152, 0x30, 0x233, 0x285, 0x1e7, 0x1b4, 0x10e, 0x1e6, 0x16, 0x3d3, 0x356, 0xe1, 0x159, 0x3dd, 0x398, 0xf1, 0x34f, 0x25e, 0xc2, 0x39a, 0x3b5, 0x2fc, 0x337, 0x12c, 0x287, 0x2a3, 0x344, 0x366, 0x1ad, 0x36b, 0x1f4, 0x288, 0x397, 0x33a, 0x201, 0x3ed, 0x356, 0x1c2, 0x16d, 0x2d7, 0x1fe, 0x21f, 0x254, 0x113, 0x3b0, 0x3be, 0x222, 0x262, 0x2f6, 0x2f0, 0x17a, 0x23c, 0x3db, 0xb3, 0x82, 0x3a9, 0x2c9, 0x47, 0x5a, 0x26, 0x3c0, 0x345, 0x22, 0x2cb, 0x2c6, 0x29f, 0x37c, 0x11f, 0xad, 0x13b, 0x1ec, 0xbb, 0x294, 0xaf, 0x3ba, 0x329, 0x3e1, 0x4b, 0x347, 0x2a3, 0xe, 0x19c, 0x40, 0x94, 0x6, 0x38a, 0x346, 0x1e7, 0x368, 0x31, 0x32b, 0x160, 0x28e, 0x1d, 0x7c, 0x3e6, 0x85, 0x367, 0x2e9, 0xd, 0x59, 0x1e3, 0x263, 0x1b2, 0x196, 0xd7, 0x157, 0x22f, 0x23b, 0x315, 0x93, 0xc8, 0x3aa, 0x30c, 0x1e4, 0x2ad, 0x192, 0x1dc, 0xd4, 0x92, 0x38c, 0xcc, 0x2a1, 0x28f, 0x359, 0x31a, 0x24b, 0x3ee, 0x293, 0x61, 0x39a, 0x363, 0x3e2, 0x18e, 0x2e4, 0x54, 0x1ba, 0x380, 0x3d1, 0x24, 0x281, 0x183, 0x173, 0x2d5, 0x2f7, 0x368, 0x62, 0xb7, 0x312, 0xba, 0x3a0, 0x33f, 0x9c, 0x29, 0x230, 0x18c, 0xca, 0x256, 0x32d, 0x1dd, 0x329, 0x3cb, 0x12c, 0x20e, 0x26a, 0x1c0, 0x3d1, 0x48, 0x10d, 0x1b, 0x3e5, 0x280, 0x302, 0xf0, 0x3a6, 0x22, 0x19f, 0x30a, 0xd5, 0x3a5, 0x3a8, 0x31a, 0x9f, 0x3a3, 0xb5, 0x219, 0x3bc, 0x146, 0x29c, 0x17b, 0x2f0, 0x2f4, 0xe2, 0x2e7, 0x322, 0x64, 0x3aa, 0x211, 0x399, 0x145, 0x116, 0x3fe, 0x165, 0x182, 0x3f2, 0x356, 0x384, 0x1bd, 0x295, 0x3df, 0x370, 0xd, 0xb2, 0x385, 0x33c, 0x316, 0x2ac, 0x1a5, 0x2fa, 0x3da, 0x3e7, 0x38b, 0x4, 0x216, 0x205, 0x1c5, 0x346, 0x3ce, 0x1bb, 0x188, 0x2dc, 0x53, 0x2e8, 0x29b, 0xe7, 0x270, 0xa4, 0xd2, 0x239, 0x328, 0x14a, 0xaf, 0x37d, 0xbf, 0x337, 0xb9, 0x2a, 0x1ba, 0x309, 0x35f, 0x120, 0x3d, 0x6c, 0x38f, 0x10b, 0x205, 0x38a, 0x103, 0x24f, 0x386, 0x16c, 0x245, 0x1da, 0x163, 0x137, 0x3d6, 0x3a8, 0x23d, 0x27c, 0x127, 0x342, 0x3b0, 0x2e3, 0x268, 0x196, 0x35c, 0x15d, 0x2f2, 0x3f7, 0x38b, 0x8, 0x4a, 0xc, 0x6f, 0xa, 0x25c, 0xf, 0x372, 0x20c, 0x2cb, 0x30a, 0x1aa, 0x28f, 0x17f, 0x1cc, 0x3c4, 0x12a, 0x226, 0x1bf, 0x335, 0x364, 0xab, 0x2d6, 0x2fa, 0x3bd, 0x387, 0x67, 0x40, 0x250, 0x60, 0x378, 0x50, 0x2c4, 0x78, 0x3a6, 0x44, 0x275, 0x66, 0x14b, 0x55, 0x3ea, 0x27b, 0x21f, 0x142, 0x114, 0x1e3, 0x19e, 0x316, 0x151, 0x29d, 0x3fd, 0x1d7, 0x7, 0x338, 0x200, 0x2a4, 0x300, 0x3f6, 0x280, 0x20d, 0x3c0, 0x10f, 0x220, 0x38c, 0x330, 0x24a, 0x2a8, 0x36f, 0x3fc, 0xdc, 0x202, 0xb2, 0x303, 0xeb, 0x86, 0x29a, 0xc5, 0x3d7, 0x2a3, 0x38, 0x1f6, 0x24, 0x10d, 0x36, 0x38f, 0x2d, 0x4c, 0x23f, 0x216, 0x6, 0x6f, 0x14, 0x162, 0x78, 0x345, 0x110, 0x38c, 0x269, 0x13a, 0x16d, 0x295, 0x367, 0x365, 0x340, 0x34c, 0x392, 0x3ba, 0x17e, 0x18e, 0x30d, 0x12d, 0x23c, 0x2e7, 0x93, 0x249, 0x36a, 0x1ad, 0x36e, 0x1e7, 0x376, 0x5b, 0x326, 0x1da, 0x2c6, 0xd5, 0x28f, 0x2fe, 0x339, 0x21f, 0x284, 0x59, 0x303, 0x1d6, 0x218, 0xfd, 0x4b, 0x20e, 0x1ba, 0x3f, 0x195, 0x82, 0x177, 0x30c, 0x33b, 0x23a, 0x288, 0x87, 0x32b, 0x312, 0x2e8, 0x27e, 0x26b, 0x11f, 0x161, 0x24b, 0x34f, 0x1a1, 0x3b0, 0x1cf, 0x1b2, 0xab, 0x1a5, 0x3fa, 0x1d7, 0xe, 0xfb, 0x24, 0x21a, 0xd8, 0x47, 0x2d0, 0x192, 0x2fb, 0x165, 0x201, 0x357, 0x1d, 0x3e0, 0x4e, 0x52, 0x1a4, 0x1ec, 0x1d1, 0x61, 0xef, 0x146, 0x262, 0x39d, 0x157, 0x15c, 0x3fb, 0x3c1, 0x8, 0x94, 0x30, 0x378, 0xa0, 0x302, 0x3c0, 0x21e, 0x92, 0x5f, 0x25, 0x18, 0x378, 0x140, 0x13, 0x23f, 0x1a8, 0x264, 0x3ed, 0x105, 0x1f0, 0x4e, 0xa4, 0x299, 0x37b, 0x12f, 0x3b, 0x3be, 0x268, 0x251, 0x1a5, 0x3fd, 0x355, 0x70, 0x3ab, 0x89, 0x3a9, 0xc3, 0x399, 0x23a, 0x119, 0x21c, 0x16e, 0x14c, 0x1af, 0x29f, 0x3a5, 0x17f, 0x339, 0x37, 0x202, 0x2c8, 0x5c, 0x2be, 0x329, 0x267, 0x382, 0x12d, 0x71, 0x38e, 0x91, 0xd1, 0x183, 0x38a, 0x5, 0xb1, 0x78, 0x283, 0x49, 0x5f, 0x2d1, 0x301, 0x3e6, 0x42, 0x118, 0x239, 0x176, 0x234, 0xef, 0x28c, 0x19a, 0xd7, 0x15d, 0x3da, 0x307, 0x338, 0x12, 0x21a, 0x1b0, 0x11c, 0x2ad, 0x116, 0x3cf, 0x1e6, 0x2c0, 0x174, 0x27e, 0xdf, 0x75, 0x31a, 0xf1, 0x12a, 0x8a, 0x3c6, 0xeb, 0x218, 0x1fa, 0x12c, 0x54, 0x396, 0x3e9, 0x191, 0x190, 0x1b5, 0x1ad, 0x2d5, 0x395, 0x386, 0x1b9, 0x11, 0x275, 0x198, 0x9d, 0x16d, 0x4a, 0x60, 0x3f6, 0x2d, 0x260, 0x2fb, 0x19d, 0x58, 0x5d, 0x13f, 0xdf, 0xea, 0x73, 0x381, 0x284, 0x164, 0x5c, 0x175, 0xbf, 0x31c, 0x5e, 0x1e1, 0x7f, 0xf9, 0x4, 0x128, 0x180, 0x3c3, 0xb4, 0x192, 0x3fe, 0x27d, 0x160, 0x174, 0xf5, 0x37c, 0x3a8, 0x1cc, 0x21f, 0x202, 0x199, 0x170, 0x1dd, 0x2fc, 0x6b, 0x178, 0x38d, 0x1fc, 0x3e4, 0x10, 0xa9, 0x209, 0x317, 0x2d0, 0x241, 0x3e3, 0x1e6, 0x189, 0x1d9, 0x3d4, 0x1eb, 0x2bb, 0x339, 0x6e, 0x1a, 0x26d, 0x1c9, 0x37d, 0x3e2, 0x1ac, 0x1e9, 0x22f, 0x3f9, 0x38b, 0x40, 0x2a4, 0x36, 0x47, 0x352, 0x116, 0x397, 0x391, 0x22d, 0x36d, 0x34b, 0x3a5, 0x2fe, 0xff, 0x1b8, 0x68, 0x1a6, 0x32d, 0x1ef, 0x393, 0x2b9, 0x3ad, 0xae, 0x3ff, 0x237, 0x100, 0x282, 0xd8, 0x11c, 0x153, 0x51, 0x247, 0x25f, 0xa6, 0x1af, 0x137, 0x28f, 0x3ea, 0x3fc, 0x2e9, 0x94, 0x180, 0x38f, 0x2d0, 0x8b, 0x397, 0x32b, 0xa6, 0x35e, 0xd5, 0x55, 0x2d7, 0x367, 0x31e, 0x194, 0x8d, 0xef, 0x222, 0x196, 0x1a5, 0x3ef, 0x135, 0x3f, 0xb3, 0xc8, 0x36a, 0x173, 0x206, 0x162, 0x3c0, 0xd4, 0xc1, 0x357, 0xe8, 0x1ce, 0x11f, 0x31a, 0x3c4, 0x284, 0x2c8, 0x170, 0x3ba, 0x3e2, 0x358, 0x3ad, 0x15c, 0x3e7, 0x19c, 0x24, 0xf4, 0x265, 0x33b, 0x1f4, 0x368, 0x5b, 0x106, 0x275, 0x269, 0x1c2, 0x3e6, 0x108, 0x1a4, 0x37b, 0xb5, 0x3b0, 0x263, 0x43, 0xfd, 0x258, 0x2a0, 0x23c, 0x315, 0x81, 0x216, 0x30, 0x3f6, 0x5a, 0x192, 0x3f5, 0x1e6, 0x312, 0x36d, 0x29f, 0x28f, 0x3dd, 0x3eb, 0x365, 0x236, 0x294, 0x39a, 0x146, 0x334, 0x2b1, 0x3fa, 0x2a3, 0x380, 0x195, 0x19, 0x16f, 0x1ad, 0x346, 0x12e, 0x78, 0x21e, 0x99, 0x3ed, 0x1d, 0x33f, 0x3a4, 0x161, 0x27c, 0x254, 0x59, 0x2e, 0x128, 0x209, 0x47, 0x153, 0x144, 0x31, 0x2cd, 0x361, 0xcc, 0x274, 0x1f3, 0x108, 0x348, 0x1f7, 0x1a1, 0x37e, 0xeb, 0xe4, 0x267, 0x2f, 0x3c2, 0x3f8, 0x31f, 0x200, 0x3d, 0x336, 0x33b, 0x3e8, 0x1bb, 0x2d8, 0x44, 0x22b, 0x356, 0xf8, 0x138, 0xad, 0x9f, 0x12a, 0x59, 0x5c, 0x1dd, 0x3e2, 0x2b9, 0x2af, 0x2f2, 0x207, 0x3ec, 0x112, 0x2ee, 0x158, 0x36e, 0x24f, 0x3c, 0x21e, 0x132, 0x3af, 0xe8, 0x39c, 0x75, 0xe6, 0x37, 0x34, 0x34c, 0x15e, 0x197, 0x262, 0x1ae, 0x1fd, 0x2a3, 0x309, 0x25d, 0xc8, 0x2dd, 0x1c5, 0x14, 0x20d, 0xee, 0x165, 0x58, 0x174, 0x3d4, 0x3a5, 0x3ea, 0x3eb, 0x2c3, 0xca, 0x8d, 0x1de, 0x9a, 0xab, 0x266, 0x107, 0x1cb, 0x3bf, 0x24c, 0x344, 0xc, 0x1fb, 0x5a, 0x324, 0x3cf, 0x32b, 0x14c, 0x163, 0x2a1, 0x159, 0x246, 0x46, 0x7b, 0x34d, 0x76, 0x39e, 0x225, 0xfd, 0x250, 0x36, 0x238, 0x11d, 0xda, 0x5b, 0x11, 0x311, 0x356, 0x1f0, 0xe9, 0x161, 0x1e2, 0x101, 0x26d, 0x253, 0x2cf, 0x262, 0x35c, 0x3fd, 0x135, 0xfc, 0x322, 0x26c, 0x3, 0x2f9, 0x5a, 0x241, 0x327, 0x16e, 0xed, 0x33, 0x13a, 0x1f3, 0x210, 0x13b, 0x3a3, 0x226, 0x303, 0x2be, 0x2fc, 0x358, 0x2af, 0x1ed, 0xe, 0x35f, 0x104, 0x16f, 0x2bd, 0x5, 0x302, 0xee, 0x2ca, 0x160, 0x3b2, 0x137, 0x55, 0x34e, 0x215, 0x239, 0x34d, 0xec, 0x263, 0x10c, 0x3cb, 0x30d, 0x1e1, 0x3f8, 0x237, 0x12, 0x1e8, 0x30c, 0x3b1, 0x3ce, 0xf, 0x10f, 0x132, 0x357, 0x3a0, 0xdf, 0x359, 0xff, 0x1db, 0x236, 0x242, 0x1de, 0x134, 0x2ac, 0x314, 0x54, 0x11e, 0x223, 0x1, 0x250, 0x36, 0x238, 0x11d, 0xda, 0x5b, 0x11, 0x311, 0x356, 0x1f0, 0xe9, 0x161, 0x1e2, 0x101, 0x26d, 0x253, 0x2cf, 0x262, 0x35c, 0x3fd, 0x135, 0xa9, 0xd8, 0x1e4, 0x1f4, 0x376, 0x2ed, 0x92, 0x3ed, 0xe8, 0x26b, 0x359, 0x1fe, 0x365, 0x194, 0x61, 0x3be, 0x18b, 0xfd, 0x2e4, 0x17a, 0x1fc, 0x237, 0x24, 0x3a9, 0x56, 0x36e, 0x12e, 0x3c0, 0x2a9, 0x2c, 0x2e8, 0x29f, 0x55, 0x295, 0x46, 0x1ec, 0xb5, 0x1bf, 0x1d6, 0x329, 0x6b, 0x3ad, 0x2f2, 0xe, 0x2b7, 0x19, 0x36a, 0x38a, 0xa0, 0x130, 0x3f5, 0x32b, 0x139, 0x21d, 0x13a, 0x3e6, 0x52, 0x1ca, 0x24e, 0x59, 0x170, 0x1ef, 0x14e, 0xd7, 0x3fa, 0x135, 0x1f8, 0x93, 0x344, 0x30, 0x38f, 0x2ad, 0x288, 0x188, 0x106, 0x38c, 0x356, 0x3e0, 0x3a4, 0x31a, 0x21f, 0x68, 0x256, 0x39a, 0x222, 0xab, 0x18a, 0x54, 0x23c, 0x9e, 0x8, 0x141, 0x2c9, 0x33b, 0x3bb, 0x386, 0x345, 0x99, 0x357, 0x349, 0x37c, 0x2fe, 0x3eb, 0x31e, 0xbb, 0x308, 0x1cf, 0x43, 0x3e1, 0x30d, 0x3c2, 0x3fb, 0x19c, 0x120, 0x152, 0x360, 0x33b, 0x37f, 0x203, 0x21e, 0x182, 0x22a, 0x3d4, 0x117, 0x34e, 0x46, 0x3d8, 0x2d4, 0x1e3, 0x15f, 0x1f1, 0x2f6, 0x15d, 0x355, 0x3f, 0x322, 0x1a2, 0x30, 0x317, 0x2a6, 0x6d, 0xb6, 0x88, 0x2f8, 0x3a, 0x331, 0x359, 0x3fc, 0x18f, 0xbb, 0x219, 0x335, 0x218, 0x267, 0x178, 0x15c, 0x207, 0x35f, 0x19, 0x2dd, 0x233, 0x109, 0x324, 0x247, 0x362, 0x19f, 0x1b6, 0x7c, 0xe9, 0x18d, 0x21f, 0xd0, 0x14a, 0xef, 0x268, 0x14d, 0x258, 0x25a, 0xfe, 0x237, 0x48, 0x2bf, 0x2b0, 0x285, 0x181, 0x1dc, 0x27d, 0x53, 0x2c6, 0x24a, 0x1f3, 0x52, 0x394, 0x12a, 0x2c8, 0x32d, 0x197, 0x334, 0x34a, 0x107, 0x243, 0x223, 0x4, 0x141, 0x19b, 0xf7, 0x1e7, 0x1e, 0x6a, 0x201, 0xba, 0x34b, 0x55, 0x123, 0x118, 0x37b, 0x342, 0x385, 0x175, 0x3cd, 0x3ca, 0x17d, 0x14f, 0xfc, 0x93, 0x281, 0xc0, 0x47, 0x2a4, 0x19b, 0x1ee, 0x395, 0xf0, 0x2a9, 0xb0, 0x2d3, 0x2a1, 0x1bd, 0x210, 0x1ca, 0x12a, 0x199, 0xaf, 0xa3, 0x32c, 0x18a, 0x150, 0x388, 0x3c1, 0x12, 0x35b, 0x2b0, 0x103, 0x20d, 0x2fb, 0x391, 0x272, 0xcc, 0x301, 0x9c, 0x161, 0x30b, 0xd0, 0x294, 0x3bc, 0x364, 0xfd, 0x382, 0x38d, 0x3e7, 0x3ec, 0x104, 0x36a, 0x233, 0x212, 0x8b, 0x21c, 0x245, 0x38c, 0x143, 0x277, 0xea, 0xff, 0x2c3, 0xbb, 0x3b, 0xcf, 0xe4, 0x231, 0x353, 0x3bd, 0x1c0, 0x166, 0x26c, 0x18, 0x317, 0x145, 0x1b4, 0x1b9, 0x92, 0x3af, 0x29b, 0x3d6, 0x36f, 0x215, 0x1ec, 0x2d4, 0x3c6, 0x175, 0x393, 0x333, 0x3fa, 0xdd, 0x3bf, 0x81, 0x250, 0x1b0, 0x33b, 0x2f7, 0x1e, 0xd4, 0x16, 0x1d9, 0xd5, 0x2b2, 0x42, 0x13b, 0x127, 0xb2, 0x392, 0x197, 0x261, 0x133, 0x2a, 0x71, 0xf9, 0x100, 0x1e8, 0x56, 0x1a3, 0x2c4, 0x1dc, 0x141, 0x265, 0x36b, 0x12e, 0x23f, 0x33a, 0xa6, 0x21d, 0x1c2, 0x4e, 0x161, 0x21f, 0x340, 0x8d, 0x3be, 0x43, 0x337, 0x2f0, 0x2f2, 0x70, 0xb3, 0x26c, 0x30, 0x47, 0x23a, 0x376, 0x345, 0xc1, 0x5d, 0x29f, 0x2a8, 0x21, 0x13b, 0x24e, 0x2c8, 0xaf, 0x146, 0xab, 0x4b, 0x12d, 0x1fc, 0x19c, 0x112, 0x16f, 0x38a, 0x109, 0x8b, 0x31, 0x106, 0x5f, 0x1d, 0x26b, 0x2fe, 0x367, 0x239, 0xb5, 0x1e3, 0x175, 0x32f, 0xd7, 0x3ef, 0x1cb, 0x315, 0x8, 0x21a, 0x30c, 0x36e, 0x162, 0x1dc, 0x1e6, 0x139, 0xcc, 0x20b, 0x270, 0x31a, 0xdc, 0x236, 0x61, 0x1cf, 0x218, 0x18e, 0x3ad, 0x3bd, 0x380, 0x191, 0x344, 0x180, 0x238, 0x1f4, 0x386, 0x21e, 0x201, 0x2e8, 0xd5, 0x16d, 0x108, 0x1ca, 0x254, 0x26d, 0x171, 0x222, 0x151, 0x258, 0x17a, 0x3fb, 0xfb, 0x82, 0x36a, 0x6f, 0x5a, 0x51, 0x188, 0x22, 0x2f8, 0x282, 0x186, 0x36e, 0x2c4, 0x379, 0x32b, 0x3b4, 0x1b6, 0x3e0, 0x23e, 0xff, 0x31e, 0x3a2, 0x2db, 0x2ab, 0x3cd, 0x26f, 0x3ef, 0x396, 0x4f, 0x40, 0x1e8, 0x158, 0x206, 0x4c, 0x3cf, 0x362, 0xe3, 0x143, 0x1ce, 0x2bb, 0x3b7, 0x239, 0x16a, 0x385, 0x3ba, 0x29c, 0x2d6, 0x20e, 0x71, 0x3e4, 0x24, 0x2ee, 0x2bd, 0xa0, 0x324, 0x21c, 0x106, 0xbe, 0x74, 0x37c, 0x3b3, 0x23, 0x37b, 0x226, 0xb8, 0x363, 0x261, 0xc5, 0x2a0, 0x7f, 0xce, 0x112, 0x2de, 0x233, 0x5a, 0xa2, 0x229, 0x110, 0x3d3, 0x13f, 0x28f, 0x123, 0xd2, 0x34f, 0xb2, 0x253, 0x146, 0x156, 0x12c, 0x17a, 0x3ff, 0x3ec, 0x19, 0x2c5, 0x1fb, 0x2ad, 0xda, 0x372, 0x99, 0x115, 0x34b, 0x2a8, 0x42, 0xe5, 0x254, 0xd3, 0x1cd, 0x134, 0x13d, 0x382, 0x22f, 0x207, 0x2ce, 0x249, 0xc, 0x227, 0x23a, 0x2e5, 0x10f, 0x201, 0x1d9, 0x354, 0x37a, 0x10d, 0x211, 0x346, 0x13, 0x3e3, 0x362, 0x1c6, 0x105, 0x26b, 0x3ea, 0x215, 0x37b, 0x45, 0x2e0, 0x32e, 0x251, 0x96, 0x17a, 0x3f7, 0x3ab, 0xc8, 0x3, 0x317, 0x23a, 0x1c3, 0x35, 0x2c, 0x1af, 0x24a, 0x30f, 0x2b4, 0x37, 0x236, 0x184, 0xcf, 0x329, 0x17b, 0x2fa, 0x1ba, 0x38e, 0x10, 0xf4, 0x158, 0x5, 0x130, 0x247, 0x245, 0x5f, 0x74, 0x2f1, 0x2d7, 0x118, 0x3d5, 0x59, 0x253, 0x28c, 0x151, 0x172, 0x38d, 0x307, 0x2ce, 0x9b, 0x30, 0x11c, 0x3e8, 0xf, 0x350, 0x2c0, 0x2c6, 0xe1, 0x9c, 0x31a, 0x370, 0x328, 0x76, 0xeb, 0x2fc, 0x39d, 0x3f3, 0x396, 0x9e, 0x100, 0x35b, 0x1ad, 0x50, 0x324, 0x31, 0x11, 0x1f9, 0x349, 0x343, 0x123, 0x1a4, 0x127, 0x199, 0x171, 0x9a, 0x13d, 0x30d, 0xae, 0x1c, 0xb3, 0x1a2, 0x300, 0x1e4, 0x2f7, 0xf0, 0x165, 0x53, 0x33, 0x20b, 0x1d2, 0x1cc, 0x365, 0x21a, 0x56, 0x206, 0x130, 0x87, 0x106, 0x2f8, 0x349, 0x28f, 0x85, 0x13b, 0x254, 0x34c, 0xef, 0x18b, 0x337, 0x3ad, 0x1d7, 0x1f8, 0x81, 0x141, 0x30c, 0x346, 0x26, 0x397, 0x326, 0x5f, 0xe8, 0x3d6, 0x295, 0x1a4, 0x24e, 0x26d, 0x39a, 0x1b2, 0x3e1, 0x2f0, 0x3bd, 0x3f, 0x91, 0xa9, 0x265, 0x36e, 0x302, 0x3f5, 0x362, 0x38c, 0x1d, 0x37c, 0x2d7, 0x230, 0x34f, 0x2c8, 0x171, 0x134, 0xfd, 0x5e, 0x2f2, 0x380, 0x93, 0x94, 0x2c9, 0x36b, 0x162, 0x2fb, 0x16e, 0x275, 0x286, 0x26b, 0x3dd, 0x46, 0x3ee, 0x59, 0xaf, 0x222, 0x29a, 0x30d, 0x15c, 0x70, 0x191, 0x216, 0xd8, 0x1ee, 0x12e, 0x1dc, 0x32b, 0x2cb, 0x356, 0x1ce, 0x2fe, 0x30e, 0x37b, 0x8a, 0x392, 0x146, 0x151, 0x2e4, 0x22f, 0xe, 0xb3, 0x344, 0x1b, 0x33b, 0x323, 0x23f, 0x1e6, 0x1da, 0x36c, 0x33f, 0x359, 0x367, 0x1ec, 0x113, 0x170, 0x3d, 0x158, 0x14, 0x324, 0xc4, 0x110, 0x2a7, 0x34b, 0x16d, 0xa4, 0x1e2, 0x340, 0xc2, 0x19e, 0x17e, 0x333, 0x3a7, 0x23c, 0x38b, 0x89, 0x36a, 0x2f9, 0x2a6, 0x376, 0x35, 0xb0, 0x2c6, 0x384, 0x1d2, 0x339, 0x235, 0x25e, 0x303, 0x3de, 0xcb, 0x4b, 0x2f4, 0x387, 0x195, 0xd1, 0x209, 0x33b, 0x24f, 0xee, 0x32b, 0x19f, 0x143, 0x26b, 0x3b3, 0x118, 0x34f, 0x199, 0x1cd, 0x1b2, 0x3cb, 0x3d2, 0x1d7, 0x3f0, 0x204, 0x21a, 0xac, 0xa, 0x192, 0x62, 0x88, 0x357, 0x3a1, 0x2b2, 0x52, 0xf1, 0x1a0, 0x61, 0xcf, 0xbf, 0x39d, 0x3d7, 0x11e, 0x3c1, 0x240, 0x1b5, 0x378, 0x153, 0x1bb, 0x21e, 0x58, 0x163, 0x1c2, 0xe9, 0x398, 0x31e, 0x12f, 0x385, 0x1ef, 0x261, 0x221, 0x17a, 0x3c7, 0x2ce, 0x26c, 0x300, 0x399, 0x323, 0x77, 0x391, 0x2cb, 0x2a5, 0x331, 0x3dd, 0x8c, 0x3a3, 0x2c8, 0x2e2, 0xd9, 0x3e1, 0x7a, 0x169, 0xa0, 0x22c, 0xb6, 0x99, 0x174, 0x14b, 0x30f, 0x18d, 0x1db, 0x1d1, 0x2f5, 0x37d, 0x334, 0x221, 0x2f4, 0x307, 0x25d, 0x281, 0xd8, 0x3b1, 0x2c4, 0x3f5, 0x193, 0xbe, 0x349, 0x22e, 0x42, 0x24b, 0x34, 0x11a, 0x263, 0xbf, 0x333, 0x347, 0xe2, 0x67, 0x82, 0x183, 0x317, 0x1f4, 0x3c, 0x2ca, 0x139, 0x1b6, 0x277, 0x2fe, 0x23, 0x3d5, 0x2c8, 0x1cd, 0x364, 0x337, 0x2af, 0x14f, 0x2e7, 0x20, 0x35b, 0x173, 0x2d, 0x119, 0x2ed, 0x304, 0x2d3, 0x13a, 0x138, 0x1cc, 0x31e, 0x25e, 0x20f, 0x363, 0x251, 0xb9, 0x22f, 0x38, 0x322, 0x94, 0x336, 0x2d5, 0x26, 0x247, 0x20c, 0x3ed, 0x1ea, 0x159, 0x52, 0x1e2, 0x289, 0x308, 0xeb, 0x3cd, 0x2b1, 0x2a, 0x7f, 0xfb, 0x64, 0xc, 0x238, 0x2f7, 0x389, 0x1e6, 0x361, 0x2a5, 0x26b, 0x36f, 0x69, 0x24e, 0x1a6, 0x1de, 0x43, 0x231, 0x15d, 0x1ba, 0xf4, 0x1ad, 0x109, 0x288, 0x2ed, 0x201, 0x35e, 0x1c2, 0x3a4, 0x1fe, 0x239, 0x113, 0x392, 0x222, 0xfd, 0x2f0, 0x1d7, 0x3db, 0x8, 0x3a9, 0x173, 0x5a, 0x6d, 0x345, 0x2c, 0x2c6, 0x20b, 0x11f, 0x3eb, 0x1ec, 0x8a, 0xaf, 0x134, 0x3e1, 0x3ad, 0x2a3, 0x2e7, 0x40, 0x177, 0x38a, 0x2d0, 0x368, 0x21e, 0x160, 0x21d, 0x7c, 0xea, 0x367, 0x37b, 0x59, 0x171, 0x1b2, 0x337, 0x157, 0x135, 0x315, 0x200, 0x3aa, 0x6f, 0x2ad, 0x376, 0xd4, 0x312, 0xcc, 0x3e0, 0x359, 0x30e, 0x3ee, 0x2c8, 0x39a, 0x18b, 0x18e, 0x2aa, 0x1ba, 0x9e, 0x24, 0x16f, 0x378, 0x145, 0x386, 0x2a9, 0xa6, 0x269, 0x33f, 0x2fe, 0x46, 0x34f, 0x26d, 0xef, 0x43, 0x6b, 0x17d, 0x1cb, 0xf9, 0x120, 0x36a, 0x3f6, 0x23a, 0xf, 0x165, 0x139, 0x36c, 0x1ce, 0x3dd, 0x230, 0x24e, 0x34c, 0x371, 0x218, 0x358, 0x3fa, 0x243, 0x3c1, 0x112, 0x1e8, 0x2bd, 0x5a, 0xda, 0x10f, 0x160, 0x33, 0x1f0, 0x359, 0x215, 0x3a3, 0x26d, 0x1de, 0x10c, 0x358, 0x3fd, 0x11e, 0x237, 0x104, 0x3, 0x238, 0x3ce, 0xee, 0x16e, 0x311, 0x3a0, 0x55, 0x210, 0x1e2, 0x236, 0xec, 0x2be, 0x262, 0x314, 0x1e1, 0xe, 0x322, 0x250, 0x30c, 0x5, 0x241, 0x5b, 0x132, 0x3b2, 0x13a, 0xe9, 0xff, 0x239, 0x226, 0x253, 0x134, 0x3cb, 0x2af, 0x135, 0x223, 0x12, 0x16f, 0x2f9, 0x11d, 0xf, 0x2ca, 0xed, 0x356, 0xdf, 0x34e, 0x13b, 0x101, 0x242, 0x263, 0x2fc, 0x35c, 0x54, 0x3f8, 0x35f, 0x26c, 0x36, 0x3b1, 0x302, 0x327, 0x11, 0x357, 0x137, 0x1f3, 0x161, 0x1db, 0x34d, 0x303, 0x2cf, 0x2ac, 0x30d, 0x1ed, 0xfc, 0x1, 0x1e8, 0x2bd, 0x5a, 0xda, 0x10f, 0x160, 0x33, 0x1f0, 0x359, 0x215, 0x3a3, 0x26d, 0x1de, 0x10c, 0x358, 0x3fd, 0x11e, 0x237, 0x104, 0x3, 0x238, 0x3d0, 0x2e6, 0x2d0, 0x1bb, 0x1a8, 0xa6, 0x1b6, 0x39c, 0x2d7, 0x299, 0x101, 0x8d, 0x19e, 0x3cd, 0x1a5, 0x292, 0x3c7, 0xb3, 0x4a, 0xc3, 0x206, 0x241, 0xb6, 0xc1, 0x1af, 0x384, 0x11f, 0x3b7, 0x2ff, 0x2c8, 0x273, 0x86, 0x358, 0x3f3, 0x71, 0x19c, 0x64, 0x60, 0x33b, 0xb1, 0x3e3, 0x106, 0x3af, 0x137, 0x3e6, 0x18d, 0x2c3, 0xb5, 0xb8, 0x28c, 0xfd, 0x3d2, 0x14f, 0x315, 0x12, 0x2de, 0x3f6, 0xfa, 0xf0, 0x1e6, 0x33e, 0x3a, 0x28f, 0x84, 0xf1, 0x236, 0x1d8, 0x2ea, 0x334, 0x12c, 0x57, 0x380, 0x244, 0x3d, 0x1ad, 0x2d, 0xda, 0x21e, 0x189, 0x198, 0x33f, 0x3ea, 0x69, 0x254, 0x14a, 0x39e, 0x17e, 0x35c, 0xa8, 0x3fb, 0x2ce, 0x281, 0x2c9, 0x1a3, 0x260, 0x188, 0x248, 0x1d9, 0x13a, 0x1d2, 0x3fc, 0x1ec, 0x228, 0x2e2, 0x18b, 0x231, 0x2fa, 0x243, 0x31f, 0x104, 0x6, 0xf2, 0x24f, 0x2fb, 0x3a9, 0x38a, 0x2ad, 0x386, 0x165, 0x1da, 0x286, 0x3d6, 0x21, 0x27c, 0x236, 0x3b0, 0x3ba, 0x196, 0x2e4, 0x2f2, 0x1f8, 0x8, 0x177, 0x6f, 0x145, 0xf, 0x33a, 0x2cb, 0x1d, 0x28f, 0x108, 0x3c4, 0x194, 0x1bf, 0x1ef, 0xab, 0x30d, 0x3bd, 0x3db, 0x40, 0x3aa, 0x378, 0x23a, 0x78, 0x1e6, 0x275, 0xe8, 0x55, 0x52, 0x21f, 0xbb, 0x1e3, 0x363, 0x151, 0x5e, 0x1d7, 0x2e7, 0x200, 0x16f, 0x3f6, 0x1f4, 0x3c0, 0x32b, 0x38c, 0x349, 0x2a8, 0x290, 0xdc, 0x1d1, 0x303, 0x32e, 0x29a, 0x2f0, 0x2a3, 0x315, 0x24, 0x36a, 0x38f, 0x3bb, 0x23f, 0x16e, 0x5f, 0x27e, 0x16d, 0xad, 0x2e9, 0x293, 0x2e, 0x146, 0xfd, 0x3ad, 0x135, 0x9e, 0x120, 0x366, 0x47, 0x1e7, 0x1dc, 0x362, 0x2f8, 0x3d4, 0x37a, 0x161, 0x365, 0xb5, 0x170, 0x222, 0x3e1, 0x157, 0x1ba, 0xf9, 0x112, 0x306, 0x238, 0x323, 0x2fb, 0x326, 0x3ed, 0x35b, 0x233, 0x145, 0x1e, 0xf3, 0x275, 0x1d0, 0x154, 0x290, 0x1b8, 0x34d, 0x2e, 0x28c, 0x3f4, 0x157, 0x374, 0x3e4, 0x82, 0xc, 0x399, 0x162, 0x327, 0x88, 0x5d, 0x24a, 0x1d2, 0x3eb, 0x2ff, 0x332, 0x371, 0x1c8, 0x26f, 0x54, 0x3ff, 0x25d, 0x94, 0x211, 0x50, 0x288, 0x283, 0x189, 0x269, 0x39c, 0x34e, 0x1ca, 0xd0, 0x3b, 0x175, 0x261, 0x172, 0x2f2, 0x3f0, 0x20, 0x3aa, 0x2f9, 0xfa, 0x3c0, 0x25f, 0x22b, 0x27e, 0x2da, 0x2b4, 0x365, 0x16a, 0x1c9, 0x134, 0x267, 0x2ba, 0x243, 0x67, 0x64, 0x180, 0x3dc, 0x13, 0x31, 0x124, 0x3b2, 0x1c2, 0x23e, 0x187, 0x34f, 0x291, 0x2e3, 0x17e, 0x16b, 0x292, 0x307, 0x322, 0x2a4, 0x2b0, 0x212, 0x1b4, 0xd4, 0x14c, 0x1ab, 0x37c, 0x10a, 0x13e, 0x236, 0x369, 0x2f3, 0xab, 0x213, 0x2ef, 0x2e7, 0x9, 0x1b5, 0x38f, 0x37f, 0xee, 0x362, 0x1f9, 0x34b, 0x3e6, 0x2bf, 0xde, 0x23a, 0x1e0, 0x25f, 0x5f, 0x1ea, 0x2fd, 0x31a, 0x63, 0x226, 0x171, 0x225, 0x2b9, 0x347, 0xfe, 0x167, 0x216, 0x186, 0x28, 0x288, 0x10f, 0x22d, 0x36c, 0x1be, 0x10a, 0x27c, 0xca, 0x37e, 0x363, 0x14d, 0x1e9, 0x135, 0x278, 0x224, 0x6, 0x399, 0x2c4, 0x87, 0x49, 0x1d9, 0x1c2, 0x75, 0x215, 0x24e, 0x14a, 0xcf, 0x32f, 0xc5, 0x38d, 0x380, 0x204, 0x35b, 0x6f, 0x11d, 0xf0, 0x32b, 0x22b, 0xf5, 0x37a, 0x18d, 0x235, 0x113, 0x2bc, 0x316, 0x358, 0x3a7, 0x7f, 0x2b7, 0x10b, 0xc3, 0x14, 0x144, 0x283, 0x312, 0x1b6, 0xdf, 0x85, 0x13e, 0x65, 0x1bf, 0x3b5, 0x2a2, 0x2f0, 0x29e, 0x13c, 0x112, 0x3, 0x3c8, 0x162, 0x247, 0x220, 0x2e8, 0xe1, 0x23e, 0x30e, 0x127, 0xa5, 0x263, 0x393, 0x266, 0x3c2, 0x1c0, 0x102, 0x3a9, 0x233, 0x28a, 0x78, 0x391, 0x311, 0x27e, 0x1bd, 0x2c2, 0x31e, 0x177, 0x378, 0x1f4, 0x23f, 0x362, 0x3ed, 0xd5, 0x4e, 0x1fe, 0x37b, 0x26d, 0x3be, 0x17e, 0x1a5, 0x17a, 0x70, 0x81, 0x3a9, 0x6f, 0x23a, 0x3c0, 0x16e, 0x2f8, 0x29f, 0x30f, 0x339, 0x1ec, 0x2c8, 0x371, 0x329, 0x2b1, 0x12d, 0xe, 0x91, 0xf4, 0x38a, 0x145, 0x78, 0x32b, 0x5f, 0x3d4, 0x3e6, 0xe6, 0x239, 0x59, 0xef, 0xe4, 0xd7, 0x2a0, 0x307, 0x93, 0x21a, 0x173, 0x2ad, 0xf, 0x1e6, 0x38c, 0x27e, 0x37a, 0x31a, 0xc6, 0x8a, 0x39a, 0x218, 0x39d, 0x54, 0x3e7, 0x191, 0x141, 0x1ad, 0x2d0, 0x386, 0x33a, 0x275, 0x349, 0x16d, 0x161, 0x31e, 0x113, 0x171, 0x43, 0x2f6, 0x20e, 0x3fb, 0xb3, 0xa9, 0x2b0, 0x5a, 0x376, 0x165, 0x2cb, 0xe8, 0x2a8, 0xad, 0x365, 0x1a1, 0xaf, 0x18b, 0x358, 0x347, 0x1fc, 0x195, 0x94, 0x56, 0x109, 0x368, 0x2a9, 0x1da, 0x1d, 0x55, 0x290, 0x2e9, 0xb5, 0x392, 0x2ee, 0x1fb, 0x3bb, 0x3b8, 0x83, 0x28e, 0x24a, 0x28b, 0x30e, 0x95, 0x242, 0x1d6, 0xcd, 0x172, 0x3bd, 0x1c7, 0x90, 0x306, 0x3c8, 0x181, 0x31, 0x132, 0x163, 0x3e0, 0x3b3, 0xe5, 0x340, 0x369, 0x3b5, 0x29a, 0x353, 0x2e1, 0x237, 0x190, 0x6c, 0x346, 0x116, 0x3a6, 0x312, 0x2d1, 0x1eb, 0x108, 0x37, 0x34d, 0x170, 0x268, 0x231, 0x3ef, 0x7f, 0x2ce, 0x94, 0xac, 0x2d, 0x376, 0x2ca, 0x33e, 0x349, 0x2da, 0x18d, 0xc6, 0x114, 0x273, 0xe4, 0x1ae, 0x292, 0xe, 0x122, 0x3d0, 0x6f, 0x7d, 0x31b, 0x362, 0x3d3, 0x354, 0x270, 0x3df, 0x3a3, 0x256, 0xcf, 0xa7, 0x4b, 0x2b8, 0x3e9, 0x200, 0x2dd, 0x11c, 0x12e, 0x327, 0x49, 0x36d, 0x1f, 0x17f, 0x1a4, 0x1a, 0x3b, 0x3ba, 0x156, 0x178, 0x135, 0x1f2, 0x208, 0x180, 0x2df, 0xc9, 0x2d8, 0x58, 0x330, 0x26b, 0x10a, 0x1e2, 0xbb, 0x20f, 0x111, 0x337, 0x1d5, 0x3e5, 0x1e7, 0x3fe, 0x44, 0x2e8, 0x301, 0x2bb, 0x1a4, 0x34, 0xec, 0x1ef, 0x14d, 0x353, 0x1cb, 0xce, 0x9b, 0x2c9, 0xa, 0x119, 0xd4, 0xed, 0x3a, 0x2a8, 0x2b4, 0x235, 0x8a, 0x273, 0x1c8, 0x2b1, 0xbd, 0xe0, 0x1, 0x1d5, 0x3e5, 0x1e7, 0x3fe, 0x44, 0x2e8, 0x301, 0x2bb, 0x1a4, 0x34, 0xec, 0x1ef, 0x14d, 0x353, 0x1cb, 0xce, 0x9b, 0x2c9, 0xa, 0x119, 0xd4, 0xed, 0x3a, 0x2a8, 0x2b4, 0x235, 0x8a, 0x273, 0x1c8, 0x2b1, 0xbd, 0xe0, 0x1, 0x1d5, 0x3e5, 0x1e7, 0x3fe, 0x44, 0x2e8, 0x301, 0x2bb, 0x1a4, 0x34, 0xec, 0x1ef, 0x14d, 0x353, 0x1cb, 0xce, 0x9b, 0x2c9, 0xa, 0x119, 0xd4, 0xed, 0x3a, 0x2a8, 0x2b4, 0x235, 0x8a, 0x273, 0x1c8, 0x2b1, 0xbd, 0xe0, 0x1, 0x1d5, 0x3e5, 0x1e7, 0x3fe, 0x44, 0x2e8, 0x301, 0x2bb, 0x1a4, 0x34, 0xec, 0x1ef, 0x14d, 0x353, 0x1cb, 0x3aa, 0x38f, 0x323, 0x397, 0x92, 0x35e, 0x3e0, 0x2d7, 0x24b, 0x194, 0x303, 0x222, 0x18e, 0x3ef, 0x1fc, 0xb3, 0x141, 0x173, 0x145, 0x3c0, 0x362, 0x357, 0x125, 0x11f, 0x46, 0x284, 0x308, 0x3ba, 0x151, 0x3ad, 0x1cb, 0x19c, 0x26c, 0x265, 0xa0, 0x368, 0x165, 0x275, 0x27e, 0x3e6, 0x339, 0x37b, 0x34c, 0x263, 0x14e, 0x258, 0x3bd, 0x315, 0x112, 0x30, 0x36b, 0x192, 0x2ed, 0x312, 0x356, 0x28f, 0x290, 0x365, 0x113, 0x39a, 0xe4, 0x2b1, 0x17a, 0x380, 0x8, 0x16f, 0x47, 0x12e, 0x87, 0x99, 0x2c6, 0x33f, 0x295, 0x27c, 0xbb, 0x2e, 0x134, 0x6b, 0x347, 0x3fb, 0x191, 0x21a, 0x38a, 0x23a, 0x23f, 0x326, 0x28e, 0x13a, 0xea, 0x230, 0xd, 0x76, 0x1ef, 0x29a, 0x157, 0x243, 0xfb, 0x344, 0x30c, 0x109, 0x376, 0x33a, 0x38c, 0x3d4, 0x30f, 0x1fe, 0x3ee, 0x256, 0x33c, 0x262, 0x2e4, 0x1d7, 0x9e, 0x82, 0x35d, 0x227, 0x12e, 0x10e, 0x264, 0x21d, 0x39c, 0x214, 0x21f, 0x12f, 0x253, 0x43, 0x333, 0x292, 0x70, 0x2, 0x2b3, 0x47, 0x25c, 0x21c, 0xc1, 0x33, 0x331, 0x21, 0x37, 0x25e, 0xaf, 0x86, 0x26f, 0x12d, 0xe0, 0x4, 0x16f, 0x8e, 0xb1, 0x31, 0x182, 0x66, 0x26b, 0x42, 0x6e, 0xb5, 0x15e, 0x10c, 0xd7, 0x25a, 0x1c0, 0x8, 0x2de, 0x11c, 0x162, 0x62, 0x304, 0xcc, 0xdf, 0x84, 0xdc, 0x16a, 0x2bc, 0x218, 0x1ae, 0xbd, 0x380, 0x10, 0x1b5, 0x238, 0x2c4, 0xc4, 0x201, 0x198, 0x1be, 0x108, 0x1b8, 0x2d4, 0x171, 0x39, 0x35c, 0x17a, 0x309, 0x20, 0x36a, 0x79, 0x181, 0x188, 0xb, 0x330, 0x37c, 0x210, 0x370, 0x1a1, 0x2e2, 0x72, 0x2b1, 0x2f4, 0x21b, 0x40, 0x2dd, 0xf2, 0x302, 0x310, 0x16, 0x269, 0x2f1, 0x29, 0x2e9, 0x342, 0x1cd, 0xe4, 0x16b, 0x1e1, 0x3f, 0x80, 0x1b3, 0x1e4, 0x2b3, 0x8e, 0x162, 0xc4, 0xb, 0x269, 0x1eb, 0xa4, 0x365, 0x45, 0x1de, 0x17e, 0xc5, 0x2b8, 0x2e7, 0x89, 0x60, 0x36e, 0x22c, 0x35, 0x1da, 0x3a0, 0x2fd, 0x339, 0x1f7, 0xa5, 0x1d6, 0xcb, 0xbc, 0x1ba, 0xce, 0xd1, 0x30c, 0x2d, 0x305, 0x32b, 0x3f2, 0x14b, 0x11f, 0x118, 0x1a, 0x3b0, 0x197, 0x3cb, 0x3fa, 0xfe, 0x166, 0x21a, 0x233, 0x3e8, 0x2fb, 0x88, 0x2d3, 0x3e0, 0x34e, 0xf1, 0x1d1, 0x1c9, 0x316, 0x39d, 0x292, 0xe0, 0x8, 0x1b5, 0x79, 0x302, 0x229, 0x58, 0x36c, 0x343, 0x129, 0x31e, 0x228, 0x2eb, 0x3e2, 0x221, 0x1ed, 0x315, 0x41, 0x300, 0x346, 0x144, 0x1a8, 0x2cb, 0x13f, 0x3c5, 0x1fe, 0x3a3, 0x121, 0x2ab, 0x251, 0x1e9, 0x1cb, 0x279, 0x281, 0x56, 0x168, 0x1e, 0x16e, 0x3af, 0x24a, 0xea, 0xd2, 0xd0, 0x1bf, 0xa3, 0x267, 0x3ef, 0x3f9, 0x322, 0xf4, 0x1bc, 0x37f, 0x3f5, 0x16f, 0x238, 0x302, 0x5b, 0x160, 0x356, 0x55, 0x161, 0x239, 0x26d, 0x263, 0x262, 0x30d, 0x135, 0x237, 0x26c, 0x30c, 0x5a, 0xf, 0x16e, 0x357, 0x13a, 0x359, 0x13b, 0x236, 0x303, 0x134, 0x358, 0x54, 0xe, 0x1, 0x16f, 0x238, 0x302, 0x5b, 0x160, 0x356, 0x55, 0x161, 0x239, 0x26d, 0x263, 0x262, 0x30d, 0x135, 0x237, 0x26c, 0x30c, 0x5a, 0xf, 0x16e, 0x357, 0x13a, 0x359, 0x13b, 0x236, 0x303, 0x134, 0x358, 0x54, 0xe, 0x1, 0x16f, 0x238, 0x302, 0x5b, 0x160, 0x356, 0x55, 0x161, 0x239, 0x26d, 0x263, 0x262, 0x30d, 0x135, 0x237, 0x26c, 0x30c, 0x5a, 0xf, 0x16e, 0x357, 0x13a, 0x359, 0x13b, 0x236, 0x303, 0x134, 0x358, 0x54, 0xe, 0x1, 0x16f, 0x238, 0x302, 0x5b, 0x160, 0x356, 0x55, 0x161, 0x239, 0x26d, 0x263, 0x262, 0x30d, 0x135, 0x237, 0x26c, 0x30c, 0x5a, 0xf, 0x16e, 0x357, 0x2de, 0xf2, 0x26, 0x1b9, 0x53, 0x1d, 0x2da, 0x398, 0x3ee, 0x121, 0x2be, 0x151, 0x2ae, 0xe2, 0x195, 0x282, 0x233, 0x3bb, 0x3e3, 0x248, 0x21d, 0xdf, 0x29, 0x365, 0x114, 0x1df, 0x32f, 0xb9, 0x355, 0x3c1, 0x9b, 0x186, 0x5a, 0x1e, 0x1b1, 0x28e, 0x384, 0x3ea, 0x24b, 0x176, 0x1c9, 0x43, 0x1ae, 0x1e1, 0x1f8, 0x48, 0x18, 0x36e, 0xa2, 0x350, 0x275, 0x3a1, 0x138, 0x30e, 0x101, 0x1d8, 0x32e, 0x267, 0x3a7, 0x3e7, 0x122, 0x1d5, 0x47, 0x2c4, 0x229, 0x160, 0x2a5, 0x154, 0x31a, 0x3d8, 0x12b, 0x1d6, 0x32c, 0x3d2, 0x243, 0x3ab, 0x250, 0x173, 0x7d, 0x379, 0x110, 0x2b5, 0xe7, 0x21, 0x1b8, 0x28d, 0xef, 0x2fc, 0x221, 0x3bd, 0x13c, 0x64, 0x2c9, 0x140, 0x1c3, 0x32b, 0x3d3, 0x9d, 0x359, 0x276, 0xca, 0x2e, 0x364, 0x3ca, 0x12d, 0x309, 0x100, 0x306, 0x3dc, 0x241, 0x21e, 0x3b4, 0x13f, 0x30f, 0x1b5, 0x3c8, 0x130, 0x3a6, 0x272, 0x349, 0x383, 0x3df, 0x254, 0x3b, 0x2cf, 0x337, 0x3a7, 0x3c7, 0x81, 0x2b3, 0x79, 0x26, 0x372, 0x14c, 0xe8, 0x1f3, 0x3fc, 0x24e, 0x184, 0x3de, 0x3e1, 0x3f3, 0x3ff, 0x91, 0x1d5, 0x8e, 0x302, 0x16c, 0x22d, 0x1d, 0x1bd, 0x27b, 0x34f, 0x234, 0x37d, 0xfd, 0x1fd, 0x3f8, 0x93, 0x2bf, 0x317, 0x162, 0x229, 0x2c0, 0x286, 0x2b2, 0x1cc, 0x3ee, 0x242, 0x2ea, 0x29a, 0x2ba, 0x7f, 0x191, 0x3d0, 0x3e5, 0x12e, 0xc4, 0x58, 0x356, 0x154, 0x23d, 0x37b, 0x14a, 0x15f, 0x151, 0x155, 0x388, 0xb3, 0x7a, 0x2f9, 0x323, 0x21c, 0xb, 0x36c, 0x22e, 0x2c2, 0x1ec, 0x12b, 0x3ac, 0xab, 0x2af, 0x71, 0x195, 0x10d, 0xde, 0x1e7, 0x247, 0x182, 0x269, 0x343, 0x15a, 0x239, 0x1a6, 0x271, 0x196, 0x3d2, 0x8f, 0x2b7, 0x2a4, 0x31d, 0x3bb, 0x3cf, 0x132, 0xcc, 0x1eb, 0x129, 0xc6, 0x36a, 0x33b, 0x192, 0x21e, 0x2cb, 0x3d4, 0x270, 0x46, 0x68, 0x1e3, 0x134, 0x2f6, 0x12d, 0x3f, 0x24, 0x30, 0x346, 0x6d, 0x33a, 0x2f8, 0x125, 0x359, 0x1ca, 0xbb, 0x392, 0x218, 0x1a5, 0x15c, 0x315, 0x19, 0x2c9, 0x109, 0xf, 0x362, 0x5d, 0x7c, 0x295, 0x21f, 0x1a1, 0xef, 0x3e2, 0x258, 0x2a3, 0x237, 0x344, 0x2b0, 0x145, 0x1dc, 0x110, 0x2c6, 0x26b, 0x52, 0x31e, 0x2c8, 0x263, 0x334, 0x2f0, 0x243, 0x2b7, 0x141, 0x6f, 0x1e7, 0x87, 0x201, 0x36c, 0x55, 0x31a, 0x37b, 0x294, 0x175, 0x29a, 0x17d, 0x1fc, 0x93, 0x177, 0x47, 0x302, 0x2d8, 0xa6, 0xe8, 0x3e6, 0x3eb, 0x254, 0x76, 0x32e, 0x18e, 0x20e, 0xe, 0x8, 0x366, 0x1ee, 0x8b, 0xd4, 0x275, 0x29f, 0x3a4, 0x230, 0x340, 0x303, 0x1b2, 0x39d, 0x17a, 0x1f8, 0x120, 0x180, 0x206, 0x368, 0x1e6, 0x3ed, 0x13a, 0x2fe, 0x24b, 0x1d1, 0xaf, 0x2dd, 0xf7, 0x8b, 0x1a8, 0x1c6, 0xd5, 0x23e, 0x299, 0x194, 0x2e0, 0x10c, 0x1a5, 0x2b8, 0x4f, 0xc8, 0xc3, 0x168, 0x3c0, 0x20c, 0x1af, 0x1ce, 0x210, 0x18f, 0x2c8, 0xcf, 0xcb, 0x3ad, 0x71, 0x25d, 0xf4, 0x3e5, 0xb1, 0x5b, 0x22d, 0x74, 0x3e6, 0x3df, 0x142, 0x3b0, 0x28c, 0x1ac, 0x2a0, 0x309, 0x12, 0x30, 0x285, 0x1b4, 0x1e6, 0x3d3, 0xe1, 0x3dd, 0xf1, 0x25e, 0x39a, 0x2fc, 0x12c, 0x2a3, 0x67, 0x10b, 0x1ad, 0x7d, 0x3fe, 0x99, 0x198, 0x343, 0x161, 0x3d8, 0x14a, 0x175, 0x13d, 0x1fd, 0x3fb, 0x122, 0x2b3, 0x1e4, 0x260, 0x10f, 0x2cb, 0x3a1, 0x1d2, 0x230, 0x289, 0x17, 0x18b, 0x1ae, 0x313, 0x2e7, 0x104, 0x360, 0x109, 0x1e, 0x193, 0x2e8, 0x3c9, 0x214, 0x2e9, 0x114, 0x2e3, 0x262, 0xbc, 0x325, 0x2b7, 0x282, 0x1bc, 0x323, 0x62, 0xb0, 0x286, 0x2da, 0xff, 0x24e, 0x219, 0x197, 0x18e, 0x1b3, 0x3dc, 0x51, 0x2b6, 0xbe, 0x125, 0x17f, 0x9f, 0x293, 0x1cd, 0x2fc, 0x258, 0x29e, 0x338, 0x94, 0x1c5, 0x37f, 0x87, 0x16, 0x2a5, 0x16d, 0xff, 0x95, 0x76, 0xa3, 0xd6, 0x2a0, 0x21b, 0x48, 0x180, 0xa, 0x2e5, 0x16e, 0x22a, 0xf8, 0x85, 0x370, 0x114, 0x1cf, 0x19a, 0x1e9, 0x23c, 0x25d, 0x1e8, 0x38f, 0x181, 0x1b9, 0x139, 0x13f, 0x9c, 0x46, 0x1a0, 0x20f, 0x18b, 0x35c, 0x57, 0x315, 0x64, 0xc3, 0x2d0, 0x31b, 0x44, 0x2c6, 0x1be, 0x129, 0x239, 0x12b, 0x15f, 0x29a, 0x1fd, 0x3ff, 0x81, 0x1b5, 0x27f, 0x8b, 0x350, 0x311, 0x2a1, 0x3a8, 0x394, 0x1d1, 0x2bc, 0x25b, 0x4b, 0x355, 0x67, 0x216, 0x2bd, 0x3e8, 0x397, 0x304, 0x2d1, 0x2a8, 0x398, 0x297, 0x308, 0x197, 0x31c, 0x54, 0x1c0, 0x9, 0x30, 0x103, 0x2d9, 0x32b, 0x147, 0x1f, 0x295, 0x6e, 0x226, 0x3be, 0x131, 0xbc, 0x243, 0x366, 0x36b, 0x288, 0x33a, 0x3ed, 0x1c2, 0x2d7, 0x21f, 0x113, 0x3be, 0x262, 0x2f0, 0x23c, 0xb3, 0x3a9, 0x47, 0x26, 0x345, 0x2cb, 0x29f, 0x11f, 0x13b, 0xbb, 0xaf, 0x329, 0x4b, 0x2a3, 0x19c, 0x94, 0x38a, 0x1e7, 0x31, 0x160, 0x1d, 0x3e6, 0x367, 0xd, 0x1e3, 0x1b2, 0xd7, 0x22f, 0x315, 0xc8, 0x30c, 0x2ad, 0x1dc, 0x92, 0xcc, 0x28f, 0x31a, 0x3ee, 0x61, 0x363, 0x18e, 0x54, 0x380, 0x24, 0x180, 0x14, 0x386, 0x362, 0x2e8, 0x33f, 0x108, 0x31e, 0x26d, 0x1d6, 0x151, 0x17d, 0x3fb, 0x81, 0x36a, 0x1ee, 0x51, 0x165, 0x2f8, 0x13a, 0x3dd, 0x3c4, 0x1a1, 0x371, 0x14e, 0x5e, 0x243, 0x195, 0xf4, 0x38f, 0x302, 0x2ed, 0x1da, 0x3d4, 0x3a4, 0x1a4, 0x194, 0x392, 0xe4, 0x18a, 0x1d7, 0x237, 0x216, 0x173, 0x3bb, 0x87, 0x2c, 0x286, 0x37a, 0x3eb, 0x284, 0x1bf, 0x134, 0x39d, 0x3c2, 0x2e7, 0x19, 0x2c5, 0x1b7, 0x6d, 0x3cc, 0x147, 0x7c, 0x10a, 0x3b6, 0x2c8, 0x271, 0x2ac, 0x17d, 0x3ff, 0x204, 0x366, 0x2df, 0x232, 0x1e6, 0x2a7, 0x3e, 0x85, 0x1db, 0x164, 0x33c, 0x156, 0x2ba, 0x3fb, 0x102, 0x1b3, 0x36b, 0x119, 0xf3, 0x357, 0x1f, 0x246, 0x2e9, 0xb2, 0x19e, 0xab, 0x15d, 0x3f9, 0x81, 0x2dd, 0x3b1, 0x288, 0x27d, 0x3af, 0x20b, 0x123, 0x370, 0x59, 0xcf, 0x251, 0x2aa, 0x3f8, 0x244, 0x36a, 0x3dc, 0x144, 0x33a, 0x3d3, 0x301, 0x295, 0x1b8, 0x228, 0x263, 0x32c, 0x155, 0x1fc, 0x122, 0x1b5, 0x1ee, 0xa2, 0x19d, 0x3ed, 0x384, 0x34e, 0xdc, 0x114, 0x335, 0x196, 0x2ae, 0xfe, 0x91, 0x2de, 0xf7, 0x51, 0x2ca, 0x3f2, 0x1c2, 0x1a7, 0x6e, 0x8a, 0x39e, 0xcb, 0x157, 0x7f, 0x24c, 0x16f, 0x27f, 0x22c, 0x165, 0x1f9, 0xe1, 0x2d7, 0x37, 0x45, 0x1cf, 0x261, 0x2af, 0x23b, 0x126, 0x2b3, 0x33b, 0x183, 0x2d5, 0x368, 0xb7, 0xba, 0x33f, 0x29, 0x18c, 0x256, 0x1dd, 0x3cb, 0x20e, 0x1c0, 0x48, 0x1b, 0x280, 0xf0, 0x22, 0x30a, 0x3a5, 0x31a, 0x3a3, 0x219, 0x146, 0x17b, 0x2f4, 0x2e7, 0x64, 0x211, 0x145, 0x3fe, 0x182, 0x356, 0x1bd, 0x3df, 0xd, 0x385, 0x316, 0x1a5, 0x3da, 0x38b, 0x216, 0x1c5, 0x3ce, 0x188, 0x53, 0x29b, 0x270, 0xd2, 0x328, 0xaf, 0xbf, 0xb9, 0x1ba, 0x35f, 0x3d, 0x38f, 0x13, 0x283, 0x275, 0x354, 0x2bb, 0x27c, 0x2d4, 0x2eb, 0x262, 0x3d2, 0x388, 0x93, 0x2b3, 0x27f, 0x51, 0x19d, 0x3d3, 0x20b, 0x246, 0x1db, 0x2c8, 0xeb, 0x2a2, 0x3fa, 0x387, 0x10, 0x6, 0x103, 0x2e5, 0x362, 0x3b2, 0x39c, 0x290, 0xf6, 0x121, 0x1ef, 0xc7, 0xa8, 0x3f, 0x89, 0x1b0, 0x5a, 0x31b, 0x220, 0xcc, 0x22e, 0x1cc, 0x24e, 0x1d8, 0x4d, 0x39d, 0x313, 0x223, 0x249, 0x158, 0x7d, 0x397, 0x306, 0x346, 0x376, 0x362, 0x36d, 0x26b, 0xad, 0x37b, 0x61, 0x32e, 0x358, 0x17a, 0x2e7, 0xc8, 0x56, 0x23a, 0x397, 0x2c, 0x1d, 0x30f, 0x46, 0x236, 0x392, 0x329, 0x258, 0x1ba, 0x2b7, 0xf4, 0x47, 0x130, 0xd4, 0x5f, 0x13a, 0x2d7, 0xdc, 0x59, 0x33c, 0x151, 0x3fa, 0x307, 0x40, 0x30, 0x14, 0xf, 0x106, 0x2c6, 0x3d6, 0x31a, 0x34f, 0x76, 0x222, 0x39d, 0x22f, 0x9e, 0x26c, 0x1ad, 0x3bb, 0x31, 0x312, 0x349, 0x270, 0x1a4, 0xbb, 0x171, 0x3e2, 0x30d, 0x243, 0xb3, 0x177, 0x1e4, 0x8b, 0x165, 0x3ed, 0x20b, 0x85, 0x365, 0x26d, 0x2ab, 0xfd, 0x347, 0x70, 0x24, 0x1b, 0x109, 0x3c0, 0x110, 0xcc, 0x55, 0x339, 0x254, 0x1bf, 0x1b2, 0x2b1, 0x2f2, 0x3c1, 0x216, 0x38a, 0x323, 0x5b, 0x139, 0x3d4, 0x11f, 0x1ca, 0x293, 0xef, 0x14e, 0x2f0, 0x1c4, 0x93, 0x16f, 0x1ee, 0x288, 0x1e6, 0x28e, 0x205, 0x103, 0x386, 0x245, 0x163, 0x3d6, 0x23d, 0x127, 0x3b0, 0x268, 0x35c, 0x2f2, 0x38b, 0x4a, 0x6f, 0x25c, 0x372, 0x2cb, 0x1aa, 0x17f, 0x3c4, 0x226, 0x335, 0xab, 0x2fa, 0x387, 0x40, 0x60, 0x50, 0x78, 0x44, 0x66, 0x55, 0x27b, 0x142, 0x1e3, 0x316, 0x29d, 0x1d7, 0x338, 0x2a4, 0x3f6, 0x20d, 0x10f, 0x38c, 0x24a, 0x36f, 0xdc, 0xb2, 0xeb, 0x29a, 0x3d7, 0x38, 0x24, 0x36, 0x2d, 0x23f, 0x124, 0x1b6, 0x16d, 0x3df, 0x34, 0x2e, 0x39, 0x221, 0x135, 0x3ab, 0x7a, 0x47, 0x260, 0x350, 0x2f8, 0x384, 0x246, 0x365, 0xd3, 0x2be, 0x3e1, 0x15, 0x21b, 0x112, 0x19b, 0x352, 0x2fb, 0x182, 0x143, 0x3e6, 0x215, 0x11b, 0x392, 0x25b, 0x172, 0x1cb, 0x32a, 0x2bf, 0x1e4, 0x116, 0x19d, 0x357, 0xf8, 0x84, 0xc6, 0xa5, 0x2f3, 0x18e, 0x149, 0x3e9, 0x19, 0x211, 0x11d, 0x397, 0x58, 0x74, 0x4e, 0x3, 0x5, 0xf, 0x11, 0x33, 0x55, 0xff, 0x101, 0x303, 0x10c, 0x314, 0x135, 0x35f, 0x1e8, 0x238, 0x241, 0x2ca, 0x357, 0x1f0, 0x210, 0x239, 0x242, 0x2cf, 0x358, 0x1e1, 0x223, 0x26c, 0x2bd, 0x3ce, 0x5b, 0xed, 0x137, 0x359, 0x1e2, 0x226, 0x263, 0x2ac, 0x3fd, 0xe, 0x12, 0x36, 0x5a, 0xee, 0x132, 0x356, 0x1f3, 0x215, 0x236, 0x253, 0x2fc, 0x30d, 0x11e, 0x322, 0x16f, 0x3b1, 0xda, 0x16e, 0x3b2, 0xdf, 0x161, 0x3a3, 0xec, 0x134, 0x35c, 0x1ed, 0x237, 0x250, 0x2f9, 0x302, 0x10f, 0x311, 0x13a, 0x34e, 0x1db, 0x26d, 0x2be, 0x3cb, 0x54, 0xfc, 0x104, 0x30c, 0x11d, 0x327, 0x160, 0x3a0, 0xe9, 0x13b, 0x34d, 0x1de, 0x262, 0x2af, 0x3f8, 0x1, 0x3, 0x5, 0xf, 0x11, 0x33, 0x55, 0xff, 0x101, 0x303, 0x10c, 0x314, 0x135, 0x35f, 0x1e8, 0x238, 0x241, 0x2ca, 0x357, 0x1f0, 0x210, 0x239, 0x6, 0x14, 0x78, 0x110, 0x269, 0x16d, 0x367, 0x340, 0x392, 0x17e, 0x30d, 0x23c, 0x93, 0x36a, 0x36e, 0x376, 0x326, 0x2c6, 0x28f, 0x339, 0x284, 0x303, 0x218, 0x4b, 0x1ba, 0x195, 0x177, 0x33b, 0x288, 0x32b, 0x2e8, 0x26b, 0x161, 0x34f, 0x3b0, 0x1b2, 0x1a5, 0x1d7, 0xfb, 0x21a, 0x47, 0x192, 0x165, 0x357, 0x3e0, 0x52, 0x1ec, 0x61, 0x146, 0x39d, 0x15c, 0x3c1, 0x94, 0x378, 0x302, 0x21e, 0x5f, 0x1c2, 0x85, 0x31e, 0x256, 0x1ef, 0x6b, 0x17a, 0x315, 0x26c, 0x173, 0x323, 0x2d8, 0x2cb, 0x2a1, 0x3dd, 0xdc, 0x2c8, 0x2ab, 0x3e1, 0x54, 0x1f8, 0x19, 0x56, 0x1f4, 0x31, 0xa6, 0x3d4, 0xea, 0x27c, 0x113, 0x263, 0x151, 0x3ef, 0x70, 0x120, 0x2c9, 0x2ad, 0x3f5, 0x2c, 0xe8, 0x270, 0x13b, 0x293, 0x371, 0x334, 0x2aa, 0x3e7, 0x40, 0x180, 0x109, 0x23f, 0x99, 0x356, 0x3e6, 0x46, 0x194, 0x171, 0xc, 0x50, 0x3c0, 0x124, 0x1ab, 0x3e6, 0x8c, 0x259, 0x39a, 0x29c, 0x2af, 0x3fb, 0x10, 0xc0, 0x109, 0x77, 0x264, 0x286, 0x217, 0xd2, 0x1d1, 0x1de, 0x19a, 0x2aa, 0x3c7, 0x100, 0x1b, 0xb4, 0x379, 0x201, 0x3a, 0x138, 0x13b, 0x12f, 0x1df, 0x196, 0x2fa, 0x7, 0x24, 0x1b0, 0x352, 0x3f5, 0x58, 0x3a0, 0x3a4, 0x394, 0x2d4, 0x1cf, 0x156, 0x3f3, 0x70, 0x240, 0x336, 0x145, 0x327, 0x189, 0x27e, 0x23e, 0x13e, 0x113, 0xcf, 0x14d, 0x347, 0x309, 0x41, 0x30c, 0x7d, 0x21c, 0xa6, 0x3a1, 0x3a8, 0x3c4, 0x114, 0xeb, 0xfd, 0x15, 0xfc, 0x19, 0xac, 0x3d9, 0x188, 0x272, 0x26e, 0x2fe, 0x37, 0x164, 0x2ab, 0x3cb, 0x150, 0x3db, 0x190, 0x2d2, 0x1e7, 0xb6, 0x361, 0x2a1, 0x3b3, 0x370, 0x26d, 0x2ea, 0xc7, 0x12d, 0x1c7, 0x136, 0x173, 0x24f, 0x372, 0x275, 0x24a, 0x34e, 0x365, 0x291, 0x2f3, 0x6b, 0x18, 0x140, 0x23f, 0x264, 0x105, 0x4e, 0x299, 0x12f, 0x3be, 0x251, 0x3fd, 0x70, 0x89, 0xc3, 0x23a, 0x21c, 0x14c, 0x29f, 0x17f, 0x37, 0x2c8, 0x2be, 0x267, 0x12d, 0x38e, 0xd1, 0x38a, 0xb1, 0x283, 0x5f, 0x301, 0x42, 0x239, 0x234, 0x28c, 0xd7, 0x3da, 0x338, 0x21a, 0x11c, 0x116, 0x1e6, 0x174, 0xdf, 0x31a, 0x12a, 0x3c6, 0x218, 0x12c, 0x396, 0x191, 0x1b5, 0x2d5, 0x386, 0x11, 0x198, 0x16d, 0x187, 0x65, 0x171, 0xa7, 0x353, 0x3fb, 0x20, 0x300, 0x5a, 0x379, 0xb, 0xe8, 0x1d2, 0x394, 0x1a1, 0x335, 0x2a2, 0x347, 0x21b, 0x104, 0x56, 0x3d9, 0x310, 0x1da, 0x354, 0x3b3, 0x2e9, 0x1a6, 0x37d, 0x6b, 0x1e1, 0x13c, 0x216, 0x1bc, 0x20d, 0xd4, 0x3f2, 0xf8, 0x52, 0x3b9, 0x219, 0x134, 0x2d6, 0x3ae, 0x3d1, 0x3d0, 0x3c8, 0x288, 0xb7, 0x2d3, 0x3d6, 0x398, 0x101, 0x2e, 0x390, 0x1c1, 0x23c, 0x30, 0x109, 0x1dc, 0x201, 0xe8, 0x3a4, 0x24b, 0x113, 0x33c, 0xfd, 0x54, 0x3db, 0x249, 0x173, 0x12e, 0x345, 0x5f, 0x20b, 0x108, 0x1ec, 0x308, 0x134, 0x1a5, 0x2a3, 0x2b7, 0x177, 0x1ee, 0x368, 0x326, 0x21d, 0x2a8, 0x367, 0x236, 0x171, 0x14e, 0x157, 0x3e7, 0x200, 0xd8, 0x2ad, 0x397, 0x312, 0x3d4, 0x359, 0x21f, 0x2c8, 0x175, 0x18e, 0x17a, 0x9e, 0x216, 0x378, 0x26, 0x2a9, 0x357, 0x33f, 0xad, 0x34f, 0x1bf, 0x43, 0x4b, 0x1cb, 0x191, 0x36a, 0x346, 0xf, 0x110, 0x36c, 0x3e6, 0x230, 0x1d1, 0x371, 0x196, 0x3fa, 0x70, 0x112, 0x30c, 0x1f4, 0x188, 0x1da, 0x2a1, 0x2d7, 0x365, 0x256, 0x363, 0x2f6, 0x15c, 0x237, 0x141, 0x47, 0x8b, 0x1e6, 0x2e8, 0x37c, 0xe6, 0x284, 0x2e, 0x329, 0x30d, 0x1c4, 0x81, 0x6, 0xa0, 0x23f, 0xc1, 0x1d, 0x270, 0x1ca, 0x1a1, 0x263, 0x29a, 0x20e, 0x1f8, 0xc8, 0x60, 0x2d, 0x2fb, 0x58, 0x13f, 0xea, 0x381, 0x164, 0x175, 0x31c, 0x1e1, 0xf9, 0x128, 0x3c3, 0x192, 0x27d, 0x174, 0x37c, 0x1cc, 0x202, 0x170, 0x2fc, 0x178, 0x1fc, 0x10, 0x209, 0x2d0, 0x3e3, 0x189, 0x3d4, 0x2bb, 0x6e, 0x26d, 0x37d, 0x1ac, 0x22f, 0x38b, 0x2a4, 0x47, 0x116, 0x391, 0x36d, 0x3a5, 0xff, 0x68, 0x32d, 0x393, 0x3ad, 0x3ff, 0x100, 0xd8, 0x153, 0x247, 0xa6, 0x137, 0x3ea, 0x2e9, 0x291, 0x3b5, 0x2f6, 0x2b8, 0xce, 0x21a, 0x79, 0x144, 0x16e, 0x2b5, 0x22e, 0x3eb, 0x289, 0x2bc, 0x14e, 0x2ae, 0x387, 0x24, 0x19b, 0x11d, 0x31, 0x272, 0x354, 0x2d7, 0x2c3, 0x14a, 0x32e, 0x333, 0x3da, 0xfb, 0x1e8, 0x399, 0x6d, 0x2cd, 0x30a, 0x2a8, 0x2c7, 0xca, 0x39a, 0xcd, 0x2ba, 0xe, 0x240, 0x186, 0x1f4, 0x310, 0x361, 0x125, 0x123, 0x63, 0x8d, 0x28c, 0x35c, 0x1d7, 0x3ab, 0x2bf, 0x1ee, 0xc0, 0xb4, 0x3f5, 0x189, 0x3a1, 0x2fe, 0x370, 0x291, 0x363, 0x3ca, 0x1ed, 0xfb, 0x3d0, 0x27f, 0x368, 0x83, 0x198, 0x37a, 0x118, 0x3a2, 0x3be, 0x2ac, 0x287, 0x1f8, 0x320, 0x2e6, 0x162, 0x6a, 0x3d3, 0x33f, 0x2b4, 0x95, 0x303, 0x390, 0x213, 0x23b, 0x4, 0x300, 0x2d0, 0x3cf, 0x22d, 0x29f, 0x3ea, 0x1db, 0x256, 0x197, 0x333, 0x3bd, 0x3ec, 0x35b, 0x1ee, 0x1bb, 0x20c, 0x269, 0x1f3, 0x69, 0x293, 0x2e3, 0x2a2, 0x20e, 0x3e9, 0x9b, 0x38a, 0x181, 0x1a8, 0x357, 0xe7, 0x2c2, 0x254, 0x17, 0x25b, 0x5e, 0xfe, 0x10, 0x1b, 0x352, 0x327, 0xa6, 0x26e, 0x3b3, 0x365, 0x14a, 0x255, 0xd7, 0x2ef, 0x3ab, 0x177, 0x3b1, 0x2e5, 0x22, 0x1b6, 0x3c5, 0x1a4, 0x25e, 0x39e, 0x29a, 0x2a, 0x3bf, 0x26c, 0x233, 0x20d, 0x2a9, 0x147, 0x39c, 0x31a, 0x142, 0x5c, 0x17e, 0x178, 0x3f8, 0x40, 0x6c, 0x153, 0x87, 0x180, 0x2d0, 0x397, 0xa6, 0xd5, 0x2d7, 0x31e, 0x8d, 0x222, 0x1a5, 0x135, 0xb3, 0x36a, 0x206, 0x3c0, 0xc1, 0xe8, 0x11f, 0x3c4, 0x2c8, 0x3ba, 0x358, 0x15c, 0x19c, 0xf4, 0x33b, 0x368, 0x106, 0x269, 0x3e6, 0x1a4, 0xb5, 0x263, 0xfd, 0x2a0, 0x315, 0x216, 0x3f6, 0x192, 0x1e6, 0x36d, 0x28f, 0x3eb, 0x236, 0x39a, 0x334, 0x3fa, 0x380, 0x19, 0x1ad, 0x12e, 0x21e, 0x3ed, 0x33f, 0x161, 0x254, 0x2e, 0x17e, 0x2f0, 0x3fb, 0x200, 0x2c9, 0x23a, 0x188, 0x2cb, 0x13a, 0x21, 0x1ec, 0x76, 0x18b, 0x4b, 0x243, 0x91, 0x6, 0x109, 0x2fb, 0x160, 0x3d4, 0x2fe, 0x2e9, 0x256, 0x32e, 0xd7, 0x1d7, 0x2b7, 0x3aa, 0x36e, 0xf, 0x92, 0x286, 0x270, 0x24b, 0x8a, 0x2ab, 0x18e, 0x3c2, 0x3c1, 0x141, 0x238, 0x288, 0x362, 0x21d, 0x16d, 0x46, 0x1d1, 0x3be, 0x151, 0x20e, 0x3db, 0x26c, 0x6f, 0x26, 0x165, 0x5d, 0x300, 0x352, 0x87, 0x272, 0x296, 0x85, 0x7b, 0x3b, 0x18b, 0x96, 0x11e, 0x81, 0x60, 0x168, 0x397, 0x14c, 0x354, 0x295, 0x18c, 0x184, 0x1b2, 0x314, 0x325, 0x91, 0xc, 0x2d, 0x3f5, 0x22d, 0x26e, 0x2d7, 0x235, 0x234, 0x134, 0x266, 0x2e1, 0x93, 0x205, 0x280, 0x2fb, 0x2c0, 0x34b, 0x3dd, 0x2c3, 0x242, 0x222, 0x34a, 0xdd, 0x191, 0x2c5, 0x50, 0x1dc, 0x58, 0x1ea, 0x2fe, 0x1db, 0x14a, 0x146, 0x16b, 0x29e, 0xb3, 0x2dd, 0xa, 0x23f, 0xb, 0x13f, 0x359, 0x1b8, 0x12b, 0x32e, 0x1ae, 0x355, 0x195, 0x2de, 0x103, 0x3c0, 0x182, 0x3a0, 0xea, 0x37, 0x1a6, 0x363, 0x333, 0x2ef, 0x2b7, 0x35d, 0x1a3, 0x78, 0x132, 0x74, 0x11f, 0x381, 0x332, 0x1ef, 0x1e5, 0x3da, 0x3d1, 0x2ee, 0x1b7, 0xf, 0x124, 0x20a, 0x3a4, 0xf1, 0x164, 0x3ba, 0x2b9, 0x179, 0xfb, 0x35b, 0x3b1, 0x386, 0x220, 0x143, 0x270, 0x209, 0x153, 0x31, 0x361, 0x274, 0x108, 0x1f7, 0x37e, 0xe4, 0x2f, 0x3f8, 0x200, 0x336, 0x3e8, 0x2d8, 0x22b, 0xf8, 0xad, 0x12a, 0x5c, 0x3e2, 0x2af, 0x207, 0x112, 0x158, 0x24f, 0x21e, 0x3af, 0x39c, 0xe6, 0x34, 0x15e, 0x262, 0x1fd, 0x309, 0xc8, 0x1c5, 0x20d, 0x165, 0x174, 0x3a5, 0x3eb, 0xca, 0x1de, 0xab, 0x107, 0x3bf, 0x344, 0x1fb, 0x324, 0x32b, 0x163, 0x159, 0x46, 0x34d, 0x39e, 0xfd, 0x292, 0x13c, 0xa9, 0x11c, 0x119, 0x326, 0x330, 0x3c5, 0x13b, 0x28d, 0x3ac, 0x18e, 0x313, 0x67, 0xf4, 0xf7, 0x2e5, 0x110, 0x143, 0xe9, 0x27c, 0x164, 0x37d, 0x2f6, 0x3da, 0x3ab, 0x3aa, 0x1a3, 0xf0, 0xc1, 0x3a0, 0x1d4, 0xdc, 0x12b, 0x255, 0x2b1, 0x29e, 0x166, 0x366, 0x50, 0x3b8, 0x160, 0x34b, 0x3b3, 0x31e, 0x234, 0x268, 0x18a, 0x325, 0x122, 0x30, 0x168, 0x327, 0x139, 0x296, 0x10a, 0x1ec, 0x1b, 0x145, 0x188, 0x275, 0x20b, 0x290, 0x24e, 0x2e, 0x3e2, 0x157, 0xe, 0x82, 0x1ad, 0x162, 0x2a9, 0x5d, 0x3d6, 0x3eb, 0x194, 0x371, 0x151, 0x54, 0x315, 0x94, 0x47, 0x288, 0x326, 0x269, 0x30f, 0x1ca, 0x8a, 0x175, 0x358, 0x2f2, 0x3d1, 0x3aa, 0x346, 0x3c0, 0x201, 0x27e, 0x2fe, 0x365, 0x8d, 0x134, 0x18a, 0x243, 0x81, 0x180, 0x2ad, 0x31, 0x2cb, 0x1c2, 0x52, 0x34f, 0x303, 0x17e, 0x3ad, 0x307, 0x112, 0x2b0, 0x12e, 0xd4, 0x28e, 0x37c, 0x1fe, 0x236, 0xef, 0xab, 0x20e, 0x2e7, 0x216, 0x38f, 0x51, 0x362, 0xcc, 0x3e6, 0x13b, 0x113, 0x2ab, 0x6b, 0x15c, 0xfb, 0x177, 0x36e, 0x78, 0xc1, 0x349, 0x359, 0x2e9, 0x294, 0x222, 0x133, 0x1cb, 0x91, 0x30, 0x2d0, 0x87, 0x1da, 0x13a, 0x108, 0x3ee, 0x1e3, 0x329, 0x2f0, 0x3e7, 0x120, 0x56, 0x323, 0x21e, 0x357, 0x26b, 0x339, 0x340, 0x39a, 0x36, 0x11d, 0x5b, 0x311, 0x1f0, 0x161, 0x101, 0x253, 0x262, 0x3fd, 0xfc, 0x26c, 0x2f9, 0x241, 0x16e, 0x33, 0x1f3, 0x13b, 0x226, 0x2be, 0x358, 0x1ed, 0x35f, 0x16f, 0x5, 0xee, 0x160, 0x137, 0x34e, 0x239, 0xec, 0x10c, 0x30d, 0x3f8, 0x12, 0x30c, 0x3ce, 0x10f, 0x357, 0xdf, 0xff, 0x236, 0x1de, 0x2ac, 0x54, 0x223, 0x250, 0x238, 0xda, 0x11, 0x356, 0xe9, 0x1e2, 0x26d, 0x2cf, 0x35c, 0x135, 0x322, 0x3, 0x5a, 0x327, 0xed, 0x13a, 0x210, 0x3a3, 0x303, 0x2fc, 0x2af, 0xe, 0x104, 0x2bd, 0x302, 0x2ca, 0x3b2, 0x55, 0x215, 0x34d, 0x263, 0x3cb, 0x1e1, 0x237, 0x1e8, 0x3b1, 0xf, 0x132, 0x3a0, 0x359, 0x1db, 0x242, 0x134, 0x314, 0x11e, 0x1, 0x36, 0x11d, 0x5b, 0x311, 0x1f0, 0x161, 0x101, 0x253, 0x262, 0x3fd, 0xfc, 0x26c, 0x2f9, 0x241, 0x16e, 0x33, 0x1f3, 0x13b, 0x226, 0x2be, 0x358, 0x6c, 0x7d, 0x2d8, 0x17c, 0x277, 0xe6, 0x1a0, 0x33d, 0xab, 0x2a, 0x223, 0xa9, 0xf2, 0x2d9, 0x110, 0x20a, 0x23e, 0xdc, 0x14a, 0x4d, 0x18a, 0x11e, 0x2, 0xd8, 0xfa, 0x1b9, 0x2f8, 0xe7, 0x1cc, 0x340, 0x273, 0x156, 0x54, 0x4f, 0x152, 0x1e4, 0x1bb, 0x220, 0x1d, 0x75, 0x1b8, 0x294, 0x9a, 0x314, 0x23c, 0x4, 0x1b0, 0x1f4, 0x372, 0x1f9, 0x1ce, 0x398, 0x289, 0xef, 0x2ac, 0xa8, 0x9e, 0x2a4, 0x3c8, 0x376, 0x49, 0x3a, 0xea, 0x370, 0x121, 0x134, 0x221, 0x71, 0x8, 0x360, 0x3e8, 0x2ed, 0x3f2, 0x39c, 0x339, 0x11b, 0x1de, 0x151, 0x150, 0x13c, 0x141, 0x399, 0x2e5, 0x92, 0x74, 0x1d4, 0x2e9, 0x242, 0x268, 0x4b, 0xe2, 0x10, 0x2c9, 0x3d9, 0x1d3, 0x3ed, 0x331, 0x27b, 0x236, 0x3bc, 0x2a2, 0x2a0, 0x278, 0x282, 0x33b, 0x1c3, 0x124, 0xe8, 0x3a8, 0x1db, 0x8d, 0xd9, 0x96, 0x1c4, 0xd8, 0x1f4, 0x2ed, 0x3ed, 0x26b, 0x1fe, 0x194, 0x3be, 0xfd, 0x17a, 0x237, 0x3a9, 0x36e, 0x3c0, 0x2c, 0x29f, 0x295, 0x1ec, 0x1bf, 0x329, 0x3ad, 0xe, 0x19, 0x38a, 0x130, 0x32b, 0x21d, 0x3e6, 0x1ca, 0x59, 0x1ef, 0xd7, 0x135, 0x93, 0x30, 0x2ad, 0x188, 0x38c, 0x3e0, 0x31a, 0x68, 0x39a, 0xab, 0x54, 0x9e, 0x141, 0x33b, 0x386, 0x99, 0x349, 0x2fe, 0x31e, 0x308, 0x43, 0x30d, 0x3fb, 0x120, 0x2b0, 0x162, 0x165, 0x36d, 0x2a8, 0x230, 0x1a1, 0x2ab, 0x358, 0x3bd, 0x195, 0x366, 0x109, 0x397, 0x1da, 0x1c2, 0x290, 0x254, 0x392, 0x262, 0x3ef, 0x3db, 0x216, 0x47, 0x6d, 0x22, 0x286, 0x11f, 0xdc, 0x294, 0x134, 0x4b, 0x1c4, 0x40, 0x265, 0x1e7, 0x21e, 0x28e, 0x3d6, 0x367, 0x1d1, 0x263, 0x337, 0x22f, 0xfb, 0x3aa, 0x206, 0x1dc, 0x312, 0x2a1, 0x21, 0x3ee, 0x303, 0x3e2, 0x2aa, 0x380, 0x249, 0x1b0, 0x3d9, 0x345, 0x2a7, 0x1eb, 0x367, 0x3a2, 0x19e, 0x18e, 0x2b8, 0x35f, 0x36a, 0x140, 0x3cf, 0x1da, 0x384, 0x252, 0x284, 0x15e, 0xcb, 0x20e, 0x223, 0x2a4, 0x33b, 0x305, 0x264, 0x27e, 0x3b3, 0x318, 0x3b0, 0x1c8, 0x3d2, 0xe, 0x32, 0x233, 0x192, 0x2dc, 0x330, 0x4e, 0xf1, 0x1a6, 0x146, 0x266, 0x11e, 0x8, 0x19b, 0x2f7, 0x21e, 0x115, 0x343, 0x30e, 0x12f, 0xeb, 0x6b, 0x1ed, 0x2ce, 0x366, 0x212, 0x247, 0x2cb, 0x1f, 0x2b4, 0xd, 0x2e2, 0x251, 0x54, 0x13c, 0x10d, 0x1ee, 0x1e, 0x304, 0x3d4, 0x1a7, 0xf6, 0x1bf, 0x25b, 0x2af, 0x70, 0x190, 0x1bc, 0x8b, 0x2cd, 0x1b6, 0x270, 0x381, 0x12b, 0x222, 0x314, 0xe2, 0x40, 0xc3, 0x395, 0xd4, 0xba, 0x22e, 0x46, 0x16a, 0x351, 0x358, 0x373, 0x25d, 0x306, 0xb4, 0x21c, 0x275, 0xf8, 0x18d, 0x68, 0x33d, 0x2ac, 0x2a0, 0x1f2, 0x7a, 0x36b, 0x360, 0x37f, 0x21e, 0x22a, 0x117, 0x46, 0x2d4, 0x15f, 0x2f6, 0x355, 0x322, 0x30, 0x2a6, 0xb6, 0x2f8, 0x331, 0x3fc, 0xbb, 0x335, 0x267, 0x15c, 0x35f, 0x2dd, 0x109, 0x247, 0x19f, 0x7c, 0x18d, 0xd0, 0xef, 0x14d, 0x25a, 0x237, 0x2bf, 0x285, 0x1dc, 0x53, 0x24a, 0x52, 0x12a, 0x32d, 0x334, 0x107, 0x223, 0x141, 0xf7, 0x1e, 0x201, 0x34b, 0x123, 0x37b, 0x385, 0x3cd, 0x17d, 0xfc, 0x281, 0x47, 0x1b4, 0x220, 0xe8, 0x17f, 0x235, 0x76, 0x72, 0x1e9, 0xe, 0x64, 0xde, 0x8b, 0x193, 0x2d1, 0x3a4, 0x6e, 0x121, 0x1b2, 0x172, 0x3f8, 0x120, 0x2d2, 0x20d, 0x1e6, 0x30a, 0x3c5, 0x24b, 0x332, 0x255, 0x133, 0x11e, 0x10, 0x265, 0x395, 0x1a8, 0x2e8, 0x154, 0x69, 0x113, 0x1dd, 0x333, 0x135, 0x24c, 0x300, 0x23a, 0x372, 0x3d3, 0x37c, 0x3b7, 0x3a2, 0x33c, 0x231, 0x1ed, 0x195, 0x183, 0xb4, 0x31, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x19b, 0x395, 0x2a9, 0x2d3, 0x1bd, 0x1ca, 0x199, 0xa3, 0x18a, 0x388, 0x12, 0x2b0, 0x20d, 0x391, 0xcc, 0x9c, 0x30b, 0x294, 0x364, 0x382, 0x3e7, 0x104, 0x233, 0x8b, 0x245, 0x143, 0xea, 0x2c3, 0x3b, 0xe4, 0x353, 0x1c0, 0x26c, 0x317, 0x1b4, 0x92, 0x29b, 0x36f, 0x1ec, 0x3c6, 0x393, 0x3fa, 0x3bf, 0x250, 0x33b, 0x1e, 0x16, 0xd5, 0x42, 0x127, 0x392, 0x261, 0x2a, 0xf9, 0x1e8, 0x1a3, 0x1dc, 0x14c, 0xe1, 0xad, 0x1a, 0x273, 0x29a, 0x2f4, 0x279, 0x16f, 0x140, 0x247, 0x275, 0x3c9, 0x398, 0x194, 0x39e, 0xc7, 0x2f2, 0x32a, 0x3, 0x2ad, 0xb6, 0x3f2, 0x37c, 0x2c7, 0x25e, 0x2ab, 0x1e5, 0x29e, 0x91, 0x36, 0x3d9, 0x21e, 0xba, 0x154, 0x1a4, 0x114, 0x3b5, 0x1a5, 0x8f, 0x20, 0x30c, 0x25c, 0x19d, 0x2c6, 0x3c5, 0x13e, 0x34c, 0x4d, 0x12c, 0x1fc, 0x240, 0x2bd, 0x130, 0x2dc, 0x1b6, 0x3a4, 0x336, 0x24f, 0x165, 0x163, 0x3c5, 0x27c, 0x12b, 0x268, 0x2e4, 0x3f7, 0x104, 0x6f, 0x22c, 0x20c, 0x1d, 0x17f, 0x18c, 0x1bf, 0x1f1, 0x2fa, 0x3db, 0x250, 0x27f, 0x78, 0xb0, 0x14b, 0x52, 0x142, 0x2e2, 0x151, 0xbd, 0x338, 0x16f, 0x280, 0x10e, 0x38c, 0xe7, 0x3fc, 0x1d1, 0xeb, 0x2b9, 0x2a3, 0x24c, 0x36, 0x3bb, 0x6a, 0x1d9, 0x16d, 0xe5, 0x199, 0x146, 0x221, 0x7f, 0x120, 0x2bd, 0x260, 0x362, 0x1ab, 0x23e, 0x365, 0x3b, 0x1c8, 0x157, 0x21b, 0x281, 0x238, 0x1c3, 0x182, 0x29f, 0x214, 0x297, 0x392, 0xcb, 0xa8, 0x3c1, 0x2bf, 0x5, 0x3f5, 0x361, 0xf8, 0xe6, 0xca, 0x39e, 0x18e, 0x3da, 0x166, 0x30, 0x11d, 0x1d3, 0x28e, 0x22e, 0x69, 0x8a, 0x3b5, 0x34a, 0x23c, 0x100, 0xac, 0x302, 0x391, 0x198, 0x270, 0x6e, 0x11a, 0x43, 0x178, 0x1c, 0x249, 0x3c3, 0xda, 0x92, 0x13f, 0x1a7, 0x37b, 0x265, 0x12e, 0x33a, 0x21d, 0x4e, 0x21f, 0x8d, 0x43, 0x2f0, 0x70, 0x26c, 0x47, 0x376, 0xc1, 0x29f, 0x21, 0x24e, 0xaf, 0xab, 0x12d, 0x19c, 0x16f, 0x109, 0x31, 0x5f, 0x26b, 0x367, 0xb5, 0x175, 0xd7, 0x1cb, 0x8, 0x30c, 0x162, 0x1e6, 0xcc, 0x270, 0xdc, 0x61, 0x218, 0x3ad, 0x380, 0x344, 0x238, 0x386, 0x201, 0xd5, 0x108, 0x254, 0x171, 0x151, 0x17a, 0xfb, 0x36a, 0x5a, 0x188, 0x2f8, 0x37c, 0x30e, 0x1a1, 0x3ba, 0x2b1, 0x243, 0x40, 0x56, 0x302, 0x32b, 0x269, 0x3a4, 0x2e9, 0x308, 0xe4, 0x157, 0x3f, 0x216, 0x1e4, 0xf, 0x2c, 0x2a1, 0x52, 0x284, 0x39a, 0x29a, 0x3c2, 0x3d1, 0x366, 0x2d0, 0x5b, 0x3ed, 0x3d6, 0x46, 0x113, 0x1ef, 0x1a5, 0x23c, 0x200, 0x2b0, 0x26, 0x16e, 0x36c, 0x11f, 0x365, 0x76, 0x329, 0x2aa, 0x1f8, 0x94, 0x33b, 0x78, 0x160, 0x125, 0x290, 0xd, 0xef, 0xc3, 0xb1, 0x1e6, 0x198, 0x1d2, 0x2e9, 0x219, 0x390, 0x2aa, 0x3f0, 0x250, 0x1ee, 0x389, 0x53, 0x1c2, 0x2c2, 0x11b, 0x1cf, 0x31c, 0x2ef, 0x93, 0x36, 0x2f7, 0x2a9, 0x2b5, 0x383, 0x3c4, 0x121, 0x225, 0x2f0, 0xe0, 0x1a2, 0x238, 0x305, 0x16, 0x2a1, 0xa4, 0x202, 0xef, 0x1fa, 0xae, 0x195, 0xc, 0x11d, 0x345, 0xba, 0x2b2, 0x1ca, 0xd3, 0x9a, 0x2e4, 0x3c7, 0x64, 0x3f6, 0xda, 0x248, 0x3d4, 0x10a, 0x127, 0xaf, 0x156, 0xbd, 0xfb, 0x2dd, 0x168, 0x5b, 0x3d3, 0x343, 0x230, 0x114, 0x197, 0x18a, 0x7f, 0x89, 0x38a, 0x116, 0x11, 0xe8, 0x3b3, 0x3b9, 0x2e, 0xcd, 0x2a, 0x3c1, 0x2ee, 0x50, 0x87, 0x311, 0x331, 0x367, 0x16a, 0x1dd, 0x2b1, 0x8f, 0x100, 0x2b0, 0x4c, 0x1b1, 0x356, 0x1d4, 0x63, 0x1bf, 0x3cd, 0x3f3, 0x315, 0x3d, 0x1a3, 0x2fb, 0x3b4, 0x1f0, 0x339, 0x176, 0xeb, 0x2f6, 0x186, 0x2c4, 0x32b, 0x1b6, 0x23e, 0x31e, 0x2db, 0x3cd, 0x3ef, 0x4f, 0x1e8, 0x206, 0x3cf, 0xe3, 0x1ce, 0x3b7, 0x16a, 0x3ba, 0x2d6, 0x71, 0x24, 0x2bd, 0x324, 0x106, 0x74, 0x3b3, 0x37b, 0xb8, 0x261, 0x2a0, 0xce, 0x2de, 0x5a, 0x229, 0x3d3, 0x28f, 0xd2, 0xb2, 0x146, 0x12c, 0x3ff, 0x19, 0x1fb, 0xda, 0x99, 0x34b, 0x42, 0x254, 0x1cd, 0x13d, 0x22f, 0x2ce, 0xc, 0x23a, 0x10f, 0x1d9, 0x37a, 0x13e, 0xa5, 0x18b, 0x178, 0xe0, 0x344, 0xf2, 0x1e, 0x160, 0x9d, 0x15a, 0x340, 0x2e3, 0x31c, 0x1d7, 0x24c, 0x1b0, 0x323, 0x19d, 0x33, 0x270, 0x370, 0x219, 0x329, 0x2ba, 0x3bf, 0x141, 0x1b7, 0x3b8, 0x1da, 0x1f0, 0x27b, 0x1d1, 0x351, 0x333, 0x1cb, 0x20, 0xac, 0x26, 0x1b1, 0x2a5, 0x359, 0x318, 0x3c6, 0x14e, 0x107, 0x1f2, 0x177, 0x50, 0x10e, 0x5f, 0x1be, 0x215, 0x113, 0x3b5, 0x266, 0x23b, 0x30c, 0x302, 0x16e, 0x356, 0x359, 0x239, 0x303, 0x262, 0x54, 0x237, 0x16f, 0x5a, 0x5b, 0x357, 0x55, 0x13b, 0x26d, 0x134, 0x30d, 0xe, 0x26c, 0x238, 0xf, 0x160, 0x13a, 0x161, 0x236, 0x263, 0x358, 0x135, 0x1, 0x30c, 0x302, 0x16e, 0x356, 0x359, 0x239, 0x303, 0x262, 0x54, 0x237, 0x16f, 0x5a, 0x5b, 0x357, 0x55, 0x13b, 0x26d, 0x134, 0x30d, 0xe, 0x26c, 0x238, 0xf, 0x160, 0x13a, 0x161, 0x236, 0x263, 0x358, 0x135, 0x1, 0x30c, 0x302, 0x16e, 0x356, 0x359, 0x239, 0x303, 0x262, 0x54, 0x237, 0x16f, 0x5a, 0x5b, 0x357, 0x55, 0x13b, 0x26d, 0x134, 0x30d, 0xe, 0x26c, 0x238, 0xf, 0x160, 0x13a, 0x161, 0x236, 0x263, 0x358, 0x135, 0x1, 0x30c, 0x302, 0x16e, 0x356, 0x359, 0x239, 0x303, 0x262, 0x54, 0x237, 0x16f, 0x5a, 0x5b, 0x357, 0x55, 0x13b, 0x26d, 0x134, 0x30d, 0xe, 0x26c, 0x211, 0x13, 0x362, 0x105, 0x3ea, 0x37b, 0x2e0, 0x251, 0x17a, 0x3ab, 0x3, 0x23a, 0x35, 0x1af, 0x30f, 0x37, 0x184, 0x329, 0x2fa, 0x38e, 0xf4, 0x5, 0x247, 0x5f, 0x2f1, 0x118, 0x59, 0x28c, 0x172, 0x307, 0x9b, 0x11c, 0xf, 0x2c0, 0xe1, 0x31a, 0x328, 0xeb, 0x39d, 0x396, 0x100, 0x1ad, 0x324, 0x11, 0x349, 0x123, 0x127, 0x171, 0x13d, 0xae, 0xb3, 0x300, 0x2f7, 0x165, 0x33, 0x1d2, 0x365, 0x369, 0x393, 0x347, 0x1f2, 0x1d5, 0x109, 0x310, 0x3af, 0x55, 0x276, 0x1a6, 0x1b2, 0xbc, 0x1c0, 0x216, 0x27f, 0x31b, 0x139, 0xf8, 0xff, 0x293, 0x2ea, 0x2d6, 0x1c4, 0x240, 0x233, 0x288, 0x124, 0x34b, 0x108, 0x101, 0x3bc, 0x337, 0x373, 0x24c, 0x2c9, 0x25c, 0x391, 0x36c, 0x1d4, 0x318, 0x303, 0xcd, 0x150, 0x19c, 0x2dd, 0x352, 0x2ed, 0xba, 0x1bd, 0x27c, 0x121, 0x10c, 0x157, 0x3f0, 0x2a4, 0x36e, 0x2b, 0x4c, 0x326, 0x74, 0x1a7, 0x34f, 0x2bc, 0x13d, 0x15c, 0x2cc, 0x36, 0x323, 0xf3, 0xdb, 0xea, 0x318, 0x20f, 0x334, 0x292, 0x1f6, 0x306, 0x11d, 0x35, 0x35e, 0x27, 0x1b8, 0x76, 0x1f1, 0x3d7, 0xf9, 0x1d5, 0x212, 0x5b, 0x147, 0x159, 0x24b, 0x14a, 0x86, 0x157, 0x3e9, 0x282, 0x346, 0x3cf, 0x311, 0x37c, 0x118, 0xb2, 0x222, 0x382, 0x1c, 0x344, 0x399, 0x389, 0x139, 0x1f0, 0x3fc, 0xb5, 0x2f3, 0x266, 0x1fc, 0x208, 0x3e5, 0x376, 0x16, 0x24a, 0x161, 0xca, 0x271, 0x39d, 0x325, 0x9, 0x173, 0x22c, 0x220, 0x3d4, 0x84, 0x101, 0x371, 0xc7, 0x3ae, 0x81, 0x186, 0x20d, 0x362, 0x20a, 0x3b3, 0x3ee, 0x253, 0x2a2, 0x22f, 0x25d, 0x300, 0x1e7, 0x19d, 0x198, 0x11f, 0x63, 0x3c6, 0x262, 0x150, 0x338, 0x366, 0x2a6, 0x283, 0x36d, 0x383, 0x37, 0x308, 0xbf, 0x3fd, 0x9e, 0x2bf, 0x140, 0x188, 0x56, 0x130, 0x106, 0x349, 0x85, 0x254, 0xef, 0x337, 0x1d7, 0x81, 0x30c, 0x26, 0x326, 0xe8, 0x295, 0x24e, 0x39a, 0x3e1, 0x3bd, 0x91, 0x265, 0x302, 0x362, 0x1d, 0x2d7, 0x34f, 0x171, 0xfd, 0x2f2, 0x93, 0x2c9, 0x162, 0x16e, 0x286, 0x3dd, 0x3ee, 0xaf, 0x29a, 0x15c, 0x191, 0xd8, 0x12e, 0x32b, 0x356, 0x2fe, 0x37b, 0x392, 0x151, 0x22f, 0xb3, 0x1b, 0x323, 0x1e6, 0x36c, 0x359, 0x1ec, 0x170, 0xab, 0x3c2, 0x195, 0x180, 0x1e7, 0x33a, 0x269, 0xea, 0x239, 0x2e, 0x196, 0x17a, 0x2b7, 0x30, 0x3bb, 0x165, 0xcc, 0x11f, 0xc6, 0x303, 0x334, 0x12d, 0x3d1, 0x6, 0x1f4, 0x2a9, 0x21d, 0x3a4, 0x31e, 0x1e3, 0x262, 0x2a0, 0xfb, 0x306, 0x23a, 0xd4, 0x2c6, 0x270, 0x365, 0x1bf, 0x14e, 0x54, 0x19c, 0x366, 0x145, 0x21e, 0x35e, 0x4e, 0x2e9, 0x3b0, 0x32f, 0x20e, 0x237, 0x36a, 0x2ad, 0x345, 0x36d, 0xac, 0xc9, 0x22, 0xf5, 0x84, 0xd, 0x375, 0x1ac, 0x1ba, 0x80, 0x2bd, 0x51, 0x124, 0x26e, 0x290, 0x289, 0x19e, 0x39d, 0x8f, 0x90, 0x6f, 0xda, 0x304, 0x125, 0x2c2, 0x259, 0x2ab, 0x16b, 0x319, 0x82, 0x3e5, 0x1c3, 0x160, 0x384, 0x398, 0x293, 0x37d, 0xc5, 0x3fb, 0x190, 0x11c, 0x78, 0x14c, 0x1f0, 0x3eb, 0x342, 0x197, 0x258, 0x207, 0x1a2, 0x33b, 0x77, 0x361, 0x1ce, 0x215, 0x228, 0x222, 0x213, 0x1c0, 0x94, 0x2df, 0x3fe, 0x38c, 0x2f1, 0xd2, 0x26d, 0x364, 0x3d2, 0x1f8, 0x282, 0x103, 0x87, 0x1f9, 0x22e, 0x1ca, 0xa5, 0x10c, 0x2aa, 0x1c7, 0x3d0, 0xa0, 0x310, 0x147, 0x16d, 0xf1, 0x234, 0x329, 0x3fd, 0x278, 0x3aa, 0xb4, 0x372, 0x2e8, 0x3c5, 0x6e, 0x76, 0x3cd, 0x107, 0x237, 0x2dd, 0x2a6, 0x21e, 0x2b5, 0x138, 0x365, 0x37e, 0x131, 0x2a0, 0x1f6, 0x3, 0x1f4, 0x15b, 0x66, 0x11f, 0x158, 0x324, 0x110, 0x34b, 0xa4, 0x340, 0x19e, 0x333, 0x23c, 0x89, 0x2f9, 0x376, 0xb0, 0x384, 0x339, 0x25e, 0x3de, 0x4b, 0x387, 0xd1, 0x33b, 0xee, 0x19f, 0x26b, 0x118, 0x199, 0x1b2, 0x3d2, 0x3f0, 0x21a, 0xa, 0x62, 0x357, 0x2b2, 0xf1, 0x61, 0xbf, 0x3d7, 0x3c1, 0x1b5, 0x153, 0x21e, 0x163, 0xe9, 0x31e, 0x385, 0x261, 0x17a, 0x2ce, 0x300, 0x323, 0x391, 0x2a5, 0x3dd, 0x3a3, 0x2e2, 0x3e1, 0x2ef, 0x102, 0x56, 0xc9, 0x44, 0x3d4, 0x29, 0xd0, 0x263, 0x3ca, 0x8f, 0x120, 0x1bc, 0x2d9, 0x2c, 0xe1, 0x1cc, 0x293, 0x2f3, 0x314, 0x3e7, 0x136, 0x3c8, 0x23f, 0x361, 0x39c, 0x46, 0x164, 0x268, 0x2f0, 0xfc, 0x282, 0x206, 0x21c, 0x3d3, 0x2a8, 0x13e, 0x11a, 0x329, 0x3f3, 0x1f2, 0x16f, 0x352, 0x283, 0x35e, 0x138, 0x2c3, 0x1e3, 0x19a, 0x25a, 0x2b7, 0xc0, 0x3ce, 0x1e6, 0x1ab, 0x1f5, 0x3ee, 0x2b0, 0x8b, 0x92, 0xd5, 0xad, 0x194, 0x2ab, 0x1a5, 0x1fc, 0xc8, 0x238, 0x3c0, 0x1da, 0x1ce, 0x46, 0x2c8, 0x1b2, 0x3ad, 0x3db, 0xf4, 0xa0, 0x5b, 0x5d, 0x3e6, 0xdc, 0x3b0, 0x14e, 0x2a0, 0x3d1, 0x30, 0x1e7, 0x1e6, 0x356, 0x3dd, 0x34f, 0x39a, 0x337, 0x2a3, 0x8, 0x1ad, 0x51, 0x99, 0x2a1, 0x161, 0xbb, 0x175, 0x133, 0x3fb, 0x249, 0x1e4, 0x23f, 0x2cb, 0x26b, 0x230, 0x26d, 0x18b, 0x157, 0x2e7, 0x3a9, 0x109, 0x2d8, 0x2e8, 0x30f, 0x2e9, 0x1bf, 0x262, 0x12d, 0x2b7, 0x180, 0x323, 0x32b, 0x286, 0x2d7, 0x24e, 0xef, 0x18e, 0x135, 0x40, 0x173, 0x288, 0xc1, 0x125, 0x31a, 0x1d1, 0x3ba, 0x18a, 0x3e7, 0x26c, 0x33b, 0x1dc, 0x275, 0x37c, 0x1a4, 0x34c, 0x43, 0x2aa, 0x315, 0x177, 0x5a, 0x2ed, 0x36d, 0x4e, 0x365, 0x1e3, 0x334, 0x17a, 0x195, 0x1b, 0x12e, 0x16e, 0x1d, 0x295, 0x254, 0x371, 0x169, 0x22c, 0x99, 0x14b, 0x18d, 0x1d1, 0x37d, 0x221, 0x307, 0x281, 0x3b1, 0x3f5, 0xbe, 0x22e, 0x24b, 0x11a, 0xbf, 0x347, 0x67, 0x183, 0x1f4, 0x2ca, 0x1b6, 0x2fe, 0x3d5, 0x1cd, 0x337, 0x14f, 0x20, 0x173, 0x119, 0x304, 0x13a, 0x1cc, 0x25e, 0x363, 0xb9, 0x38, 0x94, 0x2d5, 0x247, 0x3ed, 0x159, 0x1e2, 0x308, 0x3cd, 0x2a, 0xfb, 0xc, 0x2f7, 0x1e6, 0x2a5, 0x36f, 0x24e, 0x1de, 0x231, 0x1ba, 0x9, 0x233, 0x368, 0x58, 0x301, 0x1fe, 0x342, 0xa3, 0x30d, 0x309, 0x2a4, 0x206, 0x62, 0x147, 0x37a, 0x37, 0x1d8, 0x14e, 0x149, 0x35f, 0x180, 0x24f, 0xb7, 0x1d, 0x123, 0x142, 0x3be, 0x2b9, 0x325, 0x120, 0x2f9, 0x1c3, 0x312, 0xf8, 0x3b7, 0x8a, 0x4d, 0x178, 0x1f8, 0x3d, 0x50, 0x5b, 0xba, 0x383, 0x2e9, 0x37e, 0x19a, 0x17a, 0x32a, 0x6c, 0x162, 0x2cd, 0x3a0, 0x21, 0x1a, 0x335, 0x39d, 0x2d2, 0xa2, 0xc1, 0x9d, 0x1cc, 0xb5, 0x197, 0x1c1, 0x380, 0x2a4, 0x5, 0x188, 0x22a, 0x3c5, 0x2e9, 0x2f5, 0x261, 0x3c2, 0x2cc, 0x19b, 0x26, 0x11, 0x3a1, 0x290, 0xca, 0x15f, 0x133, 0x3f7, 0xd1, 0x1ee, 0x3fe, 0xbe, 0x55, 0x13e, 0xc2, 0x3e2, 0x2a, 0x1f6, 0x30, 0x395, 0x25f, 0x1d, 0x246, 0x101, 0x1cf, 0x3ca, 0x71, 0x82, 0x227, 0xf0, 0x1da, 0x331, 0x69, 0x34c, 0x10c, 0x2fa, 0xf9, 0x1b5, 0x28a, 0x2a9, 0x330, 0x2bb, 0x3ee, 0x1cd, 0x267, 0x135, 0x100, 0x31d, 0x368, 0xb0, 0x1f, 0x3eb, 0x45, 0x4d, 0x2f0, 0x3e9, 0x1e8, 0x109, 0x372, 0x2d3, 0x270, 0x63, 0x5c, 0x151, 0x179, 0x122, 0x56, 0x241, 0x124, 0x2a1, 0x18d, 0x3a2, 0x1ef, 0x12c, 0x1c, 0x94, 0x1a3, 0x10e, 0x357, 0x1bd, 0x37, 0x3b0, 0x131, 0x25a, 0x195, 0x6c, 0x2c4, 0x326, 0x13f, 0x210, 0x340, 0xeb, 0x16b, 0x1fc, 0x1ad, 0x288, 0x201, 0x1c2, 0x1fe, 0x113, 0x222, 0x2f0, 0x3db, 0x3a9, 0x5a, 0x345, 0x2c6, 0x11f, 0x1ec, 0xaf, 0x3e1, 0x2a3, 0x40, 0x38a, 0x368, 0x160, 0x7c, 0x367, 0x59, 0x1b2, 0x157, 0x315, 0x3aa, 0x2ad, 0xd4, 0xcc, 0x359, 0x3ee, 0x39a, 0x18e, 0x1ba, 0x24, 0x378, 0x386, 0xa6, 0x33f, 0x46, 0x26d, 0x43, 0x17d, 0xf9, 0x36a, 0x23a, 0x165, 0x36c, 0x3dd, 0x24e, 0x371, 0x358, 0x243, 0x112, 0x38f, 0x78, 0x1da, 0x26b, 0x1a4, 0x256, 0xe4, 0x3ef, 0x237, 0x306, 0x3bb, 0x1e6, 0x286, 0x295, 0x284, 0x1cf, 0x39d, 0x1c4, 0x19, 0x238, 0x23f, 0x275, 0x3d6, 0x1ca, 0x8d, 0x17e, 0x20e, 0xfb, 0x30, 0x323, 0x16e, 0xe8, 0x21, 0x68, 0x33c, 0x2b1, 0x1fc, 0x249, 0x33b, 0x2fb, 0x5f, 0x55, 0x27c, 0x308, 0x32f, 0x2a0, 0x2b7, 0x1b, 0x162, 0x326, 0x27e, 0x52, 0x236, 0x2ab, 0x133, 0x3e7, 0x344, 0x35a, 0x232, 0x2c, 0x1f, 0x3b7, 0x59, 0x364, 0x155, 0x9e, 0x2de, 0x11d, 0x165, 0x2d1, 0x36f, 0x254, 0x375, 0x3ca, 0x1c4, 0x32, 0xf2, 0x1dc, 0x311, 0x22e, 0x27c, 0x219, 0xa7, 0x12d, 0x32a, 0x360, 0x26, 0x44, 0x26e, 0x161, 0x3a2, 0x3b5, 0x2e4, 0x309, 0x10d, 0xa0, 0x1b9, 0x1af, 0x3a4, 0x7b, 0x253, 0x3e1, 0x14f, 0x100, 0x6f, 0x2e5, 0x53, 0x33f, 0x8c, 0x1a6, 0x218, 0x3fd, 0x31f, 0x306, 0x37f, 0x391, 0x1d, 0x10a, 0x34, 0x33c, 0x16b, 0x3f9, 0x26c, 0x3dc, 0x3cf, 0x3ed, 0x2da, 0x6e, 0x1bf, 0x261, 0x313, 0x93, 0x211, 0x241, 0x99, 0x24a, 0x398, 0x1a1, 0x28c, 0x178, 0x3db, 0x35b, 0x168, 0x21e, 0x33, 0x3a8, 0x3ee, 0x33d, 0x231, 0x1cb, 0x240, 0x3c3, 0x78, 0x3b4, 0x1be, 0x13b, 0x121, 0xbf, 0x20e, 0x1f6, 0xc0, 0x12e, 0x2cd, 0x13f, 0x52, 0x65, 0x2be, 0x18a, 0x207, 0x4a, 0x346, 0x2bd, 0xda, 0x160, 0x1f0, 0x215, 0x26d, 0x10c, 0x3fd, 0x237, 0x3, 0x3ce, 0x16e, 0x3a0, 0x210, 0x236, 0x2be, 0x314, 0xe, 0x250, 0x5, 0x5b, 0x3b2, 0xe9, 0x239, 0x253, 0x3cb, 0x135, 0x12, 0x2f9, 0xf, 0xed, 0xdf, 0x13b, 0x242, 0x2fc, 0x54, 0x35f, 0x36, 0x302, 0x11, 0x137, 0x161, 0x34d, 0x2cf, 0x30d, 0xfc, 0x1e8, 0x5a, 0x10f, 0x33, 0x359, 0x3a3, 0x1de, 0x358, 0x11e, 0x104, 0x238, 0xee, 0x311, 0x55, 0x1e2, 0xec, 0x262, 0x1e1, 0x322, 0x30c, 0x241, 0x132, 0x13a, 0xff, 0x226, 0x134, 0x2af, 0x223, 0x16f, 0x11d, 0x2ca, 0x356, 0x34e, 0x101, 0x263, 0x35c, 0x3f8, 0x26c, 0x3b1, 0x327, 0x357, 0x1f3, 0x1db, 0x303, 0x2ac, 0x1ed, 0x1, 0x2bd, 0xda, 0x160, 0x1f0, 0x215, 0x26d, 0x10c, 0x3fd, 0x237, 0x3, 0x3ce, 0x16e, 0x3a0, 0x210, 0x236, 0x2be, 0x314, 0xe, 0x250, 0x5, 0x5b, 0x173, 0x368, 0x312, 0x33f, 0x230, 0x256, 0x329, 0x20e, 0x3d1, 0x1b, 0x302, 0x22, 0xd5, 0x31a, 0xb5, 0x146, 0x2f0, 0x2e7, 0x3aa, 0x145, 0x165, 0x356, 0x295, 0xd, 0x33c, 0x1a5, 0x3e7, 0x216, 0x346, 0x188, 0x2e8, 0x270, 0x239, 0xaf, 0x337, 0x1ba, 0x120, 0x38f, 0x3c0, 0x275, 0x28f, 0x27c, 0x76, 0x262, 0x3c2, 0x93, 0x56, 0x51, 0x201, 0x20b, 0x367, 0x2c8, 0x43, 0x3fa, 0x237, 0x6, 0x323, 0x362, 0x27e, 0x290, 0xbb, 0x1ef, 0x2e4, 0x3f, 0xf4, 0x5a, 0x21e, 0xcc, 0x2fe, 0x24e, 0x3be, 0x39d, 0x23b, 0x249, 0x1ee, 0x397, 0x357, 0x3e6, 0x365, 0x2e, 0x29a, 0x1d7, 0x40, 0x6f, 0x386, 0x139, 0x26b, 0x13b, 0x8d, 0x3e2, 0x2a0, 0x195, 0x2c9, 0x130, 0x92, 0x125, 0x339, 0x113, 0x134, 0x157, 0x9e, 0x36a, 0x1f4, 0x1e6, 0x1d, 0x21, 0x340, 0x2ab, 0x18a, 0xe, 0xa9, 0x14, 0x2d8, 0x35e, 0x2e6, 0x1bb, 0xa6, 0x39c, 0x299, 0x8d, 0x3cd, 0x292, 0xb3, 0xc3, 0x241, 0xc1, 0x384, 0x3b7, 0x2c8, 0x86, 0x3f3, 0x19c, 0x60, 0xb1, 0x106, 0x137, 0x18d, 0xb5, 0x28c, 0x3d2, 0x315, 0x2de, 0xfa, 0x1e6, 0x3a, 0x84, 0x236, 0x2ea, 0x12c, 0x380, 0x3d, 0x2d, 0x21e, 0x198, 0x3ea, 0x254, 0x39e, 0x35c, 0x3fb, 0x281, 0x1a3, 0x188, 0x1d9, 0x1d2, 0x1ec, 0x2e2, 0x231, 0x243, 0x104, 0xf2, 0x2fb, 0x1f9, 0x1bd, 0x2e9, 0x20f, 0x14d, 0x1d7, 0x80, 0x1bc, 0xf, 0x3b4, 0x1eb, 0x24b, 0x219, 0x131, 0x3c2, 0x126, 0x158, 0x288, 0x58, 0x1f0, 0x46, 0x291, 0x390, 0x20e, 0x3ab, 0x6c, 0x26, 0x220, 0x296, 0x339, 0x226, 0xd9, 0x2aa, 0x1f2, 0x183, 0x1e7, 0x2dc, 0x13f, 0x290, 0x176, 0x3b5, 0x30d, 0x3f0, 0x2bf, 0x2ad, 0x15b, 0x1ab, 0x295, 0x1a, 0xeb, 0x133, 0x207, 0x250, 0x14, 0x1b9, 0x163, 0xea, 0x1c5, 0x2e5, 0x139, 0x1be, 0x394, 0x308, 0x131, 0x38d, 0x91, 0x2d2, 0xda, 0x312, 0xe7, 0x348, 0x8d, 0x393, 0x25a, 0x191, 0x2b, 0xa2, 0x2c, 0x1f0, 0x8c, 0x256, 0xbf, 0xa8, 0x195, 0x336, 0x324, 0xc1, 0x301, 0x2c7, 0x26d, 0x72, 0x287, 0x3d1, 0x6c, 0x4c, 0x92, 0x9d, 0x3fc, 0x59, 0x225, 0x3fd, 0x19c, 0xc0, 0x2c4, 0x22, 0x354, 0x1cc, 0x113, 0xd9, 0x15d, 0x3c1, 0x3, 0x24f, 0x326, 0x34b, 0x2c2, 0xb5, 0x111, 0x353, 0x9e, 0x1b3, 0x37f, 0x16e, 0x13f, 0x129, 0x1d1, 0x197, 0xbc, 0x2e7, 0x2b3, 0x7d, 0x1e6, 0x74, 0x210, 0x194, 0x2f3, 0x1c1, 0x1f8, 0x2bf, 0x153, 0x165, 0x143, 0x10a, 0x340, 0x2be, 0x96, 0x380, 0x7a, 0xb4, 0xd4, 0x1b6, 0x1a7, 0xd, 0xeb, 0x266, 0xe, 0x2a4, 0x140, 0x345, 0x66, 0x1f5, 0x254, 0x335, 0x16b, 0x3e7, 0x4a, 0x5, 0x2d8, 0x163, 0x1d4, 0x34f, 0x38a, 0x386, 0x1da, 0x3d6, 0x27c, 0x3b0, 0x196, 0x2f2, 0x8, 0x6f, 0xf, 0x2cb, 0x28f, 0x3c4, 0x1bf, 0xab, 0x3bd, 0x40, 0x378, 0x78, 0x275, 0x55, 0x21f, 0x1e3, 0x151, 0x1d7, 0x200, 0x3f6, 0x3c0, 0x38c, 0x2a8, 0xdc, 0x303, 0x29a, 0x2a3, 0x24, 0x38f, 0x23f, 0x5f, 0x16d, 0x2e9, 0x2e, 0xfd, 0x135, 0x120, 0x47, 0x1dc, 0x2f8, 0x37a, 0x365, 0x170, 0x3e1, 0x1ba, 0x112, 0x238, 0x2fb, 0x3ed, 0x3e6, 0x31e, 0x392, 0x337, 0x1cb, 0x82, 0x1e4, 0x3f5, 0x357, 0x30f, 0xc6, 0xaf, 0x18e, 0x243, 0x19, 0x33b, 0x397, 0x28e, 0x4e, 0x239, 0x171, 0x6b, 0x23c, 0xc8, 0x1ee, 0x87, 0x5d, 0x270, 0x1ec, 0x39a, 0x358, 0x1c4, 0x249, 0x36b, 0x31, 0x2e8, 0x3a4, 0x37b, 0xef, 0x2f6, 0x23b, 0x26c, 0x36e, 0x188, 0x36d, 0x11f, 0x3ee, 0x371, 0x39d, 0x1fc, 0x344, 0x346, 0x5b, 0x35e, 0xea, 0x34f, 0x3be, 0x31d, 0x203, 0x2cb, 0x117, 0x30b, 0x1e3, 0x2a2, 0x355, 0x24, 0x317, 0xee, 0x2f8, 0x2fd, 0x18f, 0x392, 0x267, 0x325, 0x19, 0x27f, 0x247, 0x5d, 0xe9, 0x3b9, 0xef, 0x1e5, 0xfe, 0x344, 0x285, 0x16c, 0x2c6, 0x2bb, 0x12a, 0x263, 0x34a, 0x7, 0x141, 0x212, 0x6a, 0x36c, 0x123, 0x1a0, 0x175, 0xb9, 0xfc, 0x177, 0x28a, 0xf3, 0xe8, 0xa4, 0x2ec, 0x32e, 0x1e9, 0x4f, 0x366, 0x3ce, 0x193, 0x29f, 0x23d, 0x28d, 0x1b2, 0x2fa, 0xce, 0x180, 0x20d, 0x49, 0x13a, 0x3df, 0x332, 0xe4, 0x15, 0x2ce, 0x265, 0x116, 0x16, 0x3e0, 0x69, 0x242, 0x32f, 0x2f4, 0x24c, 0x1ad, 0x2d9, 0x298, 0x37c, 0x9f, 0x1d8, 0x196, 0x1ed, 0x20, 0x378, 0xf0, 0x1c6, 0x2a8, 0x1b8, 0x17, 0xfd, 0x26a, 0x89, 0x238, 0x1ff, 0x3af, 0x30f, 0x18c, 0x2bc, 0x6b, 0x71, 0x320, 0x36b, 0x62, 0x3b2, 0x11f, 0x3d5, 0x1df, 0xd7, 0x233, 0x1e, 0x275, 0x154, 0x1b8, 0x2e, 0x3f4, 0x374, 0x82, 0x399, 0x327, 0x5d, 0x1d2, 0x2ff, 0x371, 0x26f, 0x3ff, 0x94, 0x50, 0x283, 0x269, 0x34e, 0xd0, 0x175, 0x172, 0x3f0, 0x3aa, 0xfa, 0x25f, 0x27e, 0x2b4, 0x16a, 0x134, 0x2ba, 0x67, 0x180, 0x13, 0x124, 0x1c2, 0x187, 0x291, 0x17e, 0x292, 0x322, 0x2b0, 0x1b4, 0x14c, 0x37c, 0x13e, 0x369, 0xab, 0x2ef, 0x9, 0x38f, 0xee, 0x1f9, 0x3e6, 0x63, 0x15e, 0x6b, 0xe2, 0x9b, 0x36e, 0x229, 0x2b5, 0x359, 0x12a, 0xcf, 0x133, 0x38, 0x3d, 0x2d0, 0x2b6, 0x105, 0x108, 0x259, 0x2cf, 0x2f0, 0x4f, 0x2c5, 0x323, 0x83, 0x1aa, 0x339, 0x228, 0x86, 0x347, 0x35f, 0x19b, 0x8b, 0x16, 0x3c9, 0x1a4, 0x234, 0x29c, 0x22f, 0x204, 0x31d, 0xf, 0x33e, 0xaa, 0xdc, 0x17, 0x1fa, 0x1ba, 0x41, 0x3c8, 0x397, 0x22a, 0xe9, 0x37b, 0x3bc, 0x333, 0x3fb, 0x6f, 0x78, 0x38c, 0x16d, 0x365, 0x392, 0x18e, 0x23c, 0x249, 0x36e, 0x5b, 0x2c6, 0x2fe, 0x284, 0x1d6, 0x4b, 0x3f, 0x177, 0x23a, 0x32b, 0x27e, 0x161, 0x1a1, 0x1b2, 0x3fa, 0xfb, 0xd8, 0x192, 0x201, 0x3e0, 0x1a4, 0x61, 0x262, 0x15c, 0x8, 0x378, 0x3c0, 0x5f, 0x37a, 0x31e, 0xaf, 0x6b, 0x1c4, 0x26c, 0x346, 0x2d8, 0x21d, 0x3dd, 0xd, 0x2ab, 0x258, 0x1f8, 0x3aa, 0x1f4, 0x16e, 0x3d4, 0x31a, 0x113, 0x18b, 0x3ef, 0x3d1, 0x2c9, 0x8b, 0x2c, 0x33f, 0x13b, 0x308, 0x334, 0x2f2, 0x40, 0x3f6, 0x23f, 0x2f8, 0x3e6, 0xc6, 0x171, 0x358, 0x23b, 0x344, 0x206, 0x2ed, 0xcc, 0x2d7, 0x68, 0x175, 0x2e4, 0x3db, 0x16f, 0x3bb, 0x362, 0x29f, 0xe6, 0x8a, 0x43, 0x347, 0x2b7, 0x265, 0x51, 0x160, 0x1ce, 0x1ca, 0x76, 0x196, 0x3bd, 0x200, 0x38f, 0x1dc, 0x3ed, 0x30f, 0x239, 0x39a, 0x2f6, 0x1fc, 0x216, 0xde, 0x1e0, 0x5f, 0x2fd, 0x63, 0x171, 0x2b9, 0xfe, 0x216, 0x28, 0x10f, 0x36c, 0x10a, 0xca, 0x363, 0x1e9, 0x278, 0x6, 0x2c4, 0x49, 0x1c2, 0x215, 0x14a, 0x32f, 0x38d, 0x204, 0x6f, 0xf0, 0x22b, 0x37a, 0x235, 0x2bc, 0x358, 0x7f, 0x10b, 0x14, 0x283, 0x1b6, 0x85, 0x65, 0x3b5, 0x2f0, 0x13c, 0x3, 0x162, 0x220, 0xe1, 0x30e, 0xa5, 0x393, 0x3c2, 0x102, 0x233, 0x78, 0x311, 0x1bd, 0x31e, 0x15e, 0x1ac, 0x23b, 0x281, 0xa, 0x345, 0xdb, 0x246, 0x236, 0x3de, 0x178, 0x9e, 0x205, 0xb1, 0x110, 0x274, 0x187, 0x256, 0x3cd, 0x1e1, 0x81, 0x31d, 0x3c, 0x38c, 0x2da, 0x18f, 0xaf, 0xd6, 0x319, 0x344, 0x5, 0x3a6, 0x269, 0x123, 0x11b, 0x1ef, 0xbc, 0x4f, 0x306, 0x25c, 0x88, 0x13a, 0x2c7, 0x12b, 0x3e2, 0x2f4, 0x244, 0x38a, 0x1e, 0x1c6, 0x16d, 0x2c3, 0x253, 0x6b, 0x388, 0x1a2, 0x206, 0x1bc, 0x389, 0x2f8, 0x383, 0x7b, 0xef, 0x26f, 0x3c7, 0x141, 0x168, 0x2ca, 0xe8, 0x252, 0x16a, 0x1b2, 0x3f3, 0x3ab, 0x265, 0x144, 0x22d, 0x37c, 0x1e2, 0x3c6, 0xfd, 0x2e1, 0x32, 0x36b, 0x229, 0x185, 0x3dd, 0x34, 0x2ea, 0x30d, 0x38e, 0x2c5, 0x12e, 0x88, 0x274, 0x30e, 0x14a, 0x257, 0x22f, 0x4, 0x2f9, 0x23f, 0x3f2, 0x217, 0x1ec, 0x3bc, 0x1ae, 0x307, 0x10d, 0x1a9, 0x33a, 0x3a0, 0x15a, 0x1a1, 0x2c1, 0x3d7, 0x2b7, 0x186, 0x119, 0xa6, 0x1eb, 0x381, 0x303, 0x3f4, 0x396, 0xc8, 0x1b7, 0xb6, 0x21d, 0x36f, 0xd0, 0x3ba, 0x2f, 0x223, 0x306, 0xb1, 0x220, 0x1c2, 0x23, 0x121, 0x14e, 0xae, 0x10, 0x3f6, 0xee, 0x3d3, 0x4e, 0x3b9, 0x2eb, 0x2b1, 0x7, 0x3d, 0x2ad, 0xf3, 0x29b, 0x161, 0x28d, 0x316, 0x347, 0x2ce, 0x211, 0x6d, 0x298, 0x3a5, 0x21f, 0x17, 0x3cb, 0x243, 0x320, 0x2d5, 0x2d8, 0x378, 0x23f, 0x3ed, 0x4e, 0x37b, 0x3be, 0x1a5, 0x70, 0x3a9, 0x23a, 0x16e, 0x29f, 0x339, 0x2c8, 0x329, 0x12d, 0x91, 0x38a, 0x78, 0x5f, 0x3e6, 0x239, 0xef, 0xd7, 0x307, 0x21a, 0x2ad, 0x1e6, 0x27e, 0x31a, 0x8a, 0x218, 0x54, 0x191, 0x1ad, 0x386, 0x275, 0x16d, 0x31e, 0x171, 0x2f6, 0x3fb, 0xa9, 0x5a, 0x165, 0xe8, 0xad, 0x1a1, 0x18b, 0x347, 0x195, 0x56, 0x368, 0x1da, 0x55, 0x2e9, 0x392, 0x6b, 0x23b, 0x216, 0xa0, 0xd4, 0x286, 0x52, 0x293, 0x134, 0x3fa, 0x3d1, 0x265, 0x288, 0xa6, 0x3d6, 0x21f, 0x2e, 0x337, 0x23c, 0x26c, 0x206, 0x345, 0x36c, 0x21, 0xbb, 0x146, 0x2aa, 0x19c, 0xd8, 0x8b, 0x160, 0x26b, 0x27c, 0x1e3, 0xfd, 0x1cb, 0xc8, 0x36e, 0x2d8, 0xcc, 0x295, 0x236, 0x363, 0x3ad, 0x3c1, 0x180, 0x130, 0x201, 0x33f, 0x1ca, 0x3b0, 0x151, 0x135, 0x82, 0x1ee, 0x188, 0x2c6, 0x2f9, 0xee, 0x357, 0xe9, 0x3a3, 0x263, 0x314, 0xfc, 0x16f, 0x3ce, 0x11, 0x13a, 0x215, 0x242, 0x262, 0x1ed, 0x12, 0x238, 0x327, 0x3b2, 0x359, 0x101, 0x2be, 0x30d, 0x223, 0x3, 0x302, 0x132, 0x1f0, 0x13b, 0xec, 0x2ac, 0x135, 0x104, 0x3b1, 0x5b, 0x33, 0x34e, 0x236, 0x2cf, 0x2af, 0x237, 0x36, 0x241, 0x160, 0xdf, 0x1e2, 0x303, 0x3cb, 0x11e, 0x26c, 0x5, 0x10f, 0x356, 0x210, 0x34d, 0x134, 0x3fd, 0x35f, 0x30c, 0xda, 0xed, 0x55, 0x1db, 0x253, 0x358, 0x3f8, 0x250, 0x5a, 0x2ca, 0x3a0, 0x161, 0x226, 0x10c, 0x54, 0x322, 0x2bd, 0xf, 0x311, 0x1f3, 0x239, 0x1de, 0x35c, 0xe, 0x1e8, 0x11d, 0x16e, 0x137, 0xff, 0x26d, 0x2fc, 0x1e1, 0x1, 0x2f9, 0xee, 0x357, 0xe9, 0x3a3, 0x263, 0x314, 0xfc, 0x16f, 0x3ce, 0x11, 0x13a, 0x215, 0x242, 0x262, 0x1ed, 0x12, 0x238, 0x327, 0x3b2, 0x359, 0x1fb, 0x3b8, 0x28e, 0x28b, 0x95, 0x1d6, 0x172, 0x1c7, 0x306, 0x181, 0x132, 0x3e0, 0xe5, 0x369, 0x29a, 0x2e1, 0x190, 0x346, 0x3a6, 0x2d1, 0x108, 0x34d, 0x268, 0x3ef, 0x2ce, 0xac, 0x376, 0x33e, 0x2da, 0xc6, 0x273, 0x1ae, 0xe, 0x3d0, 0x7d, 0x362, 0x354, 0x3df, 0x256, 0xa7, 0x2b8, 0x200, 0x11c, 0x327, 0x36d, 0x17f, 0x1a, 0x3ba, 0x178, 0x1f2, 0x180, 0xc9, 0x58, 0x26b, 0x1e2, 0x20f, 0x337, 0xe2, 0x281, 0xa0, 0x350, 0x3a, 0xad, 0x28d, 0x86, 0x54, 0x24d, 0x2e6, 0x78, 0x17c, 0x217, 0x37b, 0x2e3, 0x266, 0x3f, 0x2b3, 0x3ce, 0x22, 0xe1, 0x8c, 0x61, 0xcb, 0x3ae, 0x112, 0xf7, 0x310, 0x21d, 0x34e, 0x65, 0x32e, 0x155, 0x338, 0x2c9, 0x144, 0x14c, 0x28f, 0x370, 0x32d, 0x358, 0x3f9, 0x152, 0x2d0, 0xf3, 0xf5, 0xe6, 0x164, 0x25b, 0x17a, 0x204, 0x2f9, 0x1dc, 0x147, 0x341, 0x24e, 0x3f6, 0x2fb, 0x5d, 0xea, 0x284, 0x175, 0x5e, 0xf9, 0x180, 0x192, 0x160, 0x37c, 0x21f, 0x170, 0x6b, 0x1fc, 0xa9, 0x2d0, 0x1e6, 0x3d4, 0x339, 0x26d, 0x3e2, 0x22f, 0x40, 0x47, 0x397, 0x36d, 0x2fe, 0x68, 0x1ef, 0x3ad, 0x237, 0xd8, 0x51, 0xa6, 0x28f, 0x2e9, 0xaf, 0x2f6, 0x3e7, 0x21a, 0x145, 0x16e, 0xd5, 0x3eb, 0x256, 0x14e, 0x2f2, 0x24, 0x1e4, 0x31, 0x2c6, 0x2d7, 0x236, 0x32e, 0x2aa, 0xfb, 0x265, 0x6d, 0x1da, 0x2a8, 0x31e, 0x39a, 0xd7, 0xe, 0x3a9, 0x1f4, 0x326, 0x125, 0x30e, 0x8d, 0x334, 0x1d7, 0x112, 0x1ee, 0x5b, 0xcc, 0x85, 0xbb, 0x222, 0x3fa, 0x2b7, 0x56, 0x376, 0x275, 0x37a, 0x239, 0x371, 0x1a5, 0x380, 0x3aa, 0x1e7, 0x22, 0x1c2, 0x230, 0x308, 0xab, 0x135, 0x19, 0x36e, 0x2ed, 0x36c, 0x108, 0x293, 0x1b2, 0x347, 0xb3, 0x1ad, 0xf, 0x5f, 0x30f, 0x37b, 0x1cf, 0x3e5, 0x3fe, 0x2e8, 0x2bb, 0x34, 0x1ef, 0x353, 0xce, 0x2c9, 0x119, 0xed, 0x2a8, 0x235, 0x273, 0x2b1, 0xe0, 0x1d5, 0x1e7, 0x44, 0x301, 0x1a4, 0xec, 0x14d, 0x1cb, 0x9b, 0xa, 0xd4, 0x3a, 0x2b4, 0x8a, 0x1c8, 0xbd, 0x1, 0x3e5, 0x3fe, 0x2e8, 0x2bb, 0x34, 0x1ef, 0x353, 0xce, 0x2c9, 0x119, 0xed, 0x2a8, 0x235, 0x273, 0x2b1, 0xe0, 0x1d5, 0x1e7, 0x44, 0x301, 0x1a4, 0xec, 0x14d, 0x1cb, 0x9b, 0xa, 0xd4, 0x3a, 0x2b4, 0x8a, 0x1c8, 0xbd, 0x1, 0x3e5, 0x3fe, 0x2e8, 0x2bb, 0x34, 0x1ef, 0x353, 0xce, 0x2c9, 0x119, 0xed, 0x2a8, 0x235, 0x273, 0x2b1, 0xe0, 0x1d5, 0x1e7, 0x44, 0x301, 0x1a4, 0xec, 0x14d, 0x1cb, 0x9b, 0xa, 0xd4, 0x3a, 0x2b4, 0x8a, 0x1c8, 0xbd, 0x1, 0x3e5, 0x3fe, 0x2e8, 0x2bb, 0x34, 0x1ef, 0x353, 0xce, 0x2c9, 0x119, 0xed, 0x2a8, 0x235, 0x273, 0x2b1, 0x3c3, 0x3e3, 0x36d, 0x3ea, 0x289, 0x32e, 0x2ba, 0x3ab, 0x56, 0x1c3, 0x311, 0x30f, 0x1f7, 0xcf, 0x258, 0x38e, 0xc, 0x130, 0xb0, 0x2f1, 0xdc, 0x253, 0x1e5, 0x307, 0x3d0, 0x3e8, 0x106, 0xe1, 0x69, 0x76, 0x14d, 0x396, 0x26c, 0x50, 0x15b, 0x349, 0x73, 0x199, 0x3e2, 0xae, 0x9, 0x1e4, 0xc4, 0x33, 0x85, 0x2ec, 0x268, 0x347, 0x2cc, 0x2e6, 0x3c0, 0x3af, 0x341, 0x254, 0x2be, 0xbc, 0x3c1, 0x6c, 0xa2, 0x139, 0x154, 0x235, 0xef, 0x2d6, 0x309, 0x16f, 0x97, 0x124, 0x3e0, 0x321, 0x3c6, 0x337, 0x319, 0x128, 0x2d0, 0x391, 0x137, 0x3eb, 0x14a, 0xcd, 0x1d7, 0x41, 0x2df, 0x2ed, 0x1ab, 0xa4, 0x1a1, 0x10c, 0x149, 0x81, 0x1fb, 0x1ff, 0x2e8, 0x17f, 0xd0, 0x363, 0x155, 0x1f6, 0x30c, 0x1bb, 0xe3, 0x3e6, 0x3b9, 0x39e, 0x4b, 0x377, 0x205, 0x26, 0x16, 0xdf, 0x21f, 0x1c9, 0x2b9, 0x3e7, 0x38f, 0x397, 0x35e, 0x2d7, 0x194, 0x222, 0x3ef, 0xb3, 0x173, 0x3c0, 0x357, 0x11f, 0x284, 0x3ba, 0x3ad, 0x19c, 0x265, 0x368, 0x275, 0x3e6, 0x37b, 0x263, 0x258, 0x315, 0x30, 0x192, 0x312, 0x28f, 0x365, 0x39a, 0x2b1, 0x380, 0x16f, 0x12e, 0x99, 0x33f, 0x27c, 0x2e, 0x6b, 0x3fb, 0x21a, 0x23a, 0x326, 0x13a, 0x230, 0x76, 0x29a, 0x243, 0x344, 0x109, 0x33a, 0x3d4, 0x1fe, 0x256, 0x262, 0x1d7, 0x82, 0x36e, 0x345, 0x286, 0xad, 0x8a, 0x329, 0x3c2, 0x40, 0x238, 0x31, 0x21d, 0x85, 0x1d1, 0x1b2, 0x20e, 0x93, 0x6f, 0x1dc, 0x5d, 0x359, 0x68, 0x363, 0x2aa, 0x3d1, 0x56, 0x386, 0x5f, 0x4e, 0x34f, 0x1d6, 0x30d, 0xf9, 0x1b, 0x51, 0x139, 0x2a8, 0xc6, 0x371, 0x133, 0x1f8, 0x366, 0x302, 0x201, 0x26b, 0x21f, 0x392, 0x2f6, 0x307, 0x3a9, 0x3bb, 0x22, 0x20b, 0x13b, 0x1bf, 0x3e1, 0x1c4, 0x94, 0x317, 0x247, 0x2c6, 0x123, 0x2ec, 0x1b2, 0x15, 0x24c, 0x378, 0x1ff, 0x3b2, 0x3dd, 0x65, 0x111, 0x3ef, 0x166, 0x1c5, 0x23f, 0x115, 0x3a8, 0x68, 0x2cf, 0x2ba, 0x2b7, 0x169, 0x3c, 0x3ed, 0x341, 0x142, 0x3ba, 0x353, 0x279, 0x30c, 0x2e5, 0x22b, 0x4e, 0x297, 0x351, 0x5e, 0x38b, 0x360, 0x6d, 0x19f, 0x1f3, 0x37b, 0xcf, 0x172, 0x9e, 0x300, 0x22c, 0x139, 0x159, 0x318, 0x3be, 0x314, 0x377, 0x6, 0x260, 0x189, 0x28f, 0x2c3, 0x273, 0x1a5, 0x7e, 0x1b3, 0x302, 0xb, 0x1be, 0xdc, 0x15e, 0x26f, 0x70, 0x35d, 0x97, 0x99, 0x277, 0x1e2, 0x170, 0x2b9, 0x387, 0x3a9, 0x37f, 0x88, 0x7c, 0x394, 0x385, 0x18e, 0x3f8, 0x10d, 0x23a, 0x245, 0xe1, 0x1a4, 0x369, 0x3f4, 0x1c4, 0x128, 0x352, 0x16e, 0x14b, 0x23, 0x308, 0x2a2, 0x325, 0x344, 0x212, 0xf3, 0x29f, 0x3df, 0x242, 0x196, 0x26a, 0x320, 0x14, 0x227, 0x10e, 0x21d, 0x214, 0x12f, 0x43, 0x292, 0x2, 0x47, 0x21c, 0x33, 0x21, 0x25e, 0x86, 0x12d, 0x4, 0x8e, 0x31, 0x66, 0x42, 0xb5, 0x10c, 0x25a, 0x8, 0x11c, 0x62, 0xcc, 0x84, 0x16a, 0x218, 0xbd, 0x10, 0x238, 0xc4, 0x198, 0x108, 0x2d4, 0x39, 0x17a, 0x20, 0x79, 0x188, 0x330, 0x210, 0x1a1, 0x72, 0x2f4, 0x40, 0xf2, 0x310, 0x269, 0x29, 0x342, 0xe4, 0x1e1, 0x80, 0x1e4, 0x229, 0xdb, 0x52, 0x28d, 0x1c8, 0x3c2, 0x100, 0x3c8, 0x5b, 0x1b6, 0xa4, 0x113, 0x390, 0x38d, 0x200, 0x399, 0xb6, 0x36c, 0x148, 0x226, 0x329, 0x313, 0x9, 0x33b, 0x16c, 0x2d1, 0x290, 0x45, 0x25b, 0x22f, 0x12, 0x27f, 0x2d8, 0x1ab, 0x129, 0x8a, 0xbf, 0x57, 0x24, 0xf7, 0x1b9, 0x356, 0x252, 0x114, 0x17e, 0xae, 0x48, 0x1ee, 0x372, 0x2a5, 0xad, 0x228, 0x2fc, 0x15c, 0x90, 0x3dc, 0x2ed, 0x47, 0x31, 0xcc, 0x108, 0x1a1, 0xe4, 0x3c2, 0x200, 0x33b, 0x2d8, 0x356, 0xad, 0x59, 0x3e2, 0x2f2, 0x112, 0x36e, 0x21e, 0xe8, 0xe6, 0x34c, 0x262, 0x2a3, 0xc8, 0x14, 0x165, 0x3d4, 0x3eb, 0x8d, 0xab, 0x1cb, 0x344, 0x5a, 0x32b, 0x2a1, 0x46, 0x76, 0xfd, 0x1c4, 0xa9, 0x145, 0x326, 0x1c2, 0x13b, 0x1e3, 0x18e, 0x3fb, 0xf4, 0x3bb, 0x110, 0x3e0, 0x27c, 0x170, 0x2f6, 0xe, 0x3aa, 0x12e, 0xc1, 0x26b, 0xdc, 0x171, 0x2b1, 0x3f, 0x366, 0x26, 0x160, 0x28f, 0x31e, 0x371, 0x18a, 0x2e7, 0x30, 0x8b, 0x139, 0x16d, 0x1ec, 0x263, 0x2e4, 0xf9, 0xd8, 0x6d, 0x275, 0x30f, 0x34f, 0x2ab, 0x2f0, 0x19c, 0x30c, 0x386, 0x2f8, 0x3a4, 0x284, 0x1ef, 0x2aa, 0x2b7, 0x1ad, 0x3c0, 0x28e, 0x359, 0x340, 0x146, 0x3ef, 0x191, 0x6f, 0x2fb, 0x36d, 0x2d7, 0xbb, 0x1b2, 0x54, 0x81, 0x38f, 0x87, 0x21d, 0x8e, 0xc4, 0x269, 0xa4, 0x45, 0x17e, 0x2b8, 0x89, 0x36e, 0x35, 0x3a0, 0x339, 0xa5, 0xcb, 0x1ba, 0xd1, 0x2d, 0x32b, 0x14b, 0x118, 0x3b0, 0x3cb, 0xfe, 0x21a, 0x3e8, 0x88, 0x3e0, 0xf1, 0x1c9, 0x39d, 0xe0, 0x1b5, 0x302, 0x58, 0x343, 0x31e, 0x2eb, 0x221, 0x315, 0x300, 0x144, 0x2cb, 0x3c5, 0x3a3, 0x2ab, 0x1e9, 0x279, 0x56, 0x1e, 0x3af, 0xea, 0xd0, 0xa3, 0x3ef, 0x322, 0x1bc, 0x3f5, 0x2b5, 0x246, 0x293, 0x86, 0xbd, 0x40, 0x3c8, 0x16c, 0x356, 0x15a, 0x164, 0x32f, 0x373, 0x208, 0x206, 0x15b, 0x1ea, 0x3eb, 0x11a, 0x2ac, 0x243, 0x25, 0x352, 0x362, 0x274, 0x299, 0x1e3, 0x31c, 0x3f7, 0x3a9, 0x3ce, 0x248, 0x1ce, 0x37, 0x2bc, 0x2b1, 0x7e, 0x183, 0x130, 0x22d, 0x154, 0x239, 0x39e, 0x172, 0xf9, 0x1b0, 0x1b4, 0x38c, 0x9c, 0x12a, 0x3ba, 0x2ae, 0x35f, 0x1ad, 0x389, 0x22a, 0x2fe, 0x11c, 0x310, 0x36c, 0x252, 0xb2, 0x32f, 0x2ef, 0x32, 0x14, 0x19d, 0x137, 0x30e, 0x3b, 0x1fa, 0x23b, 0x10d, 0x3e8, 0x110, 0x39b, 0x381, 0xaf, 0x35c, 0x7e, 0x306, 0xc9, 0x14c, 0x16d, 0x3b9, 0x271, 0x5e, 0xce, 0x211, 0xf, 0x3af, 0x1d4, 0x340, 0x111, 0x287, 0x91, 0x3c3, 0x10e, 0xcc, 0x29, 0x226, 0x17e, 0x179, 0x224, 0x346, 0x350, 0xf5, 0x3eb, 0x234, 0x2a2, 0x23c, 0x250, 0x28a, 0x106, 0x3e, 0x9f, 0x170, 0x3ca, 0xe0, 0x36a, 0x13, 0x2c0, 0x55, 0x318, 0x39e, 0x2e4, 0x3e4, 0x19b, 0x376, 0x17c, 0x341, 0xd, 0x197, 0x3fd, 0x191, 0x1bc, 0x3e3, 0x2c6, 0x214, 0x16a, 0xe4, 0x313, 0x48, 0x36b, 0x10f, 0x1d0, 0x339, 0x14a, 0x32c, 0x1cb, 0x10b, 0x1a9, 0x362, 0xe1, 0x276, 0x303, 0x1ac, 0x207, 0x3aa, 0xb1, 0xb, 0x3d6, 0x18f, 0x2eb, 0x4b, 0x4f, 0x36, 0x6d, 0x1c6, 0x9c, 0x254, 0x238, 0x5b, 0x356, 0x161, 0x26d, 0x262, 0x135, 0x26c, 0x5a, 0x16e, 0x13a, 0x13b, 0x303, 0x358, 0xe, 0x16f, 0x302, 0x160, 0x55, 0x239, 0x263, 0x30d, 0x237, 0x30c, 0xf, 0x357, 0x359, 0x236, 0x134, 0x54, 0x1, 0x238, 0x5b, 0x356, 0x161, 0x26d, 0x262, 0x135, 0x26c, 0x5a, 0x16e, 0x13a, 0x13b, 0x303, 0x358, 0xe, 0x16f, 0x302, 0x160, 0x55, 0x239, 0x263, 0x30d, 0x237, 0x30c, 0xf, 0x357, 0x359, 0x236, 0x134, 0x54, 0x1, 0x238, 0x5b, 0x356, 0x161, 0x26d, 0x262, 0x135, 0x26c, 0x5a, 0x16e, 0x13a, 0x13b, 0x303, 0x358, 0xe, 0x16f, 0x302, 0x160, 0x55, 0x239, 0x263, 0x30d, 0x237, 0x30c, 0xf, 0x357, 0x359, 0x236, 0x134, 0x54, 0x1, 0x238, 0x5b, 0x356, 0x161, 0x26d, 0x262, 0x135, 0x26c, 0x5a, 0x16e, 0x13a, 0x13b, 0x303, 0x358, 0xe, 0x16f, 0x302, 0x160, 0x55, 0x239, 0x263, 0x79, 0x16c, 0x286, 0x23d, 0x12b, 0x196, 0x396, 0x4a, 0x145, 0x20c, 0x1f0, 0x3c4, 0x15e, 0x2d6, 0x3db, 0x60, 0x144, 0x275, 0x9c, 0x142, 0x363, 0x3fd, 0x24d, 0x3f6, 0x10e, 0x330, 0x290, 0xb2, 0xa7, 0x2a3, 0x9b, 0x2d, 0x16e, 0x274, 0xe5, 0x2e, 0x1e5, 0x1c0, 0x366, 0x260, 0x298, 0x37a, 0x3d5, 0x2be, 0x157, 0x167, 0x1c5, 0x2fb, 0x2b5, 0x214, 0x1a1, 0x25b, 0x179, 0x82, 0x5, 0x19d, 0xd5, 0x8c, 0x2db, 0x18e, 0x3c7, 0x1d5, 0x162, 0x58, 0x22e, 0x239, 0xcf, 0x2f, 0x19c, 0xac, 0x1e0, 0x5d, 0x3b3, 0x2ec, 0x43, 0x2f4, 0x12, 0x36b, 0x35, 0x13f, 0x3eb, 0xc2, 0x27a, 0x23b, 0x3d, 0x2f7, 0x99, 0xdf, 0x3b6, 0x371, 0x96, 0x278, 0x2c9, 0x2e5, 0x3f2, 0xea, 0x289, 0x9a, 0x54, 0x2, 0xf2, 0x2d8, 0x105, 0x73, 0x256, 0x32c, 0x325, 0x94, 0x28a, 0x11, 0x3e0, 0x381, 0x2bc, 0x1a5, 0xf2, 0x1b9, 0x1d, 0x398, 0x121, 0x151, 0xe2, 0x282, 0x3bb, 0x248, 0xdf, 0x365, 0x1df, 0xb9, 0x3c1, 0x186, 0x1e, 0x28e, 0x3ea, 0x176, 0x43, 0x1e1, 0x48, 0x36e, 0x350, 0x3a1, 0x30e, 0x1d8, 0x267, 0x3e7, 0x1d5, 0x2c4, 0x160, 0x154, 0x3d8, 0x1d6, 0x3d2, 0x3ab, 0x173, 0x379, 0x2b5, 0x21, 0x28d, 0x2fc, 0x3bd, 0x64, 0x140, 0x32b, 0x9d, 0x276, 0x2e, 0x3ca, 0x309, 0x306, 0x241, 0x3b4, 0x30f, 0x12a, 0x3de, 0x3fa, 0x24d, 0x3e5, 0x31, 0x1b6, 0x15a, 0x26d, 0x19a, 0x374, 0x216, 0x2a6, 0x20c, 0x3e0, 0x30b, 0x2e2, 0x133, 0x38e, 0x36, 0x368, 0x17c, 0x23e, 0x340, 0x9a, 0xa8, 0x8, 0x399, 0x1d3, 0xe8, 0xff, 0x11a, 0x29a, 0x319, 0x3d, 0x1e7, 0x264, 0x2f1, 0x31e, 0x2e3, 0x1c1, 0x237, 0x2b, 0xf0, 0x5d, 0x36f, 0x3a2, 0x218, 0x313, 0x240, 0x346, 0x2b6, 0x137, 0x46, 0x2db, 0x31c, 0x307, 0x1e4, 0x2ed, 0xe8, 0x1fe, 0x61, 0xfd, 0x1fc, 0x3a9, 0x12e, 0x2c, 0x55, 0x1ec, 0x1d6, 0x3ad, 0x2b7, 0x38a, 0x3f5, 0x21d, 0x52, 0x59, 0x14e, 0x135, 0x344, 0x2ad, 0x106, 0x3e0, 0x21f, 0x39a, 0x18a, 0x9e, 0x2c9, 0x386, 0x357, 0x2fe, 0xbb, 0x43, 0x3c2, 0x120, 0x346, 0x165, 0xd5, 0x230, 0x1e3, 0x358, 0x70, 0x366, 0x192, 0x1da, 0x30f, 0x254, 0x363, 0x3ef, 0x91, 0x47, 0x5b, 0x286, 0xe6, 0x294, 0x151, 0x1c4, 0x21a, 0x1e7, 0xc1, 0x3d6, 0xc6, 0x263, 0x5e, 0xfb, 0x1ad, 0x1dc, 0x35e, 0x21, 0x113, 0x3e2, 0x1d7, 0x249, 0x5a, 0x362, 0x20b, 0x27c, 0xaf, 0x1a5, 0x2e7, 0x1b, 0x368, 0x2f8, 0xea, 0x236, 0x1b2, 0x12d, 0x200, 0x36b, 0xd4, 0x3d4, 0x30e, 0x3b0, 0x18e, 0x307, 0x16f, 0x26, 0xa6, 0x37a, 0x34f, 0x3ba, 0x17d, 0x191, 0x3f6, 0x31, 0x36c, 0x161, 0x34c, 0x196, 0x243, 0xa9, 0x3c8, 0x3a6, 0x349, 0x3df, 0x3b, 0x337, 0x3c7, 0x2b3, 0x26, 0x14c, 0x1f3, 0x24e, 0x3de, 0x3f3, 0x91, 0x8e, 0x16c, 0x1d, 0x27b, 0x234, 0xfd, 0x3f8, 0x2bf, 0x162, 0x2c0, 0x2b2, 0x3ee, 0x2ea, 0x2ba, 0x191, 0x3e5, 0xc4, 0x356, 0x23d, 0x14a, 0x151, 0x388, 0x7a, 0x323, 0xb, 0x22e, 0x1ec, 0x3ac, 0x2af, 0x195, 0xde, 0x247, 0x269, 0x15a, 0x1a6, 0x196, 0x8f, 0x2a4, 0x3bb, 0x132, 0x1eb, 0xc6, 0xcf, 0x178, 0x3d1, 0x2e6, 0x3fe, 0x21d, 0xa4, 0x164, 0x262, 0x374, 0x4a, 0x23a, 0x220, 0x331, 0x365, 0x375, 0x382, 0x19c, 0x169, 0xee, 0x35e, 0x42, 0x45, 0x32f, 0x14f, 0x1a2, 0x2ad, 0x20c, 0x39b, 0xdc, 0x1de, 0x12c, 0x3c1, 0x211, 0x1e0, 0x2e8, 0x123, 0x2d4, 0x17e, 0x373, 0x320, 0x5a, 0x2cd, 0x3e, 0x3c4, 0x2e2, 0xc5, 0x9e, 0x19b, 0x203, 0x28e, 0x3b3, 0x34d, 0xe4, 0x2b8, 0x208, 0xa0, 0x399, 0x283, 0x27e, 0x187, 0x369, 0x6b, 0x38, 0x2c5, 0x8b, 0x33e, 0xe9, 0x68, 0x9a, 0x149, 0x200, 0x1b7, 0x15b, 0xd5, 0xd2, 0x20f, 0x39d, 0xfc, 0x60, 0x6d, 0x17c, 0x1d4, 0x194, 0x225, 0x38d, 0x112, 0xa, 0x3cc, 0x13a, 0x321, 0x32d, 0x1a5, 0x38e, 0x1b0, 0x386, 0x147, 0x3b3, 0x293, 0x390, 0x1ed, 0xc8, 0x2d, 0x2cd, 0x7c, 0x30b, 0x33d, 0x4b, 0x3e4, 0x211, 0x3c0, 0x3b2, 0x10a, 0x113, 0x393, 0x14f, 0x344, 0x2a6, 0x44, 0x1ce, 0x3b6, 0x375, 0x30d, 0x279, 0x35a, 0x2fb, 0x30a, 0xa4, 0x2c8, 0x19a, 0x396, 0xa9, 0x3d9, 0x132, 0x3d6, 0x318, 0x271, 0x3ad, 0x2ce, 0xde, 0x87, 0x1b6, 0x2c2, 0x256, 0x2ac, 0x388, 0xf4, 0x97, 0x58, 0x2a8, 0x1f7, 0x2ea, 0x17d, 0x24d, 0x317, 0x5b, 0x20a, 0x27b, 0x61, 0x3f4, 0x3ff, 0x3aa, 0x13, 0x14c, 0x3e6, 0x12a, 0x2cf, 0x347, 0x204, 0x3c8, 0x345, 0x33b, 0x21e, 0x3d4, 0x46, 0x1e3, 0x2f6, 0x3f, 0x30, 0x6d, 0x2f8, 0x359, 0xbb, 0x218, 0x15c, 0x19, 0x109, 0x362, 0x7c, 0x21f, 0xef, 0x258, 0x237, 0x2b0, 0x1dc, 0x2c6, 0x52, 0x2c8, 0x334, 0x243, 0x141, 0x1e7, 0x201, 0x55, 0x37b, 0x175, 0x17d, 0x93, 0x47, 0x2d8, 0xe8, 0x3eb, 0x76, 0x18e, 0xe, 0x366, 0x8b, 0x275, 0x3a4, 0x340, 0x1b2, 0x17a, 0x120, 0x206, 0x1e6, 0x13a, 0x24b, 0xaf, 0x133, 0x9e, 0x265, 0x78, 0x2e8, 0x85, 0x113, 0x32f, 0x135, 0x216, 0x23a, 0x92, 0x37c, 0xc6, 0x33c, 0x3ad, 0x195, 0x378, 0x31, 0x356, 0xe6, 0x8d, 0xfd, 0x3fb, 0x3aa, 0x26, 0x139, 0x30f, 0x284, 0x146, 0x54, 0x40, 0x36b, 0x2a9, 0xd5, 0x1a4, 0x2e, 0xd7, 0x3db, 0x1b, 0x376, 0x357, 0x3dd, 0x293, 0x329, 0x3bd, 0x249, 0x2d0, 0x106, 0x33f, 0x2e9, 0x3be, 0x30d, 0xfb, 0x173, 0x3f5, 0xcc, 0x27f, 0x6a, 0x29f, 0x69, 0x17, 0xd7, 0x3bf, 0x6c, 0x386, 0x115, 0x34e, 0x1a1, 0x3cd, 0x29e, 0x216, 0x7d, 0x248, 0x3d6, 0x7b, 0x351, 0x2aa, 0x322, 0x227, 0x2d8, 0x1d0, 0x3b7, 0x3b0, 0xd6, 0x1c0, 0x6, 0x119, 0x17c, 0x359, 0x176, 0x72, 0x2f2, 0x190, 0x168, 0x106, 0x277, 0x3b6, 0x1cf, 0xbc, 0x35f, 0x6f, 0x10e, 0x1ab, 0xe6, 0x11a, 0x3f4, 0x3e7, 0x2de, 0xc9, 0x2cb, 0xe9, 0x1a0, 0x1b2, 0x2f4, 0x89, 0x14, 0x25f, 0x301, 0x3c4, 0x33d, 0x12c, 0x237, 0x169, 0x379, 0x21d, 0x129, 0x1a6, 0xab, 0x388, 0x3d0, 0x162, 0x22d, 0x1f3, 0x254, 0x255, 0x2a, 0x40, 0x2df, 0x2b6, 0x2a1, 0x276, 0x1c9, 0x1a5, 0x223, 0x336, 0x78, 0x1d9, 0x214, 0x8a, 0x29c, 0x2e1, 0xa9, 0x37f, 0x304, 0x55, 0x2ff, 0x1dd, 0x3fa, 0x122, 0xf2, 0x345, 0xf5, 0x23, 0x1e3, 0x1e5, 0xfc, 0x180, 0x2d9, 0x3af, 0x3dd, 0xf7, 0x1a8, 0xd5, 0x299, 0x2e0, 0x1a5, 0x4f, 0xc3, 0x3c0, 0x1af, 0x210, 0x2c8, 0xcb, 0x71, 0xf4, 0xb1, 0x22d, 0x3e6, 0x142, 0x28c, 0x2a0, 0x12, 0x285, 0x1e6, 0xe1, 0xf1, 0x39a, 0x12c, 0x67, 0x1ad, 0x3fe, 0x198, 0x161, 0x14a, 0x13d, 0x3fb, 0x2b3, 0x260, 0x2cb, 0x1d2, 0x289, 0x18b, 0x313, 0x104, 0x109, 0x193, 0x3c9, 0x2e9, 0x2e3, 0xbc, 0x2b7, 0x1bc, 0x62, 0x286, 0xff, 0x219, 0x18e, 0x38, 0x205, 0x288, 0x17c, 0x2bb, 0x1d1, 0x390, 0x373, 0x26c, 0x2a6, 0x220, 0x37c, 0x318, 0x3ac, 0x2aa, 0x24d, 0x8e, 0x2ed, 0x13f, 0x215, 0x1e3, 0x3ca, 0x3f0, 0x1b, 0x1c3, 0x115, 0x295, 0x28d, 0x257, 0x1ba, 0x250, 0x37f, 0x201, 0x154, 0x3d5, 0x1ef, 0x3a7, 0x2, 0x1ee, 0x350, 0x1aa, 0x13b, 0x1c9, 0x34a, 0x9e, 0x186, 0x389, 0x35e, 0x29, 0x199, 0x196, 0xe2, 0x1e8, 0x162, 0x53, 0x3c5, 0x284, 0x1ee, 0x2a9, 0x2a1, 0x1ca, 0xaf, 0x18a, 0x3c1, 0x2b0, 0x2fb, 0xcc, 0x161, 0x294, 0xfd, 0x3e7, 0x36a, 0x8b, 0x38c, 0xea, 0xbb, 0xe4, 0x3bd, 0x26c, 0x145, 0x92, 0x3d6, 0x1ec, 0x175, 0x3fa, 0x81, 0x33b, 0xd4, 0xd5, 0x13b, 0x392, 0x133, 0xf9, 0x56, 0x1dc, 0x21d, 0xad, 0x256, 0x29a, 0x3fb, 0x16f, 0x192, 0x275, 0x11f, 0x194, 0x218, 0x2f2, 0x249, 0x2ad, 0x110, 0x37c, 0x239, 0x2ab, 0x17d, 0x91, 0x1e4, 0x21e, 0x29f, 0x1a4, 0x170, 0x1a5, 0x9e, 0x30c, 0x23f, 0x2c6, 0x290, 0x34c, 0x151, 0x1fc, 0x3aa, 0x130, 0x2cb, 0x3a4, 0x236, 0x43, 0x15c, 0xc8, 0x2d0, 0x22, 0x26b, 0xc6, 0x1d6, 0x2aa, 0x93, 0x238, 0x345, 0x3d4, 0x230, 0x2e, 0x2b1, 0x315, 0x265, 0x3c0, 0x35e, 0x52, 0x26d, 0xab, 0x23b, 0x177, 0x26, 0x1da, 0x270, 0x340, 0x18b, 0x22f, 0x19, 0x5a, 0x106, 0x1ce, 0x31e, 0x33c, 0x3dc, 0x2b6, 0x125, 0x9f, 0x1cd, 0x258, 0x338, 0x1c5, 0x87, 0x2a5, 0xff, 0x76, 0xd6, 0x21b, 0x180, 0x2e5, 0x22a, 0x85, 0x114, 0x19a, 0x23c, 0x1e8, 0x181, 0x139, 0x9c, 0x1a0, 0x18b, 0x57, 0x64, 0x2d0, 0x44, 0x1be, 0x239, 0x15f, 0x1fd, 0x81, 0x27f, 0x350, 0x2a1, 0x394, 0x2bc, 0x4b, 0x67, 0x2bd, 0x397, 0x2d1, 0x398, 0x308, 0x31c, 0x1c0, 0x30, 0x2d9, 0x147, 0x295, 0x226, 0x131, 0x243, 0x3d, 0xb1, 0xa6, 0x217, 0x34, 0x1b2, 0x38d, 0x208, 0x5a, 0x20c, 0x331, 0xc6, 0x3ac, 0x2ba, 0x91, 0x3c8, 0x6a, 0xd5, 0x276, 0x253, 0x18a, 0x38b, 0x2d2, 0x3f5, 0xdb, 0x73, 0x61, 0x267, 0x38, 0x6, 0xda, 0x3af, 0x2d7, 0x342, 0xa7, 0x1cb, 0x282, 0x97, 0x312, 0x3c5, 0x202, 0x134, 0x2f4, 0x41, 0x109, 0x245, 0xe7, 0x31e, 0x271, 0x155, 0x93, 0x79, 0x10f, 0x29f, 0x348, 0x1c9, 0x133, 0x3b1, 0x2ca, 0x13a, 0x1e2, 0x1de, 0x30d, 0x35f, 0x2f9, 0x5b, 0x3a0, 0x215, 0x303, 0x35c, 0x223, 0x30c, 0xee, 0x33, 0x161, 0x242, 0x3cb, 0xe, 0x3, 0xda, 0x357, 0x34e, 0x226, 0x262, 0x11e, 0x1e8, 0x302, 0xed, 0xe9, 0x236, 0x10c, 0x1ed, 0x26c, 0x11d, 0x132, 0x55, 0x3a3, 0x2cf, 0x54, 0x12, 0x5, 0x16e, 0x1f0, 0x1db, 0x263, 0x2af, 0x322, 0x238, 0x10f, 0x137, 0x13b, 0x253, 0x314, 0x237, 0x2bd, 0x327, 0x356, 0xff, 0xec, 0x358, 0xfc, 0x36, 0xf, 0x3b2, 0x210, 0x26d, 0x2ac, 0x3f8, 0x16f, 0x241, 0x311, 0x359, 0x34d, 0x2fc, 0x135, 0x250, 0x3ce, 0x160, 0x1f3, 0x101, 0x134, 0x1e1, 0x104, 0x5a, 0x11, 0xdf, 0x239, 0x2be, 0x3fd, 0x1, 0x3b1, 0x2ca, 0x13a, 0x1e2, 0x1de, 0x30d, 0x35f, 0x2f9, 0x5b, 0x3a0, 0x215, 0x303, 0x35c, 0x223, 0x30c, 0xee, 0x33, 0x161, 0x242, 0x3cb, 0xe, 0x36b, 0x33a, 0x1c2, 0x21f, 0x3be, 0x2f0, 0xb3, 0x47, 0x345, 0x29f, 0x13b, 0xaf, 0x4b, 0x19c, 0x38a, 0x31, 0x1d, 0x367, 0x1e3, 0xd7, 0x315, 0x30c, 0x1dc, 0xcc, 0x31a, 0x61, 0x18e, 0x380, 0x180, 0x386, 0x2e8, 0x108, 0x26d, 0x151, 0x3fb, 0x36a, 0x51, 0x2f8, 0x3dd, 0x1a1, 0x14e, 0x243, 0xf4, 0x302, 0x1da, 0x3a4, 0x194, 0xe4, 0x1d7, 0x216, 0x3bb, 0x2c, 0x37a, 0x284, 0x134, 0x3c2, 0x19, 0x2d0, 0x110, 0x3d6, 0x37b, 0x1ef, 0x20e, 0x200, 0x206, 0x16e, 0x3e0, 0x365, 0x33c, 0x2aa, 0x91, 0x33b, 0x2a9, 0x125, 0x27c, 0xef, 0x30d, 0x2b7, 0x3f6, 0x2d8, 0x27e, 0x230, 0x170, 0x133, 0x3c1, 0x1ad, 0x397, 0x356, 0x1fe, 0x3b0, 0x2f6, 0x3db, 0x2c9, 0x3c0, 0x2c6, 0xad, 0x294, 0x3e1, 0xe, 0x6, 0x368, 0x28e, 0x85, 0x59, 0x196, 0x23b, 0x3aa, 0x192, 0x38c, 0x359, 0x293, 0x3e2, 0x1ba, 0x141, 0x2df, 0xf3, 0x20b, 0x1b8, 0x335, 0x157, 0x126, 0x399, 0x2a9, 0x24a, 0x1e2, 0x371, 0xbc, 0x25d, 0x47, 0x283, 0x26e, 0x1ca, 0x2e2, 0x172, 0x3d1, 0x2f9, 0x16c, 0x27e, 0x69, 0x1c9, 0x18a, 0x67, 0x1c5, 0x31, 0x3a, 0x187, 0x303, 0x16b, 0x278, 0x2b0, 0x3e3, 0x1ab, 0x1fe, 0x369, 0x3ca, 0x2e7, 0xc3, 0xee, 0xcc, 0x23d, 0x184, 0x6b, 0x7e, 0x6c, 0x78, 0x2b5, 0x252, 0x294, 0x3cb, 0x38, 0x30, 0x2e5, 0x174, 0x108, 0xd3, 0x14d, 0x3e7, 0x2c5, 0x232, 0x357, 0x123, 0x228, 0x196, 0x7f, 0x2b3, 0x8b, 0xbe, 0x3ea, 0x1a1, 0x29c, 0x11e, 0x3a9, 0x4c, 0x33e, 0xea, 0x3a2, 0x1f1, 0x1ba, 0x282, 0xb1, 0x139, 0xe9, 0xca, 0xe4, 0x3ae, 0x4a, 0x1e7, 0x2c0, 0x383, 0x68, 0x316, 0x179, 0x26c, 0x7d, 0x304, 0x16d, 0xa1, 0x9a, 0x3c2, 0x32, 0x352, 0x92, 0x117, 0x3a3, 0x32e, 0x149, 0x89, 0x109, 0x1b7, 0x3cc, 0x7c, 0x3b6, 0x271, 0x17d, 0x204, 0x2df, 0x1e6, 0x3e, 0x1db, 0x33c, 0x2ba, 0x102, 0x36b, 0xf3, 0x1f, 0x2e9, 0x19e, 0x15d, 0x81, 0x3b1, 0x27d, 0x20b, 0x370, 0xcf, 0x2aa, 0x244, 0x3dc, 0x33a, 0x301, 0x1b8, 0x263, 0x155, 0x122, 0x1ee, 0x19d, 0x384, 0xdc, 0x335, 0x2ae, 0x91, 0xf7, 0x2ca, 0x1c2, 0x6e, 0x39e, 0x157, 0x24c, 0x27f, 0x165, 0xe1, 0x37, 0x1cf, 0x2af, 0x126, 0x33b, 0x2b6, 0x274, 0x21f, 0x2e3, 0x353, 0x93, 0x399, 0x15b, 0x13a, 0x30b, 0x375, 0x3ad, 0x24d, 0x3c8, 0x2a9, 0x9d, 0x381, 0x3be, 0x3d2, 0x322, 0x1e4, 0x350, 0x24a, 0x3c4, 0x1df, 0x1e9, 0x191, 0xf2, 0x1a8, 0x125, 0x1e2, 0x2eb, 0x2f0, 0x2cc, 0x79, 0xd4, 0x296, 0xf1, 0x371, 0x178, 0x166, 0x238, 0x6a, 0x14b, 0x27c, 0x3bc, 0xbc, 0xb3, 0x11c, 0x35, 0x2a1, 0x13e, 0x1de, 0x5e, 0x25d, 0x8e, 0x21e, 0x36e, 0x32b, 0x3e0, 0x31e, 0x2ab, 0x3ef, 0x40, 0x206, 0x362, 0x1ce, 0x239, 0x3ba, 0x20e, 0x24, 0xa0, 0x106, 0x37c, 0x37b, 0x363, 0x2a0, 0x112, 0x5a, 0x110, 0x28f, 0x34f, 0x146, 0x17a, 0x19, 0x2ad, 0x99, 0x2a8, 0x254, 0x134, 0x22f, 0x249, 0x23a, 0x201, 0x37a, 0xd, 0x18b, 0x2f2, 0x344, 0x3bb, 0x160, 0x30f, 0x340, 0x218, 0x1d7, 0x94, 0x323, 0xa6, 0x270, 0x194, 0x329, 0x135, 0x141, 0x162, 0x1da, 0x11f, 0x1d1, 0x3e2, 0x1cb, 0xf4, 0x26, 0x275, 0x359, 0xb5, 0x14e, 0x23c, 0x177, 0x192, 0x5f, 0x3dd, 0x113, 0x334, 0x23b, 0x16f, 0x51, 0x3ed, 0x295, 0x59, 0xab, 0x3fb, 0x366, 0x6d, 0x28e, 0x21, 0x26d, 0x29a, 0x307, 0x6, 0x376, 0x2e8, 0x52, 0x256, 0x3e1, 0x70, 0x180, 0xf, 0x35e, 0xad, 0x8d, 0x18e, 0x3f, 0xd8, 0x3c0, 0x21d, 0x31a, 0x308, 0x358, 0x3db, 0x265, 0x1dc, 0x269, 0x2d5, 0xb7, 0x33f, 0x18c, 0x1dd, 0x20e, 0x48, 0x280, 0x22, 0x3a5, 0x3a3, 0x146, 0x2f4, 0x64, 0x145, 0x182, 0x1bd, 0xd, 0x316, 0x3da, 0x216, 0x3ce, 0x53, 0x270, 0x328, 0xbf, 0x1ba, 0x3d, 0x13, 0x275, 0x2bb, 0x2d4, 0x262, 0x388, 0x2b3, 0x51, 0x3d3, 0x246, 0x2c8, 0x2a2, 0x387, 0x6, 0x2e5, 0x3b2, 0x290, 0x121, 0xc7, 0x3f, 0x1b0, 0x31b, 0xcc, 0x1cc, 0x1d8, 0x39d, 0x223, 0x158, 0x397, 0x105, 0x187, 0x2e, 0x266, 0xce, 0x6f, 0xb6, 0x1ea, 0x13b, 0x2e2, 0x382, 0x195, 0x8e, 0x6a, 0x125, 0x381, 0x2e3, 0x157, 0x122, 0x3b1, 0x1e6, 0xf8, 0x18f, 0x2ab, 0x3d7, 0x100, 0x14, 0x245, 0x1be, 0x37b, 0x2cf, 0x292, 0x82, 0x1a9, 0x248, 0x2a8, 0xa1, 0xd9, 0x15c, 0xd1, 0x3d9, 0x160, 0x217, 0x11b, 0xe4, 0x14f, 0x2a4, 0x162, 0x3b4, 0x75, 0x293, 0x257, 0x11e, 0x177, 0x324, 0x17c, 0x2d7, 0x1a3, 0x2dc, 0x1ce, 0xf6, 0x3de, 0x2a0, 0x41, 0x1a9, 0x99, 0x2b2, 0x101, 0x18b, 0x3da, 0x25, 0x323, 0x298, 0x341, 0x1d1, 0x393, 0x8f, 0x177, 0x241, 0x1f9, 0x295, 0x164, 0x2a2, 0x307, 0x18, 0x305, 0x35e, 0x2b4, 0xc2, 0x358, 0x377, 0x211, 0x3f5, 0x143, 0x2c7, 0x2e, 0xc5, 0x338, 0x378, 0x372, 0x137, 0x24b, 0x3bc, 0x1e9, 0x93, 0xf7, 0x27d, 0x7c, 0x18f, 0x15f, 0x347, 0x12, 0x140, 0x22, 0x343, 0x297, 0x222, 0x313, 0x9b, 0x1f4, 0xb0, 0x217, 0x236, 0x390, 0x26a, 0x21a, 0x13, 0xe3, 0x2fe, 0x28d, 0x261, 0x1fc, 0x1b3, 0xda, 0x5d, 0x29, 0xa5, 0x337, 0x21b, 0x1b0, 0x23f, 0x330, 0x27b, 0x1bf, 0x35c, 0x1f2, 0x173, 0xc4, 0x29b, 0x1a4, 0x2bc, 0x1c1, 0x195, 0x11c, 0x1a8, 0x13a, 0x6e, 0xcf, 0x17d, 0x4, 0x285, 0x362, 0x331, 0x3d8, 0x363, 0x292, 0x104, 0x2ad, 0x264, 0x2da, 0xd, 0x346, 0x362, 0x26b, 0x37b, 0x32e, 0x17a, 0xc8, 0x23a, 0x2c, 0x30f, 0x236, 0x329, 0x1ba, 0xf4, 0x130, 0x5f, 0x2d7, 0x59, 0x151, 0x307, 0x30, 0xf, 0x2c6, 0x31a, 0x76, 0x39d, 0x9e, 0x1ad, 0x31, 0x349, 0x1a4, 0x171, 0x30d, 0xb3, 0x1e4, 0x165, 0x20b, 0x365, 0x2ab, 0x347, 0x24, 0x109, 0x110, 0x55, 0x254, 0x1b2, 0x2f2, 0x216, 0x323, 0x139, 0x11f, 0x293, 0x14e, 0x1c4, 0x16f, 0x288, 0x28e, 0x108, 0x256, 0x337, 0x3f, 0x2c9, 0x1dc, 0x36c, 0x3eb, 0x303, 0x133, 0x19c, 0x378, 0x2ed, 0xd5, 0x27c, 0x3be, 0x157, 0x81, 0x36e, 0x16e, 0x1ce, 0x1ec, 0x363, 0x12d, 0x19, 0x145, 0x201, 0x3e6, 0x340, 0xe4, 0x135, 0x21a, 0x26, 0x38c, 0x3dd, 0x8a, 0xab, 0x3e7, 0x6, 0x386, 0x35e, 0x161, 0x308, 0x2f6, 0x315, 0x2b0, 0x87, 0xe8, 0x230, 0xaf, 0x2e4, 0x195, 0x238, 0x2a9, 0x1c2, 0x2e9, 0x1d6, 0x285, 0x193, 0x37c, 0x3d5, 0x111, 0x22f, 0xd1, 0x2f7, 0xa6, 0x341, 0x34d, 0x14e, 0x388, 0x1b5, 0x6d, 0xba, 0x148, 0x8d, 0xd6, 0x377, 0x56, 0x327, 0x74, 0x230, 0x15e, 0x382, 0xb3, 0x3c8, 0x19d, 0x7c, 0x235, 0x1dd, 0x54, 0x224, 0x352, 0xc1, 0x2fd, 0x1a0, 0xe4, 0x26a, 0x7a, 0x130, 0xbe, 0x34e, 0x2c8, 0x13d, 0x38, 0x1b, 0x389, 0x330, 0x1fe, 0x3c6, 0x29d, 0x19c, 0x2f9, 0x3a6, 0x2a1, 0x381, 0x335, 0x17d, 0x10, 0xa, 0x106, 0x3a5, 0x127, 0x134, 0x2b8, 0x10b, 0x323, 0x272, 0x75, 0xb5, 0xcd, 0xfe, 0x366, 0x2d9, 0x3b2, 0xad, 0xc2, 0x17b, 0x315, 0x169, 0x21c, 0x349, 0x348, 0x1cd, 0x5e, 0x322, 0xf7, 0x1e6, 0x3c9, 0x318, 0x1ef, 0x149, 0x208, 0x145, 0xb, 0x383, 0x236, 0x25b, 0x2e1, 0x3a9, 0x324, 0x3f2, 0x85, 0xd3, 0x3f4, 0x380, 0x1b0, 0xee, 0x36c, 0x3df, 0x17, 0x18a, 0x103, 0x245, 0x3d6, 0x127, 0x268, 0x2f2, 0x4a, 0x25c, 0x2cb, 0x17f, 0x226, 0xab, 0x387, 0x60, 0x78, 0x66, 0x27b, 0x1e3, 0x29d, 0x338, 0x3f6, 0x10f, 0x24a, 0xdc, 0xeb, 0x3d7, 0x24, 0x2d, 0x124, 0x16d, 0x34, 0x39, 0x135, 0x7a, 0x260, 0x2f8, 0x246, 0xd3, 0x3e1, 0x21b, 0x19b, 0x2fb, 0x143, 0x215, 0x392, 0x172, 0x32a, 0x1e4, 0x19d, 0xf8, 0xc6, 0x2f3, 0x149, 0x19, 0x11d, 0x58, 0x4e, 0x259, 0x3cd, 0x23c, 0x2b3, 0x119, 0x5d, 0x148, 0x11a, 0x358, 0x38e, 0x169, 0x31, 0x13f, 0x276, 0xef, 0x3d2, 0x122, 0x36e, 0x1b1, 0xdf, 0x3ee, 0x111, 0x57, 0x344, 0x395, 0x272, 0xea, 0x2d4, 0x261, 0x3fb, 0x3, 0x305, 0x2c6, 0x73, 0x369, 0x2b1, 0x31f, 0xde, 0x2ed, 0x354, 0x381, 0x263, 0x1fd, 0x80, 0xa0, 0x88, 0xaa, 0x284, 0x225, 0x3ae, 0x141, 0x13, 0x311, 0x2d7, 0x164, 0x13d, 0x70, 0x206, 0x106, 0x28f, 0x254, 0x18b, 0x1d7, 0x141, 0x26, 0x5f, 0x295, 0x26d, 0x3e1, 0x3f, 0x265, 0x3f5, 0x1d, 0x230, 0x171, 0x5e, 0x93, 0x36b, 0x16e, 0x26b, 0x3ee, 0x222, 0x15c, 0x216, 0x12e, 0x2cb, 0x2fe, 0x8a, 0x151, 0xe, 0x1b, 0x23f, 0x36c, 0x367, 0x170, 0x258, 0x195, 0x1e4, 0x33a, 0x3e0, 0x239, 0x363, 0x17a, 0x249, 0x3bb, 0xa6, 0x11f, 0xb5, 0x334, 0x3fb, 0x6, 0xf, 0x21d, 0x339, 0x1e3, 0x133, 0xfb, 0x38f, 0xd4, 0x1c2, 0x365, 0x175, 0x54, 0x82, 0x145, 0x2c, 0x4e, 0xbb, 0x32f, 0x1c4, 0x36a, 0x368, 0x36d, 0x161, 0x76, 0xd7, 0x3c1, 0x6f, 0x2ed, 0x2a1, 0x21f, 0x33c, 0x3ef, 0x24, 0x5a, 0x99, 0x37a, 0x340, 0x329, 0x1cb, 0x177, 0x51, 0x28e, 0x52, 0x8d, 0x358, 0x315, 0x1ad, 0x188, 0x3d4, 0x24b, 0x3be, 0x2aa, 0x8, 0x14, 0x22, 0x55, 0x284, 0x43, 0x2a3, 0x21a, 0x5, 0x11, 0x55, 0x101, 0x10c, 0x135, 0x1e8, 0x241, 0x357, 0x210, 0x242, 0x358, 0x223, 0x2bd, 0x5b, 0x137, 0x1e2, 0x263, 0x3fd, 0x12, 0x5a, 0x132, 0x1f3, 0x236, 0x2fc, 0x11e, 0x16f, 0xda, 0x3b2, 0x161, 0xec, 0x35c, 0x237, 0x2f9, 0x10f, 0x13a, 0x1db, 0x2be, 0x54, 0x104, 0x11d, 0x160, 0xe9, 0x34d, 0x262, 0x3f8, 0x3, 0xf, 0x33, 0xff, 0x303, 0x314, 0x35f, 0x238, 0x2ca, 0x1f0, 0x239, 0x2cf, 0x1e1, 0x26c, 0x3ce, 0xed, 0x359, 0x226, 0x2ac, 0xe, 0x36, 0xee, 0x356, 0x215, 0x253, 0x30d, 0x322, 0x3b1, 0x16e, 0xdf, 0x3a3, 0x134, 0x1ed, 0x250, 0x302, 0x311, 0x34e, 0x26d, 0x3cb, 0xfc, 0x30c, 0x327, 0x3a0, 0x13b, 0x1de, 0x2af, 0x1, 0x5, 0x11, 0x55, 0x101, 0x10c, 0x135, 0x1e8, 0x241, 0x357, 0x210, 0x242, 0x358, 0x223, 0x2bd, 0x5b, 0x137, 0x1e2, 0x263, 0x3fd, 0x12, 0x5a, 0xa, 0x44, 0x2a8, 0x34, 0x1c8, 0x1cb, 0x1d5, 0x119, 0x2e8, 0x2b4, 0xec, 0x2b1, 0xce, 0x3e5, 0xd4, 0x301, 0x235, 0x1ef, 0xbd, 0x9b, 0x1e7, 0xed, 0x2bb, 0x8a, 0x14d, 0xe0, 0x2c9, 0x3fe, 0x3a, 0x1a4, 0x273, 0x353, 0x1, 0xa, 0x44, 0x2a8, 0x34, 0x1c8, 0x1cb, 0x1d5, 0x119, 0x2e8, 0x2b4, 0xec, 0x2b1, 0xce, 0x3e5, 0xd4, 0x301, 0x235, 0x1ef, 0xbd, 0x9b, 0x1e7, 0xed, 0x2bb, 0x8a, 0x14d, 0xe0, 0x2c9, 0x3fe, 0x3a, 0x1a4, 0x273, 0x353, 0x1, 0xa, 0x44, 0x2a8, 0x34, 0x1c8, 0x1cb, 0x1d5, 0x119, 0x2e8, 0x2b4, 0xec, 0x2b1, 0xce, 0x3e5, 0xd4, 0x301, 0x235, 0x1ef, 0xbd, 0x9b, 0x1e7, 0xed, 0x2bb, 0x8a, 0x14d, 0xe0, 0x2c9, 0x3fe, 0x3a, 0x1a4, 0x273, 0x353, 0x1, 0xa, 0x44, 0x2a8, 0x34, 0x1c8, 0x1cb, 0x1d5, 0x119, 0x2e8, 0x2b4, 0xec, 0x2b1, 0xce, 0x3e5, 0xd4, 0x14, 0x110, 0x16d, 0x340, 0x17e, 0x23c, 0x36a, 0x376, 0x2c6, 0x339, 0x303, 0x4b, 0x195, 0x33b, 0x32b, 0x26b, 0x34f, 0x1b2, 0x1d7, 0x21a, 0x192, 0x357, 0x52, 0x61, 0x39d, 0x3c1, 0x378, 0x21e, 0x1c2, 0x31e, 0x1ef, 0x17a, 0x26c, 0x323, 0x2cb, 0x3dd, 0x2c8, 0x3e1, 0x1f8, 0x56, 0x31, 0x3d4, 0x27c, 0x263, 0x3ef, 0x120, 0x2ad, 0x2c, 0x270, 0x293, 0x334, 0x3e7, 0x180, 0x23f, 0x356, 0x46, 0x171, 0x2f0, 0x81, 0x206, 0x22, 0x2a8, 0x68, 0x329, 0x243, 0x16f, 0x368, 0x35e, 0xe6, 0x1e3, 0x18a, 0x2b7, 0x1e4, 0x1e6, 0x1ce, 0x3ee, 0x134, 0x3bd, 0x141, 0x130, 0x3ed, 0x108, 0x8d, 0x2f6, 0xf9, 0x6f, 0x345, 0x13a, 0x365, 0x3ba, 0x12d, 0x249, 0x1e7, 0x1da, 0x2fe, 0x59, 0xfd, 0x3f, 0x30c, 0x87, 0x27e, 0x24b, 0x1cf, 0x3fa, 0x24, 0x2d0, 0x201, 0x4e, 0x1d1, 0x262, 0x3fb, 0x30, 0x3c0, 0x36c, 0x28, 0x49, 0x37a, 0x65, 0x393, 0x23b, 0x205, 0x3c, 0x269, 0x2c7, 0x253, 0x5e, 0x122, 0x103, 0x22, 0x159, 0x1a0, 0x17e, 0x71, 0x1b3, 0x386, 0x33, 0x3f1, 0x170, 0x1c1, 0x24d, 0x36e, 0x245, 0x22e, 0xd, 0x1c8, 0x325, 0x16f, 0x2d9, 0x163, 0x339, 0x20f, 0x12c, 0xb3, 0x3dc, 0x1b1, 0x3d6, 0xa1, 0x10c, 0x1ba, 0x2ee, 0x232, 0x36d, 0x23d, 0x2f5, 0x18a, 0x167, 0x399, 0x32b, 0xdf, 0x127, 0x18b, 0x14f, 0x3d0, 0x51, 0xba, 0x2b4, 0x3b0, 0x34a, 0x3ec, 0x238, 0x27d, 0xe7, 0x3ee, 0x268, 0x2ef, 0x21a, 0x324, 0x147, 0x290, 0x219, 0x35c, 0x19c, 0x317, 0x2b6, 0x3e0, 0x3d8, 0x111, 0x2f2, 0x152, 0x98, 0x3ed, 0x210, 0x234, 0x39d, 0x38b, 0x1fb, 0xd4, 0x1f, 0x318, 0x32e, 0x57, 0x4a, 0x302, 0xbe, 0x214, 0x294, 0x2b9, 0x278, 0x6f, 0x283, 0xe1, 0x31e, 0x3de, 0x1e1, 0x344, 0x25c, 0x1c6, 0x295, 0x50, 0x124, 0x3e6, 0x259, 0x29c, 0x3fb, 0xc0, 0x77, 0x286, 0xd2, 0x1de, 0x2aa, 0x100, 0xb4, 0x201, 0x138, 0x12f, 0x196, 0x7, 0x1b0, 0x3f5, 0x3a0, 0x394, 0x1cf, 0x3f3, 0x240, 0x145, 0x189, 0x23e, 0x113, 0x14d, 0x309, 0x30c, 0x21c, 0x3a1, 0x3c4, 0xeb, 0x15, 0x19, 0x3d9, 0x272, 0x2fe, 0x164, 0x3cb, 0x3db, 0x2d2, 0xb6, 0x2a1, 0x370, 0x2ea, 0x12d, 0x136, 0x24f, 0x275, 0x34e, 0x291, 0x6b, 0x4f, 0x31d, 0x345, 0xe1, 0x235, 0x363, 0x313, 0x25, 0x302, 0x17c, 0x42, 0x8d, 0x3ca, 0x38b, 0x3f6, 0x350, 0xf8, 0x1ec, 0x111, 0x1ed, 0x141, 0xc9, 0x2a7, 0x290, 0x3b, 0x16b, 0xfb, 0x11c, 0x27d, 0x1ce, 0x3a3, 0x364, 0x2a3, 0x3d0, 0xa2, 0x2e8, 0x18d, 0x37e, 0x18a, 0x2ce, 0x27f, 0x16e, 0x1eb, 0xa1, 0x218, 0x2e1, 0x35d, 0x368, 0x163, 0x27b, 0x2e, 0x172, 0x322, 0x36e, 0x83, 0xaa, 0x68, 0xa0, 0x99, 0x30f, 0x1d1, 0x334, 0x307, 0xd8, 0x3f5, 0x349, 0x24b, 0x263, 0x347, 0x82, 0x1f4, 0x139, 0x2fe, 0x2c8, 0x337, 0x2e7, 0x173, 0x2ed, 0x13a, 0x31e, 0x363, 0x22f, 0x94, 0x26, 0x3ed, 0x52, 0x308, 0x2b1, 0xfb, 0x238, 0x1e6, 0x26b, 0x24e, 0x43, 0x1ba, 0x3aa, 0x368, 0x2c6, 0x1fe, 0x170, 0x30d, 0x91, 0x206, 0x110, 0x37a, 0x194, 0x14e, 0x3fb, 0x180, 0x1dc, 0x1d, 0x13b, 0x3be, 0x3fa, 0x120, 0x145, 0x312, 0xea, 0x8a, 0xfd, 0x1f8, 0x2b0, 0x5b, 0x2a1, 0x2e9, 0x3ba, 0x17a, 0x344, 0x162, 0x5f, 0x21, 0x8d, 0x39d, 0x237, 0x38f, 0x165, 0x33f, 0x3ee, 0x1b2, 0x2a3, 0x3a9, 0x288, 0x36d, 0xe6, 0x303, 0x258, 0x191, 0x36e, 0x106, 0x2a8, 0x340, 0x3e2, 0x23b, 0x6, 0x3c0, 0x356, 0x230, 0xef, 0x2aa, 0x200, 0x2d0, 0x2c, 0x3a4, 0x1a1, 0x151, 0x380, 0x30c, 0x31, 0x29f, 0x21f, 0x2ab, 0x140, 0x264, 0x4e, 0x12f, 0x251, 0x70, 0xc3, 0x21c, 0x29f, 0x37, 0x2be, 0x12d, 0xd1, 0xb1, 0x5f, 0x42, 0x234, 0xd7, 0x338, 0x11c, 0x1e6, 0xdf, 0x12a, 0x218, 0x396, 0x1b5, 0x386, 0x198, 0x187, 0x171, 0x353, 0x20, 0x5a, 0xb, 0x1d2, 0x1a1, 0x2a2, 0x21b, 0x56, 0x310, 0x354, 0x2e9, 0x37d, 0x1e1, 0x216, 0x20d, 0x3f2, 0x52, 0x219, 0x2d6, 0x3d1, 0x3c8, 0xb7, 0x3d6, 0x101, 0x390, 0x23c, 0x2c5, 0x3c, 0x36c, 0x8c, 0x273, 0x2aa, 0x9, 0x352, 0x160, 0x23e, 0x45, 0xfd, 0x3f0, 0x2d2, 0x2d8, 0x24a, 0x18f, 0x363, 0x57, 0x250, 0x130, 0x2a7, 0x252, 0x3b0, 0x266, 0x2ce, 0x1ee, 0x2cd, 0x22e, 0x68, 0x2fc, 0x319, 0x6, 0x389, 0x143, 0x1a4, 0x2eb, 0x1fd, 0x120, 0x28a, 0x53, 0x359, 0xb2, 0x39f, 0x2e7, 0x2e6, 0x3a6, 0x1c2, 0x18c, 0xa3, 0x2f2, 0x282, 0x241, 0x5d, 0x2c2, 0x2f5, 0x4b, 0x280, 0x182, 0x270, 0x2d4, 0x2a2, 0x3f, 0x158, 0xb6, 0x125, 0x18f, 0x2cf, 0x15c, 0x2a4, 0x324, 0x5d, 0x18d, 0x3c6, 0x258, 0x24d, 0x285, 0x110, 0x1f3, 0x176, 0x334, 0x7, 0x19b, 0x87, 0x34b, 0x37, 0x175, 0xbd, 0x281, 0x302, 0x3f2, 0xa4, 0x76, 0x29d, 0x167, 0x1ee, 0x193, 0xaa, 0x340, 0x393, 0x3f8, 0x180, 0x379, 0x1d0, 0x24b, 0x19e, 0x15, 0xc8, 0x395, 0xe3, 0x85, 0x242, 0x333, 0x19c, 0x11c, 0x3cc, 0x37c, 0x142, 0x1c8, 0x23c, 0x183, 0xf0, 0x356, 0xd2, 0x2eb, 0x3fa, 0x89, 0x7d, 0x139, 0x3ea, 0xd3, 0x6b, 0x278, 0x2f9, 0x2a9, 0x39b, 0x3d5, 0x18b, 0xdd, 0x35d, 0x376, 0x66, 0x2c7, 0x171, 0x2af, 0x80, 0x2d0, 0xb0, 0x23e, 0x8a, 0x3f4, 0x3bf, 0x173, 0x3a6, 0x384, 0x239, 0x111, 0x373, 0xf4, 0x144, 0x2d3, 0x339, 0xb8, 0x213, 0x81, 0x50, 0x132, 0x4e, 0x25e, 0x156, 0x380, 0x109, 0x201, 0x3a4, 0x113, 0xfd, 0x3db, 0x173, 0x345, 0x20b, 0x1ec, 0x134, 0x2a3, 0x177, 0x368, 0x21d, 0x367, 0x171, 0x157, 0x200, 0x2ad, 0x312, 0x359, 0x2c8, 0x18e, 0x9e, 0x378, 0x2a9, 0x33f, 0x34f, 0x43, 0x1cb, 0x36a, 0xf, 0x36c, 0x230, 0x371, 0x3fa, 0x112, 0x1f4, 0x1da, 0x2d7, 0x256, 0x2f6, 0x237, 0x47, 0x1e6, 0x37c, 0x284, 0x329, 0x1c4, 0x6, 0x23f, 0x1d, 0x1ca, 0x263, 0x20e, 0xc8, 0x323, 0x38c, 0x21, 0x61, 0x2b1, 0x3d1, 0x33b, 0x362, 0x55, 0x340, 0x32f, 0x3fb, 0x1b, 0x3f5, 0x27e, 0x3c4, 0x2ab, 0x12d, 0x344, 0x302, 0x3ed, 0x290, 0x3b0, 0x18a, 0xb3, 0x36e, 0x22, 0x37a, 0xbb, 0x334, 0xe, 0x265, 0x31, 0xd5, 0x2e9, 0x1ef, 0x22f, 0xa9, 0x192, 0x5d, 0x31a, 0x303, 0x2e4, 0x91, 0x14, 0x99, 0x4e, 0xb5, 0x151, 0x3f, 0x2b0, 0x2d8, 0x13a, 0xc6, 0x146, 0x3bd, 0xf4, 0x212, 0x16, 0x11f, 0x114, 0x39f, 0x315, 0xde, 0x350, 0x33f, 0x297, 0x10c, 0x243, 0x2c5, 0x1e0, 0x286, 0x276, 0x335, 0x20e, 0x190, 0x97, 0x5f, 0x210, 0x3b, 0x133, 0x32a, 0x1b7, 0x22, 0x2fd, 0x2ec, 0x196, 0xe0, 0x2b, 0x5b, 0x24a, 0x63, 0x146, 0x373, 0x3d0, 0x6d, 0x185, 0x3b7, 0x171, 0x2ae, 0x12, 0x145, 0x14c, 0x3ea, 0x34c, 0x2b9, 0x31f, 0x47, 0x3cc, 0x1eb, 0xd, 0x2fc, 0xfe, 0x180, 0x1ff, 0x13f, 0x3c4, 0x15f, 0xbd, 0x216, 0x4c, 0x147, 0x161, 0x3c6, 0x172, 0x91, 0x28, 0x264, 0x270, 0x342, 0x27a, 0x3db, 0x2e6, 0x10f, 0x7c, 0x2ff, 0x2c1, 0x1ba, 0x2de, 0x203, 0x36c, 0x69, 0x1df, 0x3ef, 0x104, 0x2f7, 0x275, 0x10a, 0x234, 0x2b1, 0x3ab, 0xf7, 0x326, 0x159, 0xca, 0x262, 0x207, 0x336, 0x31, 0x1aa, 0x3b6, 0x363, 0x2b8, 0x10d, 0x51, 0x2d3, 0xff, 0x392, 0x1e9, 0x20, 0x2d0, 0x2d, 0x58, 0xea, 0x164, 0x31c, 0xf9, 0x3c3, 0x27d, 0x37c, 0x202, 0x2fc, 0x1fc, 0x209, 0x3e3, 0x3d4, 0x6e, 0x37d, 0x22f, 0x2a4, 0x116, 0x36d, 0xff, 0x32d, 0x3ad, 0x100, 0x153, 0xa6, 0x3ea, 0x291, 0x2f6, 0xce, 0x79, 0x16e, 0x22e, 0x289, 0x14e, 0x387, 0x19b, 0x31, 0x354, 0x2c3, 0x32e, 0x3da, 0x1e8, 0x6d, 0x30a, 0x2c7, 0x39a, 0x2ba, 0x240, 0x1f4, 0x361, 0x123, 0x8d, 0x35c, 0x3ab, 0x1ee, 0x83, 0x2da, 0xbb, 0xcb, 0xe0, 0x56, 0x16c, 0x274, 0x239, 0x9a, 0x14f, 0x3aa, 0x1c3, 0xdb, 0x230, 0x1df, 0x3d7, 0x19, 0x395, 0x311, 0x108, 0x3b, 0x266, 0xb3, 0x1a3, 0x220, 0x30f, 0x25e, 0x2a2, 0x1f8, 0x2bd, 0x283, 0x7c, 0x1f7, 0x316, 0x1cb, 0x1b3, 0xf0, 0x286, 0xe5, 0xcf, 0x54, 0x136, 0x2c4, 0x3ed, 0x252, 0x37e, 0x258, 0x24c, 0x28, 0xc1, 0x1d2, 0x226, 0x3e1, 0x38e, 0xde, 0x2a9, 0x5a, 0x160, 0x359, 0x26d, 0x358, 0x237, 0x238, 0x16e, 0x55, 0x236, 0x262, 0xe, 0x30c, 0x5b, 0x13a, 0x239, 0x134, 0x135, 0x16f, 0xf, 0x356, 0x13b, 0x263, 0x54, 0x26c, 0x302, 0x357, 0x161, 0x303, 0x30d, 0x1, 0x5a, 0x160, 0x359, 0x26d, 0x358, 0x237, 0x238, 0x16e, 0x55, 0x236, 0x262, 0xe, 0x30c, 0x5b, 0x13a, 0x239, 0x134, 0x135, 0x16f, 0xf, 0x356, 0x13b, 0x263, 0x54, 0x26c, 0x302, 0x357, 0x161, 0x303, 0x30d, 0x1, 0x5a, 0x160, 0x359, 0x26d, 0x358, 0x237, 0x238, 0x16e, 0x55, 0x236, 0x262, 0xe, 0x30c, 0x5b, 0x13a, 0x239, 0x134, 0x135, 0x16f, 0xf, 0x356, 0x13b, 0x263, 0x54, 0x26c, 0x302, 0x357, 0x161, 0x303, 0x30d, 0x1, 0x5a, 0x160, 0x359, 0x26d, 0x358, 0x237, 0x238, 0x16e, 0x55, 0x236, 0x262, 0xe, 0x30c, 0x5b, 0x13a, 0x239, 0x134, 0x135, 0x16f, 0xf, 0x356, 0xb4, 0x189, 0x2fe, 0x291, 0x3ca, 0xfb, 0x27f, 0x83, 0x37a, 0x3a2, 0x2ac, 0x1f8, 0x2e6, 0x6a, 0x33f, 0x95, 0x390, 0x23b, 0x300, 0x3cf, 0x29f, 0x1db, 0x197, 0x3bd, 0x35b, 0x1bb, 0x269, 0x69, 0x2e3, 0x20e, 0x9b, 0x181, 0x357, 0x2c2, 0x17, 0x5e, 0x10, 0x352, 0xa6, 0x3b3, 0x14a, 0xd7, 0x3ab, 0x3b1, 0x22, 0x3c5, 0x25e, 0x29a, 0x3bf, 0x233, 0x2a9, 0x39c, 0x142, 0x17e, 0x3f8, 0x6c, 0x87, 0x1aa, 0x18f, 0x146, 0x3ae, 0x1d5, 0x386, 0x2d1, 0x299, 0x263, 0xa8, 0x1a2, 0x26, 0x115, 0x73, 0x170, 0x1e9, 0x100, 0x145, 0x272, 0x34e, 0x8d, 0x16b, 0x2ce, 0x36e, 0x220, 0x27, 0x1a1, 0x1fa, 0x38e, 0x378, 0x2ca, 0x1be, 0xd, 0x3cd, 0x3f7, 0x2c9, 0x62, 0x296, 0xc6, 0x4d, 0x29e, 0x16f, 0x1e, 0x143, 0x1ca, 0x271, 0x292, 0x216, 0x260, 0x174, 0x339, 0x32d, 0x2af, 0x24, 0x7d, 0x361, 0x85, 0x168, 0x22d, 0x3dd, 0x14a, 0x1ae, 0x2b7, 0x1b7, 0x220, 0x4e, 0x28d, 0x3cb, 0x9e, 0x3c3, 0x3cc, 0x28f, 0x11b, 0xcd, 0x70, 0x158, 0x1d3, 0x7c, 0x3a3, 0x39, 0x1c4, 0xc0, 0x3e3, 0x29f, 0x3b6, 0x255, 0x1d7, 0x1d5, 0x305, 0x356, 0xe5, 0x271, 0x12d, 0x4a, 0x324, 0x36d, 0x3f1, 0x2e2, 0x17d, 0x41, 0x3ce, 0x5f, 0x148, 0x37e, 0x2e4, 0x204, 0xb4, 0x312, 0x3ea, 0xa5, 0xd7, 0x35f, 0x2df, 0x110, 0x27, 0x342, 0x3e1, 0x4f, 0x3e5, 0x1e6, 0x343, 0x289, 0x262, 0x38, 0xac, 0x2ed, 0x3e, 0x3d5, 0x218, 0xe2, 0x60, 0x3f5, 0x34b, 0x1db, 0x32e, 0x2ef, 0x2ee, 0x386, 0x1ab, 0x276, 0x33c, 0x292, 0x25, 0x192, 0x3b2, 0x3fc, 0x171, 0x2ba, 0x224, 0x1e7, 0x22b, 0xa4, 0x1bf, 0x172, 0x102, 0x5a, 0x189, 0x1f5, 0x256, 0x26f, 0x3ab, 0x36b, 0x88, 0x217, 0x1a1, 0x3f4, 0x223, 0x3f6, 0xf3, 0x3a5, 0x340, 0x2d0, 0xa6, 0x2d7, 0x8d, 0x1a5, 0xb3, 0x206, 0xc1, 0x11f, 0x2c8, 0x358, 0x19c, 0x33b, 0x106, 0x3e6, 0xb5, 0xfd, 0x315, 0x3f6, 0x1e6, 0x28f, 0x236, 0x334, 0x380, 0x1ad, 0x21e, 0x33f, 0x254, 0x17e, 0x3fb, 0x2c9, 0x188, 0x13a, 0x1ec, 0x18b, 0x243, 0x6, 0x2fb, 0x3d4, 0x2e9, 0x32e, 0x1d7, 0x3aa, 0xf, 0x286, 0x24b, 0x2ab, 0x3c2, 0x141, 0x288, 0x21d, 0x46, 0x3be, 0x20e, 0x26c, 0x26, 0x5d, 0x339, 0xaf, 0x2aa, 0x112, 0x1e7, 0x5f, 0x290, 0x1e3, 0x30d, 0x8, 0x2ad, 0x139, 0x295, 0x61, 0x133, 0x191, 0x14, 0x201, 0xea, 0x26d, 0x2f6, 0xfb, 0x1ee, 0x22, 0x30f, 0x1a1, 0x3e1, 0x9e, 0x38f, 0x32b, 0x55, 0x194, 0x196, 0x3f, 0x173, 0xd4, 0x1ce, 0x284, 0x3e2, 0x3e7, 0x265, 0x5b, 0x1c2, 0x37b, 0x43, 0x23c, 0x30, 0x3f5, 0x29f, 0x365, 0x146, 0x2a3, 0x16f, 0x78, 0x1d, 0x27c, 0x175, 0x1a9, 0x298, 0x295, 0xc2, 0xc5, 0x93, 0x140, 0xb0, 0x2fe, 0xa5, 0x35c, 0x195, 0x285, 0x264, 0x11f, 0x199, 0x17b, 0xfb, 0x3dc, 0x88, 0x4e, 0x226, 0xc7, 0x3c1, 0x79, 0x193, 0x37a, 0x12f, 0x27a, 0x315, 0x3e5, 0x391, 0x55, 0x328, 0x251, 0x1f8, 0x31d, 0x2b6, 0x37c, 0xd0, 0x131, 0x70, 0x169, 0x10f, 0x33f, 0xa1, 0x1f1, 0x3e7, 0xc3, 0x16c, 0x20b, 0x3d5, 0x72, 0x23b, 0x36, 0x21c, 0x125, 0x7b, 0x2c1, 0x243, 0xc, 0x3fe, 0x29f, 0x2c3, 0x111, 0x135, 0x2dd, 0x31b, 0x349, 0x37, 0x3b5, 0x3bd, 0x2ee, 0x203, 0x286, 0x9f, 0x2be, 0x22f, 0x3d, 0x1b4, 0x269, 0x348, 0x19e, 0x12d, 0x128, 0x22c, 0x2c6, 0x215, 0x1df, 0x20e, 0xd1, 0x98, 0x2e8, 0x3fc, 0x1cd, 0x3fa, 0x32, 0xb1, 0x357, 0x23d, 0x1c9, 0x157, 0x240, 0x2f7, 0x5f, 0x129, 0x385, 0x5e, 0x80, 0x11d, 0x2cb, 0x42, 0x1d8, 0x258, 0x352, 0x272, 0x85, 0x3b, 0x96, 0x81, 0x168, 0x14c, 0x295, 0x184, 0x314, 0x91, 0x2d, 0x22d, 0x2d7, 0x234, 0x266, 0x93, 0x280, 0x2c0, 0x3dd, 0x242, 0x34a, 0x191, 0x50, 0x58, 0x2fe, 0x14a, 0x16b, 0xb3, 0xa, 0xb, 0x359, 0x12b, 0x1ae, 0x195, 0x103, 0x182, 0xea, 0x1a6, 0x333, 0x2b7, 0x1a3, 0x132, 0x11f, 0x332, 0x1e5, 0x3d1, 0x1b7, 0x124, 0x3a4, 0x164, 0x2b9, 0xfb, 0x3b1, 0x220, 0x270, 0x228, 0xd6, 0x19c, 0xf7, 0x44, 0x4e, 0x45, 0x31c, 0x237, 0x399, 0x20c, 0x30f, 0x28d, 0x267, 0x3c1, 0xf2, 0x245, 0x3e6, 0x2d4, 0x3cb, 0xf9, 0x11c, 0x2cd, 0x37a, 0x25e, 0x1fa, 0x9e, 0x227, 0x2dc, 0x16d, 0x34d, 0x13d, 0x315, 0x3c3, 0x25f, 0x2a8, 0x2ec, 0x2a2, 0x2e7, 0x1fb, 0x3cc, 0x55, 0x259, 0x156, 0x3db, 0x1bc, 0x27d, 0x28f, 0xca, 0x32c, 0x1f8, 0x233, 0x2ca, 0x3d6, 0x11b, 0x261, 0x3f, 0x2ad, 0x1da, 0x21, 0x3b0, 0x2e4, 0x8, 0x145, 0x2cb, 0x108, 0x1bf, 0x30d, 0x40, 0x23a, 0x275, 0x52, 0x1e3, 0x5e, 0x200, 0x1f4, 0x38c, 0x290, 0x303, 0x2f0, 0x24, 0x3bb, 0x5f, 0xad, 0x2e, 0x3ad, 0x120, 0x1e7, 0x2f8, 0x161, 0x170, 0x157, 0x112, 0x323, 0x3ed, 0x31a, 0x392, 0x2aa, 0x82, 0x12e, 0x357, 0xe6, 0xaf, 0x17d, 0x19, 0x162, 0x28e, 0x339, 0x171, 0x3fa, 0xc8, 0x302, 0x5d, 0x1fe, 0x39a, 0x3ef, 0x249, 0x26, 0x2e8, 0x3eb, 0xef, 0x347, 0x26c, 0x130, 0x36d, 0x367, 0x371, 0x20e, 0x344, 0x192, 0x35e, 0x30e, 0x3be, 0x54, 0x216, 0x8b, 0x2c6, 0x46, 0x1cf, 0x2a0, 0x94, 0x51, 0x21d, 0x230, 0x263, 0x12d, 0xa9, 0x288, 0xcc, 0x1a4, 0x33c, 0x17a, 0x141, 0x6d, 0x269, 0x13b, 0x1d6, 0x3c2, 0x21a, 0x368, 0x36c, 0x1ca, 0x2ab, 0x22f, 0xf4, 0x376, 0x356, 0x24b, 0x175, 0x15c, 0x3a9, 0x153, 0x361, 0x108, 0x37e, 0x2f, 0x200, 0x3e8, 0x22b, 0xad, 0x5c, 0x2af, 0x112, 0x24f, 0x3af, 0xe6, 0x15e, 0x1fd, 0xc8, 0x20d, 0x174, 0x3eb, 0x1de, 0x107, 0x344, 0x324, 0x163, 0x46, 0x39e, 0x292, 0xa9, 0x119, 0x330, 0x13b, 0x3ac, 0x313, 0xf4, 0x2e5, 0x143, 0x27c, 0x37d, 0x3da, 0x3aa, 0xf0, 0x3a0, 0xdc, 0x255, 0x29e, 0x366, 0x3b8, 0x34b, 0x31e, 0x268, 0x325, 0x30, 0x327, 0x296, 0x1ec, 0x86, 0x319, 0xd8, 0x310, 0x301, 0x34f, 0x25b, 0x3f7, 0x30c, 0x1d3, 0x39b, 0x284, 0x257, 0x38, 0x1ad, 0x1a8, 0x1be, 0x340, 0x261, 0xfc, 0x6f, 0x27d, 0x22e, 0xbb, 0x2a2, 0x38e, 0x38f, 0x2dc, 0x1bd, 0xb5, 0x3cb, 0x3e4, 0x1e4, 0x20c, 0x27, 0x8a, 0xd6, 0x279, 0x36b, 0x124, 0x28b, 0x26d, 0x333, 0x2ce, 0x206, 0xb, 0x17f, 0x294, 0x34a, 0x24d, 0x109, 0x22d, 0x34e, 0x308, 0x96, 0x204, 0x2ad, 0x2a6, 0x19f, 0x52, 0x385, 0x1e9, 0x120, 0x395, 0x3d3, 0xe6, 0x2bc, 0x3fd, 0x249, 0x98, 0x2d3, 0x30e, 0x2e3, 0x149, 0xa9, 0x232, 0xdb, 0x1ca, 0x2be, 0x2b8, 0x177, 0x3c, 0x1d0, 0xdc, 0xa3, 0x26a, 0x306, 0x3fe, 0x1aa, 0x239, 0x225, 0x388, 0xd8, 0x229, 0x1f, 0x24e, 0x1f1, 0x207, 0x2b0, 0x6a, 0xdf, 0x340, 0xcb, 0x3f0, 0x378, 0x391, 0x159, 0x293, 0x3f4, 0x1f2, 0x1e4, 0x11, 0x9c, 0x59, 0x17b, 0x3ab, 0x346, 0x304, 0x2bb, 0x294, 0x29d, 0x126, 0x5a, 0x298, 0x10a, 0x3b0, 0x382, 0x80, 0x1f4, 0x22b, 0x15a, 0x170, 0x155, 0x104, 0x162, 0x22a, 0x3fc, 0xef, 0x107, 0x281, 0x8b, 0x30a, 0x69, 0x33c, 0x1e1, 0x3d, 0x376, 0x143, 0xf1, 0x1ef, 0x2ef, 0x2de, 0x23f, 0x1ea, 0x2c3, 0x134, 0x325, 0x60, 0x87, 0x9d, 0x2ff, 0xe4, 0x3f9, 0xc3, 0x2ed, 0x39b, 0x101, 0x14e, 0x1c0, 0x2e6, 0x165, 0x145, 0x275, 0x290, 0x2e, 0x157, 0x82, 0x162, 0x5d, 0x3eb, 0x371, 0x54, 0x94, 0x288, 0x269, 0x1ca, 0x175, 0x2f2, 0x3aa, 0x3c0, 0x27e, 0x365, 0x134, 0x243, 0x180, 0x31, 0x1c2, 0x34f, 0x17e, 0x307, 0x2b0, 0xd4, 0x37c, 0x236, 0xab, 0x2e7, 0x38f, 0x362, 0x3e6, 0x113, 0x6b, 0xfb, 0x36e, 0xc1, 0x359, 0x294, 0x133, 0x91, 0x2d0, 0x1da, 0x108, 0x1e3, 0x2f0, 0x120, 0x323, 0x357, 0x339, 0x39a, 0x347, 0x344, 0x8b, 0x21d, 0x1a4, 0x1d6, 0x22f, 0x3a9, 0xf, 0xe8, 0xdc, 0x146, 0x1ba, 0x6, 0x397, 0x125, 0x37b, 0xe4, 0x3fb, 0x30c, 0x345, 0x1ce, 0x68, 0x334, 0x1f8, 0x378, 0x32b, 0x16d, 0xb5, 0x337, 0x237, 0x1ee, 0x92, 0x11f, 0x34c, 0x2b1, 0x191, 0x109, 0xa6, 0x85, 0x3b0, 0x30d, 0x200, 0x3bb, 0x2f8, 0x31a, 0xaf, 0x3fa, 0x249, 0x130, 0x35e, 0x46, 0x263, 0x17a, 0x21a, 0x376, 0x286, 0x28a, 0x1c6, 0xad, 0x2e0, 0x2ba, 0xc8, 0x4c, 0x1af, 0x46, 0xcf, 0x1e1, 0xf4, 0x305, 0x74, 0xdc, 0x28c, 0x2e1, 0x30, 0x10e, 0xe1, 0x34f, 0x2fc, 0x7, 0x1ad, 0x15b, 0x343, 0xbb, 0x13d, 0x278, 0x1e4, 0x44, 0x1d2, 0x26d, 0x1ae, 0x2cc, 0x109, 0x14c, 0x214, 0x1bf, 0xbc, 0x90, 0x323, 0x2a7, 0xff, 0xef, 0x15, 0x4a, 0x288, 0xdb, 0x321, 0x3ba, 0x373, 0x1b5, 0x1dc, 0x137, 0x318, 0x43, 0x7f, 0x336, 0x2ed, 0x277, 0x34, 0x334, 0x3f0, 0x1fb, 0x16e, 0x2fd, 0x28d, 0x6b, 0x1f6, 0x1a3, 0x201, 0x1f5, 0x234, 0x4b, 0x2, 0x11d, 0x38c, 0x15a, 0x1c9, 0x17d, 0x190, 0x98, 0x35e, 0x8c, 0x19e, 0x3c2, 0x1e8, 0x203, 0xe8, 0x1b8, 0x111, 0x1cb, 0x60, 0x21c, 0x1c2, 0x297, 0x1f1, 0xe, 0x35a, 0x2b6, 0x28f, 0x176, 0x27a, 0xf9, 0x3c8, 0x88, 0x3a4, 0xd3, 0x35c, 0x191, 0x212, 0x298, 0x21, 0x11d, 0x311, 0x161, 0x253, 0x3fd, 0x26c, 0x241, 0x33, 0x13b, 0x2be, 0x1ed, 0x16f, 0xee, 0x137, 0x239, 0x10c, 0x3f8, 0x30c, 0x10f, 0xdf, 0x236, 0x2ac, 0x223, 0x238, 0x11, 0xe9, 0x26d, 0x35c, 0x322, 0x5a, 0xed, 0x210, 0x303, 0x2af, 0x104, 0x302, 0x3b2, 0x215, 0x263, 0x1e1, 0x1e8, 0xf, 0x3a0, 0x1db, 0x134, 0x11e, 0x36, 0x5b, 0x1f0, 0x101, 0x262, 0xfc, 0x2f9, 0x16e, 0x1f3, 0x226, 0x358, 0x35f, 0x5, 0x160, 0x34e, 0xec, 0x30d, 0x12, 0x3ce, 0x357, 0xff, 0x1de, 0x54, 0x250, 0xda, 0x356, 0x1e2, 0x2cf, 0x135, 0x3, 0x327, 0x13a, 0x3a3, 0x2fc, 0xe, 0x2bd, 0x2ca, 0x55, 0x34d, 0x3cb, 0x237, 0x3b1, 0x132, 0x359, 0x242, 0x314, 0x1, 0x11d, 0x311, 0x161, 0x253, 0x3fd, 0x26c, 0x241, 0x33, 0x13b, 0x2be, 0x1ed, 0x16f, 0xee, 0x137, 0x239, 0x10c, 0x3f8, 0x30c, 0x10f, 0xdf, 0x236, 0x23a, 0x5f, 0x31a, 0x171, 0x347, 0x216, 0x288, 0x36c, 0x27c, 0x363, 0x135, 0x6, 0x87, 0x1c2, 0x24e, 0x32f, 0x380, 0x6f, 0x32b, 0x37a, 0x113, 0x358, 0x2b7, 0x14, 0x312, 0x85, 0x1bf, 0x2f0, 0x112, 0x162, 0x2e8, 0x30e, 0x263, 0x3c2, 0x3a9, 0x78, 0x27e, 0x31e, 0x18b, 0x23b, 0x265, 0x345, 0x26b, 0x236, 0x151, 0x9e, 0x1e4, 0x110, 0x11f, 0x256, 0x133, 0x81, 0x145, 0x38c, 0x161, 0xaf, 0x3ef, 0x344, 0x51, 0x269, 0x24b, 0x1ef, 0x2a3, 0x306, 0x397, 0x13a, 0x34f, 0x3e2, 0x70, 0x38a, 0x1e6, 0x16d, 0x1a1, 0x6b, 0x3d1, 0x206, 0x160, 0x295, 0x3b0, 0x5e, 0x120, 0x12e, 0x5d, 0x367, 0x1cf, 0x17a, 0xf4, 0xf, 0x349, 0x365, 0x1b2, 0x1c4, 0x2c9, 0x2ed, 0x1ce, 0x340, 0xab, 0x315, 0x238, 0x22, 0x3a4, 0x34c, 0x1a5, 0x91, 0x2ad, 0x275, 0xad, 0x392, 0x3fa, 0x26c, 0x8b, 0xcc, 0x1ca, 0x3ba, 0x7d, 0x17c, 0xe6, 0x33d, 0x2a, 0xa9, 0x2d9, 0x20a, 0xdc, 0x4d, 0x11e, 0xd8, 0x1b9, 0xe7, 0x340, 0x156, 0x4f, 0x1e4, 0x220, 0x75, 0x294, 0x314, 0x4, 0x1f4, 0x1f9, 0x398, 0xef, 0xa8, 0x2a4, 0x376, 0x3a, 0x370, 0x134, 0x71, 0x360, 0x2ed, 0x39c, 0x11b, 0x151, 0x13c, 0x399, 0x92, 0x1d4, 0x242, 0x4b, 0x10, 0x3d9, 0x3ed, 0x27b, 0x3bc, 0x2a0, 0x282, 0x1c3, 0xe8, 0x1db, 0xd9, 0x1c4, 0x19b, 0x3a6, 0x26b, 0x65, 0x14d, 0xf9, 0x27f, 0x248, 0x359, 0x11a, 0x12c, 0x40, 0x37f, 0x3af, 0x1fe, 0x2eb, 0x292, 0x21a, 0x305, 0x3a0, 0x365, 0x364, 0x319, 0x265, 0x283, 0x1be, 0x194, 0x13d, 0x3e4, 0x1ee, 0x132, 0x17f, 0x61, 0xb9, 0x100, 0x1e7, 0x2a7, 0x3f1, 0x3be, 0x25a, 0x7a, 0xf, 0x29b, 0x18f, 0x18b, 0x7f, 0x186, 0x21e, 0x2f1, 0x259, 0xfd, 0x38b, 0x3b1, 0xc1, 0x1f5, 0x184, 0x2e4, 0xfa, 0x1f9, 0x339, 0x3bc, 0x149, 0x21a, 0x203, 0x29b, 0x31e, 0x225, 0x3f8, 0x56, 0x350, 0x117, 0x293, 0xc7, 0x1f6, 0x206, 0x189, 0x10a, 0x1e3, 0x2af, 0x32, 0x130, 0x30a, 0x276, 0x3ba, 0x355, 0x205, 0x87, 0x301, 0xa1, 0x262, 0x3e9, 0x317, 0x106, 0x1d2, 0x291, 0x133, 0x204, 0x7d, 0x2f8, 0x398, 0x1de, 0x2a0, 0x10d, 0x305, 0x349, 0x18f, 0x316, 0x1fc, 0x2b, 0x1a8, 0x28f, 0x34d, 0x267, 0xfb, 0x103, 0x2c0, 0x85, 0x2f5, 0x353, 0x19, 0x98, 0x185, 0x13b, 0x1dd, 0x3ae, 0x306, 0x247, 0x384, 0x254, 0x131, 0x3f0, 0x38f, 0x83, 0xe9, 0x34c, 0x29d, 0x102, 0x23a, 0x17c, 0x1cc, 0xef, 0x150, 0x282, 0x386, 0x3a0, 0x2c3, 0x18b, 0xfe, 0x211, 0xd4, 0x343, 0x3a2, 0x337, 0x279, 0x285, 0x160, 0x246, 0x37e, 0x3ad, 0x208, 0x4c, 0x2c6, 0x299, 0x2ea, 0x1d7, 0x183, 0x327, 0x1c2, 0x12a, 0x29c, 0x1f8, 0x1f4, 0x3ed, 0x1fe, 0x3be, 0x17a, 0x3a9, 0x3c0, 0x29f, 0x1ec, 0x329, 0xe, 0x38a, 0x32b, 0x3e6, 0x59, 0xd7, 0x93, 0x2ad, 0x38c, 0x31a, 0x39a, 0x54, 0x141, 0x386, 0x349, 0x31e, 0x43, 0x3fb, 0x2b0, 0x165, 0x2a8, 0x1a1, 0x358, 0x195, 0x109, 0x1da, 0x290, 0x392, 0x3ef, 0x216, 0x6d, 0x286, 0xdc, 0x134, 0x1c4, 0x265, 0x21e, 0x3d6, 0x1d1, 0x337, 0xfb, 0x206, 0x312, 0x21, 0x303, 0x2aa, 0x249, 0x8b, 0x269, 0x27c, 0x32e, 0x1cb, 0x1b, 0x2d8, 0x1ce, 0x236, 0x29a, 0x3c1, 0x36b, 0x201, 0x2d7, 0x3b0, 0x2f0, 0x82, 0x26, 0x2c6, 0x13b, 0x3ba, 0x2a3, 0x6, 0x31, 0x7c, 0xd, 0x196, 0x315, 0x1e4, 0x92, 0x359, 0x61, 0x2e4, 0x24, 0x12e, 0x2e8, 0x46, 0x1d6, 0x2f2, 0x36a, 0x3f5, 0x13a, 0x24e, 0x14e, 0x1f8, 0x38f, 0x106, 0x3a4, 0x256, 0x18a, 0x8, 0x3bb, 0x357, 0x3eb, 0x1cf, 0x3c2, 0x177, 0x3e8, 0x3af, 0x3eb, 0x39e, 0x313, 0x3aa, 0x3b8, 0x296, 0x34f, 0x257, 0xfc, 0x38f, 0x20c, 0x28b, 0x294, 0x96, 0x100, 0x323, 0xba, 0x23, 0x1d6, 0x1ed, 0x1b3, 0x397, 0x384, 0x142, 0x334, 0x1c7, 0xf2, 0x92, 0x2bb, 0x184, 0x30d, 0x240, 0x181, 0x35e, 0x348, 0x1dd, 0x2a3, 0xc, 0xc4, 0x3e0, 0xd0, 0x2ac, 0xf9, 0x3dc, 0x304, 0x2d7, 0x369, 0x3d2, 0x19, 0x260, 0x66, 0x24b, 0x2cf, 0x2e1, 0x1b, 0x1b9, 0x331, 0x194, 0x1fa, 0xce, 0x346, 0x2c0, 0x214, 0x303, 0x15d, 0x136, 0x51, 0x2d1, 0x30b, 0x222, 0x71, 0x336, 0x21e, 0x3a5, 0x34d, 0x18e, 0x3ab, 0x50, 0x139, 0xa4, 0x1c9, 0x3ef, 0x25, 0x1b4, 0x1d, 0x1db, 0x2c1, 0x1fc, 0xac, 0x2b6, 0x2a8, 0x342, 0x17b, 0xb3, 0xb4, 0x33e, 0x161, 0x2e2, 0x2a, 0x141, 0x305, 0x13f, 0xc6, 0x39, 0x387, 0x173, 0x3cc, 0x1f3, 0x59, 0x1ae, 0x24c, 0x145, 0x3d9, 0x2a7, 0x367, 0x19e, 0x2b8, 0x36a, 0x3cf, 0x384, 0x284, 0xcb, 0x223, 0x33b, 0x264, 0x3b3, 0x3b0, 0x3d2, 0x32, 0x192, 0x330, 0xf1, 0x146, 0x11e, 0x19b, 0x21e, 0x343, 0x12f, 0x6b, 0x2ce, 0x212, 0x2cb, 0x2b4, 0x2e2, 0x54, 0x10d, 0x1e, 0x3d4, 0xf6, 0x25b, 0x70, 0x1bc, 0x2cd, 0x270, 0x12b, 0x314, 0x40, 0x395, 0xba, 0x46, 0x351, 0x373, 0x306, 0x21c, 0xf8, 0x68, 0x2ac, 0x1f2, 0x36b, 0x16, 0x123, 0x1e3, 0x155, 0x9b, 0x51, 0x1ab, 0x37, 0x134, 0x319, 0x211, 0x2a9, 0x154, 0x342, 0x2f6, 0x2cc, 0x1a9, 0x38c, 0x73, 0x1de, 0x12d, 0x3d0, 0x389, 0xd5, 0x1f7, 0x3cd, 0x3f, 0x3c3, 0x20c, 0x11f, 0x242, 0xb9, 0x24, 0xb1, 0x2d3, 0x1a4, 0x1dd, 0x14f, 0x30, 0x229, 0x277, 0x236, 0x27a, 0x67, 0x346, 0x189, 0x42, 0x2e, 0x1fd, 0x281, 0x6d, 0x20a, 0x1db, 0x18b, 0x3f9, 0x169, 0x33a, 0x3bb, 0x28e, 0x30e, 0x1d6, 0x3bd, 0x306, 0x31, 0x3e0, 0x340, 0x29a, 0x237, 0x346, 0x312, 0x108, 0x170, 0x3ef, 0x94, 0x376, 0x349, 0xc6, 0xe4, 0xe, 0x6f, 0x362, 0x270, 0x256, 0x4b, 0x200, 0x12e, 0x36d, 0x1a4, 0x3ba, 0x135, 0x180, 0x2d8, 0x26b, 0xbb, 0x337, 0x3d1, 0xa0, 0x1da, 0xad, 0x171, 0x54, 0x21a, 0x78, 0x29f, 0x37b, 0x3e2, 0x3f, 0x38f, 0x22, 0xea, 0x61, 0x30d, 0x112, 0x26, 0x21d, 0x24b, 0x32e, 0x243, 0x2c9, 0x21e, 0x28f, 0xb5, 0x358, 0xb3, 0x2d0, 0x38c, 0xe6, 0x371, 0x17a, 0x177, 0x1dc, 0x125, 0x24e, 0x262, 0x2e7, 0x1e4, 0x99, 0x3dd, 0x3b0, 0x3ad, 0xc8, 0x8b, 0x36c, 0x21f, 0x134, 0x23b, 0x56, 0x165, 0x16d, 0x8a, 0xd7, 0x91, 0x23a, 0x3ed, 0x3eb, 0x263, 0x15c, 0x36a, 0x397, 0x20b, 0xd, 0xab, 0xf9, 0x36b, 0x2c, 0x85, 0x303, 0x17d, 0x344, 0x6d, 0x1d, 0x37f, 0x22a, 0x46, 0x15f, 0x355, 0x30, 0xb6, 0x331, 0xbb, 0x267, 0x35f, 0x109, 0x19f, 0x18d, 0xef, 0x25a, 0x2bf, 0x1dc, 0x24a, 0x12a, 0x334, 0x223, 0xf7, 0x201, 0x123, 0x385, 0x17d, 0x281, 0x1b4, 0xe8, 0x235, 0x72, 0xe, 0xde, 0x193, 0x3a4, 0x121, 0x172, 0x120, 0x20d, 0x30a, 0x24b, 0x255, 0x11e, 0x265, 0x1a8, 0x154, 0x113, 0x333, 0x24c, 0x23a, 0x3d3, 0x3b7, 0x33c, 0x1ed, 0x183, 0x31, 0x3c9, 0x11b, 0xfd, 0x338, 0xa, 0x139, 0x129, 0x2bc, 0x54, 0x3d, 0x1e0, 0xd5, 0x3d5, 0xa7, 0x3db, 0x79, 0x248, 0x3dd, 0x369, 0x2af, 0x249, 0xa2, 0x143, 0x2e9, 0x316, 0x3f7, 0x173, 0x25f, 0x27, 0x34c, 0x314, 0x100, 0x12e, 0x2d3, 0x299, 0x1ef, 0x374, 0x6c, 0x345, 0x3a5, 0x25e, 0x358, 0x166, 0x352, 0x5f, 0x27b, 0x2e3, 0x22f, 0x2de, 0x3cf, 0x20b, 0x1a, 0x2ac, 0x3c1, 0x2d5, 0x189, 0x108, 0x2f7, 0xba, 0x230, 0x1dd, 0x26a, 0x1b, 0x3a6, 0x3a5, 0xb5, 0x17b, 0x322, 0x145, 0x3f2, 0x3df, 0x33c, 0x3da, 0x205, 0x188, 0xe7, 0x328, 0x337, 0x35f, 0x212, 0x275, 0x73, 0x2eb, 0x3c2, 0x2b3, 0x3e3, 0x20b, 0x34, 0x2a2, 0x237, 0x103, 0x14c, 0x290, 0x2bc, 0xa8, 0xf4, 0x31b, 0x14b, 0x24e, 0x19a, 0x223, 0x1ee, 0x16, 0x10a, 0x2e, 0x3f3, 0x128, 0x386, 0x1ea, 0x3d8, 0x3e2, 0xfc, 0x8e, 0x92, 0x3ea, 0x369, 0x157, 0x136, 0x119, 0x1d, 0x18f, 0x39, 0xe, 0x1bc, 0x245, 0x11f, 0x234, 0x213, 0x82, 0xc9, 0xdb, 0x21f, 0xd9, 0x3f8, 0x1ad, 0x391, 0x217, 0x34c, 0x221, 0x9, 0x162, 0x163, 0x394, 0x32e, 0x11e, 0xc3, 0x2a9, 0x2b2, 0x114, 0x2b1, 0x204, 0x37f, 0x5d, 0x118, 0x2ea, 0x135, 0x209, 0x1d3, 0x3d6, 0x25e, 0x2b9, 0x191, 0x2a6, 0x1f9, 0x3eb, 0x19e, 0x1ed, 0x306, 0xc4, 0x277, 0x194, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x3ce, 0x3b2, 0x13b, 0x2cf, 0x11e, 0x30c, 0x2ca, 0x1f3, 0x26d, 0x314, 0x12, 0x302, 0x33, 0x1e2, 0x134, 0x3f8, 0x2bd, 0x16e, 0xe9, 0x242, 0x30d, 0x104, 0x241, 0x356, 0x1db, 0x10c, 0xe, 0x2f9, 0x11, 0x359, 0xec, 0x2af, 0x26c, 0xda, 0x3a0, 0x239, 0x2fc, 0xfc, 0x238, 0x132, 0x34e, 0x303, 0x3fd, 0x250, 0xf, 0x137, 0x3a3, 0x262, 0x223, 0x3b1, 0x160, 0x210, 0x253, 0x54, 0x1e8, 0xee, 0x13a, 0x101, 0x2ac, 0x237, 0x5, 0xed, 0x161, 0x1de, 0x1e1, 0x16f, 0x327, 0x1f0, 0x236, 0x3cb, 0x35f, 0x5a, 0x311, 0xff, 0x263, 0x1ed, 0x3, 0x5b, 0xdf, 0x34d, 0x358, 0x322, 0x11d, 0x357, 0x215, 0x2be, 0x135, 0x36, 0x10f, 0x55, 0x226, 0x35c, 0x1, 0x3ce, 0x3b2, 0x13b, 0x2cf, 0x11e, 0x30c, 0x2ca, 0x1f3, 0x26d, 0x314, 0x12, 0x302, 0x33, 0x1e2, 0x134, 0x3f8, 0x2bd, 0x16e, 0xe9, 0x242, 0x30d, 0x395, 0x2d3, 0x1ca, 0xa3, 0x388, 0x2b0, 0x391, 0x9c, 0x294, 0x382, 0x104, 0x8b, 0x143, 0x2c3, 0xe4, 0x1c0, 0x317, 0x92, 0x36f, 0x3c6, 0x3fa, 0x250, 0x1e, 0xd5, 0x127, 0x261, 0xf9, 0x1a3, 0x14c, 0xad, 0x273, 0x2f4, 0x16f, 0x247, 0x3c9, 0x194, 0xc7, 0x32a, 0x2ad, 0x3f2, 0x2c7, 0x2ab, 0x29e, 0x36, 0x21e, 0x154, 0x114, 0x1a5, 0x20, 0x25c, 0x2c6, 0x13e, 0x4d, 0x1fc, 0x2bd, 0x2dc, 0x3a4, 0x234, 0xbc, 0xc8, 0x144, 0x3a, 0xc6, 0xbf, 0x7e, 0x238, 0x264, 0x123, 0x2e, 0x3a7, 0x282, 0x3c0, 0x296, 0xa1, 0xab, 0x31f, 0x5, 0x1da, 0x18d, 0x2eb, 0x22f, 0x1b3, 0x62, 0x1ce, 0x2ec, 0xd6, 0x191, 0x11d, 0x2a7, 0x46, 0x1dd, 0x374, 0x2c9, 0x350, 0x2da, 0x2c8, 0xc5, 0x9, 0x302, 0x66, 0x381, 0x1b2, 0x3f7, 0x31d, 0x326, 0x75, 0x219, 0x3ad, 0x136, 0xda, 0x349, 0xf6, 0x3cd, 0x3db, 0x323, 0x35e, 0x24b, 0x222, 0x1fc, 0x173, 0x362, 0x11f, 0x308, 0x3ad, 0x26c, 0x368, 0x27e, 0x37b, 0x14e, 0x315, 0x36b, 0x312, 0x290, 0x39a, 0x17a, 0x16f, 0x87, 0x33f, 0xbb, 0x6b, 0x191, 0x23a, 0x28e, 0x230, 0x1ef, 0x243, 0x30c, 0x33a, 0x30f, 0x256, 0x2e4, 0x82, 0x8b, 0x286, 0x31e, 0x329, 0x3f, 0x238, 0xc1, 0x85, 0x170, 0x20e, 0xf4, 0x1dc, 0x1c2, 0x68, 0xfd, 0x3d1, 0x5a, 0x5f, 0x3eb, 0x1d6, 0x2a3, 0x1b, 0x21e, 0x2a8, 0x59, 0x133, 0x200, 0x302, 0xcc, 0x21f, 0x18b, 0x307, 0x378, 0x22, 0x2fe, 0x1bf, 0x17d, 0x94, 0xf, 0xd5, 0x24e, 0x196, 0x3c1, 0x206, 0x1da, 0x31a, 0x3be, 0x15c, 0x306, 0x5b, 0x37c, 0xb5, 0x39d, 0x81, 0x1e7, 0x36d, 0x1ca, 0x146, 0x23b, 0x1ad, 0x16e, 0x3a4, 0x61, 0x2f0, 0x249, 0x6d, 0x349, 0x1ec, 0x32f, 0x2e7, 0x1ee, 0x160, 0x52, 0x171, 0x12d, 0x3aa, 0x24f, 0x163, 0x27c, 0x268, 0x3f7, 0x6f, 0x20c, 0x17f, 0x1bf, 0x2fa, 0x250, 0x78, 0x14b, 0x142, 0x151, 0x338, 0x280, 0x38c, 0x3fc, 0xeb, 0x2a3, 0x36, 0x6a, 0x16d, 0x199, 0x221, 0x120, 0x260, 0x1ab, 0x365, 0x1c8, 0x21b, 0x238, 0x182, 0x214, 0x392, 0xa8, 0x2bf, 0x3f5, 0xf8, 0xca, 0x18e, 0x166, 0x11d, 0x28e, 0x69, 0x3b5, 0x23c, 0xac, 0x391, 0x270, 0x11a, 0x178, 0x249, 0xda, 0x13f, 0x37b, 0x29c, 0x4f, 0x36e, 0x14c, 0x2b4, 0x371, 0x57, 0x183, 0x5b, 0x2f1, 0x2d4, 0xd7, 0x2, 0x97, 0x2c6, 0xf1, 0xd9, 0x3e7, 0xde, 0x11, 0x2fe, 0x37e, 0x1fd, 0xa9, 0xf0, 0x296, 0x284, 0x2a2, 0x279, 0x109, 0x311, 0x3f1, 0x1d6, 0x14f, 0x6c, 0xd4, 0x2da, 0x332, 0x4b, 0x240, 0xc9, 0x356, 0x2c3, 0x390, 0x3f, 0x79, 0x304, 0x21, 0x32d, 0x150, 0x177, 0x3e3, 0x1f0, 0x194, 0x31c, 0x2cc, 0x23a, 0x97, 0x185, 0x3c4, 0x2c1, 0x207, 0x3f6, 0x49, 0x1a7, 0x2e, 0x107, 0x1e8, 0x2fb, 0x3e, 0x65, 0x18e, 0x2cc, 0x7d, 0x5d, 0x299, 0x255, 0x23b, 0x2bd, 0x2cd, 0xea, 0x1d8, 0x15d, 0x94, 0x3c, 0x14b, 0x284, 0x14d, 0x1f6, 0x5a, 0x17c, 0x2c7, 0x175, 0x2e1, 0xc3, 0x33a, 0x27, 0x121, 0x5e, 0x320, 0xda, 0x27e, 0x1f7, 0xcd, 0xf9, 0x103, 0x3b4, 0xe6, 0x335, 0x373, 0x180, 0x10f, 0x159, 0x2c8, 0x221, 0x240, 0x192, 0x143, 0x235, 0x17e, 0x3e9, 0x27f, 0x160, 0x148, 0x33d, 0x3c2, 0x1b3, 0x310, 0x37c, 0x2d4, 0x1ae, 0x8, 0xb1, 0x33, 0x21f, 0x225, 0x1c, 0x38f, 0x248, 0x123, 0x170, 0x2a, 0x35b, 0x3f5, 0x1f0, 0x328, 0x6b, 0x24d, 0x3e8, 0x2e8, 0xe5, 0x28c, 0x1fc, 0x1c5, 0x245, 0x359, 0x2db, 0x2fa, 0xa9, 0x1e0, 0x24a, 0xd, 0x27a, 0x3ab, 0x2d0, 0x3f2, 0x215, 0x3ba, 0x325, 0x211, 0x1e6, 0x12e, 0x21d, 0x21f, 0x43, 0x70, 0x47, 0xc1, 0x21, 0xaf, 0x12d, 0x16f, 0x31, 0x26b, 0xb5, 0xd7, 0x8, 0x162, 0xcc, 0xdc, 0x218, 0x380, 0x238, 0x201, 0x108, 0x171, 0x17a, 0x36a, 0x188, 0x37c, 0x1a1, 0x2b1, 0x40, 0x302, 0x269, 0x2e9, 0xe4, 0x3f, 0x1e4, 0x2c, 0x52, 0x39a, 0x3c2, 0x366, 0x5b, 0x3d6, 0x113, 0x1a5, 0x200, 0x26, 0x36c, 0x365, 0x329, 0x1f8, 0x33b, 0x160, 0x290, 0xef, 0x22f, 0x306, 0x2d8, 0x28f, 0x8a, 0x133, 0x24, 0x130, 0x356, 0x31e, 0x17e, 0x3db, 0x1ee, 0x312, 0xad, 0x371, 0x15c, 0x6, 0x2ed, 0x55, 0x59, 0x18a, 0x120, 0x192, 0x286, 0xc6, 0x3e2, 0x2e7, 0x36b, 0xa6, 0x161, 0x3be, 0x2f2, 0x30, 0x345, 0x2a8, 0x2c8, 0x4b, 0x112, 0x8b, 0x1d, 0x239, 0x32f, 0x315, 0x36e, 0x139, 0x31a, 0x1cf, 0x3bd, 0x180, 0x21e, 0x16d, 0x26d, 0x258, 0x82, 0x51, 0xe8, 0x25c, 0x66, 0xdc, 0x39, 0x21b, 0x1e4, 0x58, 0x148, 0xef, 0x57, 0x3, 0x2ed, 0xaa, 0x164, 0x4b, 0x224, 0x22c, 0xe8, 0x3d8, 0x131, 0xf9, 0x5, 0x33e, 0x1fe, 0x3ac, 0xdd, 0x265, 0x27d, 0x138, 0x61, 0x353, 0x10b, 0xf, 0x14b, 0x202, 0xfd, 0x167, 0x2a6, 0x28e, 0x348, 0xa3, 0x1fc, 0x31d, 0x11, 0x3dd, 0x20f, 0x107, 0x3a9, 0x3e3, 0x39b, 0x1d1, 0x1e5, 0x204, 0x12e, 0x33, 0x6e, 0x218, 0x309, 0xf2, 0x2c, 0xa4, 0x273, 0x22f, 0x205, 0x372, 0x55, 0xb2, 0x221, 0x112, 0x116, 0x74, 0x1ec, 0x29c, 0x278, 0x206, 0x19f, 0xff, 0x1d6, 0x26a, 0x336, 0x33a, 0x9c, 0x234, 0x3ad, 0x281, 0x203, 0x2a1, 0x101, 0x27a, 0x2b7, 0x153, 0x147, 0x1a4, 0x255, 0xfe, 0x38a, 0x20c, 0x3ea, 0x303, 0x287, 0x3d0, 0x3f5, 0x3c9, 0x2ec, 0x2f6, 0x102, 0x97, 0x21d, 0x37, 0x10c, 0x380, 0x79, 0x16, 0x52, 0xb1, 0x198, 0x2e9, 0x390, 0x3f0, 0x1ee, 0x53, 0x2c2, 0x1cf, 0x2ef, 0x36, 0x2a9, 0x383, 0x121, 0x2f0, 0x1a2, 0x305, 0x2a1, 0x202, 0x1fa, 0x195, 0x11d, 0xba, 0x1ca, 0x9a, 0x3c7, 0x3f6, 0x248, 0x10a, 0xaf, 0xbd, 0x2dd, 0x5b, 0x343, 0x114, 0x18a, 0x89, 0x116, 0xe8, 0x3b9, 0xcd, 0x3c1, 0x50, 0x311, 0x367, 0x1dd, 0x8f, 0x2b0, 0x1b1, 0x1d4, 0x1bf, 0x3f3, 0x3d, 0x2fb, 0x1f0, 0x176, 0x2f6, 0x204, 0x25c, 0xcc, 0x370, 0x1c8, 0x1f8, 0xf7, 0x22d, 0x161, 0x2e3, 0x373, 0x1b, 0x350, 0x3c5, 0x294, 0x178, 0xd1, 0x386, 0x354, 0x101, 0xfd, 0x2ce, 0x28a, 0x5d, 0xe5, 0x4d, 0x3e7, 0x1fb, 0x124, 0x85, 0x253, 0x25a, 0x36a, 0x229, 0x3a5, 0x8a, 0xc5, 0x240, 0x8b, 0x74, 0x3d8, 0x262, 0x3e4, 0x28, 0x38c, 0x3b7, 0x2ea, 0x243, 0x158, 0x2dc, 0xea, 0x2db, 0x3fd, 0x21a, 0x379, 0xf8, 0xbb, 0x162, 0x269, 0x365, 0x17e, 0x2e7, 0x36e, 0x1da, 0x339, 0x1d6, 0x1ba, 0x30c, 0x32b, 0x11f, 0x3b0, 0x3fa, 0x21a, 0x2fb, 0x3e0, 0x1d1, 0x39d, 0x8, 0x302, 0x36c, 0x31e, 0x3e2, 0x315, 0x346, 0x2cb, 0x1fe, 0x2ab, 0x1cb, 0x56, 0x16e, 0xea, 0x1bf, 0x3ef, 0xf4, 0x3f5, 0x33f, 0x293, 0xd7, 0x40, 0x26, 0x356, 0xc6, 0x32f, 0x9e, 0x206, 0x275, 0x3eb, 0x175, 0x243, 0x2b0, 0x362, 0x359, 0x1e3, 0x347, 0x3a9, 0x397, 0x1ce, 0xb5, 0x2b1, 0x200, 0x130, 0x286, 0x239, 0x14e, 0xf9, 0x14, 0x38c, 0x367, 0x3ba, 0x23c, 0x1ad, 0x326, 0x2fe, 0x303, 0x20e, 0x177, 0x87, 0x26b, 0x1a1, 0x1a5, 0x24, 0x192, 0x1d, 0x1ec, 0x262, 0x3c1, 0xa0, 0x5f, 0x30e, 0x1ef, 0x1c4, 0x173, 0x106, 0x3dd, 0x2e, 0x54, 0x3aa, 0x31, 0x37c, 0x113, 0x133, 0x120, 0x8b, 0xe8, 0x37b, 0x334, 0x237, 0x109, 0x2f8, 0x46, 0x363, 0x2c4, 0x1b6, 0x31e, 0x3cd, 0x4f, 0x206, 0xe3, 0x3b7, 0x3ba, 0x71, 0x2bd, 0x106, 0x3b3, 0xb8, 0x2a0, 0x2de, 0x229, 0x28f, 0xb2, 0x12c, 0x19, 0xda, 0x34b, 0x254, 0x13d, 0x2ce, 0x23a, 0x1d9, 0x13e, 0x18b, 0xe0, 0xf2, 0x160, 0x15a, 0x2e3, 0x1d7, 0x1b0, 0x19d, 0x270, 0x219, 0x2ba, 0x141, 0x3b8, 0x1f0, 0x1d1, 0x333, 0x20, 0x26, 0x2a5, 0x318, 0x14e, 0x1f2, 0x50, 0x5f, 0x215, 0x3b5, 0x23b, 0x31d, 0x88, 0x295, 0x32d, 0xbd, 0x366, 0x1b9, 0x154, 0x26d, 0x1c1, 0x320, 0x376, 0x1aa, 0x202, 0x3e1, 0x166, 0x3d9, 0x35e, 0x381, 0x10c, 0x3f, 0x27f, 0x53, 0x31a, 0xcf, 0x29e, 0x265, 0x3cc, 0x28b, 0x3b0, 0x3fd, 0x7a, 0x3f5, 0x277, 0x25e, 0x2b1, 0x9, 0xc9, 0x1d, 0x3d8, 0x19a, 0x237, 0x212, 0x3f2, 0x230, 0x255, 0x3f9, 0x378, 0x124, 0x214, 0x171, 0x38d, 0x3, 0x345, 0x2da, 0x12b, 0x5e, 0x181, 0x2d1, 0xc6, 0xa7, 0x1f2, 0xa0, 0x17c, 0x8c, 0x32e, 0x3f9, 0x2f9, 0x99, 0x84, 0x33d, 0x15c, 0xc0, 0x1a8, 0x30f, 0x234, 0x2ae, 0xa9, 0xee, 0xf8, 0x1d1, 0x26f, 0x80, 0x130, 0x20a, 0x3d8, 0x334, 0xce, 0xb4, 0x357, 0x299, 0x4d, 0x307, 0x227, 0xb, 0x290, 0x1df, 0x373, 0xd8, 0x19d, 0xe9, 0x76, 0x1fd, 0x3d, 0x3f5, 0xe7, 0x16a, 0x1a5, 0x90, 0x116, 0x349, 0x3a3, 0x156, 0x3d1, 0x2a6, 0xba, 0x24b, 0x2c1, 0xe0, 0x1e4, 0x189, 0x2c2, 0x263, 0x29e, 0xc3, 0x32b, 0x75, 0x37e, 0x347, 0x2bf, 0x10e, 0x37c, 0x45, 0x314, 0x82, 0x232, 0x3a1, 0x254, 0x27a, 0x32a, 0x1f4, 0x1af, 0x381, 0x218, 0xfc, 0x3dc, 0x139, 0x398, 0x3ac, 0x1cb, 0x158, 0x2cd, 0x2fe, 0x17, 0xa8, 0x16f, 0x229, 0x117, 0x2c8, 0x172, 0x190, 0x376, 0x354, 0x1a, 0x337, 0x24d, 0x3ce, 0x21d, 0x370, 0x25b, 0x2e7, 0x302, 0x356, 0x239, 0x262, 0x237, 0x5a, 0x357, 0x13b, 0x134, 0xe, 0x238, 0x160, 0x161, 0x263, 0x135, 0x30c, 0x16e, 0x359, 0x303, 0x54, 0x16f, 0x5b, 0x55, 0x26d, 0x30d, 0x26c, 0xf, 0x13a, 0x236, 0x358, 0x1, 0x302, 0x356, 0x239, 0x262, 0x237, 0x5a, 0x357, 0x13b, 0x134, 0xe, 0x238, 0x160, 0x161, 0x263, 0x135, 0x30c, 0x16e, 0x359, 0x303, 0x54, 0x16f, 0x5b, 0x55, 0x26d, 0x30d, 0x26c, 0xf, 0x13a, 0x236, 0x358, 0x1, 0x302, 0x356, 0x239, 0x262, 0x237, 0x5a, 0x357, 0x13b, 0x134, 0xe, 0x238, 0x160, 0x161, 0x263, 0x135, 0x30c, 0x16e, 0x359, 0x303, 0x54, 0x16f, 0x5b, 0x55, 0x26d, 0x30d, 0x26c, 0xf, 0x13a, 0x236, 0x358, 0x1, 0x302, 0x356, 0x239, 0x262, 0x237, 0x5a, 0x357, 0x13b, 0x134, 0xe, 0x238, 0x160, 0x161, 0x263, 0x135, 0x30c, 0x16e, 0x359, 0x303, 0x54, 0x16f, 0x20d, 0x143, 0x1ec, 0x261, 0x279, 0x2ad, 0xba, 0x13e, 0x43, 0x7e, 0x3b1, 0x1da, 0x3fc, 0x1dd, 0x1c4, 0x31d, 0x49, 0x21, 0x33d, 0x179, 0x1b, 0x2ca, 0x1d2, 0x3b0, 0x3d7, 0x2bf, 0x31, 0x3a5, 0x164, 0x2e4, 0x9b, 0x203, 0x13a, 0x65, 0x17b, 0x8, 0x4c, 0x20a, 0x37b, 0x32c, 0x3ec, 0x145, 0x1d9, 0x1e2, 0x218, 0x3f0, 0x1b7, 0x2cb, 0x3df, 0x2f3, 0x23b, 0xde, 0x248, 0x108, 0x1de, 0x3da, 0xd8, 0x27d, 0x28b, 0x1bf, 0x287, 0x1d5, 0x188, 0x117, 0x332, 0x30d, 0xd1, 0x3c, 0x1c2, 0x328, 0x3ca, 0x40, 0x260, 0x74, 0x3ee, 0x156, 0x35f, 0x23a, 0x2d3, 0x30b, 0xe4, 0x3bf, 0x1a3, 0x275, 0x2c7, 0x3b5, 0x1fc, 0x2f9, 0x264, 0x52, 0x2eb, 0x2ef, 0x2c9, 0x3cc, 0x75, 0x1e3, 0x15, 0x2b3, 0x5b, 0xaa, 0x1a6, 0x5e, 0x281, 0x1e0, 0x20b, 0x176, 0x26f, 0x200, 0x324, 0x3a0, 0x34f, 0x2a2, 0x2ce, 0x1f4, 0x13, 0x105, 0x37b, 0x251, 0x3ab, 0x23a, 0x1af, 0x37, 0x329, 0x38e, 0x5, 0x5f, 0x118, 0x28c, 0x307, 0x11c, 0x2c0, 0x31a, 0xeb, 0x396, 0x1ad, 0x11, 0x123, 0x171, 0xae, 0x300, 0x165, 0x1d2, 0x369, 0x347, 0x1d5, 0x310, 0x55, 0x1a6, 0xbc, 0x216, 0x31b, 0xf8, 0x293, 0x2d6, 0x240, 0x288, 0x34b, 0x101, 0x337, 0x24c, 0x25c, 0x36c, 0x318, 0xcd, 0x19c, 0x352, 0xba, 0x27c, 0x10c, 0x3f0, 0x36e, 0x33e, 0x2c7, 0x363, 0x3f9, 0x3e5, 0x201, 0x252, 0x39e, 0x135, 0x2b, 0x2cd, 0x3dd, 0x1c9, 0x2f4, 0x6, 0x6a, 0x217, 0x308, 0x1fd, 0x1e8, 0x87, 0x1eb, 0xb2, 0x2e4, 0x136, 0x1e, 0x1c2, 0x259, 0x333, 0x200, 0x241, 0x29b, 0x24e, 0x27a, 0x166, 0x1e7, 0x66, 0x2c3, 0x32f, 0x3e4, 0x212, 0x357, 0xe5, 0x364, 0x380, 0xf7, 0x272, 0x1fe, 0x1dd, 0x388, 0x6f, 0x248, 0x210, 0x371, 0x2ef, 0x19b, 0x32b, 0x26, 0x1d, 0x3ee, 0x151, 0x195, 0x3bb, 0x21d, 0x365, 0x32f, 0x3c1, 0x5a, 0x28e, 0x24b, 0x43, 0x1f8, 0x36e, 0x275, 0x30e, 0x32e, 0x3e7, 0x47, 0x160, 0x31a, 0x1d6, 0x243, 0x173, 0x110, 0x21, 0xef, 0x3bd, 0x2c9, 0x32b, 0x359, 0x2e, 0x12d, 0x306, 0x21e, 0x30f, 0x308, 0x3fa, 0x3a9, 0x31, 0x28f, 0x26d, 0x5e, 0x216, 0x23f, 0x3e0, 0xb5, 0x133, 0x82, 0x368, 0x2a1, 0x340, 0x358, 0x8, 0x130, 0xe8, 0x34f, 0x29a, 0xb3, 0x1e7, 0xcc, 0x31e, 0x14e, 0x237, 0x2d0, 0x5d, 0x27c, 0x218, 0x3db, 0x346, 0x38c, 0x46, 0x146, 0x307, 0x238, 0x312, 0xe6, 0x2ab, 0x23c, 0x38a, 0x92, 0x108, 0x371, 0x1d7, 0x265, 0x16e, 0x2fe, 0x170, 0x17a, 0x6, 0xd4, 0x4e, 0x76, 0x3ef, 0x177, 0x188, 0x55, 0x34c, 0x2f0, 0x94, 0x1dc, 0x33f, 0x1a1, 0x18a, 0x19, 0x376, 0x125, 0x236, 0x2f6, 0x40, 0x192, 0x349, 0x4c, 0x74, 0x34f, 0x13d, 0x2cc, 0x323, 0xdb, 0x318, 0x334, 0x1f6, 0x11d, 0x35e, 0x1b8, 0x1f1, 0xf9, 0x212, 0x147, 0x24b, 0x86, 0x3e9, 0x346, 0x311, 0x118, 0x222, 0x1c, 0x399, 0x139, 0x3fc, 0x2f3, 0x1fc, 0x3e5, 0x16, 0x161, 0x271, 0x325, 0x173, 0x220, 0x84, 0x371, 0x3ae, 0x186, 0x362, 0x3b3, 0x253, 0x22f, 0x300, 0x19d, 0x11f, 0x3c6, 0x150, 0x366, 0x283, 0x383, 0x308, 0x3fd, 0x2bf, 0x188, 0xaa, 0x12b, 0x3ad, 0x152, 0x3fe, 0x26b, 0x114, 0x172, 0x26c, 0xf0, 0x3e, 0x293, 0x34a, 0x41, 0x368, 0x14b, 0x11b, 0x2f6, 0x80, 0x241, 0x27e, 0xa1, 0x39f, 0x91, 0x2c4, 0x143, 0x37b, 0x156, 0x2ce, 0x3bb, 0x33, 0x18f, 0x14e, 0x67, 0x352, 0x2e8, 0x381, 0x390, 0x315, 0x28, 0x3f2, 0x13b, 0x364, 0x21b, 0x36b, 0x19f, 0x187, 0x32e, 0x3c7, 0x11c, 0x312, 0x1cc, 0x2be, 0x1c4, 0xde, 0x264, 0x290, 0x98, 0x1d0, 0x24e, 0x3f4, 0x126, 0x162, 0x143, 0x2ff, 0x151, 0x25d, 0x3ce, 0x269, 0x318, 0x261, 0x3d1, 0xfa, 0x185, 0x365, 0xa7, 0x67, 0x2ad, 0x3b2, 0x37, 0x17e, 0x278, 0x212, 0x28e, 0x13e, 0x39, 0x2e7, 0xa, 0x1f9, 0x13b, 0x2c1, 0x7e, 0x36e, 0x1c6, 0x8c, 0x222, 0x38, 0x27f, 0x1da, 0x3b7, 0x2cf, 0x3e7, 0x11c, 0x22d, 0x339, 0x1dd, 0x7f, 0x3f6, 0x16, 0x2c2, 0x1d6, 0x11e, 0x31d, 0x99, 0x148, 0x39e, 0x1ba, 0x2d2, 0x44, 0x21, 0x3bc, 0x3ae, 0x30c, 0x193, 0x1a7, 0x171, 0x179, 0x1b0, 0x32b, 0x17f, 0x2e0, 0x3c2, 0xc0, 0x2ca, 0x11f, 0x385, 0x149, 0x306, 0x6a, 0x9c, 0x3b0, 0x107, 0x2de, 0x2ed, 0x1f3, 0xc2, 0x3fa, 0x2bf, 0x310, 0x2a8, 0x14a, 0x2ae, 0x21a, 0x247, 0x3a5, 0x26d, 0x178, 0x128, 0x2fb, 0x331, 0x114, 0x2e4, 0x1a2, 0x389, 0x3e0, 0x2d4, 0x314, 0xc8, 0x203, 0x384, 0x1d1, 0x130, 0x349, 0x254, 0x337, 0x81, 0x26, 0xe8, 0x24e, 0x3e1, 0x91, 0x302, 0x1d, 0x34f, 0xfd, 0x93, 0x162, 0x286, 0x3ee, 0x29a, 0x191, 0x12e, 0x356, 0x37b, 0x151, 0xb3, 0x323, 0x36c, 0x1ec, 0xab, 0x195, 0x1e7, 0x269, 0x239, 0x196, 0x2b7, 0x3bb, 0xcc, 0xc6, 0x334, 0x3d1, 0x1f4, 0x21d, 0x31e, 0x262, 0xfb, 0x23a, 0x2c6, 0x365, 0x14e, 0x19c, 0x145, 0x35e, 0x2e9, 0x32f, 0x237, 0x2ad, 0x36d, 0xdc, 0x3e2, 0x3c1, 0x2d0, 0x2e8, 0x21f, 0x17e, 0xf9, 0x5a, 0x5d, 0x3c4, 0x329, 0x9e, 0x109, 0x28e, 0x27c, 0xe4, 0x315, 0xa0, 0x357, 0x24b, 0x218, 0x2e7, 0x14, 0x3ed, 0x1ca, 0x43, 0x3db, 0x206, 0x2f8, 0x13b, 0x18b, 0x1f8, 0x346, 0x5f, 0x1a4, 0x1b2, 0x3f, 0x36e, 0x38c, 0x230, 0x134, 0x380, 0x36b, 0x275, 0x46, 0x222, 0x70, 0x1ee, 0x2cb, 0x30e, 0x146, 0xe, 0x33b, 0x1da, 0x367, 0x32e, 0x260, 0x13f, 0x284, 0x31c, 0x4, 0x192, 0xf5, 0x202, 0x6b, 0x10, 0x241, 0x3d4, 0x1a, 0x1ac, 0x40, 0x116, 0x34b, 0x68, 0x2b9, 0x100, 0x51, 0x137, 0x1a0, 0x2f6, 0x9, 0x144, 0xd5, 0x289, 0x3ca, 0x24, 0x119, 0x354, 0x236, 0x333, 0x90, 0x6d, 0x14b, 0xca, 0xd7, 0x240, 0x1b4, 0x125, 0x328, 0x35c, 0x112, 0x2d9, 0x9d, 0xbb, 0x16b, 0x41, 0x376, 0x274, 0x2ec, 0x1a5, 0x104, 0x1c3, 0x1c2, 0x3a2, 0x29d, 0x19, 0x305, 0x301, 0x293, 0x266, 0x64, 0xf, 0x1f, 0x25e, 0x18a, 0x190, 0x3c, 0x7c, 0x16a, 0x221, 0x249, 0xf0, 0x1f0, 0x1a1, 0x96, 0x136, 0x3c0, 0x3c9, 0x28d, 0x258, 0xd1, 0x31b, 0x33f, 0x226, 0x172, 0x344, 0x77, 0xe7, 0x8a, 0x1c1, 0x10b, 0x1dc, 0x39c, 0x228, 0x30d, 0x25, 0x379, 0x26b, 0xb2, 0x2f, 0x94, 0x1ff, 0x1be, 0x2c8, 0xbc, 0x250, 0x3f5, 0x2f1, 0x332, 0x2f0, 0xc9, 0xf5, 0xd, 0x1ac, 0x80, 0x51, 0x26e, 0x289, 0x39d, 0x90, 0xda, 0x125, 0x259, 0x16b, 0x82, 0x1c3, 0x384, 0x293, 0xc5, 0x190, 0x78, 0x1f0, 0x342, 0x258, 0x1a2, 0x77, 0x1ce, 0x228, 0x213, 0x94, 0x3fe, 0x2f1, 0x26d, 0x3d2, 0x282, 0x87, 0x22e, 0xa5, 0x2aa, 0x3d0, 0x310, 0x16d, 0x234, 0x3fd, 0x3aa, 0x372, 0x3c5, 0x76, 0x107, 0x2dd, 0x21e, 0x138, 0x37e, 0x2a0, 0x3, 0x15b, 0x11f, 0x17, 0x2f4, 0x180, 0xf3, 0x2bb, 0x392, 0xae, 0x1b0, 0x16e, 0x36f, 0x2e2, 0x3bd, 0x186, 0x245, 0x85, 0x3bc, 0x14f, 0x2b0, 0x88, 0x210, 0x1cf, 0x2e1, 0x2e6, 0x99, 0x252, 0x271, 0x23c, 0x1bc, 0xb, 0x31a, 0x2be, 0x7f, 0x38f, 0x189, 0x27b, 0x1ef, 0x3f7, 0x79, 0x139, 0x3b7, 0x255, 0xe, 0xf7, 0x19f, 0x46, 0x9a, 0x309, 0x36e, 0x22b, 0x348, 0x18b, 0x3e9, 0x5, 0x3ed, 0x321, 0x39, 0x315, 0x192, 0x3d4, 0x68, 0x2f6, 0x24, 0x6d, 0x125, 0xbb, 0x1a5, 0x19, 0xf, 0x7c, 0x1a1, 0x258, 0x344, 0x1dc, 0x26b, 0x2c8, 0x2f0, 0x141, 0x87, 0x55, 0x294, 0x17d, 0x177, 0x2d8, 0x3e6, 0x76, 0x20e, 0x366, 0xd4, 0x3a4, 0x303, 0x17a, 0x180, 0x1e6, 0x2fe, 0xaf, 0x2f2, 0x265, 0x326, 0x85, 0x371, 0x135, 0x1ad, 0x92, 0x290, 0x33c, 0x23c, 0x378, 0x2c, 0xe6, 0x3ba, 0x3fb, 0x238, 0x139, 0x367, 0x146, 0x70, 0x36b, 0x38c, 0x1a4, 0x18b, 0x3db, 0x14, 0x357, 0x27c, 0x329, 0xf9, 0x2d0, 0x36d, 0x2e9, 0x14e, 0xfb, 0x1f4, 0xcc, 0x239, 0xab, 0xb3, 0x12e, 0x286, 0x34f, 0x3e1, 0x81, 0x130, 0x27e, 0xd, 0x358, 0x200, 0x288, 0x2a1, 0x194, 0x2b1, 0x82, 0x386, 0x20b, 0xb5, 0x4b, 0x26c, 0x23f, 0x1ce, 0x59, 0x5e, 0xa9, 0x397, 0x28f, 0x256, 0x2aa, 0x3a9, 0x5b, 0x37a, 0x308, 0x347, 0x36a, 0x324, 0x34b, 0x340, 0x333, 0x89, 0x376, 0x384, 0x25e, 0x4b, 0xd1, 0xee, 0x26b, 0x199, 0x3d2, 0x21a, 0x62, 0x2b2, 0x61, 0x3d7, 0x1b5, 0x21e, 0xe9, 0x385, 0x17a, 0x300, 0x391, 0x3dd, 0x2e2, 0x2ef, 0x56, 0x44, 0x29, 0x263, 0x8f, 0x1bc, 0x2c, 0x1cc, 0x2f3, 0x3e7, 0x3c8, 0x361, 0x46, 0x268, 0xfc, 0x206, 0x3d3, 0x13e, 0x329, 0x1f2, 0x352, 0x35e, 0x2c3, 0x19a, 0x2b7, 0x3ce, 0x1ab, 0x3ee, 0x1fa, 0x244, 0x130, 0xf5, 0x34, 0x2f6, 0x48, 0x1b4, 0x13a, 0x3a2, 0xc5, 0x249, 0x389, 0xe7, 0x59, 0xbc, 0x2a4, 0x87, 0xaa, 0x242, 0x3fa, 0x35d, 0x3a6, 0x4e, 0x37e, 0x292, 0x30, 0x27d, 0x17f, 0xaf, 0x1ed, 0x186, 0x106, 0x42, 0x2e3, 0x1cb, 0x31d, 0x304, 0x31a, 0x2ea, 0x3f9, 0x238, 0x272, 0x187, 0x222, 0x309, 0x1a3, 0x2f8, 0x394, 0x72, 0x9e, 0xb4, 0x3b2, 0x2e9, 0x29c, 0x3ec, 0x3bb, 0x241, 0x137, 0x236, 0x35c, 0x104, 0xf, 0x1f0, 0x226, 0x30d, 0x250, 0x327, 0x55, 0x242, 0x3fd, 0x16f, 0x10f, 0xe9, 0x303, 0x1e1, 0x36, 0x16e, 0x34e, 0x1de, 0x135, 0x2bd, 0x132, 0x161, 0x2be, 0x3f8, 0x238, 0xed, 0x215, 0x134, 0xfc, 0x5, 0x357, 0x1e2, 0x2fc, 0x237, 0x11d, 0x33, 0x239, 0x2ac, 0x322, 0x302, 0x3a0, 0x101, 0x358, 0x12, 0xda, 0x13a, 0x34d, 0x314, 0x26c, 0xee, 0xdf, 0x26d, 0x2af, 0x1e8, 0x5b, 0x1f3, 0xec, 0x54, 0x3, 0x2ca, 0x359, 0x253, 0x1ed, 0x30c, 0x11, 0x210, 0x263, 0x11e, 0x2f9, 0x160, 0xff, 0x2cf, 0xe, 0x3b1, 0x311, 0x13b, 0x10c, 0x223, 0x5a, 0x3b2, 0x1db, 0x262, 0x35f, 0x3ce, 0x356, 0x3a3, 0x3cb, 0x1, 0x241, 0x137, 0x236, 0x35c, 0x104, 0xf, 0x1f0, 0x226, 0x30d, 0x250, 0x327, 0x55, 0x242, 0x3fd, 0x16f, 0x10f, 0xe9, 0x303, 0x1e1, 0x36, 0x16e, 0x8b, 0xd5, 0x194, 0x1a5, 0xc8, 0x3c0, 0x1ce, 0x2c8, 0x3ad, 0xf4, 0x5b, 0x3e6, 0x3b0, 0x2a0, 0x30, 0x1e6, 0x3dd, 0x39a, 0x2a3, 0x1ad, 0x99, 0x161, 0x175, 0x3fb, 0x1e4, 0x2cb, 0x230, 0x18b, 0x2e7, 0x109, 0x2e8, 0x2e9, 0x262, 0x2b7, 0x323, 0x286, 0x24e, 0x18e, 0x40, 0x288, 0x125, 0x1d1, 0x18a, 0x26c, 0x1dc, 0x37c, 0x34c, 0x2aa, 0x177, 0x2ed, 0x4e, 0x1e3, 0x17a, 0x1b, 0x16e, 0x295, 0x371, 0x1ba, 0x38a, 0x201, 0xe6, 0x1ef, 0x307, 0x1ee, 0x38c, 0x13b, 0x218, 0x9e, 0x2d0, 0x35e, 0x31e, 0x196, 0xb3, 0x162, 0xe8, 0x284, 0x358, 0x24, 0x368, 0x1c2, 0xb5, 0x258, 0x216, 0x3f5, 0x28f, 0x294, 0x3fa, 0x16f, 0x21e, 0x3a4, 0x2e, 0x22f, 0x2c9, 0x326, 0x21, 0x1cf, 0x243, 0x378, 0x160, 0x1fe, 0x32e, 0x70, 0x36e, 0x2f8, 0x24b, 0x329, 0x3c1, 0x145, 0x21d, 0x239, 0x151, 0x93, 0x26, 0x27e, 0x116, 0x354, 0xbb, 0x266, 0x136, 0x1dc, 0x2f1, 0x12b, 0x17d, 0x35d, 0x10f, 0x3a4, 0x5c, 0xae, 0x265, 0x20c, 0x29, 0x33c, 0x388, 0x227, 0x139, 0x215, 0xd9, 0x3db, 0x140, 0x174, 0x2e9, 0xcd, 0x2ce, 0x12e, 0x3a, 0x142, 0x358, 0x48, 0x1bb, 0x20b, 0x342, 0x382, 0xa9, 0x10e, 0x2b2, 0x308, 0x15, 0x3, 0x33a, 0x1f5, 0x1cd, 0x2a3, 0x35a, 0x264, 0x31a, 0x37d, 0x387, 0x1ee, 0x311, 0xe5, 0xe4, 0x1f2, 0x2a6, 0x21d, 0x7b, 0x14d, 0x91, 0x260, 0x34b, 0x236, 0x16b, 0x64, 0x3c0, 0x39c, 0x332, 0x157, 0x35b, 0x372, 0x4e, 0x3c6, 0x1e1, 0xd8, 0x2cd, 0x214, 0x1cf, 0x8f, 0x1fb, 0x312, 0x3df, 0x111, 0x3f, 0x5, 0x147, 0x21f, 0x257, 0x3ec, 0x1e7, 0x2a5, 0x127, 0x18e, 0x80, 0x232, 0x13a, 0x12f, 0x12c, 0x216, 0x3e3, 0x22e, 0x8d, 0x3d7, 0x1b3, 0x2a9, 0x1d4, 0x253, 0x3bd, 0xac, 0x49, 0xad, 0x22c, 0x14b, 0x1d1, 0x221, 0x281, 0x3f5, 0x22e, 0x11a, 0x347, 0x183, 0x2ca, 0x2fe, 0x1cd, 0x14f, 0x173, 0x304, 0x1cc, 0x363, 0x38, 0x2d5, 0x3ed, 0x1e2, 0x3cd, 0xfb, 0x2f7, 0x2a5, 0x24e, 0x231, 0x9, 0x368, 0x301, 0x342, 0x30d, 0x2a4, 0x62, 0x37a, 0x1d8, 0x149, 0x180, 0xb7, 0x123, 0x3be, 0x325, 0x2f9, 0x312, 0x3b7, 0x4d, 0x1f8, 0x50, 0xba, 0x2e9, 0x19a, 0x32a, 0x162, 0x3a0, 0x1a, 0x39d, 0x41, 0x1e, 0x33f, 0x164, 0x353, 0x3a9, 0x372, 0x9c, 0x303, 0x313, 0x19b, 0x106, 0x29, 0x271, 0x23b, 0x11c, 0x3b4, 0x230, 0x225, 0x223, 0x2d0, 0x163, 0x18c, 0x151, 0x24c, 0x260, 0x29f, 0xca, 0x34a, 0x249, 0xee, 0x2f1, 0x256, 0x1fd, 0x2de, 0xd4, 0x75, 0x32d, 0x3bd, 0x158, 0x124, 0x161, 0x1dd, 0x3c7, 0x1ee, 0x22b, 0x394, 0x329, 0x31f, 0x7d, 0x269, 0x1f7, 0x3cb, 0x8, 0x144, 0x24a, 0x293, 0x51, 0x125, 0x293, 0x258, 0x94, 0x87, 0x16d, 0x76, 0x2a0, 0x180, 0x16e, 0x85, 0x1cf, 0x23c, 0x38f, 0x139, 0x46, 0x18b, 0x315, 0x2d0, 0x2c6, 0x239, 0x29a, 0x81, 0x8b, 0x2a1, 0x1d1, 0x4b, 0x216, 0x397, 0x2a8, 0x308, 0x54, 0x30, 0x32b, 0x295, 0x3be, 0x243, 0x3f6, 0xa6, 0x30e, 0x1b2, 0x2e7, 0x5a, 0x35e, 0xc6, 0x151, 0x91, 0x192, 0xd5, 0xbb, 0x18a, 0x344, 0x3f5, 0x55, 0x61, 0x20e, 0x6, 0x1e6, 0x2d7, 0x371, 0x1cb, 0x378, 0x312, 0x367, 0x134, 0x3db, 0x109, 0x36d, 0x31e, 0xab, 0x93, 0x130, 0x29f, 0x194, 0x133, 0x26c, 0x2fb, 0x28f, 0x8d, 0x347, 0x306, 0x33a, 0x3dd, 0xef, 0x1ba, 0x6f, 0x160, 0x3eb, 0x222, 0x1f8, 0xa0, 0x2e8, 0x365, 0x196, 0x191, 0x26, 0x3d4, 0x236, 0x1a5, 0x249, 0x1dc, 0x3d6, 0x294, 0x3ef, 0x366, 0x165, 0x2fe, 0x39a, 0x135, 0x38a, 0x2c, 0x1fe, 0x146, 0xa2, 0x9d, 0xb5, 0x1c1, 0x2a4, 0x188, 0x3c5, 0x2f5, 0x3c2, 0x19b, 0x11, 0x290, 0x15f, 0x3f7, 0x1ee, 0xbe, 0x13e, 0x3e2, 0x1f6, 0x395, 0x1d, 0x101, 0x3ca, 0x82, 0xf0, 0x331, 0x34c, 0x2fa, 0x1b5, 0x2a9, 0x2bb, 0x1cd, 0x135, 0x31d, 0xb0, 0x3eb, 0x4d, 0x3e9, 0x109, 0x2d3, 0x63, 0x151, 0x122, 0x241, 0x2a1, 0x3a2, 0x12c, 0x94, 0x10e, 0x1bd, 0x3b0, 0x25a, 0x6c, 0x326, 0x210, 0xeb, 0x1fc, 0x3c8, 0x1c6, 0x1ca, 0x25b, 0xce, 0x3bb, 0x2a5, 0x12a, 0x358, 0x240, 0x203, 0x33f, 0x199, 0x155, 0x3aa, 0x35, 0x75, 0xaf, 0x3ae, 0x2bd, 0x201, 0x27b, 0xa3, 0x3f, 0x28, 0x174, 0x365, 0x32c, 0x24d, 0x130, 0x137, 0x259, 0x18a, 0x281, 0x3cf, 0x2a8, 0x219, 0x150, 0x180, 0x2dc, 0x214, 0x263, 0x388, 0x11c, 0x2cb, 0x348, 0x72, 0x3c1, 0x7d, 0x1b6, 0x34f, 0x31c, 0x12, 0x376, 0xf8, 0x228, 0x3ad, 0x144, 0x274, 0x1a1, 0x2f, 0x3d, 0x2d8, 0x138, 0x5c, 0x2f2, 0x158, 0x132, 0xe6, 0x197, 0x309, 0x14, 0x174, 0x2c3, 0xab, 0x24c, 0x324, 0x2a1, 0x34d, 0xb9, 0xa9, 0xc4, 0x3c5, 0x1e3, 0x313, 0xc3, 0x110, 0x2b4, 0x37d, 0xe, 0x1a3, 0x2a7, 0xdc, 0x19a, 0x166, 0x26, 0x34b, 0x328, 0x18a, 0x10b, 0x327, 0x16d, 0x1d8, 0x25a, 0xd8, 0x83, 0xa4, 0x2ab, 0x3f7, 0x3dc, 0x2f8, 0x1e2, 0x257, 0x2b7, 0xb1, 0x29b, 0x340, 0x2d6, 0x9b, 0x2fb, 0x22e, 0xc2, 0x54, 0xc0, 0x2dc, 0x21, 0x19e, 0x7f, 0x1e4, 0x1c6, 0x394, 0x17e, 0x279, 0x3ce, 0x1d, 0x202, 0x333, 0x19, 0x31b, 0x2f1, 0x294, 0x3a7, 0x205, 0x1e6, 0x34e, 0x375, 0x23c, 0x227, 0x3b4, 0x1a4, 0x72, 0x38b, 0x1f4, 0x1ab, 0x95, 0x358, 0x89, 0x1e, 0x1ce, 0x1a6, 0x2fa, 0x36a, 0x2b6, 0x1f5, 0xef, 0x2e1, 0x2f9, 0xa6, 0x23, 0x316, 0x9e, 0x288, 0x1c2, 0x113, 0x2f0, 0x3a9, 0x345, 0x11f, 0xaf, 0x2a3, 0x38a, 0x160, 0x367, 0x1b2, 0x315, 0x2ad, 0xcc, 0x3ee, 0x18e, 0x24, 0x386, 0x33f, 0x26d, 0x17d, 0x36a, 0x165, 0x3dd, 0x371, 0x243, 0x38f, 0x1da, 0x1a4, 0xe4, 0x237, 0x3bb, 0x286, 0x284, 0x39d, 0x19, 0x23f, 0x3d6, 0x8d, 0x20e, 0x30, 0x16e, 0x21, 0x33c, 0x1fc, 0x33b, 0x5f, 0x27c, 0x32f, 0x2b7, 0x162, 0x27e, 0x236, 0x133, 0x344, 0x397, 0x16d, 0x3b0, 0x17a, 0x2c9, 0x22, 0xad, 0x3ba, 0xe, 0x346, 0x28e, 0x2e9, 0x196, 0x93, 0x192, 0x2a1, 0x293, 0x2e4, 0x141, 0x5b, 0x4e, 0x2e, 0x2f2, 0x2b0, 0xc1, 0x339, 0x146, 0x1f8, 0x109, 0x35e, 0x239, 0xfd, 0x8, 0x6d, 0x20b, 0x8a, 0x3ad, 0x177, 0x21e, 0xea, 0x171, 0x135, 0x6f, 0x312, 0x30e, 0x18b, 0x9e, 0x145, 0x269, 0x34f, 0x6b, 0x120, 0xf, 0x1ce, 0x34c, 0x3fa, 0x366, 0x119, 0x301, 0x8a, 0x353, 0x1d5, 0xd4, 0x2bb, 0x273, 0x1cb, 0x3e5, 0xed, 0x1a4, 0x1c8, 0xce, 0x1e7, 0x3a, 0x34, 0x2b1, 0x9b, 0x3fe, 0x2a8, 0xec, 0xbd, 0x2c9, 0x44, 0x2b4, 0x1ef, 0xe0, 0xa, 0x2e8, 0x235, 0x14d, 0x1, 0x119, 0x301, 0x8a, 0x353, 0x1d5, 0xd4, 0x2bb, 0x273, 0x1cb, 0x3e5, 0xed, 0x1a4, 0x1c8, 0xce, 0x1e7, 0x3a, 0x34, 0x2b1, 0x9b, 0x3fe, 0x2a8, 0xec, 0xbd, 0x2c9, 0x44, 0x2b4, 0x1ef, 0xe0, 0xa, 0x2e8, 0x235, 0x14d, 0x1, 0x119, 0x301, 0x8a, 0x353, 0x1d5, 0xd4, 0x2bb, 0x273, 0x1cb, 0x3e5, 0xed, 0x1a4, 0x1c8, 0xce, 0x1e7, 0x3a, 0x34, 0x2b1, 0x9b, 0x3fe, 0x2a8, 0xec, 0xbd, 0x2c9, 0x44, 0x2b4, 0x1ef, 0xe0, 0xa, 0x2e8, 0x235, 0x14d, 0x1, 0x119, 0x301, 0x8a, 0x353, 0x1d5, 0xd4, 0x2bb, 0x273, 0x1cb, 0x3e5, 0xed, 0x1a4, 0x1c8, 0xce, 0x1e7, 0x232, 0x1f, 0x59, 0x155, 0x2de, 0x165, 0x36f, 0x375, 0x1c4, 0xf2, 0x311, 0x27c, 0xa7, 0x32a, 0x26, 0x26e, 0x3a2, 0x2e4, 0x10d, 0x1b9, 0x3a4, 0x253, 0x14f, 0x6f, 0x53, 0x8c, 0x218, 0x31f, 0x37f, 0x1d, 0x34, 0x16b, 0x26c, 0x3cf, 0x2da, 0x1bf, 0x313, 0x211, 0x99, 0x398, 0x28c, 0x3db, 0x168, 0x33, 0x3ee, 0x231, 0x240, 0x78, 0x1be, 0x121, 0x20e, 0xc0, 0x2cd, 0x52, 0x2be, 0x207, 0x346, 0x22a, 0x2c3, 0x151, 0x204, 0x119, 0x20b, 0x228, 0x2ae, 0x16f, 0x2b6, 0x3b3, 0x3be, 0xe2, 0x79, 0x38c, 0x13e, 0x257, 0x195, 0x13, 0x137, 0x1d1, 0x172, 0x282, 0x2d8, 0x1d2, 0x32d, 0x2a3, 0x233, 0x22d, 0x46, 0x10c, 0x38b, 0x3bb, 0x20a, 0x1a, 0x2b1, 0x136, 0x3e3, 0x16d, 0x2db, 0x38d, 0x30c, 0x248, 0x1cc, 0x146, 0x3e9, 0xb4, 0x21d, 0x1f7, 0x31c, 0x120, 0x3c, 0xdf, 0x294, 0x107, 0x60, 0x362, 0x6d, 0x7c, 0x2c8, 0x17d, 0x366, 0x1e6, 0x85, 0x33c, 0x3fb, 0x36b, 0x357, 0x2e9, 0xab, 0x81, 0x288, 0x20b, 0x59, 0x2aa, 0x36a, 0x33a, 0x295, 0x263, 0x1fc, 0x1ee, 0x3ed, 0xdc, 0x196, 0x91, 0x51, 0x1c2, 0x8a, 0x157, 0x16f, 0x165, 0x2d7, 0x1cf, 0x23b, 0x33b, 0x2f8, 0x21f, 0x334, 0x93, 0x8b, 0x13a, 0x113, 0x3ad, 0x3aa, 0x2a9, 0x3dd, 0x3be, 0x1c4, 0x1e4, 0x5f, 0x3c4, 0x262, 0x191, 0x192, 0x125, 0x1a1, 0x2f0, 0x177, 0xd4, 0x2fe, 0x371, 0x23c, 0x238, 0x38c, 0x27c, 0x14e, 0xb3, 0x130, 0x2a1, 0xb5, 0x5e, 0x3a9, 0x21e, 0x359, 0xef, 0x243, 0x47, 0x275, 0x24b, 0x32f, 0x195, 0x26, 0xd5, 0x293, 0x30d, 0xf4, 0x345, 0xea, 0x39a, 0x1cb, 0x38f, 0x2cb, 0x1ca, 0x3e2, 0x2b7, 0x302, 0x29f, 0x1d1, 0x2e4, 0x21a, 0x2ed, 0x11f, 0x171, 0x1ba, 0x3f6, 0x1da, 0x13b, 0x17e, 0x3d1, 0x162, 0x3d4, 0xda, 0x1f0, 0x26d, 0x3fd, 0x3, 0x16e, 0x210, 0x2be, 0xe, 0x5, 0x3b2, 0x239, 0x3cb, 0x12, 0xf, 0xdf, 0x242, 0x54, 0x36, 0x11, 0x161, 0x2cf, 0xfc, 0x5a, 0x33, 0x3a3, 0x358, 0x104, 0xee, 0x55, 0xec, 0x1e1, 0x30c, 0x132, 0xff, 0x134, 0x223, 0x11d, 0x356, 0x101, 0x35c, 0x26c, 0x327, 0x1f3, 0x303, 0x1ed, 0x2bd, 0x160, 0x215, 0x10c, 0x237, 0x3ce, 0x3a0, 0x236, 0x314, 0x250, 0x5b, 0xe9, 0x253, 0x135, 0x2f9, 0xed, 0x13b, 0x2fc, 0x35f, 0x302, 0x137, 0x34d, 0x30d, 0x1e8, 0x10f, 0x359, 0x1de, 0x11e, 0x238, 0x311, 0x1e2, 0x262, 0x322, 0x241, 0x13a, 0x226, 0x2af, 0x16f, 0x2ca, 0x34e, 0x263, 0x3f8, 0x3b1, 0x357, 0x1db, 0x2ac, 0x1, 0xda, 0x1f0, 0x26d, 0x3fd, 0x3, 0x16e, 0x210, 0x2be, 0xe, 0x5, 0x3b2, 0x239, 0x3cb, 0x12, 0xf, 0xdf, 0x242, 0x54, 0x36, 0x11, 0x161, 0x1b4, 0x3c9, 0x34c, 0x3a7, 0x60, 0x326, 0x252, 0x3de, 0x3f, 0x2d, 0x33, 0x34f, 0x17b, 0x32, 0x2fb, 0x2b2, 0x37e, 0x15c, 0x2d2, 0x58, 0x30e, 0x10c, 0x67, 0x323, 0x13f, 0x328, 0x258, 0x10d, 0x1d3, 0xea, 0x273, 0x8f, 0x238, 0x22b, 0x381, 0x334, 0x24c, 0xa2, 0x20b, 0x164, 0x2fa, 0x306, 0xb7, 0x210, 0x175, 0x38, 0x28, 0x35e, 0x3b9, 0x31c, 0x112, 0x31b, 0x117, 0x76, 0x1e1, 0x211, 0xc1, 0x3f1, 0x364, 0xf9, 0x3d9, 0x3a, 0x340, 0xc5, 0x128, 0x5b, 0x1d2, 0x15e, 0x1ba, 0x3c3, 0x19f, 0x24b, 0xa7, 0x166, 0x192, 0x9d, 0x226, 0x157, 0x1b5, 0x27d, 0x85, 0xeb, 0x3c7, 0x346, 0x174, 0x18c, 0x3e1, 0x12, 0x1e, 0x37c, 0x234, 0x149, 0x2c9, 0x49, 0x1cc, 0x222, 0x38e, 0x28a, 0x356, 0x202, 0x16b, 0x344, 0x21c, 0x217, 0x170, 0x355, 0xde, 0x139, 0x299, 0x2fc, 0x2b7, 0x13, 0x1aa, 0xb5, 0x368, 0x33f, 0x256, 0x20e, 0x1b, 0x22, 0x31a, 0x146, 0x2e7, 0x145, 0x356, 0xd, 0x1a5, 0x216, 0x188, 0x270, 0xaf, 0x1ba, 0x38f, 0x275, 0x27c, 0x262, 0x93, 0x51, 0x20b, 0x2c8, 0x3fa, 0x6, 0x362, 0x290, 0x1ef, 0x3f, 0x5a, 0xcc, 0x24e, 0x39d, 0x249, 0x397, 0x3e6, 0x2e, 0x1d7, 0x6f, 0x139, 0x13b, 0x3e2, 0x195, 0x130, 0x125, 0x113, 0x157, 0x36a, 0x1e6, 0x21, 0x2ab, 0xe, 0x14, 0x35e, 0x37b, 0x6b, 0x82, 0x1dc, 0x2a8, 0x1bf, 0x15c, 0x1ad, 0x160, 0x46, 0xe4, 0xfb, 0x162, 0x29f, 0x293, 0x5e, 0x177, 0x2a9, 0x2d7, 0x263, 0x3fb, 0x36e, 0x5d, 0xc6, 0x3e1, 0x24, 0x78, 0x3d6, 0x308, 0x17a, 0x30c, 0xc1, 0x3eb, 0x18b, 0x3c1, 0x1e7, 0x349, 0x194, 0x258, 0x21a, 0x345, 0x359, 0x371, 0x1c4, 0x33b, 0x3ed, 0x2e9, 0x151, 0x8, 0x376, 0x1ce, 0x294, 0x54, 0xd8, 0x110, 0xe6, 0x222, 0x2d9, 0xe7, 0x294, 0xa8, 0x360, 0x92, 0x27b, 0xd9, 0xf9, 0x37f, 0x3a0, 0x194, 0xb9, 0x7a, 0x21e, 0x1f5, 0x2e3, 0x1fc, 0x2df, 0x22a, 0xc6, 0x3cb, 0x90, 0x3c0, 0x117, 0x1d8, 0x22f, 0x169, 0xb0, 0x46, 0x1c8, 0x3ec, 0x302, 0x1aa, 0x2d4, 0x3ad, 0x2de, 0xf3, 0x21, 0x15f, 0x38, 0xa0, 0x185, 0x3a3, 0x2f6, 0x190, 0x3cf, 0x3e6, 0x5c, 0x355, 0x378, 0x3b4, 0x321, 0x14e, 0x322, 0x22c, 0x20b, 0x199, 0x3f3, 0x30, 0x245, 0x2b4, 0x32e, 0x3bf, 0x2a6, 0x356, 0x1a, 0x29d, 0x94, 0xb6, 0x28b, 0x39a, 0x8f, 0xf2, 0x2f8, 0x1b8, 0x2ac, 0x8, 0x2e5, 0x331, 0x8d, 0x149, 0x336, 0x99, 0x3fc, 0x2c1, 0x3c1, 0x3ce, 0x13f, 0xbb, 0x1c1, 0x3d0, 0xd4, 0x3b3, 0x335, 0x3fb, 0x2d5, 0x174, 0x239, 0x267, 0x89, 0x23f, 0xaa, 0x2db, 0x15c, 0x35a, 0x189, 0x230, 0x25b, 0x35f, 0x26, 0x14b, 0x28d, 0x157, 0x1bb, 0x39c, 0x8d, 0x292, 0xc3, 0xc1, 0x3b7, 0x86, 0x19c, 0xb1, 0x137, 0xb5, 0x3d2, 0x2de, 0x1e6, 0x84, 0x2ea, 0x380, 0x2d, 0x198, 0x254, 0x35c, 0x281, 0x188, 0x1d2, 0x2e2, 0x243, 0xf2, 0x1f9, 0x2e9, 0x14d, 0x80, 0xf, 0x1eb, 0x219, 0x3c2, 0x158, 0x58, 0x46, 0x390, 0x3ab, 0x26, 0x296, 0x226, 0x2aa, 0x183, 0x2dc, 0x290, 0x3b5, 0x3f0, 0x2ad, 0x1ab, 0x1a, 0x133, 0x250, 0x1b9, 0xea, 0x3bc, 0x388, 0x1ee, 0x147, 0x235, 0x3e1, 0x90, 0x389, 0x55, 0x2db, 0x2b8, 0x173, 0x53, 0x348, 0x3e2, 0x25d, 0x324, 0x1c2, 0x164, 0x3fd, 0x30, 0x83, 0x2c2, 0x146, 0x38e, 0x7d, 0x1d, 0x11b, 0x96, 0x21a, 0x10f, 0x1f5, 0x1cf, 0x3f9, 0x2d5, 0x2e8, 0xf6, 0x31c, 0x82, 0x379, 0x2da, 0x303, 0x2ef, 0xde, 0x1da, 0x321, 0x29c, 0x93, 0x144, 0xf8, 0x34c, 0x107, 0x36, 0x110, 0x398, 0x268, 0xf9, 0x376, 0x26b, 0x61, 0x17a, 0x56, 0x2c, 0x46, 0x329, 0x2b7, 0x130, 0x13a, 0x59, 0x3fa, 0x30, 0x106, 0x31a, 0x222, 0x9e, 0x3bb, 0x349, 0xbb, 0x30d, 0x177, 0x165, 0x85, 0x2ab, 0x70, 0x109, 0xcc, 0x254, 0x2b1, 0x216, 0x5b, 0x11f, 0xef, 0x1c4, 0x1ee, 0x28e, 0xc6, 0x337, 0x112, 0x1dc, 0x16d, 0x303, 0x1d7, 0x378, 0x2cb, 0x27c, 0x334, 0x81, 0x368, 0x1ce, 0x8d, 0x12d, 0x30c, 0x201, 0x30e, 0xe4, 0x3d1, 0x26, 0x125, 0x8a, 0x17d, 0x6, 0x326, 0x161, 0x146, 0x315, 0x1f4, 0xe8, 0x194, 0x2e4, 0x3a9, 0x2a9, 0x295, 0x1d6, 0xe, 0xa0, 0x21d, 0x24e, 0xd7, 0x344, 0x188, 0x3a4, 0x39a, 0x23c, 0x33b, 0x357, 0x31e, 0x3e1, 0x120, 0x23f, 0x2a8, 0x1e3, 0x3bd, 0x6f, 0x1da, 0x24b, 0x262, 0x91, 0x6d, 0x33f, 0x294, 0x2a0, 0x265, 0xc1, 0x367, 0x218, 0xfb, 0x302, 0x2a1, 0x113, 0x2aa, 0x306, 0x2e5, 0x1be, 0x308, 0x38d, 0x2d2, 0x312, 0x348, 0x393, 0x191, 0xa2, 0x1f0, 0x256, 0xa8, 0x336, 0xc1, 0x2c7, 0x72, 0x3d1, 0x4c, 0x9d, 0x59, 0x3fd, 0xc0, 0x22, 0x1cc, 0xd9, 0x3c1, 0x24f, 0x34b, 0xb5, 0x353, 0x1b3, 0x16e, 0x129, 0x197, 0x2e7, 0x7d, 0x74, 0x194, 0x1c1, 0x2bf, 0x165, 0x10a, 0x2be, 0x380, 0xb4, 0x1b6, 0xd, 0x266, 0x2a4, 0x345, 0x1f5, 0x335, 0x3e7, 0x5, 0x163, 0x34f, 0x333, 0x1a2, 0x188, 0x341, 0x273, 0x1c4, 0x3dc, 0x22a, 0x239, 0x31c, 0x208, 0x3f5, 0x3c5, 0x1c9, 0x1ba, 0x8e, 0x17c, 0x2e9, 0x13d, 0x12, 0x3c0, 0xaa, 0x2f5, 0x3bd, 0xde, 0x361, 0x27c, 0x261, 0x204, 0x376, 0xdf, 0x184, 0x3c2, 0x169, 0x189, 0x1a4, 0x3cd, 0x2cc, 0x51, 0xf8, 0x12b, 0x54, 0x19b, 0x264, 0x367, 0x39, 0x3ec, 0x26, 0x24a, 0x228, 0x3fa, 0x60, 0x11, 0xe6, 0x268, 0x3e4, 0x323, 0x1c3, 0x2f1, 0x76, 0xae, 0x2e6, 0x139, 0x321, 0xcd, 0x81, 0x1bb, 0xdf, 0x308, 0x313, 0x35a, 0xa6, 0xe5, 0x29c, 0x91, 0x1b4, 0x39c, 0x61, 0x1e1, 0x169, 0x312, 0x299, 0x257, 0x93, 0x232, 0x277, 0x8d, 0xbd, 0xac, 0x160, 0xd2, 0x3cd, 0x191, 0x144, 0x3c9, 0x294, 0x292, 0x211, 0x2c, 0x118, 0x2fc, 0xb3, 0x22c, 0xf8, 0x256, 0x150, 0xc3, 0x201, 0x23, 0x25b, 0x195, 0x241, 0x1f, 0x34c, 0x2a, 0x19b, 0xc1, 0x187, 0x1c8, 0x2b7, 0xc9, 0x384, 0x26d, 0x107, 0x1b0, 0x99, 0x3b7, 0x39, 0x3d1, 0x98, 0x274, 0x2c8, 0x3a7, 0x36, 0x92, 0x3f1, 0x86, 0xfb, 0x13, 0x24a, 0x59, 0x3f3, 0x300, 0x110, 0xff, 0x316, 0x19c, 0x181, 0x14b, 0x8a, 0x1fd, 0x60, 0x22, 0x398, 0x364, 0x237, 0xb1, 0x1aa, 0x113, 0x2ba, 0xc, 0x106, 0x73, 0x268, 0x3c1, 0x97, 0x137, 0x1a1, 0x155, 0x205, 0x326, 0x386, 0x3d6, 0x3b0, 0x2f2, 0x6f, 0x2cb, 0x3c4, 0xab, 0x40, 0x78, 0x55, 0x1e3, 0x1d7, 0x3f6, 0x38c, 0xdc, 0x29a, 0x24, 0x23f, 0x16d, 0x2e, 0x135, 0x47, 0x2f8, 0x365, 0x3e1, 0x112, 0x2fb, 0x3e6, 0x392, 0x1cb, 0x1e4, 0x357, 0xc6, 0x18e, 0x19, 0x397, 0x4e, 0x171, 0x23c, 0x1ee, 0x5d, 0x1ec, 0x358, 0x249, 0x31, 0x3a4, 0xef, 0x23b, 0x36e, 0x36d, 0x3ee, 0x39d, 0x344, 0x5b, 0xea, 0x3be, 0x3fb, 0x206, 0x2c6, 0x24e, 0x2b1, 0x94, 0x2ed, 0x2fe, 0x263, 0x307, 0xa0, 0xcc, 0x284, 0x133, 0x141, 0x21e, 0x2d7, 0x1d6, 0x70, 0x5a, 0x36c, 0x68, 0x4b, 0xf4, 0x2a9, 0x85, 0x175, 0x3f, 0x2ad, 0x286, 0x236, 0x2e4, 0x177, 0x33a, 0x108, 0x1ef, 0x3db, 0x23a, 0xe8, 0xbb, 0x5e, 0x16f, 0x32b, 0x290, 0x32e, 0x315, 0x3bb, 0x27e, 0x293, 0x3ad, 0x366, 0x362, 0x161, 0x222, 0xf9, 0x323, 0x29f, 0x305, 0x343, 0x1bf, 0x373, 0x1fb, 0x38c, 0x1b8, 0x27a, 0x120, 0x3b8, 0x1f3, 0x392, 0x396, 0x399, 0x28e, 0x7b, 0x1ac, 0x249, 0x62, 0x28b, 0x371, 0x3f8, 0x103, 0x2c6, 0x95, 0x2d6, 0xa9, 0x283, 0x36f, 0x1d6, 0xe0, 0x168, 0x356, 0x289, 0x172, 0x177, 0x27d, 0x29, 0x363, 0x1c7, 0x3d9, 0x27e, 0x12f, 0x2af, 0x306, 0x245, 0x73, 0x1b2, 0x67, 0x181, 0x125, 0xb2, 0x3a7, 0xd8, 0x132, 0x187, 0x329, 0x32a, 0x22c, 0x3e0, 0x121, 0xbd, 0x2b0, 0x22d, 0xe5, 0x262, 0x102, 0x1c3, 0x3d6, 0x369, 0x3da, 0x378, 0xe3, 0x6e, 0x29a, 0x48, 0xee, 0x37a, 0x2e0, 0x2e1, 0x1e4, 0x2a7, 0x318, 0x6b, 0x190, 0x21c, 0x3a4, 0x1de, 0xfe, 0x346, 0x2b5, 0x127, 0x2b1, 0x128, 0x3a6, 0x3dd, 0x271, 0x38, 0x5a, 0x2d1, 0x1a0, 0x258, 0x35b, 0x19d, 0x108, 0x3de, 0x377, 0x1f4, 0x29b, 0x34d, 0x3ad, 0x2c5, 0x193, 0x31a, 0x203, 0x117, 0x1e3, 0x355, 0x317, 0x2f8, 0x18f, 0x267, 0x19, 0x247, 0xe9, 0xef, 0xfe, 0x285, 0x2c6, 0x12a, 0x34a, 0x141, 0x6a, 0x123, 0x175, 0xfc, 0x28a, 0xe8, 0x2ec, 0x1e9, 0x366, 0x193, 0x23d, 0x1b2, 0xce, 0x20d, 0x13a, 0x332, 0x15, 0x265, 0x16, 0x69, 0x32f, 0x24c, 0x2d9, 0x37c, 0x1d8, 0x1ed, 0x378, 0x1c6, 0x1b8, 0xfd, 0x89, 0x1ff, 0x30f, 0x2bc, 0x71, 0x36b, 0x3b2, 0x3d5, 0xd7, 0x4a, 0x1d3, 0x3dd, 0xeb, 0xe0, 0x2d0, 0x143, 0x65, 0x30d, 0x2b3, 0x25f, 0xad, 0x111, 0x1f2, 0x12e, 0x354, 0x114, 0x3ef, 0x6c, 0x132, 0x30e, 0xbf, 0x166, 0x288, 0xe7, 0xc2, 0x22f, 0x1c5, 0x3b4, 0x3c4, 0x2ac, 0x9, 0x23f, 0x1bd, 0x2e0, 0x1cb, 0x399, 0x115, 0x1ec, 0x17b, 0xd1, 0x5b, 0x3a8, 0x39e, 0x307, 0x280, 0xdb, 0x68, 0x12c, 0x35b, 0x33a, 0x29, 0x2cf, 0x315, 0x2f7, 0x3a1, 0x1a1, 0xf, 0x55, 0x303, 0x135, 0x238, 0x357, 0x239, 0x358, 0x26c, 0x5b, 0x359, 0x263, 0xe, 0x5a, 0x356, 0x236, 0x30d, 0x16f, 0x16e, 0x161, 0x134, 0x237, 0x302, 0x13a, 0x26d, 0x54, 0x30c, 0x160, 0x13b, 0x262, 0x1, 0xf, 0x55, 0x303, 0x135, 0x238, 0x357, 0x239, 0x358, 0x26c, 0x5b, 0x359, 0x263, 0xe, 0x5a, 0x356, 0x236, 0x30d, 0x16f, 0x16e, 0x161, 0x134, 0x237, 0x302, 0x13a, 0x26d, 0x54, 0x30c, 0x160, 0x13b, 0x262, 0x1, 0xf, 0x55, 0x303, 0x135, 0x238, 0x357, 0x239, 0x358, 0x26c, 0x5b, 0x359, 0x263, 0xe, 0x5a, 0x356, 0x236, 0x30d, 0x16f, 0x16e, 0x161, 0x134, 0x237, 0x302, 0x13a, 0x26d, 0x54, 0x30c, 0x160, 0x13b, 0x262, 0x1, 0xf, 0x55, 0x303, 0x135, 0x238, 0x357, 0x239, 0x358, 0x26c, 0x5b, 0x359, 0x263, 0xe, 0x5a, 0x356, 0x236, 0x30d, 0x16f, 0x16e, 0x161, 0x134, 0x1e, 0x154, 0x2e, 0x374, 0x399, 0x5d, 0x2ff, 0x26f, 0x94, 0x283, 0x34e, 0x175, 0x3f0, 0xfa, 0x27e, 0x16a, 0x2ba, 0x180, 0x124, 0x187, 0x17e, 0x322, 0x1b4, 0x37c, 0x369, 0x2ef, 0x38f, 0x1f9, 0x63, 0x6b, 0x9b, 0x229, 0x359, 0xcf, 0x38, 0x2d0, 0x105, 0x259, 0x2f0, 0x2c5, 0x83, 0x339, 0x86, 0x35f, 0x8b, 0x3c9, 0x234, 0x22f, 0x31d, 0x33e, 0xdc, 0x1fa, 0x41, 0x397, 0xe9, 0x3bc, 0x3fb, 0x28, 0x330, 0x68, 0xb9, 0x1d5, 0x32b, 0x15a, 0x9a, 0x237, 0x20d, 0xe1, 0x34c, 0x149, 0x158, 0xa6, 0x9f, 0x251, 0x200, 0x77, 0x1f3, 0xaf, 0x71, 0x1b7, 0x35e, 0x95, 0x29d, 0x21a, 0x15b, 0x84, 0x363, 0x223, 0x395, 0xd5, 0x114, 0x3a7, 0x2c9, 0xb, 0xd2, 0x14e, 0x102, 0x203, 0x55, 0x20f, 0xdd, 0x1e4, 0x115, 0x3b9, 0x39d, 0x25, 0x3a6, 0x2d7, 0x15f, 0xfc, 0x23a, 0x29b, 0x25e, 0x2aa, 0x3c, 0x159, 0x170, 0x325, 0x3dc, 0x36d, 0x127, 0x34a, 0x21a, 0x2b6, 0x210, 0x32e, 0x278, 0x25c, 0x125, 0x332, 0xa8, 0x56, 0x53, 0x9f, 0xab, 0x12, 0x3b8, 0x30f, 0x1cd, 0x7f, 0x206, 0x66, 0x1a, 0x258, 0x1d5, 0x25f, 0x161, 0xd9, 0x338, 0x130, 0x3e, 0x121, 0x3c2, 0x1c5, 0x19f, 0xdc, 0x3f4, 0x104, 0x87, 0x28b, 0x375, 0x307, 0x2d, 0x2a5, 0x194, 0x178, 0x2c5, 0x106, 0xff, 0x39, 0x195, 0x144, 0x39c, 0x76, 0x3da, 0x3e5, 0x2f8, 0x63, 0xd6, 0x26c, 0x16c, 0x1f5, 0x1d6, 0x21b, 0x28a, 0x349, 0x25e, 0x15d, 0x180, 0x248, 0x215, 0x3e2, 0x24c, 0x2e5, 0x28f, 0x385, 0x26a, 0x1e4, 0x22a, 0x2ff, 0xd7, 0x250, 0x35, 0x85, 0x2f3, 0x1c7, 0x1e7, 0x26e, 0x114, 0x347, 0x336, 0x58, 0x13b, 0x19a, 0x10, 0x3c0, 0x1bd, 0x32d, 0x23c, 0x1b7, 0x2b5, 0x254, 0xc5, 0x1e8, 0x33a, 0x148, 0x28c, 0x3c1, 0x78, 0x16d, 0x392, 0x23c, 0x36e, 0x2c6, 0x284, 0x4b, 0x177, 0x32b, 0x161, 0x1b2, 0xfb, 0x192, 0x3e0, 0x61, 0x15c, 0x378, 0x5f, 0x31e, 0x6b, 0x26c, 0x2d8, 0x3dd, 0x2ab, 0x1f8, 0x1f4, 0x3d4, 0x113, 0x3ef, 0x2c9, 0x2c, 0x13b, 0x334, 0x40, 0x23f, 0x3e6, 0x171, 0x23b, 0x206, 0xcc, 0x68, 0x2e4, 0x16f, 0x362, 0xe6, 0x43, 0x2b7, 0x51, 0x1ce, 0x76, 0x3bd, 0x38f, 0x3ed, 0x239, 0x2f6, 0x216, 0x345, 0x295, 0x3ba, 0x2e7, 0x1e7, 0xd5, 0x59, 0x20e, 0x30c, 0x312, 0x24b, 0xab, 0x24, 0x2fb, 0x4e, 0xef, 0x3fb, 0xa0, 0x36c, 0x236, 0x5e, 0x366, 0x106, 0x1fe, 0xe4, 0xb3, 0x6d, 0x37c, 0x1bf, 0x2a3, 0x238, 0x28e, 0x37b, 0xd7, 0xa9, 0xd4, 0x21, 0x363, 0x9e, 0x12e, 0x125, 0x26d, 0x2a0, 0x2b0, 0x139, 0x3c4, 0x29a, 0x112, 0x397, 0x3a4, 0x3be, 0x307, 0x5a, 0x286, 0xbb, 0x3ad, 0x6, 0xf0, 0x1bd, 0xaf, 0x388, 0x103, 0xcc, 0xd0, 0x382, 0x36a, 0x245, 0xff, 0xe4, 0x166, 0x1b4, 0x3d6, 0x3c6, 0xdd, 0x33b, 0x1d9, 0x127, 0x133, 0x1e8, 0xf3, 0xad, 0x268, 0x279, 0x192, 0x3c9, 0x184, 0x2f2, 0x3e5, 0x3f2, 0x239, 0x1e5, 0x4a, 0x21e, 0x10a, 0x3b5, 0x9e, 0x25c, 0x9d, 0x34c, 0x25a, 0x2bd, 0x2cb, 0x1b8, 0x39f, 0xc8, 0x310, 0x17f, 0x1d6, 0x7e, 0xfa, 0x3d4, 0x226, 0x3a7, 0x265, 0x2c0, 0x321, 0xab, 0x48, 0x3fe, 0x270, 0x2eb, 0x387, 0x5a, 0x105, 0x2ec, 0x157, 0x60, 0x248, 0x46, 0x257, 0x204, 0x78, 0x2da, 0x253, 0x1c4, 0x285, 0x66, 0x68, 0x1c1, 0x1b5, 0x326, 0x27b, 0x72, 0xb3, 0xda, 0x1eb, 0x1e3, 0x26a, 0x399, 0x2e8, 0x297, 0x29d, 0xf4, 0x27d, 0x252, 0x134, 0x338, 0xc9, 0x3e0, 0xc2, 0x179, 0x3f6, 0x1f9, 0x318, 0x2f6, 0x25, 0x10f, 0x85, 0x3de, 0x4f, 0x12e, 0x1e0, 0x2fd, 0x171, 0xfe, 0x28, 0x36c, 0xca, 0x1e9, 0x6, 0x49, 0x215, 0x32f, 0x204, 0xf0, 0x37a, 0x2bc, 0x7f, 0x14, 0x1b6, 0x65, 0x2f0, 0x3, 0x220, 0x30e, 0x393, 0x102, 0x78, 0x1bd, 0x15e, 0x23b, 0xa, 0xdb, 0x236, 0x178, 0x205, 0x110, 0x187, 0x3cd, 0x81, 0x3c, 0x2da, 0xaf, 0x319, 0x5, 0x269, 0x11b, 0xbc, 0x306, 0x88, 0x2c7, 0x3e2, 0x244, 0x1e, 0x16d, 0x253, 0x388, 0x206, 0x330, 0x289, 0x5e, 0x183, 0x44, 0x367, 0x1f1, 0x122, 0xf, 0x2b2, 0x32d, 0x1c4, 0x103, 0x198, 0x340, 0x2f, 0x2c5, 0x22, 0x3b7, 0x2fc, 0x91, 0x203, 0x159, 0x392, 0xe2, 0x285, 0xcc, 0x1a0, 0x213, 0x366, 0x11, 0x3df, 0x17e, 0x24c, 0x305, 0x2a8, 0x1c9, 0x71, 0x346, 0x66, 0xd0, 0x30d, 0x1b3, 0x20c, 0x3eb, 0xbf, 0x126, 0x386, 0x154, 0x2e0, 0x23c, 0x1a3, 0x33, 0x68, 0x382, 0x2dd, 0x106, 0x3c0, 0x3e6, 0x39a, 0x3fb, 0x109, 0x286, 0x1d1, 0x2aa, 0x1b, 0x201, 0x13b, 0x196, 0x24, 0x3f5, 0x3a4, 0x1cf, 0x70, 0x145, 0x27e, 0x113, 0x347, 0x30c, 0xa6, 0x3c4, 0xfd, 0x19, 0x188, 0x2fe, 0x2ab, 0x3db, 0x1e7, 0x2a1, 0x26d, 0x12d, 0x173, 0x275, 0x365, 0x6b, 0x344, 0x345, 0x85, 0x363, 0xf9, 0x302, 0x20b, 0x8d, 0x15c, 0x3f6, 0x3ed, 0x1ec, 0xd7, 0x141, 0x165, 0x290, 0x134, 0xfb, 0x8b, 0x1ce, 0x3b0, 0x2a3, 0x1e4, 0x2e8, 0x24e, 0x18a, 0x177, 0x16e, 0xe6, 0x218, 0xb3, 0x368, 0x28f, 0x2e, 0x243, 0x36e, 0x21d, 0x68, 0x30d, 0x366, 0x22, 0x367, 0x3e2, 0x81, 0x78, 0x37a, 0x171, 0x1fc, 0xa0, 0x356, 0xbb, 0x157, 0x180, 0xc1, 0x1a4, 0x334, 0x200, 0x2fb, 0x270, 0x3be, 0xe, 0x2ad, 0x349, 0x1a1, 0x3ef, 0x265, 0x312, 0x27c, 0x29a, 0x82, 0x31, 0x359, 0x1d6, 0x1f8, 0x3bb, 0xd5, 0x389, 0x383, 0xef, 0x3c7, 0x168, 0xe8, 0x16a, 0x3f3, 0x265, 0x22d, 0x1e2, 0xfd, 0x32, 0x229, 0x3dd, 0x2ea, 0x38e, 0x12e, 0x274, 0x14a, 0x22f, 0x2f9, 0x3f2, 0x1ec, 0x1ae, 0x10d, 0x33a, 0x15a, 0x2c1, 0x2b7, 0x119, 0x1eb, 0x303, 0x396, 0x1b7, 0x21d, 0xd0, 0x2f, 0x306, 0x220, 0x23, 0x14e, 0x10, 0xee, 0x4e, 0x2eb, 0x7, 0x2ad, 0x29b, 0x28d, 0x347, 0x211, 0x298, 0x21f, 0x3cb, 0x320, 0x2d8, 0x1a7, 0x2f3, 0x9e, 0x2c4, 0x301, 0x8d, 0x2b8, 0x3c3, 0x357, 0x2ff, 0x2d6, 0xf4, 0x3cc, 0x18d, 0x43, 0x32a, 0x1b4, 0x28f, 0x5c, 0x11e, 0x346, 0x198, 0x11b, 0x2f0, 0xc, 0x248, 0x230, 0xcd, 0x100, 0x2fb, 0xe9, 0x2e3, 0x70, 0x28a, 0x1ea, 0x8a, 0x15, 0x158, 0x1da, 0x1b8, 0xc7, 0x26c, 0x1d3, 0x246, 0x363, 0x1f2, 0x13, 0x7c, 0xc2, 0x3da, 0x47, 0x115, 0x3a3, 0x133, 0x35b, 0xb7, 0xe6, 0x31b, 0x217, 0x371, 0x7, 0x153, 0x27e, 0x45, 0x15, 0x2b0, 0x361, 0x1db, 0x6b, 0x10b, 0x35, 0x108, 0x111, 0x338, 0x8b, 0x331, 0x37e, 0x1ba, 0x3b1, 0x185, 0x68, 0x2f, 0x205, 0x92, 0x118, 0xcd, 0x200, 0x3fe, 0x341, 0x263, 0x21b, 0x3e8, 0xd5, 0x332, 0x25a, 0x38a, 0x22b, 0x18c, 0x39d, 0x2a4, 0x2ca, 0xad, 0x2c1, 0x167, 0x6d, 0x343, 0x5c, 0x23c, 0x103, 0xdb, 0x194, 0x2af, 0x300, 0x201, 0xe5, 0x156, 0x112, 0x21c, 0x2bb, 0x2ab, 0x377, 0x24f, 0x13a, 0x14a, 0x57, 0x3f6, 0x3af, 0x2ff, 0x1a5, 0x3d0, 0x25f, 0xe6, 0x72, 0x322, 0x386, 0x2b2, 0x15e, 0x1fc, 0x280, 0x105, 0x293, 0x1fd, 0x19b, 0x312, 0x1e2, 0x1fa, 0xc8, 0x16c, 0x1a7, 0x1ef, 0x278, 0x20d, 0x7c, 0x184, 0x373, 0x238, 0x174, 0x95, 0x4b, 0x2b3, 0x245, 0x3eb, 0x1f1, 0x102, 0x3c0, 0x383, 0x1de, 0x307, 0x352, 0x29b, 0x113, 0x23f, 0x4e, 0x3be, 0x70, 0x23a, 0x29f, 0x2c8, 0x12d, 0x38a, 0x5f, 0x239, 0xd7, 0x21a, 0x1e6, 0x31a, 0x218, 0x191, 0x386, 0x16d, 0x171, 0x3fb, 0x5a, 0xe8, 0x1a1, 0x347, 0x56, 0x1da, 0x2e9, 0x6b, 0x216, 0xd4, 0x52, 0x134, 0x3d1, 0x288, 0x3d6, 0x2e, 0x23c, 0x206, 0x36c, 0xbb, 0x2aa, 0xd8, 0x160, 0x27c, 0xfd, 0xc8, 0x2d8, 0x295, 0x363, 0x3c1, 0x130, 0x33f, 0x3b0, 0x135, 0x1ee, 0x2c6, 0x68, 0x5e, 0x6, 0x99, 0x1a4, 0x196, 0x120, 0x87, 0x359, 0x2ab, 0x2e7, 0x12e, 0x1c2, 0x8d, 0x2f2, 0x47, 0x5d, 0x24e, 0x4b, 0x16f, 0x106, 0x367, 0x32f, 0x8, 0x1dc, 0x270, 0x1cf, 0x380, 0x1f4, 0xd5, 0x26d, 0x17a, 0x6f, 0x2f8, 0x1ec, 0x2b1, 0xf4, 0x32b, 0xe6, 0xe4, 0x93, 0xf, 0x37a, 0x39a, 0x3e7, 0x2d0, 0x349, 0x113, 0x20e, 0x2b0, 0x2cb, 0x365, 0x358, 0x94, 0x2a9, 0x290, 0x1b2, 0x77, 0x138, 0x1cf, 0x309, 0x3d9, 0x2a1, 0x291, 0x313, 0x3f6, 0x2a7, 0x3a3, 0x18a, 0x35d, 0x83, 0x367, 0x257, 0x20, 0x2fb, 0x341, 0x19e, 0x1f8, 0x3ce, 0x9d, 0x294, 0x2b8, 0x227, 0x5d, 0x95, 0x12c, 0x36a, 0x44, 0x23, 0x262, 0x9, 0x3cf, 0xea, 0x3ac, 0x377, 0x12e, 0x384, 0x234, 0x3bd, 0x79, 0x3b2, 0x284, 0x1c1, 0x183, 0x92, 0x69, 0xcb, 0x120, 0x10e, 0x17f, 0x175, 0x223, 0x181, 0x7c, 0x219, 0x355, 0x33b, 0x2b5, 0x34, 0x5e, 0xc, 0x264, 0x13b, 0x156, 0x41, 0x188, 0x3b3, 0x2f3, 0xf9, 0x4c, 0x39b, 0x3b0, 0x26a, 0x3b1, 0x21d, 0x289, 0x3d2, 0x180, 0xb, 0x321, 0x29a, 0x32, 0x16c, 0x295, 0x2cf, 0x31f, 0x192, 0x39c, 0x2f5, 0x1cb, 0x2d5, 0x330, 0x194, 0x2ae, 0x6c, 0x160, 0xf1, 0x3f4, 0x249, 0x1d3, 0x214, 0x146, 0x338, 0x22c, 0x37c, 0x20f, 0x11e, 0x206, 0x2d1, 0x2ec, 0x17d, 0xee, 0xe9, 0x263, 0xfc, 0x3ce, 0x13a, 0x242, 0x1ed, 0x238, 0x3b2, 0x101, 0x30d, 0x3, 0x132, 0x13b, 0x2ac, 0x104, 0x5b, 0x34e, 0x2cf, 0x237, 0x241, 0xdf, 0x303, 0x11e, 0x5, 0x356, 0x34d, 0x3fd, 0x30c, 0xed, 0x1db, 0x358, 0x250, 0x2ca, 0x161, 0x10c, 0x322, 0xf, 0x1f3, 0x1de, 0xe, 0x11d, 0x137, 0x26d, 0x1e1, 0x2f9, 0x357, 0x3a3, 0x314, 0x16f, 0x11, 0x215, 0x262, 0x12, 0x327, 0x359, 0x2be, 0x223, 0x302, 0x1f0, 0xec, 0x135, 0x3b1, 0x33, 0x236, 0x2af, 0x36, 0x160, 0x1e2, 0x3cb, 0x26c, 0x10f, 0x210, 0x134, 0x35f, 0xda, 0x55, 0x253, 0x3f8, 0x5a, 0x3a0, 0x226, 0x54, 0x2bd, 0x311, 0x239, 0x35c, 0x1e8, 0x16e, 0xff, 0x2fc, 0x1, 0xee, 0xe9, 0x263, 0xfc, 0x3ce, 0x13a, 0x242, 0x1ed, 0x238, 0x3b2, 0x101, 0x30d, 0x3, 0x132, 0x13b, 0x2ac, 0x104, 0x5b, 0x34e, 0x2cf, 0x237, 0x1dc, 0x3a4, 0x33c, 0x3db, 0x12e, 0x20b, 0x308, 0x2a3, 0x1ee, 0x21d, 0x236, 0x157, 0xd8, 0x312, 0x21f, 0x18e, 0x216, 0x2a9, 0xad, 0x43, 0x191, 0xf, 0x3e6, 0x371, 0x70, 0x1f4, 0x2a1, 0x256, 0x15c, 0x47, 0x2e8, 0x284, 0x30d, 0x6, 0xc1, 0x1ca, 0x29a, 0xc8, 0x2ed, 0x21, 0x222, 0x3d1, 0x6d, 0x55, 0xaf, 0x3fb, 0x2d0, 0x27e, 0x59, 0x12d, 0x6f, 0x3ed, 0x3ee, 0x18a, 0x16f, 0x22, 0x46, 0x334, 0x120, 0x31, 0x3dd, 0x1ef, 0x3c1, 0x192, 0x26b, 0x303, 0x23c, 0x14, 0x286, 0xb5, 0x347, 0x2b0, 0x275, 0xc6, 0xd7, 0xf4, 0x16e, 0x1fe, 0x3e2, 0x8, 0x2fb, 0x11f, 0x1d6, 0x2e7, 0x162, 0x7c, 0x76, 0x135, 0x36b, 0xcc, 0x194, 0x2aa, 0x2c9, 0xa6, 0xdc, 0x6b, 0x94, 0x165, 0x161, 0x218, 0x93, 0x78, 0x30f, 0x3be, 0x380, 0x3bb, 0x125, 0x294, 0x2f2, 0x238, 0x36d, 0xd, 0x5e, 0x30, 0x3b8, 0x28b, 0x1d6, 0x1c7, 0x181, 0x3e0, 0x369, 0x2e1, 0x346, 0x2d1, 0x34d, 0x3ef, 0xac, 0x33e, 0xc6, 0x1ae, 0x3d0, 0x362, 0x3df, 0xa7, 0x200, 0x327, 0x17f, 0x3ba, 0x1f2, 0xc9, 0x26b, 0x20f, 0xe2, 0xa0, 0x3a, 0x28d, 0x54, 0x2e6, 0x17c, 0x37b, 0x266, 0x2b3, 0x22, 0x8c, 0xcb, 0x112, 0x310, 0x34e, 0x32e, 0x338, 0x144, 0x28f, 0x32d, 0x3f9, 0x2d0, 0xf5, 0x164, 0x17a, 0x2f9, 0x147, 0x24e, 0xb9, 0x183, 0x99, 0x276, 0x14d, 0xc8, 0x1d3, 0x84, 0x134, 0x167, 0x1bb, 0x16d, 0x33d, 0x7, 0x23a, 0x1aa, 0x12b, 0x15c, 0x8e, 0x3b2, 0xd, 0xbc, 0xc0, 0x2c, 0xf1, 0x39f, 0x344, 0x1a8, 0x252, 0x43, 0x322, 0x3c, 0x30f, 0x375, 0x21b, 0x1e7, 0x274, 0x234, 0x1d7, 0x27f, 0x30a, 0x236, 0x2ae, 0x360, 0xa6, 0x1b8, 0x1ac, 0xa9, 0x27d, 0x73, 0x329, 0x102, 0xee, 0x3a4, 0x271, 0x377, 0x162, 0x379, 0x23e, 0x2ab, 0x4f, 0x4c, 0x1ce, 0x385, 0x71, 0xa0, 0x74, 0x226, 0x2a0, 0x233, 0x3d3, 0x34f, 0x12c, 0x2c5, 0x99, 0xe5, 0x13d, 0x249, 0x10f, 0xa4, 0x18b, 0x2cc, 0x1e, 0x30f, 0x2e3, 0x7e, 0x323, 0x301, 0x219, 0x135, 0x1b7, 0xdb, 0x1d1, 0x3f3, 0xac, 0x275, 0x318, 0x16b, 0x177, 0x83, 0x215, 0x334, 0x89, 0x310, 0x295, 0xa3, 0x1f6, 0x6d, 0x154, 0x2e2, 0x307, 0x11d, 0x1aa, 0x256, 0x179, 0x79, 0x35e, 0x1a0, 0x353, 0xd8, 0x53, 0x1b8, 0x358, 0x2a4, 0x3cc, 0x339, 0x1f1, 0x10, 0x3f5, 0x3a8, 0x2ea, 0xf9, 0xc9, 0xdf, 0x2e, 0x319, 0x212, 0x349, 0x228, 0x25a, 0x378, 0x147, 0x95, 0x2e4, 0x3, 0x182, 0x24b, 0x3f4, 0xd1, 0xd4, 0x252, 0x86, 0x93, 0x1e0, 0x9c, 0x263, 0x3e9, 0x25c, 0x7c, 0x1d8, 0x374, 0x346, 0x1ab, 0x12f, 0x347, 0x2d2, 0x311, 0x1ec, 0x29d, 0x35d, 0x22, 0x2fb, 0xea, 0x175, 0xf9, 0x192, 0x37c, 0x170, 0x1fc, 0x2d0, 0x3d4, 0x26d, 0x22f, 0x47, 0x36d, 0x68, 0x3ad, 0xd8, 0xa6, 0x2e9, 0x2f6, 0x21a, 0x16e, 0x3eb, 0x14e, 0x24, 0x31, 0x2d7, 0x32e, 0xfb, 0x6d, 0x2a8, 0x39a, 0xe, 0x1f4, 0x125, 0x8d, 0x1d7, 0x1ee, 0xcc, 0xbb, 0x3fa, 0x56, 0x275, 0x239, 0x1a5, 0x3aa, 0x22, 0x230, 0xab, 0x19, 0x2ed, 0x108, 0x1b2, 0xb3, 0xf, 0x30f, 0x1cf, 0x1f8, 0x12e, 0x7c, 0x3b0, 0x1cb, 0x206, 0x286, 0x1a1, 0x54, 0x38a, 0x3ed, 0x34f, 0x258, 0x306, 0xc1, 0x24b, 0x3e1, 0x344, 0x2a9, 0x161, 0xe4, 0x81, 0x1dc, 0x11f, 0x2ab, 0x9e, 0x130, 0x26b, 0x2e, 0x23b, 0x5a, 0x27e, 0x2c8, 0x3c2, 0x38f, 0x2e8, 0xd, 0x2f0, 0x1b, 0x312, 0xdc, 0x358, 0x141, 0x32b, 0x1fe, 0x32f, 0x200, 0x87, 0x3dd, 0x363, 0x19c, 0x288, 0x55, 0x171, 0x307, 0x23a, 0x2a1, 0x1ff, 0x3a8, 0x3ba, 0x38b, 0x22c, 0x28f, 0x15e, 0x387, 0x23a, 0x14b, 0x242, 0x1d7, 0x3dc, 0x330, 0x1d1, 0x3d7, 0x2d2, 0x5f, 0x2ff, 0x221, 0x366, 0x132, 0x321, 0x3e1, 0x281, 0x2b6, 0x31a, 0x25b, 0x4, 0x3f5, 0x2bb, 0x2f3, 0x237, 0xa2, 0x22e, 0x171, 0x207, 0xfa, 0x125, 0x11a, 0x355, 0x36b, 0xdb, 0x34d, 0x347, 0x35a, 0x17c, 0x3ee, 0x96, 0x183, 0xc1, 0x9f, 0x39f, 0x216, 0x2ca, 0x73, 0x17e, 0x10, 0x3cf, 0x2fe, 0x3de, 0xce, 0x288, 0xaa, 0x1cd, 0xe, 0x3e8, 0x9d, 0x61, 0x14f, 0x1b7, 0x36c, 0x12f, 0x107, 0x173, 0x1f9, 0x3a3, 0x258, 0x205, 0x304, 0x27c, 0x267, 0x4a, 0x33a, 0x1cc, 0x1f1, 0x40, 0x327, 0x3ea, 0x363, 0x338, 0x232, 0x2a8, 0x33d, 0x38, 0x3bb, 0x274, 0x184, 0x135, 0x2d5, 0x1ab, 0xb5, 0x15, 0x1c5, 0x3ed, 0x297, 0x172, 0x6, 0xb, 0x1e2, 0x18e, 0x128, 0xf3, 0x339, 0x3fe, 0x2bb, 0x1ef, 0xce, 0x119, 0x2a8, 0x273, 0xe0, 0x1e7, 0x301, 0xec, 0x1cb, 0xa, 0x3a, 0x8a, 0xbd, 0x3e5, 0x2e8, 0x34, 0x353, 0x2c9, 0xed, 0x235, 0x2b1, 0x1d5, 0x44, 0x1a4, 0x14d, 0x9b, 0xd4, 0x2b4, 0x1c8, 0x1, 0x3fe, 0x2bb, 0x1ef, 0xce, 0x119, 0x2a8, 0x273, 0xe0, 0x1e7, 0x301, 0xec, 0x1cb, 0xa, 0x3a, 0x8a, 0xbd, 0x3e5, 0x2e8, 0x34, 0x353, 0x2c9, 0xed, 0x235, 0x2b1, 0x1d5, 0x44, 0x1a4, 0x14d, 0x9b, 0xd4, 0x2b4, 0x1c8, 0x1, 0x3fe, 0x2bb, 0x1ef, 0xce, 0x119, 0x2a8, 0x273, 0xe0, 0x1e7, 0x301, 0xec, 0x1cb, 0xa, 0x3a, 0x8a, 0xbd, 0x3e5, 0x2e8, 0x34, 0x353, 0x2c9, 0xed, 0x235, 0x2b1, 0x1d5, 0x44, 0x1a4, 0x14d, 0x9b, 0xd4, 0x2b4, 0x1c8, 0x1, 0x3fe, 0x2bb, 0x1ef, 0xce, 0x119, 0x2a8, 0x273, 0xe0, 0x1e7, 0x301, 0xec, 0x1cb, 0xa, 0x3a, 0x8a, 0x3f5, 0x2fe, 0x363, 0xfb, 0x368, 0x37a, 0x3be, 0x1f8, 0x162, 0x33f, 0x303, 0x23b, 0x2d0, 0x29f, 0x256, 0x3bd, 0x1ee, 0x269, 0x293, 0x20e, 0x38a, 0x357, 0x254, 0x5e, 0x1b, 0xa6, 0x365, 0xd7, 0x177, 0x22, 0x1a4, 0x29a, 0x26c, 0x2a9, 0x31a, 0x17e, 0x40, 0x87, 0x2d7, 0x146, 0x2b7, 0x386, 0x30f, 0x263, 0x2e7, 0x26, 0x26b, 0x170, 0x3fb, 0x145, 0x2a1, 0x8d, 0x2a3, 0x36e, 0x356, 0x1a1, 0x2a0, 0x378, 0x5d, 0xd, 0x3ad, 0x2c9, 0x1da, 0xc6, 0x1a5, 0x16f, 0x92, 0x1ca, 0x3e1, 0x216, 0x33a, 0x339, 0x32f, 0x24, 0x188, 0x85, 0x134, 0xb3, 0x78, 0x270, 0x1d6, 0x9e, 0x192, 0x3d6, 0xaf, 0x307, 0x1f4, 0x13a, 0x308, 0x1ba, 0x206, 0x1d, 0x8a, 0x17a, 0x38f, 0x36d, 0x340, 0x2aa, 0x30c, 0x275, 0x1ec, 0x18a, 0x366, 0xc1, 0x27c, 0x18e, 0xa9, 0x32b, 0x3eb, 0x262, 0x112, 0x2d8, 0x108, 0x18b, 0x3e3, 0x3ea, 0x32e, 0x3ab, 0x1c3, 0x30f, 0xcf, 0x38e, 0x130, 0x2f1, 0x253, 0x307, 0x3e8, 0xe1, 0x76, 0x396, 0x50, 0x349, 0x199, 0xae, 0x1e4, 0x33, 0x2ec, 0x347, 0x2e6, 0x3af, 0x254, 0xbc, 0x6c, 0x139, 0x235, 0x2d6, 0x16f, 0x124, 0x321, 0x337, 0x128, 0x391, 0x3eb, 0xcd, 0x41, 0x2ed, 0xa4, 0x10c, 0x81, 0x1ff, 0x17f, 0x363, 0x1f6, 0x1bb, 0x3e6, 0x39e, 0x377, 0x26, 0xdf, 0x1c9, 0x3e7, 0x7d, 0x9d, 0x308, 0x374, 0xa, 0xe8, 0xb2, 0x313, 0x238, 0x185, 0x259, 0x3ef, 0x35a, 0x3f2, 0x24e, 0x213, 0x209, 0xa6, 0x2c3, 0x35c, 0x3aa, 0x220, 0xe5, 0x3e1, 0x25, 0xf3, 0x1fe, 0x29c, 0x89, 0x2d8, 0x210, 0x225, 0x91, 0x3b8, 0x3a8, 0x1ef, 0x338, 0x1b4, 0x37a, 0x375, 0x3e9, 0x302, 0x39c, 0xb8, 0x3fb, 0x28a, 0x296, 0x61, 0x26a, 0x103, 0x1d, 0x114, 0x1e1, 0x47, 0x2b5, 0xca, 0x3fa, 0x3cf, 0x3b3, 0x146, 0x2ce, 0x1e, 0x270, 0x351, 0x1f2, 0x51, 0x154, 0x1de, 0x3f, 0xb1, 0x277, 0x2e, 0x3f9, 0x28a, 0x125, 0x184, 0x374, 0x14, 0x3a0, 0x199, 0x15c, 0x399, 0x198, 0x293, 0x2a, 0xde, 0x5d, 0x34, 0x2ae, 0x30c, 0x1c6, 0x2ff, 0x258, 0x18, 0x2c0, 0x2e9, 0x26f, 0x2ee, 0x110, 0xe5, 0x3cb, 0x94, 0x391, 0x3df, 0x334, 0x208, 0x283, 0xad, 0x390, 0x10, 0x87, 0x34e, 0x4d, 0xb3, 0x1e0, 0x341, 0x175, 0x31f, 0x119, 0x16d, 0x1df, 0x3f0, 0x302, 0x331, 0x2e0, 0x3e7, 0xfa, 0x274, 0x76, 0x325, 0x140, 0x27e, 0x1a6, 0x1ed, 0x1ee, 0x1b6, 0x16a, 0x2a0, 0x1fb, 0x1d9, 0x340, 0x2ba, 0xac, 0x5f, 0x3a3, 0x1c1, 0x180, 0x53, 0x2c3, 0x2b1, 0x2b3, 0x124, 0x24b, 0xc7, 0x152, 0x16e, 0x187, 0x32c, 0xc8, 0x6a, 0x2c2, 0x17e, 0x100, 0x62, 0x85, 0xd9, 0x322, 0x23f, 0x75, 0x37d, 0x19c, 0x397, 0x2d7, 0x222, 0xb3, 0x3c0, 0x11f, 0x3ba, 0x19c, 0x368, 0x3e6, 0x263, 0x315, 0x192, 0x28f, 0x39a, 0x380, 0x12e, 0x33f, 0x2e, 0x3fb, 0x23a, 0x13a, 0x76, 0x243, 0x109, 0x3d4, 0x256, 0x1d7, 0x36e, 0x286, 0x8a, 0x3c2, 0x238, 0x21d, 0x1d1, 0x20e, 0x6f, 0x5d, 0x68, 0x2aa, 0x56, 0x5f, 0x34f, 0x30d, 0x1b, 0x139, 0xc6, 0x133, 0x366, 0x201, 0x21f, 0x2f6, 0x3a9, 0x22, 0x13b, 0x3e1, 0x94, 0x32b, 0x367, 0x196, 0xc8, 0xd4, 0x31a, 0x3e2, 0x24, 0x5b, 0x108, 0x43, 0x81, 0x3f5, 0x3dd, 0x146, 0x195, 0x78, 0x3a4, 0x175, 0x237, 0x6d, 0x37a, 0x1cf, 0x2e7, 0x130, 0x3d6, 0x171, 0x70, 0x323, 0x3e0, 0x303, 0x1fc, 0x145, 0x125, 0x308, 0x1cb, 0xa0, 0x27e, 0x34c, 0x3bd, 0x36b, 0x356, 0x113, 0x17a, 0x47, 0x2c6, 0xbb, 0x347, 0x38a, 0x28e, 0xd, 0x157, 0x30c, 0x38c, 0x3ee, 0x2e4, 0x180, 0x327, 0x34e, 0x134, 0x322, 0xee, 0x359, 0x2cf, 0x35f, 0xf, 0xe9, 0x2be, 0x237, 0xda, 0x1f3, 0x263, 0x223, 0x241, 0x55, 0x1de, 0xfc, 0x302, 0xdf, 0x253, 0xe, 0x3ce, 0x1f0, 0x303, 0x3f8, 0x11d, 0x13a, 0xec, 0x11e, 0x5a, 0x137, 0x242, 0x135, 0x5, 0x3a0, 0x26d, 0x1ed, 0x3b1, 0x356, 0x226, 0x1e1, 0x238, 0x33, 0x34d, 0x54, 0x2f9, 0x3b2, 0x236, 0x3fd, 0x2bd, 0x357, 0x101, 0x2af, 0x30c, 0x311, 0x3a3, 0x30d, 0x36, 0xed, 0x239, 0x314, 0x3, 0x160, 0x1db, 0x35c, 0x16f, 0x132, 0x1e2, 0x358, 0x1e8, 0x11, 0x13b, 0x3cb, 0x250, 0x16e, 0x215, 0x2ac, 0x26c, 0x2ca, 0xff, 0x262, 0x104, 0x10f, 0x161, 0x2fc, 0x12, 0x5b, 0x210, 0x10c, 0x1, 0x327, 0x34e, 0x134, 0x322, 0xee, 0x359, 0x2cf, 0x35f, 0xf, 0xe9, 0x2be, 0x237, 0xda, 0x1f3, 0x263, 0x223, 0x241, 0x55, 0x1de, 0xfc, 0x302, 0x247, 0x123, 0x1b2, 0x24c, 0x1ff, 0x3dd, 0x111, 0x166, 0x23f, 0x3a8, 0x2cf, 0x2b7, 0x3c, 0x341, 0x3ba, 0x279, 0x2e5, 0x4e, 0x351, 0x38b, 0x6d, 0x1f3, 0xcf, 0x9e, 0x22c, 0x159, 0x3be, 0x377, 0x260, 0x28f, 0x273, 0x7e, 0x302, 0x1be, 0x15e, 0x70, 0x97, 0x277, 0x170, 0x387, 0x37f, 0x7c, 0x385, 0x3f8, 0x23a, 0xe1, 0x369, 0x1c4, 0x352, 0x14b, 0x308, 0x325, 0x212, 0x29f, 0x242, 0x26a, 0x14, 0x13f, 0x291, 0x1d7, 0x1a3, 0x3a, 0x2c8, 0x179, 0x3dc, 0x356, 0x45, 0x38d, 0x1e4, 0x330, 0x16a, 0x12d, 0x227, 0x185, 0x1d1, 0x2a, 0x2f9, 0x36d, 0xca, 0x3d7, 0x38a, 0x22a, 0xd0, 0x17d, 0x2d2, 0x3d3, 0x284, 0x2af, 0x211, 0x5f, 0x127, 0xbc, 0x2c9, 0x33e, 0x2ff, 0x2e4, 0x209, 0x272, 0x239, 0x221, 0xc, 0x312, 0x18f, 0x34a, 0x366, 0x16, 0x1b8, 0xd7, 0x2b3, 0x132, 0x3c4, 0x17b, 0x35b, 0x110, 0x87, 0x85, 0x18b, 0x81, 0x397, 0x295, 0x1b2, 0x91, 0x3f5, 0x2d7, 0x134, 0x93, 0x2fb, 0x3dd, 0x222, 0x191, 0x1dc, 0x2fe, 0x146, 0xb3, 0x23f, 0x359, 0x32e, 0x195, 0x3c0, 0xea, 0x363, 0x2b7, 0x78, 0x11f, 0x1ef, 0x3d1, 0xf, 0x3a4, 0x3ba, 0xfb, 0x386, 0x270, 0x175, 0x19c, 0x376, 0x4e, 0x2ab, 0x237, 0x368, 0x30f, 0x1d6, 0x3c1, 0x6d, 0x3e6, 0x33c, 0xf9, 0x288, 0x37a, 0x263, 0x9e, 0x51, 0x16d, 0x1cf, 0x315, 0x8b, 0x2a8, 0x3be, 0x2e7, 0x192, 0x55, 0x371, 0x3db, 0x130, 0x28f, 0xef, 0x1f8, 0x26, 0x3d6, 0x39a, 0x3f, 0x302, 0x37c, 0x171, 0x380, 0x162, 0x26b, 0xaf, 0x70, 0x12e, 0x1ce, 0x392, 0xe, 0x323, 0x33f, 0x170, 0x307, 0x1e7, 0x3e0, 0x2e, 0x3e7, 0x3bb, 0x7c, 0x303, 0x3fb, 0x1f4, 0x20b, 0x1e3, 0x1fc, 0x23a, 0x1c2, 0x1bf, 0x23b, 0x145, 0x13a, 0x3b0, 0x1c4, 0x2ad, 0x125, 0x10e, 0x214, 0x43, 0x2, 0x21c, 0x21, 0x86, 0x4, 0x31, 0x42, 0x10c, 0x8, 0x62, 0x84, 0x218, 0x10, 0xc4, 0x108, 0x39, 0x20, 0x188, 0x210, 0x72, 0x40, 0x310, 0x29, 0xe4, 0x80, 0x229, 0x52, 0x1c8, 0x100, 0x5b, 0xa4, 0x390, 0x200, 0xb6, 0x148, 0x329, 0x9, 0x16c, 0x290, 0x25b, 0x12, 0x2d8, 0x129, 0xbf, 0x24, 0x1b9, 0x252, 0x17e, 0x48, 0x372, 0xad, 0x2fc, 0x90, 0x2ed, 0x15a, 0x1f1, 0x120, 0x1d3, 0x2b4, 0x3e2, 0x240, 0x3a6, 0x161, 0x3cd, 0x89, 0x345, 0x2c2, 0x393, 0x112, 0x283, 0x18d, 0x32f, 0x224, 0x10f, 0x31a, 0x257, 0x41, 0x21e, 0x23d, 0xa7, 0x82, 0x35, 0x73, 0x14e, 0x104, 0x6a, 0xe6, 0x29c, 0x208, 0xd4, 0x1cc, 0x131, 0x19, 0x1a8, 0x398, 0x262, 0x32, 0x350, 0x339, 0xcd, 0x64, 0x2a9, 0x27b, 0x19a, 0xc8, 0x15b, 0xff, 0x334, 0x190, 0x2b6, 0x1fe, 0x21c, 0x42, 0x218, 0x20, 0x310, 0x52, 0x390, 0x9, 0x2d8, 0x252, 0x2fc, 0x120, 0x3a6, 0x2c2, 0x32f, 0x41, 0x35, 0xe6, 0x131, 0x32, 0x2a9, 0xff, 0x261, 0x249, 0x19d, 0x3df, 0xab, 0x1a2, 0x3cc, 0x30e, 0x14d, 0x25, 0x16e, 0x118, 0x1fa, 0xa9, 0x193, 0x348, 0x337, 0x10d, 0x20c, 0x1ca, 0x231, 0x1e8, 0x110, 0x13e, 0x2b9, 0x177, 0x248, 0x381, 0x39d, 0x2b3, 0x182, 0xdc, 0x35c, 0x2dd, 0x2c, 0x3b6, 0x34a, 0x306, 0x189, 0x235, 0x18a, 0x18, 0x14c, 0x239, 0x12c, 0x300, 0x1da, 0x3b9, 0x1c1, 0xd8, 0x33e, 0x3d5, 0x5e, 0x336, 0x311, 0x24e, 0x3d2, 0x211, 0x2f8, 0x142, 0x2ae, 0x2b0, 0x3af, 0x1a, 0x17d, 0x2bd, 0x115, 0x340, 0x3f3, 0x31d, 0x2e8, 0xca, 0x287, 0x378, 0x1af, 0x176, 0x54, 0x3c3, 0x185, 0x293, 0x292, 0x8e, 0xcc, 0x2d4, 0x2f4, 0x1e4, 0x1b6, 0x226, 0x22f, 0xf7, 0x2a5, 0x59, 0x31, 0x108, 0xe4, 0x200, 0x2d8, 0xad, 0x3e2, 0x112, 0x21e, 0xe6, 0x262, 0xc8, 0x165, 0x3eb, 0xab, 0x344, 0x32b, 0x46, 0xfd, 0xa9, 0x326, 0x13b, 0x18e, 0xf4, 0x110, 0x27c, 0x2f6, 0x3aa, 0xc1, 0xdc, 0x2b1, 0x366, 0x160, 0x31e, 0x18a, 0x30, 0x139, 0x1ec, 0x2e4, 0xd8, 0x275, 0x34f, 0x2f0, 0x30c, 0x2f8, 0x284, 0x2aa, 0x1ad, 0x28e, 0x340, 0x3ef, 0x6f, 0x36d, 0xbb, 0x54, 0x38f, 0x21d, 0xb5, 0x17a, 0x1e4, 0x36c, 0x8a, 0x15c, 0x36b, 0x1d, 0x26d, 0x1d7, 0x206, 0x27e, 0x294, 0x1ba, 0x109, 0xd5, 0x308, 0x23c, 0x2ad, 0x13a, 0x1bf, 0x1fc, 0x1f4, 0x7c, 0x2e, 0x307, 0x323, 0x1ce, 0xaf, 0x380, 0x302, 0x3d6, 0xef, 0x3db, 0x192, 0x2a8, 0x1cf, 0x9e, 0x288, 0x3e6, 0x1d6, 0x237, 0x376, 0x270, 0x3ba, 0x3d1, 0x78, 0xea, 0x32e, 0xb3, 0x1dc, 0x3dd, 0x134, 0x91, 0x397, 0x85, 0x43, 0x62, 0x29, 0x329, 0x48, 0x3a6, 0x31a, 0x29c, 0x64, 0x165, 0x3df, 0x2ac, 0x216, 0x2dc, 0xd2, 0x337, 0x3d, 0x88, 0x27c, 0x1e5, 0x2b3, 0x201, 0x1db, 0x29d, 0x6, 0x14c, 0xf6, 0x2e4, 0x1b0, 0x1c6, 0x24e, 0x353, 0x158, 0x357, 0xd0, 0x3f3, 0x6f, 0x2d3, 0x2ec, 0x2a0, 0x8e, 0x330, 0x113, 0x57, 0x3b1, 0x1d, 0xd3, 0x355, 0x14, 0x3a1, 0x234, 0x243, 0x1a9, 0x9d, 0x1bf, 0x3f8, 0x3d9, 0x3e0, 0x2e0, 0x38, 0x162, 0x2f1, 0x273, 0x3db, 0x324, 0x2b2, 0x263, 0x1f2, 0x1b4, 0x4e, 0x2ea, 0x3ec, 0x78, 0x1d4, 0xa3, 0x191, 0x1ff, 0x34e, 0x18b, 0x2, 0xc4, 0x52, 0x25b, 0x90, 0x345, 0x23d, 0x131, 0xc8, 0x2ca, 0x3b7, 0x151, 0x25, 0x1b1, 0x1a4, 0x267, 0x7a, 0x110, 0xf1, 0x3ca, 0x16f, 0xb, 0x3b6, 0x133, 0xc, 0x298, 0x1ec, 0x1c1, 0x360, 0x38c, 0x95, 0x2af, 0x2b0, 0x2a7, 0x1a0, 0x3ef, 0xc4, 0xa4, 0x17e, 0x89, 0x35, 0x339, 0xcb, 0xd1, 0x32b, 0x118, 0x3cb, 0x21a, 0x88, 0xf1, 0x39d, 0x1b5, 0x58, 0x31e, 0x221, 0x300, 0x2cb, 0x3a3, 0x1e9, 0x56, 0x3af, 0xd0, 0x3ef, 0x1bc, 0x2b5, 0x293, 0xbd, 0x3c8, 0x356, 0x164, 0x373, 0x206, 0x1ea, 0x11a, 0x243, 0x352, 0x274, 0x1e3, 0x3f7, 0x3ce, 0x1ce, 0x2bc, 0x7e, 0x130, 0x154, 0x39e, 0xf9, 0x1b4, 0x9c, 0x3ba, 0x35f, 0x389, 0x2fe, 0x9a, 0x122, 0x87, 0x84, 0x1c8, 0x24, 0x3a6, 0x23d, 0x262, 0x320, 0x27d, 0x30e, 0x27a, 0x152, 0x106, 0x321, 0x2b9, 0x3aa, 0x304, 0x1db, 0x133, 0x18, 0x272, 0x37b, 0x2f, 0xc3, 0x2f8, 0x202, 0x2fa, 0x38a, 0x3b2, 0x176, 0x2a0, 0x11c, 0xdb, 0x8a, 0x179, 0x2d5, 0x349, 0x14a, 0x374, 0x5a, 0x296, 0x369, 0x1fc, 0x3d9, 0x3c9, 0x392, 0x1c0, 0x20d, 0x28f, 0x1df, 0x223, 0x288, 0x383, 0x15f, 0xfb, 0x188, 0x290, 0x3e2, 0x82, 0x2a9, 0x3eb, 0x151, 0x94, 0x326, 0x1ca, 0x358, 0x3aa, 0x201, 0x365, 0x18a, 0x180, 0x2cb, 0x34f, 0x3ad, 0x2b0, 0x28e, 0x236, 0x20e, 0x38f, 0xcc, 0x113, 0x15c, 0x36e, 0x349, 0x294, 0x1cb, 0x2d0, 0x13a, 0x1e3, 0x3e7, 0x323, 0x26b, 0x39a, 0x3db, 0x8b, 0x37a, 0x1d6, 0x19c, 0xf, 0xea, 0x146, 0x93, 0x397, 0x21, 0xe4, 0x24, 0x345, 0xe6, 0x334, 0x26c, 0x32b, 0x230, 0x337, 0xf4, 0x92, 0x21f, 0x2b1, 0x306, 0xa6, 0x1ec, 0x30d, 0x265, 0x2f8, 0xd, 0x3fa, 0x6f, 0x35e, 0x293, 0x17a, 0x33b, 0x286, 0x26d, 0x2a3, 0xa0, 0xd5, 0x76, 0x23b, 0x1f4, 0x3e0, 0x392, 0x380, 0x26, 0x55, 0x1cf, 0xf9, 0x368, 0x270, 0x1ef, 0x195, 0x1dc, 0x2d7, 0x18b, 0x8, 0x5b, 0xad, 0x32f, 0x19, 0x165, 0x367, 0x29a, 0xa9, 0x106, 0x24b, 0x2f6, 0x16f, 0x2c, 0x31e, 0x4b, 0x1b, 0x310, 0x252, 0x32f, 0x32, 0x19d, 0x30e, 0x1fa, 0x10d, 0x110, 0x381, 0x35c, 0x306, 0x14c, 0x3b9, 0x5e, 0x211, 0x3af, 0x340, 0x287, 0x3c3, 0xcc, 0x226, 0x179, 0x346, 0xf5, 0x234, 0x23c, 0x28a, 0x3e, 0x170, 0xe0, 0x13, 0x55, 0x39e, 0x3e4, 0x376, 0x341, 0x197, 0x191, 0x3e3, 0x214, 0xe4, 0x48, 0x10f, 0x339, 0x32c, 0x10b, 0x362, 0x276, 0x1ac, 0x3aa, 0xb, 0x18f, 0x4b, 0x36, 0x1c6, 0x254, 0x15d, 0x1c5, 0x36d, 0x3a2, 0xbd, 0x33b, 0x105, 0x1a6, 0x135, 0x212, 0x296, 0x1bf, 0x3ff, 0x395, 0x26b, 0x33d, 0x377, 0x51, 0x3c5, 0x2be, 0x3d1, 0x389, 0x3ea, 0x1b2, 0x2, 0x229, 0xad, 0x257, 0x64, 0x33a, 0x215, 0x3f4, 0x21a, 0x220, 0x30b, 0x2b1, 0x205, 0x298, 0x37b, 0xbc, 0x2b, 0x357, 0x289, 0x107, 0x38f, 0x198, 0x45, 0x2f2, 0x285, 0x1ea, 0x61, 0x71, 0x11d, 0x7c, 0x2e0, 0x1c0, 0x26, 0x229, 0x15a, 0x14e, 0x320, 0x3cc, 0x230, 0xc7, 0x35b, 0xc1, 0x3b6, 0x314, 0x1b, 0x1c6, 0xa1, 0x17d, 0x233, 0x2b5, 0xb5, 0x313, 0x2df, 0x349, 0x242, 0x8f, 0x145, 0x3e, 0x2e0, 0x380, 0x98, 0x159, 0x33c, 0xce, 0x1e, 0x359, 0x9a, 0x102, 0x188, 0x252, 0x257, 0xc8, 0xf3, 0x8c, 0x337, 0x3d0, 0x132, 0x2e9, 0xc5, 0x300, 0x275, 0x12a, 0x15d, 0x38a, 0x1af, 0x12f, 0x3c2, 0x3b1, 0x1d0, 0x294, 0x325, 0x153, 0x20b, 0xb8, 0xe0, 0x26, 0x154, 0xcf, 0x237, 0x203, 0x1d4, 0x222, 0x244, 0x62, 0x290, 0x393, 0x32, 0x33a, 0x23, 0x3cb, 0xf4, 0x248, 0x1b8, 0x133, 0xc0, 0x19f, 0x24e, 0x155, 0x2e6, 0x36d, 0x34d, 0x2f4, 0x1ee, 0x74, 0xa5, 0x1cb, 0x352, 0x384, 0x2e, 0x38, 0x20d, 0x55, 0x335, 0x38b, 0x386, 0x75, 0x28c, 0x91, 0x21c, 0xa4, 0x3e2, 0x208, 0x2ca, 0x30e, 0x3f4, 0x3d, 0x92, 0x5b, 0x161, 0x262, 0x26c, 0x16e, 0x13b, 0x358, 0x16f, 0x160, 0x239, 0x30d, 0x30c, 0x357, 0x236, 0x54, 0x238, 0x356, 0x26d, 0x135, 0x5a, 0x13a, 0x303, 0xe, 0x302, 0x55, 0x263, 0x237, 0xf, 0x359, 0x134, 0x1, 0x5b, 0x161, 0x262, 0x26c, 0x16e, 0x13b, 0x358, 0x16f, 0x160, 0x239, 0x30d, 0x30c, 0x357, 0x236, 0x54, 0x238, 0x356, 0x26d, 0x135, 0x5a, 0x13a, 0x303, 0xe, 0x302, 0x55, 0x263, 0x237, 0xf, 0x359, 0x134, 0x1, 0x5b, 0x161, 0x262, 0x26c, 0x16e, 0x13b, 0x358, 0x16f, 0x160, 0x239, 0x30d, 0x30c, 0x357, 0x236, 0x54, 0x238, 0x356, 0x26d, 0x135, 0x5a, 0x13a, 0x303, 0xe, 0x302, 0x55, 0x263, 0x237, 0xf, 0x359, 0x134, 0x1, 0x5b, 0x161, 0x262, 0x26c, 0x16e, 0x13b, 0x358, 0x16f, 0x160, 0x239, 0x30d, 0x30c, 0x357, 0x236, 0x54, 0x238, 0x356, 0x26d, 0x135, 0x5a, 0x13a, 0xb6, 0x18d, 0x334, 0x281, 0x193, 0x24b, 0x333, 0x183, 0x139, 0x3d5, 0x2af, 0x173, 0x2d3, 0x25e, 0x22f, 0x2d5, 0x1ea, 0x308, 0x7f, 0x2f7, 0x26b, 0x1de, 0x4f, 0x368, 0x341, 0xa3, 0x91, 0x62, 0x252, 0x14e, 0x9b, 0xb7, 0x13b, 0x2b9, 0x1b5, 0x312, 0x3d8, 0x178, 0x2b0, 0xba, 0x2ec, 0x17a, 0x3dc, 0x3a0, 0x8d, 0x71, 0xfa, 0x33f, 0x2e2, 0x377, 0x288, 0x9c, 0x3b5, 0x191, 0x327, 0x29, 0x3e2, 0x32, 0xf3, 0x230, 0x31c, 0x1d5, 0x2c, 0x18c, 0x382, 0x30c, 0x2a7, 0xca, 0x2a0, 0x3c8, 0x20a, 0x256, 0x396, 0x2a6, 0x7c, 0x32d, 0xfc, 0x8b, 0x3c5, 0x1dd, 0x195, 0x1ff, 0x214, 0x329, 0x224, 0x2b6, 0x30e, 0x3cb, 0x3d0, 0xc1, 0x2c3, 0x12c, 0x2c9, 0x1f9, 0x1a0, 0x20e, 0x8e, 0x1ab, 0x26d, 0x26a, 0x168, 0x1c2, 0x5c, 0x1c0, 0x130, 0x2da, 0x351, 0x3d1, 0x77, 0x34e, 0x218, 0x48, 0x6a, 0x3eb, 0x16c, 0x23d, 0x196, 0x4a, 0x20c, 0x3c4, 0x2d6, 0x60, 0x275, 0x142, 0x3fd, 0x3f6, 0x330, 0xb2, 0x2a3, 0x2d, 0x274, 0x2e, 0x1c0, 0x260, 0x37a, 0x2be, 0x167, 0x2fb, 0x214, 0x25b, 0x82, 0x19d, 0x8c, 0x18e, 0x1d5, 0x58, 0x239, 0x2f, 0xac, 0x5d, 0x2ec, 0x2f4, 0x36b, 0x13f, 0xc2, 0x23b, 0x2f7, 0xdf, 0x371, 0x278, 0x2e5, 0xea, 0x9a, 0x2, 0x2d8, 0x73, 0x32c, 0x94, 0x11, 0x381, 0x1a5, 0xc0, 0xe3, 0x284, 0x3f3, 0x3e5, 0x269, 0x164, 0x14f, 0x5a, 0xe1, 0x5c, 0x380, 0xc9, 0x2fd, 0x175, 0x2ce, 0x1ff, 0x21, 0xbf, 0x104, 0x33a, 0x118, 0x31c, 0x3aa, 0xb0, 0x7b, 0x5e, 0x158, 0xba, 0x1d1, 0x1e1, 0x2df, 0x27e, 0x184, 0x7f, 0x1e7, 0x1be, 0x2eb, 0xf9, 0x1c3, 0x1d4, 0x134, 0x4, 0x1b9, 0xe6, 0x251, 0x128, 0x22, 0x30b, 0x34a, 0x180, 0x1c6, 0x101, 0x3ef, 0x3c3, 0xdb, 0x2c8, 0x2d8, 0xe6, 0xab, 0xa9, 0x110, 0xdc, 0x18a, 0xd8, 0x2f8, 0x340, 0x54, 0x1e4, 0x1d, 0x294, 0x23c, 0x1f4, 0x1ce, 0xef, 0x9e, 0x376, 0xea, 0x134, 0x8, 0x2ed, 0x339, 0x151, 0x141, 0x92, 0x2e9, 0x4b, 0x2c9, 0x3ed, 0x236, 0x2a0, 0x33b, 0xe8, 0x8d, 0x1c4, 0x3bb, 0x26b, 0x371, 0xf9, 0x386, 0x359, 0x1b2, 0x40, 0x345, 0x1fe, 0x29a, 0x21a, 0x99, 0x365, 0x258, 0x265, 0x357, 0x194, 0x12d, 0x1ee, 0x349, 0x61, 0x23b, 0x1e7, 0x37c, 0x3be, 0x3c1, 0xf, 0x2fe, 0x18b, 0x200, 0x21e, 0x3eb, 0xfd, 0xf4, 0xc1, 0x31e, 0x2e4, 0x30c, 0x28e, 0xbb, 0x17a, 0x36b, 0x27e, 0x308, 0x1fc, 0x323, 0x3d6, 0x1cf, 0x237, 0x78, 0x3dd, 0x43, 0x24, 0xd4, 0x367, 0x3e1, 0x3a9, 0x201, 0xc6, 0x30d, 0x56, 0x5d, 0x1d1, 0x3c2, 0x36e, 0x3d4, 0x76, 0x3fb, 0x12e, 0x28f, 0x263, 0x19c, 0x3c0, 0x2d7, 0x218, 0x1b9, 0x398, 0x151, 0x282, 0x248, 0x365, 0xb9, 0x186, 0x28e, 0x176, 0x1e1, 0x36e, 0x3a1, 0x1d8, 0x3e7, 0x2c4, 0x154, 0x1d6, 0x3ab, 0x379, 0x21, 0x2fc, 0x64, 0x32b, 0x276, 0x3ca, 0x306, 0x3b4, 0x12a, 0x3fa, 0x3e5, 0x1b6, 0x26d, 0x374, 0x2a6, 0x3e0, 0x2e2, 0x38e, 0x368, 0x23e, 0x9a, 0x8, 0x1d3, 0xff, 0x29a, 0x3d, 0x264, 0x31e, 0x1c1, 0x2b, 0x5d, 0x3a2, 0x313, 0x346, 0x137, 0x2db, 0x307, 0x20d, 0x2b2, 0x2ab, 0x167, 0x3fe, 0x108, 0x3cd, 0x320, 0x16e, 0x394, 0x26f, 0x6, 0x19f, 0x142, 0x3ef, 0x317, 0x1ab, 0x34c, 0x396, 0x11d, 0x33f, 0x33d, 0x4f, 0x376, 0x1d4, 0xd9, 0x40, 0x283, 0x3f1, 0xfd, 0x1e8, 0x304, 0xc6, 0x213, 0x158, 0x2e8, 0x12f, 0xae, 0x206, 0x1aa, 0x2f5, 0xe, 0x4c, 0x1bd, 0x175, 0x32a, 0x3cf, 0x52, 0x257, 0x136, 0x362, 0x9f, 0x35c, 0x30, 0xe3, 0x202, 0x347, 0x372, 0x27b, 0x29a, 0x7a, 0x182, 0xc6, 0x2f, 0x169, 0x36d, 0x2d4, 0x1ed, 0xa0, 0x9d, 0x5c, 0x3f, 0x22c, 0x9c, 0x32e, 0x244, 0xb6, 0xe6, 0x2ac, 0x282, 0x99, 0x18f, 0x1c1, 0x56, 0x174, 0x12f, 0x15c, 0xa, 0x14b, 0x303, 0x1c0, 0x324, 0x30f, 0x3b5, 0x126, 0x188, 0x18d, 0x32c, 0xa9, 0x49, 0x1db, 0x258, 0x186, 0x115, 0x1d1, 0x313, 0x285, 0xd5, 0x2f5, 0x1c, 0x130, 0x1f3, 0x37d, 0x191, 0x21c, 0x15a, 0x334, 0x4a, 0x44, 0xdc, 0x221, 0x19b, 0x357, 0x259, 0x2f4, 0x36e, 0x34b, 0x369, 0x307, 0x13, 0x2da, 0x175, 0x25d, 0x327, 0x290, 0x131, 0x281, 0x106, 0x30b, 0x266, 0xd8, 0x3f2, 0x65, 0x12d, 0x3b1, 0xf5, 0x76, 0x3f7, 0x2c4, 0x2a8, 0x351, 0x167, 0x3f5, 0x29, 0x257, 0x26c, 0x193, 0xf1, 0x1a5, 0x209, 0xbe, 0x340, 0x150, 0x27f, 0x349, 0x184, 0x3f8, 0x12e, 0x22e, 0x271, 0x3d1, 0x2ed, 0x1fe, 0xfd, 0x3a9, 0x2c, 0x1ec, 0x3ad, 0x38a, 0x21d, 0x59, 0x135, 0x2ad, 0x3e0, 0x39a, 0x9e, 0x386, 0x2fe, 0x43, 0x120, 0x165, 0x230, 0x358, 0x366, 0x1da, 0x254, 0x3ef, 0x47, 0x286, 0x294, 0x1c4, 0x1e7, 0x3d6, 0x263, 0xfb, 0x1dc, 0x21, 0x3e2, 0x249, 0x362, 0x27c, 0x1a5, 0x1b, 0x2f8, 0x236, 0x12d, 0x36b, 0x3d4, 0x3b0, 0x307, 0x26, 0x37a, 0x3ba, 0x191, 0x31, 0x161, 0x196, 0xa9, 0x92, 0x365, 0x2e4, 0x56, 0x2e8, 0xb5, 0x2f2, 0xa0, 0x13a, 0x170, 0x1f8, 0x288, 0x3a4, 0x222, 0x8, 0x345, 0x3eb, 0x3e1, 0x177, 0x160, 0x37b, 0x157, 0x6f, 0xcc, 0x2c8, 0x1ba, 0x145, 0x33f, 0xef, 0xf9, 0xf, 0x3dd, 0x218, 0x112, 0x33a, 0x1a4, 0x2f6, 0x306, 0x2cb, 0x284, 0x347, 0x238, 0x1d, 0x8d, 0x23b, 0x323, 0x28f, 0x33c, 0x3d1, 0x2fb, 0x108, 0x32f, 0x26c, 0x326, 0x3c4, 0x133, 0xd8, 0x1d3, 0x3f1, 0x3e1, 0x2ee, 0x189, 0x3ee, 0x15d, 0x1fb, 0x36c, 0x291, 0x11e, 0x3bb, 0x2f1, 0x335, 0xfb, 0x3b8, 0x84, 0x32f, 0xd1, 0x83, 0x21f, 0x314, 0x336, 0x28e, 0x3a2, 0xae, 0x14, 0x24a, 0xb8, 0x1f8, 0x119, 0x28b, 0x134, 0x80, 0x6a, 0x30e, 0x31c, 0x1b5, 0x139, 0x95, 0x3f3, 0x47, 0x105, 0x242, 0x23b, 0x24f, 0x22e, 0x1d6, 0x167, 0x3cf, 0x290, 0xcd, 0x4a, 0x110, 0x1db, 0x172, 0x56, 0x1d9, 0x2d4, 0x3bd, 0x212, 0x301, 0xaf, 0x1c7, 0x1bb, 0x359, 0x316, 0x90, 0x165, 0x69, 0x17b, 0x306, 0x19f, 0x202, 0x20e, 0x3c8, 0x3a0, 0x308, 0x3ff, 0x181, 0x16d, 0x2ea, 0x2cc, 0x31, 0x2c2, 0x251, 0x141, 0x132, 0x63, 0x5e, 0x35a, 0x163, 0x8a, 0x14f, 0x352, 0x3e0, 0x33d, 0x278, 0xf, 0x3b3, 0x72, 0x82, 0x3cc, 0xe5, 0xd7, 0x60, 0x22b, 0x340, 0x149, 0x3b1, 0x3d4, 0x369, 0x7, 0x130, 0x3a6, 0x3df, 0x337, 0x2b3, 0x14c, 0x24e, 0x3f3, 0x8e, 0x1d, 0x234, 0x3f8, 0x162, 0x2b2, 0x2ea, 0x191, 0xc4, 0x23d, 0x151, 0x7a, 0xb, 0x1ec, 0x2af, 0xde, 0x269, 0x1a6, 0x8f, 0x3bb, 0x1eb, 0xcf, 0x3d1, 0x3fe, 0xa4, 0x262, 0x4a, 0x220, 0x365, 0x382, 0x169, 0x35e, 0x45, 0x14f, 0x2ad, 0x39b, 0x1de, 0x3c1, 0x1e0, 0x123, 0x17e, 0x320, 0x2cd, 0x3c4, 0xc5, 0x19b, 0x28e, 0x34d, 0x2b8, 0xa0, 0xe1, 0x32d, 0x2e7, 0x1bb, 0x2bb, 0x43, 0x89, 0x27d, 0x13b, 0x26f, 0x60, 0x5f, 0x11b, 0x25a, 0x36e, 0x26e, 0x3c6, 0x380, 0x22c, 0xe9, 0x222, 0x20, 0x35, 0x30e, 0x231, 0x2dd, 0x1da, 0x142, 0x287, 0x1e4, 0x3a0, 0x219, 0x3e7, 0x13, 0x2fd, 0x1ef, 0x24c, 0xb6, 0x339, 0x27a, 0x35b, 0x160, 0x1f7, 0x15d, 0x3f6, 0x1ab, 0xa5, 0x1c4, 0x395, 0x117, 0x1d6, 0x2ce, 0x327, 0xad, 0xcb, 0x152, 0x99, 0x345, 0x367, 0x18e, 0x36a, 0x1da, 0x284, 0x20e, 0x33b, 0x27e, 0x3b0, 0xe, 0x192, 0x4e, 0x146, 0x8, 0x21e, 0x30e, 0x6b, 0x366, 0x2cb, 0xd, 0x54, 0x1ee, 0x3d4, 0x1bf, 0x70, 0x8b, 0x270, 0x222, 0x40, 0xd4, 0x46, 0x358, 0x306, 0x275, 0x68, 0x2a0, 0x36b, 0x29f, 0x1e3, 0x380, 0x51, 0x3a4, 0x134, 0x200, 0x2a9, 0x230, 0x2f6, 0x6, 0x38c, 0x340, 0x12d, 0x36e, 0xd5, 0x303, 0x3f, 0x288, 0x11f, 0x1b2, 0x24, 0x165, 0x1a4, 0x39d, 0x30, 0x5f, 0x236, 0x17a, 0x346, 0x2a1, 0x2e, 0x1f8, 0x6d, 0xea, 0x18b, 0x120, 0x33a, 0x13b, 0xd7, 0x180, 0x2f8, 0x194, 0x3c2, 0x206, 0x125, 0x170, 0x3db, 0x368, 0x359, 0x43, 0x112, 0x1e6, 0x1ca, 0x2b1, 0x1b, 0x3ed, 0xbb, 0x22f, 0x14, 0x13a, 0x392, 0x2e7, 0x376, 0x2fe, 0x218, 0x82, 0x32b, 0x24b, 0x1a5, 0xd8, 0x357, 0x1d1, 0x15c, 0xa0, 0x1c2, 0x283, 0x187, 0x6b, 0x2c5, 0x33e, 0x68, 0x149, 0x1b7, 0xd5, 0x20f, 0xfc, 0x6d, 0x1d4, 0x225, 0x112, 0x3cc, 0x321, 0x1a5, 0x1b0, 0x147, 0x293, 0x1ed, 0x2d, 0x7c, 0x33d, 0x3e4, 0x3c0, 0x10a, 0x393, 0x344, 0x44, 0x3b6, 0x30d, 0x35a, 0x30a, 0x2c8, 0x396, 0x3d9, 0x3d6, 0x271, 0x2ce, 0x87, 0x2c2, 0x2ac, 0xf4, 0x58, 0x1f7, 0x17d, 0x317, 0x20a, 0x61, 0x3ff, 0x13, 0x3e6, 0x2cf, 0x204, 0x345, 0x2c7, 0x231, 0x366, 0x19f, 0x34, 0x2a0, 0x2df, 0x26e, 0x303, 0x7e, 0x232, 0xea, 0x316, 0x89, 0x1e6, 0x394, 0x2d6, 0xd8, 0x2a7, 0x34d, 0x2f2, 0x212, 0x3e, 0x39a, 0x1f2, 0x1e0, 0x85, 0x3cd, 0x1a2, 0x22, 0x1db, 0x382, 0x1ad, 0x185, 0x164, 0x1cb, 0x3e8, 0x1eb, 0x33c, 0x167, 0x247, 0x161, 0x156, 0x7a, 0x2c, 0x2ff, 0x2ba, 0x38f, 0x105, 0x234, 0x3fb, 0x20d, 0x1f3, 0x363, 0x102, 0x3a6, 0x367, 0x10f, 0x215, 0x358, 0x3, 0x311, 0x236, 0x1e1, 0x5, 0x13a, 0x253, 0x223, 0xf, 0x34e, 0x2fc, 0x26c, 0x11, 0x1db, 0x30d, 0x2bd, 0x33, 0x26d, 0x11e, 0x3ce, 0x55, 0x2be, 0x322, 0x5b, 0xff, 0x3cb, 0x16f, 0xed, 0x101, 0x54, 0x3b1, 0x137, 0x303, 0xfc, 0xda, 0x359, 0x10c, 0x104, 0x16e, 0x1e2, 0x314, 0x30c, 0x3b2, 0x226, 0x135, 0x11d, 0xdf, 0x263, 0x35f, 0x327, 0x161, 0x2ac, 0x1e8, 0x160, 0x3a3, 0x3fd, 0x238, 0x3a0, 0xec, 0xe, 0x241, 0xe9, 0x134, 0x12, 0x2ca, 0x13b, 0x35c, 0x36, 0x357, 0x34d, 0x1ed, 0x5a, 0x1f0, 0x1de, 0x237, 0xee, 0x210, 0x262, 0x250, 0x132, 0x239, 0x2af, 0x2f9, 0x356, 0x242, 0x3f8, 0x302, 0x1f3, 0x2cf, 0x1, 0x10f, 0x215, 0x358, 0x3, 0x311, 0x236, 0x1e1, 0x5, 0x13a, 0x253, 0x223, 0xf, 0x34e, 0x2fc, 0x26c, 0x11, 0x1db, 0x30d, 0x2bd, 0x33, 0x26d, 0x21e, 0x46, 0x2f6, 0x30, 0x2f8, 0xbb, 0x15c, 0x109, 0x7c, 0xef, 0x237, 0x1dc, 0x52, 0x334, 0x141, 0x201, 0x37b, 0x17d, 0x47, 0xe8, 0x76, 0xe, 0x8b, 0x3a4, 0x1b2, 0x120, 0x1e6, 0x24b, 0x133, 0x265, 0x2e8, 0x113, 0x135, 0x23a, 0x37c, 0x33c, 0x195, 0x31, 0xe6, 0xfd, 0x3aa, 0x139, 0x284, 0x54, 0x36b, 0xd5, 0x2e, 0x3db, 0x376, 0x3dd, 0x329, 0x249, 0x106, 0x2e9, 0x30d, 0x173, 0xcc, 0x34c, 0x1c4, 0x12e, 0x16d, 0x1ef, 0x81, 0x345, 0x30e, 0x358, 0x6, 0x5f, 0x194, 0x22f, 0xa0, 0x20b, 0x39a, 0x3c1, 0x23f, 0x108, 0x262, 0xa9, 0xc1, 0x1ec, 0x2aa, 0x38f, 0x1d, 0x308, 0x307, 0x192, 0x270, 0x134, 0x24, 0x33a, 0x1ca, 0x1a5, 0x2c9, 0x5d, 0x1a1, 0x2a3, 0x145, 0x26b, 0x263, 0x2b7, 0x87, 0x31a, 0x29a, 0x177, 0xa6, 0x254, 0x20e, 0x1ee, 0x29f, 0x303, 0x1f8, 0x368, 0x2fe, 0xe4, 0x35, 0x118, 0x39d, 0x300, 0x3af, 0x293, 0x373, 0x352, 0x1ce, 0x39e, 0x35f, 0x87, 0x23d, 0x27a, 0x3aa, 0x272, 0x202, 0x2a0, 0x2d5, 0x296, 0x392, 0x223, 0x3c, 0x85, 0x257, 0x4a, 0x99, 0x7b, 0x155, 0x38f, 0x3a, 0x3b, 0xe, 0x116, 0x28b, 0x18b, 0x224, 0xb7, 0x3c4, 0x96, 0x158, 0x2c6, 0x199, 0x11e, 0x323, 0x159, 0x2f3, 0x81, 0x283, 0x23, 0x2f6, 0x60, 0x3f2, 0x1d1, 0x1ed, 0x168, 0x33f, 0x375, 0x3ec, 0x397, 0x2c2, 0x14d, 0x177, 0x14c, 0x142, 0x54, 0x2df, 0x354, 0x170, 0x1c7, 0x203, 0x295, 0x3cd, 0x10b, 0x92, 0x18c, 0x2af, 0x3f6, 0x105, 0x184, 0x307, 0x324, 0x1d2, 0x1b2, 0x240, 0x391, 0x27c, 0x314, 0x2b, 0x35e, 0xb2, 0x325, 0x1e7, 0xaa, 0x1dd, 0x91, 0x1d3, 0x187, 0x358, 0xc, 0x17c, 0xbb, 0x2b8, 0x2d, 0x3e0, 0x2eb, 0x279, 0x3f5, 0x15a, 0x2ac, 0x3a9, 0x22d, 0x12a, 0x20e, 0x6a, 0x69, 0xd7, 0x6c, 0x115, 0x1a1, 0x29e, 0x7d, 0x3d6, 0x351, 0x322, 0x2d8, 0x3b7, 0xd6, 0x6, 0x17c, 0x176, 0x2f2, 0x168, 0x277, 0x1cf, 0x35f, 0x10e, 0xe6, 0x3f4, 0x2de, 0x2cb, 0x1a0, 0x2f4, 0x14, 0x301, 0x33d, 0x237, 0x379, 0x129, 0xab, 0x3d0, 0x22d, 0x254, 0x2a, 0x2df, 0x2a1, 0x1c9, 0x223, 0x78, 0x214, 0x29c, 0xa9, 0x304, 0x2ff, 0x3fa, 0xf2, 0xf5, 0x1e3, 0xfc, 0x2d9, 0x3dd, 0xbf, 0xd1, 0x110, 0x63, 0x353, 0x3f6, 0x20a, 0x219, 0xe, 0x22c, 0x23e, 0x43, 0x208, 0x2cd, 0xdc, 0x382, 0x2e6, 0x269, 0x14a, 0x3f8, 0x26, 0x27, 0x4d, 0x24, 0xf3, 0x9f, 0x18a, 0x2b, 0x2b5, 0x2c8, 0x11e, 0x24f, 0x16d, 0x3b5, 0x2, 0xd4, 0xd2, 0x1ae, 0xd8, 0x22a, 0x342, 0x135, 0xfa, 0x3a5, 0x2ab, 0x24d, 0x1b9, 0x367, 0x1ac, 0xc, 0x2f8, 0x2ec, 0x1ed, 0x2d0, 0xe7, 0x39e, 0x2b7, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x1a8, 0x299, 0x1a5, 0xc3, 0x1af, 0x2c8, 0x71, 0xb1, 0x3e6, 0x28c, 0x12, 0x1e6, 0xf1, 0x12c, 0x1ad, 0x198, 0x14a, 0x3fb, 0x260, 0x1d2, 0x18b, 0x104, 0x193, 0x2e9, 0xbc, 0x1bc, 0x286, 0x219, 0x38, 0x288, 0x2bb, 0x390, 0x26c, 0x220, 0x318, 0x2aa, 0x8e, 0x13f, 0x1e3, 0x3f0, 0x1c3, 0x295, 0x257, 0x250, 0x201, 0x3d5, 0x3a7, 0x1ee, 0x1aa, 0x1c9, 0x9e, 0x389, 0x29, 0x196, 0x1e8, 0x53, 0x284, 0x149, 0x103, 0x1c2, 0x33d, 0xce, 0x3f5, 0x2c2, 0x27a, 0x16f, 0x19f, 0x11b, 0x22f, 0x212, 0x39b, 0x1cf, 0x167, 0xc4, 0x1fe, 0x31c, 0x3, 0x2f8, 0x3a2, 0x2ef, 0x145, 0x2f1, 0x351, 0x93, 0x1d3, 0x23, 0x39d, 0x36, 0x22a, 0x113, 0x374, 0x2f7, 0x2a8, 0x3de, 0x4, 0x2a9, 0x276, 0x29d, 0x30c, 0x2b5, 0x332, 0x1c4, 0x2c4, 0x383, 0x222, 0x48, 0x391, 0x3c4, 0xb9, 0x2bd, 0x269, 0x121, 0x3f7, 0x192, 0x350, 0x276, 0x133, 0x2b, 0x185, 0x34c, 0xfe, 0x4c, 0x270, 0x2c1, 0x104, 0x326, 0x3b6, 0x1e9, 0x3f6, 0x74, 0x369, 0x3f, 0x1bb, 0x1a7, 0x32f, 0x250, 0xb, 0x34f, 0x107, 0x2df, 0x125, 0x2bc, 0x38b, 0x2fb, 0x2b4, 0x13d, 0x16f, 0x33e, 0x65, 0x15c, 0x168, 0x39c, 0x33c, 0x2cc, 0x1b9, 0x30e, 0x3ca, 0x36, 0x5d, 0x45, 0x396, 0x323, 0x1bd, 0x255, 0x200, 0xf3, 0xf1, 0x258, 0x2bd, 0xdb, 0x8d, 0x387, 0x116, 0xea, 0x72, 0x9b, 0x110, 0x318, 0x15d, 0x238, 0x1ea, 0x20f, 0x2e7, 0x3c, 0x42, 0x334, 0x7a, 0x22d, 0x284, 0x292, 0x5, 0x20b, 0x3bc, 0x1f6, 0x87, 0x398, 0x267, 0x306, 0x17c, 0x3a2, 0x1d7, 0x11d, 0x3a5, 0x175, 0x244, 0x35, 0x1a4, 0x2d6, 0xc3, 0x35e, 0x332, 0x388, 0x302, 0x27, 0x268, 0x112, 0x1b1, 0x1b8, 0x5e, 0x1bc, 0x105, 0x76, 0x1c0, 0xda, 0x3dd, 0x1f1, 0x25, 0xc1, 0x2a9, 0x1ca, 0x18a, 0x2b0, 0xcc, 0x294, 0x3e7, 0x8b, 0xea, 0xe4, 0x26c, 0x92, 0x1ec, 0x3fa, 0x33b, 0xd5, 0x392, 0xf9, 0x1dc, 0xad, 0x29a, 0x16f, 0x275, 0x194, 0x2f2, 0x2ad, 0x37c, 0x2ab, 0x91, 0x21e, 0x1a4, 0x1a5, 0x30c, 0x2c6, 0x34c, 0x1fc, 0x130, 0x3a4, 0x43, 0xc8, 0x22, 0xc6, 0x2aa, 0x238, 0x3d4, 0x2e, 0x315, 0x3c0, 0x52, 0xab, 0x177, 0x1da, 0x340, 0x22f, 0x5a, 0x1ce, 0x33c, 0x191, 0x2ed, 0x46, 0xd7, 0x2c9, 0x36d, 0x2c8, 0x1c4, 0x302, 0x4e, 0x1b2, 0x82, 0x326, 0x365, 0x3ad, 0x38f, 0x349, 0x1e3, 0x3db, 0xf, 0x21, 0x334, 0xf4, 0xa6, 0xd, 0x17a, 0xa0, 0x3e0, 0x1cf, 0x195, 0x5b, 0x367, 0x2f6, 0x1b, 0x5d, 0x8a, 0x243, 0x12e, 0x3e6, 0x222, 0x120, 0x16e, 0xdc, 0x5e, 0x378, 0x1d, 0x3b0, 0x3f, 0x376, 0x295, 0x14e, 0x141, 0x160, 0x254, 0x2a0, 0x206, 0x20b, 0x15b, 0x321, 0x4b, 0x35a, 0x1b6, 0x61, 0x1c, 0x232, 0x3dd, 0x3cd, 0x250, 0x2c, 0x95, 0x150, 0x206, 0x1f, 0x1df, 0x2b7, 0x310, 0x3b7, 0x2f6, 0x36, 0x174, 0x59, 0x71, 0x181, 0x4e, 0x364, 0x208, 0x106, 0x235, 0x155, 0x238, 0x3a1, 0xb8, 0x9e, 0x77, 0x252, 0x29a, 0x2de, 0x1c6, 0xbb, 0x373, 0x11d, 0x28f, 0x37d, 0x4, 0x165, 0x9f, 0x12c, 0x173, 0x2d1, 0x184, 0x70, 0xda, 0x36f, 0x32f, 0x152, 0xb0, 0x254, 0x149, 0xa, 0x7c, 0x375, 0x2ce, 0x5b, 0x2c7, 0x3ca, 0xd8, 0x1d9, 0x164, 0x1c4, 0x20d, 0x138, 0x18b, 0x32, 0x11, 0xc6, 0x15d, 0xf2, 0x29f, 0x2e0, 0x278, 0x1dc, 0x15a, 0x27a, 0x36a, 0x311, 0x2ec, 0x1d7, 0x7d, 0x22e, 0x1ef, 0x10, 0x19d, 0x27c, 0xb9, 0x1c5, 0x356, 0x219, 0x1c0, 0x368, 0x1a7, 0xa7, 0x141, 0x2c0, 0x142, 0x12d, 0x28, 0x1f0, 0x1cf, 0x32a, 0x16c, 0x30e, 0x2b6, 0x9f, 0x258, 0x1c5, 0x2a5, 0x76, 0x21b, 0x2e5, 0x85, 0x19a, 0x1e8, 0x139, 0x1a0, 0x57, 0x2d0, 0x1be, 0x15f, 0x81, 0x350, 0x394, 0x4b, 0x2bd, 0x2d1, 0x308, 0x1c0, 0x2d9, 0x295, 0x131, 0x3d, 0xa6, 0x34, 0x38d, 0x5a, 0x331, 0x3ac, 0x91, 0x6a, 0x276, 0x18a, 0x2d2, 0xdb, 0x61, 0x38, 0xda, 0x2d7, 0xa7, 0x282, 0x312, 0x202, 0x2f4, 0x109, 0xe7, 0x271, 0x93, 0x10f, 0x348, 0x133, 0x158, 0x198, 0x8d, 0x7, 0x119, 0x3dd, 0x393, 0x152, 0x160, 0x142, 0x25a, 0xa0, 0x39b, 0xcf, 0x191, 0x3a6, 0x69, 0x1a5, 0x2b, 0x33, 0x294, 0x387, 0xa2, 0x2fe, 0x1f1, 0x128, 0x2c, 0x12a, 0x149, 0x14, 0x1f0, 0x39e, 0xb3, 0x372, 0x8c, 0x2b1, 0x186, 0x185, 0x256, 0x3f7, 0x116, 0x359, 0xbf, 0x25, 0x201, 0x127, 0xa8, 0x206, 0x3e, 0x375, 0x195, 0x16c, 0x215, 0xd7, 0x336, 0x2b5, 0x34c, 0x165, 0x27c, 0x2e4, 0x6f, 0x1d, 0x1bf, 0x3db, 0x78, 0x52, 0x151, 0x16f, 0x38c, 0x1d1, 0x2a3, 0x3bb, 0x16d, 0x146, 0x120, 0x362, 0x365, 0x157, 0x238, 0x29f, 0x392, 0x3c1, 0x3f5, 0xe6, 0x18e, 0x30, 0x28e, 0x8a, 0x23c, 0x302, 0x270, 0x43, 0x249, 0x92, 0x37b, 0x347, 0x36e, 0x1c2, 0x371, 0x2b7, 0x5b, 0x30e, 0xd7, 0x265, 0x2c6, 0x256, 0x3e7, 0x51, 0x2fe, 0x3e2, 0xa9, 0x160, 0x284, 0x17a, 0x109, 0x1ce, 0x1d6, 0x91, 0xd4, 0x1ca, 0x4b, 0x173, 0x356, 0x76, 0x3f, 0x386, 0x21, 0x196, 0x177, 0x2cb, 0x194, 0x3bd, 0x23a, 0x55, 0x363, 0x200, 0x32b, 0xdc, 0x2f0, 0x38f, 0x27e, 0x2e, 0x9e, 0x1dc, 0x161, 0x3e1, 0x306, 0x3ed, 0x1a1, 0x1cb, 0x12e, 0x30f, 0x1b2, 0x19, 0x22, 0x239, 0x3fa, 0x1ee, 0x125, 0x39a, 0xfb, 0x31, 0x3eb, 0x2f6, 0xd8, 0x36d, 0x26d, 0x1fc, 0x192, 0xea, 0x329, 0x2ca, 0x1e2, 0x30d, 0x2f9, 0x3a0, 0x303, 0x223, 0xee, 0x161, 0x3cb, 0x3, 0x357, 0x226, 0x11e, 0x302, 0xe9, 0x10c, 0x26c, 0x132, 0x3a3, 0x54, 0x5, 0x1f0, 0x263, 0x322, 0x10f, 0x13b, 0x314, 0x2bd, 0x356, 0xec, 0xfc, 0xf, 0x210, 0x2ac, 0x16f, 0x311, 0x34d, 0x135, 0x3ce, 0x1f3, 0x134, 0x104, 0x11, 0x239, 0x3fd, 0x3b1, 0x13a, 0x1de, 0x35f, 0x5b, 0x215, 0x35c, 0x30c, 0x33, 0x242, 0xe, 0xda, 0x34e, 0x262, 0x1e8, 0xed, 0x236, 0x1ed, 0x11d, 0x55, 0x2cf, 0x12, 0x16e, 0x1db, 0x2af, 0x238, 0x137, 0x253, 0x237, 0x327, 0xff, 0x358, 0x36, 0x3b2, 0x26d, 0x3f8, 0x241, 0x359, 0x2fc, 0x250, 0x160, 0x101, 0x1e1, 0x5a, 0xdf, 0x2be, 0x1, 0x2ca, 0x1e2, 0x30d, 0x2f9, 0x3a0, 0x303, 0x223, 0xee, 0x161, 0x3cb, 0x3, 0x357, 0x226, 0x11e, 0x302, 0xe9, 0x10c, 0x26c, 0x132, 0x3a3, 0x54, 0x19d, 0x381, 0x5e, 0x3c3, 0xf5, 0x170, 0x3e4, 0x3e3, 0x339, 0x1ac, 0x36, 0x36d, 0x1a6, 0x3ff, 0x51, 0x3ea, 0x257, 0x21a, 0x298, 0x289, 0x2f2, 0x11d, 0xaa, 0x32e, 0x90, 0x2cd, 0x31e, 0x2ba, 0x27f, 0x125, 0x273, 0x3ab, 0x5b, 0x23, 0x16b, 0x56, 0x330, 0xc2, 0x380, 0x1c3, 0x42, 0xab, 0x2b3, 0x311, 0x293, 0xdd, 0x24f, 0x30f, 0x2c1, 0x190, 0x92, 0x1f7, 0x15, 0x206, 0x1f0, 0xcf, 0x93, 0x6a, 0x394, 0x258, 0x233, 0x3a, 0x1e3, 0x38e, 0x77, 0x161, 0x39f, 0xc, 0x28e, 0x228, 0x388, 0x130, 0x75, 0x25b, 0x94, 0xb0, 0x101, 0x3c2, 0x168, 0x2f1, 0x3ba, 0x20, 0x3cc, 0xdc, 0x3d2, 0x8e, 0x29f, 0x253, 0x67, 0x87, 0x3f1, 0x1e5, 0x2c9, 0x163, 0xa5, 0x307, 0x232, 0x1a7, 0x262, 0x3d0, 0x3b4, 0x194, 0x2ef, 0x3e8, 0x16d, 0x111, 0x224, 0x106, 0x318, 0x3fd, 0x36b, 0xe1, 0x2eb, 0x195, 0x33a, 0x21f, 0x2f0, 0x47, 0x29f, 0xaf, 0x19c, 0x31, 0x367, 0xd7, 0x30c, 0xcc, 0x61, 0x380, 0x386, 0x108, 0x151, 0x36a, 0x2f8, 0x1a1, 0x243, 0x302, 0x3a4, 0xe4, 0x216, 0x2c, 0x284, 0x3c2, 0x2d0, 0x3d6, 0x1ef, 0x200, 0x16e, 0x365, 0x2aa, 0x33b, 0x125, 0xef, 0x2b7, 0x2d8, 0x230, 0x133, 0x1ad, 0x356, 0x3b0, 0x3db, 0x3c0, 0xad, 0x3e1, 0x6, 0x28e, 0x59, 0x23b, 0x192, 0x359, 0x3e2, 0x141, 0xa6, 0x340, 0x2f2, 0x23a, 0x2a8, 0x146, 0x112, 0x106, 0x239, 0x3ef, 0x36e, 0x20b, 0x1cf, 0x191, 0x21e, 0x1ca, 0x258, 0x6f, 0xe8, 0x303, 0x9e, 0x2fb, 0xe6, 0x6b, 0x1b, 0x36d, 0x34c, 0x3e7, 0x288, 0x2d7, 0x262, 0x3a9, 0x2cb, 0xbb, 0x2a3, 0x1e7, 0x3e6, 0x1b2, 0xc8, 0x92, 0x3ee, 0x54, 0x14, 0x33f, 0x1d6, 0x81, 0x165, 0x3c4, 0x5e, 0x38f, 0x3d4, 0x392, 0x237, 0x87, 0x3eb, 0x39d, 0x265, 0x27d, 0x6e, 0x3ad, 0x79, 0x354, 0x39a, 0x3ab, 0x16c, 0x230, 0x266, 0x2bd, 0x286, 0x37e, 0x38e, 0x1dc, 0x23d, 0x231, 0x1b, 0x2d3, 0x12b, 0x307, 0xda, 0x246, 0x196, 0x35d, 0x22b, 0xb5, 0x396, 0x181, 0x3a4, 0x1c8, 0x4a, 0x160, 0x1a, 0xae, 0x145, 0xaa, 0xa3, 0x112, 0x20c, 0xf6, 0x347, 0x285, 0x1f0, 0x33c, 0x122, 0x2b6, 0x3c4, 0xbc, 0x227, 0x29f, 0x15e, 0x279, 0x188, 0x215, 0x2d6, 0x2b0, 0x2d1, 0x1d8, 0x3db, 0x389, 0x2b4, 0x337, 0x60, 0x174, 0x26d, 0x3ff, 0x144, 0x2d7, 0xcd, 0x2bf, 0x275, 0x3a2, 0xdd, 0x12e, 0x9c, 0x10c, 0x344, 0xb, 0x142, 0x3c2, 0x1a9, 0x343, 0x363, 0x48, 0x193, 0xc6, 0x3fd, 0x1b7, 0x20b, 0x39e, 0x24d, 0xd4, 0x9f, 0x382, 0x3f6, 0xf5, 0x1c9, 0x237, 0x10e, 0x3b7, 0xd7, 0x211, 0x330, 0x308, 0x7e, 0x3c, 0x290, 0x1fa, 0x3, 0x28e, 0xb2, 0xfe, 0x8b, 0xf3, 0x1b8, 0x157, 0x399, 0x24a, 0x371, 0x25d, 0x283, 0x1ca, 0x172, 0x2f9, 0x27e, 0x1c9, 0x67, 0x31, 0x187, 0x16b, 0x2b0, 0x1ab, 0x369, 0x2e7, 0xee, 0x23d, 0x6b, 0x6c, 0x2b5, 0x294, 0x38, 0x2e5, 0x108, 0x14d, 0x2c5, 0x357, 0x228, 0x7f, 0x8b, 0x3ea, 0x29c, 0x3a9, 0x33e, 0x3a2, 0x1ba, 0xb1, 0xe9, 0xe4, 0x4a, 0x2c0, 0x68, 0x179, 0x7d, 0x16d, 0x9a, 0x32, 0x92, 0x3a3, 0x149, 0x109, 0x1be, 0x37d, 0x200, 0x1b1, 0x235, 0x3fa, 0x1b7, 0x1f, 0x263, 0x24c, 0x15b, 0x3c4, 0x178, 0x8e, 0xd5, 0x1cd, 0x3ab, 0x2d8, 0xd2, 0x314, 0x38a, 0x74, 0x20f, 0xf9, 0x3cf, 0x3fc, 0x39d, 0x186, 0x198, 0x308, 0xfc, 0xf0, 0xad, 0x39f, 0x60, 0x2e8, 0x1a6, 0x3c7, 0x6d, 0x246, 0x32c, 0x16f, 0x17c, 0x342, 0x23c, 0x98, 0x1d4, 0x3e2, 0x10d, 0x272, 0x194, 0x355, 0x3ce, 0x30f, 0x225, 0xd1, 0x201, 0x1e6, 0x2e9, 0x2aa, 0x1ee, 0x1c2, 0x1cf, 0x93, 0x2a9, 0x3c4, 0x2f0, 0x238, 0x2a1, 0xef, 0x195, 0x345, 0x1ca, 0x2e4, 0x3f6, 0x3d4, 0xaf, 0xfb, 0x5b, 0x230, 0x18a, 0x38a, 0xe8, 0x2e, 0x3c1, 0x87, 0x367, 0x2b1, 0x2b0, 0x356, 0x1bf, 0x315, 0x2fb, 0x339, 0x2f6, 0x265, 0xcc, 0x308, 0x1f8, 0x3c0, 0x161, 0x18e, 0x1b, 0x35e, 0x294, 0x70, 0x386, 0x52, 0xfd, 0x6, 0x5d, 0x26d, 0x3e7, 0x6d, 0x85, 0xab, 0x36a, 0x3ed, 0x8a, 0x23b, 0x8b, 0x3dd, 0x262, 0x177, 0x38c, 0xb5, 0x243, 0x26, 0xea, 0x3e2, 0x21a, 0x1da, 0xbb, 0x135, 0x12e, 0x270, 0xe4, 0x94, 0x312, 0x340, 0x3bd, 0x3bb, 0x3e6, 0x18b, 0x26c, 0x201, 0x284, 0x22f, 0x145, 0x2a8, 0x222, 0x19, 0x92, 0x34f, 0x12d, 0x5a, 0x3d6, 0x363, 0x120, 0x106, 0x1ec, 0x20e, 0x14, 0x1ce, 0x175, 0x40, 0x16e, 0x31e, 0x3fa, 0x36e, 0x7c, 0x3cc, 0x3b6, 0x17d, 0x2df, 0x3e, 0x33c, 0x102, 0xf3, 0x2e9, 0x15d, 0x3b1, 0x20b, 0xcf, 0x244, 0x33a, 0x1b8, 0x155, 0x1ee, 0x384, 0x335, 0x91, 0x2ca, 0x6e, 0x157, 0x27f, 0xe1, 0x1cf, 0x126, 0x2b6, 0x21f, 0x353, 0x399, 0x13a, 0x375, 0x24d, 0x2a9, 0x381, 0x3d2, 0x1e4, 0x24a, 0x1df, 0x191, 0x1a8, 0x1e2, 0x2f0, 0x79, 0x296, 0x371, 0x166, 0x6a, 0x27c, 0xbc, 0x11c, 0x2a1, 0x1de, 0x25d, 0x21e, 0x9f, 0x2f, 0x47, 0x1aa, 0x273, 0x195, 0x283, 0x321, 0x30d, 0x317, 0x26e, 0x39a, 0x167, 0x3a6, 0x1ca, 0x1c1, 0x3c3, 0x29f, 0x2e2, 0x35f, 0x2ed, 0x276, 0x172, 0x3f6, 0x3a1, 0x2bc, 0x3d1, 0x1b9, 0x299, 0x258, 0x2f9, 0x1ea, 0xaf, 0x1f6, 0x16c, 0x1a4, 0x96, 0x1bc, 0x27e, 0x32d, 0x279, 0x5b, 0x69, 0x221, 0x6f, 0x29b, 0x1c9, 0x19c, 0x310, 0x118, 0x18a, 0x31d, 0x3a0, 0x170, 0x67, 0xc4, 0x46, 0x391, 0x2c3, 0x3fa, 0x1a3, 0x3c9, 0x2ab, 0x20, 0x2dc, 0xc6, 0x3a7, 0x5, 0x1ce, 0x1dd, 0x9, 0x326, 0xf6, 0x15, 0xa0, 0x1be, 0x3de, 0x120, 0x11, 0x2ff, 0x2a0, 0x2d, 0x3a5, 0x32e, 0x41, 0x220, 0x34f, 0xbd, 0x1a9, 0x55, 0x111, 0x32, 0x99, 0x12a, 0x38d, 0x145, 0x2b2, 0x268, 0x249, 0x304, 0x101, 0x15c, 0xfa, 0x2fd, 0x18b, 0x1a2, 0x58, 0x68, 0x3da, 0x37f, 0x30f, 0x10c, 0x25, 0x312, 0x11b, 0x3ae, 0x323, 0x138, 0x1c8, 0xa9, 0x298, 0x328, 0x135, 0xb1, 0x341, 0x17e, 0x10d, 0x3b4, 0x1d1, 0x2e1, 0x20d, 0xea, 0x393, 0x1e8, 0x275, 0x25e, 0x8f, 0x130, 0x17f, 0x29c, 0x177, 0x22b, 0x342, 0x1c4, 0x241, 0x3b3, 0x334, 0x2b3, 0x1f9, 0x8a, 0xfe, 0xa2, 0x295, 0x251, 0x2dd, 0x357, 0x164, 0x3ff, 0x6d, 0x214, 0x2a2, 0x306, 0x22a, 0xd3, 0x307, 0x1bb, 0x210, 0xfd, 0x18, 0x1d9, 0x256, 0x32b, 0x31e, 0x3ef, 0x206, 0x1ce, 0x3ba, 0x24, 0x106, 0x37b, 0x2a0, 0x5a, 0x28f, 0x146, 0x19, 0x99, 0x254, 0x22f, 0x23a, 0x37a, 0x18b, 0x344, 0x160, 0x340, 0x1d7, 0x323, 0x270, 0x329, 0x141, 0x1da, 0x1d1, 0x1cb, 0x26, 0x359, 0x14e, 0x177, 0x5f, 0x113, 0x23b, 0x51, 0x295, 0xab, 0x366, 0x28e, 0x26d, 0x307, 0x376, 0x52, 0x3e1, 0x180, 0x35e, 0x8d, 0x3f, 0x3c0, 0x31a, 0x358, 0x265, 0x269, 0x3b0, 0x315, 0x3f5, 0x3eb, 0x2b1, 0x1ad, 0x1d, 0x2e, 0x237, 0x188, 0x230, 0x4b, 0x378, 0x3d4, 0x171, 0x2b7, 0x345, 0x24b, 0x5e, 0x238, 0x125, 0x3be, 0x93, 0x165, 0xdc, 0x2aa, 0x36b, 0x7c, 0x1d6, 0x8, 0x16e, 0xc6, 0x347, 0x14, 0x26b, 0x1ef, 0x120, 0x22, 0x3ee, 0x12d, 0x2d0, 0x55, 0x222, 0xc8, 0xc1, 0x284, 0x15c, 0x1f4, 0x3e6, 0x43, 0x216, 0x312, 0x236, 0x2a3, 0x12e, 0x3a4, 0x17e, 0x25f, 0x63, 0x347, 0x28, 0x1be, 0x363, 0x224, 0x49, 0x24e, 0x38d, 0x11d, 0x37a, 0x316, 0x10b, 0x312, 0x65, 0x29e, 0x162, 0x23e, 0x393, 0x3a9, 0x311, 0x28d, 0x23b, 0xa2, 0x246, 0x151, 0x205, 0x174, 0x256, 0xe0, 0x3c, 0x161, 0xd6, 0x336, 0x269, 0x369, 0x4f, 0x397, 0x2c7, 0x29d, 0x38a, 0x29b, 0x253, 0x3d1, 0x1d3, 0x321, 0x5e, 0x79, 0x9d, 0x1cf, 0x122, 0xf3, 0x365, 0x3fd, 0x103, 0x1ce, 0x37d, 0x90, 0x22, 0x3d5, 0xbd, 0x2ad, 0x159, 0xd9, 0x26c, 0x58, 0x1a0, 0x1d7, 0x24f, 0x1d2, 0x17e, 0x3d, 0x33e, 0xb5, 0x71, 0x241, 0x2d7, 0x32c, 0x1b3, 0x28e, 0xd3, 0x7, 0x386, 0x129, 0xc7, 0xd8, 0x33, 0x3b, 0x2e7, 0x1ff, 0x3f1, 0x2b1, 0x35a, 0x74, 0x170, 0x338, 0x16c, 0x13b, 0x1c1, 0x227, 0x2a1, 0x2eb, 0x24d, 0x165, 0x1b8, 0x2ba, 0x36e, 0x3c9, 0x2be, 0x200, 0x245, 0x3b9, 0x2a0, 0xb7, 0x18c, 0x20e, 0x280, 0x3a5, 0x146, 0x64, 0x182, 0xd, 0x3da, 0x3ce, 0x270, 0xbf, 0x3d, 0x275, 0x2d4, 0x388, 0x51, 0x246, 0x2a2, 0x6, 0x3b2, 0x121, 0x3f, 0x31b, 0x1cc, 0x39d, 0x158, 0x105, 0x2e, 0xce, 0xb6, 0x13b, 0x382, 0x8e, 0x125, 0x2e3, 0x122, 0x1e6, 0x18f, 0x3d7, 0x14, 0x1be, 0x2cf, 0x82, 0x248, 0xa1, 0x15c, 0x3d9, 0x217, 0xe4, 0x2a4, 0x3b4, 0x293, 0x11e, 0x324, 0x2d7, 0x251, 0x2c5, 0x5d, 0x12b, 0xe0, 0x78, 0x18d, 0x2b9, 0x30c, 0x1ab, 0x3c6, 0x3c1, 0xc4, 0x69, 0x258, 0x3c3, 0x1aa, 0x371, 0x24d, 0x2ca, 0x2e9, 0x1fd, 0x285, 0x1ce, 0x2f3, 0x240, 0x110, 0x127, 0x38d, 0x23a, 0x1f3, 0x86, 0x94, 0x298, 0x176, 0x1cb, 0x98, 0x1f5, 0x334, 0x1b5, 0x2a7, 0x26d, 0x7, 0x305, 0xad, 0x231, 0x19b, 0x269, 0x2db, 0x13c, 0x87, 0x23, 0x314, 0x378, 0x34b, 0x33d, 0xb3, 0x16e, 0x239, 0x54, 0x5a, 0x55, 0x134, 0x26c, 0x160, 0x236, 0x135, 0x302, 0x359, 0x262, 0x16f, 0x357, 0x26d, 0xe, 0xf, 0x161, 0x358, 0x30c, 0x356, 0x303, 0x237, 0x5b, 0x13b, 0x30d, 0x238, 0x13a, 0x263, 0x1, 0x16e, 0x239, 0x54, 0x5a, 0x55, 0x134, 0x26c, 0x160, 0x236, 0x135, 0x302, 0x359, 0x262, 0x16f, 0x357, 0x26d, 0xe, 0xf, 0x161, 0x358, 0x30c, 0x356, 0x303, 0x237, 0x5b, 0x13b, 0x30d, 0x238, 0x13a, 0x263, 0x1, 0x16e, 0x239, 0x54, 0x5a, 0x55, 0x134, 0x26c, 0x160, 0x236, 0x135, 0x302, 0x359, 0x262, 0x16f, 0x357, 0x26d, 0xe, 0xf, 0x161, 0x358, 0x30c, 0x356, 0x303, 0x237, 0x5b, 0x13b, 0x30d, 0x238, 0x13a, 0x263, 0x1, 0x16e, 0x239, 0x54, 0x5a, 0x55, 0x134, 0x26c, 0x160, 0x236, 0x135, 0x302, 0x359, 0x262, 0x16f, 0x357, 0x26d, 0xe, 0xf, 0x161, 0x358, 0x30c, 0x2dc, 0xf6, 0x2a0, 0x1a9, 0x2b2, 0x18b, 0x25, 0x298, 0x1d1, 0x8f, 0x241, 0x295, 0x2a2, 0x18, 0x35e, 0xc2, 0x377, 0x3f5, 0x2c7, 0xc5, 0x378, 0x137, 0x3bc, 0x93, 0x27d, 0x18f, 0x347, 0x140, 0x343, 0x222, 0x9b, 0xb0, 0x236, 0x26a, 0x13, 0x2fe, 0x261, 0x1b3, 0x5d, 0xa5, 0x21b, 0x23f, 0x27b, 0x35c, 0x173, 0x29b, 0x2bc, 0x195, 0x1a8, 0x6e, 0x17d, 0x285, 0x331, 0x363, 0x104, 0x264, 0xd, 0x373, 0x97, 0x11f, 0x257, 0x1d5, 0x3ed, 0x199, 0x7, 0xf, 0x2c2, 0x17b, 0x56, 0x105, 0xb8, 0xfb, 0x1d3, 0x13e, 0x3ad, 0x3dc, 0x1f0, 0x175, 0x48, 0x88, 0x24e, 0x57, 0x3d9, 0x4e, 0x25b, 0x7a, 0x38c, 0x226, 0x3f9, 0x368, 0xa4, 0xc7, 0x2c9, 0xdb, 0x2f5, 0x3c1, 0x310, 0x299, 0x30d, 0x79, 0xe1, 0x33c, 0x10, 0x193, 0x37b, 0x25a, 0x2a6, 0x37a, 0x86, 0x250, 0x1da, 0x12f, 0xe2, 0x51, 0x1b1, 0x3d8, 0x12d, 0x2a6, 0x2fd, 0x218, 0x2a4, 0x19f, 0x1a1, 0xfe, 0xda, 0x52, 0xc7, 0x19b, 0x36c, 0x385, 0x67, 0x2d8, 0x321, 0x1e9, 0x1ee, 0x1f0, 0x2ea, 0x120, 0x49, 0xa1, 0x2f2, 0x395, 0x341, 0x32f, 0x1d5, 0x3d3, 0x26d, 0x38, 0xf0, 0xe6, 0x26f, 0x35a, 0x349, 0x2bc, 0x32a, 0x2a9, 0x370, 0x3fd, 0x14, 0x1eb, 0x28c, 0x249, 0xb0, 0x65, 0x1ba, 0x98, 0x3b3, 0xab, 0x3, 0x2d3, 0x61, 0x377, 0x3e3, 0x30e, 0x221, 0x3e5, 0x2a1, 0x2e3, 0x102, 0x16e, 0xf6, 0x149, 0x2ad, 0x1bd, 0x86, 0xa9, 0x361, 0x16a, 0x23b, 0x232, 0x210, 0x337, 0x360, 0xdb, 0x1e3, 0x31f, 0xb6, 0x1ca, 0x178, 0x27f, 0x7c, 0x2be, 0x48, 0x110, 0x12a, 0x2b8, 0x1e7, 0x1d2, 0x3cd, 0x177, 0x3f2, 0x199, 0xe, 0x3c, 0x23d, 0x39d, 0x2d2, 0x1d0, 0xaf, 0x2ce, 0x1a8, 0xdc, 0x1fd, 0x5, 0x37c, 0xa3, 0x190, 0x2c, 0x362, 0x37b, 0x17a, 0x23a, 0x30f, 0x329, 0xf4, 0x5f, 0x59, 0x307, 0xf, 0x31a, 0x39d, 0x1ad, 0x349, 0x171, 0xb3, 0x165, 0x365, 0x347, 0x109, 0x55, 0x1b2, 0x216, 0x139, 0x293, 0x1c4, 0x288, 0x108, 0x337, 0x2c9, 0x36c, 0x303, 0x19c, 0x2ed, 0x27c, 0x157, 0x36e, 0x1ce, 0x363, 0x19, 0x201, 0x340, 0x135, 0x26, 0x3dd, 0xab, 0x6, 0x35e, 0x308, 0x315, 0x87, 0x230, 0x2e4, 0x238, 0x1c2, 0x1d6, 0x200, 0x22, 0x24e, 0x15c, 0x1e7, 0x3a4, 0x32f, 0x3aa, 0x357, 0x34c, 0x380, 0x23f, 0x1fe, 0x1a5, 0x6f, 0x29f, 0x371, 0x91, 0x32b, 0x239, 0x2a0, 0x2ad, 0x37a, 0x218, 0x141, 0x275, 0x113, 0x3fb, 0x376, 0xad, 0x358, 0x56, 0x1d, 0x392, 0x2b7, 0xd4, 0xdc, 0x3fa, 0x14, 0x3d6, 0x222, 0x26c, 0x312, 0xbb, 0x243, 0x8b, 0x85, 0xfd, 0x1b, 0xcc, 0x1bf, 0x3c1, 0x5b, 0x1ca, 0x2f0, 0x1ee, 0x3e0, 0x2cd, 0x1f7, 0x3c2, 0x3e8, 0x138, 0x3e2, 0x2ee, 0x3af, 0x34c, 0x309, 0xee, 0x3eb, 0x266, 0x1fb, 0x2a1, 0x39e, 0x4, 0x326, 0x3d5, 0x313, 0x3bb, 0xe9, 0x393, 0x3aa, 0x2a7, 0x12b, 0x3f, 0x3b8, 0x3b7, 0x18a, 0x3e5, 0x296, 0x263, 0x10, 0x83, 0x34f, 0x57, 0x2f7, 0x3a4, 0x257, 0x2b3, 0x28e, 0xa5, 0xfc, 0x2fb, 0x2c7, 0x221, 0x38f, 0x24a, 0x19e, 0x40, 0x20c, 0x127, 0x15c, 0x3ce, 0x28b, 0x14e, 0x2de, 0x22a, 0x294, 0x3f0, 0x3fe, 0x30e, 0x96, 0x227, 0x13a, 0x271, 0x100, 0x22, 0x95, 0x179, 0x323, 0x23e, 0x131, 0x36a, 0xba, 0x242, 0x3db, 0x3e3, 0x23, 0x258, 0x8e, 0xe1, 0x1d6, 0x9, 0x88, 0x254, 0x1ed, 0x97, 0xea, 0xcd, 0x1b3, 0x2e8, 0x11a, 0x377, 0x397, 0x8c, 0x172, 0x238, 0x384, 0x351, 0x24, 0x220, 0x142, 0x3bd, 0x25c, 0x3a8, 0x334, 0x2c5, 0x3b2, 0x61, 0x1c7, 0x247, 0x230, 0x193, 0x3d5, 0x22f, 0x2f7, 0x341, 0x14e, 0x1b5, 0xba, 0x8d, 0x377, 0x327, 0x230, 0x382, 0x3c8, 0x7c, 0x1dd, 0x224, 0xc1, 0x1a0, 0x26a, 0x130, 0x34e, 0x13d, 0x1b, 0x330, 0x3c6, 0x19c, 0x3a6, 0x381, 0x17d, 0xa, 0x3a5, 0x134, 0x10b, 0x272, 0xb5, 0xfe, 0x2d9, 0xad, 0x17b, 0x169, 0x349, 0x1cd, 0x322, 0x1e6, 0x318, 0x149, 0x145, 0x383, 0x25b, 0x3a9, 0x3f2, 0xd3, 0x380, 0xee, 0x3df, 0x18a, 0x3c3, 0x24a, 0x33c, 0x100, 0x44, 0x254, 0x3da, 0x25c, 0x359, 0xcb, 0x205, 0x35e, 0x3b, 0x13c, 0x188, 0xe5, 0x1e9, 0x36b, 0xe7, 0x2cf, 0xc8, 0xb0, 0x328, 0x243, 0x22c, 0x42, 0x337, 0x336, 0x2a5, 0x170, 0x35f, 0x1a8, 0x2e9, 0x3a7, 0x212, 0x2a8, 0x225, 0x152, 0x275, 0x45, 0x3c7, 0xf, 0x73, 0x1ae, 0x38a, 0x34b, 0x2eb, 0x81, 0x1b1, 0x2ff, 0x3c2, 0x3d9, 0xe9, 0x32f, 0x2b3, 0x115, 0x294, 0x326, 0x34f, 0x15c, 0x323, 0xea, 0x334, 0x306, 0x35e, 0x76, 0xf9, 0x5b, 0x24b, 0x157, 0x346, 0x37c, 0x222, 0x344, 0x139, 0xb5, 0x1fc, 0x376, 0x161, 0x39d, 0x173, 0x3d4, 0x371, 0x81, 0x362, 0x3ee, 0x22f, 0x1e7, 0x11f, 0x262, 0x366, 0x36d, 0x308, 0x9e, 0x188, 0x1ca, 0x3ad, 0x36e, 0x26b, 0x146, 0x26c, 0xa6, 0x293, 0x23b, 0x368, 0xad, 0x2f6, 0x1ad, 0x27e, 0xef, 0x91, 0x16e, 0x37b, 0x3c2, 0x3bb, 0x3a4, 0x14e, 0x36a, 0x2e8, 0x61, 0x315, 0x31, 0x13b, 0x2f0, 0x36b, 0x1ce, 0x32e, 0x249, 0x312, 0x1d1, 0x1c4, 0x6d, 0x290, 0x358, 0x2b0, 0x349, 0x39a, 0x93, 0x32b, 0x1ec, 0x17a, 0x1f4, 0x270, 0x32f, 0x16f, 0x5d, 0x8d, 0x2e7, 0x87, 0x1a4, 0x5e, 0x1ee, 0x33f, 0x363, 0xc8, 0x160, 0xbb, 0x23c, 0x288, 0x52, 0x6b, 0x56, 0xe8, 0x171, 0x191, 0x1e6, 0x239, 0x12d, 0x23a, 0x4e, 0x3e2, 0x245, 0x127, 0x2f2, 0x25c, 0x17f, 0xab, 0x60, 0x66, 0x1e3, 0x338, 0x10f, 0xdc, 0x3d7, 0x2d, 0x16d, 0x39, 0x7a, 0x2f8, 0xd3, 0x21b, 0x2fb, 0x215, 0x172, 0x1e4, 0xf8, 0x2f3, 0x19, 0x58, 0x259, 0x23c, 0x119, 0x148, 0x358, 0x169, 0x13f, 0xef, 0x122, 0x1b1, 0x3ee, 0x57, 0x395, 0xea, 0x261, 0x3, 0x2c6, 0x369, 0x31f, 0x2ed, 0x381, 0x1fd, 0xa0, 0xaa, 0x225, 0x141, 0x311, 0x164, 0x70, 0x77, 0x3b7, 0x4b, 0x8e, 0x301, 0x175, 0x224, 0x304, 0x236, 0x396, 0x22c, 0x108, 0x31c, 0x2b, 0xe8, 0x2e2, 0x24d, 0x32b, 0x3d8, 0x1e1, 0x3bb, 0x341, 0x131, 0x366, 0x2d3, 0x3b, 0xf9, 0xb6, 0x13e, 0x2aa, 0x5, 0x343, 0x1b2, 0x128, 0x33e, 0x8a, 0x207, 0x1e0, 0x1fe, 0x266, 0x3c3, 0x13a, 0x3ac, 0x90, 0x99, 0xd0, 0xdd, 0x192, 0x10a, 0x39f, 0x265, 0x105, 0x253, 0xb3, 0x27d, 0x318, 0x12d, 0x83, 0x95, 0x3bd, 0x181, 0x3b3, 0x29a, 0x6c, 0x2d1, 0x170, 0x2ce, 0x2ca, 0xc6, 0x292, 0x7d, 0x270, 0xa7, 0x2dd, 0x36d, 0x3b, 0x1f2, 0x2d8, 0x1e2, 0x2fa, 0xa0, 0x154, 0x86, 0x21a, 0x17c, 0xd3, 0x3f, 0x3fe, 0x8c, 0x30d, 0xf7, 0x277, 0x32e, 0x136, 0x14c, 0xb5, 0x3f9, 0x305, 0xe6, 0x2d6, 0x2f9, 0x125, 0xeb, 0x48, 0x99, 0x1a0, 0x374, 0x8b, 0x84, 0x31c, 0x56, 0x3a0, 0x33d, 0x91, 0x1b1, 0x3d5, 0x15c, 0x97, 0x2bb, 0xab, 0xc0, 0x198, 0x303, 0x3ec, 0x1a8, 0x365, 0x2a, 0x153, 0x30f, 0x1f1, 0x35d, 0x5d, 0x234, 0x223, 0x188, 0x321, 0x2ae, 0x206, 0x343, 0x364, 0xa9, 0x1c6, 0xb2, 0x70, 0xee, 0x2c7, 0x258, 0xf2, 0xf8, 0x1ef, 0x64, 0x2c0, 0x1d1, 0x319, 0x2d9, 0x161, 0x26f, 0x31d, 0xd5, 0x335, 0x80, 0x110, 0x202, 0x14f, 0x130, 0x246, 0x3cb, 0x265, 0x20a, 0x15e, 0x191, 0x106, 0x254, 0x1d7, 0x26, 0x295, 0x3e1, 0x265, 0x1d, 0x171, 0x93, 0x16e, 0x3ee, 0x15c, 0x12e, 0x2fe, 0x151, 0x1b, 0x36c, 0x170, 0x195, 0x33a, 0x239, 0x17a, 0x3bb, 0x11f, 0x334, 0x6, 0x21d, 0x1e3, 0xfb, 0xd4, 0x365, 0x54, 0x145, 0x4e, 0x32f, 0x36a, 0x36d, 0x76, 0x3c1, 0x2ed, 0x21f, 0x3ef, 0x5a, 0x37a, 0x329, 0x177, 0x28e, 0x8d, 0x315, 0x188, 0x24b, 0x2aa, 0x14, 0x55, 0x43, 0x21a, 0x2f8, 0x34c, 0x1f8, 0x397, 0x1a4, 0x2f0, 0x36e, 0x37c, 0x134, 0x94, 0x275, 0x59, 0x70, 0x1dc, 0x30e, 0x2e4, 0x33b, 0x33f, 0x32e, 0x26c, 0x139, 0x1a1, 0x3e7, 0x78, 0x1fe, 0x18a, 0x47, 0x20b, 0x3ba, 0x19, 0x160, 0x1d1, 0x23b, 0x376, 0x31a, 0x2b1, 0x378, 0x125, 0x1d6, 0x120, 0xc1, 0x236, 0x243, 0x288, 0x290, 0x2f6, 0x173, 0x29f, 0x1cf, 0x40, 0x110, 0xd, 0x135, 0x192, 0x21, 0x18e, 0x56, 0x20c, 0x142, 0x2a3, 0x260, 0x214, 0x18e, 0xac, 0x13f, 0x371, 0x2, 0x11, 0x284, 0x14f, 0xc9, 0x21, 0x31c, 0x158, 0x27e, 0x2eb, 0x4, 0x22, 0x101, 0x29e, 0x192, 0x42, 0x231, 0x2b0, 0xf5, 0x1df, 0x8, 0x44, 0x202, 0x135, 0x324, 0x84, 0x6b, 0x169, 0x1ea, 0x3be, 0x10, 0x88, 0xd, 0x26a, 0x241, 0x108, 0xd6, 0x2d2, 0x3d4, 0x375, 0x20, 0x110, 0x1a, 0xdd, 0x8b, 0x210, 0x1ac, 0x1ad, 0x3a1, 0x2e3, 0x40, 0x220, 0x34, 0x1ba, 0x116, 0x29, 0x358, 0x35a, 0x34b, 0x1cf, 0x80, 0x49, 0x68, 0x374, 0x22c, 0x52, 0x2b9, 0x2bd, 0x29f, 0x39e, 0x100, 0x92, 0xd0, 0x2e1, 0x51, 0xa4, 0x17b, 0x173, 0x137, 0x335, 0x200, 0x124, 0x1a0, 0x1cb, 0xa2, 0x148, 0x2f6, 0x2e6, 0x26e, 0x263, 0x9, 0x248, 0x340, 0x396, 0x144, 0x290, 0x1e5, 0x1c5, 0xd5, 0xcf, 0x12, 0x99, 0x289, 0x325, 0x288, 0x11, 0x101, 0x135, 0x241, 0x210, 0x358, 0x2bd, 0x137, 0x263, 0x12, 0x132, 0x236, 0x11e, 0xda, 0x161, 0x35c, 0x2f9, 0x13a, 0x2be, 0x104, 0x160, 0x34d, 0x3f8, 0xf, 0xff, 0x314, 0x238, 0x1f0, 0x2cf, 0x26c, 0xed, 0x226, 0xe, 0xee, 0x215, 0x30d, 0x3b1, 0xdf, 0x134, 0x250, 0x311, 0x26d, 0xfc, 0x327, 0x13b, 0x2af, 0x5, 0x55, 0x10c, 0x1e8, 0x357, 0x242, 0x223, 0x5b, 0x1e2, 0x3fd, 0x5a, 0x1f3, 0x2fc, 0x16f, 0x3b2, 0xec, 0x237, 0x10f, 0x1db, 0x54, 0x11d, 0xe9, 0x262, 0x3, 0x33, 0x303, 0x35f, 0x2ca, 0x239, 0x1e1, 0x3ce, 0x359, 0x2ac, 0x36, 0x356, 0x253, 0x322, 0x16e, 0x3a3, 0x1ed, 0x302, 0x34e, 0x3cb, 0x30c, 0x3a0, 0x1de, 0x1, 0x11, 0x101, 0x135, 0x241, 0x210, 0x358, 0x2bd, 0x137, 0x263, 0x12, 0x132, 0x236, 0x11e, 0xda, 0x161, 0x35c, 0x2f9, 0x13a, 0x2be, 0x104, 0x160, 0x22, 0xd, 0x1ba, 0x51, 0x290, 0x39d, 0x6f, 0x125, 0x2ab, 0x82, 0x160, 0x293, 0x3fb, 0x78, 0x3eb, 0x258, 0x33b, 0x1ce, 0x222, 0x94, 0x38c, 0x26d, 0x1f8, 0x87, 0x1ca, 0x2aa, 0xa0, 0x16d, 0x329, 0x3aa, 0x2e8, 0x76, 0x237, 0x21e, 0x365, 0x2a0, 0x1f4, 0x11f, 0x196, 0x180, 0x36c, 0x392, 0x191, 0x16e, 0x34f, 0x3bd, 0x26, 0x85, 0x18e, 0x2b0, 0x3d4, 0x1cf, 0x200, 0x99, 0x236, 0x23c, 0x368, 0x31a, 0x1a5, 0x38f, 0x20b, 0x1ef, 0x249, 0x139, 0x113, 0xe, 0x1dc, 0x46, 0x5e, 0x36e, 0x3d6, 0x18b, 0x21a, 0x3ed, 0x294, 0x315, 0x5b, 0x3c4, 0x3ef, 0x2d0, 0x30f, 0x32f, 0x366, 0x2c6, 0x1e3, 0x3d1, 0x165, 0x239, 0x3c2, 0x323, 0x2fe, 0x29a, 0x2c9, 0x1d, 0x39a, 0x81, 0x106, 0x284, 0x135, 0x8b, 0x52, 0x2f6, 0x38a, 0x2a1, 0x1d6, 0x112, 0x2c, 0x1d1, 0x1fc, 0xf, 0x1fe, 0x4b, 0x1e4, 0x33f, 0x44, 0x34, 0x1cb, 0x119, 0x2b4, 0x2b1, 0x3e5, 0x301, 0x1ef, 0x9b, 0xed, 0x8a, 0xe0, 0x3fe, 0x1a4, 0x353, 0xa, 0x2a8, 0x1c8, 0x1d5, 0x2e8, 0xec, 0xce, 0xd4, 0x235, 0xbd, 0x1e7, 0x2bb, 0x14d, 0x2c9, 0x3a, 0x273, 0x1, 0x44, 0x34, 0x1cb, 0x119, 0x2b4, 0x2b1, 0x3e5, 0x301, 0x1ef, 0x9b, 0xed, 0x8a, 0xe0, 0x3fe, 0x1a4, 0x353, 0xa, 0x2a8, 0x1c8, 0x1d5, 0x2e8, 0xec, 0xce, 0xd4, 0x235, 0xbd, 0x1e7, 0x2bb, 0x14d, 0x2c9, 0x3a, 0x273, 0x1, 0x44, 0x34, 0x1cb, 0x119, 0x2b4, 0x2b1, 0x3e5, 0x301, 0x1ef, 0x9b, 0xed, 0x8a, 0xe0, 0x3fe, 0x1a4, 0x353, 0xa, 0x2a8, 0x1c8, 0x1d5, 0x2e8, 0xec, 0xce, 0xd4, 0x235, 0xbd, 0x1e7, 0x2bb, 0x14d, 0x2c9, 0x3a, 0x273, 0x1, 0x44, 0x34, 0x1cb, 0x119, 0x2b4, 0x2b1, 0x3e5, 0x301, 0x1ef, 0x9b, 0xed, 0x8a, 0xe0, 0x3fe, 0x1a4, 0x88, 0xd0, 0x243, 0x1b4, 0x23d, 0x133, 0x11c, 0x3c9, 0x146, 0x4a, 0x311, 0x34c, 0x377, 0x310, 0x3c4, 0x3a7, 0x153, 0x270, 0x19a, 0x60, 0x36c, 0x253, 0x126, 0x326, 0x142, 0x26a, 0x51, 0x252, 0x1ae, 0x3f6, 0x301, 0x3de, 0x26c, 0x361, 0xb2, 0x3f, 0x247, 0x394, 0x17d, 0x2d, 0x3c5, 0x32f, 0x183, 0x33, 0x2e, 0x25d, 0x25f, 0x34f, 0x2ef, 0x260, 0x108, 0x17b, 0x31d, 0x125, 0x2be, 0x32, 0xa6, 0x28d, 0x1c, 0x2fb, 0xd2, 0x353, 0x14, 0x2b2, 0x25b, 0x16f, 0x1af, 0x37e, 0x3d1, 0x19d, 0x3d8, 0x15c, 0x181, 0x123, 0x18e, 0x2d2, 0x137, 0x33c, 0x89, 0x58, 0x293, 0x3f7, 0x389, 0x30e, 0x2f, 0x2d5, 0x28f, 0x10c, 0x35b, 0x5d, 0x3b, 0x67, 0xd4, 0x63, 0x2f4, 0x323, 0x3ea, 0x1fa, 0x30c, 0x13f, 0x375, 0x200, 0x264, 0x328, 0x23b, 0x203, 0x3fc, 0x258, 0xf7, 0xdf, 0x1b2, 0x10d, 0x3d3, 0x8d, 0x110, 0x340, 0x23c, 0x376, 0x339, 0x4b, 0x33b, 0x26b, 0x1b2, 0x21a, 0x357, 0x61, 0x3c1, 0x21e, 0x31e, 0x17a, 0x323, 0x3dd, 0x3e1, 0x56, 0x3d4, 0x263, 0x120, 0x2c, 0x293, 0x3e7, 0x23f, 0x46, 0x2f0, 0x206, 0x2a8, 0x329, 0x16f, 0x35e, 0x1e3, 0x2b7, 0x1e6, 0x3ee, 0x3bd, 0x130, 0x108, 0x2f6, 0x6f, 0x13a, 0x3ba, 0x249, 0x1da, 0x59, 0x3f, 0x87, 0x24b, 0x3fa, 0x2d0, 0x4e, 0x262, 0x30, 0x36c, 0xaf, 0x91, 0x106, 0xd, 0x1cb, 0x6d, 0x31a, 0x133, 0x238, 0x33f, 0x222, 0xa9, 0x2f8, 0x294, 0x9e, 0x2ed, 0x2e9, 0x2a0, 0x3bb, 0x359, 0x29a, 0x265, 0x349, 0x3be, 0x200, 0xc1, 0xbb, 0x1fc, 0x78, 0x367, 0x30d, 0x36e, 0x28f, 0x218, 0x177, 0x2e8, 0x3b0, 0xfb, 0x165, 0x1ec, 0x15c, 0x302, 0x85, 0x6b, 0x173, 0x2a1, 0x2ab, 0x19, 0xa6, 0x113, 0x70, 0x3f5, 0x13b, 0x2aa, 0x109, 0x3e6, 0x32f, 0x220, 0x11b, 0x1c4, 0x305, 0x3f1, 0x2e4, 0x2df, 0x343, 0x218, 0x2ee, 0x3b2, 0x1bf, 0x3ab, 0xf3, 0x3ee, 0x373, 0xc9, 0x52, 0x333, 0x1fb, 0x20b, 0x2cf, 0x10b, 0x38c, 0x291, 0x38e, 0x2d8, 0x1b8, 0x150, 0x3bb, 0x2bb, 0x27a, 0x30c, 0xf5, 0x335, 0x120, 0x58, 0x25e, 0x307, 0x3b8, 0xd2, 0x157, 0x140, 0x1f3, 0x32f, 0x205, 0x330, 0x392, 0x126, 0x83, 0xd, 0x396, 0x1b4, 0xe6, 0x314, 0x399, 0x26b, 0x364, 0x7a, 0x28e, 0x219, 0xce, 0x2a9, 0x7b, 0xae, 0x302, 0x10a, 0x1ac, 0x38a, 0x24a, 0x1dd, 0x249, 0x3b4, 0x164, 0x1f8, 0x62, 0x1e2, 0x347, 0x28a, 0x28b, 0xab, 0x1b0, 0x74, 0x371, 0x80, 0x264, 0xbb, 0x3f8, 0x1e0, 0x30e, 0xbc, 0x103, 0x2a8, 0x25b, 0x1b5, 0x2c6, 0x20f, 0x25d, 0x16e, 0x95, 0x29e, 0x51, 0x15a, 0x2d6, 0x47, 0x3c9, 0x111, 0xa9, 0x1f9, 0x242, 0xf9, 0x283, 0x18f, 0x17a, 0x49, 0x65, 0x23b, 0x3c, 0x2c7, 0x5e, 0x103, 0x159, 0x17e, 0x1b3, 0x33, 0x170, 0x24d, 0x245, 0xd, 0x325, 0x2d9, 0x339, 0x12c, 0x3dc, 0x3d6, 0x10c, 0x2ee, 0x36d, 0x2f5, 0x167, 0x32b, 0x127, 0x14f, 0x51, 0x2b4, 0x34a, 0x238, 0xe7, 0x268, 0x21a, 0x147, 0x219, 0x19c, 0x2b6, 0x3d8, 0x2f2, 0x98, 0x210, 0x39d, 0x1fb, 0x1f, 0x32e, 0x4a, 0xbe, 0x294, 0x278, 0x283, 0x31e, 0x1e1, 0x25c, 0x295, 0x231, 0x2e6, 0x125, 0x1dd, 0x9b, 0x2cb, 0x332, 0x3bf, 0x5b, 0x6e, 0xa8, 0x3bb, 0x17f, 0x1fa, 0x56, 0x34b, 0x271, 0x82, 0x53, 0x226, 0x380, 0x247, 0x9f, 0x3ef, 0x2a6, 0x341, 0xab, 0x360, 0x1d0, 0x3be, 0x12, 0xb, 0x293, 0x387, 0x3b8, 0x1a4, 0x155, 0x212, 0x30f, 0x131, 0x60, 0x356, 0x1cd, 0x2, 0x92, 0xca, 0x7f, 0x78, 0x187, 0xbc, 0x206, 0x2b2, 0x2fc, 0x366, 0x66, 0x2e0, 0x93, 0x92, 0x194, 0x1fc, 0x3c0, 0x46, 0x3ad, 0xa0, 0x3e6, 0x14e, 0x30, 0x356, 0x39a, 0x8, 0x99, 0xbb, 0x3fb, 0x23f, 0x230, 0x157, 0x109, 0x30f, 0x262, 0x180, 0x286, 0xef, 0x40, 0xc1, 0x1d1, 0x3e7, 0x1dc, 0x1a4, 0x2aa, 0x5a, 0x4e, 0x334, 0x1b, 0x1d, 0x371, 0x200, 0x201, 0x293, 0x307, 0x2fb, 0x13b, 0x17d, 0x2d0, 0x270, 0x196, 0xd8, 0xe8, 0x3be, 0x24, 0x2c, 0xb5, 0xe, 0x3f5, 0x1ca, 0x3fa, 0x2ad, 0x3a4, 0xab, 0x2c9, 0x349, 0x1cf, 0x120, 0x160, 0x1a1, 0x70, 0x397, 0x24b, 0x3ef, 0x145, 0x11f, 0x151, 0x265, 0x27e, 0x263, 0x112, 0x312, 0x113, 0x380, 0x87, 0x27c, 0x347, 0x23a, 0xea, 0x29a, 0x30c, 0x3d4, 0x33c, 0x82, 0xa6, 0x8a, 0x3f, 0x31, 0x3c4, 0x20e, 0x1f4, 0x359, 0xfd, 0x56, 0x29f, 0x1d6, 0x19, 0x139, 0x59, 0x1f8, 0x188, 0x21f, 0x54, 0x3bb, 0x2fe, 0x3e1, 0x2b0, 0x124, 0x259, 0x3fb, 0x77, 0xd2, 0x2aa, 0xb4, 0x138, 0x196, 0x1b0, 0x3a0, 0x1cf, 0x240, 0x189, 0x113, 0x309, 0x21c, 0x3c4, 0x15, 0x3d9, 0x2fe, 0x3cb, 0x2d2, 0x2a1, 0x2ea, 0x136, 0x275, 0x291, 0x4f, 0x345, 0x235, 0x313, 0x302, 0x42, 0x3ca, 0x3f6, 0xf8, 0x111, 0x141, 0x2a7, 0x3b, 0xfb, 0x27d, 0x3a3, 0x2a3, 0xa2, 0x18d, 0x18a, 0x27f, 0x1eb, 0x218, 0x35d, 0x163, 0x2e, 0x322, 0x83, 0x68, 0x71, 0x203, 0x367, 0xbc, 0xa, 0x37a, 0x257, 0x18, 0x356, 0x33d, 0x20, 0xc1, 0x3a2, 0x387, 0x2fb, 0x276, 0x1fd, 0x2ad, 0x341, 0x2ac, 0x265, 0xf5, 0x19e, 0x82, 0x14c, 0x228, 0x1f8, 0x310, 0x6e, 0x2a0, 0x3ce, 0x36f, 0x18e, 0x2e6, 0x9d, 0x1ef, 0x281, 0x22b, 0x294, 0x1f2, 0x6a, 0x239, 0x2b8, 0x98, 0x52, 0x1ae, 0x227, 0x33f, 0x268, 0x7a, 0x5d, 0x369, 0x35f, 0x32b, 0x95, 0xdd, 0x6d, 0x248, 0x176, 0x3e7, 0x379, 0x276, 0x3fa, 0x2a6, 0x23e, 0x29a, 0x2b, 0x137, 0x2ab, 0x320, 0x19f, 0x34c, 0x4f, 0x283, 0xc6, 0xae, 0x4c, 0x52, 0x35c, 0x8e, 0x1ce, 0x2c1, 0x35b, 0x36d, 0x385, 0x166, 0x326, 0x34, 0x71, 0xf, 0x187, 0x1e9, 0xa0, 0x383, 0xcd, 0x1b, 0x74, 0x375, 0x120, 0x189, 0x226, 0x3f, 0xc4, 0x37, 0x2a0, 0x395, 0x1a7, 0x6b, 0x233, 0x384, 0x32e, 0x250, 0x3d3, 0x308, 0x279, 0x27d, 0x34f, 0x29e, 0x119, 0xe6, 0x12c, 0x2df, 0x55, 0xbf, 0x2c5, 0x269, 0x2bc, 0x2, 0x99, 0x2ec, 0x3c7, 0x2fb, 0xe5, 0x3fd, 0x145, 0x75, 0x13d, 0x56, 0x26e, 0x15f, 0x249, 0x33e, 0x291, 0x9e, 0x10f, 0x18c, 0x15c, 0x98, 0xa4, 0x2b1, 0x11c, 0x39c, 0x18b, 0x2bf, 0x2d3, 0x303, 0x2cc, 0x245, 0x68, 0xe2, 0x1e, 0x30e, 0x3d2, 0x140, 0x30f, 0x19a, 0x36, 0xe8, 0x2e3, 0x240, 0x312, 0x99, 0x1d1, 0x307, 0x3f5, 0x24b, 0x347, 0x1f4, 0x2fe, 0x337, 0x173, 0x13a, 0x363, 0x94, 0x3ed, 0x308, 0xfb, 0x1e6, 0x24e, 0x1ba, 0x368, 0x1fe, 0x30d, 0x206, 0x37a, 0x14e, 0x180, 0x1d, 0x3be, 0x120, 0x312, 0x8a, 0x1f8, 0x5b, 0x2e9, 0x17a, 0x162, 0x21, 0x39d, 0x38f, 0x33f, 0x1b2, 0x3a9, 0x36d, 0x303, 0x191, 0x106, 0x340, 0x23b, 0x3c0, 0x230, 0x2aa, 0x2d0, 0x3a4, 0x151, 0x30c, 0x29f, 0x2ab, 0x249, 0x275, 0x256, 0xf9, 0xd4, 0x1ec, 0x3bd, 0x8b, 0x161, 0x18a, 0x1ee, 0x28f, 0x329, 0x366, 0x269, 0x171, 0x8, 0xc1, 0x293, 0xe, 0x397, 0x27c, 0x20e, 0x3bb, 0x3dd, 0x18e, 0x38a, 0x1c2, 0x32e, 0xa9, 0x357, 0x76, 0x3d1, 0x32b, 0x254, 0x1cb, 0x376, 0x3eb, 0x5e, 0x14, 0x3e6, 0x262, 0x1b, 0xe8, 0x1cf, 0x112, 0xa6, 0x59, 0x3db, 0x2d8, 0x365, 0x3c2, 0x302, 0x108, 0xd7, 0x47, 0x1ce, 0x132, 0x34d, 0xe, 0x327, 0x1e2, 0x54, 0x3ce, 0x34e, 0x358, 0x2f9, 0x1f0, 0x134, 0x1e8, 0x3b2, 0x303, 0x322, 0x11, 0x236, 0x3f8, 0xee, 0x13b, 0x3fd, 0x11d, 0x359, 0x3cb, 0x2bd, 0x13a, 0x2cf, 0x250, 0x357, 0xec, 0x35f, 0x16e, 0x101, 0x11e, 0xf, 0x215, 0x2af, 0x5a, 0xe9, 0x2ac, 0x30c, 0x137, 0x2be, 0x26c, 0x311, 0x242, 0x237, 0x2ca, 0x3a3, 0x135, 0xda, 0xff, 0x30d, 0x5, 0x1f3, 0x262, 0x36, 0x3a0, 0x263, 0x104, 0xed, 0x26d, 0x223, 0x10f, 0x239, 0x1ed, 0x241, 0x161, 0x314, 0x3b1, 0x55, 0x2fc, 0x3, 0x356, 0x1de, 0x12, 0x160, 0x226, 0xfc, 0x5b, 0x1db, 0x1e1, 0x302, 0x210, 0x35c, 0x238, 0xdf, 0x10c, 0x16f, 0x33, 0x253, 0x1, 0x132, 0x34d, 0xe, 0x327, 0x1e2, 0x54, 0x3ce, 0x34e, 0x358, 0x2f9, 0x1f0, 0x134, 0x1e8, 0x3b2, 0x303, 0x322, 0x11, 0x236, 0x3f8, 0xee, 0x13b, 0x264, 0x12f, 0x70, 0x21c, 0x37, 0x12d, 0xb1, 0x42, 0xd7, 0x11c, 0xdf, 0x218, 0x1b5, 0x198, 0x171, 0x20, 0xb, 0x1a1, 0x21b, 0x310, 0x2e9, 0x1e1, 0x20d, 0x52, 0x2d6, 0x3c8, 0x3d6, 0x390, 0x2c5, 0x36c, 0x273, 0x9, 0x160, 0x45, 0x3f0, 0x2d8, 0x18f, 0x57, 0x130, 0x252, 0x266, 0x1ee, 0x22e, 0x2fc, 0x6, 0x143, 0x2eb, 0x120, 0x53, 0xb2, 0x2e7, 0x3a6, 0x18c, 0x2f2, 0x241, 0x2c2, 0x4b, 0x1b7, 0x159, 0x32f, 0xc0, 0x3a, 0x1cf, 0x41, 0x272, 0x26d, 0x4f, 0x35, 0x1ec, 0x2ef, 0xa2, 0xe6, 0x172, 0x285, 0x37a, 0x131, 0x36, 0x349, 0x19e, 0x32, 0x2cb, 0x12b, 0x1f2, 0x2a9, 0x1f7, 0x14f, 0x6d, 0xff, 0x213, 0x14, 0x383, 0x261, 0x2c9, 0x1ea, 0x3ac, 0x249, 0x1c6, 0x121, 0x237, 0x19d, 0x297, 0x1ba, 0x1bb, 0x3df, 0x2f0, 0x280, 0x9c, 0xab, 0x186, 0x137, 0x175, 0x1a2, 0xbe, 0x61, 0xc1, 0xb5, 0x380, 0x188, 0x2e9, 0x3c2, 0x26, 0x290, 0x133, 0x1ee, 0x55, 0x3e2, 0x30, 0x1d, 0x1cf, 0x82, 0x1da, 0x34c, 0xf9, 0x2a9, 0x3ee, 0x135, 0x368, 0x3eb, 0x2f0, 0x109, 0x270, 0x151, 0x56, 0x2a1, 0x1ef, 0x94, 0x357, 0x3b0, 0x195, 0x326, 0x340, 0x1fc, 0x1dc, 0x1ca, 0x347, 0x3bb, 0x2d7, 0x358, 0x3f6, 0x33f, 0x18b, 0x3aa, 0x21d, 0xaf, 0x8, 0x201, 0x1a1, 0x3f, 0x5b, 0x365, 0x22f, 0x130, 0xad, 0x18a, 0x36b, 0x2a8, 0x32f, 0x180, 0xe8, 0x263, 0x19, 0x2cb, 0x256, 0x3c1, 0x165, 0x34f, 0x1ba, 0x376, 0x367, 0x3ad, 0x5a, 0x3a4, 0x29a, 0x2b0, 0x125, 0x363, 0xa9, 0x28e, 0x1bf, 0xb3, 0x106, 0x236, 0x3fb, 0x2fb, 0x24b, 0x20e, 0x1e7, 0x295, 0x2f6, 0x38f, 0x1ce, 0x43, 0x16f, 0xcc, 0x171, 0x40, 0x2c, 0x113, 0x1f8, 0x2d8, 0x31e, 0x15c, 0x192, 0x161, 0x4b, 0x36e, 0x16d, 0x14e, 0x182, 0x2d4, 0x3f, 0xb6, 0x18f, 0x15c, 0x324, 0x18d, 0x258, 0x285, 0x1f3, 0x334, 0x19b, 0x34b, 0x175, 0x281, 0x3f2, 0x76, 0x167, 0x193, 0x340, 0x3f8, 0x379, 0x24b, 0x15, 0x395, 0x85, 0x333, 0x11c, 0x37c, 0x1c8, 0x183, 0x356, 0x2eb, 0x89, 0x139, 0xd3, 0x278, 0x2a9, 0x3d5, 0xdd, 0x376, 0x2c7, 0x2af, 0x2d0, 0x23e, 0x3f4, 0x173, 0x384, 0x111, 0xf4, 0x2d3, 0xb8, 0x81, 0x132, 0x25e, 0x380, 0x310, 0x3b6, 0x22f, 0x260, 0x2b4, 0x4b, 0x2d5, 0x1bd, 0x262, 0x1b0, 0x1ea, 0x2ab, 0xd1, 0x17c, 0x308, 0x3ab, 0x1b1, 0x68, 0x7f, 0xee, 0x1ca, 0x287, 0x2f7, 0x295, 0x1e5, 0x227, 0x26b, 0x39, 0x1b3, 0x36c, 0x1de, 0x90, 0xa6, 0x199, 0x4f, 0xd4, 0x2ff, 0x29e, 0x368, 0x3df, 0x3d2, 0x5a, 0x341, 0x27a, 0x1ad, 0x274, 0xa3, 0x21a, 0x1d9, 0x17, 0x91, 0x124, 0x34d, 0x70, 0x62, 0x370, 0x3c2, 0x304, 0x342, 0x1f8, 0x372, 0x18c, 0x3bd, 0x144, 0x27b, 0x5e, 0x280, 0xe9, 0x29a, 0x2d2, 0x274, 0x146, 0x7a, 0x2d3, 0x170, 0x204, 0x182, 0x1a1, 0xfc, 0x1b9, 0xc6, 0x3da, 0xa2, 0x339, 0x2f, 0x140, 0x270, 0x14d, 0x169, 0x13a, 0xa3, 0x3d, 0x36d, 0xb8, 0x102, 0xc1, 0x2d4, 0x7e, 0x2d8, 0x63, 0x1ed, 0x51, 0x398, 0x213, 0xa0, 0x138, 0x2a2, 0x2b0, 0x9d, 0x255, 0x21a, 0x3b2, 0x5c, 0x81, 0x264, 0x16a, 0x3f, 0x16c, 0x235, 0x2f2, 0x22c, 0x1cc, 0x30d, 0x50, 0x9c, 0x151, 0x158, 0x24a, 0x32e, 0x10d, 0x1d9, 0x2e, 0x244, 0x132, 0xb5, 0x21b, 0xb6, 0x31e, 0x179, 0x116, 0xe6, 0x382, 0x28, 0x4e, 0x2ac, 0xac, 0x125, 0x197, 0x282, 0x2e8, 0x17, 0x122, 0x99, 0x25e, 0x309, 0x5b, 0x18f, 0x2b8, 0x8b, 0x73, 0x1c1, 0x14, 0x27, 0x156, 0x56, 0x296, 0x2cf, 0x141, 0x174, 0x20f, 0x91, 0x201, 0x113, 0x3db, 0x345, 0x1ec, 0x2a3, 0x368, 0x367, 0x157, 0x2ad, 0x359, 0x18e, 0x378, 0x33f, 0x43, 0x36a, 0x36c, 0x371, 0x112, 0x1da, 0x256, 0x237, 0x1e6, 0x284, 0x1c4, 0x23f, 0x1ca, 0x20e, 0x323, 0x21, 0x2b1, 0x33b, 0x55, 0x32f, 0x1b, 0x27e, 0x2ab, 0x344, 0x3ed, 0x3b0, 0xb3, 0x22, 0xbb, 0xe, 0x31, 0x2e9, 0x22f, 0x192, 0x31a, 0x2e4, 0x14, 0x4e, 0x151, 0x2b0, 0x13a, 0x146, 0xf4, 0x35e, 0x392, 0x8, 0x2c, 0x8a, 0x2e7, 0x21e, 0x37b, 0x135, 0x376, 0x30e, 0x2aa, 0x145, 0x2fe, 0x6b, 0x3f6, 0x1ce, 0x218, 0x366, 0x356, 0x3be, 0x82, 0x2cb, 0x294, 0x19c, 0x32b, 0xd, 0x23b, 0x1dc, 0x24b, 0x54, 0x12e, 0x108, 0x1a5, 0x1ee, 0x2a8, 0x14e, 0xd8, 0x3d4, 0x175, 0x216, 0x357, 0x1bf, 0x191, 0x110, 0x1d1, 0x70, 0x188, 0x365, 0x15c, 0x8b, 0xe6, 0x30d, 0xa0, 0x270, 0x29a, 0x1ad, 0xb, 0x45, 0x2e7, 0x35, 0x1f7, 0x1ba, 0x305, 0x118, 0x3fa, 0x3e8, 0x34e, 0x39d, 0x79, 0x343, 0x3e2, 0x300, 0x13f, 0x2ab, 0x281, 0x3af, 0x1bf, 0x322, 0x49, 0x293, 0x309, 0x16c, 0xc6, 0x373, 0x232, 0x3eb, 0x353, 0x352, 0x359, 0x31c, 0x1fb, 0x1ce, 0x39, 0x183, 0x286, 0x39e, 0x64, 0x38c, 0xc2, 0x35f, 0x326, 0x65, 0x387, 0x87, 0x1b8, 0x313, 0x192, 0x23d, 0x382, 0xa0, 0xe9, 0x27a, 0x173, 0x1f, 0xd9, 0x3aa, 0x198, 0x273, 0x120, 0x272, 0x12b, 0x237, 0x3cc, 0x202, 0x23b, 0x3b8, 0x13e, 0x2a0, 0x2c4, 0x148, 0x18a, 0x2d5, 0x1f3, 0x196, 0x211, 0x296, 0x32e, 0x3d, 0x1af, 0x392, 0x10, 0xb0, 0x59, 0x223, 0x350, 0x34f, 0x396, 0x3c, 0x1a4, 0x3d7, 0x2f7, 0x85, 0x1ae, 0x399, 0x55, 0x257, 0x6c, 0x3d4, 0x2ea, 0x4a, 0x28e, 0x3c6, 0x24c, 0x99, 0x16a, 0xfc, 0x2ed, 0x7b, 0x355, 0x368, 0x16, 0x114, 0x315, 0x350, 0x297, 0x243, 0x1e0, 0x276, 0x20e, 0x97, 0x210, 0x133, 0x1b7, 0x2fd, 0x196, 0x2b, 0x24a, 0x146, 0x3d0, 0x185, 0x171, 0x12, 0x14c, 0x34c, 0x31f, 0x3cc, 0xd, 0xfe, 0x1ff, 0x3c4, 0xbd, 0x4c, 0x161, 0x172, 0x28, 0x270, 0x27a, 0x2e6, 0x7c, 0x2c1, 0x2de, 0x36c, 0x1df, 0x104, 0x275, 0x234, 0x3ab, 0x326, 0xca, 0x207, 0x31, 0x3b6, 0x2b8, 0x51, 0xff, 0x1e9, 0x2d0, 0x3a8, 0x31c, 0x3f6, 0x331, 0x1c8, 0x6, 0x74, 0x271, 0x26c, 0x3f2, 0x369, 0x191, 0x49, 0x12f, 0x3f, 0x372, 0x7b, 0x2a3, 0x1bb, 0x215, 0x17d, 0xfa, 0x1a7, 0x39d, 0xf2, 0x117, 0x32f, 0x6c, 0x3a1, 0x3ba, 0x250, 0xba, 0x2e, 0x204, 0xb, 0x8a, 0x38e, 0x1a8, 0x34f, 0x325, 0xf0, 0x13b, 0x107, 0x24f, 0x108, 0x29d, 0x2df, 0x37a, 0xcb, 0x211, 0x125, 0xa3, 0x1e8, 0x2c6, 0x2bc, 0x9, 0xa6, 0x2c, 0x59, 0x9e, 0x165, 0x254, 0x1c4, 0x1dc, 0x27c, 0x12d, 0x26, 0x161, 0x2e4, 0xa0, 0x3a4, 0x3e1, 0x6f, 0x33f, 0x218, 0x306, 0x1d, 0x33c, 0x26c, 0x3ed, 0x1bf, 0x93, 0x99, 0x1a1, 0x3db, 0x21e, 0x3ee, 0x1cb, 0x78, 0x13b, 0x20e, 0x12e, 0x52, 0x18a, 0x346, 0x30f, 0x151, 0x1ad, 0x20b, 0x1b2, 0x16f, 0x36c, 0x3be, 0x19, 0x38c, 0x308, 0x195, 0x22, 0x1d1, 0x380, 0x2d8, 0x239, 0x2a3, 0x376, 0x46, 0x3fa, 0x3bb, 0x85, 0x2b1, 0x1ee, 0x16d, 0x334, 0x30c, 0x125, 0x146, 0x3a9, 0x21d, 0x39a, 0x120, 0x1da, 0x294, 0xfb, 0x362, 0x236, 0x307, 0x31, 0x365, 0x2f2, 0x288, 0x3eb, 0x157, 0x145, 0x3dd, 0x2f6, 0x238, 0x28f, 0x32f, 0xd8, 0x29f, 0x1ef, 0x141, 0x36d, 0x392, 0x40, 0x312, 0x26d, 0x3c1, 0x1e6, 0xd, 0x1fc, 0x3f5, 0x21f, 0x3c2, 0x192, 0xe6, 0x5e, 0x5a, 0xea, 0x18e, 0x3f6, 0x26b, 0x58, 0x164, 0xf9, 0x27d, 0x202, 0x1fc, 0x3e3, 0x6e, 0x22f, 0x116, 0xff, 0x3ad, 0x153, 0x3ea, 0x2f6, 0x79, 0x22e, 0x14e, 0x19b, 0x354, 0x32e, 0x1e8, 0x30a, 0x39a, 0x240, 0x361, 0x8d, 0x3ab, 0x83, 0xbb, 0xe0, 0x16c, 0x239, 0x14f, 0x1c3, 0x230, 0x3d7, 0x395, 0x108, 0x266, 0x1a3, 0x30f, 0x2a2, 0x2bd, 0x7c, 0x316, 0x1b3, 0x286, 0xcf, 0x136, 0x3ed, 0x37e, 0x24c, 0xc1, 0x226, 0x38e, 0x2a9, 0x95, 0xe2, 0x1dc, 0xf1, 0xbd, 0x130, 0x23d, 0x2f, 0x5a, 0x1d4, 0x231, 0x38f, 0x2f1, 0x1f1, 0x1b, 0x3a1, 0x2f3, 0x141, 0x2d3, 0x253, 0x200, 0x14c, 0x12b, 0x19c, 0x2dc, 0x11b, 0x307, 0x62, 0x18f, 0x3bd, 0xda, 0x187, 0x17d, 0x3e8, 0x246, 0x2b1, 0x3dc, 0x1bd, 0x196, 0xac, 0xe1, 0x134, 0x35d, 0x1b6, 0x3be, 0x32, 0x22b, 0x76, 0x166, 0x49, 0xb5, 0x3f0, 0x10f, 0x3ee, 0x396, 0x1e0, 0x1ca, 0xb0, 0x199, 0x3c1, 0x391, 0xd0, 0x3e7, 0x21c, 0x2c3, 0x3bd, 0x1b4, 0x215, 0x3fa, 0x2f7, 0x42, 0x133, 0x1a3, 0x217, 0x29a, 0x1c5, 0x3c9, 0x218, 0x3, 0x1d0, 0x2ab, 0x4a, 0xba, 0x170, 0x20, 0x22d, 0x34c, 0xce, 0x2dc, 0x236, 0x7, 0x310, 0xc6, 0x355, 0x2e5, 0x230, 0x3a7, 0x24f, 0x52, 0x221, 0x5, 0x270, 0x3f4, 0xde, 0x1ce, 0x390, 0x60, 0x27e, 0x1dd, 0x152, 0x36d, 0x253, 0x9, 0x139, 0x14a, 0x1f6, 0x326, 0x259, 0xe0, 0x2d8, 0xf6, 0x26a, 0xf, 0x299, 0x15, 0x162, 0x252, 0xb9, 0xa0, 0x28b, 0x267, 0x3f6, 0x1be, 0x2fc, 0x1b, 0x34b, 0x3de, 0x21a, 0x163, 0x2e2, 0x120, 0x361, 0x11a, 0x2b7, 0x11, 0x3a2, 0x3f, 0x3a6, 0x2ff, 0x1cb, 0x1e0, 0x394, 0x2a0, 0x13, 0x2c2, 0x30d, 0x2d, 0x1d4, 0x6b, 0x227, 0x3a5, 0x32f, 0x360, 0x1aa, 0x32e, 0x3d0, 0x33, 0xef, 0x41, 0xe3, 0x308, 0x160, 0x26d, 0x237, 0x16e, 0x236, 0xe, 0x5b, 0x239, 0x135, 0xf, 0x13b, 0x54, 0x302, 0x161, 0x30d, 0x5a, 0x359, 0x358, 0x238, 0x55, 0x262, 0x30c, 0x13a, 0x134, 0x16f, 0x356, 0x263, 0x26c, 0x357, 0x303, 0x1, 0x160, 0x26d, 0x237, 0x16e, 0x236, 0xe, 0x5b, 0x239, 0x135, 0xf, 0x13b, 0x54, 0x302, 0x161, 0x30d, 0x5a, 0x359, 0x358, 0x238, 0x55, 0x262, 0x30c, 0x13a, 0x134, 0x16f, 0x356, 0x263, 0x26c, 0x357, 0x303, 0x1, 0x160, 0x26d, 0x237, 0x16e, 0x236, 0xe, 0x5b, 0x239, 0x135, 0xf, 0x13b, 0x54, 0x302, 0x161, 0x30d, 0x5a, 0x359, 0x358, 0x238, 0x55, 0x262, 0x30c, 0x13a, 0x134, 0x16f, 0x356, 0x263, 0x26c, 0x357, 0x303, 0x1, 0x160, 0x26d, 0x237, 0x16e, 0x236, 0xe, 0x5b, 0x239, 0x135, 0xf, 0x13b, 0x54, 0x302, 0x161, 0x30d, 0x5a, 0x359, 0x358, 0x238, 0x55, 0x262, 0x2c0, 0x1a6, 0x19c, 0x2cd, 0x259, 0x380, 0x1d3, 0x1f7, 0x243, 0x77, 0x1e2, 0x3c2, 0x116, 0x3f1, 0x2aa, 0x3e8, 0x214, 0x133, 0x285, 0x138, 0x3e1, 0x2f9, 0x1be, 0x3e2, 0x1b0, 0x354, 0x146, 0x2ee, 0x1b6, 0x1cf, 0x9b, 0x3af, 0x303, 0x2, 0x189, 0x34c, 0x338, 0x193, 0xbb, 0x309, 0x3a6, 0x3ee, 0x8f, 0xee, 0x3c4, 0x38d, 0x22c, 0x3eb, 0x15d, 0x3d9, 0x21, 0x266, 0x103, 0x270, 0x3cb, 0x1fb, 0x37c, 0x3cd, 0x360, 0x2a1, 0x28c, 0x1d5, 0x36c, 0x39e, 0x136, 0x357, 0x20f, 0x4, 0x312, 0x291, 0x279, 0x326, 0x176, 0x21b, 0x345, 0x3d5, 0x11e, 0x1dc, 0x381, 0x313, 0x51, 0x3df, 0x2ba, 0x3bb, 0x42, 0xc5, 0x206, 0xe9, 0x39f, 0x3f6, 0x2f1, 0x393, 0x2c9, 0x14b, 0x111, 0x3aa, 0x2d1, 0x335, 0x26c, 0x2a7, 0x17, 0x8, 0x22d, 0x12b, 0xfb, 0x245, 0x2ec, 0x3f, 0x283, 0x3a3, 0x23c, 0x3b8, 0x30b, 0x22f, 0x189, 0x291, 0xfb, 0x83, 0x3a2, 0x1f8, 0x6a, 0x95, 0x23b, 0x3cf, 0x1db, 0x3bd, 0x1bb, 0x69, 0x20e, 0x181, 0x2c2, 0x5e, 0x352, 0x3b3, 0xd7, 0x3b1, 0x3c5, 0x29a, 0x233, 0x39c, 0x17e, 0x6c, 0x1aa, 0x146, 0x1d5, 0x2d1, 0x263, 0x1a2, 0x115, 0x170, 0x100, 0x272, 0x8d, 0x2ce, 0x220, 0x1a1, 0x38e, 0x2ca, 0xd, 0x3f7, 0x62, 0xc6, 0x29e, 0x1e, 0x1ca, 0x292, 0x260, 0x339, 0x2af, 0x7d, 0x85, 0x29d, 0x285, 0x270, 0x39f, 0x3e5, 0x3d6, 0xa7, 0xc3, 0x13a, 0xd9, 0x2dd, 0x1d, 0x351, 0x128, 0x36d, 0x2bc, 0x240, 0x275, 0x3b, 0x322, 0xc1, 0x228, 0x1f2, 0x32b, 0x11b, 0x1c, 0x2d8, 0x3b9, 0x396, 0x23f, 0x1e2, 0x38d, 0x51, 0x3b7, 0x2fa, 0x1e7, 0x29, 0x96, 0xa0, 0x75, 0xd6, 0x238, 0x154, 0x261, 0x2b0, 0x3e, 0x86, 0x6, 0x13f, 0x37d, 0x21a, 0x30a, 0x1de, 0x19, 0x17c, 0x37e, 0x81, 0x312, 0x256, 0x3d1, 0x22, 0xb5, 0x2e7, 0x165, 0xd, 0x3e7, 0x188, 0x239, 0x1ba, 0x3c0, 0x27c, 0x3c2, 0x51, 0x367, 0x3fa, 0x323, 0x290, 0x2e4, 0x5a, 0x2fe, 0x39d, 0x1ee, 0x3e6, 0x29a, 0x6f, 0x26b, 0x3e2, 0x2c9, 0x125, 0x134, 0x36a, 0x1d, 0x2ab, 0xa9, 0x35e, 0x39a, 0x82, 0x5f, 0x1bf, 0x81, 0x160, 0x34c, 0xfb, 0x106, 0x293, 0x3db, 0x2a9, 0x284, 0x3fb, 0x31, 0xc6, 0x135, 0x78, 0x24b, 0x17a, 0x8b, 0x3eb, 0x17d, 0x1e7, 0x52, 0x258, 0x109, 0x359, 0x2f6, 0x33b, 0x37a, 0x151, 0x38a, 0x1ce, 0x17e, 0xd8, 0x2a1, 0x222, 0x16f, 0x286, 0x1d6, 0x94, 0x36d, 0x171, 0x112, 0x38c, 0x3b0, 0x91, 0x2c, 0x26d, 0x19c, 0x326, 0x1d1, 0x1f8, 0xd4, 0x254, 0x1fc, 0x87, 0x31e, 0x2a3, 0xf, 0x1ca, 0x12d, 0x192, 0x1fe, 0x2aa, 0x3bb, 0x108, 0x4b, 0xa0, 0xea, 0x358, 0x1e4, 0x16d, 0xab, 0x173, 0x22d, 0x14a, 0x2b7, 0x220, 0x28d, 0x9e, 0x3cc, 0x11b, 0x70, 0x1d3, 0x3a3, 0x1c4, 0x3e3, 0x3b6, 0x1d7, 0x305, 0xe5, 0x12d, 0x324, 0x3f1, 0x17d, 0x3ce, 0x148, 0x2e4, 0xb4, 0x3ea, 0xd7, 0x2df, 0x27, 0x3e1, 0x3e5, 0x343, 0x262, 0xac, 0x3e, 0x218, 0x60, 0x34b, 0x32e, 0x2ee, 0x1ab, 0x33c, 0x25, 0x3b2, 0x171, 0x224, 0x22b, 0x1bf, 0x102, 0x189, 0x256, 0x3ab, 0x88, 0x1a1, 0x223, 0xf3, 0x340, 0x1c, 0x372, 0x3ee, 0x71, 0x3fe, 0x2e9, 0x373, 0x1c3, 0x13b, 0x149, 0xc9, 0x1fe, 0x15d, 0x2f7, 0x52, 0xb9, 0x2d, 0x2fe, 0x333, 0x3b1, 0x30f, 0x1fa, 0x1fb, 0x3d6, 0x29c, 0x2b, 0x20b, 0x86, 0x18, 0x3d4, 0x2cf, 0x2bf, 0x36c, 0xcf, 0x10b, 0x2e8, 0x15e, 0x89, 0x38c, 0x369, 0x244, 0x160, 0x291, 0x3ec, 0x22, 0x16a, 0x38e, 0x33a, 0xd0, 0x7, 0x2d8, 0x2ff, 0x11e, 0x2fb, 0x1b8, 0x3da, 0x376, 0x53, 0x121, 0x195, 0x248, 0x114, 0x3c1, 0x1b1, 0x176, 0x1f8, 0x350, 0x101, 0x3e7, 0x229, 0x3d8, 0x243, 0x379, 0x1b8, 0x3bd, 0x1c3, 0x276, 0x12d, 0x241, 0x3df, 0x3fa, 0x97, 0x15a, 0x5e, 0x2a6, 0x123, 0x133, 0xa, 0x23e, 0x358, 0x399, 0x2fd, 0x29a, 0x1bc, 0x2f1, 0x14e, 0x2b, 0x1f, 0x218, 0xc0, 0x137, 0x146, 0x2b3, 0x105, 0x2ab, 0x2a4, 0x185, 0x371, 0x320, 0x2a7, 0x170, 0x12, 0x19f, 0x76, 0x24c, 0x58, 0x34c, 0x3ec, 0x44, 0x1a1, 0x4f, 0x3cc, 0x236, 0x1c0, 0x283, 0x24e, 0xfe, 0x10e, 0xc6, 0xdd, 0x389, 0x3c4, 0xae, 0xda, 0x230, 0x2a, 0x4c, 0x339, 0x155, 0x37f, 0x52, 0x172, 0xb4, 0x3dd, 0x35c, 0x2d5, 0x270, 0xc7, 0x8e, 0x2a8, 0x251, 0x2e6, 0x1ce, 0x1f1, 0x19b, 0x13a, 0x2c1, 0x205, 0x27e, 0x3b5, 0x35b, 0x36c, 0x19e, 0x25, 0x36d, 0x1cd, 0x104, 0x2f8, 0x385, 0x10, 0x139, 0xa6, 0x8d, 0xb3, 0xc1, 0x2c8, 0x19c, 0x106, 0xb5, 0x315, 0x1e6, 0x236, 0x380, 0x21e, 0x254, 0x3fb, 0x188, 0x1ec, 0x243, 0x2fb, 0x2e9, 0x1d7, 0xf, 0x24b, 0x3c2, 0x288, 0x46, 0x20e, 0x26, 0x339, 0x2aa, 0x1e7, 0x290, 0x30d, 0x2ad, 0x295, 0x133, 0x14, 0xea, 0x2f6, 0x1ee, 0x30f, 0x3e1, 0x38f, 0x55, 0x196, 0x173, 0x1ce, 0x3e2, 0x265, 0x1c2, 0x43, 0x30, 0x29f, 0x146, 0x16f, 0x1d, 0x175, 0x21a, 0xcc, 0x1cf, 0x344, 0x2e8, 0x171, 0x82, 0x2f8, 0x303, 0x40, 0x1da, 0x308, 0x93, 0x2c, 0x34c, 0x3d1, 0x110, 0x113, 0xf9, 0x16e, 0xbb, 0x1f8, 0x2a9, 0xd, 0x307, 0x2d8, 0x3ee, 0x1c4, 0x397, 0x31e, 0x135, 0x3c0, 0x3c4, 0x15c, 0x368, 0x1a4, 0x2a0, 0x192, 0x3eb, 0x3fa, 0x12e, 0x161, 0x2f0, 0x23a, 0x21, 0x4b, 0x109, 0x2fe, 0xd7, 0x36e, 0x270, 0x18e, 0x238, 0x16d, 0x151, 0x6f, 0x37c, 0x14c, 0x234, 0x191, 0xb, 0x1a6, 0x3d1, 0x220, 0x45, 0x3c1, 0x2cd, 0x34d, 0x2e7, 0x27d, 0x11b, 0x380, 0x35, 0x142, 0x3e7, 0xb6, 0x1f7, 0x1c4, 0x327, 0x63, 0x1ba, 0x77, 0x6e, 0x3bd, 0x305, 0x321, 0x3c2, 0x119, 0x118, 0x54, 0x260, 0x3f1, 0x3fa, 0x25c, 0x18d, 0x3ad, 0x3e8, 0x29, 0x2e4, 0x1a9, 0x34e, 0x133, 0x28, 0x3a8, 0x39d, 0x2df, 0x138, 0x18e, 0x79, 0x1bd, 0x29a, 0x2f9, 0x343, 0x334, 0x35a, 0xe7, 0x3e2, 0xc3, 0x301, 0x218, 0x300, 0x354, 0x134, 0x2c5, 0x13f, 0x363, 0x2ee, 0x143, 0x2ab, 0x282, 0x66, 0x1cf, 0x281, 0x3b2, 0x39a, 0x32, 0x3af, 0x170, 0x48, 0x1c6, 0x1bf, 0x2, 0x298, 0x61, 0x322, 0x16, 0x34c, 0x3ab, 0x49, 0x8a, 0x38b, 0x193, 0x293, 0x1c7, 0xf3, 0x236, 0x309, 0x6a, 0x284, 0x3c7, 0x16c, 0x3ee, 0x388, 0x247, 0xc6, 0x374, 0xee, 0xdc, 0x373, 0x203, 0x24b, 0x298, 0xc2, 0x93, 0xb0, 0xa5, 0x195, 0x264, 0x199, 0xfb, 0x88, 0x226, 0x3c1, 0x193, 0x12f, 0x315, 0x391, 0x328, 0x1f8, 0x2b6, 0xd0, 0x70, 0x10f, 0xa1, 0x3e7, 0x16c, 0x3d5, 0x23b, 0x21c, 0x7b, 0x243, 0x3fe, 0x2c3, 0x135, 0x31b, 0x37, 0x3bd, 0x203, 0x9f, 0x22f, 0x1b4, 0x348, 0x12d, 0x22c, 0x215, 0x20e, 0x98, 0x3fc, 0x3fa, 0xb1, 0x23d, 0x157, 0x2f7, 0x129, 0x5e, 0x11d, 0x42, 0x258, 0x168, 0x1a7, 0x133, 0x50, 0x2bb, 0xd7, 0x1a3, 0x341, 0x358, 0xf7, 0x217, 0x337, 0x11c, 0x2da, 0x29a, 0x1fb, 0x117, 0x196, 0x1c5, 0xdf, 0x14e, 0x158, 0x3c9, 0x17e, 0x336, 0x384, 0x218, 0x209, 0x14b, 0x1b2, 0x3, 0x3a1, 0x146, 0x1b5, 0x1d0, 0x1ef, 0x2bf, 0x2a5, 0x2ab, 0x10d, 0x198, 0x263, 0x4a, 0x2b5, 0x371, 0x136, 0xba, 0x171, 0x208, 0x3d3, 0x170, 0x90, 0x311, 0x1e3, 0x20, 0x3b4, 0x76, 0x139, 0x308, 0x91, 0x312, 0x8d, 0x191, 0x2c, 0x256, 0x195, 0xc1, 0x26d, 0x3d1, 0x92, 0x59, 0x19c, 0x22, 0x113, 0x3c1, 0x326, 0xb5, 0x9e, 0x16e, 0x1d1, 0x2e7, 0x1e6, 0x194, 0x1f8, 0x165, 0x340, 0x380, 0xd4, 0xd, 0xe, 0x345, 0x254, 0x3e7, 0x2d8, 0x34f, 0x1fc, 0x188, 0x37b, 0x1c4, 0x87, 0x239, 0x243, 0x3f5, 0x31e, 0x1ba, 0x1dc, 0x2e9, 0x2a3, 0x3c0, 0x21f, 0x3bd, 0xf, 0x27c, 0x15c, 0x376, 0x1ca, 0x3c2, 0x6d, 0x1a4, 0x12d, 0x51, 0x46, 0x54, 0x192, 0x367, 0x347, 0x26, 0x1fe, 0x3fa, 0x162, 0xe6, 0x2aa, 0x323, 0x161, 0x3ad, 0x3bb, 0x290, 0x5e, 0x23a, 0x108, 0x2e4, 0x2ad, 0x85, 0x4b, 0x5a, 0x2d7, 0x133, 0xa0, 0x2fe, 0x2b1, 0x206, 0xea, 0x39d, 0x36e, 0x3a4, 0x358, 0x1ee, 0x4e, 0x18e, 0x1e4, 0x3e6, 0x3e1, 0x47, 0x16d, 0x29a, 0x3f6, 0x55, 0xab, 0x6f, 0x3d6, 0x334, 0x272, 0x3b, 0x81, 0x14c, 0x184, 0x91, 0x22d, 0x234, 0x93, 0x2c0, 0x242, 0x191, 0x58, 0x14a, 0xb3, 0xb, 0x12b, 0x195, 0x182, 0x1a6, 0x2b7, 0x132, 0x332, 0x3d1, 0x124, 0x164, 0xfb, 0x220, 0x228, 0x19c, 0x44, 0x45, 0x237, 0x20c, 0x28d, 0x3c1, 0x245, 0x2d4, 0xf9, 0x2cd, 0x25e, 0x9e, 0x2dc, 0x34d, 0x315, 0x25f, 0x2ec, 0x2e7, 0x3cc, 0x259, 0x3db, 0x27d, 0xca, 0x1f8, 0x2ca, 0x11b, 0x3f, 0x15b, 0x1a0, 0x380, 0x1a8, 0x34, 0x70, 0x35, 0x202, 0xe, 0x283, 0x142, 0x307, 0x1d3, 0x12a, 0x3e7, 0x1b9, 0x127, 0x3fb, 0xb6, 0x3a3, 0x1fc, 0x310, 0x1f7, 0x23b, 0x62, 0x3b9, 0x1c4, 0x10e, 0xf6, 0x23c, 0x327, 0x318, 0x243, 0x3e3, 0x63, 0x1cb, 0x1ff, 0x18f, 0x1ba, 0x3b8, 0x3b6, 0x135, 0x77, 0x370, 0x2a3, 0x389, 0x6e, 0x1d7, 0xf0, 0x30b, 0x3bd, 0x1e, 0x1e2, 0x2f2, 0x305, 0x13e, 0x15c, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0x1da, 0x3b0, 0x8, 0x2cb, 0x1bf, 0x40, 0x275, 0x1e3, 0x200, 0x38c, 0x303, 0x24, 0x5f, 0x2e, 0x120, 0x2f8, 0x170, 0x112, 0x3ed, 0x392, 0x82, 0x357, 0xaf, 0x19, 0x28e, 0x171, 0xc8, 0x5d, 0x39a, 0x249, 0x2e8, 0xef, 0x26c, 0x36d, 0x371, 0x344, 0x35e, 0x3be, 0x216, 0x2c6, 0x1cf, 0x94, 0x21d, 0x263, 0xa9, 0xcc, 0x33c, 0x141, 0x269, 0x1d6, 0x21a, 0x36c, 0x2ab, 0xf4, 0x356, 0x175, 0x3a9, 0x286, 0x3ba, 0x177, 0x1d, 0x1ef, 0x3aa, 0xe8, 0x363, 0x16f, 0x349, 0x32e, 0x36a, 0x27e, 0x146, 0x366, 0x3d4, 0x222, 0x306, 0x29f, 0x134, 0x6, 0xd5, 0x1b2, 0x30, 0x2a1, 0x18b, 0x180, 0x125, 0x43, 0x1b, 0x13a, 0x218, 0xd8, 0x1c2, 0xe4, 0x2c9, 0x20b, 0x329, 0x265, 0x7c, 0x17e, 0x30c, 0x3e0, 0x3e2, 0x56, 0x33f, 0x32f, 0x2b0, 0x1ce, 0x14e, 0x1ad, 0x26b, 0x262, 0x173, 0x37c, 0x334, 0x38a, 0x3b4, 0x2db, 0x40, 0xe3, 0x385, 0x24, 0xbe, 0xb8, 0x112, 0x3d3, 0x253, 0x19, 0x115, 0x1cd, 0x249, 0x1d9, 0x3bc, 0x344, 0x2b5, 0x2e3, 0x94, 0x33, 0x19e, 0x141, 0xdb, 0x351, 0xf4, 0x2a5, 0x1dd, 0x177, 0x3a, 0x3b5, 0x16f, 0x29b, 0xa3, 0x366, 0x3a1, 0x9a, 0x6, 0x1aa, 0x2c1, 0x180, 0x24a, 0x10c, 0xd8, 0x384, 0x390, 0x265, 0xf8, 0x1f1, 0x56, 0x277, 0xa7, 0x1ad, 0xdf, 0x19a, 0x38a, 0x3a5, 0x251, 0x378, 0xaa, 0x14d, 0x38f, 0x2da, 0x3f4, 0x238, 0x3c5, 0xc7, 0x33b, 0x9c, 0x1ac, 0x36b, 0x341, 0x3ca, 0x346, 0x1d4, 0x35c, 0x14, 0x1f5, 0x29d, 0x109, 0x1a7, 0x221, 0x2d0, 0x10a, 0x172, 0x145, 0x210, 0x2f, 0x1f4, 0x129, 0x3d2, 0x1e7, 0x2c2, 0x155, 0x12e, 0x1cc, 0x1fd, 0x302, 0x3fc, 0x3a7, 0x130, 0x2c7, 0x2a, 0x8b, 0x8c, 0x292, 0x288, 0x348, 0x1e1, 0x368, 0x394, 0xae, 0x386, 0x361, 0x37e, 0x200, 0x22b, 0x5c, 0x112, 0x3af, 0x15e, 0xc8, 0x174, 0x1de, 0x344, 0x163, 0x39e, 0xa9, 0x330, 0x3ac, 0xf4, 0x143, 0x37d, 0x3aa, 0x3a0, 0x255, 0x366, 0x34b, 0x268, 0x30, 0x296, 0x86, 0xd8, 0x301, 0x25b, 0x30c, 0x39b, 0x257, 0x1ad, 0x1be, 0x261, 0x6f, 0x22e, 0x2a2, 0x38f, 0x1bd, 0x3cb, 0x1e4, 0x27, 0xd6, 0x36b, 0x28b, 0x333, 0x206, 0x17f, 0x34a, 0x109, 0x34e, 0x96, 0x2ad, 0x84, 0x213, 0x1f4, 0x252, 0x353, 0x323, 0x73, 0x2fa, 0x302, 0x3f1, 0x287, 0x192, 0x23, 0x149, 0x288, 0x299, 0x38d, 0x376, 0x13e, 0x1ed, 0x78, 0x6e, 0x14f, 0x1dc, 0x18f, 0x396, 0x397, 0xf6, 0x388, 0x188, 0x3a3, 0x3ff, 0x2ed, 0x142, 0x1c, 0xd4, 0x1a0, 0x7e, 0x33a, 0x259, 0x1c7, 0x16e, 0x25e, 0x1f2, 0x106, 0x45, 0x338, 0x92, 0x332, 0x167, 0x201, 0x14a, 0x322, 0x312, 0x184, 0x102, 0x1da, 0x2cb, 0x1e3, 0x24, 0x2f8, 0x392, 0x19, 0x5d, 0xef, 0x344, 0x2c6, 0x263, 0x141, 0x36c, 0x175, 0x177, 0xe8, 0x32e, 0x366, 0x29f, 0x1b2, 0x180, 0x13a, 0xe4, 0x265, 0x3e0, 0x32f, 0x1ad, 0x37c, 0x196, 0x378, 0x2a8, 0xfd, 0x238, 0x30f, 0x6b, 0x36b, 0x11f, 0xd7, 0x14, 0x3dd, 0x18a, 0x2d0, 0x21, 0x30d, 0x1f4, 0xad, 0x157, 0x12e, 0x339, 0x3ef, 0x130, 0x30e, 0x2a0, 0x288, 0x13b, 0x22f, 0x386, 0x3c4, 0x1d7, 0x23f, 0x365, 0x1cb, 0x397, 0x1ec, 0x23b, 0x5b, 0x24e, 0x307, 0x21e, 0x68, 0x3f, 0x33a, 0xbb, 0x315, 0x362, 0x1a1, 0x237, 0x110, 0x2c8, 0x2b7, 0x201, 0x294, 0x93, 0xa6, 0x76, 0x8, 0x275, 0x303, 0x120, 0x3ed, 0xaf, 0xc8, 0x2e8, 0x371, 0x216, 0x21d, 0x33c, 0x21a, 0x356, 0x3ba, 0x3aa, 0x349, 0x146, 0x306, 0xd5, 0x18b, 0x1b, 0x1c2, 0x329, 0x30c, 0x33f, 0x14e, 0x173, 0x3d6, 0x19f, 0x385, 0x120, 0x3d3, 0x2bc, 0x249, 0x2d3, 0x2e3, 0xa9, 0xdb, 0x2be, 0x177, 0x1d0, 0xa3, 0x306, 0x1aa, 0x225, 0xd8, 0x1f, 0x1f1, 0x2b0, 0xdf, 0xcb, 0x378, 0x159, 0x3f4, 0x1e4, 0x9c, 0x17b, 0x346, 0x2bb, 0x29d, 0x5a, 0x10a, 0x382, 0x1f4, 0x15a, 0x155, 0x162, 0x3fc, 0x107, 0x8b, 0x69, 0x1e1, 0x376, 0xf1, 0x2ef, 0x23f, 0x2c3, 0x325, 0x87, 0x2ff, 0x3f9, 0x2ed, 0x101, 0x1c0, 0x165, 0x328, 0x38e, 0x362, 0x342, 0xce, 0x92, 0xd3, 0x25d, 0x160, 0xc2, 0x204, 0x2cb, 0x3c6, 0x90, 0x3ed, 0x15e, 0x320, 0x36d, 0x375, 0x250, 0x269, 0x15f, 0x2bf, 0xe8, 0x255, 0x183, 0xd5, 0x316, 0x6c, 0x20b, 0x2fc, 0x158, 0x26b, 0x261, 0x1bc, 0x2a8, 0x1fa, 0xf2, 0x4e, 0x2b9, 0x1a3, 0x359, 0x34a, 0x2d, 0x85, 0x1c1, 0xfa, 0xad, 0x2ae, 0xb1, 0x1fe, 0x287, 0x241, 0x230, 0x2f4, 0x1bb, 0x27c, 0x33e, 0x20f, 0x112, 0x147, 0x33d, 0x344, 0x30a, 0x271, 0xf4, 0x20a, 0x2cf, 0x366, 0x26e, 0x316, 0xd8, 0x3e, 0x3cd, 0x1ad, 0x1eb, 0x156, 0x38f, 0x1f3, 0x31c, 0x36b, 0x75, 0x16b, 0x109, 0x246, 0x1c1, 0x1f4, 0x2b4, 0x15d, 0x302, 0x3b7, 0xa8, 0x288, 0xe5, 0x2b8, 0x78, 0x370, 0x374, 0x397, 0x3b9, 0x3f8, 0x2ed, 0x202, 0x309, 0x33a, 0x2ec, 0x13c, 0x106, 0x228, 0x3ab, 0x201, 0x242, 0x122, 0x1da, 0x2f5, 0x48, 0x3ed, 0x2bc, 0x9b, 0x35e, 0x335, 0x282, 0x356, 0x2f3, 0x2de, 0x3d4, 0xd9, 0x300, 0x1c2, 0xbf, 0xac, 0x26b, 0xcb, 0x2f9, 0x16d, 0x39f, 0x27f, 0x3a4, 0x26f, 0x28, 0x2d7, 0x12c, 0x28a, 0x290, 0x2af, 0x25c, 0x1fe, 0x107, 0x116, 0x1a4, 0x313, 0x305, 0x21f, 0x29e, 0x1ff, 0x239, 0x319, 0xb6, 0x254, 0x38, 0x15b, 0x194, 0x38e, 0x2cd, 0x113, 0x279, 0x132, 0x256, 0x24d, 0x14c, 0x3b0, 0x275, 0x2e, 0x82, 0x5d, 0x371, 0x94, 0x269, 0x175, 0x3aa, 0x27e, 0x134, 0x180, 0x1c2, 0x17e, 0x2b0, 0x37c, 0xab, 0x38f, 0x3e6, 0x6b, 0x36e, 0x359, 0x133, 0x2d0, 0x108, 0x2f0, 0x323, 0x339, 0x347, 0x8b, 0x1a4, 0x22f, 0xf, 0xdc, 0x1ba, 0x397, 0x37b, 0x3fb, 0x345, 0x68, 0x1f8, 0x32b, 0xb5, 0x237, 0x92, 0x34c, 0x191, 0xa6, 0x3b0, 0x200, 0x2f8, 0xaf, 0x249, 0x35e, 0x263, 0x21a, 0x286, 0x363, 0x366, 0xd5, 0x43, 0x2c9, 0x3e0, 0x14e, 0x38a, 0x55, 0xfd, 0x1e4, 0x270, 0x39d, 0x14, 0x2d7, 0x258, 0x23a, 0xad, 0x2aa, 0x302, 0x367, 0x2a0, 0x6d, 0x24b, 0x3bd, 0x23f, 0x31e, 0x23c, 0x188, 0x24e, 0xe, 0x2a9, 0x194, 0x315, 0x326, 0x8a, 0x3d1, 0x201, 0x8d, 0x81, 0x2cb, 0x303, 0x112, 0x28e, 0xef, 0x216, 0xcc, 0x2ab, 0x177, 0x349, 0x222, 0x30, 0x13a, 0x329, 0x56, 0x26b, 0x196, 0xe3, 0xb8, 0x19, 0x1d9, 0x2e3, 0x141, 0x2a5, 0x3b5, 0x366, 0x1aa, 0x10c, 0x265, 0x277, 0x19a, 0x378, 0x2da, 0xc7, 0x36b, 0x1d4, 0x29d, 0x2d0, 0x210, 0x3d2, 0x12e, 0x3fc, 0x2a, 0x288, 0x394, 0x3da, 0x23f, 0x235, 0xe2, 0x5b, 0xa1, 0x1c0, 0x33a, 0x3a2, 0x3e4, 0x110, 0xd3, 0x2cc, 0xa6, 0x369, 0x12, 0x3ed, 0x2e2, 0x1a2, 0x21d, 0x3ac, 0x2bf, 0x349, 0x4d, 0xc0, 0x1c2, 0x2fc, 0x2d2, 0x3d6, 0x2a2, 0x11c, 0x4e, 0x1e5, 0xa, 0x2d7, 0xb9, 0xfa, 0x161, 0x2fa, 0x98, 0x46, 0x2f4, 0x1c3, 0x21f, 0x26a, 0x3cf, 0x37b, 0x3ff, 0x10f, 0x340, 0x3bf, 0x1b1, 0x113, 0x1f6, 0x304, 0x8d, 0x102, 0x33e, 0x2e, 0x104, 0x174, 0x3be, 0x152, 0x1ab, 0x1ef, 0x2dd, 0x26e, 0x43, 0x19b, 0x39b, 0x262, 0xde, 0x2b2, 0x337, 0x3dc, 0x75, 0x1a5, 0xb4, 0x84, 0x2f0, 0x24f, 0xff, 0x20e, 0xa2, 0xe5, 0x2f2, 0x1c6, 0x2e0, 0xc8, 0x1af, 0xcf, 0xf4, 0x74, 0x28c, 0x30, 0xe1, 0x2fc, 0x1ad, 0x343, 0x13d, 0x1e4, 0x1d2, 0x1ae, 0x109, 0x214, 0xbc, 0x323, 0xff, 0x15, 0x288, 0x321, 0x373, 0x1dc, 0x318, 0x7f, 0x2ed, 0x34, 0x3f0, 0x16e, 0x28d, 0x1f6, 0x201, 0x234, 0x2, 0x38c, 0x1c9, 0x190, 0x35e, 0x19e, 0x1e8, 0xe8, 0x111, 0x60, 0x1c2, 0x1f1, 0x35a, 0x28f, 0x27a, 0x3c8, 0x3a4, 0x35c, 0x212, 0x21, 0x178, 0x24f, 0x1fe, 0x2a, 0x119, 0x24b, 0x2ef, 0x3b8, 0x239, 0xfe, 0x1d3, 0x68, 0x3e9, 0x2dc, 0x113, 0x3ec, 0xb, 0x61, 0x4, 0x311, 0x392, 0x320, 0x2b5, 0x33c, 0x3d0, 0x1d0, 0x222, 0xc0, 0x384, 0x3e2, 0x2bd, 0x117, 0xfd, 0x399, 0x341, 0x2b1, 0x2d, 0x42, 0x2f0, 0x97, 0x3fc, 0x54, 0x232, 0x9f, 0x1d7, 0x379, 0x7b, 0x1fc, 0x3a6, 0xd0, 0x3db, 0x1b1, 0x226, 0x3d1, 0x16, 0xc2, 0x8, 0x38c, 0x392, 0x249, 0x2c6, 0x1d6, 0x177, 0x27e, 0x1b2, 0xd8, 0x3e0, 0x262, 0x378, 0x37a, 0x6b, 0x346, 0x3dd, 0x258, 0x1f4, 0x31a, 0x3ef, 0x8b, 0x13b, 0x2f2, 0x23f, 0xc6, 0x23b, 0x2ed, 0x68, 0x3db, 0x362, 0x8a, 0x2b7, 0x160, 0x76, 0x200, 0x3ed, 0x39a, 0x216, 0x269, 0x3ba, 0x36a, 0xd5, 0x218, 0x30c, 0x26b, 0xab, 0x47, 0x4e, 0x39d, 0xa0, 0x85, 0x5e, 0x323, 0x1fe, 0x54, 0x6d, 0x27c, 0x2a3, 0x3f5, 0x37b, 0x3e7, 0xd4, 0x194, 0x9e, 0x22, 0x26d, 0x191, 0x139, 0x1e3, 0x112, 0x5d, 0x3be, 0x141, 0x286, 0x32e, 0x6, 0x13a, 0x17e, 0x1ad, 0x28f, 0xfd, 0x33b, 0x11f, 0x1a5, 0x2d0, 0x52, 0x157, 0x302, 0x30e, 0x17a, 0x386, 0xdc, 0x1cb, 0x31, 0x24e, 0x70, 0x33a, 0x293, 0x237, 0x99, 0x294, 0x81, 0x275, 0x170, 0xc8, 0x35e, 0x33c, 0x3a9, 0x349, 0x134, 0x1b, 0x7c, 0x14e, 0x6f, 0x311, 0x253, 0x26c, 0x33, 0x2be, 0x16f, 0x137, 0x10c, 0x30c, 0xdf, 0x2ac, 0x238, 0xe9, 0x35c, 0x5a, 0x210, 0x2af, 0x302, 0x215, 0x1e1, 0xf, 0x1db, 0x11e, 0x5b, 0x101, 0xfc, 0x16e, 0x226, 0x35f, 0x160, 0xec, 0x12, 0x357, 0x1de, 0x250, 0x356, 0x2cf, 0x3, 0x13a, 0x2fc, 0x2bd, 0x55, 0x3cb, 0x3b1, 0x359, 0x314, 0x11d, 0x161, 0x3fd, 0x241, 0x13b, 0x1ed, 0xee, 0x239, 0x3f8, 0x10f, 0x236, 0x223, 0x11, 0x26d, 0x322, 0xed, 0x303, 0x104, 0x3b2, 0x263, 0x1e8, 0x3a0, 0x134, 0x36, 0x1f0, 0x262, 0x2f9, 0x1f3, 0x358, 0x5, 0x34e, 0x30d, 0x3ce, 0xff, 0x54, 0xda, 0x1e2, 0x135, 0x327, 0x3a3, 0xe, 0x2ca, 0x34d, 0x237, 0x132, 0x242, 0x1, 0x311, 0x253, 0x26c, 0x33, 0x2be, 0x16f, 0x137, 0x10c, 0x30c, 0xdf, 0x2ac, 0x238, 0xe9, 0x35c, 0x5a, 0x210, 0x2af, 0x302, 0x215, 0x1e1, 0xf, 0x22b, 0x15e, 0x344, 0x330, 0x37d, 0x366, 0x296, 0x25b, 0x1ad, 0x22e, 0x3cb, 0x36b, 0x17f, 0x96, 0x1f4, 0x73, 0x287, 0x288, 0x13e, 0x14f, 0x397, 0x3a3, 0x1c, 0x33a, 0x25e, 0x338, 0x201, 0x184, 0x80, 0x3ed, 0x273, 0x128, 0x356, 0x197, 0xc, 0x1c2, 0x393, 0x31d, 0x16d, 0x231, 0x285, 0x2d7, 0x382, 0x3ce, 0x1fe, 0x150, 0x2d9, 0x21f, 0x2e1, 0x62, 0x254, 0x21b, 0x25f, 0x113, 0x35f, 0x2c0, 0x3b0, 0x90, 0x115, 0x3be, 0x10d, 0x3a, 0x222, 0x209, 0xf8, 0x262, 0x1fb, 0x3c5, 0x2f6, 0x50, 0x10a, 0x2f0, 0xb1, 0x2c7, 0x17a, 0x203, 0x1db, 0x23c, 0x16c, 0x1a, 0x3db, 0x193, 0xb2, 0xb3, 0x298, 0x3c6, 0x82, 0x3b2, 0xcf, 0x3a9, 0x13f, 0x364, 0x2c9, 0xe7, 0x32c, 0x47, 0x138, 0x1ae, 0x5a, 0x29, 0x2ae, 0x26, 0x118, 0x57, 0x3c0, 0x63, 0x7f, 0x345, 0x11b, 0x223, 0x22, 0x1a6, 0x126, 0x2cb, 0x5f, 0x171, 0x216, 0x36c, 0x363, 0x6, 0x1c2, 0x32f, 0x6f, 0x37a, 0x358, 0x14, 0x85, 0x2f0, 0x162, 0x30e, 0x3c2, 0x78, 0x31e, 0x23b, 0x345, 0x236, 0x9e, 0x110, 0x256, 0x81, 0x38c, 0xaf, 0x344, 0x269, 0x1ef, 0x306, 0x13a, 0x3e2, 0x38a, 0x16d, 0x6b, 0x206, 0x295, 0x5e, 0x12e, 0x367, 0x17a, 0xf, 0x365, 0x1c4, 0x2ed, 0x340, 0x315, 0x22, 0x34c, 0x91, 0x275, 0x392, 0x26c, 0xcc, 0x3ba, 0x366, 0x125, 0x17e, 0x173, 0x2a8, 0x18e, 0x346, 0x2d7, 0x30d, 0x323, 0x3eb, 0x12d, 0x386, 0x2e9, 0x23c, 0x2d8, 0x68, 0x2e7, 0x106, 0x26d, 0x93, 0x2cb, 0x170, 0x249, 0x21d, 0x175, 0x36a, 0x2a1, 0x329, 0x1ad, 0x55, 0x337, 0x36e, 0x3dd, 0x2e4, 0x1e7, 0x1fe, 0x2a0, 0x376, 0xdc, 0x243, 0x5b, 0xd, 0x3db, 0x326, 0x2c8, 0x191, 0x1da, 0x2e, 0xc8, 0x2c6, 0x2ab, 0x16f, 0xd5, 0xe4, 0x2b0, 0x28f, 0xbe, 0x1cd, 0x94, 0x2a5, 0xa3, 0x180, 0xf8, 0x19a, 0x38f, 0x9c, 0x35c, 0x2d0, 0x129, 0x1fd, 0x8b, 0x394, 0x355, 0x397, 0x297, 0x1c0, 0x32b, 0x226, 0x2ce, 0xa6, 0x3c6, 0x208, 0x35e, 0x3ac, 0x2b3, 0xd5, 0x1c8, 0x2d2, 0x55, 0x267, 0x1a3, 0x2d7, 0x213, 0x97, 0x367, 0x2f4, 0x3c, 0x31e, 0x7f, 0x10f, 0x194, 0x1f2, 0x248, 0x8d, 0x10, 0x3f2, 0xef, 0x152, 0x20a, 0x222, 0x36, 0x39b, 0x196, 0x8e, 0x1d2, 0x1a5, 0x153, 0x2b4, 0x3ef, 0xa2, 0x13e, 0x135, 0x10e, 0x12a, 0x3f, 0x2dc, 0x228, 0xb3, 0x272, 0x17, 0xc8, 0x185, 0x2be, 0x36a, 0x14b, 0xbf, 0x173, 0x159, 0x231, 0x206, 0x123, 0x178, 0x162, 0x215, 0x313, 0x3c0, 0x18c, 0x3f9, 0xd4, 0x176, 0x31f, 0xc1, 0xc2, 0x100, 0x357, 0x2eb, 0x10d, 0xe8, 0x268, 0x360, 0x1ce, 0x156, 0xf2, 0x11f, 0x266, 0x11d, 0x31a, 0x287, 0x232, 0x3c4, 0x17c, 0x33d, 0xa9, 0x20a, 0x4d, 0xd8, 0xe7, 0x156, 0x1e4, 0x75, 0x314, 0x1f4, 0x398, 0xa8, 0x376, 0x370, 0x71, 0x2ed, 0x11b, 0x13c, 0x92, 0x242, 0x10, 0x3ed, 0x3bc, 0x282, 0xe8, 0xd9, 0x19b, 0x26b, 0x14d, 0x27f, 0x359, 0x12c, 0x37f, 0x1fe, 0x292, 0x305, 0x365, 0x319, 0x283, 0x194, 0x3e4, 0x132, 0x61, 0x100, 0x2a7, 0x3be, 0x7a, 0x29b, 0x18b, 0x186, 0x2f1, 0xfd, 0x3b1, 0x1f5, 0x2e4, 0x395, 0x3df, 0x17a, 0x3c, 0x235, 0x1fc, 0x6a, 0x176, 0x237, 0x304, 0x219, 0x24, 0x22a, 0x39e, 0x3a9, 0x1ea, 0x86, 0x56, 0x343, 0x3cb, 0x36e, 0x36f, 0x213, 0x12e, 0x187, 0x38d, 0x3c0, 0x318, 0x3ff, 0x2a9, 0x34d, 0x338, 0x2c, 0x1d8, 0x240, 0x2e8, 0x19e, 0x2ee, 0x29f, 0x72, 0x169, 0x55, 0xc7, 0x285, 0x295, 0x178, 0x2c4, 0x46, 0xae, 0x77, 0x1ec, 0x387, 0x2ca, 0xb5, 0x3ec, 0x2c0, 0x1bf, 0x2f8, 0xef, 0x141, 0xe8, 0x1b2, 0x265, 0x37c, 0xfd, 0x36b, 0x3dd, 0x30d, 0x12e, 0x30e, 0x22f, 0x23f, 0x1ec, 0x307, 0x33a, 0x1a1, 0x2b7, 0xa6, 0x303, 0xc8, 0x21d, 0x3ba, 0x306, 0x1c2, 0x14e, 0x3f6, 0x4e, 0x2b1, 0x2ad, 0x161, 0x347, 0x6d, 0x21f, 0x243, 0x2d8, 0x340, 0x9e, 0x92, 0x8d, 0x40, 0x357, 0x3be, 0xf4, 0x27e, 0x43, 0x56, 0x28f, 0x337, 0x346, 0x295, 0x2f0, 0x302, 0x230, 0x2f2, 0x2fb, 0x3ee, 0x70, 0x32b, 0x8a, 0xb3, 0x1da, 0x170, 0x26c, 0x269, 0x363, 0x30, 0x7c, 0x334, 0x47, 0x3a4, 0x133, 0x23a, 0xe6, 0x54, 0x376, 0x2e9, 0x1c4, 0x345, 0x194, 0x3c1, 0xc1, 0x308, 0x24, 0x5d, 0x263, 0x177, 0x29f, 0xe4, 0x1ad, 0x2a8, 0x6b, 0x14, 0x21, 0x157, 0x130, 0x13b, 0x1d7, 0x397, 0x24e, 0x3f, 0x362, 0x2c8, 0x93, 0x275, 0xaf, 0x216, 0x356, 0x146, 0x1b, 0x33f, 0xab, 0x1f9, 0x3bc, 0x21a, 0x29b, 0x225, 0x56, 0x117, 0xc7, 0x206, 0x10a, 0x2af, 0x130, 0x276, 0x355, 0x87, 0xa1, 0x3e9, 0x106, 0x291, 0x204, 0x2f8, 0x1de, 0x10d, 0x349, 0x316, 0x2b, 0x28f, 0x267, 0x103, 0x85, 0x353, 0x98, 0x13b, 0x3ae, 0x247, 0x254, 0x3f0, 0x83, 0x34c, 0x102, 0x17c, 0xef, 0x282, 0x3a0, 0x18b, 0x211, 0x343, 0x337, 0x285, 0x246, 0x3ad, 0x4c, 0x299, 0x1d7, 0x327, 0x12a, 0x1f8, 0x245, 0x1a6, 0x81, 0xbe, 0x273, 0x141, 0x1d0, 0x2c1, 0x30c, 0x3a5, 0x39f, 0x346, 0x123, 0x3d2, 0x26, 0x348, 0x2ef, 0x397, 0x95, 0xfc, 0x326, 0xd3, 0x244, 0x5f, 0x33d, 0x2a4, 0xe8, 0x364, 0x186, 0x3d6, 0x3cb, 0x1a3, 0x295, 0x1e9, 0x13, 0x1a4, 0x373, 0x3cf, 0x24e, 0x7e, 0x193, 0x26d, 0x122, 0x22b, 0x39a, 0x152, 0x74, 0x1b2, 0xc3, 0x1eb, 0x3e1, 0x2d5, 0x34e, 0x2f0, 0x20d, 0xd2, 0x3bd, 0x3f2, 0x2eb, 0xf4, 0x1ea, 0x39, 0x1ad, 0x2b2, 0x2b9, 0x109, 0x148, 0x3fd, 0x288, 0x30b, 0x8f, 0x2ed, 0xca, 0x38b, 0x201, 0x1d8, 0x224, 0x35e, 0x2be, 0x2c5, 0x1c2, 0x131, 0x317, 0x3a4, 0xc5, 0x3e8, 0x1fe, 0xbd, 0xf0, 0x239, 0x387, 0x27d, 0x113, 0x25d, 0x3b4, 0x392, 0x10b, 0x2a5, 0x222, 0x360, 0xdf, 0xfd, 0x1b7, 0x1a7, 0x2f0, 0x13, 0x348, 0x1d7, 0x247, 0xa1, 0x3db, 0x11, 0xa5, 0x8, 0x3af, 0x375, 0x3a9, 0x34b, 0x1c8, 0x173, 0x1bd, 0x1e5, 0x5a, 0x252, 0x3d7, 0x6d, 0x6e, 0x71, 0x345, 0x259, 0x67, 0x2c, 0x2db, 0x104, 0x2c6, 0x1dd, 0x205, 0x20b, 0x19a, 0x8e, 0x11f, 0x221, 0x37f, 0x3eb, 0x1e1, 0x389, 0x1ec, 0x7, 0x3cc, 0x8a, 0x2cc, 0x19f, 0xaf, 0x4a, 0x105, 0x134, 0x336, 0x2f1, 0x3e1, 0x1a3, 0x123, 0x3ad, 0x98, 0x276, 0x2a3, 0x21c, 0x101, 0x2e7, 0x88, 0x121, 0x40, 0x3ed, 0x3be, 0x3a9, 0x29f, 0x329, 0x38a, 0x3e6, 0xd7, 0x2ad, 0x31a, 0x54, 0x386, 0x31e, 0x3fb, 0x165, 0x1a1, 0x195, 0x1da, 0x392, 0x216, 0x286, 0x134, 0x265, 0x3d6, 0x337, 0x206, 0x21, 0x2aa, 0x8b, 0x27c, 0x1cb, 0x2d8, 0x236, 0x3c1, 0x201, 0x3b0, 0x82, 0x2c6, 0x3ba, 0x6, 0x7c, 0x196, 0x1e4, 0x359, 0x2e4, 0x12e, 0x46, 0x2f2, 0x3f5, 0x24e, 0x1f8, 0x106, 0x256, 0x8, 0x357, 0x1cf, 0x177, 0xd5, 0x17e, 0x6f, 0x30f, 0x2b1, 0x145, 0xe6, 0x2a0, 0xf, 0xc6, 0x3e7, 0x33a, 0x113, 0xb3, 0x2cb, 0xaf, 0x94, 0x1d, 0x1b2, 0x30c, 0x28f, 0x18e, 0x14, 0x108, 0x17d, 0x51, 0x3c4, 0x243, 0x2ed, 0x194, 0x237, 0x2c, 0x1bf, 0x19, 0x21d, 0x1ef, 0x30, 0x3e0, 0xab, 0x33b, 0x2fe, 0x30d, 0x162, 0x230, 0x3bd, 0x397, 0x254, 0x3db, 0x22, 0x294, 0x40, 0x28e, 0x263, 0x3aa, 0x2a1, 0x3e2, 0x378, 0x3d3, 0x2e3, 0x177, 0x1aa, 0x1f1, 0x378, 0x9c, 0x29d, 0x1f4, 0x3fc, 0x1e1, 0x23f, 0x2ff, 0x1c0, 0x362, 0xd3, 0x204, 0x3ed, 0x375, 0x2bf, 0xd5, 0x2fc, 0x1bc, 0x4e, 0x34a, 0xfa, 0x1fe, 0x2f4, 0x31b, 0x37b, 0xe0, 0x1b1, 0x26d, 0x102, 0x3f2, 0x3be, 0x35b, 0x26e, 0x17e, 0xde, 0x27, 0x1a5, 0x7d, 0xff, 0x17a, 0x389, 0x3b9, 0x70, 0x2dc, 0x332, 0x81, 0x1f9, 0x1df, 0x3a9, 0x137, 0xbf, 0x6f, 0x217, 0x2d6, 0x23a, 0x27b, 0xbd, 0x3c0, 0x3d8, 0x38, 0x16e, 0x199, 0x244, 0x2f8, 0x2eb, 0x3d0, 0x29f, 0x25b, 0x233, 0x30f, 0x16b, 0x11d, 0x339, 0x25a, 0x1e0, 0x1ec, 0x1c, 0xb7, 0x2c8, 0x122, 0x17c, 0x371, 0x1e8, 0x34b, 0x329, 0x31d, 0x383, 0x2b1, 0x28a, 0x398, 0x12d, 0xf0, 0xf6, 0xe, 0x25f, 0x164, 0x91, 0xbe, 0x3bc, 0xf4, 0x3a1, 0x390, 0x38a, 0x3c5, 0x35c, 0x145, 0x1cc, 0x292, 0x78, 0x3af, 0x39e, 0x3aa, 0x296, 0x257, 0x38f, 0x28b, 0x96, 0x323, 0x23, 0x1ed, 0x397, 0x142, 0x1c7, 0x92, 0x184, 0x240, 0x35e, 0x1dd, 0xc, 0x3e0, 0x2ac, 0x3dc, 0x2d7, 0x3d2, 0x260, 0x24b, 0x2e1, 0x1b9, 0x194, 0xce, 0x2c0, 0x303, 0x136, 0x2d1, 0x222, 0x336, 0x3a5, 0x18e, 0x50, 0xa4, 0x3ef, 0x1b4, 0x1db, 0x1fc, 0x2b6, 0x342, 0xb3, 0x33e, 0x2e2, 0x141, 0x13f, 0x39, 0x173, 0x1f3, 0x1ae, 0x145, 0x398, 0x25a, 0x3c0, 0x3b9, 0xe0, 0x362, 0x1a6, 0x2, 0x357, 0x335, 0x35d, 0x125, 0xa7, 0x317, 0x11f, 0x12c, 0x24f, 0x46, 0x3da, 0x327, 0x284, 0x38e, 0x124, 0x308, 0x89, 0x2b5, 0x3ba, 0x18, 0x3c9, 0x151, 0x3b1, 0x1a7, 0x3ad, 0xc9, 0x9f, 0x1cb, 0x372, 0x328, 0x19c, 0x189, 0x20f, 0x26c, 0x1ab, 0x4d, 0x265, 0x343, 0x31c, 0xa0, 0x148, 0x3d7, 0x368, 0x3b6, 0x3f8, 0x165, 0x28d, 0x166, 0x275, 0x357, 0x263, 0x16f, 0x13a, 0x262, 0x238, 0x359, 0x30d, 0x302, 0x13b, 0x135, 0x5b, 0x236, 0x237, 0x160, 0x303, 0x26c, 0x356, 0x134, 0x30c, 0x55, 0x358, 0x5a, 0x161, 0x54, 0xf, 0x239, 0xe, 0x16e, 0x26d, 0x1, 0x357, 0x263, 0x16f, 0x13a, 0x262, 0x238, 0x359, 0x30d, 0x302, 0x13b, 0x135, 0x5b, 0x236, 0x237, 0x160, 0x303, 0x26c, 0x356, 0x134, 0x30c, 0x55, 0x358, 0x5a, 0x161, 0x54, 0xf, 0x239, 0xe, 0x16e, 0x26d, 0x1, 0x357, 0x263, 0x16f, 0x13a, 0x262, 0x238, 0x359, 0x30d, 0x302, 0x13b, 0x135, 0x5b, 0x236, 0x237, 0x160, 0x303, 0x26c, 0x356, 0x134, 0x30c, 0x55, 0x358, 0x5a, 0x161, 0x54, 0xf, 0x239, 0xe, 0x16e, 0x26d, 0x1, 0x357, 0x263, 0x16f, 0x13a, 0x262, 0x238, 0x359, 0x30d, 0x302, 0x13b, 0x135, 0x5b, 0x236, 0x237, 0x160, 0x303, 0x26c, 0x356, 0x134, 0x30c, 0x55, 0x2a7, 0x19e, 0x36a, 0x384, 0xcb, 0x33b, 0x3b3, 0x3d2, 0x192, 0xf1, 0x11e, 0x21e, 0x12f, 0x2ce, 0x2cb, 0x2e2, 0x10d, 0x3d4, 0x25b, 0x1bc, 0x270, 0x314, 0x395, 0x46, 0x373, 0x21c, 0x68, 0x1f2, 0x16, 0x1e3, 0x9b, 0x1ab, 0x134, 0x211, 0x154, 0x2f6, 0x1a9, 0x73, 0x12d, 0x389, 0x1f7, 0x3f, 0x20c, 0x242, 0x24, 0x2d3, 0x1dd, 0x30, 0x277, 0x27a, 0x346, 0x42, 0x1fd, 0x6d, 0x1db, 0x3f9, 0x33a, 0x114, 0x24c, 0x2f8, 0x375, 0x1d5, 0x125, 0x29c, 0x11c, 0x359, 0x213, 0x13, 0x1ca, 0x374, 0x372, 0xbb, 0x1f6, 0x298, 0x392, 0x128, 0x3a0, 0x218, 0x2e6, 0x383, 0x1a5, 0x3e8, 0x3b7, 0x15c, 0x3e3, 0x142, 0x315, 0x132, 0x1d8, 0x19, 0x198, 0xa3, 0x2c9, 0x3a5, 0x231, 0x109, 0x15a, 0x2a, 0xf, 0x7b, 0x38, 0x362, 0x291, 0x20, 0x5d, 0x3ac, 0x183, 0x7c, 0x156, 0x3b1, 0x295, 0x2ae, 0x22c, 0x21f, 0x147, 0x271, 0x366, 0x3e, 0x156, 0x36b, 0x246, 0x15d, 0x288, 0x370, 0x3f8, 0x33a, 0x228, 0x122, 0x3ed, 0x335, 0x2de, 0x1c2, 0xcb, 0x27f, 0x2d7, 0x2af, 0x116, 0x21f, 0x319, 0x15b, 0x113, 0x24d, 0xbe, 0x3be, 0x1d5, 0x24a, 0x262, 0xf2, 0x1f5, 0x2f0, 0xc9, 0xf1, 0x23c, 0x6a, 0x16a, 0xb3, 0x1c6, 0x1de, 0x3a9, 0x354, 0x257, 0x47, 0x3a8, 0x213, 0x26, 0x321, 0x396, 0x345, 0x34d, 0x167, 0x2cb, 0x1cd, 0x3d, 0x29f, 0x1f1, 0x3e5, 0x11f, 0x172, 0x2c4, 0x13b, 0xdd, 0x1b9, 0xbb, 0x3ec, 0x272, 0xaf, 0x2a4, 0xf5, 0x329, 0x1bc, 0xe9, 0x4b, 0x97, 0x69, 0x2a3, 0x229, 0x65, 0x19c, 0x53, 0x2e0, 0x94, 0x3a0, 0x39, 0x38a, 0x27, 0x266, 0x1e7, 0x23, 0x373, 0x31, 0x1a0, 0x38b, 0x160, 0x17, 0x281, 0x1d, 0x225, 0x35a, 0x3e6, 0x2d6, 0x3e8, 0x367, 0x179, 0x327, 0xd, 0x278, 0xb, 0x1e3, 0x28e, 0x1d6, 0x306, 0x3e0, 0x29a, 0x346, 0x108, 0x3ef, 0x376, 0xc6, 0xe, 0x362, 0x256, 0x200, 0x36d, 0x3ba, 0x180, 0x26b, 0x337, 0xa0, 0xad, 0x54, 0x78, 0x37b, 0x3f, 0x22, 0x61, 0x112, 0x21d, 0x32e, 0x2c9, 0x28f, 0x358, 0x2d0, 0xe6, 0x17a, 0x1dc, 0x24e, 0x2e7, 0x99, 0x3b0, 0xc8, 0x36c, 0x134, 0x56, 0x16d, 0xd7, 0x23a, 0x3eb, 0x15c, 0x397, 0xd, 0xf9, 0x2c, 0x303, 0x344, 0x1d, 0x43, 0x173, 0x30f, 0x133, 0x1e7, 0x46, 0x1d7, 0x188, 0x236, 0x19c, 0xa6, 0x392, 0xa9, 0x27e, 0x329, 0x378, 0x3a4, 0x258, 0x162, 0x13b, 0x1ba, 0x2ed, 0x1d1, 0x2b7, 0x2cb, 0x39a, 0xf4, 0xd5, 0x32f, 0x47, 0x359, 0x5e, 0x130, 0x27c, 0x23c, 0xd4, 0x1a1, 0x191, 0x5f, 0x3be, 0x3aa, 0x13a, 0x334, 0x33b, 0x2d7, 0x157, 0x51, 0xdc, 0x1fc, 0x33a, 0x59, 0x81, 0x357, 0x33c, 0x366, 0x7c, 0x151, 0x115, 0x351, 0x6, 0x277, 0x3f4, 0x14, 0x129, 0x2a, 0x78, 0x2ff, 0xfc, 0x110, 0x219, 0x208, 0x269, 0x4d, 0x2b, 0x16d, 0x1ae, 0xfa, 0x367, 0x1ed, 0x21c, 0x340, 0x67, 0x53, 0x392, 0x152, 0x1ea, 0x17e, 0x3e5, 0x75, 0x30d, 0x4c, 0x13e, 0x23c, 0x1a8, 0x28d, 0x93, 0x1f9, 0x335, 0x36a, 0x1f, 0x2ac, 0x36e, 0x42, 0x3f3, 0x376, 0x18c, 0x38, 0x326, 0x121, 0x90, 0x2c6, 0x2cf, 0x360, 0x28f, 0x2b9, 0x352, 0x339, 0x38d, 0x3fe, 0x284, 0x13c, 0x16, 0x303, 0x281, 0x74, 0x218, 0x31d, 0x138, 0x4b, 0x25c, 0x299, 0x1ba, 0x1d3, 0x34d, 0x195, 0xe3, 0x3bc, 0x177, 0x24a, 0x19a, 0x33b, 0x1a7, 0x155, 0x288, 0x1db, 0x3f7, 0x32b, 0xd3, 0x20, 0x2e8, 0x2ea, 0xc0, 0x26b, 0x267, 0x280, 0x161, 0x149, 0x31b, 0x34f, 0x3bf, 0x248, 0x3b0, 0x190, 0x1ab, 0x1b2, 0x169, 0x1f3, 0x1a5, 0x37f, 0x23, 0x1d7, 0x22a, 0x15f, 0x30, 0x331, 0x267, 0x109, 0x18d, 0x25a, 0x1dc, 0x12a, 0x223, 0x201, 0x385, 0x281, 0xe8, 0x72, 0xde, 0x3a4, 0x172, 0x20d, 0x24b, 0x11e, 0x1a8, 0x113, 0x24c, 0x3d3, 0x33c, 0x183, 0x3c9, 0xfd, 0xa, 0x129, 0x54, 0x1e0, 0x3d5, 0x3db, 0x248, 0x369, 0x249, 0x143, 0x316, 0x173, 0x27, 0x314, 0x12e, 0x299, 0x374, 0x345, 0x25e, 0x166, 0x5f, 0x2e3, 0x2de, 0x20b, 0x2ac, 0x2d5, 0x108, 0x3a7, 0x305, 0x1ec, 0x21b, 0x44, 0x308, 0x208, 0xdb, 0x134, 0x158, 0x2fd, 0x1a5, 0x2f7, 0x8c, 0x2a3, 0x16c, 0x176, 0x2b7, 0x33e, 0x1de, 0x177, 0x9d, 0x261, 0x1ee, 0x246, 0x2fa, 0x368, 0x63, 0x1c, 0x326, 0x242, 0x240, 0x21d, 0xa3, 0xc3, 0x2a8, 0x26f, 0x7d, 0x367, 0x3da, 0x62, 0x236, 0x279, 0x272, 0x171, 0x7a, 0x1aa, 0x14e, 0xf2, 0x3b3, 0x157, 0x144, 0x1db, 0x3e7, 0xb7, 0x291, 0x200, 0x5d, 0x175, 0x180, 0x37c, 0x6b, 0x2d0, 0x339, 0x22f, 0x397, 0x68, 0x237, 0xa6, 0xaf, 0x21a, 0xd5, 0x14e, 0x1e4, 0x2d7, 0x2aa, 0x6d, 0x31e, 0xe, 0x326, 0x8d, 0x112, 0xcc, 0x222, 0x56, 0x37a, 0x1a5, 0x1e7, 0x230, 0x135, 0x2ed, 0x293, 0xb3, 0x5f, 0x1cf, 0x36a, 0x7c, 0x29a, 0x206, 0x290, 0x54, 0x3c0, 0x34f, 0x2e7, 0xc1, 0x1e3, 0x344, 0xe8, 0xe4, 0x378, 0x11f, 0x30d, 0x130, 0x3c4, 0x23b, 0x33a, 0x2c8, 0x8, 0x2e8, 0x3ba, 0x1b, 0x3d6, 0x358, 0x2ad, 0x1fe, 0x15c, 0x87, 0x340, 0x19c, 0x139, 0x171, 0xf4, 0x2a1, 0x262, 0x33b, 0x295, 0x17d, 0x368, 0xc6, 0x70, 0x106, 0x61, 0x82, 0x269, 0x134, 0x2b0, 0x3e6, 0x133, 0x323, 0x1a4, 0x1ba, 0x345, 0xb5, 0x191, 0x2f8, 0x263, 0x366, 0x3e0, 0xfd, 0x14, 0xad, 0x2a0, 0x23f, 0x24e, 0x315, 0x201, 0x303, 0x216, 0x349, 0x329, 0x3f6, 0xba, 0x1dd, 0x1b, 0x3a5, 0x17b, 0x145, 0x3df, 0x3da, 0x188, 0x328, 0x35f, 0x275, 0x2eb, 0x2b3, 0x20b, 0x2a2, 0x103, 0x290, 0xa8, 0x31b, 0x24e, 0x223, 0x16, 0x2e, 0x128, 0x1ea, 0x3e2, 0x8e, 0x3ea, 0x157, 0x119, 0x18f, 0xe, 0x245, 0x234, 0x82, 0xdb, 0xd9, 0x1ad, 0x217, 0x221, 0x162, 0x394, 0x11e, 0x2a9, 0x114, 0x204, 0x5d, 0x2ea, 0x209, 0x3d6, 0x2b9, 0x2a6, 0x3eb, 0x1ed, 0xc4, 0x194, 0x3ab, 0x33e, 0x371, 0x35d, 0x301, 0x151, 0x285, 0x148, 0x54, 0x389, 0x127, 0x315, 0xb, 0x17, 0x94, 0xf5, 0x1f1, 0x47, 0x1f5, 0x2af, 0x288, 0x2c3, 0x7, 0x326, 0x11a, 0x41, 0x269, 0x268, 0x2d2, 0x30f, 0x314, 0xb1, 0x1ca, 0x8f, 0x350, 0x8a, 0x102, 0x22a, 0x175, 0x300, 0x1eb, 0x358, 0x153, 0x3f1, 0x2f2, 0x62, 0xca, 0x3d1, 0x19f, 0x3bc, 0x3aa, 0x384, 0x2ac, 0x346, 0xa4, 0x2a, 0x3c0, 0x174, 0x37d, 0xd8, 0x22e, 0x333, 0x1f4, 0x23, 0x14f, 0x2ed, 0x25e, 0x322, 0x3ed, 0xeb, 0xc, 0x26b, 0x231, 0x1a9, 0x1fe, 0x179, 0x62, 0x194, 0x35f, 0xe3, 0x3be, 0x1b5, 0xf8, 0xfd, 0x50, 0x2c2, 0x17a, 0x3fe, 0x1a, 0x237, 0x298, 0x2e2, 0x3a9, 0x9d, 0x32c, 0x36e, 0x29, 0x15, 0x3c0, 0x127, 0x223, 0x2c, 0xb8, 0x152, 0x29f, 0xa7, 0x3c8, 0x295, 0x1fd, 0x2e5, 0x1ec, 0xfc, 0x124, 0x1bf, 0x1a2, 0x1d0, 0x329, 0x3c3, 0x2bb, 0x3ad, 0x144, 0x2c3, 0xe, 0x83, 0xc2, 0x19, 0x1ab, 0x316, 0x38a, 0x1d2, 0x1c1, 0x130, 0x30b, 0x3f8, 0x32b, 0x12b, 0x48, 0x21d, 0x111, 0xac, 0x3e6, 0xc5, 0x25c, 0x1ca, 0x11e, 0x15b, 0x59, 0x4, 0x1d9, 0x1ef, 0x360, 0xaa, 0xd7, 0x3d9, 0x8c, 0x135, 0x3a6, 0x16a, 0x93, 0x3af, 0x3ac, 0x30, 0x1be, 0xd6, 0x2ad, 0x3f1, 0x1ed, 0x188, 0x259, 0x167, 0x38c, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x1d9, 0x3b5, 0x265, 0x2da, 0x29d, 0x12e, 0x394, 0xe2, 0x33a, 0xd3, 0x12, 0x21d, 0x4d, 0x2d2, 0x4e, 0xb9, 0x98, 0x21f, 0x3ff, 0x1b1, 0x8d, 0x104, 0x1ab, 0x43, 0xde, 0x75, 0x2f0, 0xa2, 0x18f, 0x70, 0x44, 0x1d8, 0x26c, 0x1d0, 0xbf, 0x47, 0x3b3, 0x2ba, 0x376, 0x3d8, 0x3e9, 0xc1, 0x20f, 0x250, 0x29f, 0x29c, 0xf7, 0x21, 0x287, 0x1e0, 0x24e, 0x13c, 0x189, 0xaf, 0x1e8, 0x9d, 0xab, 0x285, 0x252, 0x12d, 0x1ff, 0x34, 0x19c, 0x3b4, 0x3bc, 0x16f, 0xf8, 0x3f4, 0x109, 0x1cc, 0xae, 0x31, 0x328, 0x2ce, 0x5f, 0xcf, 0x3, 0x26b, 0xd6, 0x2a6, 0x367, 0x3ae, 0x372, 0xb5, 0x126, 0x147, 0x175, 0x36, 0x22e, 0xd7, 0x37f, 0xd2, 0x1cb, 0x1a8, 0x228, 0x8, 0x2d3, 0x197, 0x30c, 0x2fd, 0xc5, 0x162, 0x9f, 0x319, 0x1e6, 0x291, 0x90, 0xcc, 0x268, 0x2bd, 0x270, 0x1c1, 0xc9, 0xdc, 0x3b2, 0x2cf, 0x30c, 0x1f3, 0x314, 0x302, 0x1e2, 0x3f8, 0x16e, 0x242, 0x104, 0x356, 0x10c, 0x2f9, 0x359, 0x2af, 0xda, 0x239, 0xfc, 0x132, 0x303, 0x250, 0x137, 0x262, 0x3b1, 0x210, 0x54, 0xee, 0x101, 0x237, 0xed, 0x1de, 0x16f, 0x1f0, 0x3cb, 0x5a, 0xff, 0x1ed, 0x5b, 0x34d, 0x322, 0x357, 0x2be, 0x36, 0x55, 0x35c, 0x3ce, 0x13b, 0x11e, 0x2ca, 0x26d, 0x12, 0x33, 0x134, 0x2bd, 0xe9, 0x30d, 0x241, 0x1db, 0xe, 0x11, 0xec, 0x26c, 0x3a0, 0x2fc, 0x238, 0x34e, 0x3fd, 0xf, 0x3a3, 0x223, 0x160, 0x253, 0x1e8, 0x13a, 0x2ac, 0x5, 0x161, 0x1e1, 0x327, 0x236, 0x35f, 0x311, 0x263, 0x3, 0xdf, 0x358, 0x11d, 0x215, 0x135, 0x10f, 0x226, 0x1, 0x3b2, 0x2cf, 0x30c, 0x1f3, 0x314, 0x302, 0x1e2, 0x3f8, 0x16e, 0x242, 0x104, 0x356, 0x10c, 0x2f9, 0x359, 0x2af, 0xda, 0x239, 0xfc, 0x132, 0x303, 0x36d, 0x32e, 0x56, 0x30f, 0x258, 0x130, 0xdc, 0x307, 0x106, 0x76, 0x26c, 0x349, 0x3e2, 0x1e4, 0x85, 0x347, 0x3c0, 0x254, 0x3c1, 0x139, 0xef, 0x16f, 0x3e0, 0x337, 0x2d0, 0x3eb, 0x1d7, 0x2ed, 0x1a1, 0x81, 0x2e8, 0x363, 0x30c, 0x3e6, 0x4b, 0x26, 0x21f, 0x3e7, 0x326, 0x308, 0x249, 0xe8, 0x17e, 0x238, 0x295, 0x3ef, 0x78, 0x24e, 0xf9, 0xa6, 0x39a, 0x3aa, 0x7c, 0x3e1, 0x5a, 0x1fe, 0x3bd, 0x2d8, 0xb5, 0x91, 0x5d, 0x1ef, 0x265, 0x37a, 0x18a, 0x302, 0x3c4, 0x3fb, 0x362, 0x61, 0xc8, 0x1d, 0x329, 0x47, 0x2d7, 0x3fa, 0xf, 0x34f, 0x9e, 0x312, 0x171, 0x177, 0x20b, 0xfd, 0x109, 0x339, 0x2f2, 0x5b, 0x293, 0x93, 0x28e, 0x3ba, 0x2c9, 0x16d, 0x133, 0x162, 0x27c, 0x1fc, 0x16e, 0x8d, 0x19, 0x286, 0xe4, 0x38f, 0x3dd, 0x17d, 0x386, 0x3ee, 0x315, 0x160, 0xaf, 0x3a9, 0x1c2, 0x29a, 0x2d3, 0xa3, 0x2b0, 0x9c, 0x382, 0x8b, 0x2c3, 0x1c0, 0x92, 0x3c6, 0x250, 0xd5, 0x261, 0x1a3, 0xad, 0x2f4, 0x247, 0x194, 0x32a, 0x3f2, 0x2ab, 0x36, 0x154, 0x1a5, 0x25c, 0x13e, 0x1fc, 0x2dc, 0x234, 0xc8, 0x3a, 0xbf, 0x238, 0x123, 0x3a7, 0x3c0, 0xa1, 0x31f, 0x1da, 0x2eb, 0x1b3, 0x1ce, 0xd6, 0x11d, 0x46, 0x374, 0x350, 0x2c8, 0x9, 0x66, 0x1b2, 0x31d, 0x75, 0x3ad, 0xda, 0xf6, 0x3db, 0xb, 0x1c9, 0xf4, 0x274, 0x14d, 0xa0, 0x1cc, 0x179, 0x5b, 0x12f, 0x24c, 0x5d, 0x3de, 0x186, 0x3e6, 0x96, 0x98, 0xdc, 0x207, 0x11, 0x3b0, 0x281, 0x1ea, 0x14e, 0x3dc, 0x29, 0x2a0, 0x1ff, 0x1a0, 0x3d1, 0x311, 0x19e, 0x30, 0x3a5, 0x26f, 0x1e7, 0x276, 0xe2, 0x1e6, 0xa5, 0x41, 0x356, 0x39, 0x3c3, 0x3dd, 0x2fa, 0x203, 0x34f, 0x13c, 0x53, 0x39a, 0x35d, 0x1f0, 0x337, 0x1a9, 0x3b7, 0x2a3, 0x1af, 0x28c, 0x1ad, 0x1d2, 0xbc, 0x288, 0x318, 0x3f0, 0x201, 0x1c9, 0x1e8, 0x1c2, 0x27a, 0x212, 0x1fe, 0x2ef, 0x1d3, 0x113, 0x4, 0x2b5, 0x222, 0x2bd, 0x341, 0x2f0, 0x232, 0x7b, 0x3db, 0x16, 0x32d, 0x3a9, 0x301, 0x1fa, 0x5a, 0x3f1, 0x3ae, 0x345, 0x45, 0x10, 0x2c6, 0x9a, 0x2e6, 0x11f, 0x3d2, 0xda, 0x1ec, 0x377, 0x58, 0xaf, 0x2bf, 0x1f, 0x3e1, 0x168, 0x3df, 0x2a3, 0x10f, 0x114, 0x40, 0x30a, 0x268, 0x38a, 0x75, 0x353, 0x368, 0x3b9, 0x1c7, 0x160, 0x2bc, 0x2ee, 0x7c, 0x39f, 0x1a9, 0x367, 0x29e, 0x35, 0x59, 0x100, 0x33, 0x1b2, 0x233, 0x1d4, 0x157, 0x1bb, 0x2ff, 0x315, 0x189, 0x2e2, 0x3aa, 0x1f0, 0x267, 0x2ad, 0x187, 0x26a, 0xd4, 0x164, 0x9, 0xcc, 0x2c1, 0xde, 0x359, 0x155, 0x2e5, 0x3ee, 0x4f, 0x22d, 0x39a, 0x2b3, 0x3c9, 0x18e, 0x2a6, 0x215, 0x1ba, 0x350, 0x199, 0x24, 0x35e, 0x222, 0x173, 0x11f, 0x3ad, 0x368, 0x37b, 0x315, 0x312, 0x39a, 0x16f, 0x33f, 0x6b, 0x23a, 0x230, 0x243, 0x33a, 0x256, 0x82, 0x286, 0x329, 0x238, 0x85, 0x20e, 0x1dc, 0x68, 0x3d1, 0x5f, 0x1d6, 0x1b, 0x2a8, 0x133, 0x302, 0x21f, 0x307, 0x22, 0x1bf, 0x94, 0xd5, 0x196, 0x206, 0x31a, 0x15c, 0x5b, 0xb5, 0x81, 0x36d, 0x146, 0x1ad, 0x3a4, 0x2f0, 0x6d, 0x1ec, 0x2e7, 0x160, 0x171, 0x3aa, 0x3e0, 0x18e, 0x145, 0x46, 0x1cb, 0x165, 0x34c, 0x112, 0x356, 0xe4, 0x47, 0x295, 0x347, 0x23f, 0xd, 0xfb, 0x38c, 0x33c, 0x180, 0x55, 0x1a5, 0x162, 0x3c4, 0x3e7, 0x106, 0x3b0, 0x216, 0x29f, 0x334, 0x346, 0x161, 0x22f, 0x188, 0x293, 0x91, 0x2e8, 0x32e, 0x2b0, 0x270, 0x5e, 0x288, 0x239, 0x3db, 0x2c, 0xaf, 0x177, 0x7c, 0x337, 0x2ad, 0x30e, 0x1ba, 0x2a9, 0x26d, 0x120, 0x36c, 0x218, 0x38f, 0x2b5, 0x9a, 0x38a, 0x1d4, 0x155, 0x386, 0x297, 0x3e4, 0x1da, 0x375, 0x3, 0x3d6, 0x1ae, 0x97, 0x27c, 0x3ff, 0x83, 0x3b0, 0x25, 0x26e, 0x196, 0x5, 0x73, 0x2f2, 0x1b9, 0x28d, 0x8, 0x185, 0xd9, 0x6f, 0x2bb, 0x2ba, 0xf, 0x95, 0x31f, 0x2cb, 0x39e, 0x18, 0x28f, 0x16b, 0xb1, 0x3c4, 0x3c7, 0x11, 0x1bf, 0x128, 0x354, 0xab, 0x28, 0x398, 0x3bd, 0x1d3, 0x45, 0x40, 0x33, 0x2c1, 0x378, 0x1f5, 0x1fd, 0x78, 0xa1, 0xce, 0x275, 0xcf, 0xc0, 0x55, 0x34a, 0x181, 0x21f, 0x207, 0x88, 0x1e3, 0x152, 0x296, 0x151, 0x140, 0xff, 0x1d7, 0x283, 0x228, 0x200, 0x198, 0x225, 0x3f6, 0x3b3, 0x3f3, 0x3c0, 0x101, 0x279, 0x38c, 0x271, 0x209, 0x2a8, 0x266, 0x13, 0xdc, 0x1c, 0x49, 0x303, 0x282, 0x9d, 0x29a, 0x212, 0x3f1, 0x2a3, 0x35, 0x164, 0x24, 0xdb, 0x10c, 0x38f, 0x1a7, 0x3a7, 0x23f, 0x163, 0x268, 0x6f, 0x17f, 0x2fa, 0x78, 0x142, 0x338, 0x38c, 0xeb, 0x36, 0x16d, 0x221, 0x260, 0x365, 0x21b, 0x182, 0x392, 0x2bf, 0xf8, 0x18e, 0x11d, 0x69, 0x23c, 0x391, 0x11a, 0x249, 0x13f, 0x29c, 0x36e, 0x2b4, 0x57, 0x5b, 0x2d4, 0x2, 0x2c6, 0xd9, 0xde, 0x2fe, 0x1fd, 0xf0, 0x284, 0x279, 0x311, 0x1d6, 0x6c, 0x2da, 0x4b, 0xc9, 0x2c3, 0x3f, 0x304, 0x32d, 0x177, 0x1f0, 0x31c, 0x23a, 0xd2, 0x71, 0x32b, 0x234, 0x9b, 0x27e, 0x131, 0x2d5, 0x161, 0xae, 0xb6, 0x1a1, 0x4, 0x185, 0x1b2, 0x1bc, 0x1f5, 0x3fa, 0x1e0, 0x101, 0xfb, 0x22b, 0x3ac, 0xd8, 0x1bd, 0x96, 0x192, 0x18f, 0x7e, 0x201, 0x253, 0x2ee, 0x3e0, 0x231, 0x7d, 0x1a4, 0xe2, 0x25f, 0x61, 0x136, 0xf5, 0x262, 0x1a3, 0x2c2, 0x15c, 0x16c, 0x342, 0x8, 0x30a, 0x364, 0x378, 0x3ea, 0x3fd, 0x3c0, 0x202, 0x1f6, 0x5f, 0x2c6, 0x1b2, 0x378, 0x3dd, 0x3ef, 0x23f, 0x68, 0x2b7, 0x3ed, 0x3ba, 0x30c, 0x4e, 0x5e, 0x6d, 0x37b, 0x9e, 0x139, 0x3be, 0x6, 0x28f, 0x1a5, 0x302, 0xdc, 0x70, 0x99, 0x170, 0x3a9, 0x7c, 0x18e, 0x23a, 0x1a4, 0x1c4, 0x16e, 0x308, 0x344, 0x29f, 0x196, 0x14, 0x339, 0x1d7, 0x21e, 0x2c8, 0x120, 0x356, 0x329, 0x1e4, 0x108, 0x12d, 0x87, 0x1d1, 0x91, 0x36d, 0x222, 0x38a, 0x359, 0x17d, 0x78, 0x284, 0xfb, 0x5f, 0x2ab, 0x2c9, 0x3e6, 0x2e4, 0x51, 0x239, 0x2e7, 0x312, 0xef, 0x366, 0x37c, 0xd7, 0x12e, 0x3c4, 0x307, 0x110, 0x303, 0x21a, 0x1c2, 0x3e1, 0x2ad, 0x46, 0x243, 0x1e6, 0x8d, 0x249, 0x27e, 0x262, 0x346, 0x31a, 0x2f2, 0x2ed, 0x8a, 0x200, 0x269, 0x218, 0x47, 0x85, 0x54, 0x3f5, 0x194, 0x191, 0x5d, 0x32e, 0x1ad, 0x11f, 0x157, 0x386, 0x24e, 0x237, 0x275, 0x33c, 0x1b, 0x16d, 0x185, 0x2c1, 0x3f6, 0x1a7, 0x107, 0x2fb, 0x65, 0x2cc, 0x5d, 0x255, 0x2bd, 0xea, 0x15d, 0x3c, 0x284, 0x1f6, 0x17c, 0x175, 0xc3, 0x27, 0x5e, 0xda, 0x1f7, 0xf9, 0x3b4, 0x335, 0x180, 0x159, 0x221, 0x192, 0x235, 0x3e9, 0x160, 0x33d, 0x1b3, 0x37c, 0x1ae, 0xb1, 0x21f, 0x1c, 0x248, 0x170, 0x35b, 0x1f0, 0x6b, 0x3e8, 0xe5, 0x1fc, 0x245, 0x2db, 0xa9, 0x24a, 0x27a, 0x2d0, 0x215, 0x325, 0x1e6, 0x11a, 0x136, 0x3d4, 0x261, 0xa, 0x339, 0x3ae, 0x6a, 0x26d, 0x224, 0x20a, 0x3e2, 0x3dc, 0x252, 0x22f, 0xb6, 0x28d, 0x40, 0x198, 0x10c, 0x47, 0x10a, 0x150, 0x397, 0x176, 0x24c, 0x36d, 0x4d, 0x233, 0x2fe, 0x3fd, 0x31b, 0x68, 0x167, 0x3af, 0x1ef, 0xac, 0x1d2, 0x3ad, 0x2e5, 0x127, 0x237, 0xe3, 0xeb, 0xd8, 0x2fd, 0x172, 0x51, 0x7b, 0x38e, 0xa6, 0x2eb, 0x3, 0x28f, 0x34a, 0x13, 0x2e9, 0x30a, 0x316, 0x38f, 0x246, 0xa8, 0x397, 0x2ec, 0x122, 0x35e, 0xd9, 0x2f9, 0x2d7, 0x107, 0x1ff, 0x194, 0x24d, 0x1d9, 0x222, 0x233, 0x1f5, 0x3ef, 0xee, 0x289, 0xb3, 0x22a, 0x255, 0x173, 0x3a8, 0x2fa, 0x3c0, 0x34, 0x167, 0x357, 0x3b5, 0x169, 0x11f, 0x155, 0x1e, 0x284, 0x3ec, 0x1f9, 0x3ba, 0x2b, 0xe9, 0x3ad, 0x1c3, 0x95, 0x19c, 0x22b, 0x15f, 0x265, 0x27, 0xbc, 0x368, 0x3a3, 0x38b, 0x275, 0xeb, 0x1b0, 0x3e6, 0x382, 0x119, 0x37b, 0x278, 0x3b4, 0x263, 0x209, 0x2da, 0x258, 0x22c, 0x7b, 0x315, 0x298, 0x375, 0x30, 0x154, 0x314, 0x192, 0x63, 0x3bf, 0x312, 0x3bc, 0x205, 0x28f, 0x29d, 0x4c, 0x365, 0xfc, 0x58, 0x39a, 0x1b3, 0x2f1, 0x2b1, 0x181, 0x1b8, 0x380, 0x304, 0x15e, 0x16f, 0x331, 0x333, 0x12e, 0x30b, 0x1c, 0x99, 0x1c9, 0x2ee, 0x33f, 0x17b, 0x3ce, 0x27c, 0x387, 0x220, 0x2e, 0x21d, 0x43, 0x47, 0x21, 0x12d, 0x31, 0xb5, 0x8, 0xcc, 0x218, 0x238, 0x108, 0x17a, 0x188, 0x1a1, 0x40, 0x269, 0xe4, 0x1e4, 0x52, 0x3c2, 0x5b, 0x113, 0x200, 0x36c, 0x329, 0x33b, 0x290, 0x22f, 0x2d8, 0x8a, 0x24, 0x356, 0x17e, 0x1ee, 0xad, 0x15c, 0x2ed, 0x59, 0x120, 0x286, 0x3e2, 0x36b, 0x161, 0x2f2, 0x345, 0x2c8, 0x112, 0x1d, 0x32f, 0x36e, 0x31a, 0x3bd, 0x21e, 0x26d, 0x82, 0xe8, 0x14e, 0x346, 0xe6, 0x1d7, 0xd4, 0x34c, 0x19, 0x349, 0x262, 0x206, 0x339, 0x2a3, 0x2a9, 0x256, 0xc8, 0x27e, 0x334, 0x14, 0x1fe, 0x135, 0x165, 0x294, 0x249, 0x3d4, 0x196, 0xa0, 0x3eb, 0x1ba, 0x33a, 0x8d, 0x26c, 0x29f, 0xab, 0x109, 0x367, 0x1cb, 0x1e6, 0x61, 0x344, 0xd5, 0x151, 0x5a, 0x30e, 0x243, 0x32b, 0x308, 0x216, 0x2a1, 0x29a, 0x2d0, 0x46, 0x23c, 0x16e, 0x76, 0x94, 0x125, 0xfd, 0x33, 0x10c, 0x238, 0x210, 0x1e1, 0x5b, 0x226, 0x12, 0x356, 0x2fc, 0x3b1, 0x161, 0x1ed, 0x10f, 0x26d, 0x104, 0x3a0, 0x262, 0x5, 0xff, 0x135, 0x2ca, 0x242, 0x26c, 0x137, 0x2ac, 0x5a, 0x215, 0x11e, 0x16e, 0xec, 0x250, 0x13a, 0x3cb, 0x11d, 0x13b, 0x3f8, 0x11, 0x303, 0x1e8, 0x1f0, 0x358, 0x3ce, 0x1e2, 0xe, 0x132, 0x253, 0x16f, 0xdf, 0x35c, 0x302, 0x1db, 0xfc, 0x160, 0x1de, 0x3, 0x55, 0x314, 0x241, 0x239, 0x223, 0xed, 0x263, 0x36, 0x1f3, 0x30d, 0xda, 0x3a3, 0x237, 0x311, 0x2be, 0x30c, 0xe9, 0x2af, 0xf, 0x101, 0x35f, 0x357, 0x2cf, 0x2bd, 0x359, 0x3fd, 0xee, 0x236, 0x322, 0x3b2, 0x134, 0x2f9, 0x34e, 0x54, 0x327, 0x34d, 0x1, 0x33, 0x10c, 0x238, 0x210, 0x1e1, 0x5b, 0x226, 0x12, 0x356, 0x2fc, 0x3b1, 0x161, 0x1ed, 0x10f, 0x26d, 0x104, 0x3a0, 0x262, 0x5, 0xff, 0x135, 0x66, 0x39, 0x1e4, 0x148, 0x57, 0x2ed, 0x164, 0x224, 0xe8, 0x131, 0x5, 0x1fe, 0xdd, 0x27d, 0x61, 0x10b, 0x14b, 0xfd, 0x2a6, 0x348, 0x1fc, 0x11, 0x20f, 0x3a9, 0x39b, 0x1e5, 0x12e, 0x6e, 0x309, 0x2c, 0x273, 0x205, 0x55, 0x221, 0x116, 0x1ec, 0x278, 0x19f, 0x1d6, 0x336, 0x9c, 0x3ad, 0x203, 0x101, 0x2b7, 0x147, 0x255, 0x38a, 0x3ea, 0x287, 0x3f5, 0x2ec, 0x102, 0x21d, 0x10c, 0x79, 0x52, 0x313, 0x1b9, 0x59, 0x89, 0x3a, 0x14e, 0x103, 0x27b, 0x135, 0x19d, 0x11a, 0x344, 0x354, 0x13d, 0x2ad, 0xd2, 0x7f, 0x106, 0x385, 0x1e8, 0x3e0, 0x17b, 0x24f, 0x21f, 0x1c0, 0xb, 0x39a, 0x183, 0x117, 0x18a, 0x241, 0x7b, 0x9e, 0x361, 0x271, 0x2c9, 0x27, 0x1e9, 0x386, 0x142, 0x3ab, 0x357, 0x197, 0x2e6, 0x2fe, 0x3a7, 0x1ff, 0xbb, 0x244, 0x185, 0x43, 0x11c, 0x210, 0x3c2, 0x16c, 0x114, 0x120, 0xcc, 0xe4, 0x33b, 0xad, 0x2f2, 0x21e, 0x34c, 0xc8, 0x3d4, 0xab, 0x5a, 0x46, 0x1c4, 0x326, 0x1e3, 0xf4, 0x3e0, 0x2f6, 0x12e, 0xdc, 0x3f, 0x160, 0x371, 0x30, 0x16d, 0x2e4, 0x6d, 0x34f, 0x19c, 0x2f8, 0x1ef, 0x1ad, 0x359, 0x3ef, 0x2fb, 0xbb, 0x81, 0x21d, 0x218, 0x1e4, 0x290, 0x15c, 0x345, 0x26d, 0x19, 0x27e, 0x196, 0x109, 0x30e, 0x23c, 0x362, 0x1bf, 0x21a, 0x7c, 0x358, 0x323, 0x21f, 0x380, 0x2c, 0xef, 0x6, 0x2a8, 0x258, 0x288, 0x3ee, 0x237, 0x5f, 0x3ba, 0x2b0, 0xea, 0x3fa, 0x1dc, 0x194, 0x91, 0x2c6, 0x43, 0x238, 0x52, 0x22f, 0x2ed, 0x2c8, 0x82, 0x349, 0x334, 0xa0, 0x367, 0x243, 0x16e, 0x3b0, 0x141, 0x20b, 0x6b, 0x1e7, 0x3c4, 0x70, 0x201, 0x39a, 0x306, 0x55, 0x4b, 0x51, 0x37b, 0x3c1, 0x38c, 0x175, 0x56, 0x11f, 0x17d, 0x23f, 0x236, 0x93, 0x35e, 0x18b, 0x47, 0x198, 0x390, 0x1ee, 0x2c2, 0x2ef, 0x2a9, 0x121, 0x1a2, 0x2a1, 0x1fa, 0x11d, 0x1ca, 0x3c7, 0x248, 0xaf, 0x2dd, 0x343, 0x18a, 0x116, 0x3b9, 0x3c1, 0x311, 0x1dd, 0x2b0, 0x1d4, 0x3f3, 0x2fb, 0x176, 0x204, 0xcc, 0x1c8, 0xf7, 0x161, 0x373, 0x350, 0x294, 0xd1, 0x354, 0xfd, 0x28a, 0xe5, 0x3e7, 0x124, 0x253, 0x36a, 0x3a5, 0xc5, 0x8b, 0x3d8, 0x3e4, 0x38c, 0x2ea, 0x158, 0xea, 0x3fd, 0x379, 0xbb, 0x102, 0x66, 0xe4, 0x27f, 0x2b4, 0x3bd, 0x1a8, 0x14a, 0x26c, 0x1aa, 0x27a, 0x145, 0x276, 0x3f7, 0x92, 0x32d, 0x1b5, 0x3d6, 0x266, 0x241, 0x1ec, 0x1f2, 0x1c6, 0x175, 0xac, 0x75, 0x3fa, 0x3b8, 0x259, 0x81, 0x33, 0x72, 0x33b, 0x15a, 0x3da, 0xd4, 0xa5, 0x136, 0xd5, 0x13d, 0x2a6, 0x13b, 0x3ff, 0x49, 0x392, 0x2de, 0x1eb, 0x133, 0x324, 0xf6, 0xf9, 0xe3, 0x2be, 0x56, 0x23e, 0x1fd, 0x1dc, 0x330, 0x25b, 0x36b, 0x73, 0x14f, 0x33a, 0x184, 0x128, 0x1c2, 0x231, 0x3ce, 0x21f, 0x21b, 0x2c0, 0x3be, 0x209, 0x3c5, 0x2f0, 0x203, 0x1a, 0xb3, 0x3b2, 0x364, 0x47, 0x29, 0x57, 0x345, 0x1a6, 0x190, 0x29f, 0x14d, 0x153, 0x13b, 0x3f7, 0x124, 0xaf, 0x1b3, 0x117, 0x4b, 0x144, 0x3d5, 0x19c, 0x3f2, 0x2cf, 0x38a, 0x36f, 0xa8, 0x31, 0x28d, 0x48, 0x1d, 0x131, 0x28, 0x367, 0x11e, 0x2cd, 0x1e3, 0x3d0, 0x277, 0xd7, 0x13, 0x235, 0x315, 0x361, 0x3ac, 0x30c, 0x28b, 0x2fa, 0x1dc, 0x259, 0x102, 0xcc, 0x390, 0x3dc, 0x31a, 0x355, 0x2ca, 0x61, 0x4a, 0x274, 0x18e, 0x2f7, 0x381, 0x380, 0xb0, 0x2eb, 0x180, 0x1f3, 0xbc, 0x386, 0x202, 0x32a, 0x2e8, 0xd9, 0x317, 0x108, 0x313, 0x1d3, 0x26d, 0x64, 0x3a1, 0x151, 0x352, 0x348, 0x3fb, 0x49, 0x32d, 0x36a, 0x343, 0x314, 0x51, 0x1f7, 0x67, 0x2f8, 0x269, 0x17e, 0x36e, 0x339, 0x1ba, 0x32b, 0x3b0, 0x21a, 0x3e0, 0x39d, 0x302, 0x31e, 0x315, 0x2cb, 0x2ab, 0x56, 0xea, 0x3ef, 0x3f5, 0x293, 0x40, 0x356, 0x32f, 0x206, 0x3eb, 0x243, 0x362, 0x1e3, 0x3a9, 0x1ce, 0x2b1, 0x130, 0x239, 0xf9, 0x38c, 0x3ba, 0x1ad, 0x2fe, 0x20e, 0x87, 0x1a1, 0x24, 0x1d, 0x262, 0xa0, 0x30e, 0x1c4, 0x106, 0x2e, 0x3aa, 0x37c, 0x133, 0x8b, 0x37b, 0x237, 0x2f8, 0x363, 0x38a, 0x2d7, 0x2a0, 0x188, 0x8a, 0x112, 0x349, 0x196, 0x5a, 0x230, 0x1fc, 0x110, 0x392, 0x36a, 0x28f, 0x4b, 0x288, 0x34f, 0xfb, 0x357, 0x146, 0x378, 0x85, 0x17a, 0x2d8, 0x2c8, 0x19, 0x3d4, 0x151, 0x2ad, 0x13b, 0x3e7, 0x99, 0x171, 0x306, 0x2a8, 0x2e4, 0x368, 0x254, 0x2b7, 0x5d, 0x134, 0x38f, 0x108, 0x22f, 0x345, 0x34c, 0x249, 0xd5, 0xfd, 0x23a, 0x24b, 0xe, 0x201, 0xef, 0x30, 0x37a, 0xdb, 0x1f1, 0x346, 0x3fc, 0x325, 0x362, 0x3c6, 0x2bf, 0x26b, 0x34a, 0x241, 0x37b, 0x67, 0x3f2, 0x32e, 0xde, 0x246, 0x17a, 0x1b9, 0x332, 0xc8, 0x137, 0x27a, 0x23a, 0x9f, 0x38, 0x2c, 0x2eb, 0x209, 0x30f, 0x353, 0x1e0, 0x236, 0x122, 0x66, 0x329, 0x2df, 0x398, 0x1ba, 0x25f, 0x2db, 0xf4, 0x277, 0x35c, 0x130, 0x7b, 0x3e4, 0x5f, 0x3de, 0x1c5, 0x2d7, 0x149, 0x229, 0x59, 0x104, 0x1ea, 0x151, 0x153, 0xe5, 0x307, 0x182, 0x273, 0x30, 0x2fd, 0x178, 0xf, 0xd0, 0x24d, 0x2c6, 0x39, 0xf7, 0x31a, 0x14f, 0xf3, 0x76, 0x282, 0x1f0, 0x39d, 0x20d, 0x63, 0x9e, 0xe3, 0x1dd, 0x1ad, 0x1f5, 0x2a, 0x31, 0x226, 0x89, 0x349, 0x32c, 0x168, 0x1a4, 0x3ff, 0x248, 0x171, 0x205, 0x2b2, 0x30d, 0x2e5, 0x202, 0xb3, 0x2d3, 0x225, 0x1e4, 0x15a, 0x2ef, 0x165, 0xc2, 0x250, 0x20b, 0x2b9, 0xb1, 0x365, 0x1b6, 0x3cd, 0x206, 0x3b7, 0x71, 0x106, 0xb8, 0x2de, 0x28f, 0x12c, 0xda, 0x254, 0x2ce, 0x1d9, 0x18b, 0xf2, 0x15a, 0x1d7, 0x19d, 0x219, 0x141, 0x1f0, 0x333, 0x26, 0x318, 0x1f2, 0x5f, 0x3b5, 0x31d, 0x295, 0xbd, 0x1b9, 0x26d, 0x320, 0x1aa, 0x3e1, 0x3d9, 0x381, 0x3f, 0x53, 0xcf, 0x265, 0x28b, 0x3fd, 0x3f5, 0x25e, 0x9, 0x1d, 0x19a, 0x212, 0x230, 0x3f9, 0x124, 0x171, 0x3, 0x2da, 0x5e, 0x203, 0xd0, 0x93, 0x30a, 0x1c8, 0x36b, 0x398, 0x374, 0x16e, 0x2f5, 0x35b, 0x26b, 0x29d, 0x116, 0x3ee, 0x279, 0x2a7, 0x222, 0x3c3, 0x210, 0x15c, 0x6a, 0x121, 0x216, 0xe1, 0xd6, 0x12e, 0x3b6, 0x1c7, 0x2cb, 0x2be, 0x169, 0x2fe, 0x2a, 0x62, 0x8a, 0x41, 0xf5, 0x151, 0x2a6, 0x394, 0xe, 0x16, 0x2eb, 0x1b, 0x27, 0x2ae, 0x23f, 0x259, 0x2, 0x36c, 0x393, 0x5, 0x367, 0xe2, 0x20c, 0x170, 0x36c, 0x32f, 0x14, 0x30e, 0x23b, 0x110, 0xaf, 0x306, 0x16d, 0x5e, 0xf, 0x340, 0x91, 0xcc, 0x17e, 0x346, 0x3eb, 0x23c, 0x106, 0x170, 0x36a, 0x55, 0x2e4, 0x376, 0xd, 0x191, 0x2c6, 0xe4, 0x36b, 0x339, 0x1cb, 0x362, 0x303, 0x3aa, 0x3d6, 0x4b, 0x6d, 0x254, 0x195, 0x36d, 0x43, 0x33b, 0x31a, 0x135, 0x32b, 0x1bf, 0x3a9, 0x26b, 0x133, 0x51, 0x34f, 0x3d1, 0x5d, 0x1b2, 0x238, 0xad, 0x1d7, 0x33a, 0x76, 0x21a, 0x33f, 0x2b1, 0x192, 0x37b, 0x19c, 0x357, 0x222, 0x38f, 0x52, 0x2f2, 0x2a9, 0x61, 0xa9, 0x7c, 0x39d, 0x26, 0x239, 0x3c1, 0x2f8, 0x32e, 0x378, 0x21, 0x22f, 0x21e, 0x294, 0x216, 0x1c2, 0x358, 0x162, 0x31e, 0x9e, 0x38c, 0x1ef, 0x38a, 0x295, 0x17a, 0x2ed, 0x34c, 0x26c, 0x125, 0x18e, 0x323, 0x2e9, 0x2e7, 0x2cb, 0x175, 0x1ad, 0x3dd, 0x2a0, 0x5b, 0x2c8, 0xc8, 0xd5, 0x3e1, 0x2d1, 0xa7, 0xa0, 0x8c, 0x3f9, 0x99, 0x33d, 0xc0, 0x30f, 0x2ae, 0xee, 0x1d1, 0x80, 0x20a, 0x334, 0xb4, 0x299, 0x307, 0xb, 0x1df, 0xd8, 0xe9, 0x1fd, 0x3f5, 0x16a, 0x90, 0x349, 0x156, 0x2a6, 0x24b, 0xe0, 0x189, 0x263, 0xc3, 0x75, 0x347, 0x10e, 0x45, 0x82, 0x3a1, 0x27a, 0x1f4, 0x381, 0xfc, 0x139, 0x3ac, 0x158, 0x2fe, 0xa8, 0x229, 0x2c8, 0x190, 0x354, 0x337, 0x3ce, 0x370, 0x2e7, 0x19f, 0x1dd, 0x173, 0x1a7, 0xbd, 0x2ed, 0x291, 0x1a2, 0x13a, 0xd6, 0xb1, 0x31e, 0x13c, 0x22b, 0x363, 0xde, 0x214, 0x22f, 0x35, 0x242, 0x94, 0x1f, 0x3ca, 0x26, 0x7b, 0x31f, 0x3ed, 0x28c, 0x3c3, 0x52, 0x1ed, 0x2b6, 0x308, 0x282, 0x39b, 0x2b1, 0x324, 0x1f7, 0xfb, 0x115, 0xd9, 0x238, 0x15a, 0x355, 0x1e6, 0x369, 0x3d0, 0x26b, 0x266, 0x144, 0x24e, 0x167, 0x3b2, 0x43, 0x27f, 0x73, 0x1ba, 0x1ab, 0x29c, 0x109, 0xd2, 0x3c7, 0x201, 0x1df, 0x1b0, 0x3a4, 0x3f3, 0x327, 0x113, 0x41, 0x3a1, 0xfd, 0x3d9, 0x37, 0x3db, 0x361, 0x2ea, 0x173, 0x34e, 0x2f4, 0x345, 0x14a, 0x25, 0x20b, 0x3ca, 0x4c, 0x1ec, 0xce, 0x2a7, 0x134, 0x11c, 0x15a, 0x2a3, 0x391, 0x37e, 0x177, 0x1eb, 0x96, 0x368, 0x202, 0x322, 0x21d, 0xbf, 0x285, 0x367, 0x319, 0x220, 0x171, 0x18, 0x3c5, 0x157, 0xee, 0x3a2, 0x200, 0x74, 0x32c, 0x2ad, 0x321, 0xe0, 0x312, 0x19e, 0x211, 0x359, 0x2a, 0x310, 0x2c8, 0x320, 0x14b, 0x18e, 0x97, 0x2c3, 0x9e, 0x22b, 0x2cf, 0x378, 0x84, 0x2b8, 0x2a9, 0x184, 0x282, 0x33f, 0x2d6, 0x116, 0x34f, 0x35f, 0x1d9, 0x43, 0xf7, 0x1cc, 0x1cb, 0x193, 0x5c, 0x36a, 0x154, 0x213, 0xf, 0x11b, 0x102, 0x36c, 0xa7, 0x140, 0x230, 0x3f7, 0x182, 0x371, 0x6c, 0xe9, 0x3fa, 0x3cf, 0x342, 0x112, 0x356, 0x262, 0x5a, 0x13b, 0xe, 0x160, 0x263, 0x30c, 0x359, 0x54, 0x5b, 0x26d, 0x26c, 0x13a, 0x358, 0x302, 0x239, 0x237, 0x357, 0x134, 0x238, 0x161, 0x135, 0x16e, 0x303, 0x16f, 0x55, 0x30d, 0xf, 0x236, 0x1, 0x356, 0x262, 0x5a, 0x13b, 0xe, 0x160, 0x263, 0x30c, 0x359, 0x54, 0x5b, 0x26d, 0x26c, 0x13a, 0x358, 0x302, 0x239, 0x237, 0x357, 0x134, 0x238, 0x161, 0x135, 0x16e, 0x303, 0x16f, 0x55, 0x30d, 0xf, 0x236, 0x1, 0x356, 0x262, 0x5a, 0x13b, 0xe, 0x160, 0x263, 0x30c, 0x359, 0x54, 0x5b, 0x26d, 0x26c, 0x13a, 0x358, 0x302, 0x239, 0x237, 0x357, 0x134, 0x238, 0x161, 0x135, 0x16e, 0x303, 0x16f, 0x55, 0x30d, 0xf, 0x236, 0x1, 0x356, 0x262, 0x5a, 0x13b, 0xe, 0x160, 0x263, 0x30c, 0x359, 0x54, 0x5b, 0x26d, 0x26c, 0x13a, 0x358, 0x302, 0x239, 0x237, 0x357, 0x134, 0x238, 0x2a5, 0x19a, 0x2d0, 0x394, 0x1c0, 0xa6, 0x3ac, 0x2d2, 0x2d7, 0x2f4, 0x10f, 0x8d, 0x152, 0x39b, 0x1a5, 0xa2, 0x12a, 0xb3, 0x185, 0xbf, 0x206, 0x215, 0x3f9, 0xc1, 0x2eb, 0x360, 0x11f, 0x287, 0xc4, 0x2c8, 0x9b, 0x9d, 0x358, 0x20d, 0xf6, 0x19c, 0x115, 0x2c1, 0x33b, 0x1cc, 0x325, 0x106, 0x32d, 0x3, 0x3e6, 0x2ae, 0x379, 0xb5, 0x240, 0x1ea, 0xfd, 0x37f, 0x370, 0x315, 0x311, 0x197, 0x3f6, 0xa4, 0x2ef, 0x1e6, 0x37e, 0x1d5, 0x28f, 0x1c1, 0x203, 0x236, 0x2, 0x143, 0x334, 0x1a9, 0x321, 0x380, 0x14c, 0x351, 0x1ad, 0x1a7, 0x1e1, 0x21e, 0x11a, 0x2a4, 0x33f, 0x34a, 0x144, 0x254, 0x166, 0x30a, 0x17e, 0x5, 0x23, 0x3fb, 0x182, 0x1df, 0x2c9, 0x23e, 0x107, 0x188, 0x199, 0x136, 0x13a, 0x2b9, 0x13, 0x1ec, 0x338, 0x22a, 0x18b, 0x27f, 0x398, 0x243, 0x20c, 0x253, 0x6, 0x3c5, 0x155, 0x2fb, 0x143, 0x261, 0x2ad, 0x13e, 0x7e, 0x1da, 0x1dd, 0x31d, 0x21, 0x179, 0x2ca, 0x3b0, 0x2bf, 0x3a5, 0x2e4, 0x203, 0x65, 0x8, 0x20a, 0x32c, 0x145, 0x1e2, 0x3f0, 0x2cb, 0x2f3, 0xde, 0x108, 0x3da, 0x27d, 0x1bf, 0x1d5, 0x117, 0x30d, 0x3c, 0x328, 0x40, 0x74, 0x156, 0x23a, 0x30b, 0x3bf, 0x275, 0x3b5, 0x2f9, 0x52, 0x2ef, 0x3cc, 0x1e3, 0x2b3, 0xaa, 0x5e, 0x1e0, 0x176, 0x200, 0x3a0, 0x2a2, 0x1f4, 0x6e, 0x1c7, 0x38c, 0x197, 0x3e5, 0x290, 0x355, 0x25f, 0x303, 0x1b5, 0x159, 0x2f0, 0x31b, 0x3a2, 0x24, 0x13f, 0x13d, 0x3bb, 0x370, 0x223, 0x5f, 0xa3, 0x317, 0xad, 0x29e, 0x2dc, 0x2e, 0x1b3, 0x2da, 0x3ad, 0xee, 0x12f, 0x120, 0x1ea, 0x1fa, 0x1e7, 0x3b6, 0x13c, 0x2f8, 0x111, 0x8e, 0x161, 0xdd, 0x2cd, 0x170, 0x183, 0x2fd, 0x157, 0x379, 0x16a, 0x112, 0x34b, 0x3cb, 0x323, 0x18f, 0x1f2, 0x3ed, 0x286, 0x196, 0x145, 0x3c4, 0x3db, 0x275, 0x363, 0x3f6, 0x290, 0x2a3, 0x16e, 0x2e, 0x366, 0x37a, 0x157, 0x2fb, 0x1a1, 0x82, 0xd5, 0x18e, 0x162, 0x239, 0x19c, 0x5d, 0x43, 0x36b, 0x3eb, 0x23b, 0x99, 0x371, 0x2c9, 0xea, 0x54, 0x2d8, 0x256, 0x94, 0x3e0, 0x1a5, 0x288, 0x284, 0x93, 0x269, 0x14e, 0x5a, 0x1ca, 0x380, 0x139, 0x175, 0x38a, 0x21, 0x2f2, 0x33a, 0x1bf, 0x3aa, 0x55, 0x5e, 0x3c0, 0x1d1, 0x24, 0x27e, 0xfd, 0x1e7, 0x365, 0xf9, 0x3ed, 0x134, 0x1e4, 0xe6, 0x243, 0x22, 0x171, 0x180, 0x270, 0x3ef, 0x31, 0x2c8, 0x26c, 0x1c2, 0x39d, 0x192, 0x34f, 0x195, 0x2c6, 0x17e, 0x14, 0x230, 0x307, 0x160, 0x33c, 0x2b0, 0x2d7, 0x3c2, 0xd4, 0x308, 0xf4, 0x37c, 0x258, 0x386, 0x236, 0x8, 0x1d, 0xab, 0x23a, 0x21f, 0x2e7, 0x38c, 0x32e, 0x38f, 0xad, 0x135, 0x362, 0x170, 0x306, 0x3e6, 0x105, 0x251, 0x23a, 0x37, 0x38e, 0x5f, 0x28c, 0x11c, 0x31a, 0x396, 0x11, 0x171, 0x300, 0x1d2, 0x347, 0x310, 0x1a6, 0x216, 0xf8, 0x2d6, 0x288, 0x101, 0x24c, 0x36c, 0xcd, 0x352, 0x27c, 0x3f0, 0x33e, 0x363, 0x3e5, 0x252, 0x135, 0x2cd, 0x1c9, 0x6, 0x217, 0x1fd, 0x87, 0xb2, 0x136, 0x1c2, 0x333, 0x241, 0x24e, 0x166, 0x66, 0x32f, 0x212, 0xe5, 0x380, 0x272, 0x1dd, 0x6f, 0x210, 0x2ef, 0x32b, 0x20f, 0x1b3, 0x37a, 0x2ae, 0x3fe, 0x113, 0x32, 0x296, 0x358, 0x4c, 0x1f7, 0x2b7, 0x2b5, 0xbf, 0x14, 0x69, 0x7, 0x312, 0x3ac, 0x2bd, 0x85, 0x2b8, 0x19d, 0x1bf, 0x35d, 0x154, 0x2f0, 0x77, 0x25e, 0x112, 0x137, 0xc7, 0x162, 0x7b, 0x279, 0x2e8, 0x39, 0x1a3, 0x30e, 0x3ff, 0x16, 0x263, 0xac, 0x36f, 0x3c2, 0x1a8, 0x3b, 0x3a9, 0x3a5, 0x382, 0x78, 0x176, 0x12, 0x27e, 0x1fa, 0x395, 0x31e, 0x20a, 0x156, 0x1f4, 0x370, 0x13c, 0x3ed, 0xd9, 0x27f, 0x1fe, 0x319, 0x132, 0x3be, 0x186, 0x1f5, 0x17a, 0x6a, 0x219, 0x3a9, 0x343, 0x213, 0x3c0, 0x34d, 0x240, 0x29f, 0xc7, 0x2c4, 0x1ec, 0x3ec, 0x2d3, 0x329, 0xa, 0x69, 0xe, 0x53, 0x15f, 0x38a, 0x84, 0x373, 0x32b, 0x17, 0x2c5, 0x3e6, 0x2ba, 0x327, 0x59, 0x136, 0x384, 0xd7, 0x22c, 0xa1, 0x93, 0x1b6, 0xcd, 0x2ad, 0x1e2, 0x3bf, 0x38c, 0xa3, 0x8e, 0x31a, 0x325, 0x44, 0x39a, 0x6c, 0x23e, 0x54, 0x372, 0x121, 0x141, 0x331, 0x96, 0x386, 0xca, 0x80, 0x349, 0x27a, 0x3ce, 0x31e, 0x31f, 0x115, 0x43, 0x1b7, 0x2c7, 0x3fb, 0x16, 0xcf, 0x2b0, 0x34e, 0x57, 0x165, 0x2db, 0x35d, 0x2a8, 0x3d2, 0x3b8, 0x1a1, 0x208, 0x14b, 0x358, 0x98, 0x3d5, 0x195, 0x30a, 0x3cd, 0x109, 0xe5, 0x309, 0x1da, 0x2f3, 0x2f9, 0x290, 0x29e, 0x2cd, 0x392, 0x1d, 0x151, 0x3bb, 0x365, 0x3c1, 0x28e, 0x43, 0x36e, 0x30e, 0x3e7, 0x160, 0x1d6, 0x173, 0x21, 0x3bd, 0x32b, 0x2e, 0x306, 0x30f, 0x3fa, 0x31, 0x26d, 0x216, 0x3e0, 0x133, 0x368, 0x340, 0x8, 0xe8, 0x29a, 0x1e7, 0x31e, 0x237, 0x5d, 0x218, 0x346, 0x46, 0x307, 0x312, 0x2ab, 0x38a, 0x108, 0x1d7, 0x16e, 0x170, 0x6, 0x4e, 0x3ef, 0x188, 0x34c, 0x94, 0x33f, 0x18a, 0x376, 0x236, 0x40, 0x349, 0xfd, 0x323, 0xc6, 0x19c, 0x2e8, 0xe4, 0x206, 0x230, 0xe, 0xa6, 0x175, 0x6f, 0x52, 0x2a3, 0x362, 0x392, 0x30, 0x270, 0x347, 0x5b, 0x256, 0xa9, 0x1ce, 0x4b, 0x386, 0x194, 0x200, 0x27e, 0x3e1, 0x12e, 0x239, 0xfb, 0x36d, 0x329, 0x14, 0x1a4, 0x70, 0x139, 0x3ba, 0x378, 0x290, 0x135, 0x326, 0xaf, 0x180, 0x3a4, 0x20e, 0x2d8, 0x294, 0x141, 0x26b, 0x258, 0xf, 0xbb, 0x24, 0x3d4, 0x337, 0x3a, 0x14d, 0x1e7, 0x235, 0xce, 0x2e8, 0x1c8, 0xa, 0x1a4, 0xe0, 0xed, 0x1ef, 0x3e5, 0x2b4, 0x1cb, 0x44, 0x273, 0x2c9, 0x2bb, 0xbd, 0xd4, 0xec, 0x1d5, 0x2a8, 0x353, 0x3fe, 0x8a, 0x9b, 0x301, 0x2b1, 0x119, 0x34, 0x1, 0x3a, 0x14d, 0x1e7, 0x235, 0xce, 0x2e8, 0x1c8, 0xa, 0x1a4, 0xe0, 0xed, 0x1ef, 0x3e5, 0x2b4, 0x1cb, 0x44, 0x273, 0x2c9, 0x2bb, 0xbd, 0xd4, 0xec, 0x1d5, 0x2a8, 0x353, 0x3fe, 0x8a, 0x9b, 0x301, 0x2b1, 0x119, 0x34, 0x1, 0x3a, 0x14d, 0x1e7, 0x235, 0xce, 0x2e8, 0x1c8, 0xa, 0x1a4, 0xe0, 0xed, 0x1ef, 0x3e5, 0x2b4, 0x1cb, 0x44, 0x273, 0x2c9, 0x2bb, 0xbd, 0xd4, 0xec, 0x1d5, 0x2a8, 0x353, 0x3fe, 0x8a, 0x9b, 0x301, 0x2b1, 0x119, 0x34, 0x1, 0x3a, 0x14d, 0x1e7, 0x235, 0xce, 0x2e8, 0x1c8, 0xa, 0x1a4, 0xe0, 0xed, 0x1ef, 0x3e5, 0x2b4, 0x1cb, 0x74, 0x13d, 0x323, 0x318, 0x1f6, 0x35e, 0x1f1, 0x212, 0x24b, 0x3e9, 0x311, 0x222, 0x399, 0x3fc, 0x1fc, 0x16, 0x271, 0x173, 0x84, 0x3ae, 0x362, 0x253, 0x300, 0x11f, 0x150, 0x283, 0x308, 0x2bf, 0xaa, 0x3ad, 0x3fe, 0x114, 0x26c, 0x3e, 0x34a, 0x368, 0x11b, 0x80, 0x27e, 0x39f, 0x2c4, 0x37b, 0x2ce, 0x33, 0x14e, 0x352, 0x381, 0x315, 0x3f2, 0x364, 0x36b, 0x187, 0x3c7, 0x312, 0x2be, 0xde, 0x290, 0xdd, 0x20c, 0x39a, 0x360, 0x2bb, 0x17a, 0x350, 0x369, 0x16f, 0x1bd, 0x15d, 0x87, 0x332, 0x25, 0x33f, 0x221, 0x305, 0xbb, 0x90, 0x137, 0x6b, 0x98, 0x297, 0x191, 0x1b6, 0x261, 0x23a, 0x370, 0x1f2, 0x28e, 0x10c, 0x285, 0x230, 0x38, 0x272, 0x1ef, 0x3c3, 0x2c2, 0x243, 0x49, 0x2eb, 0x30c, 0x36f, 0x57, 0x33a, 0x385, 0x2c5, 0x30f, 0x3f3, 0x310, 0x256, 0x2a4, 0xdf, 0x2e4, 0x1e0, 0x12f, 0x82, 0xe8, 0xfd, 0x12e, 0x1ec, 0x2b7, 0x21d, 0x14e, 0x2ad, 0x21f, 0x9e, 0x357, 0x43, 0x346, 0x230, 0x70, 0x1da, 0x363, 0x47, 0xe6, 0x1c4, 0xc1, 0x263, 0x1ad, 0x21, 0x1d7, 0x362, 0xaf, 0x1b, 0xea, 0x12d, 0xd4, 0x3b0, 0x16f, 0x37a, 0x17d, 0x31, 0x34c, 0xa9, 0x26b, 0x2e4, 0x3c0, 0xb5, 0x19, 0x13a, 0xd7, 0x288, 0x68, 0x8, 0x349, 0x3e1, 0x162, 0x37b, 0x195, 0xcc, 0x262, 0x145, 0xdc, 0xf9, 0x28e, 0x218, 0x206, 0x1a4, 0x380, 0x2cb, 0x32e, 0x238, 0x339, 0x23b, 0x201, 0x33c, 0x173, 0x108, 0x2a3, 0x326, 0x171, 0xd8, 0x359, 0x17a, 0x2a9, 0x1bf, 0x36a, 0x3e6, 0x3fa, 0x188, 0x256, 0x141, 0x37c, 0x30d, 0x23f, 0x1a1, 0xc8, 0x1c2, 0x2b1, 0x6d, 0x340, 0x40, 0x27e, 0x337, 0x302, 0x3ee, 0xb3, 0x269, 0x334, 0x23a, 0x2e9, 0x3c1, 0x5d, 0xe4, 0x14, 0x13b, 0x3f, 0x275, 0x146, 0x1e4, 0x1d0, 0x3f4, 0x162, 0x2ff, 0x25d, 0x269, 0x261, 0xfa, 0x365, 0x67, 0x3b2, 0x17e, 0x212, 0x13e, 0x2e7, 0x1f9, 0x2c1, 0x36e, 0x8c, 0x38, 0x1da, 0x2cf, 0x11c, 0x339, 0x7f, 0x16, 0x1d6, 0x31d, 0x148, 0x1ba, 0x44, 0x3bc, 0x30c, 0x1a7, 0x179, 0x32b, 0x2e0, 0xc0, 0x11f, 0x149, 0x6a, 0x3b0, 0x2de, 0x1f3, 0x3fa, 0x310, 0x14a, 0x21a, 0x3a5, 0x178, 0x2fb, 0x114, 0x1a2, 0x3e0, 0x314, 0x203, 0x1d1, 0x224, 0x296, 0x39d, 0xa2, 0x34, 0x8, 0x29b, 0x39f, 0x302, 0x3d5, 0x2cc, 0x36c, 0x32c, 0x3d9, 0x31e, 0x338, 0x1af, 0x3e2, 0xb4, 0x1e2, 0x315, 0x3d3, 0x225, 0x346, 0x69, 0x1c0, 0x2cb, 0x255, 0xf2, 0x1fe, 0x3f8, 0xb0, 0x2ab, 0xde, 0x252, 0x1cb, 0x220, 0x1df, 0x56, 0x123, 0x3da, 0x16e, 0x32d, 0x209, 0xea, 0x25a, 0x350, 0x1bf, 0x2dd, 0x383, 0x3ef, 0xb6, 0x242, 0xf4, 0x117, 0x3d2, 0x3f5, 0x3a0, 0x3cb, 0x302, 0x3a3, 0x322, 0x356, 0x2ac, 0x3ce, 0x239, 0x35f, 0x33, 0x262, 0x11d, 0x1db, 0x237, 0x3b2, 0x2fc, 0x5a, 0x1e2, 0x223, 0x357, 0x10c, 0x5, 0x13b, 0xfc, 0x311, 0x134, 0x3b1, 0x215, 0xe, 0xed, 0x2cf, 0x238, 0xff, 0x3f8, 0x160, 0x2be, 0x2f9, 0x161, 0x11e, 0x132, 0x263, 0x2bd, 0x210, 0x135, 0x11, 0x1de, 0x30c, 0x34e, 0x1ed, 0x16e, 0x253, 0x36, 0x359, 0x1e1, 0x2ca, 0x303, 0x3, 0xe9, 0x54, 0x10f, 0xec, 0x16f, 0x1f3, 0x3fd, 0x5b, 0x242, 0x1e8, 0x55, 0x2af, 0x327, 0x26d, 0x250, 0xdf, 0x30d, 0xee, 0x226, 0x26c, 0x1f0, 0x314, 0xf, 0x34d, 0x104, 0x13a, 0x35c, 0xda, 0x236, 0x12, 0x137, 0x358, 0x241, 0x101, 0x1, 0x3a0, 0x3cb, 0x302, 0x3a3, 0x322, 0x356, 0x2ac, 0x3ce, 0x239, 0x35f, 0x33, 0x262, 0x11d, 0x1db, 0x237, 0x3b2, 0x2fc, 0x5a, 0x1e2, 0x223, 0x357, 0x349, 0x337, 0x26, 0x24e, 0x91, 0x1d, 0xfd, 0x162, 0x3ee, 0x191, 0x356, 0x151, 0x323, 0x1ec, 0x195, 0x269, 0x196, 0x3bb, 0xc6, 0x3d1, 0x21d, 0x262, 0x23a, 0x365, 0x19c, 0x35e, 0x32f, 0x2ad, 0xdc, 0x3c1, 0x2e8, 0x17e, 0x5a, 0x3c4, 0x9e, 0x28e, 0xe4, 0xa0, 0x24b, 0x2e7, 0x3ed, 0x43, 0x206, 0x13b, 0x1f8, 0x5f, 0x1b2, 0x36e, 0x230, 0x380, 0x275, 0x222, 0x1ee, 0x30e, 0xe, 0x1da, 0x32e, 0x1e4, 0x3eb, 0x3e7, 0xa6, 0x1ef, 0x47, 0x339, 0x1fc, 0x160, 0x175, 0x3f6, 0x31a, 0x1c4, 0x201, 0x1d6, 0x6f, 0xad, 0x243, 0x99, 0x263, 0x173, 0x52, 0x1ba, 0x110, 0x3be, 0x2b0, 0x21, 0x2a3, 0x106, 0xef, 0x30c, 0x295, 0x3bd, 0x362, 0x171, 0x2c9, 0x3dd, 0x15c, 0x32b, 0x392, 0x1b, 0x359, 0x3c2, 0x33a, 0x2e, 0x30, 0x11f, 0x12d, 0x2a9, 0x1e3, 0x306, 0x270, 0x54, 0x21e, 0x3b0, 0x36a, 0x30f, 0x29b, 0xc7, 0x130, 0xa1, 0x204, 0x349, 0x267, 0x98, 0x254, 0x102, 0x3a0, 0x337, 0x4c, 0x12a, 0x81, 0x1d0, 0x39f, 0x26, 0x95, 0x244, 0xe8, 0x3cb, 0x13, 0x24e, 0x122, 0x74, 0x3e1, 0x20d, 0x127, 0x91, 0x3a, 0x3f4, 0x302, 0x297, 0x24c, 0x1d, 0x1fa, 0x181, 0x34f, 0x126, 0x20a, 0xfd, 0x2c4, 0x3a3, 0x93, 0x105, 0x27a, 0x162, 0x3d5, 0x24d, 0x286, 0x13d, 0xb1, 0x3ee, 0x322, 0x143, 0x29a, 0x25c, 0x1f7, 0x191, 0x2a5, 0x14d, 0x12e, 0x2ff, 0x2cc, 0x356, 0x2a2, 0x97, 0x37b, 0x166, 0x1ab, 0x151, 0x24f, 0x3b9, 0xb3, 0x2d1, 0x2ac, 0x323, 0x3d8, 0x25d, 0x36c, 0x156, 0x395, 0x1ec, 0x32a, 0x1b6, 0xab, 0x3ce, 0xf6, 0x195, 0xdb, 0x251, 0x1e7, 0x7b, 0x2ce, 0x269, 0x32c, 0x2f7, 0x239, 0x167, 0x330, 0x196, 0x37f, 0x318, 0x2b7, 0x198, 0xcb, 0x3bb, 0x18c, 0x35f, 0xcc, 0x261, 0x3d9, 0xc6, 0x13f, 0x31c, 0x192, 0x202, 0x10, 0x3d4, 0x1ac, 0x116, 0x68, 0x100, 0x137, 0x2f6, 0x144, 0x289, 0x24, 0x354, 0x333, 0x6d, 0xca, 0x240, 0x125, 0x35c, 0x2d9, 0xbb, 0x41, 0x274, 0x1a5, 0x1c3, 0x3a2, 0x19, 0x301, 0x266, 0xf, 0x25e, 0x190, 0x7c, 0x221, 0xf0, 0x1a1, 0x136, 0x3c9, 0x258, 0x31b, 0x226, 0x344, 0xe7, 0x1c1, 0x1dc, 0x228, 0x25, 0x26b, 0x2f, 0x1ff, 0x2c8, 0x250, 0x2f1, 0x2f0, 0x3cf, 0xd3, 0x141, 0x343, 0x353, 0x87, 0x12b, 0x3d, 0x55, 0x155, 0x62, 0x294, 0x3d0, 0x159, 0x17d, 0x229, 0x11a, 0x177, 0x1bd, 0x3fd, 0x2d8, 0x184, 0x35d, 0x3e6, 0x3a7, 0x1d3, 0x76, 0x1b5, 0x217, 0x20e, 0x10f, 0x369, 0x366, 0x138, 0xa8, 0xd4, 0x2f5, 0x205, 0x3a4, 0x292, 0x15b, 0x303, 0x18, 0x23e, 0x17a, 0x19d, 0x5c, 0x180, 0x3a8, 0x38d, 0x1e6, 0x1c9, 0x36, 0x2fe, 0xae, 0x25f, 0xaf, 0x27e, 0x6b, 0x8b, 0x68, 0x200, 0xd5, 0x39d, 0x6d, 0x194, 0x112, 0x13a, 0x1a5, 0x386, 0x293, 0xc8, 0x7c, 0x4b, 0x3c0, 0x113, 0x344, 0x1ce, 0x30d, 0x2fb, 0x2c8, 0xa9, 0x3d6, 0x3ad, 0x87, 0x256, 0xf4, 0x2a8, 0x17d, 0x5b, 0x61, 0x3aa, 0x3e6, 0x347, 0x345, 0x3b0, 0x366, 0x270, 0x2a0, 0x2a9, 0x303, 0x30, 0xea, 0x3c2, 0x1e6, 0x392, 0xd8, 0x3dd, 0x2f2, 0x362, 0x39a, 0x30c, 0x85, 0x2a3, 0x22, 0x3be, 0x1ad, 0x52, 0x1cb, 0x99, 0x33c, 0x6f, 0x161, 0x1c4, 0x2c, 0x175, 0x38f, 0x339, 0x3fb, 0xa6, 0x363, 0x1e4, 0x367, 0xe, 0x2cb, 0x222, 0x36b, 0x230, 0x3f, 0x5f, 0x18b, 0x206, 0x1ca, 0x2e7, 0x357, 0xe4, 0x109, 0x3c4, 0xf9, 0x2e8, 0x3e2, 0x2ad, 0x2e9, 0x19c, 0x2c6, 0x262, 0x1f4, 0xc6, 0x2b7, 0x269, 0xab, 0x323, 0x37b, 0x191, 0x286, 0xfd, 0x302, 0x24e, 0x81, 0x349, 0x18e, 0xf5, 0x1ac, 0x51, 0x289, 0x90, 0x125, 0x16b, 0x1c3, 0x293, 0x190, 0x1f0, 0x258, 0x77, 0x228, 0x94, 0x2f1, 0x3d2, 0x87, 0xa5, 0x3d0, 0x16d, 0x3fd, 0x372, 0x76, 0x2dd, 0x138, 0x2a0, 0x15b, 0x17, 0x180, 0x2bb, 0xae, 0x16e, 0x2e2, 0x186, 0x85, 0x14f, 0x88, 0x1cf, 0x2e6, 0x252, 0x23c, 0xb, 0x2be, 0x38f, 0x27b, 0x3f7, 0x139, 0x255, 0xf7, 0x46, 0x309, 0x22b, 0x18b, 0x5, 0x321, 0x315, 0x115, 0xbf, 0x2d0, 0x1b8, 0xce, 0x2c6, 0xcd, 0x3d9, 0x239, 0x32a, 0x1ab, 0x29a, 0x2c4, 0x127, 0x81, 0x29b, 0x231, 0x8b, 0xd0, 0x12, 0x2a1, 0x1ae, 0x1bb, 0x1d1, 0x32, 0x3e, 0x4b, 0x389, 0x45, 0x216, 0xdf, 0x178, 0x397, 0x291, 0x7a, 0x2a8, 0x2fa, 0x16c, 0x308, 0x2de, 0x27, 0x54, 0x1a8, 0x385, 0x30, 0x1d4, 0x313, 0x32b, 0x15e, 0x336, 0x295, 0x3ae, 0x11, 0x3be, 0x35a, 0x148, 0x243, 0x1ea, 0x2b9, 0x288, 0xca, 0x224, 0x1c2, 0xc5, 0xf0, 0x113, 0x10b, 0xdf, 0x2f0, 0x247, 0xa5, 0x3a9, 0x1bd, 0x3d7, 0x345, 0x2db, 0x205, 0x11f, 0x1e1, 0x3cc, 0xaf, 0x336, 0x123, 0x2a3, 0x88, 0x39e, 0x38a, 0x2b4, 0x388, 0x160, 0x2f3, 0x79, 0x367, 0x38, 0xe3, 0x1b2, 0x103, 0x394, 0x315, 0x22a, 0x2fc, 0x2ad, 0x3b6, 0x1f6, 0xcc, 0x251, 0x24f, 0x3ee, 0x24c, 0x1d0, 0x18e, 0x241, 0xd0, 0x24, 0x296, 0x16b, 0x386, 0x25e, 0x9b, 0x33f, 0x382, 0x1ff, 0x26d, 0x10d, 0xaa, 0x17d, 0x16c, 0x219, 0x36a, 0x138, 0x149, 0x165, 0xb8, 0x36, 0x3dd, 0x3da, 0x245, 0x371, 0x2d2, 0xa4, 0x243, 0x304, 0x15f, 0x38f, 0xff, 0x3c7, 0x1da, 0x111, 0x2df, 0x1a4, 0x3e9, 0x3d3, 0xe4, 0x2d, 0x37, 0x237, 0x163, 0xcd, 0x3bb, 0xf6, 0x166, 0x286, 0x3f4, 0x4c, 0x284, 0x20, 0x137, 0x39d, 0x1b4, 0x176, 0x19, 0x3d4, 0x2f6, 0x6d, 0xbb, 0x19, 0x7c, 0x258, 0x1dc, 0x2c8, 0x141, 0x55, 0x17d, 0x2d8, 0x76, 0x366, 0x3a4, 0x17a, 0x1e6, 0xaf, 0x265, 0x85, 0x135, 0x92, 0x33c, 0x378, 0xe6, 0x3fb, 0x139, 0x146, 0x36b, 0x1a4, 0x3db, 0x357, 0x329, 0x2d0, 0x2e9, 0xfb, 0xcc, 0xab, 0x12e, 0x34f, 0x81, 0x27e, 0x358, 0x288, 0x194, 0x82, 0x20b, 0x4b, 0x23f, 0x59, 0xa9, 0x28f, 0x2aa, 0x5b, 0x308, 0x36a, 0x270, 0x12d, 0x33a, 0x392, 0x2c9, 0x295, 0x2a3, 0x110, 0x263, 0x6f, 0x31a, 0x1fc, 0xa6, 0x32e, 0x1ee, 0x230, 0x1f8, 0x3ed, 0xe4, 0x5a, 0xdc, 0x19c, 0x21d, 0x196, 0x323, 0x3ee, 0x91, 0x349, 0x6b, 0x51, 0x236, 0x112, 0x1c2, 0x18a, 0x3c0, 0x8a, 0x94, 0x3d6, 0x157, 0x188, 0x61, 0x16f, 0x4e, 0x2a0, 0x165, 0x170, 0xd8, 0x2d7, 0x1d7, 0x22, 0x1cf, 0x38a, 0x161, 0x23b, 0x312, 0x363, 0x33b, 0x3a1, 0x3ca, 0x368, 0x3a2, 0x320, 0x33f, 0x213, 0x3cf, 0x256, 0x35b, 0x1f3, 0x20e, 0x1a8, 0x17, 0x1b, 0x3b3, 0x2ef, 0x22, 0x39e, 0x233, 0x31a, 0x3f8, 0x298, 0x146, 0x2df, 0x299, 0x2e7, 0x115, 0x1f1, 0x145, 0x235, 0x2ce, 0x356, 0x1fa, 0x98, 0xd, 0x9, 0x296, 0x1a5, 0x1e, 0x28d, 0x216, 0x2f1, 0x2af, 0x188, 0xc2, 0x1b5, 0x270, 0x25a, 0xf3, 0xaf, 0xc3, 0x214, 0x1ba, 0x132, 0x351, 0x38f, 0x3fc, 0x7, 0x275, 0x364, 0xa, 0x27c, 0x1f2, 0x1af, 0x262, 0x37f, 0x3b9, 0x93, 0x1d0, 0x231, 0x51, 0x65, 0x41, 0x20b, 0x96, 0xee, 0x2c8, 0x282, 0x154, 0x3fa, 0x1d3, 0x2db, 0x6, 0x1d4, 0xae, 0x362, 0x1de, 0x2d2, 0x290, 0x71, 0xb0, 0x1ef, 0x3c8, 0x23, 0x3f, 0x1f9, 0x72, 0x5a, 0x1b8, 0x279, 0xcc, 0x156, 0xb1, 0x24e, 0x2, 0x34b, 0x39d, 0x2d9, 0x34d, 0x249, 0x277, 0x2f, 0x397, 0x34b, 0x333, 0x376, 0x25e, 0xd1, 0x26b, 0x3d2, 0x62, 0x61, 0x1b5, 0xe9, 0x17a, 0x391, 0x2e2, 0x56, 0x29, 0x8f, 0x2c, 0x2f3, 0x3c8, 0x46, 0xfc, 0x3d3, 0x329, 0x352, 0x2c3, 0x2b7, 0x1ab, 0x1fa, 0x130, 0x34, 0x48, 0x13a, 0xc5, 0x389, 0x59, 0x2a4, 0xaa, 0x3fa, 0x3a6, 0x37e, 0x30, 0x17f, 0x1ed, 0x106, 0x2e3, 0x31d, 0x31a, 0x3f9, 0x272, 0x222, 0x1a3, 0x394, 0x9e, 0x3b2, 0x29c, 0x3bb, 0x3b9, 0x126, 0x349, 0x1ac, 0x119, 0xbb, 0x64, 0x3c9, 0x30d, 0x3cf, 0xa5, 0x177, 0x383, 0xa8, 0x165, 0x1c9, 0x19b, 0x85, 0xdd, 0x132, 0x2ab, 0x227, 0x3df, 0x70, 0x22b, 0x86, 0x109, 0x6e, 0x338, 0xcc, 0x2ac, 0x2c4, 0x254, 0x20, 0x1aa, 0x2b1, 0x203, 0x342, 0x216, 0x1eb, 0x2ae, 0x5b, 0x3b, 0x2c5, 0x11f, 0x313, 0x2dc, 0xef, 0x2d2, 0x129, 0x1c4, 0x189, 0x2cf, 0x1ee, 0xd2, 0x3bf, 0x28e, 0x29f, 0xd7, 0x386, 0x1a1, 0x216, 0x3d6, 0x2aa, 0x2d8, 0x3b0, 0x6, 0x359, 0x2f2, 0x106, 0x1cf, 0x6f, 0xe6, 0x3e7, 0x2cb, 0x1b2, 0x14, 0x3c4, 0x237, 0x21d, 0xab, 0x162, 0x254, 0x40, 0x2a1, 0x1a5, 0x78, 0x8a, 0xa9, 0x55, 0x3fa, 0x345, 0x1e3, 0x180, 0x3dd, 0x1d7, 0x110, 0x33c, 0x3f6, 0x1fe, 0xe, 0x38c, 0x43, 0x109, 0xdc, 0xfb, 0x269, 0x29a, 0x26, 0xd, 0x24, 0x13a, 0x18a, 0x23f, 0x2c8, 0x21a, 0x16d, 0x347, 0xd4, 0x2e, 0xd8, 0x295, 0x135, 0x99, 0x2ab, 0x47, 0x367, 0x380, 0x2f8, 0xe4, 0x2d0, 0x365, 0x2b7, 0x356, 0x3e1, 0x192, 0x340, 0x112, 0x20b, 0x258, 0x2fb, 0x34c, 0x3a9, 0x3e6, 0x54, 0x165, 0x392, 0x265, 0x21, 0x1cb, 0x201, 0x3ba, 0x1e4, 0x46, 0x1f8, 0x357, 0x17e, 0x145, 0xc6, 0xb3, 0x1d, 0x18e, 0x51, 0x194, 0x19, 0x3e0, 0x30d, 0x397, 0x294, 0x3aa, 0x4e, 0x137, 0x35c, 0xf, 0x226, 0x250, 0x55, 0x3fd, 0x10f, 0x303, 0x36, 0x34e, 0x135, 0x132, 0x2be, 0x238, 0x215, 0xfc, 0x357, 0x2fc, 0x11d, 0x239, 0x322, 0x3a0, 0x358, 0xda, 0x34d, 0x26c, 0xdf, 0x2af, 0x5b, 0xec, 0x3, 0x359, 0x1ed, 0x11, 0x263, 0x2f9, 0xff, 0xe, 0x311, 0x10c, 0x5a, 0x1db, 0x35f, 0x356, 0x3cb, 0x241, 0x236, 0x104, 0x1f0, 0x30d, 0x327, 0x242, 0x16f, 0xe9, 0x1e1, 0x16e, 0x1de, 0x2bd, 0x161, 0x3f8, 0xed, 0x134, 0x5, 0x1e2, 0x237, 0x33, 0x2ac, 0x302, 0x101, 0x12, 0x13a, 0x314, 0xee, 0x26d, 0x1e8, 0x1f3, 0x54, 0x2ca, 0x253, 0x30c, 0x210, 0x11e, 0x160, 0x2cf, 0x3b1, 0x13b, 0x223, 0x3b2, 0x262, 0x3ce, 0x3a3, 0x1, 0x137, 0x35c, 0xf, 0x226, 0x250, 0x55, 0x3fd, 0x10f, 0x303, 0x36, 0x34e, 0x135, 0x132, 0x2be, 0x238, 0x215, 0xfc, 0x357, 0x2fc, 0x11d, 0x239, 0x26e, 0x16b, 0x78, 0x228, 0x282, 0x16d, 0x107, 0x15b, 0x392, 0x186, 0x210, 0x23c, 0x189, 0x255, 0x36e, 0x321, 0x1f2, 0x2c6, 0x251, 0x2c4, 0x284, 0x12, 0x274, 0x4b, 0x379, 0x291, 0x177, 0x27, 0x25a, 0x32b, 0x273, 0x35a, 0x161, 0x3f9, 0x3b4, 0x1b2, 0x50, 0x37, 0xfb, 0x1b6, 0x1fa, 0x192, 0x11b, 0x104, 0x3e0, 0x2f, 0x10e, 0x61, 0x1b3, 0x23e, 0x15c, 0x83, 0x39e, 0x378, 0xff, 0x1c, 0x5f, 0x72, 0x1a9, 0x31e, 0x25d, 0x3a, 0x6b, 0x232, 0x3a2, 0x26c, 0x1be, 0x2ae, 0x2d8, 0x2db, 0x60, 0x3dd, 0x355, 0x124, 0x2ab, 0x11c, 0x215, 0x1f8, 0x147, 0x3cd, 0x1f4, 0x3b9, 0x122, 0x3d4, 0x26f, 0x305, 0x113, 0x250, 0xaa, 0x3ef, 0x6a, 0x5c, 0x2c9, 0x214, 0x396, 0x2c, 0x3b5, 0x3dc, 0x13b, 0x4f, 0x2d3, 0x334, 0x97, 0x95, 0x40, 0x296, 0x266, 0x23f, 0x332, 0x1e8, 0x3e6, 0x150, 0x27d, 0x171, 0xd5, 0x1a5, 0x3c0, 0x2c8, 0xf4, 0x3e6, 0x2a0, 0x1e6, 0x39a, 0x1ad, 0x161, 0x3fb, 0x2cb, 0x18b, 0x109, 0x2e9, 0x2b7, 0x286, 0x18e, 0x288, 0x1d1, 0x26c, 0x37c, 0x2aa, 0x2ed, 0x1e3, 0x1b, 0x295, 0x1ba, 0x201, 0x1ef, 0x1ee, 0x13b, 0x9e, 0x35e, 0x196, 0x162, 0x284, 0x24, 0x1c2, 0x258, 0x3f5, 0x294, 0x16f, 0x3a4, 0x22f, 0x326, 0x1cf, 0x378, 0x1fe, 0x70, 0x2f8, 0x329, 0x145, 0x239, 0x93, 0x27e, 0x39d, 0x386, 0x113, 0xa9, 0x2a8, 0x347, 0x2a9, 0x392, 0x30c, 0x52, 0x1c4, 0xa6, 0x222, 0x206, 0x3c4, 0x19c, 0x269, 0xfd, 0x192, 0x236, 0x19, 0x33f, 0x2f0, 0x188, 0x76, 0x6, 0x2fe, 0x1d7, 0x92, 0x2ab, 0x238, 0x46, 0x3db, 0x5d, 0x14e, 0x1e7, 0x34f, 0x8, 0x2a1, 0x133, 0x23f, 0x26d, 0x3a9, 0x30f, 0x12d, 0x32b, 0xef, 0x173, 0x31a, 0x3e7, 0x275, 0x43, 0x5a, 0x365, 0x195, 0x1d, 0x6b, 0x1aa, 0x29d, 0x23f, 0xd3, 0x2bf, 0x4e, 0x2f4, 0x1b1, 0x3be, 0xde, 0xff, 0x70, 0x1f9, 0xbf, 0x23a, 0x3d8, 0x244, 0x29f, 0x16b, 0x1e0, 0x2c8, 0x1e8, 0x383, 0x12d, 0x25f, 0x3bc, 0x38a, 0x1cc, 0x7, 0x5f, 0x1c8, 0x2a6, 0x239, 0x126, 0x1ea, 0xd7, 0x1e, 0x228, 0x21a, 0x2fd, 0x150, 0x1e6, 0x33d, 0x2bd, 0x31a, 0x3c7, 0x1c6, 0x218, 0x1a9, 0x63, 0x191, 0x29b, 0x3ca, 0x386, 0x226, 0x2a4, 0x16d, 0x15, 0x19d, 0x171, 0x169, 0x2b4, 0x3fb, 0x19f, 0x225, 0x5a, 0x2c3, 0x25d, 0xe8, 0x2b9, 0x1bb, 0x1a1, 0x128, 0x154, 0x347, 0x15b, 0x253, 0x56, 0x129, 0xfe, 0x1da, 0x364, 0x280, 0x2e9, 0x167, 0x20a, 0x6b, 0xda, 0x25e, 0x216, 0x117, 0x3f3, 0xd4, 0x2e0, 0x186, 0x52, 0x388, 0x298, 0x134, 0x28, 0x6e, 0x3d1, 0x2a5, 0xc7, 0x288, 0x3a2, 0x1a2, 0x3d6, 0x2fa, 0x10f, 0x2e, 0x19b, 0x84, 0x23c, 0x354, 0x266, 0x1dc, 0x12b, 0x35d, 0x3a4, 0xae, 0x20c, 0x33c, 0x227, 0x215, 0x3db, 0x174, 0xcd, 0x12e, 0x142, 0x48, 0x20b, 0x382, 0x10e, 0x308, 0x3, 0x1f5, 0x2a3, 0x264, 0x37d, 0x1ee, 0xe5, 0x1f2, 0x21d, 0x14d, 0x260, 0x236, 0x64, 0x39c, 0x157, 0x372, 0x3c6, 0xd8, 0x214, 0x8f, 0x312, 0x111, 0x5, 0x21f, 0x3ec, 0x2a5, 0x18e, 0x232, 0x12f, 0x216, 0x22e, 0x3d7, 0x2a9, 0x253, 0xac, 0xad, 0x3f9, 0x19f, 0x43, 0x168, 0x235, 0x191, 0x13f, 0x333, 0xf, 0x228, 0x3d, 0x3e6, 0x292, 0x25f, 0x371, 0x233, 0x27b, 0x70, 0x3f2, 0x2fc, 0x1f4, 0x1f7, 0x2, 0x2a1, 0xc5, 0x3b8, 0x256, 0x2b3, 0x341, 0x15c, 0x11, 0x271, 0x47, 0x23, 0x3bf, 0x2e8, 0x19a, 0x25c, 0x284, 0x90, 0x1f, 0x30d, 0x21c, 0x219, 0x6, 0x3ea, 0x14f, 0xc1, 0x2f3, 0x3dc, 0x1ca, 0x3e4, 0x33, 0x29a, 0xc9, 0x65, 0xc8, 0x2a1, 0x18a, 0x2fb, 0x294, 0x36a, 0xea, 0x3bd, 0x92, 0x175, 0x33b, 0x13b, 0xf9, 0x21d, 0x29a, 0x192, 0x194, 0x249, 0x37c, 0x17d, 0x21e, 0x170, 0x30c, 0x290, 0x1fc, 0x2cb, 0x43, 0x2d0, 0xc6, 0x93, 0x3d4, 0x2b1, 0x3c0, 0x26d, 0x177, 0x270, 0x22f, 0x106, 0x33c, 0x47, 0x46, 0x2e7, 0x36d, 0x196, 0x302, 0x68, 0x82, 0x33f, 0x3ad, 0x2d8, 0x1e3, 0xd8, 0x21, 0x23c, 0xa6, 0x134, 0xa0, 0x2e9, 0x195, 0xe8, 0x2f6, 0x386, 0x8a, 0x21a, 0x3e6, 0x12d, 0x16e, 0x3be, 0x378, 0x3eb, 0x3f, 0x28e, 0x14e, 0x323, 0x254, 0x24, 0x20b, 0x30d, 0x31, 0x76, 0x30, 0x2d7, 0x1ba, 0x2c, 0x32e, 0x346, 0x3c4, 0xfb, 0x356, 0x18e, 0x6d, 0xb5, 0x94, 0x2a8, 0x20e, 0x33a, 0x39a, 0x173, 0xe6, 0xe, 0x2f8, 0x17e, 0x1f4, 0x3ee, 0x8, 0x125, 0x4b, 0x3f5, 0x8d, 0x366, 0x359, 0x1d7, 0x99, 0x3ba, 0x1ee, 0x14b, 0x221, 0x3f5, 0x11a, 0x183, 0x2fe, 0x14f, 0x304, 0x363, 0x2d5, 0x1e2, 0xfb, 0x2a5, 0x231, 0x368, 0x342, 0x2a4, 0x37a, 0x149, 0xb7, 0x3be, 0x2f9, 0x3b7, 0x1f8, 0xba, 0x19a, 0x162, 0x1a, 0x41, 0x33f, 0x353, 0x372, 0x303, 0x19b, 0x29, 0x23b, 0x3b4, 0x225, 0x2d0, 0x18c, 0x24c, 0x29f, 0x34a, 0xee, 0x256, 0x2de, 0x75, 0x3bd, 0x124, 0x1dd, 0x1ee, 0x394, 0x31f, 0x269, 0x3cb, 0x144, 0x293, 0x25, 0x154, 0x20e, 0x27d, 0x273, 0x38a, 0x27b, 0x1c0, 0x357, 0x257, 0x395, 0x254, 0x48, 0x3e, 0x5e, 0x310, 0x2db, 0x1b, 0x10a, 0x11e, 0xa6, 0x268, 0x280, 0x365, 0x166, 0x13f, 0xd7, 0xf0, 0x332, 0x177, 0xe9, 0xae, 0x22, 0x3ac, 0xf2, 0x1a4, 0x13c, 0x30a, 0x29a, 0x324, 0x259, 0x26c, 0x3a5, 0x3f3, 0x2a9, 0x15e, 0x2d2, 0x31a, 0x207, 0x17c, 0x17e, 0x3e8, 0x3a3, 0x40, 0x274, 0x172, 0x87, 0x296, 0x96, 0x397, 0x184, 0xc, 0x2d7, 0x2e1, 0x2c0, 0x222, 0x50, 0x1db, 0xb3, 0x13f, 0x1ae, 0x3c0, 0x1a6, 0x35d, 0x11f, 0x3da, 0x124, 0x3ba, 0x3b1, 0x9f, 0x19c, 0x1ab, 0x31c, 0x368, 0x28d, 0x282, 0x3e6, 0xbd, 0x2cd, 0x263, 0x227, 0x8c, 0x315, 0x163, 0x2a2, 0x192, 0x259, 0xd1, 0x28f, 0x3a7, 0x2ca, 0x39a, 0x1c5, 0x27b, 0x380, 0x147, 0x29c, 0x12e, 0x202, 0x224, 0x33f, 0x2af, 0x1d3, 0x2e, 0x186, 0x129, 0x3fb, 0x1c6, 0x1c8, 0x23a, 0x1f7, 0x10, 0x13a, 0x172, 0x10e, 0x76, 0xc0, 0x123, 0x243, 0x53, 0x268, 0x109, 0x18f, 0x322, 0x3d4, 0x2d6, 0x77, 0x256, 0x1b5, 0x1d4, 0x1d7, 0x264, 0x3de, 0x36e, 0x1e2, 0x1f6, 0x286, 0x1ac, 0x2e5, 0x8a, 0x7a, 0x217, 0x3c2, 0x83, 0x271, 0x238, 0xd2, 0x13c, 0x21d, 0x27a, 0x116, 0x1d1, 0x10b, 0xaa, 0x20e, 0xf3, 0x1de, 0x6f, 0x3f1, 0x7e, 0x5d, 0x125, 0x258, 0x87, 0x76, 0x180, 0x85, 0x23c, 0x139, 0x18b, 0x2d0, 0x239, 0x81, 0x2a1, 0x4b, 0x397, 0x308, 0x30, 0x295, 0x243, 0xa6, 0x1b2, 0x5a, 0xc6, 0x91, 0xd5, 0x18a, 0x3f5, 0x61, 0x6, 0x2d7, 0x1cb, 0x312, 0x134, 0x109, 0x31e, 0x93, 0x29f, 0x133, 0x2fb, 0x8d, 0x306, 0x3dd, 0x1ba, 0x160, 0x222, 0xa0, 0x365, 0x191, 0x3d4, 0x1a5, 0x1dc, 0x294, 0x366, 0x2fe, 0x135, 0x2c, 0x146, 0x14, 0x2e9, 0xb3, 0x27e, 0x2b1, 0x23f, 0x256, 0x36a, 0x359, 0x2a3, 0x201, 0x32e, 0x206, 0xdc, 0x195, 0x349, 0xd7, 0x3c0, 0x34c, 0x16f, 0xea, 0x1d7, 0xc1, 0x363, 0x346, 0x21f, 0x2b7, 0xe8, 0x39d, 0x78, 0x26d, 0x3aa, 0x11f, 0x3bd, 0x99, 0x1ef, 0x36e, 0x3c4, 0x3d1, 0x1d, 0x2f6, 0xf, 0x2c8, 0x177, 0x3a4, 0x2f2, 0x92, 0x3ba, 0x36b, 0x27c, 0xfb, 0x286, 0x358, 0x386, 0x59, 0x3a9, 0x270, 0x24a, 0x172, 0x31, 0x369, 0x6c, 0x108, 0x7f, 0x33e, 0xe4, 0x7d, 0x3a3, 0x200, 0x1f, 0x178, 0x2d8, 0x20f, 0x186, 0xad, 0x3c7, 0x17c, 0x3e2, 0x3ce, 0x142, 0x112, 0x277, 0x155, 0x21e, 0x32d, 0x2d2, 0xe6, 0xe0, 0x147, 0x262, 0x2c4, 0x1a0, 0xc8, 0x2f1, 0x3f3, 0x165, 0x33d, 0x233, 0x3eb, 0x3f0, 0x3b2, 0xab, 0x260, 0x259, 0x344, 0xaa, 0x2a, 0x32b, 0x375, 0x3c3, 0x46, 0x223, 0x30a, 0xfd, 0xa2, 0x25e, 0xa9, 0x2fd, 0xbd, 0x326, 0x271, 0xf2, 0x13b, 0x38b, 0x1b6, 0x18e, 0x2d9, 0x45, 0xf4, 0x9c, 0xae, 0x110, 0x2ea, 0x3b1, 0x27c, 0x1f6, 0x20a, 0x2f6, 0x1e, 0x332, 0x3aa, 0x23e, 0x2ef, 0xc1, 0x2cf, 0x103, 0xdc, 0x32a, 0x13f, 0x2b1, 0x77, 0x14a, 0x366, 0x1f5, 0xdd, 0x160, 0x4d, 0x280, 0x31e, 0x126, 0x26e, 0x18a, 0x3e3, 0x184, 0x30, 0x123, 0x11e, 0x139, 0x316, 0x352, 0x1ec, 0x9d, 0x1c1, 0x188, 0x2f5, 0x19b, 0x290, 0x3f7, 0xbe, 0x3e2, 0x395, 0x101, 0x82, 0x331, 0x2fa, 0x2a9, 0x1cd, 0x31d, 0x3eb, 0x3e9, 0x2d3, 0x151, 0x241, 0x3a2, 0x94, 0x1bd, 0x25a, 0x326, 0xeb, 0x3c8, 0x1ca, 0xce, 0x2a5, 0x358, 0x203, 0x199, 0x3aa, 0x75, 0x3ae, 0x201, 0xa3, 0x28, 0x365, 0x24d, 0x137, 0x18a, 0x3cf, 0x219, 0x180, 0x214, 0x388, 0x2cb, 0x72, 0x7d, 0x34f, 0x12, 0xf8, 0x3ad, 0x3a6, 0x2e0, 0x2b0, 0x73, 0xe0, 0x28e, 0x19a, 0x20d, 0x236, 0x136, 0x117, 0x20e, 0x391, 0x375, 0x38f, 0x118, 0x13c, 0xcc, 0x39f, 0xda, 0x113, 0x7a, 0x9c, 0x15c, 0x49, 0x37d, 0x36e, 0x30b, 0x167, 0x349, 0x35c, 0x77, 0x294, 0x183, 0x3b3, 0x1cb, 0x53, 0x364, 0x2d0, 0xf6, 0x2, 0x13a, 0x382, 0x310, 0x1e3, 0x336, 0x129, 0x3e7, 0x17c, 0x3cd, 0x323, 0x202, 0x104, 0x26b, 0x1fd, 0x15b, 0x39a, 0x13a, 0x30d, 0x5b, 0x303, 0x30c, 0x161, 0xe, 0x357, 0x262, 0x302, 0x236, 0x26c, 0x55, 0x54, 0x16e, 0x263, 0x238, 0x13b, 0x237, 0x356, 0x358, 0xf, 0x26d, 0x16f, 0x359, 0x135, 0x160, 0x134, 0x5a, 0x239, 0x1, 0x13a, 0x30d, 0x5b, 0x303, 0x30c, 0x161, 0xe, 0x357, 0x262, 0x302, 0x236, 0x26c, 0x55, 0x54, 0x16e, 0x263, 0x238, 0x13b, 0x237, 0x356, 0x358, 0xf, 0x26d, 0x16f, 0x359, 0x135, 0x160, 0x134, 0x5a, 0x239, 0x1, 0x13a, 0x30d, 0x5b, 0x303, 0x30c, 0x161, 0xe, 0x357, 0x262, 0x302, 0x236, 0x26c, 0x55, 0x54, 0x16e, 0x263, 0x238, 0x13b, 0x237, 0x356, 0x358, 0xf, 0x26d, 0x16f, 0x359, 0x135, 0x160, 0x134, 0x5a, 0x239, 0x1, 0x13a, 0x30d, 0x5b, 0x303, 0x30c, 0x161, 0xe, 0x357, 0x262, 0x302, 0x236, 0x26c, 0x55, 0x54, 0x16e, 0x263, 0x238, 0x13b, 0x237, 0x356, 0x358, 0x274, 0x2f, 0x2d8, 0x5c, 0x158, 0xe6, 0x309, 0x174, 0xab, 0x324, 0x34d, 0xa9, 0x3c5, 0x313, 0x110, 0x37d, 0x1a3, 0xdc, 0x166, 0x34b, 0x18a, 0x327, 0x1d8, 0xd8, 0xa4, 0x3f7, 0x2f8, 0x257, 0xb1, 0x340, 0x9b, 0x22e, 0x54, 0x2dc, 0x19e, 0x1e4, 0x394, 0x279, 0x1d, 0x333, 0x31b, 0x294, 0x205, 0x34e, 0x23c, 0x3b4, 0x72, 0x1f4, 0x95, 0x89, 0x1ce, 0x2fa, 0x2b6, 0xef, 0x2f9, 0x23, 0x9e, 0x198, 0xc7, 0x376, 0xb2, 0x1d5, 0xea, 0x14f, 0xb0, 0x134, 0xb4, 0xf6, 0x8, 0x384, 0x178, 0x2ed, 0x2e0, 0x2d2, 0x339, 0x7e, 0x3b2, 0x151, 0x116, 0x25e, 0x141, 0x217, 0xae, 0x92, 0x3de, 0x103, 0x2e9, 0x322, 0x26e, 0x4b, 0x10e, 0x2db, 0x2c9, 0x129, 0x387, 0x3ed, 0x29c, 0x181, 0x236, 0xd1, 0x154, 0x2a0, 0x2cd, 0xeb, 0x33b, 0x9f, 0x3ec, 0xe8, 0x1ae, 0xee, 0x8d, 0xc, 0x246, 0x1c4, 0xe1, 0xbc, 0x2ed, 0x1c9, 0x35a, 0x1fe, 0x3e9, 0x2b5, 0xfd, 0x232, 0x226, 0x3a9, 0x28b, 0x3ae, 0x2c, 0x9a, 0xb4, 0x1ec, 0x20, 0x1f, 0x3ad, 0x10f, 0x15e, 0x38a, 0x3b7, 0x1c7, 0x21d, 0x39f, 0x2d9, 0x59, 0x1d5, 0x1d4, 0x135, 0x189, 0x364, 0x2ad, 0x1f7, 0x9, 0x3e0, 0x155, 0x1a8, 0x39a, 0x1bc, 0x215, 0x9e, 0x330, 0x31c, 0x386, 0x332, 0x2de, 0x2fe, 0x2e1, 0x14c, 0x43, 0x11d, 0x297, 0x120, 0xe7, 0x2fa, 0x165, 0x3bc, 0x3e5, 0x230, 0x3e4, 0x2d1, 0x358, 0x3c, 0x291, 0x366, 0x36f, 0x8f, 0x1da, 0x72, 0x3e8, 0x254, 0x41, 0xdf, 0x3ef, 0xf3, 0x375, 0x47, 0x299, 0x67, 0x286, 0x3ca, 0x389, 0x294, 0x3, 0x123, 0x1c4, 0x33e, 0x25b, 0x1e7, 0x202, 0x32, 0x3d6, 0x107, 0x25f, 0x263, 0xf2, 0x394, 0xfb, 0x74, 0x1ae, 0x1dc, 0x234, 0x60, 0x21, 0xfe, 0x311, 0x3e2, 0x97, 0xd0, 0x249, 0x1c2, 0x2f0, 0x345, 0xaf, 0x38a, 0x367, 0x315, 0xcc, 0x18e, 0x386, 0x26d, 0x36a, 0x3dd, 0x243, 0x1da, 0xe4, 0x3bb, 0x284, 0x19, 0x3d6, 0x20e, 0x16e, 0x33c, 0x33b, 0x27c, 0x2b7, 0x27e, 0x133, 0x397, 0x3b0, 0x2c9, 0xad, 0xe, 0x28e, 0x196, 0x192, 0x293, 0x141, 0x4e, 0x2f2, 0xc1, 0x146, 0x109, 0x239, 0x8, 0x20b, 0x3ad, 0x21e, 0x171, 0x6f, 0x30e, 0x9e, 0x269, 0x6b, 0xf, 0x34c, 0x366, 0x2d7, 0x23c, 0x2cb, 0x329, 0x1e7, 0xd, 0xc8, 0x28f, 0x54, 0x362, 0x1d6, 0x1ee, 0x3c4, 0x195, 0x3d4, 0x18a, 0x87, 0x1bf, 0x265, 0x161, 0x70, 0x5d, 0xab, 0x8b, 0xb5, 0x21a, 0x270, 0x3bd, 0x201, 0x222, 0x5a, 0x1ec, 0x40, 0x7c, 0x157, 0xd4, 0x39a, 0x378, 0x46, 0xf9, 0x36c, 0x358, 0x78, 0x256, 0x306, 0x295, 0x1c4, 0x275, 0x17e, 0x323, 0x68, 0x249, 0x55, 0x2a0, 0x326, 0x2ab, 0x36b, 0x384, 0x3d2, 0x21e, 0x2e2, 0x1bc, 0x46, 0x1f2, 0x1ab, 0x2f6, 0x389, 0x242, 0x30, 0x42, 0x3f9, 0x2f8, 0x29c, 0x13, 0xbb, 0x128, 0x383, 0x15c, 0x132, 0xa3, 0x109, 0x7b, 0x20, 0x7c, 0x2ae, 0x350, 0xef, 0x3e5, 0xd2, 0x237, 0x105, 0x26f, 0x1dc, 0xc2, 0x209, 0x52, 0x3c7, 0x3af, 0x334, 0x260, 0x34d, 0x141, 0x9c, 0x3da, 0x201, 0x4d, 0x168, 0x37b, 0x9, 0x39b, 0x17d, 0x2ca, 0x1df, 0x47, 0x276, 0x279, 0xe8, 0x16b, 0x3fe, 0x76, 0x1b0, 0x252, 0xe, 0x115, 0x251, 0x8b, 0x16a, 0x7a, 0x3a4, 0x3ae, 0xb0, 0x1b2, 0x153, 0x3a3, 0x120, 0x39c, 0x3f3, 0x1e6, 0x39e, 0xf2, 0x24b, 0x3ab, 0x13f, 0x133, 0x327, 0x2db, 0x265, 0x2c2, 0x1c0, 0x2e8, 0x2a2, 0x144, 0x113, 0x35b, 0x75, 0x135, 0x22d, 0x225, 0x23a, 0x95, 0x41, 0x37c, 0x287, 0xb7, 0x33c, 0x27f, 0x1e2, 0x195, 0x3a1, 0x221, 0x31, 0x301, 0x353, 0xd4, 0x273, 0x3e5, 0x1a4, 0xce, 0x3a, 0x2b1, 0x3fe, 0xec, 0x2c9, 0x2b4, 0xe0, 0x2e8, 0x14d, 0x119, 0x8a, 0x1d5, 0x2bb, 0x1cb, 0xed, 0x1c8, 0x1e7, 0x34, 0x9b, 0x2a8, 0xbd, 0x44, 0x1ef, 0xa, 0x235, 0x1, 0x301, 0x353, 0xd4, 0x273, 0x3e5, 0x1a4, 0xce, 0x3a, 0x2b1, 0x3fe, 0xec, 0x2c9, 0x2b4, 0xe0, 0x2e8, 0x14d, 0x119, 0x8a, 0x1d5, 0x2bb, 0x1cb, 0xed, 0x1c8, 0x1e7, 0x34, 0x9b, 0x2a8, 0xbd, 0x44, 0x1ef, 0xa, 0x235, 0x1, 0x301, 0x353, 0xd4, 0x273, 0x3e5, 0x1a4, 0xce, 0x3a, 0x2b1, 0x3fe, 0xec, 0x2c9, 0x2b4, 0xe0, 0x2e8, 0x14d, 0x119, 0x8a, 0x1d5, 0x2bb, 0x1cb, 0xed, 0x1c8, 0x1e7, 0x34, 0x9b, 0x2a8, 0xbd, 0x44, 0x1ef, 0xa, 0x235, 0x1, 0x301, 0x353, 0xd4, 0x273, 0x3e5, 0x1a4, 0xce, 0x3a, 0x2b1, 0x3fe, 0xec, 0x2c9, 0x2b4, 0xe0, 0x2e8, 0x20b, 0x157, 0x2a9, 0x371, 0x47, 0x1ca, 0x3d1, 0x27e, 0x18a, 0x31, 0x303, 0x2b0, 0x1fe, 0x2e7, 0xcc, 0x6b, 0x78, 0x294, 0x30, 0x108, 0x3e7, 0x357, 0x196, 0x8b, 0x1a1, 0x3a9, 0xea, 0x1ba, 0x139, 0xe4, 0x1e7, 0x68, 0x26c, 0x16d, 0x3c2, 0x92, 0x32e, 0x109, 0x1ec, 0x200, 0x33f, 0x3fa, 0x1e6, 0x263, 0x33b, 0x3c4, 0xb3, 0xd5, 0x2e4, 0x2d8, 0x392, 0x38a, 0x30e, 0xf9, 0x356, 0x39d, 0x1dc, 0x308, 0xd8, 0xad, 0x70, 0x2e8, 0x29a, 0x6d, 0x59, 0x16f, 0x3dd, 0x23c, 0x275, 0x3e2, 0x162, 0x194, 0x94, 0x30f, 0x2f2, 0x201, 0x134, 0x2ad, 0x34f, 0x112, 0x37c, 0x20e, 0x362, 0x2ab, 0x36e, 0x2e9, 0x91, 0x13a, 0x2f0, 0x21e, 0x39a, 0x3f6, 0x1a4, 0x19c, 0xe8, 0x1a5, 0x397, 0x1bf, 0x30c, 0xe6, 0x1f8, 0x2c6, 0x337, 0x386, 0x34c, 0x306, 0x85, 0x1fc, 0x2f8, 0x262, 0x130, 0x293, 0x21a, 0x3a4, 0x1f, 0x155, 0x165, 0x375, 0xf2, 0x27c, 0x32a, 0x26e, 0x2e4, 0x1b9, 0x253, 0x6f, 0x8c, 0x31f, 0x1d, 0x16b, 0x3cf, 0x1bf, 0x211, 0x398, 0x3db, 0x33, 0x231, 0x78, 0x121, 0xc0, 0x52, 0x207, 0x22a, 0x151, 0x119, 0x228, 0x16f, 0x3b3, 0xe2, 0x38c, 0x257, 0x13, 0x1d1, 0x282, 0x1d2, 0x2a3, 0x22d, 0x10c, 0x3bb, 0x1a, 0x136, 0x16d, 0x38d, 0x248, 0x146, 0xb4, 0x1f7, 0x120, 0xdf, 0x107, 0x362, 0x15f, 0x1a3, 0x365, 0x102, 0x301, 0x157, 0x15b, 0x1df, 0x238, 0x9f, 0x2ce, 0x29f, 0xb9, 0x16c, 0x392, 0x31d, 0x23, 0x3c1, 0x105, 0x35c, 0x3f5, 0x369, 0x186, 0xe6, 0x3f0, 0x30a, 0x18e, 0x1e, 0x14a, 0x30, 0x210, 0x387, 0x28e, 0x156, 0x144, 0x8a, 0x35d, 0x3ea, 0x23c, 0xe3, 0x393, 0x302, 0x176, 0x2a4, 0x270, 0x3ae, 0x189, 0x43, 0x3e8, 0x202, 0x249, 0x159, 0x1e1, 0x92, 0x255, 0x2d, 0x37b, 0x3e, 0x15d, 0x33a, 0x335, 0x27f, 0x21f, 0x24d, 0x24a, 0x2f0, 0x6a, 0x1de, 0x47, 0x321, 0x167, 0x29f, 0x172, 0x1b9, 0xaf, 0x1bc, 0x69, 0x19c, 0x3a0, 0x266, 0x31, 0x17, 0x35a, 0x367, 0x278, 0x2a5, 0xd7, 0x3fe, 0x369, 0x30c, 0x398, 0x3bf, 0xcc, 0x1ac, 0x389, 0x61, 0x6c, 0x15a, 0x380, 0x1af, 0x3cb, 0x386, 0x12b, 0xc, 0x108, 0x387, 0x115, 0x151, 0x232, 0xb2, 0x36a, 0x34e, 0x7f, 0x2f8, 0x19a, 0x324, 0x1a1, 0x2bf, 0x2bb, 0x243, 0x33e, 0x3cd, 0x302, 0x2ec, 0x282, 0x3a4, 0x29e, 0x14c, 0xe4, 0x395, 0x289, 0x216, 0x383, 0x1ed, 0x2c, 0x2c1, 0x7d, 0x284, 0x320, 0x159, 0x3c2, 0x248, 0x28c, 0x2d0, 0x3a3, 0x224, 0x3d6, 0x150, 0x20c, 0x1ef, 0x50, 0x7b, 0x200, 0xe7, 0x3d7, 0x16e, 0x351, 0x2d5, 0x365, 0x204, 0x1f, 0x2aa, 0x19d, 0x39e, 0x33b, 0x30b, 0x322, 0x125, 0x178, 0x35, 0xef, 0x7c, 0x17d, 0x1e6, 0x33c, 0x36b, 0x2e9, 0x81, 0x20b, 0x2aa, 0x33a, 0x263, 0x1ee, 0xdc, 0x91, 0x1c2, 0x157, 0x165, 0x1cf, 0x33b, 0x21f, 0x93, 0x13a, 0x3ad, 0x2a9, 0x3be, 0x1e4, 0x3c4, 0x191, 0x125, 0x2f0, 0xd4, 0x371, 0x238, 0x27c, 0xb3, 0x2a1, 0x5e, 0x21e, 0xef, 0x47, 0x24b, 0x195, 0xd5, 0x30d, 0x345, 0x39a, 0x38f, 0x1ca, 0x2b7, 0x29f, 0x2e4, 0x2ed, 0x171, 0x3f6, 0x13b, 0x3d1, 0x3d4, 0x258, 0x2d8, 0xaf, 0x378, 0x1a4, 0xfb, 0x27e, 0x4b, 0x5b, 0x392, 0x6f, 0x230, 0x19c, 0x349, 0x18a, 0x188, 0x170, 0x38a, 0x46, 0x237, 0xe8, 0x133, 0x31, 0x2e, 0x173, 0x30e, 0x3c1, 0x1d, 0x1a5, 0x87, 0x303, 0x1ad, 0x367, 0xf9, 0x286, 0x2b1, 0x397, 0x1e3, 0x2b0, 0x3eb, 0x9e, 0x356, 0xd7, 0x3f5, 0x1bf, 0x56, 0x1fe, 0x315, 0x36c, 0x39d, 0x2fb, 0x3b0, 0x30c, 0x339, 0x2e7, 0x269, 0x2f6, 0xf8, 0x1fd, 0x32b, 0x3ac, 0x1a3, 0x31e, 0x10, 0x39b, 0x3ef, 0x2dc, 0x2be, 0x206, 0x18c, 0x100, 0x1ce, 0x287, 0x193, 0x3ba, 0x28, 0xf6, 0x24, 0xdf, 0x2a, 0x106, 0x3de, 0x280, 0x37b, 0x240, 0x1eb, 0x2a0, 0x44, 0x197, 0x5a, 0x3d5, 0x41, 0x28f, 0x25a, 0x49, 0x146, 0x1a9, 0x127, 0x19, 0xaa, 0x1e1, 0x99, 0x4d, 0x2a6, 0x254, 0x190, 0x2b2, 0x22f, 0x182, 0xd9, 0x23a, 0x101, 0x136, 0x37a, 0x2b8, 0x16, 0x18b, 0x3e8, 0x34, 0x344, 0x3c5, 0x3da, 0x160, 0x86, 0x2f7, 0x340, 0x25, 0x27, 0x1d7, 0x22d, 0x72, 0x323, 0x65, 0x250, 0x270, 0x14f, 0x298, 0x329, 0x25c, 0x259, 0x141, 0x341, 0xdd, 0x1da, 0x2fc, 0x181, 0x1d1, 0x3d, 0x75, 0x1cb, 0x19f, 0x393, 0x26, 0x12f, 0x3d0, 0x359, 0x8f, 0x1c6, 0x14e, 0x260, 0x2d4, 0x177, 0x1f5, 0xe2, 0x5f, 0xcd, 0x241, 0x113, 0x35d, 0x36f, 0x23b, 0x1f0, 0x3fd, 0x16e, 0x2be, 0x5, 0x239, 0x12, 0xdf, 0x54, 0x11, 0x2cf, 0x5a, 0x3a3, 0x104, 0x55, 0x1e1, 0x132, 0x134, 0x11d, 0x101, 0x26c, 0x1f3, 0x1ed, 0x160, 0x10c, 0x3ce, 0x236, 0x250, 0xe9, 0x135, 0xed, 0x2fc, 0x302, 0x34d, 0x1e8, 0x359, 0x11e, 0x311, 0x262, 0x241, 0x226, 0x16f, 0x34e, 0x3f8, 0x357, 0x2ac, 0xda, 0x26d, 0x3, 0x210, 0xe, 0x3b2, 0x3cb, 0xf, 0x242, 0x36, 0x161, 0xfc, 0x33, 0x358, 0xee, 0xec, 0x30c, 0xff, 0x223, 0x356, 0x35c, 0x327, 0x303, 0x2bd, 0x215, 0x237, 0x3a0, 0x314, 0x5b, 0x253, 0x2f9, 0x13b, 0x35f, 0x137, 0x30d, 0x10f, 0x1de, 0x238, 0x1e2, 0x322, 0x13a, 0x2af, 0x2ca, 0x263, 0x3b1, 0x1db, 0x1, 0x1f0, 0x3fd, 0x16e, 0x2be, 0x5, 0x239, 0x12, 0xdf, 0x54, 0x11, 0x2cf, 0x5a, 0x3a3, 0x104, 0x55, 0x1e1, 0x132, 0x134, 0x11d, 0x101, 0x26c, 0x3e0, 0x3ef, 0x362, 0x3ba, 0xa0, 0x37b, 0x112, 0x28f, 0x17a, 0x99, 0x134, 0x23a, 0xd, 0x344, 0x30f, 0x1d7, 0xa6, 0x329, 0x162, 0x1d1, 0xf4, 0x359, 0x23c, 0x5f, 0x334, 0x51, 0x59, 0x366, 0x21, 0x307, 0x2e8, 0x3e1, 0xf, 0x8d, 0xd8, 0x31a, 0x3db, 0x269, 0x39d, 0x3f5, 0x1e3, 0x1ad, 0x30e, 0x237, 0x349, 0x4b, 0x2d8, 0x171, 0x38f, 0x24b, 0xb3, 0x125, 0x3ad, 0x165, 0x263, 0x36b, 0x365, 0x8, 0x33f, 0x347, 0x326, 0x1ef, 0x109, 0x3ee, 0x82, 0x55, 0x3c2, 0xc1, 0x1b2, 0x1f4, 0x68, 0x216, 0x4e, 0x2a3, 0x139, 0x17e, 0x302, 0x293, 0x3a9, 0x2fe, 0x1c4, 0x2f8, 0x196, 0x288, 0x2c8, 0x306, 0x108, 0xe, 0x36d, 0x337, 0x78, 0x61, 0x2c9, 0xe6, 0x2e7, 0x36c, 0xd7, 0x397, 0x303, 0x173, 0x46, 0x19c, 0x27e, 0x258, 0x2ed, 0x39a, 0x47, 0x27c, 0x191, 0x13a, 0x157, 0x33a, 0x33c, 0x36e, 0x3c9, 0x3a7, 0x326, 0x3de, 0x2d, 0x34f, 0x32, 0x2b2, 0x15c, 0x58, 0x10c, 0x323, 0x328, 0x10d, 0xea, 0x8f, 0x22b, 0x334, 0xa2, 0x164, 0x306, 0x210, 0x38, 0x35e, 0x31c, 0x31b, 0x76, 0x211, 0x3f1, 0xf9, 0x3a, 0xc5, 0x5b, 0x15e, 0x3c3, 0x24b, 0x166, 0x9d, 0x157, 0x27d, 0xeb, 0x346, 0x18c, 0x12, 0x37c, 0x149, 0x49, 0x222, 0x28a, 0x202, 0x344, 0x217, 0x355, 0x139, 0x2fc, 0x13, 0xb5, 0x2ee, 0x36f, 0x1fc, 0x2a7, 0x14d, 0x376, 0xa5, 0x209, 0x161, 0x3f0, 0x330, 0x39d, 0x3e3, 0x385, 0x173, 0x8c, 0x279, 0x3d4, 0x1c1, 0x10f, 0x371, 0x3c8, 0x6e, 0x81, 0xf8, 0x3f3, 0x362, 0x37d, 0x280, 0x3ee, 0x104, 0x154, 0x22f, 0xb, 0x225, 0x1e7, 0x65, 0x2a4, 0x11f, 0x396, 0x1c6, 0x262, 0x116, 0x228, 0x366, 0x42, 0x7, 0x36d, 0x267, 0x1e0, 0x308, 0xc3, 0xff, 0x9e, 0x105, 0x29d, 0x188, 0x39b, 0x287, 0x106, 0x197, 0x1a9, 0x254, 0x136, 0x3c5, 0x1d7, 0x298, 0x2fc, 0x26, 0x2d4, 0x35d, 0x295, 0x3f7, 0xba, 0x3e1, 0x3c, 0xc2, 0x265, 0xff, 0x13c, 0x1d, 0xc5, 0xb6, 0x171, 0x227, 0xf1, 0x93, 0x301, 0x2fa, 0x16e, 0x1dd, 0x140, 0x3ee, 0x208, 0x159, 0x15c, 0xb0, 0x39, 0x12e, 0x2ec, 0x1e8, 0x2fe, 0x319, 0x3d3, 0x151, 0x1bb, 0xa5, 0x1b, 0x18d, 0x3bf, 0x36c, 0x35c, 0x10e, 0x170, 0x1bc, 0x276, 0x195, 0x296, 0x353, 0x33a, 0xeb, 0x285, 0x239, 0x90, 0x3a5, 0x17a, 0x264, 0x364, 0x3bb, 0x11b, 0x152, 0x11f, 0x325, 0x311, 0x334, 0x144, 0x199, 0x6, 0x148, 0x309, 0x21d, 0x17b, 0x1ff, 0x1e3, 0x2bd, 0x8c, 0xfb, 0x34b, 0x213, 0xd4, 0x2e3, 0x3dc, 0x365, 0x20, 0x39c, 0x54, 0x88, 0x28c, 0x145, 0x202, 0x281, 0x4e, 0x29e, 0x3b4, 0x32f, 0xc9, 0x226, 0x36a, 0x214, 0x207, 0x36d, 0x33f, 0x20e, 0x22, 0x146, 0x145, 0xd, 0x216, 0x270, 0x1ba, 0x275, 0x262, 0x51, 0x2c8, 0x6, 0x290, 0x3f, 0xcc, 0x39d, 0x397, 0x2e, 0x6f, 0x13b, 0x195, 0x125, 0x157, 0x1e6, 0x2ab, 0x14, 0x37b, 0x82, 0x2a8, 0x15c, 0x160, 0xe4, 0x162, 0x293, 0x177, 0x2d7, 0x3fb, 0x5d, 0x3e1, 0x78, 0x308, 0x30c, 0x3eb, 0x3c1, 0x349, 0x258, 0x345, 0x371, 0x33b, 0x2e9, 0x8, 0x1ce, 0x54, 0x110, 0x222, 0x23a, 0x68, 0x94, 0x3a4, 0x1cb, 0x38c, 0x334, 0x288, 0x26d, 0x30, 0xad, 0x1f8, 0x269, 0xd7, 0x87, 0x170, 0x378, 0x1ca, 0xb3, 0x13a, 0x2aa, 0x32b, 0x175, 0xa0, 0x3ee, 0x19, 0x16d, 0x2f2, 0x312, 0x329, 0x302, 0xb5, 0x3aa, 0x295, 0x3e7, 0x2e8, 0x337, 0x3c0, 0x76, 0x56, 0x367, 0x237, 0x27e, 0x2e4, 0x21e, 0x3be, 0x1ee, 0x365, 0x40, 0x26b, 0x2a0, 0x92, 0x134, 0x1f4, 0x340, 0xa9, 0x11f, 0x277, 0x2a, 0x110, 0x4d, 0xfa, 0x340, 0x152, 0x75, 0x23c, 0x1f9, 0x2ac, 0x376, 0x121, 0x360, 0x339, 0x13c, 0x74, 0x4b, 0x1d3, 0x3bc, 0x33b, 0x1db, 0x20, 0x26b, 0x149, 0x248, 0x1b2, 0x37f, 0xca, 0x21a, 0x2bb, 0x319, 0x357, 0x13d, 0x203, 0x61, 0xc3, 0x3f1, 0x3c1, 0x29b, 0x172, 0x21e, 0x375, 0x3b1, 0x31e, 0x9, 0x1eb, 0x17a, 0x182, 0x225, 0x323, 0x176, 0x3d0, 0x3dd, 0x3f8, 0x22a, 0x3e1, 0xf0, 0x3b, 0x56, 0x2c7, 0xce, 0x3d4, 0x213, 0x350, 0x263, 0x2d5, 0x318, 0x120, 0x117, 0x313, 0x2c, 0x39, 0xb1, 0x293, 0x2ee, 0x34e, 0x3e7, 0x1d9, 0xc7, 0x23f, 0x369, 0x2d2, 0x46, 0x1f6, 0x26e, 0x2f0, 0x2ca, 0xeb, 0x206, 0x3d8, 0x41, 0x2a8, 0x2b8, 0x189, 0x329, 0x20d, 0x2d4, 0x16f, 0x10a, 0x7, 0x35e, 0xd6, 0x379, 0x1e3, 0x2e6, 0xd2, 0x2b7, 0x14b, 0x2af, 0x1e6, 0x15f, 0x50, 0x3ee, 0xe7, 0xa8, 0x92, 0xd9, 0x37f, 0x194, 0x7a, 0x1f5, 0x1fc, 0x22a, 0x3cb, 0x3c0, 0x1d8, 0x169, 0x46, 0x3ec, 0x1aa, 0x3ad, 0xf3, 0x15f, 0xa0, 0x3a3, 0x190, 0x3e6, 0x355, 0x3b4, 0x14e, 0x22c, 0x199, 0x30, 0x2b4, 0x3bf, 0x356, 0x29d, 0xb6, 0x39a, 0xf2, 0x1b8, 0x8, 0x331, 0x149, 0x99, 0x2c1, 0x3ce, 0xbb, 0x3d0, 0x3b3, 0x3fb, 0x174, 0x267, 0x23f, 0x2db, 0x35a, 0x230, 0x35f, 0x14b, 0x157, 0x391, 0x2ea, 0x109, 0x127, 0x9b, 0x30f, 0x29e, 0x19f, 0x262, 0x144, 0xd3, 0x180, 0x18d, 0x1c7, 0x286, 0xc5, 0x1b9, 0xef, 0x399, 0x1db, 0x40, 0x1be, 0x25a, 0xc1, 0x225, 0x24f, 0x1d1, 0x2bf, 0x1a7, 0x3e7, 0x3b2, 0x31c, 0x1dc, 0x2f5, 0x2e6, 0x1a4, 0x2ce, 0x24a, 0x2aa, 0xb7, 0x37d, 0x5a, 0x12a, 0xd1, 0x4e, 0xdd, 0xe3, 0x334, 0x232, 0x291, 0x1b, 0x73, 0x223, 0x1d, 0x221, 0x1d3, 0x371, 0x1ce, 0x2a0, 0x99, 0x18b, 0x323, 0x1d1, 0x177, 0x295, 0x307, 0x35e, 0x358, 0x3f5, 0x2e, 0x378, 0x24b, 0x93, 0x7c, 0x347, 0x22, 0x222, 0x1f4, 0x236, 0x21a, 0x2fe, 0x1fc, 0x5d, 0x337, 0x23f, 0x1bf, 0x173, 0x1a4, 0x195, 0x13a, 0x17d, 0x362, 0x363, 0x2ad, 0xd, 0x94, 0x11f, 0x23c, 0x3ed, 0x29a, 0xf, 0x308, 0x56, 0x30e, 0xfb, 0xd5, 0x3ad, 0x1e6, 0x175, 0x109, 0x24e, 0x26c, 0x4e, 0x1ba, 0x38c, 0x196, 0x368, 0x294, 0x2c9, 0x1fe, 0x3c1, 0x27e, 0x30d, 0x2a9, 0x33c, 0x206, 0x37b, 0x19, 0x37a, 0x1d7, 0x1da, 0x14e, 0x51, 0x26d, 0x180, 0x31a, 0x315, 0x1d, 0x4b, 0x345, 0x3be, 0x36b, 0xc6, 0x120, 0x55, 0x15c, 0x312, 0x17e, 0x130, 0x8a, 0x306, 0x290, 0x1f8, 0x36c, 0x1a5, 0x5b, 0x39a, 0x1e4, 0x2e9, 0x40, 0x37c, 0x17a, 0x201, 0x218, 0x162, 0xb5, 0x16f, 0x21, 0x70, 0x21d, 0x39d, 0x39c, 0x292, 0xc1, 0x86, 0xb1, 0xb5, 0x2de, 0x84, 0x380, 0x198, 0x35c, 0x188, 0x2e2, 0xf2, 0x2e9, 0x80, 0x1eb, 0x3c2, 0x58, 0x390, 0x26, 0x226, 0x183, 0x290, 0x3f0, 0x1ab, 0x133, 0x1b9, 0x3bc, 0x1ee, 0x235, 0x90, 0x55, 0x2b8, 0x53, 0x3e2, 0x324, 0x164, 0x30, 0x2c2, 0x38e, 0x1d, 0x96, 0x10f, 0x1cf, 0x2d5, 0xf6, 0x82, 0x2da, 0x2ef, 0x1da, 0x29c, 0x144, 0x34c, 0x36, 0x398, 0xf9, 0x29b, 0x382, 0x2a9, 0x271, 0xa, 0x3ee, 0x190, 0x383, 0x135, 0xe3, 0xcb, 0x368, 0x121, 0x336, 0x3eb, 0x67, 0x34b, 0x2f0, 0x27d, 0x2be, 0x109, 0x95, 0x1a2, 0x270, 0x396, 0x17c, 0x151, 0x305, 0x184, 0x56, 0x215, 0x3ec, 0x2a1, 0x2ae, 0xb7, 0x1ef, 0x1a9, 0x202, 0x94, 0x23e, 0xe2, 0x357, 0x1fa, 0x1e0, 0x3b0, 0x35a, 0xd2, 0x195, 0x274, 0x1fd, 0x326, 0x255, 0x11d, 0x340, 0x282, 0x17f, 0x1fc, 0x331, 0x25a, 0x201, 0x72, 0x20d, 0x113, 0x183, 0x129, 0x3db, 0x143, 0x314, 0x345, 0x2e3, 0x2d5, 0x1ec, 0x208, 0x2fd, 0x2a3, 0x33e, 0x261, 0x368, 0x242, 0xc3, 0x367, 0x279, 0x1aa, 0x157, 0xb7, 0x3de, 0x2ad, 0x34, 0x152, 0x359, 0xfe, 0xba, 0x18e, 0x379, 0x20f, 0x378, 0x13e, 0x122, 0x33f, 0x150, 0x132, 0x43, 0xb1, 0x16a, 0x36a, 0x29, 0x7e, 0x36c, 0x29d, 0x1b9, 0x371, 0x3b1, 0x18c, 0x112, 0x2b2, 0x373, 0x1da, 0x131, 0x119, 0x256, 0x360, 0x3fc, 0x237, 0x34b, 0x1e9, 0x1e6, 0x1dd, 0xb4, 0x284, 0x4a, 0x23e, 0x1c4, 0x147, 0x3cb, 0x23f, 0x2f5, 0x31d, 0x1ca, 0x24d, 0xf8, 0x20e, 0x49, 0x364, 0x323, 0x34d, 0x35d, 0x21, 0x1c0, 0x198, 0x2b1, 0x229, 0x33d, 0x33b, 0x18f, 0x48, 0x55, 0x179, 0x14c, 0x32f, 0x22c, 0xd3, 0x1b, 0x398, 0x1f2, 0x27e, 0x2f, 0x2ca, 0x2ab, 0x280, 0x95, 0x344, 0x26b, 0x17a, 0x2c, 0x329, 0x130, 0x59, 0x30, 0x31a, 0x9e, 0x349, 0x30d, 0x165, 0x2ab, 0x109, 0x254, 0x216, 0x11f, 0x1c4, 0x28e, 0x337, 0x1dc, 0x303, 0x378, 0x27c, 0x81, 0x1ce, 0x12d, 0x201, 0xe4, 0x26, 0x8a, 0x6, 0x161, 0x315, 0xe8, 0x2e4, 0x2a9, 0x1d6, 0xa0, 0x24e, 0x344, 0x3a4, 0x23c, 0x357, 0x3e1, 0x23f, 0x1e3, 0x6f, 0x24b, 0x91, 0x33f, 0x2a0, 0xc1, 0x218, 0x302, 0x113, 0x306, 0xad, 0x2e7, 0x1d, 0x258, 0xd4, 0x33c, 0x14, 0x34f, 0x26c, 0x270, 0x243, 0x3ed, 0xfd, 0x3c0, 0x1bf, 0x38a, 0x1ca, 0x93, 0x3e0, 0x54, 0x99, 0x43, 0x162, 0x1a1, 0x366, 0x290, 0x3db, 0x286, 0x4b, 0x21e, 0x263, 0x206, 0x3ee, 0x249, 0x4e, 0x1cb, 0x2f8, 0x29a, 0x78, 0x3b0, 0x173, 0x13b, 0x191, 0x7c, 0x20e, 0x92, 0x18b, 0x12e, 0xb5, 0x36a, 0x52, 0x1f8, 0x356, 0x18a, 0x345, 0x1cf, 0x346, 0xdf, 0x1e1, 0x160, 0x2fc, 0x241, 0x26d, 0x36, 0xff, 0x237, 0x137, 0x2af, 0x16e, 0x2cf, 0x11d, 0x236, 0x1e8, 0x34e, 0xe, 0x33, 0x35c, 0x5b, 0x1de, 0x3b1, 0x239, 0x104, 0x1f3, 0x135, 0x311, 0x2ac, 0xf, 0xec, 0x2bd, 0x13b, 0x322, 0x1f0, 0x54, 0x132, 0x10c, 0x302, 0x226, 0x3, 0x161, 0x223, 0x3a0, 0x30d, 0x2ca, 0x2be, 0x5a, 0x101, 0x250, 0x359, 0x3f8, 0x3b2, 0x358, 0x327, 0x253, 0x238, 0x1db, 0x12, 0x55, 0x1ed, 0xed, 0x262, 0xda, 0x242, 0x30c, 0x215, 0x35f, 0x13a, 0x3fd, 0x11, 0x134, 0x3ce, 0x34d, 0x16f, 0x210, 0xfc, 0x356, 0x314, 0x10f, 0x263, 0x5, 0x3a3, 0x26c, 0xe9, 0x11e, 0x357, 0x3cb, 0xee, 0x303, 0x2f9, 0x1e2, 0x1, 0xdf, 0x1e1, 0x160, 0x2fc, 0x241, 0x26d, 0x36, 0xff, 0x237, 0x137, 0x2af, 0x16e, 0x2cf, 0x11d, 0x236, 0x1e8, 0x34e, 0xe, 0x33, 0x35c, 0x5b, 0x1be, 0x38d, 0x312, 0x393, 0xa2, 0x256, 0x336, 0x2c7, 0x3d1, 0x9d, 0x3fd, 0x22, 0xd9, 0x24f, 0xb5, 0x1b3, 0x129, 0x2e7, 0x74, 0x1c1, 0x165, 0x2be, 0xb4, 0xd, 0x2a4, 0x1f5, 0x3e7, 0x163, 0x333, 0x188, 0x273, 0x3dc, 0x239, 0x208, 0x3c5, 0x1ba, 0x17c, 0x13d, 0x3c0, 0x2f5, 0xde, 0x27c, 0x204, 0xdf, 0x3c2, 0x189, 0x3cd, 0x51, 0x12b, 0x19b, 0x367, 0x3ec, 0x24a, 0x3fa, 0x11, 0x268, 0x323, 0x25e, 0x2dd, 0x290, 0x377, 0x3a, 0x2e4, 0x2b6, 0x15f, 0x5a, 0x202, 0x152, 0x2fe, 0x3f7, 0x2b5, 0x39d, 0xc4, 0x33d, 0x1ee, 0x318, 0x104, 0x3e6, 0xdd, 0xbe, 0x29a, 0x1e0, 0x37e, 0x6f, 0x13e, 0x102, 0x26b, 0x1e1, 0x2c0, 0x3e2, 0x22c, 0x291, 0x2c9, 0x3b7, 0x1f6, 0x125, 0x1fd, 0x20c, 0x134, 0x395, 0x12f, 0x36a, 0x148, 0x3bf, 0x1d, 0x172, 0x15b, 0x2ab, 0x2d, 0x101, 0xa9, 0x17f, 0x3ff, 0x35e, 0x37c, 0x22f, 0xa6, 0x14e, 0x6d, 0x8d, 0x56, 0x230, 0xb3, 0x7c, 0x54, 0xc1, 0xe4, 0x130, 0x2c8, 0x1b, 0x1fe, 0x19c, 0x2a1, 0x17d, 0x106, 0x134, 0x323, 0xb5, 0x366, 0xad, 0x315, 0x349, 0x5e, 0x1e6, 0x1ef, 0x145, 0x236, 0x3a9, 0x85, 0x380, 0x36c, 0x18a, 0x21e, 0x33c, 0xa0, 0x254, 0x94, 0x359, 0x3fb, 0x35e, 0x39d, 0x188, 0xef, 0x36b, 0x1ec, 0xc8, 0x4e, 0x243, 0x357, 0x337, 0x2fb, 0x170, 0x47, 0x2e9, 0x24, 0x2a8, 0x1d7, 0x275, 0xab, 0xf, 0x3b0, 0x38a, 0x24b, 0x81, 0x26b, 0x3c2, 0x312, 0x32f, 0x288, 0x294, 0x30c, 0x46, 0x195, 0x20b, 0x20e, 0x99, 0x218, 0x26, 0x59, 0x180, 0x339, 0x237, 0xd5, 0x2aa, 0x326, 0x222, 0x1e7, 0x293, 0x36a, 0x290, 0x2e7, 0xe8, 0x30d, 0x33a, 0x3ba, 0x2ad, 0x340, 0xf4, 0x295, 0x70, 0x269, 0x133, 0x345, 0x263, 0x14, 0x24e, 0x216, 0xea, 0x2f1, 0xae, 0x139, 0xcd, 0x1bb, 0x308, 0x35a, 0xe5, 0x91, 0x39c, 0x1e1, 0x312, 0x257, 0x232, 0x8d, 0xac, 0xd2, 0x191, 0x3c9, 0x292, 0x2c, 0x2fc, 0x22c, 0x256, 0xc3, 0x23, 0x195, 0x1f, 0x2a, 0xc1, 0x1c8, 0xc9, 0x26d, 0x1b0, 0x3b7, 0x3d1, 0x274, 0x3a7, 0x92, 0x86, 0x13, 0x59, 0x300, 0xff, 0x19c, 0x14b, 0x1fd, 0x22, 0x364, 0xb1, 0x113, 0xc, 0x73, 0x3c1, 0x137, 0x155, 0x326, 0x4d, 0x395, 0xb5, 0x2c5, 0x2b4, 0x9e, 0xf5, 0x3d2, 0x16e, 0x255, 0x3d9, 0x1d1, 0x2de, 0x148, 0x2e7, 0x1d0, 0x2f, 0x1e6, 0x3de, 0x11d, 0x194, 0x2ee, 0x84, 0x1f8, 0x105, 0x172, 0x165, 0x2ea, 0x352, 0x340, 0x1e8, 0x246, 0x380, 0x2d1, 0x221, 0xd4, 0x3ac, 0x2d, 0xd, 0x282, 0x36f, 0xe, 0x198, 0x29d, 0x345, 0xcf, 0x50, 0x254, 0x128, 0x17f, 0x3e7, 0x185, 0x35c, 0x2d8, 0x375, 0x103, 0x34f, 0x1eb, 0x2b8, 0x1da, 0xcb, 0x305, 0x3b0, 0x233, 0xf1, 0x8, 0x343, 0x1ed, 0x2cb, 0x251, 0x1e, 0x1bf, 0x1bc, 0x381, 0x40, 0x22e, 0x373, 0x275, 0x2ac, 0xf0, 0x1e3, 0x1fb, 0x37, 0x200, 0x154, 0x3ae, 0x38c, 0x14d, 0x389, 0x303, 0x3c3, 0x1b8, 0x24, 0x2b2, 0x14f, 0x5f, 0x27a, 0x77, 0x2e, 0x227, 0x1db, 0x120, 0x1bd, 0x26a, 0x2f8, 0x3f4, 0x3b8, 0x170, 0x11c, 0x2c3, 0x112, 0x1f3, 0x374, 0x3ed, 0x39f, 0x1ff, 0x392, 0xf2, 0x235, 0x82, 0x383, 0x396, 0x357, 0xc7, 0x3e3, 0xaf, 0x399, 0x18c, 0x19, 0x27, 0x8f, 0x28e, 0x231, 0x327, 0x171, 0xf7, 0x7b, 0xc8, 0x138, 0x71, 0x5d, 0x1ac, 0x10e, 0x39a, 0x3b1, 0x3d8, 0x249, 0x1d2, 0x388, 0x2e8, 0x17b, 0x62, 0xef, 0x1b7, 0x2ff, 0x26c, 0x28b, 0x7f, 0x36d, 0x3ca, 0x310, 0x371, 0x1a3, 0x3d5, 0x344, 0x75, 0x3f8, 0x35e, 0x26f, 0xb6, 0x3be, 0x3d6, 0x2f2, 0x2cb, 0xab, 0x78, 0x1e3, 0x3f6, 0xdc, 0x24, 0x16d, 0x135, 0x2f8, 0x3e1, 0x2fb, 0x392, 0x1e4, 0xc6, 0x19, 0x4e, 0x23c, 0x5d, 0x358, 0x31, 0xef, 0x36e, 0x3ee, 0x344, 0xea, 0x3fb, 0x2c6, 0x2b1, 0x2ed, 0x263, 0xa0, 0x284, 0x141, 0x2d7, 0x70, 0x36c, 0x4b, 0x2a9, 0x175, 0x2ad, 0x236, 0x177, 0x108, 0x3db, 0xe8, 0x5e, 0x32b, 0x32e, 0x3bb, 0x293, 0x366, 0x161, 0xf9, 0x29f, 0x2aa, 0x106, 0x1b2, 0x162, 0x8a, 0x180, 0x1fe, 0xfb, 0x13a, 0x347, 0x99, 0xe4, 0x192, 0x34c, 0x265, 0x46, 0xb3, 0x3e0, 0x12d, 0x160, 0x32f, 0x6d, 0x61, 0x1ad, 0x1ca, 0x81, 0x37c, 0x15c, 0x1da, 0x196, 0xf, 0x1bf, 0x378, 0x21f, 0x200, 0x2a8, 0x2a3, 0x5f, 0xfd, 0x1dc, 0x170, 0x238, 0x31e, 0x82, 0x30f, 0x243, 0x28e, 0x6b, 0x87, 0x39a, 0x36b, 0x37b, 0x26c, 0x11f, 0x1fc, 0x35e, 0xd7, 0x3a5, 0x3da, 0x275, 0x2a2, 0x31b, 0x2e, 0x8e, 0x18f, 0x82, 0x217, 0x11e, 0x5d, 0x2b9, 0xc4, 0x371, 0x285, 0x127, 0x94, 0x1f5, 0x7, 0x269, 0x314, 0x350, 0x175, 0x153, 0xca, 0x3aa, 0xa4, 0x38e, 0x27e, 0x353, 0x193, 0x134, 0x25c, 0x45, 0x180, 0x3fc, 0x3ec, 0x1c2, 0x15, 0x304, 0x17e, 0xa2, 0x242, 0x2b0, 0x276, 0x244, 0x37c, 0x2b8, 0x361, 0xab, 0xf0, 0x385, 0x38f, 0x1db, 0x89, 0x3e6, 0x396, 0x147, 0x6b, 0x10e, 0x273, 0x36e, 0x3d5, 0x10b, 0x359, 0x3c7, 0x66, 0x133, 0x35, 0x351, 0x2d0, 0x289, 0x2bf, 0x108, 0x3bf, 0x3a0, 0x2f0, 0x2dc, 0x111, 0x323, 0x342, 0x18, 0x339, 0x338, 0x9d, 0x347, 0x132, 0x390, 0x8b, 0xa5, 0x2b, 0x1a4, 0x126, 0x331, 0x22f, 0x272, 0xcb, 0xf, 0x37e, 0x1fb, 0xdc, 0x48, 0x1bd, 0x1ba, 0x3d3, 0xc7, 0x397, 0x2e2, 0x3b1, 0x37b, 0xd1, 0x75, 0x3fb, 0x343, 0x373, 0x38c, 0x27a, 0x3b8, 0x392, 0x399, 0x7b, 0x249, 0x28b, 0x3f8, 0x2c6, 0x2d6, 0x283, 0x1d6, 0x168, 0x289, 0x177, 0x29, 0x1c7, 0x27e, 0x2af, 0x245, 0x1b2, 0x181, 0xb2, 0xd8, 0x187, 0x32a, 0x3e0, 0xbd, 0x22d, 0x262, 0x1c3, 0x369, 0x378, 0x6e, 0x48, 0x37a, 0x2e1, 0x2a7, 0x6b, 0x21c, 0x1de, 0x346, 0x127, 0x128, 0x3dd, 0x38, 0x2d1, 0x258, 0x19d, 0x3de, 0x1f4, 0x34d, 0x2c5, 0x31a, 0x31f, 0x14b, 0x3ef, 0x248, 0x1c8, 0x8b, 0x14a, 0xac, 0x13b, 0x244, 0x2f1, 0x2f2, 0x33e, 0x2a2, 0x23f, 0xb8, 0x79, 0xc6, 0x64, 0xe9, 0x23b, 0x1af, 0x1ae, 0x2ed, 0x19e, 0x212, 0x68, 0x3d0, 0x42, 0x3db, 0x3a0, 0x1e9, 0x362, 0x9a, 0x25c, 0x8a, 0x209, 0x3df, 0x2b7, 0x3e, 0x149, 0x160, 0xa7, 0x2d9, 0x76, 0x233, 0x381, 0x200, 0x2b2, 0x26a, 0x3ed, 0xc7, 0x327, 0x39a, 0x1b7, 0x3d5, 0x216, 0x28f, 0x1d7, 0x5f, 0x3e1, 0x3f5, 0x171, 0x36b, 0x3ee, 0x216, 0x2fe, 0xe, 0x36c, 0x258, 0x33a, 0x363, 0x3bb, 0xb5, 0x6, 0x339, 0xfb, 0x1c2, 0x54, 0x2c, 0x32f, 0x368, 0x76, 0x6f, 0x21f, 0x24, 0x37a, 0x1cb, 0x28e, 0x358, 0x188, 0x3be, 0x14, 0x284, 0x21a, 0x85, 0x1f8, 0xe8, 0x2f0, 0x362, 0x134, 0x162, 0x59, 0xd8, 0x30e, 0xb3, 0x33f, 0x3c2, 0x139, 0x196, 0x78, 0x303, 0x47, 0x31e, 0x19, 0x270, 0x23b, 0x35e, 0x2b1, 0x345, 0x1d6, 0x2d0, 0x236, 0x3aa, 0x290, 0x9e, 0x29f, 0x17d, 0x110, 0x218, 0x192, 0x256, 0x56, 0x13b, 0x81, 0x3d6, 0x3bd, 0x38c, 0xfd, 0x2fb, 0xaf, 0x1ee, 0x37b, 0x344, 0x359, 0x307, 0x269, 0x4b, 0x165, 0x1ef, 0x1f4, 0x293, 0x306, 0xe6, 0x19c, 0x13a, 0x20e, 0x201, 0x3e2, 0x6d, 0x308, 0x38a, 0x3c4, 0x200, 0x16d, 0x1ba, 0x357, 0x6b, 0x31, 0x371, 0x206, 0x117, 0x355, 0x2f8, 0x267, 0x247, 0xef, 0x285, 0x12a, 0x141, 0x123, 0xfc, 0xe8, 0x1e9, 0x193, 0x1b2, 0x20d, 0x332, 0x265, 0x69, 0x24c, 0x37c, 0x1ed, 0x1c6, 0xfd, 0x1ff, 0x2bc, 0x36b, 0x3d5, 0x4a, 0x3dd, 0xe0, 0x143, 0x30d, 0x25f, 0x111, 0x12e, 0x114, 0x6c, 0x30e, 0x166, 0xe7, 0x22f, 0x3b4, 0x2ac, 0x23f, 0x2e0, 0x399, 0x1ec, 0xd1, 0x3a8, 0x307, 0xdb, 0x12c, 0x33a, 0x2cf, 0x2f7, 0x1a1, 0x60, 0x3f1, 0x2b7, 0xf8, 0xbd, 0xa6, 0x261, 0x3c, 0x303, 0x8e, 0x63, 0xc8, 0x341, 0x3f9, 0x21d, 0x266, 0x350, 0x3ba, 0x7d, 0x34d, 0x306, 0x1cc, 0x279, 0x1c2, 0xa8, 0xb0, 0x14e, 0x2e5, 0x2db, 0x3f6, 0x1db, 0x41, 0x4e, 0x388, 0x1af, 0x2b1, 0x283, 0x351, 0x2ad, 0x328, 0x1b5, 0x161, 0x38b, 0x296, 0x347, 0x182, 0x1f1, 0x6d, 0x219, 0x233, 0x21f, 0x48, 0x1f3, 0x243, 0xba, 0x3ca, 0x2d8, 0x22e, 0x14f, 0x3ed, 0x231, 0x62, 0x3be, 0x50, 0x1a, 0x3a9, 0x29, 0x223, 0x29f, 0x1fd, 0x124, 0x329, 0x144, 0xc2, 0x38a, 0x30b, 0x48, 0x3e6, 0x11e, 0x1d9, 0xd7, 0x3a6, 0x3ac, 0x2ad, 0x259, 0x2dd, 0x31a, 0xce, 0x274, 0x54, 0xb0, 0x29c, 0x386, 0x2f5, 0x317, 0x31e, 0x64, 0x341, 0x3fb, 0x66, 0x314, 0x165, 0x3b5, 0x37f, 0x1a1, 0xc0, 0x3df, 0x195, 0x39b, 0x38d, 0x1da, 0x2ac, 0x77, 0x392, 0xf7, 0x2ff, 0x216, 0x3ea, 0xe0, 0x286, 0x2f, 0x2dc, 0x134, 0x181, 0x199, 0x265, 0xd2, 0x122, 0x3d6, 0x2ef, 0xbe, 0x337, 0x247, 0x1de, 0x206, 0x142, 0x3d, 0x21, 0x377, 0xf5, 0x2aa, 0x88, 0x39, 0x8b, 0x242, 0x35a, 0x27c, 0x100, 0x2da, 0x1cb, 0x22a, 0x1e5, 0x2d8, 0x19e, 0xb4, 0x236, 0x2b3, 0x15a, 0x3c1, 0x296, 0x287, 0x201, 0x393, 0x2d9, 0x3b0, 0x1fb, 0x1db, 0x82, 0x138, 0x7f, 0x2c6, 0x55, 0x135, 0x357, 0x358, 0x5b, 0x263, 0x5a, 0x236, 0x16f, 0x161, 0x237, 0x13a, 0x54, 0x160, 0x262, 0xf, 0x303, 0x238, 0x239, 0x26c, 0x359, 0xe, 0x356, 0x30d, 0x16e, 0x134, 0x302, 0x26d, 0x30c, 0x13b, 0x1, 0x55, 0x135, 0x357, 0x358, 0x5b, 0x263, 0x5a, 0x236, 0x16f, 0x161, 0x237, 0x13a, 0x54, 0x160, 0x262, 0xf, 0x303, 0x238, 0x239, 0x26c, 0x359, 0xe, 0x356, 0x30d, 0x16e, 0x134, 0x302, 0x26d, 0x30c, 0x13b, 0x1, 0x55, 0x135, 0x357, 0x358, 0x5b, 0x263, 0x5a, 0x236, 0x16f, 0x161, 0x237, 0x13a, 0x54, 0x160, 0x262, 0xf, 0x303, 0x238, 0x239, 0x26c, 0x359, 0xe, 0x356, 0x30d, 0x16e, 0x134, 0x302, 0x26d, 0x30c, 0x13b, 0x1, 0x55, 0x135, 0x357, 0x358, 0x5b, 0x263, 0x5a, 0x236, 0x16f, 0x161, 0x237, 0x13a, 0x54, 0x160, 0x262, 0xf, 0x303, 0x238, 0x239, 0x26c, 0x359, 0xaa, 0xdd, 0x28e, 0x1e5, 0x372, 0x1d6, 0x153, 0x2ec, 0x306, 0x27b, 0x35f, 0x3e0, 0x38d, 0x361, 0x29a, 0x1ff, 0x1cd, 0x346, 0xa1, 0x7a, 0x108, 0x223, 0x26e, 0x3ef, 0x182, 0x393, 0x376, 0x37e, 0x227, 0xc6, 0x9b, 0x3a8, 0xe, 0x2a5, 0x2f, 0x362, 0x364, 0x98, 0x256, 0x169, 0x13e, 0x200, 0x2fd, 0x11e, 0x36d, 0x16b, 0x6a, 0x3ba, 0x3e8, 0x2d4, 0x180, 0x2c7, 0x2cc, 0x26b, 0x1ed, 0x22b, 0x337, 0x10e, 0x1df, 0xa0, 0xd0, 0x1d5, 0xad, 0x38b, 0x9d, 0x54, 0x2c0, 0x19a, 0x78, 0x5c, 0x399, 0x37b, 0x25, 0x36f, 0x3f, 0x1d0, 0x2af, 0x22, 0x39, 0x22c, 0x61, 0x31d, 0x6e, 0x112, 0x9c, 0xfe, 0x21d, 0x314, 0x19d, 0x32e, 0x24f, 0x228, 0x2c9, 0x69, 0x244, 0x28f, 0x14f, 0x3af, 0x358, 0xb6, 0x19e, 0x2d0, 0x328, 0x1b3, 0xe6, 0x1f6, 0x3e, 0x17a, 0x272, 0x2ac, 0x1dc, 0x15e, 0x1b7, 0x24e, 0x154, 0x374, 0x5d, 0x26f, 0x283, 0x175, 0xfa, 0x16a, 0x180, 0x187, 0x322, 0x37c, 0x2ef, 0x1f9, 0x6b, 0x229, 0xcf, 0x2d0, 0x259, 0x2c5, 0x339, 0x35f, 0x3c9, 0x22f, 0x33e, 0x1fa, 0x397, 0x3bc, 0x28, 0x68, 0x1d5, 0x15a, 0x237, 0xe1, 0x149, 0xa6, 0x251, 0x77, 0xaf, 0x1b7, 0x95, 0x21a, 0x84, 0x223, 0xd5, 0x3a7, 0xb, 0x14e, 0x203, 0x20f, 0x1e4, 0x3b9, 0x25, 0x2d7, 0xfc, 0x29b, 0x2aa, 0x49, 0x25b, 0x6d, 0x1d8, 0x3e5, 0x31e, 0x320, 0x1d4, 0xe, 0x143, 0xbc, 0x326, 0x225, 0x324, 0x8d, 0x1c5, 0x37, 0x112, 0x138, 0x3f8, 0xcc, 0x12c, 0x3cc, 0x222, 0x181, 0xd3, 0x56, 0x321, 0x80, 0x37a, 0x11e, 0x2d3, 0x1a5, 0x350, 0x3de, 0x1e7, 0x45, 0x1b0, 0x230, 0x244, 0x117, 0x135, 0x147, 0x1e5, 0x2ed, 0x351, 0x28a, 0x293, 0x18, 0x3df, 0xb3, 0x331, 0x1ed, 0x5f, 0xc7, 0x62, 0x1cf, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0x159, 0x325, 0x36d, 0x34a, 0x2b6, 0x32e, 0x25c, 0x332, 0x56, 0x9f, 0x12, 0x30f, 0x7f, 0x66, 0x258, 0x25f, 0xd9, 0x130, 0x121, 0x1c5, 0xdc, 0x104, 0x28b, 0x307, 0x2a5, 0x178, 0x106, 0x39, 0x144, 0x76, 0x3e5, 0x63, 0x26c, 0x1f5, 0x21b, 0x349, 0x15d, 0x248, 0x3e2, 0x2e5, 0x385, 0x1e4, 0x2ff, 0x250, 0x85, 0x1c7, 0x26e, 0x347, 0x58, 0x19a, 0x3c0, 0x32d, 0x1b7, 0x254, 0x1e8, 0x148, 0x3c1, 0x274, 0x292, 0x139, 0x2a2, 0x3fe, 0xef, 0x28, 0x1a0, 0x16f, 0x23d, 0x3ec, 0x3e0, 0x57, 0x1c6, 0x337, 0x62, 0x335, 0x2d0, 0x176, 0x3, 0x3eb, 0x166, 0x1be, 0x1d7, 0x3d3, 0x17b, 0x2ed, 0x15f, 0xfa, 0x1a1, 0x36, 0x118, 0x81, 0xaa, 0x2e1, 0x2e8, 0x16b, 0x350, 0x363, 0x24f, 0x164, 0x30c, 0x394, 0x100, 0x3e6, 0x388, 0x30a, 0x4b, 0x3cc, 0x9a, 0x26, 0xa5, 0x2bd, 0x21f, 0x224, 0x1d2, 0x3e7, 0x2b2, 0x8f, 0x35e, 0xc5, 0x27d, 0x222, 0x13, 0xa5, 0x173, 0x6e, 0x104, 0x11f, 0x7, 0x105, 0x3ad, 0x88, 0x25b, 0x368, 0x2f5, 0x79, 0x37b, 0x250, 0x10a, 0x315, 0x354, 0x15, 0x312, 0x251, 0x3b8, 0x39a, 0xa, 0xd0, 0x16f, 0x73, 0x3ab, 0x33f, 0x179, 0xbe, 0x6b, 0x16c, 0x3ac, 0x23a, 0x2d4, 0x36, 0x230, 0x204, 0x159, 0x243, 0x1af, 0x266, 0x33a, 0x111, 0x20d, 0x256, 0x2bd, 0x37, 0x82, 0x28b, 0x207, 0x286, 0x3d2, 0x44, 0x329, 0x1b4, 0x37e, 0x238, 0x3b9, 0x128, 0x85, 0x38e, 0x1aa, 0x20e, 0x189, 0x32c, 0x1dc, 0x1cd, 0x5, 0x68, 0x2b3, 0x23d, 0x3d1, 0x39b, 0x2b8, 0x5f, 0x231, 0xb6, 0x1d6, 0x11d, 0x16a, 0x1b, 0x118, 0x102, 0x2a8, 0x325, 0x2d3, 0x133, 0x19d, 0x28c, 0x302, 0x12b, 0x35a, 0x21f, 0x41, 0x341, 0x307, 0x143, 0x1e9, 0x22, 0x390, 0xda, 0x1bf, 0x11c, 0x3d8, 0x94, 0x16d, 0x23c, 0x2c6, 0x4b, 0x32b, 0x1b2, 0x192, 0x61, 0x378, 0x31e, 0x26c, 0x3dd, 0x1f8, 0x3d4, 0x3ef, 0x2c, 0x334, 0x23f, 0x171, 0x206, 0x68, 0x16f, 0xe6, 0x2b7, 0x1ce, 0x3bd, 0x3ed, 0x2f6, 0x345, 0x3ba, 0x1e7, 0x59, 0x30c, 0x24b, 0x24, 0x4e, 0x3fb, 0x36c, 0x5e, 0x106, 0xe4, 0x6d, 0x1bf, 0x238, 0x37b, 0xa9, 0x21, 0x9e, 0x125, 0x2a0, 0x139, 0x29a, 0x397, 0x3be, 0x5a, 0xbb, 0x6, 0x367, 0x93, 0x28f, 0x1ba, 0x2e8, 0x1a5, 0x165, 0x146, 0x302, 0x256, 0x173, 0xdc, 0x19, 0xea, 0x70, 0xe8, 0x2aa, 0x99, 0x32f, 0xf, 0x170, 0x36b, 0x254, 0x3a9, 0xad, 0x19c, 0x7c, 0x22f, 0x38c, 0x18e, 0x5b, 0x1d6, 0x23a, 0x1a1, 0xd8, 0x1a4, 0x8, 0x37a, 0x1c4, 0x21d, 0x258, 0x16e, 0x18b, 0x8b, 0x308, 0x3f6, 0xc6, 0x344, 0x2d7, 0x3db, 0x29f, 0x347, 0x160, 0x196, 0x1dc, 0x39a, 0x14, 0x2da, 0xe2, 0x21d, 0xb9, 0x1b1, 0x43, 0xa2, 0x1d8, 0x47, 0x3d8, 0x250, 0x21, 0x13c, 0x9d, 0x12d, 0x3b4, 0x3f4, 0x31, 0xcf, 0x2a6, 0xb5, 0x36, 0xd2, 0x8, 0x2fd, 0x319, 0xcc, 0x1c1, 0x193, 0x218, 0x119, 0x2db, 0x238, 0x2ff, 0x2a4, 0x108, 0x1f2, 0xe1, 0x17a, 0x19f, 0x39f, 0x188, 0x271, 0x11d, 0x1a1, 0x1b0, 0x299, 0x40, 0x3c5, 0xfe, 0x269, 0x213, 0x83, 0xe4, 0xda, 0x2f5, 0x1e4, 0x3d5, 0x10d, 0x52, 0x38b, 0x301, 0x3c2, 0xe3, 0xc7, 0x5b, 0x3ac, 0xfa, 0x113, 0x19b, 0xe5, 0x200, 0x217, 0x3f9, 0x36c, 0xbc, 0x11, 0x329, 0x2d9, 0x385, 0x33b, 0x297, 0x7a, 0x290, 0x67, 0x3e, 0x22f, 0x311, 0x231, 0x2d8, 0x15f, 0x3d9, 0x8a, 0xc3, 0x321, 0x24, 0x9c, 0x3f7, 0x356, 0x1e9, 0x88, 0x17e, 0x2e5, 0x17, 0x1ee, 0x95, 0x3d0, 0xad, 0x338, 0x1f0, 0x15c, 0xbe, 0x1ac, 0x2ed, 0x1bd, 0x388, 0xcc, 0x382, 0x245, 0xe4, 0x1b4, 0x3c6, 0x33b, 0x127, 0x1e8, 0xad, 0x279, 0x3c9, 0x2f2, 0x3f2, 0x1e5, 0x21e, 0x3b5, 0x25c, 0x34c, 0x2bd, 0x1b8, 0xc8, 0x17f, 0x7e, 0x3d4, 0x3a7, 0x2c0, 0xab, 0x3fe, 0x2eb, 0x5a, 0x2ec, 0x60, 0x46, 0x204, 0x2da, 0x1c4, 0x66, 0x1c1, 0x326, 0x72, 0xda, 0x1e3, 0x399, 0x297, 0xf4, 0x252, 0x338, 0x3e0, 0x179, 0x1f9, 0x2f6, 0x10f, 0x3de, 0x12e, 0x1a6, 0x35a, 0xdc, 0x64, 0x2bb, 0x3f, 0x1ea, 0x3d7, 0x160, 0x251, 0x1ff, 0x371, 0x2d, 0x176, 0x30, 0x23, 0x102, 0x16d, 0xe2, 0x33, 0x2e4, 0x193, 0x39, 0x6d, 0x2f5, 0x3c8, 0x34f, 0x7a, 0x129, 0x19c, 0x1f0, 0x2b8, 0x2f8, 0x17b, 0x283, 0x1ef, 0x97, 0xd3, 0x1ad, 0x6e, 0x32, 0x359, 0x21b, 0xf5, 0x3ef, 0xb0, 0x32c, 0x2fb, 0x3bc, 0x212, 0xbb, 0x18, 0x215, 0x81, 0x2b2, 0x71, 0x21d, 0x37a, 0x23b, 0x269, 0x5e, 0x22, 0x17e, 0x386, 0x170, 0x36e, 0xd, 0x16f, 0x339, 0xb3, 0x3d6, 0x1ba, 0x36d, 0x18a, 0x32b, 0x18b, 0x51, 0x3b0, 0x238, 0x3ee, 0x21a, 0x290, 0x19c, 0x3e0, 0x2f2, 0x3ed, 0x39d, 0xd4, 0x32e, 0x302, 0x294, 0x6f, 0x31e, 0x344, 0x295, 0x315, 0x125, 0x12d, 0x2cb, 0x337, 0x5b, 0x2ab, 0x3bb, 0x59, 0x56, 0x3c4, 0x82, 0xea, 0x380, 0x27e, 0x3ef, 0x160, 0xab, 0x3f5, 0x3be, 0x2d0, 0x293, 0x1b, 0x1a4, 0x40, 0x30f, 0x3fb, 0x356, 0x3ad, 0x92, 0x32f, 0x78, 0xaf, 0x206, 0x340, 0x366, 0x3eb, 0x93, 0x55, 0x243, 0x2c6, 0x258, 0x362, 0x218, 0x6d, 0x1e3, 0x33b, 0x24e, 0x3a9, 0x161, 0x3d1, 0x1ce, 0x1d7, 0x28e, 0x2b1, 0x165, 0x222, 0x130, 0x61, 0x3f6, 0x239, 0x94, 0x21, 0xf9, 0x1c2, 0x3c2, 0x38c, 0x6b, 0x2ed, 0x3ba, 0x323, 0x26d, 0x1ad, 0xdc, 0xc8, 0x2fe, 0x2fd, 0xfe, 0x36c, 0x1e9, 0x49, 0x32f, 0xf0, 0x2bc, 0x14, 0x65, 0x3, 0x30e, 0x102, 0x1bd, 0x23b, 0xdb, 0x178, 0x110, 0x3cd, 0x3c, 0xaf, 0x5, 0x11b, 0x306, 0x2c7, 0x244, 0x16d, 0x388, 0x330, 0x5e, 0x44, 0x1f1, 0xf, 0x32d, 0x103, 0x340, 0x2c5, 0x3b7, 0x91, 0x159, 0xe2, 0xcc, 0x213, 0x11, 0x17e, 0x305, 0x1c9, 0x346, 0xd0, 0x1b3, 0x3eb, 0x126, 0x154, 0x23c, 0x33, 0x382, 0x106, 0x25b, 0x1c3, 0x170, 0x2d5, 0x34, 0x36a, 0x3fc, 0x24d, 0x55, 0x8f, 0x30a, 0x2e4, 0x245, 0x390, 0x376, 0x5c, 0x1b7, 0xd, 0x2de, 0xff, 0x191, 0x117, 0x325, 0x2c6, 0xb9, 0x193, 0xe4, 0x2d9, 0x17, 0x36b, 0x101, 0x2b3, 0x339, 0x166, 0x343, 0x1cb, 0x2b5, 0x12c, 0x362, 0x39, 0x1b4, 0x303, 0x3dc, 0x142, 0x3aa, 0x1cc, 0x25d, 0x3d6, 0x374, 0x1af, 0x4b, 0x2dc, 0x10c, 0x6d, 0x3c6, 0xf7, 0x254, 0x1f3, 0x3f8, 0x356, 0x2af, 0x132, 0x262, 0xee, 0x1de, 0x5a, 0x34d, 0x36, 0x13b, 0x12, 0xe9, 0xe, 0x3a0, 0x3fd, 0x160, 0x2ac, 0x327, 0x263, 0x11d, 0x226, 0x30c, 0x1e2, 0x104, 0x359, 0xfc, 0x137, 0x54, 0xed, 0x3cb, 0x5b, 0x2be, 0x3ce, 0x26d, 0x2bd, 0x1db, 0x26c, 0x34e, 0x223, 0x13a, 0x1e1, 0x311, 0x358, 0x10f, 0x2cf, 0x302, 0x242, 0x2f9, 0x239, 0x250, 0x210, 0x237, 0x1f0, 0x1ed, 0x357, 0x35c, 0x2ca, 0x134, 0x241, 0xec, 0x238, 0x3a3, 0x1e8, 0x161, 0x35f, 0xdf, 0x135, 0x3b2, 0x314, 0x16e, 0x10c, 0xda, 0x303, 0x3b1, 0x101, 0x16f, 0xff, 0x322, 0x55, 0x11e, 0x33, 0x30d, 0x11, 0x2fc, 0xf, 0x253, 0x5, 0x236, 0x3, 0x215, 0x1, 0x1f3, 0x3f8, 0x356, 0x2af, 0x132, 0x262, 0xee, 0x1de, 0x5a, 0x34d, 0x36, 0x13b, 0x12, 0xe9, 0xe, 0x3a0, 0x3fd, 0x160, 0x2ac, 0x327, 0x263, 0x3e6, 0x3fb, 0x286, 0x2aa, 0x201, 0x196, 0x3f5, 0x1cf, 0x145, 0x113, 0x30c, 0x3c4, 0x19, 0x2fe, 0x3db, 0x2a1, 0x12d, 0x275, 0x6b, 0x345, 0x363, 0x302, 0x8d, 0x3f6, 0x1ec, 0x141, 0x290, 0xfb, 0x1ce, 0x2a3, 0x2e8, 0x18a, 0x16e, 0x218, 0x368, 0x2e, 0x36e, 0x68, 0x366, 0x367, 0x81, 0x37a, 0x1fc, 0x356, 0x157, 0xc1, 0x334, 0x2fb, 0x3be, 0x2ad, 0x1a1, 0x265, 0x27c, 0x82, 0x359, 0x1f8, 0xd5, 0x2a0, 0x2cb, 0x18e, 0x2ed, 0x1ef, 0x162, 0x294, 0x378, 0x239, 0xa9, 0x52, 0x19c, 0x33f, 0x1d7, 0x5d, 0x133, 0x32b, 0x43, 0x6d, 0x303, 0x36b, 0xd, 0x36a, 0x3eb, 0x91, 0x16d, 0x23b, 0x36c, 0x3ad, 0x99, 0x262, 0x1dc, 0x371, 0x2d0, 0xb5, 0x2c9, 0x24b, 0x112, 0xea, 0x3f, 0x29f, 0x54, 0x1da, 0x337, 0x2d8, 0x3ba, 0x12e, 0x256, 0x6f, 0xc6, 0x94, 0x108, 0x237, 0x3e0, 0x3bd, 0x28e, 0x1a5, 0x3c5, 0x3f7, 0x1d, 0x2fa, 0xb0, 0x151, 0x10e, 0xeb, 0x3bb, 0x199, 0x2bd, 0x365, 0x281, 0x214, 0x3c1, 0xf8, 0x3da, 0x28e, 0x34a, 0x391, 0x43, 0xda, 0x17, 0x36e, 0xd0, 0x183, 0x30e, 0x2, 0x383, 0x3e7, 0x3a, 0x1fd, 0x160, 0x2a2, 0x21c, 0x1d6, 0x37f, 0x332, 0x173, 0x2c3, 0x10b, 0x21, 0x38b, 0x1f0, 0x3bd, 0x115, 0x29d, 0x32b, 0x86, 0x1b4, 0x2e, 0x2d5, 0x1a0, 0x306, 0x215, 0x4, 0x30f, 0x3c7, 0x74, 0x3fa, 0x2c0, 0x14d, 0x31, 0x3ac, 0x2f7, 0x26d, 0x2e6, 0x18f, 0x216, 0x42, 0x31f, 0x3e0, 0x373, 0x22a, 0x133, 0x25f, 0x10c, 0x368, 0x5c, 0x1a3, 0x340, 0x205, 0x23, 0x8, 0x217, 0x387, 0xe8, 0x3fd, 0x189, 0x29a, 0x62, 0x351, 0x1e7, 0xd3, 0x1c5, 0x31e, 0x25, 0x84, 0x237, 0x3c9, 0x2ef, 0x5d, 0x266, 0xb7, 0x218, 0x2d9, 0xb8, 0x346, 0x289, 0x3, 0x46, 0x10, 0x27, 0x307, 0x383, 0x3c7, 0xe8, 0x3f3, 0x22d, 0xfd, 0x229, 0x2ea, 0x12e, 0x14a, 0x2f9, 0x1ec, 0x10d, 0x15a, 0x2b7, 0x1eb, 0x396, 0x21d, 0x2f, 0x220, 0x14e, 0xee, 0x2eb, 0x2ad, 0x28d, 0x211, 0x21f, 0x320, 0x1a7, 0x9e, 0x301, 0x2b8, 0x357, 0x2d6, 0x3cc, 0x43, 0x1b4, 0x5c, 0x346, 0x11b, 0xc, 0x230, 0x100, 0xe9, 0x70, 0x1ea, 0x15, 0x1da, 0xc7, 0x1d3, 0x363, 0x13, 0xc2, 0x47, 0x3a3, 0x35b, 0xe6, 0x2cc, 0xaa, 0x1c4, 0x1b6, 0x353, 0xc1, 0xcb, 0x3e3, 0x263, 0xfa, 0xb2, 0x1ad, 0x3b6, 0x281, 0x21, 0x31f, 0x3c9, 0x1d7, 0x174, 0x314, 0x362, 0x390, 0x305, 0xaf, 0x50, 0x176, 0x1b, 0xe5, 0x240, 0xea, 0xfc, 0x1aa, 0x12d, 0x1c6, 0x2b9, 0xd4, 0x111, 0x324, 0x3b0, 0x399, 0xa1, 0x16f, 0x3f1, 0x122, 0x37a, 0x3f9, 0x105, 0x17d, 0xb0, 0x2a2, 0x31, 0x351, 0x3ce, 0x34c, 0x233, 0x18c, 0xa9, 0x30f, 0x307, 0x349, 0x347, 0x139, 0x337, 0x2ed, 0x363, 0x26, 0x308, 0x238, 0x24e, 0x3aa, 0x1fe, 0x91, 0x37a, 0x3fb, 0x1d, 0x3fa, 0x312, 0xfd, 0x5b, 0x3ba, 0x162, 0x8d, 0x38f, 0x3ee, 0x3a9, 0xe6, 0x191, 0x2a8, 0x23b, 0x356, 0x2aa, 0x2c, 0x151, 0x31, 0x2ab, 0x323, 0x256, 0x378, 0x1ec, 0x21a, 0x161, 0x195, 0x28f, 0x23c, 0x269, 0x3ad, 0xc1, 0x196, 0x397, 0x33c, 0x3bb, 0x26d, 0x38a, 0xc6, 0xa9, 0x290, 0x3d1, 0x37c, 0x1cb, 0x21d, 0x5e, 0x92, 0x262, 0x2fb, 0x1cf, 0x23a, 0x59, 0x1ad, 0x365, 0x216, 0x108, 0x19c, 0x1ce, 0x135, 0x35e, 0x2e4, 0x22, 0x32f, 0x23f, 0x371, 0x2ad, 0x113, 0x56, 0xdc, 0x26c, 0x85, 0x3c1, 0x3e0, 0x1d7, 0x2e8, 0x4b, 0x326, 0x17e, 0x78, 0x39a, 0x5a, 0xb5, 0x265, 0x3c4, 0xc8, 0x2d7, 0x9e, 0x20b, 0x2f2, 0x28e, 0x133, 0x16e, 0xe4, 0x386, 0xaf, 0xa0, 0x217, 0x7, 0x27e, 0x15, 0x361, 0x6b, 0x35, 0x111, 0x8b, 0x37e, 0x3b1, 0x68, 0x205, 0x118, 0x200, 0x341, 0x21b, 0xd5, 0x25a, 0x22b, 0x39d, 0x2ca, 0x2c1, 0x6d, 0x5c, 0x103, 0x194, 0x300, 0xe5, 0x112, 0x2bb, 0x377, 0x13a, 0x57, 0x3af, 0x1a5, 0x25f, 0x72, 0x386, 0x15e, 0x280, 0x293, 0x19b, 0x1e2, 0xc8, 0x1a7, 0x278, 0x7c, 0x373, 0x174, 0x4b, 0x245, 0x1f1, 0x3c0, 0x1de, 0x352, 0x113, 0xac, 0x370, 0x344, 0x42, 0xce, 0x1ce, 0x26a, 0x163, 0x30d, 0x220, 0x131, 0x2fb, 0x39e, 0xfa, 0x2c8, 0x2e6, 0x63, 0xa9, 0x129, 0x35f, 0x3d6, 0x8f, 0x330, 0x3ad, 0x182, 0x251, 0x87, 0x3ac, 0x395, 0x256, 0x2f9, 0x3b9, 0xf4, 0x23d, 0x2cc, 0x2a8, 0x7f, 0x143, 0x17d, 0x2c0, 0x27a, 0x5b, 0x37d, 0x181, 0x61, 0x8e, 0x127, 0x3aa, 0x3fc, 0x244, 0x3e6, 0x3c7, 0x3a0, 0x347, 0x272, 0xc7, 0x345, 0x27, 0x1c, 0x3d4, 0x150, 0xe3, 0x2f6, 0x2b6, 0x364, 0x6d, 0xb8, 0x5, 0xbb, 0x6c, 0x9f, 0x19, 0x36f, 0x13c, 0x7c, 0x2ef, 0x1d9, 0x258, 0x11, 0x257, 0x1dc, 0x2e3, 0x7d, 0x2c8, 0x1c5, 0x18c, 0x141, 0x2b4, 0x32a, 0x55, 0x319, 0x2a5, 0x17d, 0x189, 0x1fa, 0x2d8, 0x3b5, 0x4c, 0x76, 0x399, 0x101, 0x366, 0x23, 0x80, 0x3a4, 0x21b, 0x1aa, 0x17a, 0x17c, 0x1ae, 0x1e6, 0x10c, 0x2e5, 0xaf, 0x280, 0x12f, 0x265, 0x30b, 0x9b, 0x85, 0x31f, 0x277, 0x135, 0x163, 0x213, 0x92, 0x19a, 0x3e3, 0x33c, 0x2f7, 0x291, 0x378, 0x3b9, 0x1e8, 0xe6, 0x24d, 0x2da, 0x3fb, 0x74, 0x3d7, 0x139, 0xc7, 0x283, 0x146, 0x241, 0x37e, 0x36b, 0x1a0, 0xc, 0x1a4, 0x90, 0x1d4, 0x3db, 0x9d, 0x57, 0x357, 0x29d, 0x2dc, 0x329, 0x3c, 0x33d, 0x2d0, 0x28d, 0xac, 0x2e9, 0x10b, 0x210, 0xfb, 0x1be, 0x396, 0xcc, 0x4e, 0x70, 0x29f, 0x12d, 0x5f, 0xd7, 0x1e6, 0x218, 0x386, 0x171, 0x5a, 0x1a1, 0x56, 0x2e9, 0x216, 0x52, 0x3d1, 0x3d6, 0x23c, 0x36c, 0x2aa, 0x160, 0xfd, 0x2d8, 0x363, 0x130, 0x3b0, 0x1ee, 0x68, 0x6, 0x1a4, 0x120, 0x359, 0x2e7, 0x1c2, 0x2f2, 0x5d, 0x4b, 0x106, 0x32f, 0x1dc, 0x1cf, 0x1f4, 0x26d, 0x6f, 0x1ec, 0xf4, 0xe6, 0x93, 0x37a, 0x3e7, 0x349, 0x20e, 0x2cb, 0x358, 0x2a9, 0x1b2, 0x6d, 0x170, 0x14, 0x1d1, 0x2c9, 0x3c4, 0x249, 0x85, 0x237, 0x1ce, 0x1ba, 0x21d, 0x2f0, 0xc1, 0xab, 0x31, 0x175, 0x162, 0x61, 0x238, 0x254, 0x36a, 0x30e, 0x40, 0x3a4, 0x3f, 0x2a1, 0x3c2, 0x3ed, 0x1a5, 0x16e, 0x329, 0x78, 0xef, 0x2ad, 0x8a, 0x1ad, 0x31e, 0xa9, 0xad, 0x195, 0x55, 0x23b, 0x286, 0x3fa, 0xa6, 0x337, 0x345, 0x146, 0x8b, 0x1e3, 0x36e, 0x236, 0x180, 0x1ca, 0x82, 0x3dd, 0x9c, 0x1c0, 0xd5, 0x2f4, 0x3f2, 0x1a5, 0x2dc, 0xbf, 0x3c0, 0x2eb, 0x11d, 0x2c8, 0x31d, 0xf6, 0xf4, 0x1cc, 0x24c, 0x3e6, 0x207, 0x1ea, 0x2a0, 0x311, 0x26f, 0x1e6, 0x39, 0x203, 0x39a, 0x1a9, 0x45, 0x1ad, 0x235, 0x2a4, 0x161, 0x166, 0x2b2, 0x3fb, 0x1d0, 0x107, 0x2cb, 0x2b9, 0x2b6, 0x18b, 0x2d9, 0x253, 0x109, 0x16a, 0x2b, 0x2e9, 0x25, 0x148, 0x2b7, 0x117, 0x319, 0x286, 0x3fd, 0x298, 0x18e, 0x35, 0x9a, 0x288, 0x5c, 0xa, 0x1d1, 0x19b, 0x30b, 0x26c, 0x42, 0x279, 0x37c, 0x8f, 0x1b6, 0x2aa, 0x2c0, 0x3f4, 0x2ed, 0x255, 0x241, 0x1e3, 0x2d5, 0xca, 0x1b, 0x9f, 0x64, 0x295, 0x38b, 0xe7, 0x1ba, 0x33, 0x3d2, 0x201, 0x2a2, 0x229, 0x1ef, 0x4c, 0x1d8, 0x1ee, 0xd0, 0x18, 0x13b, 0x224, 0x3ea, 0x9e, 0xf8, 0x355, 0x35e, 0x213, 0x248, 0x196, 0x10e, 0x2be, 0x162, 0xc2, 0xf2, 0x284, 0x138, 0x309, 0x2a1, 0x313, 0x2a7, 0x18a, 0x83, 0x257, 0x2fb, 0x19e, 0x3ce, 0x294, 0x227, 0x95, 0x36a, 0x23, 0x9, 0xea, 0x377, 0x384, 0x3bd, 0x3b2, 0x1c1, 0x92, 0xcb, 0x10e, 0x175, 0x181, 0x219, 0x33b, 0x34, 0xc, 0x13b, 0x41, 0x3b3, 0xf9, 0x39b, 0x26a, 0x21d, 0x3d2, 0xb, 0x29a, 0x16c, 0x2cf, 0x192, 0x2f5, 0x2d5, 0x194, 0x6c, 0xf1, 0x249, 0x214, 0x338, 0x37c, 0x11e, 0x2d1, 0x17d, 0x53, 0x267, 0x21e, 0x9a, 0x119, 0x170, 0x50, 0x12f, 0x30c, 0x370, 0x25, 0x290, 0x2ce, 0xaa, 0x1fc, 0x74, 0x287, 0x2cb, 0x17b, 0x2ca, 0x43, 0x1c3, 0x2e2, 0x2d0, 0x45, 0x35a, 0xc6, 0x10d, 0x23d, 0x93, 0x1f3, 0x207, 0x3d4, 0x292, 0xbe, 0x2b1, 0xb7, 0x25b, 0x3c0, 0x1df, 0x7d, 0x26d, 0x1bc, 0x2ff, 0x177, 0x3f1, 0x2, 0x270, 0x21b, 0x14b, 0x22f, 0x147, 0x314, 0x106, 0xa7, 0x1ff, 0x33c, 0x270, 0x3f, 0x125, 0x15c, 0x5d, 0x258, 0x110, 0x334, 0x87, 0x175, 0x302, 0x76, 0x1ee, 0x340, 0x180, 0x24b, 0xc8, 0x85, 0x19c, 0x37c, 0x23c, 0x356, 0x3fa, 0x139, 0x6b, 0x2a9, 0x18b, 0x376, 0x171, 0x2d0, 0x8a, 0x173, 0x239, 0xf4, 0x339, 0x81, 0x4e, 0x380, 0x2a1, 0x22f, 0x28e, 0x4b, 0x22, 0x262, 0x397, 0x2ab, 0x162, 0x308, 0x33b, 0x68, 0x30, 0x1ca, 0x19, 0x295, 0x237, 0x26b, 0x243, 0x36c, 0x17d, 0xa6, 0x18e, 0xd4, 0x1b2, 0x368, 0xaf, 0x5a, 0x113, 0x1ad, 0xc6, 0x21a, 0xe6, 0x91, 0x30f, 0x70, 0xd5, 0x3c2, 0x357, 0x18a, 0x106, 0x14e, 0x3f5, 0x1d6, 0x12e, 0x61, 0x1e4, 0xd, 0x6, 0x13b, 0x82, 0x2d7, 0x3c1, 0x1ce, 0x1cb, 0x269, 0x2aa, 0x312, 0x337, 0x21e, 0x134, 0x6d, 0x392, 0x109, 0x1a1, 0x2b0, 0x31e, 0x141, 0x31a, 0x93, 0x3e6, 0xe, 0x29f, 0x17a, 0x3ed, 0x133, 0xe9, 0xfc, 0x13a, 0x1ed, 0x3b2, 0x30d, 0x132, 0x2ac, 0x5b, 0x2cf, 0x241, 0x303, 0x5, 0x34d, 0x30c, 0x1db, 0x250, 0x161, 0x322, 0x1f3, 0xe, 0x137, 0x1e1, 0x357, 0x314, 0x11, 0x262, 0x327, 0x2be, 0x302, 0xec, 0x3b1, 0x236, 0x36, 0x1e2, 0x26c, 0x210, 0x35f, 0x55, 0x3f8, 0x3a0, 0x54, 0x311, 0x35c, 0x16e, 0x2fc, 0xee, 0x263, 0x3ce, 0x242, 0x238, 0x101, 0x3, 0x13b, 0x104, 0x34e, 0x237, 0xdf, 0x11e, 0x356, 0x3fd, 0xed, 0x358, 0x2ca, 0x10c, 0xf, 0x1de, 0x11d, 0x26d, 0x2f9, 0x3a3, 0x16f, 0x215, 0x12, 0x359, 0x223, 0x1f0, 0x135, 0x33, 0x2af, 0x160, 0x3cb, 0x10f, 0x134, 0xda, 0x253, 0x5a, 0x226, 0x2bd, 0x239, 0x1e8, 0xff, 0x1, 0xe9, 0xfc, 0x13a, 0x1ed, 0x3b2, 0x30d, 0x132, 0x2ac, 0x5b, 0x2cf, 0x241, 0x303, 0x5, 0x34d, 0x30c, 0x1db, 0x250, 0x161, 0x322, 0x1f3, 0xe, 0x1d2, 0x3f0, 0x1c2, 0x2ef, 0x2b5, 0x2f0, 0x16, 0x1fa, 0x345, 0x9a, 0xda, 0xaf, 0x168, 0x114, 0x38a, 0x3b9, 0x2ee, 0x367, 0x100, 0x1d4, 0x315, 0x1f0, 0x26a, 0xcc, 0x155, 0x22d, 0x18e, 0x350, 0x316, 0x386, 0x273, 0x28a, 0x26d, 0x1fb, 0x297, 0x36a, 0x118, 0x240, 0x3dd, 0x3e4, 0x39c, 0x243, 0x1ab, 0x3fd, 0x1da, 0x17b, 0x27d, 0xe4, 0x1e0, 0x375, 0x3bb, 0x14a, 0x8e, 0x284, 0x3, 0x276, 0x19, 0x246, 0x338, 0x3d6, 0x319, 0x3a, 0x20e, 0x1c6, 0x1ae, 0x16e, 0x1f1, 0x3b8, 0x33c, 0x97, 0xc2, 0x33b, 0x1a0, 0x300, 0x27c, 0x136, 0x210, 0x2b7, 0x154, 0x3ff, 0x27e, 0x292, 0x1f9, 0x133, 0x83, 0x29c, 0x397, 0x2be, 0x20d, 0x3b0, 0x1b7, 0x328, 0x2c9, 0x6e, 0x25, 0xad, 0x2cc, 0x2fd, 0xe, 0x26e, 0x38d, 0x28e, 0x12c, 0x220, 0x196, 0xc4, 0x3de, 0x192, 0x385, 0x5, 0x293, 0x2b, 0x2c3, 0x141, 0x3a4, 0x3db, 0x20b, 0x2a3, 0x21d, 0x157, 0x312, 0x18e, 0x2a9, 0x43, 0xf, 0x371, 0x1f4, 0x256, 0x47, 0x284, 0x6, 0x1ca, 0xc8, 0x21, 0x3d1, 0x55, 0x3fb, 0x27e, 0x12d, 0x3ed, 0x18a, 0x22, 0x334, 0x31, 0x1ef, 0x192, 0x303, 0x14, 0xb5, 0x2b0, 0xc6, 0xf4, 0x1fe, 0x8, 0x11f, 0x2e7, 0x7c, 0x135, 0xcc, 0x2aa, 0xa6, 0x6b, 0x165, 0x218, 0x78, 0x3be, 0x3bb, 0x294, 0x238, 0xd, 0x30, 0x24b, 0x249, 0x108, 0x2b7, 0x2a8, 0x3e7, 0x3d4, 0x17a, 0x357, 0x4b, 0x110, 0x196, 0x188, 0x363, 0x8b, 0x2e, 0xa0, 0x1a1, 0x1ad, 0x239, 0x3a9, 0x3eb, 0x40, 0xea, 0x315, 0x3e0, 0x1ba, 0x269, 0x17d, 0x139, 0x358, 0x33a, 0xe4, 0x3c0, 0x1cf, 0x1e7, 0x8d, 0x1e4, 0x68, 0x180, 0x27c, 0x26c, 0x52, 0x195, 0x16d, 0x307, 0x29f, 0x3c2, 0x28e, 0x258, 0x92, 0xab, 0x5b, 0x32e, 0x51, 0x170, 0x109, 0x341, 0x377, 0x7c, 0x26a, 0x330, 0x17d, 0x272, 0x17b, 0x1e6, 0x25b, 0xee, 0x33c, 0x25c, 0x3b, 0x36b, 0x328, 0x336, 0x2e9, 0x152, 0x73, 0x81, 0xe9, 0x3e9, 0x20b, 0x14f, 0x66, 0x2aa, 0x14c, 0x1ac, 0x33a, 0x1c8, 0x31b, 0x263, 0x24f, 0x184, 0x1ee, 0x65, 0x360, 0xdc, 0x128, 0x18d, 0x91, 0x9c, 0xfc, 0x1c2, 0x3ae, 0x30a, 0x157, 0x22d, 0x231, 0x165, 0x39, 0x1e0, 0x1cf, 0x3ce, 0x234, 0x33b, 0x289, 0x6c, 0x21f, 0x25, 0x2b4, 0x93, 0x217, 0x21b, 0x13a, 0x373, 0x163, 0x3ad, 0x2c0, 0xc7, 0x2a9, 0x86, 0x3c, 0x3be, 0x37f, 0x242, 0x1e4, 0xd0, 0x209, 0x3c4, 0x281, 0x252, 0x191, 0x3c5, 0x1c0, 0x125, 0x1ed, 0x1af, 0x2f0, 0x58, 0x39f, 0xd4, 0x316, 0x203, 0x371, 0x3e8, 0x14a, 0x238, 0x1a, 0xc0, 0x27c, 0xd1, 0x148, 0xb3, 0x2fd, 0x38, 0x2a1, 0x2b8, 0x3b2, 0x5e, 0xb, 0x3f4, 0x21e, 0x28b, 0x1c7, 0x3e0, 0x2e1, 0x2d1, 0x3ef, 0x33e, 0x1ae, 0x362, 0xa7, 0x327, 0x3ba, 0xc9, 0x20f, 0xa0, 0x28d, 0x2e6, 0x37b, 0x2b3, 0x8c, 0x112, 0x34e, 0x338, 0x28f, 0x3f9, 0xf5, 0x17a, 0x147, 0xb9, 0x99, 0x14d, 0x1d3, 0x134, 0x1bb, 0x33d, 0x23a, 0x12b, 0x8e, 0xd, 0xc0, 0xf1, 0x344, 0x252, 0x322, 0x30f, 0x21b, 0x274, 0x1d7, 0x30a, 0x2ae, 0xa6, 0x1ac, 0x27d, 0x329, 0xee, 0x271, 0x162, 0x1d8, 0x2d5, 0x1d1, 0x2b, 0x235, 0xf4, 0x3f1, 0x80, 0x359, 0x278, 0x39c, 0x23c, 0x20a, 0x15, 0x5f, 0x29d, 0x20c, 0x334, 0xc4, 0x2cf, 0x51, 0x1c9, 0xb4, 0x59, 0x1bc, 0x297, 0x366, 0x299, 0x32, 0x21, 0x35f, 0x159, 0x307, 0x26e, 0x57, 0x2e8, 0x2f, 0xb, 0x3e1, 0x6a, 0x316, 0xf, 0x1df, 0x37f, 0x8d, 0x399, 0x289, 0xd8, 0x6e, 0x128, 0x31a, 0x244, 0xe9, 0x3db, 0x3e, 0x26a, 0x269, 0x11f, 0x315, 0x33f, 0x243, 0x286, 0x20e, 0x5f, 0x133, 0x22, 0x196, 0x5b, 0x146, 0x6d, 0x171, 0x145, 0x34c, 0x47, 0xd, 0x180, 0x3c4, 0x216, 0x161, 0x91, 0x270, 0x3db, 0x7c, 0x1ba, 0x36c, 0x3ef, 0x275, 0x2b1, 0x326, 0x262, 0x31, 0x363, 0x51, 0x392, 0x2d0, 0x2c8, 0x3f6, 0x254, 0x6, 0x24b, 0x26c, 0x290, 0x191, 0x30f, 0x3f, 0x1c2, 0x2a3, 0xcc, 0x17d, 0x1da, 0x39d, 0x16e, 0x32f, 0x397, 0x3ba, 0x192, 0x2e, 0x109, 0x8a, 0x6f, 0x34f, 0x366, 0x13b, 0xc8, 0x108, 0x195, 0x37a, 0x70, 0x125, 0x3bd, 0x2c6, 0x157, 0xa6, 0x358, 0x1e6, 0x17e, 0x2fb, 0x2ab, 0x26, 0x1e3, 0x14, 0x1a1, 0x173, 0x37b, 0x16f, 0x230, 0x82, 0x85, 0x3d1, 0x2a8, 0x307, 0xd5, 0x15c, 0x36d, 0x2f0, 0x160, 0x18e, 0x165, 0xe4, 0x23f, 0x33c, 0x162, 0x3b0, 0x346, 0x293, 0x2b0, 0x239, 0x177, 0x30e, 0x120, 0x2d7, 0x23e, 0x4f, 0x1ce, 0x71, 0x74, 0x2a0, 0x3d3, 0x12c, 0x99, 0x13d, 0x10f, 0x18b, 0x1e, 0x2e3, 0x323, 0x219, 0x1b7, 0x1d1, 0xac, 0x318, 0x177, 0x215, 0x89, 0x295, 0x1f6, 0x154, 0x307, 0x1aa, 0x179, 0x35e, 0x353, 0x53, 0x358, 0x3cc, 0x1f1, 0x3f5, 0x2ea, 0xc9, 0x2e, 0x212, 0x228, 0x378, 0x95, 0x3, 0x24b, 0xd1, 0x252, 0x93, 0x9c, 0x3e9, 0x7c, 0x374, 0x1ab, 0x347, 0x311, 0x29d, 0x22, 0x32c, 0x16c, 0x222, 0x2d9, 0x273, 0x1f4, 0x121, 0x399, 0x236, 0x19b, 0x3b6, 0x21a, 0x3fc, 0x100, 0x2fe, 0x38b, 0x1eb, 0x1fc, 0xf5, 0x1e1, 0x5d, 0x213, 0x16, 0x337, 0x15b, 0x72, 0x23f, 0x271, 0x181, 0x1bf, 0x5, 0x2d4, 0x173, 0x2ff, 0x1b5, 0x1a4, 0x32, 0x84, 0x195, 0x2fd, 0x1c0, 0x13a, 0x3ae, 0x66, 0x17d, 0x3b4, 0x26f, 0x362, 0x29c, 0x21c, 0x363, 0xa2, 0x253, 0x2ad, 0xd3, 0x227, 0xd, 0x75, 0x13c, 0x26b, 0x319, 0x29b, 0x17a, 0x22a, 0x213, 0x2c, 0xc7, 0x2ca, 0x329, 0x379, 0x15f, 0x130, 0x17, 0x212, 0x59, 0x1fb, 0xa1, 0x30, 0x1e2, 0x25, 0x31a, 0x204, 0x23e, 0x9e, 0x331, 0x388, 0x349, 0xbd, 0x115, 0x30d, 0x16, 0x267, 0x165, 0x390, 0x3b8, 0x2ab, 0x98, 0x20f, 0x109, 0x228, 0x2f9, 0x254, 0x18, 0xf1, 0x216, 0x18d, 0x102, 0x11f, 0x4f, 0x39c, 0x1c4, 0x3a0, 0x25a, 0x28e, 0x382, 0xb, 0x337, 0x2b6, 0x1c8, 0x1dc, 0x351, 0x4c, 0x303, 0x280, 0x114, 0x378, 0x12a, 0xc, 0x27c, 0x10b, 0x2c2, 0x81, 0x28b, 0x223, 0x1ce, 0xe2, 0x1d0, 0x12d, 0x147, 0x1c1, 0x201, 0x39f, 0x15b, 0xe4, 0xee, 0x3ac, 0x26, 0x385, 0x140, 0x8a, 0x1bc, 0x95, 0x6, 0x13e, 0x281, 0x161, 0x244, 0x341, 0x315, 0xe7, 0x71, 0xe8, 0x292, 0x2a7, 0x2e4, 0x304, 0x3cb, 0x2a9, 0x72, 0x77, 0x1d6, 0xea, 0xf9, 0x37c, 0x1fc, 0x3d4, 0x22f, 0x36d, 0x3ad, 0xa6, 0x2f6, 0x16e, 0x14e, 0x31, 0x32e, 0x6d, 0x39a, 0x1f4, 0x8d, 0x1ee, 0xbb, 0x56, 0x239, 0x3aa, 0x230, 0x19, 0x108, 0xb3, 0x30f, 0x1f8, 0x7c, 0x1cb, 0x286, 0x54, 0x3ed, 0x258, 0xc1, 0x3e1, 0x2a9, 0xe4, 0x1dc, 0x2ab, 0x130, 0x2e, 0x5a, 0x2c8, 0x38f, 0xd, 0x1b, 0xdc, 0x141, 0x1fe, 0x200, 0x3dd, 0x19c, 0x55, 0x307, 0x2a1, 0x3bd, 0x21d, 0x17d, 0x2cb, 0x2b1, 0x106, 0x196, 0x2d8, 0x134, 0x386, 0x3be, 0x323, 0x76, 0x346, 0xb5, 0x173, 0x3ee, 0x366, 0x1ca, 0x26c, 0xad, 0x91, 0x3a4, 0x315, 0x1ce, 0x1c4, 0x349, 0x17a, 0x5d, 0x5e, 0x160, 0x6b, 0x1e6, 0x3e2, 0x397, 0x1ef, 0x51, 0xaf, 0x145, 0x256, 0x1e4, 0x236, 0x265, 0x31e, 0x3a9, 0x30e, 0x112, 0x85, 0x2b7, 0x37a, 0x380, 0x1c2, 0x135, 0x36c, 0x347, 0x5f, 0x18a, 0x1d4, 0x3e4, 0x3d6, 0x3ff, 0x26e, 0x2f2, 0x185, 0x2ba, 0x2cb, 0x16b, 0x11, 0xab, 0x1d3, 0x2c1, 0x78, 0xcf, 0x181, 0x1e3, 0x140, 0x228, 0x3f6, 0x101, 0x209, 0xdc, 0x282, 0x3f1, 0x24, 0x1a7, 0x3ec, 0x16d, 0xe0, 0xe1, 0x135, 0x2d1, 0x107, 0x2f8, 0x96, 0x264, 0x3e1, 0x15b, 0x390, 0x2fb, 0x2ea, 0x241, 0x392, 0x153, 0x12b, 0x1e4, 0x65, 0x186, 0xc6, 0x2ee, 0x118, 0x19, 0x210, 0x2cc, 0x4e, 0x3bf, 0x39b, 0x23c, 0x1d0, 0xbd, 0x5d, 0xbc, 0x189, 0x358, 0x25f, 0xa7, 0x31, 0x255, 0x1b4, 0xef, 0x37f, 0x184, 0x36e, 0x12f, 0x2bd, 0x3ee, 0x2c5, 0x321, 0x344, 0x2c2, 0x204, 0xea, 0x1f2, 0x1eb, 0x3fb, 0x137, 0x179, 0x2c6, 0x15d, 0x361, 0x2b1, 0x20c, 0x251, 0x2ed, 0x364, 0x3c, 0x263, 0x2c4, 0x2f5, 0xa0, 0x114, 0x1fb, 0x284, 0x300, 0x6e, 0x141, 0x3fc, 0x12, 0x2d7, 0x1f6, 0x2b2, 0x70, 0x3a8, 0x38b, 0x28f, 0x387, 0x14b, 0x1d7, 0x330, 0x3d7, 0x5f, 0x221, 0x132, 0x3e1, 0x2b6, 0x25b, 0x3f5, 0x2f3, 0xa2, 0x171, 0xfa, 0x11a, 0x36b, 0x34d, 0x35a, 0x3ee, 0x183, 0x9f, 0x216, 0x73, 0x10, 0x2fe, 0xce, 0xaa, 0xe, 0x9d, 0x14f, 0x36c, 0x107, 0x1f9, 0x258, 0x304, 0x267, 0x33a, 0x1f1, 0x327, 0x363, 0x232, 0x33d, 0x3bb, 0x184, 0x2d5, 0xb5, 0x1c5, 0x297, 0x6, 0x1e2, 0x128, 0x339, 0x100, 0x3b3, 0xfb, 0x2b2, 0xe0, 0x1c2, 0xdd, 0x2a5, 0x54, 0x3af, 0x1c1, 0x2c, 0x231, 0x3cc, 0x32f, 0x21c, 0x255, 0x368, 0x3bc, 0x3ce, 0x76, 0x103, 0x342, 0x6f, 0x12a, 0x60, 0x21f, 0x2a4, 0x3fc, 0x24, 0x34e, 0x3ab, 0x37a, 0x21b, 0x1f, 0x1cb, 0x20a, 0x149, 0x28e, 0x2f, 0x2c0, 0x358, 0xb7, 0x29c, 0x188, 0x111, 0x2e5, 0x3be, 0x97, 0x369, 0x14, 0x45, 0x2f9, 0x284, 0x209, 0x1b8, 0x21a, 0x359, 0x237, 0x55, 0xe, 0x13a, 0x135, 0x356, 0x54, 0x357, 0x30d, 0x160, 0x358, 0x16e, 0x262, 0x5b, 0x134, 0xf, 0x263, 0x302, 0x303, 0x5a, 0x26d, 0x238, 0x236, 0x30c, 0x239, 0x16f, 0x13b, 0x26c, 0x161, 0x1, 0x359, 0x237, 0x55, 0xe, 0x13a, 0x135, 0x356, 0x54, 0x357, 0x30d, 0x160, 0x358, 0x16e, 0x262, 0x5b, 0x134, 0xf, 0x263, 0x302, 0x303, 0x5a, 0x26d, 0x238, 0x236, 0x30c, 0x239, 0x16f, 0x13b, 0x26c, 0x161, 0x1, 0x359, 0x237, 0x55, 0xe, 0x13a, 0x135, 0x356, 0x54, 0x357, 0x30d, 0x160, 0x358, 0x16e, 0x262, 0x5b, 0x134, 0xf, 0x263, 0x302, 0x303, 0x5a, 0x26d, 0x238, 0x236, 0x30c, 0x239, 0x16f, 0x13b, 0x26c, 0x161, 0x1, 0x359, 0x237, 0x55, 0xe, 0x13a, 0x135, 0x356, 0x54, 0x357, 0x30d, 0x160, 0x358, 0x16e, 0x262, 0x5b, 0x134, 0xf, 0x263, 0x302, 0x303, 0x5a, 0x2bb, 0xce, 0x2a8, 0xe0, 0x301, 0x1cb, 0x3a, 0xbd, 0x2e8, 0x353, 0xed, 0x2b1, 0x44, 0x14d, 0xd4, 0x1c8, 0x3fe, 0x1ef, 0x119, 0x273, 0x1e7, 0xec, 0xa, 0x8a, 0x3e5, 0x34, 0x2c9, 0x235, 0x1d5, 0x1a4, 0x9b, 0x2b4, 0x1, 0x2bb, 0xce, 0x2a8, 0xe0, 0x301, 0x1cb, 0x3a, 0xbd, 0x2e8, 0x353, 0xed, 0x2b1, 0x44, 0x14d, 0xd4, 0x1c8, 0x3fe, 0x1ef, 0x119, 0x273, 0x1e7, 0xec, 0xa, 0x8a, 0x3e5, 0x34, 0x2c9, 0x235, 0x1d5, 0x1a4, 0x9b, 0x2b4, 0x1, 0x2bb, 0xce, 0x2a8, 0xe0, 0x301, 0x1cb, 0x3a, 0xbd, 0x2e8, 0x353, 0xed, 0x2b1, 0x44, 0x14d, 0xd4, 0x1c8, 0x3fe, 0x1ef, 0x119, 0x273, 0x1e7, 0xec, 0xa, 0x8a, 0x3e5, 0x34, 0x2c9, 0x235, 0x1d5, 0x1a4, 0x9b, 0x2b4, 0x1, 0x2bb, 0xce, 0x2a8, 0xe0, 0x301, 0x1cb, 0x3a, 0xbd, 0x2e8, 0x353, 0xed, 0x2b1, 0x44, 0x14d, 0xd4, 0x17f, 0x338, 0x16d, 0x21b, 0xf8, 0x23c, 0x13f, 0x57, 0x2c6, 0x1fd, 0x311, 0x4b, 0x304, 0x31c, 0x32b, 0x131, 0xb6, 0x1b2, 0x1e0, 0x3ac, 0x192, 0x253, 0x7d, 0x61, 0x1a3, 0x342, 0x378, 0x202, 0x1b0, 0x31e, 0x1d5, 0x348, 0x26c, 0x18d, 0x10, 0x3dd, 0x3ec, 0x2fd, 0x1f8, 0x39b, 0x388, 0x3d4, 0x179, 0x33, 0x3ef, 0x17c, 0xb9, 0x2c, 0x1ac, 0x2dc, 0x334, 0x372, 0x316, 0x23f, 0x2be, 0x116, 0x171, 0x3d9, 0x219, 0x206, 0x45, 0x3e5, 0x68, 0x336, 0x18c, 0x16f, 0xe5, 0x281, 0xe6, 0x100, 0x1a7, 0x2b7, 0x383, 0x3bf, 0x1ce, 0xfe, 0x137, 0x3bd, 0x330, 0x287, 0x3ed, 0x382, 0x2c0, 0x2f6, 0x193, 0x32c, 0x345, 0x10c, 0x3b8, 0x3ba, 0x144, 0x33d, 0x1e7, 0x1d8, 0x28, 0x59, 0x227, 0x289, 0x30c, 0xf6, 0x2dd, 0x24b, 0x4a, 0x27b, 0x24, 0x246, 0x32a, 0x4e, 0x38e, 0xdf, 0x3fb, 0x354, 0x3ae, 0x36c, 0x2fe, 0xfb, 0x37a, 0x1f8, 0x33f, 0x23b, 0x29f, 0x3bd, 0x269, 0x20e, 0x357, 0x5e, 0xa6, 0xd7, 0x22, 0x29a, 0x2a9, 0x17e, 0x87, 0x146, 0x386, 0x263, 0x26, 0x170, 0x145, 0x8d, 0x36e, 0x1a1, 0x378, 0xd, 0x2c9, 0xc6, 0x16f, 0x1ca, 0x216, 0x339, 0x24, 0x85, 0xb3, 0x270, 0x9e, 0x3d6, 0x307, 0x13a, 0x1ba, 0x1d, 0x17a, 0x36d, 0x2aa, 0x275, 0x18a, 0xc1, 0x18e, 0x32b, 0x262, 0x2d8, 0x18b, 0x23f, 0x175, 0x51, 0x39a, 0x1e7, 0x3b0, 0xa0, 0x2c8, 0x238, 0x194, 0x2b0, 0x3ee, 0x6, 0x21f, 0x21a, 0x30e, 0x19, 0x290, 0x81, 0x359, 0x19c, 0x16d, 0x3f, 0x3e0, 0x1c4, 0x3d4, 0x2f2, 0xcc, 0x347, 0x3ed, 0x30d, 0x312, 0x39d, 0x106, 0x151, 0xd4, 0x329, 0x397, 0x32e, 0x376, 0x1cf, 0x302, 0x2e, 0x2ad, 0x294, 0x36b, 0xb5, 0x6f, 0x284, 0xd8, 0x31e, 0x3aa, 0x13b, 0x344, 0xe6, 0x200, 0x295, 0x1f5, 0x3ec, 0x3e6, 0x3bf, 0x331, 0x3fb, 0x14b, 0x29e, 0x286, 0x25a, 0x3b2, 0x2aa, 0xe3, 0x221, 0x201, 0xd6, 0x1b1, 0x196, 0x283, 0x72, 0x3f5, 0x2cf, 0x1bb, 0x1cf, 0x20d, 0xb8, 0x145, 0x11a, 0x1a3, 0x113, 0x3e5, 0x1a0, 0x30c, 0x3d8, 0x183, 0x3c4, 0x282, 0x187, 0x19, 0x129, 0x204, 0x2fe, 0x1f6, 0x1f3, 0x3db, 0x39c, 0x3f9, 0x2a1, 0x14f, 0x143, 0x12d, 0x1d9, 0x155, 0x275, 0x314, 0x304, 0x6b, 0x2dc, 0xcb, 0x345, 0x39, 0x3fe, 0x363, 0x2d9, 0x2e3, 0x302, 0x5c, 0x2a6, 0x8d, 0x2d5, 0x28d, 0x3f6, 0xd0, 0x186, 0x1ec, 0x2c5, 0x1e2, 0x141, 0x2c7, 0x208, 0x290, 0x102, 0x17f, 0xfb, 0x2fd, 0x3e9, 0x1ce, 0x3f8, 0x354, 0x2a3, 0x2a5, 0x292, 0x2e8, 0x2ae, 0x33e, 0x18a, 0x182, 0x231, 0x16e, 0x261, 0x3a6, 0x218, 0x1ff, 0x3b5, 0x368, 0x375, 0x181, 0x2e, 0x153, 0x242, 0x36e, 0x342, 0x1fb, 0x68, 0x3ea, 0x3ab, 0x30f, 0x38e, 0x2f1, 0x307, 0xe1, 0x396, 0x349, 0xae, 0x33, 0x347, 0x3af, 0xbc, 0x139, 0x2d6, 0x124, 0x337, 0x391, 0xcd, 0x2ed, 0x10c, 0x1ff, 0x363, 0x1bb, 0x39e, 0x26, 0x1c9, 0x7d, 0x308, 0xa, 0xb2, 0x238, 0x259, 0x35a, 0x24e, 0x209, 0x2c3, 0x3aa, 0xe5, 0x25, 0x1fe, 0x89, 0x210, 0x91, 0x3a8, 0x338, 0x37a, 0x3e9, 0x39c, 0x3fb, 0x296, 0x26a, 0x1d, 0x1e1, 0x2b5, 0x3fa, 0x17c, 0x1c1, 0x312, 0x26f, 0x44, 0xfd, 0x19d, 0x257, 0x5b, 0x2c1, 0x77, 0x3ba, 0x232, 0x2eb, 0x162, 0x17, 0x153, 0x8d, 0x1a3, 0x226, 0x38f, 0x11b, 0xac, 0x3ee, 0x18, 0x1b8, 0x3a9, 0xd2, 0xd1, 0xe6, 0x12, 0x10a, 0x191, 0x28b, 0x38b, 0x2a8, 0x21b, 0x3c9, 0x23b, 0x26e, 0x3ae, 0x356, 0x292, 0x1d9, 0x2aa, 0x1c6, 0x96, 0x2c, 0x17b, 0x245, 0x151, 0x350, 0x2fc, 0x31, 0x9a, 0xf0, 0x2ab, 0x3dd, 0x2b7, 0x4e, 0x9e, 0x28f, 0x70, 0x7c, 0x1c4, 0x29f, 0x1d7, 0x356, 0x12d, 0x36d, 0x17d, 0x5f, 0x2e4, 0x312, 0xd7, 0x110, 0x3e1, 0x1e6, 0x262, 0x2ed, 0x218, 0x3f5, 0x32e, 0x386, 0x33c, 0x192, 0x171, 0x1e7, 0x1bf, 0x5a, 0x256, 0x36b, 0x1a1, 0x3f6, 0x340, 0x56, 0x3ee, 0x30, 0x2e9, 0x177, 0x13b, 0x216, 0x1fe, 0x112, 0x52, 0x81, 0x2fe, 0x3d1, 0x30f, 0x315, 0x3d6, 0xe, 0x20b, 0x23c, 0x3d4, 0x3bd, 0x36c, 0x2a0, 0x2e8, 0x2aa, 0x38c, 0x258, 0x160, 0x39d, 0x22, 0xfd, 0x33a, 0x14e, 0x2d8, 0x43, 0x2fb, 0x363, 0x376, 0x263, 0x130, 0xaf, 0x3bb, 0x3b0, 0x109, 0x34c, 0x1ee, 0xb5, 0x378, 0x68, 0x30c, 0x37b, 0x6, 0xdc, 0x3a9, 0x1a4, 0x344, 0x339, 0x120, 0x108, 0x91, 0x359, 0xfb, 0x3e6, 0x2e7, 0x37c, 0x307, 0x1c2, 0x243, 0x27e, 0x2f2, 0x269, 0x54, 0x5d, 0x157, 0x275, 0x4b, 0x3b3, 0x2ce, 0x270, 0x1f2, 0x154, 0x3f, 0x277, 0x3f9, 0x125, 0x374, 0x3a0, 0x15c, 0x198, 0x2a, 0x5d, 0x2ae, 0x1c6, 0x258, 0x2c0, 0x26f, 0x110, 0x3cb, 0x391, 0x334, 0x283, 0x390, 0x87, 0x4d, 0x1e0, 0x175, 0x119, 0x1df, 0x302, 0x2e0, 0xfa, 0x76, 0x140, 0x1a6, 0x1ee, 0x16a, 0x1fb, 0x340, 0xac, 0x3a3, 0x180, 0x2c3, 0x2b3, 0x24b, 0x152, 0x187, 0xc8, 0x2c2, 0x100, 0x85, 0x322, 0x75, 0x19c, 0x2fd, 0x377, 0x37c, 0x207, 0x301, 0x23c, 0x3a1, 0x2ef, 0x356, 0x25a, 0x1af, 0x3fa, 0x1f9, 0x2f, 0x139, 0x34a, 0x264, 0x6b, 0x2cd, 0x2ac, 0x2a9, 0x3cd, 0x229, 0x18b, 0x3b8, 0x3b5, 0x376, 0xcf, 0xc9, 0x171, 0x3ce, 0x2f5, 0x2d0, 0x121, 0x1a3, 0x8a, 0x8e, 0x259, 0x173, 0xa1, 0x360, 0x239, 0x2c5, 0x30b, 0xf4, 0x69, 0x1a2, 0x339, 0x240, 0x29, 0x81, 0x1f5, 0x35f, 0x4e, 0x13c, 0x22e, 0x380, 0x36f, 0x32a, 0x3a4, 0x31f, 0x2da, 0x3db, 0x1be, 0x207, 0x20b, 0xe2, 0x137, 0x2a3, 0x20a, 0x38d, 0x21d, 0x107, 0x115, 0x157, 0x1c6, 0xb9, 0x312, 0x35c, 0x124, 0x18e, 0x1b1, 0x156, 0x2a9, 0x393, 0xb6, 0x43, 0x3fe, 0x255, 0xf, 0x351, 0xa2, 0x371, 0x181, 0x2e0, 0x1f4, 0x1d8, 0x212, 0x256, 0x1b7, 0x226, 0x47, 0x259, 0x2e6, 0x284, 0x336, 0x3d8, 0x6, 0x370, 0x2ee, 0x1ca, 0x250, 0x2c7, 0xc8, 0x18d, 0x9, 0x21, 0x24c, 0x2bb, 0x3d1, 0x27, 0x13c, 0x55, 0x21b, 0x277, 0x3fb, 0x9d, 0x396, 0x27e, 0x3da, 0x2d1, 0x12d, 0x1af, 0x3fd, 0x3ed, 0x178, 0x3b4, 0x18a, 0x16, 0x1e5, 0x22, 0x3f4, 0x3cc, 0x334, 0x10f, 0x25b, 0x31, 0xd9, 0x77, 0x1ef, 0x1bb, 0xcf, 0x192, 0x1cd, 0x24f, 0x303, 0x2a6, 0xc2, 0x14, 0x332, 0x27f, 0xb5, 0x1fb, 0x289, 0x2b0, 0x127, 0x36, 0xc6, 0x1b3, 0x381, 0xf4, 0x2d7, 0xb3, 0x11f, 0x19c, 0x3e6, 0x315, 0x28f, 0x380, 0x33f, 0x3fb, 0x13a, 0x243, 0x3d4, 0x1d7, 0x286, 0x3c2, 0x21d, 0x20e, 0x5d, 0x2aa, 0x5f, 0x30d, 0x139, 0x133, 0x201, 0x2f6, 0x22, 0x3e1, 0x32b, 0x196, 0xd4, 0x3e2, 0x5b, 0x43, 0x3f5, 0x146, 0x78, 0x175, 0x6d, 0x1cf, 0x130, 0x171, 0x323, 0x303, 0x145, 0x308, 0xa0, 0x34c, 0x36b, 0x113, 0x47, 0xbb, 0x38a, 0xd, 0x30c, 0x3ee, 0x180, 0x31e, 0x36a, 0x3c4, 0xf4, 0x1a4, 0x216, 0x3eb, 0x19, 0x161, 0x200, 0x21, 0x91, 0x2fe, 0x2b7, 0x270, 0x3c1, 0x16d, 0x3db, 0x37c, 0xe, 0x7c, 0x23b, 0x2a1, 0x1ba, 0x349, 0x2f2, 0x36c, 0x12d, 0x35e, 0x3ef, 0x357, 0x3ad, 0x275, 0x258, 0x312, 0x2b1, 0x99, 0x6b, 0x326, 0x29a, 0x33a, 0x262, 0x345, 0x329, 0x31, 0x1b2, 0x1dc, 0x363, 0x386, 0x1d6, 0x51, 0x371, 0x302, 0x392, 0x3bb, 0x1bf, 0x2d0, 0x1a7, 0x2cc, 0xea, 0x1f6, 0x27, 0xf9, 0x159, 0x3e9, 0x37c, 0x1c, 0x1f0, 0x1fc, 0x24a, 0x325, 0x3d4, 0x3ae, 0x20a, 0x22f, 0x198, 0x150, 0x36d, 0x3fd, 0x3af, 0x3ad, 0xe3, 0x172, 0xa6, 0x34a, 0x304, 0x2f6, 0x44, 0x39f, 0x16e, 0x156, 0x2b6, 0x14e, 0x1d3, 0x390, 0x31, 0x364, 0x379, 0x32e, 0x1e, 0x2be, 0x6d, 0x39e, 0xc9, 0x39a, 0x25c, 0xb8, 0x1f4, 0x369, 0x168, 0x8d, 0x5, 0x332, 0x1ee, 0x342, 0x227, 0xbb, 0x31d, 0x34, 0x56, 0x297, 0x6c, 0x239, 0x205, 0x370, 0x3aa, 0x9f, 0x10d, 0x230, 0x281, 0x3f1, 0x19, 0x2c2, 0x12, 0x108, 0x102, 0x36f, 0xb3, 0x23e, 0x279, 0x30f, 0x13c, 0x154, 0x1f8, 0xdf, 0x7, 0x7c, 0x7f, 0x296, 0x1cb, 0xf5, 0x2ef, 0x286, 0x38d, 0x66, 0x54, 0x1d9, 0x1fd, 0x3ed, 0x1e9, 0x33e, 0x258, 0x22d, 0x2d6, 0xc1, 0x2b9, 0x11, 0x3e1, 0x25f, 0x251, 0x2a9, 0x34e, 0x322, 0x359, 0x35f, 0xe9, 0x237, 0x1f3, 0x223, 0x55, 0xfc, 0xdf, 0xe, 0x1f0, 0x3f8, 0x13a, 0x11e, 0x137, 0x135, 0x3a0, 0x1ed, 0x356, 0x1e1, 0x33, 0x54, 0x3b2, 0x3fd, 0x357, 0x2af, 0x311, 0x30d, 0xed, 0x314, 0x160, 0x35c, 0x132, 0x358, 0x11, 0x3cb, 0x16e, 0x2ac, 0x2ca, 0x262, 0x10f, 0x2fc, 0x5b, 0x10c, 0x327, 0x134, 0xee, 0x2cf, 0xf, 0x2be, 0xda, 0x263, 0x241, 0x1de, 0x302, 0x253, 0x3ce, 0x303, 0x11d, 0xec, 0x5a, 0x242, 0x5, 0x26d, 0x3b1, 0x226, 0x238, 0x34d, 0x2f9, 0x236, 0x2bd, 0x101, 0x30c, 0x3a3, 0x36, 0x239, 0x3, 0x1db, 0x16f, 0x1e2, 0x1e8, 0x13b, 0x250, 0x215, 0x26c, 0xff, 0x104, 0x161, 0x12, 0x210, 0x1, 0x34e, 0x322, 0x359, 0x35f, 0xe9, 0x237, 0x1f3, 0x223, 0x55, 0xfc, 0xdf, 0xe, 0x1f0, 0x3f8, 0x13a, 0x11e, 0x137, 0x135, 0x3a0, 0x1ed, 0x356, 0x295, 0x93, 0x2fe, 0x195, 0x11f, 0xfb, 0x4e, 0x3c1, 0x37a, 0x315, 0x55, 0x1f8, 0x37c, 0x70, 0x33f, 0x3e7, 0x20b, 0x23b, 0x125, 0x243, 0x29f, 0x135, 0x349, 0x3bd, 0x286, 0x22f, 0x269, 0x12d, 0x2c6, 0x20e, 0x2e8, 0x3fa, 0x357, 0x157, 0x5f, 0x5e, 0x2cb, 0x258, 0xa6, 0x133, 0x2c, 0xd7, 0x99, 0x358, 0x22, 0x337, 0x362, 0x29a, 0x1e6, 0x196, 0x2a9, 0x14e, 0x345, 0x17e, 0x5b, 0x218, 0x87, 0x1b2, 0x2fb, 0x146, 0x3c0, 0x1ef, 0x386, 0x2ab, 0x6d, 0x263, 0x8b, 0x371, 0x26, 0x171, 0x12e, 0x170, 0x3bb, 0x1e3, 0x145, 0x76, 0x5a, 0x8d, 0x14, 0x34c, 0x36e, 0x59, 0x33b, 0x1a1, 0x47, 0x1d1, 0x378, 0x236, 0x173, 0xd, 0x56, 0x24e, 0x2c9, 0x37b, 0x180, 0xc6, 0x306, 0x2e9, 0x16f, 0x3c4, 0x3a9, 0x1ca, 0x141, 0x230, 0x216, 0x367, 0x249, 0x339, 0x82, 0x161, 0x24, 0x52, 0x8, 0x85, 0x123, 0x24c, 0x3dd, 0x166, 0x3a8, 0x2b7, 0x341, 0x279, 0x4e, 0x38b, 0x1f3, 0x9e, 0x159, 0x377, 0x28f, 0x7e, 0x1be, 0x70, 0x277, 0x387, 0x7c, 0x3f8, 0xe1, 0x1c4, 0x14b, 0x325, 0x29f, 0x26a, 0x13f, 0x1d7, 0x3a, 0x179, 0x356, 0x38d, 0x330, 0x12d, 0x185, 0x2a, 0x36d, 0x3d7, 0x22a, 0x17d, 0x3d3, 0x2af, 0x5f, 0xbc, 0x33e, 0x2e4, 0x272, 0x221, 0x312, 0x34a, 0x16, 0xd7, 0x132, 0x17b, 0x110, 0x31c, 0x83, 0x3e1, 0x2dc, 0x14d, 0x1e6, 0x32c, 0x2b6, 0x262, 0x35, 0x393, 0x2ed, 0x25b, 0x229, 0x218, 0x10e, 0x2c1, 0x3f5, 0x4d, 0xee, 0x32e, 0xf0, 0x2f3, 0x386, 0x15f, 0x1b4, 0x33c, 0xa2, 0x2e3, 0x192, 0x1de, 0x13, 0x171, 0x25c, 0x1c9, 0x1e7, 0x20f, 0xfa, 0x1bf, 0x153, 0x3b, 0x5a, 0x11a, 0x50, 0x256, 0x285, 0x332, 0x36b, 0x114, 0x399, 0x1a1, 0x8e, 0x34d, 0x3f6, 0x328, 0x233, 0x340, 0x246, 0x122, 0x2d7, 0x24d, 0x1f5, 0xb3, 0x3a8, 0x167, 0x11f, 0x3ec, 0xe9, 0x19c, 0x27, 0x38b, 0x3e6, 0x278, 0x2da, 0x315, 0x154, 0x3bf, 0x28f, 0xfc, 0x2f1, 0x380, 0x331, 0x1c, 0x33f, 0x387, 0xf8, 0x3fb, 0x301, 0x7f, 0x13a, 0xe2, 0x14b, 0x243, 0x26e, 0x374, 0x3d4, 0x29e, 0x29b, 0x1d7, 0x74, 0x1ed, 0x286, 0xae, 0x2d1, 0x3c2, 0x330, 0x25a, 0x21d, 0x150, 0x2b5, 0x20e, 0x3b2, 0x3d7, 0x5d, 0x1fd, 0x2a7, 0x2aa, 0x3f2, 0x353, 0x5f, 0x178, 0xe3, 0x30d, 0x361, 0xb9, 0x139, 0x221, 0x22d, 0x133, 0xb0, 0x16b, 0x201, 0x26f, 0x132, 0x2f6, 0x49, 0xd6, 0x22, 0xc7, 0x245, 0x3e1, 0x1b1, 0x13d, 0x32b, 0x2ac, 0x27d, 0x196, 0x2b6, 0xcd, 0xd4, 0xa7, 0x283, 0x3e2, 0x372, 0x25b, 0x5b, 0x72, 0x62, 0x43, 0x247, 0x364, 0x3f5, 0x9a, 0x3b8, 0x146, 0x31b, 0x2cf, 0x78, 0x2f3, 0x305, 0x175, 0x85, 0x81, 0x295, 0x91, 0x2d7, 0x93, 0x3dd, 0x191, 0x2fe, 0xb3, 0x359, 0x195, 0xea, 0x2b7, 0x11f, 0x3d1, 0x3a4, 0xfb, 0x270, 0x19c, 0x4e, 0x237, 0x30f, 0x3c1, 0x3e6, 0xf9, 0x37a, 0x9e, 0x16d, 0x315, 0x2a8, 0x2e7, 0x55, 0x3db, 0x28f, 0x1f8, 0x3d6, 0x3f, 0x37c, 0x380, 0x26b, 0x70, 0x1ce, 0xe, 0x33f, 0x307, 0x3e0, 0x3e7, 0x7c, 0x3fb, 0x20b, 0x1fc, 0x1c2, 0x23b, 0x13a, 0x1c4, 0x125, 0x23c, 0x2a1, 0x243, 0xd5, 0x1cb, 0x29f, 0x1ba, 0x3d4, 0x135, 0x27e, 0x2a3, 0x349, 0x1d7, 0xe8, 0x3bd, 0x1d, 0x2f2, 0x286, 0x15c, 0x356, 0x22f, 0x36c, 0x3c2, 0x269, 0x17a, 0xcc, 0x12d, 0x21d, 0x2a0, 0x2c6, 0x54, 0x35e, 0x20e, 0x36d, 0x347, 0x2e8, 0x3ef, 0x5d, 0x3fa, 0x28e, 0x17d, 0x357, 0x2aa, 0x3ed, 0x157, 0x2f8, 0x3ad, 0x5f, 0x2f0, 0x38c, 0x5e, 0x275, 0x30d, 0x2cb, 0x2e4, 0x1da, 0x258, 0x10a, 0x204, 0x85, 0x102, 0x246, 0x81, 0x123, 0x244, 0x295, 0x122, 0x34e, 0x91, 0x1a7, 0x24c, 0x2d7, 0x126, 0x36f, 0x93, 0x3b3, 0x24d, 0x3dd, 0x322, 0x3ea, 0x191, 0x1f5, 0x2cc, 0x2fe, 0x166, 0x17f, 0xb3, 0x2bb, 0x25d, 0x359, 0x32a, 0x3a8, 0x195, 0x1d4, 0x2ce, 0xea, 0x167, 0x75, 0x2b7, 0x23e, 0x35f, 0x11f, 0x3ab, 0x28b, 0x3d1, 0x341, 0x3ec, 0x3a4, 0x1f6, 0x1d2, 0xfb, 0xe9, 0x279, 0x270, 0x338, 0x138, 0x19c, 0x9c, 0xce, 0x4e, 0x67, 0x27, 0x237, 0x217, 0x31f, 0x30f, 0x38b, 0x383, 0x3c1, 0x3c5, 0x3e4, 0x3e6, 0x1f2, 0x1f3, 0xf9, 0x2fd, 0x278, 0x37a, 0x13c, 0x1bd, 0x9e, 0x2da, 0x4f, 0x16d, 0x223, 0x2b2, 0x315, 0x159, 0x38e, 0x2a8, 0x1c7, 0x154, 0x2e7, 0xaa, 0x377, 0x55, 0x3bf, 0x22e, 0x3db, 0x117, 0x3e9, 0x28f, 0x3f0, 0x343, 0x1f8, 0x3a5, 0xfc, 0x3d6, 0x7e, 0x1eb, 0x3f, 0x214, 0x2, 0x21, 0x4, 0x42, 0x8, 0x84, 0x10, 0x108, 0x20, 0x210, 0x40, 0x29, 0x80, 0x52, 0x100, 0xa4, 0x200, 0x148, 0x9, 0x290, 0x12, 0x129, 0x24, 0x252, 0x48, 0xad, 0x90, 0x15a, 0x120, 0x2b4, 0x240, 0x161, 0x89, 0x2c2, 0x112, 0x18d, 0x224, 0x31a, 0x41, 0x23d, 0x82, 0x73, 0x104, 0xe6, 0x208, 0x1cc, 0x19, 0x398, 0x32, 0x339, 0x64, 0x27b, 0xc8, 0xff, 0x190, 0x1fe, 0x320, 0x3fc, 0x249, 0x3f1, 0x9b, 0x3eb, 0x136, 0x3df, 0x26c, 0x3b7, 0xd1, 0x367, 0x1a2, 0x2c7, 0x344, 0x187, 0x281, 0x30e, 0x10b, 0x215, 0x216, 0x23, 0x25, 0x46, 0x4a, 0x8c, 0x94, 0x118, 0x128, 0x230, 0x250, 0x69, 0xa9, 0xd2, 0x152, 0x1a4, 0x2a4, 0x348, 0x141, 0x299, 0x282, 0x13b, 0x10d, 0x276, 0x21a, 0xe5, 0x3d, 0x1ca, 0x7a, 0x394, 0xf4, 0x321, 0x1e8, 0x24b, 0x3d0, 0x9f, 0x3a9, 0x21, 0x8, 0x108, 0x40, 0x52, 0x200, 0x290, 0x24, 0xad, 0x120, 0x161, 0x112, 0x31a, 0x82, 0xe6, 0x19, 0x339, 0xc8, 0x1fe, 0x249, 0x3eb, 0x26c, 0x367, 0x344, 0x30e, 0x216, 0x46, 0x94, 0x230, 0xa9, 0x1a4, 0x141, 0x13b, 0x21a, 0x1ca, 0xf4, 0x24b, 0x3a9, 0x27c, 0x177, 0x3c4, 0x3aa, 0x21f, 0x16f, 0xdc, 0x36a, 0x2e9, 0x366, 0x365, 0x306, 0x31e, 0x6, 0xc6, 0x30, 0x239, 0x180, 0x1ec, 0x1b, 0x37b, 0xd8, 0x3ee, 0x2c9, 0x34f, 0x265, 0x24e, 0x30c, 0x254, 0x56, 0x284, 0x2b0, 0xd, 0x1ad, 0x68, 0x173, 0x340, 0x38a, 0x236, 0x6f, 0x194, 0x378, 0xbb, 0x3f6, 0x1d1, 0x38f, 0x293, 0x47, 0xb5, 0x238, 0x1a1, 0x1e4, 0x113, 0x33b, 0x8a, 0x1ee, 0x59, 0x36b, 0x2c8, 0x36e, 0x26d, 0x346, 0x34c, 0x206, 0x256, 0x14, 0x294, 0xa0, 0x8d, 0x109, 0x61, 0x5a, 0x308, 0x2d0, 0x76, 0x2ad, 0x42, 0x20, 0x52, 0x9, 0x252, 0x120, 0x2c2, 0x41, 0xe6, 0x32, 0xff, 0x249, 0x3df, 0x1a2, 0x30e, 0x25, 0x118, 0xa9, 0x348, 0x10d, 0x1ca, 0x1e8, 0x13e, 0x177, 0x381, 0x2b3, 0xdc, 0x2dd, 0x3b6, 0x306, 0x235, 0x18, 0x239, 0x300, 0x3b9, 0xd8, 0x3d5, 0x336, 0x24e, 0x211, 0x142, 0x2b0, 0x1a, 0x2bd, 0x340, 0x31d, 0xca, 0x378, 0x176, 0x3c3, 0x293, 0x8e, 0x2d4, 0x1e4, 0x226, 0xf7, 0x59, 0x2df, 0x332, 0x346, 0x291, 0xa, 0x294, 0x140, 0x234, 0x5a, 0x219, 0x352, 0x3b0, 0x28a, 0x2f5, 0x1f4, 0x20f, 0x2f7, 0x170, 0x24f, 0x253, 0x162, 0x2e2, 0x13, 0xef, 0x260, 0x1df, 0x8b, 0x39e, 0x144, 0x33c, 0xda, 0x351, 0x376, 0x2ea, 0x203, 0x1ef, 0xf0, 0x197, 0x23f, 0x28c, 0x379, 0x134, 0x3e3, 0x2c1, 0x87, 0x86, 0xc4, 0xe4, 0xb6, 0xbf, 0x2ed, 0x3cd, 0x10f, 0x14e, 0x1a8, 0x19a, 0x165, 0x84, 0x80, 0x290, 0x90, 0x2c2, 0x82, 0x398, 0x190, 0x3eb, 0x1a2, 0x215, 0x94, 0xd2, 0x282, 0x1ca, 0x3d0, 0xf1, 0x3aa, 0x6e, 0x2dd, 0x365, 0x3, 0x18c, 0x180, 0x3b9, 0x1b0, 0x34f, 0x186, 0xa1, 0x2b0, 0x34, 0x2e6, 0x236, 0x1bc, 0x176, 0x38f, 0x25e, 0x79, 0x113, 0xf7, 0xb2, 0x36e, 0x1a6, 0x5, 0x294, 0x280, 0xc2, 0x2d0, 0x1d8, 0x28a, 0x1e3, 0x3d9, 0x5c, 0x323, 0x253, 0x2c4, 0x39a, 0x98, 0x2eb, 0x8b, 0x335, 0x119, 0x1d6, 0x1bb, 0x2ea, 0xf, 0x3b5, 0x389, 0x146, 0x379, 0x268, 0x397, 0x225, 0x62, 0xe4, 0x16c, 0x2fc, 0x345, 0xa7, 0x1a8, 0x334, 0x19d, 0x156, 0x32b, 0x27a, 0x2cd, 0x337, 0x11, 0xd6, 0x92, 0x3ca, 0x182, 0x2b1, 0xb0, 0x266, 0xa6, 0x12c, 0x3b4, 0x30d, 0x1c6, 0x1e9, 0x2f8, 0x155, 0x2a7, 0x3fa, 0x174, 0x287, 0x35e, 0x150, 0x33, 0x17a, 0x1b6, 0x57, 0x286, 0x108, 0x200, 0xad, 0x112, 0xe6, 0xc8, 0x3eb, 0x344, 0x46, 0xa9, 0x13b, 0xf4, 0x27c, 0x3aa, 0xdc, 0x366, 0x31e, 0x30, 0x1ec, 0xd8, 0x34f, 0x30c, 0x284, 0x1ad, 0x340, 0x6f, 0xbb, 0x38f, 0xb5, 0x1e4, 0x8a, 0x36b, 0x26d, 0x206, 0x294, 0x109, 0x308, 0x2ad, 0x1bf, 0x1f4, 0x2e, 0x323, 0xaf, 0x302, 0xef, 0x192, 0x1cf, 0x288, 0x1d6, 0x376, 0x3ba, 0x78, 0x32e, 0x1dc, 0x134, 0x397, 0x43, 0x188, 0x329, 0x2ed, 0x32f, 0xd4, 0x334, 0x33a, 0x151, 0x16e, 0x3e1, 0x106, 0x6b, 0x92, 0x39d, 0x201, 0x1a5, 0x312, 0x4b, 0x1da, 0x30d, 0x38c, 0x3ad, 0x3ed, 0x17d, 0x5d, 0x347, 0x35e, 0x2a0, 0xcc, 0x3c2, 0x356, 0x2f2, 0xe8, 0x2a3, 0x3d4, 0x1cb, 0x2a1, 0x1c4, 0x1c2, 0x3fb, 0x3e0, 0xe, 0x26b, 0x3f, 0x28f, 0x2e7, 0x16d, 0xf9, 0x30f, 0x19c, 0x3a4, 0x2b7, 0x359, 0x191, 0x2d7, 0x81, 0x21, 0x210, 0x12, 0x161, 0x104, 0xff, 0x26c, 0x215, 0x250, 0x13b, 0x1e8, 0x1e2, 0x16f, 0x1db, 0x3, 0x239, 0x36, 0x3a3, 0x30c, 0x101, 0x2bd, 0x236, 0x2f9, 0x34d, 0x238, 0x226, 0x3b1, 0x26d, 0x5, 0x242, 0x5a, 0xec, 0x11d, 0x303, 0x3ce, 0x253, 0x302, 0x1de, 0x241, 0x263, 0xda, 0x2be, 0xf, 0x2cf, 0xee, 0x134, 0x327, 0x10c, 0x5b, 0x2fc, 0x10f, 0x262, 0x2ca, 0x2ac, 0x16e, 0x3cb, 0x11, 0x358, 0x132, 0x35c, 0x160, 0x314, 0xed, 0x30d, 0x311, 0x2af, 0x357, 0x3fd, 0x3b2, 0x54, 0x33, 0x1e1, 0x356, 0x1ed, 0x3a0, 0x135, 0x137, 0x11e, 0x13a, 0x3f8, 0x1f0, 0xe, 0xdf, 0xfc, 0x55, 0x223, 0x1f3, 0x237, 0xe9, 0x35f, 0x359, 0x322, 0x34e, 0x1, 0x210, 0x12, 0x161, 0x104, 0xff, 0x26c, 0x215, 0x250, 0x13b, 0x1e8, 0x1e2, 0x16f, 0x1db, 0x3, 0x239, 0x36, 0x3a3, 0x30c, 0x101, 0x2bd, 0x236, 0x29, 0x48, 0x31a, 0x64, 0x3df, 0x216, 0xd2, 0x3d, 0x27c, 0x2b3, 0x1db, 0x6, 0xf6, 0x1b0, 0x24e, 0x158, 0xd0, 0x6f, 0x2ec, 0x8e, 0x113, 0x3b1, 0xd3, 0x14, 0x234, 0x1a9, 0x1bf, 0x3d9, 0x2e0, 0x162, 0x273, 0x324, 0x263, 0x1b4, 0x2ea, 0x78, 0xa3, 0x1ff, 0x18b, 0xc4, 0x25b, 0x345, 0x131, 0x2ca, 0x151, 0x1b1, 0x267, 0x110, 0x3ca, 0xb, 0x133, 0x298, 0x1c1, 0x38c, 0x2af, 0x2a7, 0x3ef, 0x1af, 0x149, 0x269, 0xae, 0x3a, 0x2a3, 0x34b, 0x8f, 0x13a, 0x3f9, 0x3c9, 0x70, 0x1eb, 0x3bf, 0x16d, 0x3e4, 0x9c, 0x3d1, 0x3a8, 0x322, 0x295, 0x4, 0xa4, 0x120, 0x73, 0x190, 0x367, 0x4a, 0x348, 0xf4, 0x1e2, 0x2de, 0x365, 0x18, 0x3d8, 0x2c9, 0x12a, 0x169, 0x340, 0x1bc, 0x3a2, 0x238, 0x45, 0x2df, 0x34c, 0x50, 0xc2, 0x2ad, 0x2f5, 0x37f, 0x392, 0x181, 0x1de, 0x8b, 0x19e, 0x2d9, 0x3ba, 0x52, 0x120, 0xe6, 0x249, 0x30e, 0xa9, 0x1ca, 0x177, 0xdc, 0x306, 0x239, 0xd8, 0x24e, 0x2b0, 0x340, 0x378, 0x293, 0x1e4, 0x59, 0x346, 0x294, 0x5a, 0x3b0, 0x1f4, 0x170, 0x162, 0xef, 0x8b, 0x33c, 0x376, 0x1ef, 0x23f, 0x134, 0x87, 0xe4, 0x2ed, 0x14e, 0x165, 0x151, 0x362, 0x18e, 0x92, 0xd7, 0x160, 0x4b, 0x2cb, 0x2f0, 0x3ed, 0x3fa, 0x36d, 0x2a0, 0x269, 0x15c, 0xe8, 0x135, 0xd5, 0x1c4, 0x20b, 0x307, 0x26b, 0x1f8, 0x2a8, 0xf9, 0x4e, 0x3d1, 0x359, 0x93, 0x85, 0x40, 0xad, 0x82, 0x1fe, 0x344, 0x230, 0x21a, 0x27c, 0x16f, 0x365, 0x30, 0x37b, 0x265, 0x284, 0x173, 0x194, 0x38f, 0x1a1, 0x1ee, 0x26d, 0x14, 0x61, 0x2ad, 0x1e3, 0x1e7, 0xaf, 0x26, 0x3be, 0x288, 0x2ab, 0xf, 0x32e, 0x2fb, 0x18b, 0x188, 0x17e, 0x21e, 0x334, 0x1e6, 0xfd, 0x106, 0x358, 0xc1, 0x1a5, 0xa6, 0x2e4, 0xa4, 0x89, 0x339, 0xd1, 0x118, 0x21a, 0xf1, 0x1b5, 0x31e, 0x300, 0x3a3, 0x56, 0xd0, 0x1bc, 0x293, 0x3c8, 0x164, 0x206, 0x11a, 0x352, 0x1e3, 0x3ce, 0x2bc, 0x130, 0x39e, 0x1b4, 0x3ba, 0x389, 0x9a, 0x87, 0x1c8, 0x3a6, 0x262, 0x27d, 0x27a, 0x106, 0x2b9, 0x304, 0x133, 0x272, 0x2f, 0x2f8, 0x2fa, 0x3b2, 0x2a0, 0xdb, 0x179, 0x349, 0x374, 0x296, 0x1fc, 0x3c9, 0x1c0, 0x28f, 0x223, 0x383, 0xfb, 0x1d4, 0x24d, 0x85, 0x80, 0x2b4, 0x19, 0x3df, 0x4a, 0x13b, 0x35b, 0x6e, 0x306, 0x7b, 0x360, 0x254, 0x35a, 0xca, 0x38f, 0x342, 0x3b1, 0x34c, 0x140, 0x3b, 0x23a, 0x5c, 0xb1, 0xef, 0x116, 0xeb, 0x386, 0x2cf, 0x379, 0x18b, 0x310, 0x1f1, 0xd4, 0x32c, 0xb7, 0x337, 0x220, 0x26f, 0x160, 0x96, 0x33e, 0x3ad, 0x2a7, 0x3a7, 0x2c6, 0x2f4, 0x143, 0x1d7, 0x3a1, 0x11e, 0x1c2, 0x3c7, 0x331, 0x1f8, 0x148, 0x224, 0x1fe, 0x10b, 0x348, 0x3a9, 0x6e, 0x205, 0x1ec, 0x336, 0x101, 0x38a, 0x2ec, 0x79, 0x59, 0x103, 0x11a, 0x2ad, 0x385, 0x24f, 0x39a, 0x241, 0x271, 0x386, 0x197, 0x1ff, 0x43, 0x16c, 0x257, 0x165, 0x14d, 0x245, 0x358, 0x304, 0x266, 0x1da, 0x178, 0x3d3, 0x3ef, 0x163, 0x2f4, 0x286, 0x355, 0x137, 0x1c4, 0x3e, 0x1c, 0x3d6, 0x38e, 0x3c5, 0xfb, 0x3a8, 0x126, 0x21, 0x12, 0x23d, 0x249, 0x23, 0x282, 0x27c, 0x1b5, 0x235, 0x1b, 0x127, 0x169, 0x236, 0x3c3, 0x342, 0x36b, 0x12b, 0x212, 0x3b0, 0x3d9, 0x32d, 0x26, 0x2e3, 0xda, 0x3ba, 0x31b, 0x268, 0x31, 0xbf, 0x35, 0x196, 0xb7, 0x267, 0x92, 0x35c, 0x22d, 0x2e4, 0x22b, 0x15d, 0x2e8, 0x150, 0xdb, 0x2f2, 0x13f, 0x396, 0x13a, 0x3f7, 0x39c, 0x1f8, 0x2b2, 0x38b, 0x3a4, 0x25d, 0x1a7, 0x8, 0x252, 0x104, 0x3eb, 0x4a, 0x276, 0x177, 0x290, 0x82, 0x3eb, 0x94, 0x1ca, 0x3aa, 0x365, 0x180, 0x34f, 0x2b0, 0x236, 0x38f, 0x113, 0x36e, 0x294, 0x2d0, 0x1e3, 0x323, 0x39a, 0x8b, 0x1d6, 0xf, 0x146, 0x397, 0xe4, 0x345, 0x334, 0x32b, 0x337, 0x92, 0x2b1, 0xa6, 0x30d, 0x2f8, 0x3fa, 0x35e, 0x17a, 0x286, 0x2a3, 0xd5, 0x23b, 0x3e0, 0x380, 0x55, 0xf9, 0x270, 0x195, 0x2d7, 0x8, 0xad, 0x19, 0x367, 0xa9, 0x24b, 0x16f, 0x31e, 0x1b, 0x24e, 0x1ad, 0x194, 0x47, 0x8a, 0x346, 0x8d, 0x2ad, 0x303, 0x12e, 0xef, 0x51, 0x2ab, 0x78, 0x222, 0x87, 0x329, 0x21e, 0x196, 0x16e, 0x18e, 0x99, 0x1a5, 0x139, 0x5e, 0x3ed, 0x3ef, 0x2c6, 0x3c2, 0x1d, 0x135, 0x2a1, 0x1fc, 0x33f, 0x3f, 0x2a8, 0x3c1, 0x3a4, 0xb3, 0x295, 0x40, 0x161, 0xc8, 0x30e, 0x141, 0x27c, 0x36a, 0xc6, 0xd8, 0x254, 0x173, 0xbb, 0x238, 0x59, 0x206, 0x61, 0x145, 0x129, 0x208, 0x367, 0x152, 0x13e, 0x36a, 0x18c, 0x360, 0x284, 0x31d, 0x34d, 0x33b, 0xd3, 0x280, 0x3b0, 0x37f, 0x2bc, 0x192, 0x271, 0x203, 0x146, 0x327, 0x390, 0x21e, 0x32c, 0x1b1, 0x6b, 0x182, 0xc5, 0x2cb, 0x353, 0x22a, 0x54, 0xdb, 0x3da, 0x3d4, 0x71, 0x3e, 0x70, 0x117, 0x278, 0x270, 0x32a, 0x34e, 0x40, 0x2c2, 0x320, 0x46, 0x3d, 0x30b, 0x306, 0x3d8, 0x186, 0x68, 0x2f9, 0x2d4, 0x36b, 0xa5, 0x168, 0x1e3, 0x24f, 0x273, 0x51, 0x15f, 0x1e0, 0x134, 0x62, 0x1f1, 0x2a9, 0x2a2, 0x83, 0x2f6, 0x58, 0x12c, 0x38c, 0x15d, 0x3b2, 0x12d, 0x2a5, 0x355, 0xd5, 0x7f, 0x39b, 0x3f, 0x159, 0x31f, 0x11f, 0x322, 0x214, 0x24, 0x1cc, 0x1a2, 0x1a4, 0x35b, 0x370, 0x30, 0x3d5, 0x158, 0x236, 0x317, 0x45, 0x346, 0x11a, 0x2a6, 0x2e, 0x2c4, 0x1df, 0x6d, 0x37d, 0xee, 0x18b, 0xb6, 0xa7, 0x33a, 0x252, 0x32, 0x30e, 0x10d, 0x381, 0x306, 0x3b9, 0x211, 0x340, 0x3c3, 0x226, 0x346, 0x234, 0x28a, 0x170, 0x13, 0x39e, 0x376, 0x197, 0x3e3, 0xe4, 0x10f, 0x32c, 0x362, 0x1ac, 0xb, 0x4b, 0x1c6, 0x15d, 0x36d, 0xbd, 0x105, 0x135, 0x296, 0x3ff, 0x26b, 0x377, 0x3c5, 0x3d1, 0x3ea, 0x2, 0xad, 0x64, 0x215, 0x21a, 0x30b, 0x205, 0x37b, 0x2b, 0x289, 0x38f, 0x45, 0x285, 0x61, 0x11d, 0x2e0, 0x26, 0x335, 0x2e5, 0x32e, 0x3cf, 0x1c8, 0x21e, 0x251, 0x2cd, 0x358, 0x16, 0x96, 0x38c, 0x2ba, 0x2d3, 0x17a, 0x20a, 0x26a, 0x125, 0x3f7, 0xdf, 0x2e7, 0x383, 0x3ab, 0x3dd, 0x4, 0x15a, 0xc8, 0x23, 0x3d, 0x21f, 0x3, 0x2ff, 0x56, 0x11b, 0x317, 0x8a, 0x103, 0xc2, 0x23a, 0x1c9, 0x4c, 0x263, 0x1c3, 0x255, 0x397, 0x390, 0x35, 0xab, 0x193, 0x2b9, 0x2c, 0x12c, 0x311, 0x17d, 0x1af, 0x2f4, 0x1d, 0xad, 0xc8, 0x46, 0xf4, 0xdc, 0x30, 0x34f, 0x1ad, 0xbb, 0x1e4, 0x26d, 0x109, 0x1bf, 0x323, 0xef, 0x288, 0x3ba, 0x1dc, 0x43, 0x2ed, 0x334, 0x16e, 0x6b, 0x201, 0x4b, 0x38c, 0x17d, 0x35e, 0x3c2, 0xe8, 0x1cb, 0x1c2, 0xe, 0x28f, 0xf9, 0x3a4, 0x191, 0x21, 0x120, 0x1fe, 0x94, 0x24b, 0x36a, 0x239, 0x265, 0x68, 0x3f6, 0x113, 0x346, 0x61, 0x23a, 0x392, 0x130, 0x33c, 0xf, 0x222, 0x31, 0x3e2, 0x165, 0xfd, 0x110, 0x2b1, 0x139, 0x2f0, 0x28e, 0x54, 0x36c, 0x1d7, 0xd5, 0x1fc, 0x1ce, 0x3db, 0x3e6, 0x3d1, 0x3dd, 0x8, 0x161, 0x249, 0x230, 0x3a9, 0x2e9, 0x180, 0x24e, 0x173, 0x1d1, 0x33b, 0x34c, 0x5a, 0x1e3, 0x12e, 0x371, 0x6d, 0x1ef, 0x2fb, 0x218, 0x345, 0x196, 0x362, 0x358, 0x2c, 0x258, 0x5f, 0x3fa, 0x2c6, 0x22f, 0x349, 0x243, 0x20b, 0x70, 0x55, 0x3c1, 0x11f, 0x93, 0x108, 0x15a, 0x320, 0x230, 0x35b, 0x3b6, 0x1b, 0xa1, 0x233, 0xb5, 0x2df, 0x242, 0x145, 0x2e0, 0x98, 0x33c, 0x1e, 0x9a, 0x188, 0x257, 0xf3, 0x337, 0x132, 0xc5, 0x275, 0x15d, 0x1af, 0x3c2, 0x1d0, 0x325, 0x20b, 0xe0, 0x154, 0x237, 0x1d4, 0x244, 0x290, 0x32, 0x23, 0xf4, 0x1b8, 0xc0, 0x24e, 0x2e6, 0x34d, 0x1ee, 0xa5, 0x352, 0x2e, 0x20d, 0x335, 0x386, 0x28c, 0x21c, 0x3e2, 0x2ca, 0x3f4, 0x92, 0x34a, 0x361, 0x157, 0x1d9, 0xbd, 0x1d, 0x374, 0xe1, 0xe, 0x117, 0x3e4, 0x11f, 0x126, 0x29, 0x82, 0x2c7, 0x10d, 0x21f, 0xc, 0x3a3, 0x1ad, 0x176, 0x399, 0x34c, 0xb4, 0x385, 0x162, 0x375, 0x1bb, 0x32e, 0x327, 0xbf, 0x2a9, 0x13d, 0x88, 0x2b1, 0x272, 0x3d2, 0x5d, 0x149, 0x143, 0x135, 0x24a, 0x387, 0x3d6, 0x13c, 0x1d2, 0x191, 0x42, 0x89, 0x3eb, 0x152, 0x1e2, 0x306, 0x2ff, 0x158, 0x194, 0x2b4, 0x9b, 0x1a4, 0x1d5, 0x235, 0x2c9, 0x34, 0x3e5, 0x8a, 0xa, 0xec, 0x1e7, 0x273, 0x119, 0x1ef, 0x3fe, 0x1c8, 0xd4, 0x14d, 0x44, 0x2b1, 0xed, 0x353, 0x2e8, 0xbd, 0x3a, 0x1cb, 0x301, 0xe0, 0x2a8, 0xce, 0x2bb, 0x1, 0x2b4, 0x9b, 0x1a4, 0x1d5, 0x235, 0x2c9, 0x34, 0x3e5, 0x8a, 0xa, 0xec, 0x1e7, 0x273, 0x119, 0x1ef, 0x3fe, 0x1c8, 0xd4, 0x14d, 0x44, 0x2b1, 0xed, 0x353, 0x2e8, 0xbd, 0x3a, 0x1cb, 0x301, 0xe0, 0x2a8, 0xce, 0x2bb, 0x1, 0x2b4, 0x9b, 0x1a4, 0x1d5, 0x235, 0x2c9, 0x34, 0x3e5, 0x8a, 0xa, 0xec, 0x1e7, 0x273, 0x119, 0x1ef, 0x3fe, 0x1c8, 0xd4, 0x14d, 0x44, 0x2b1, 0xed, 0x353, 0x2e8, 0xbd, 0x3a, 0x1cb, 0x301, 0xe0, 0x2a8, 0xce, 0x2bb, 0x1, 0x2b4, 0x9b, 0x1a4, 0x1d5, 0x235, 0x2c9, 0x34, 0x3e5, 0x8a, 0xa, 0xec, 0x1e7, 0x273, 0x119, 0x1ef, 0x161, 0x26c, 0x13b, 0x16f, 0x239, 0x30c, 0x236, 0x238, 0x26d, 0x5a, 0x303, 0x302, 0x263, 0xf, 0x134, 0x5b, 0x262, 0x16e, 0x358, 0x160, 0x30d, 0x357, 0x54, 0x356, 0x135, 0x13a, 0xe, 0x55, 0x237, 0x359, 0x1, 0x161, 0x26c, 0x13b, 0x16f, 0x239, 0x30c, 0x236, 0x238, 0x26d, 0x5a, 0x303, 0x302, 0x263, 0xf, 0x134, 0x5b, 0x262, 0x16e, 0x358, 0x160, 0x30d, 0x357, 0x54, 0x356, 0x135, 0x13a, 0xe, 0x55, 0x237, 0x359, 0x1, 0x161, 0x26c, 0x13b, 0x16f, 0x239, 0x30c, 0x236, 0x238, 0x26d, 0x5a, 0x303, 0x302, 0x263, 0xf, 0x134, 0x5b, 0x262, 0x16e, 0x358, 0x160, 0x30d, 0x357, 0x54, 0x356, 0x135, 0x13a, 0xe, 0x55, 0x237, 0x359, 0x1, 0x161, 0x26c, 0x13b, 0x16f, 0x239, 0x30c, 0x236, 0x238, 0x26d, 0x5a, 0x303, 0x302, 0x263, 0xf, 0x134, 0x5b, 0x262, 0x16e, 0x358, 0x160, 0x30d, 0x2c2, 0x1a2, 0x1ca, 0x2dd, 0x3b9, 0x2b0, 0x176, 0xf7, 0x294, 0x28a, 0x253, 0x8b, 0x2ea, 0x379, 0xe4, 0x1a8, 0x27a, 0x92, 0x266, 0x1c6, 0x3fa, 0x33, 0x3da, 0xd5, 0x3ff, 0x1eb, 0xf9, 0x23e, 0x244, 0xad, 0x9b, 0x299, 0x16f, 0x7b, 0x2b, 0x194, 0x3c8, 0x12b, 0x2ad, 0x2e0, 0xc9, 0x2ab, 0x77, 0x10c, 0x21e, 0x2a2, 0x88, 0x1a5, 0x19f, 0x2ba, 0x2c6, 0x2b8, 0x34b, 0x1fc, 0xdf, 0x4f, 0x3a4, 0x126, 0x148, 0xc8, 0x69, 0x1d5, 0xc6, 0xc3, 0x11b, 0x238, 0xd3, 0x168, 0x2e, 0x4c, 0xeb, 0x3c0, 0x316, 0x3a6, 0xab, 0x20c, 0x35c, 0x1da, 0x2ae, 0x1af, 0x22f, 0xf5, 0x319, 0x1ce, 0x1c7, 0x138, 0x191, 0x210, 0x208, 0x46, 0x35b, 0x18f, 0x2c9, 0xd0, 0x227, 0x2c8, 0x212, 0x385, 0x302, 0xcf, 0x3c, 0x1b2, 0x1b9, 0xcb, 0x326, 0x333, 0x298, 0x3ad, 0x1d9, 0x1e1, 0x349, 0x71, 0x39b, 0x3db, 0x18d, 0x281, 0x24b, 0x183, 0x3d5, 0x173, 0x25e, 0x2d5, 0x308, 0x2f7, 0x1de, 0x368, 0xa3, 0x62, 0x14e, 0xb7, 0x2b9, 0x312, 0x178, 0xba, 0x17a, 0x3a0, 0x71, 0x33f, 0x377, 0x9c, 0x191, 0x29, 0x32, 0x230, 0x1d5, 0x18c, 0x30c, 0xca, 0x3c8, 0x256, 0x2a6, 0x32d, 0x8b, 0x1dd, 0x1ff, 0x329, 0x2b6, 0x3cb, 0xc1, 0x12c, 0x1f9, 0x20e, 0x1ab, 0x26a, 0x1c2, 0x1c0, 0x2da, 0x3d1, 0x34e, 0x48, 0x3eb, 0x10d, 0x1b8, 0x1b, 0x202, 0x3e5, 0x59, 0x280, 0x3c6, 0x302, 0x19e, 0xf0, 0x18b, 0x3a6, 0x156, 0x22, 0x2d6, 0x19f, 0x17d, 0x30a, 0x1ed, 0xd5, 0x3f7, 0x3a5, 0x3c1, 0x3a8, 0x2, 0x31a, 0x10b, 0x9f, 0x306, 0x3a3, 0x2e6, 0xb5, 0x1a3, 0x219, 0x1e7, 0x3bc, 0x2d9, 0x146, 0xc4, 0x29c, 0x16e, 0x17b, 0x22d, 0x2f0, 0x174, 0x2f4, 0x349, 0xe2, 0x277, 0x2e7, 0x138, 0x322, 0x52, 0x64, 0x69, 0x3aa, 0x31a, 0x216, 0x27c, 0x6, 0x24e, 0x6f, 0x113, 0x14, 0x1bf, 0x162, 0x263, 0x78, 0x18b, 0x345, 0x151, 0x110, 0x133, 0x38c, 0x3ef, 0x269, 0x2a3, 0x13a, 0x70, 0x16d, 0x3d1, 0x295, 0x120, 0x367, 0xf4, 0x365, 0x2c9, 0x340, 0x238, 0x34c, 0x2ad, 0x392, 0x8b, 0x3ba, 0x3f5, 0x17e, 0x33a, 0x18e, 0x2c, 0x30d, 0x28e, 0x12d, 0xe8, 0x23c, 0x33f, 0x2e7, 0x270, 0x93, 0x290, 0x249, 0x13b, 0x36a, 0x37b, 0x1ad, 0x293, 0x36e, 0x308, 0x1e7, 0x371, 0x376, 0x222, 0x5b, 0x334, 0x326, 0xd7, 0x1da, 0x2aa, 0x2c6, 0x2f2, 0xd5, 0x3e7, 0x28f, 0x237, 0x2fe, 0x40, 0x339, 0xa9, 0x21f, 0x180, 0x284, 0x3f6, 0x59, 0x109, 0x303, 0x26, 0x1d6, 0x23f, 0x218, 0xd4, 0xfd, 0x99, 0x4b, 0x2f8, 0x20e, 0x356, 0x1ba, 0x20b, 0x3f, 0x3e6, 0x195, 0x21, 0x82, 0x46, 0x177, 0xc6, 0x30c, 0x194, 0x33b, 0x294, 0x23a, 0x23d, 0x4a, 0x3c4, 0x60, 0x142, 0x3f6, 0xb2, 0x2d, 0x2e, 0x260, 0x2be, 0x2fb, 0x25b, 0x19d, 0x18e, 0x58, 0x2f, 0x5d, 0x2f4, 0x13f, 0x23b, 0xdf, 0x278, 0xea, 0x2, 0x73, 0x94, 0x381, 0xc0, 0x284, 0x3e5, 0x164, 0x5a, 0x5c, 0xc9, 0x175, 0x1ff, 0xbf, 0x33a, 0x31c, 0xb0, 0x5e, 0xba, 0x1e1, 0x27e, 0x7f, 0x1be, 0xf9, 0x1d4, 0x4, 0xe6, 0x128, 0x30b, 0x180, 0x101, 0x3c3, 0x2c8, 0xb4, 0xb8, 0x192, 0x2ea, 0x3fe, 0x17e, 0x27d, 0x231, 0x160, 0xbc, 0x174, 0x3c2, 0xf5, 0xfe, 0x37c, 0x1f2, 0x3a8, 0x8, 0x1cc, 0x250, 0x21f, 0x300, 0x202, 0x38f, 0x199, 0x168, 0x170, 0x324, 0x1dd, 0x3f5, 0x2fc, 0xf3, 0x6b, 0x2c0, 0x178, 0x2e8, 0x38d, 0x1ea, 0x1fc, 0x2f1, 0x3e4, 0x359, 0x10, 0x398, 0xa9, 0x37, 0x209, 0xd, 0x317, 0x332, 0x2d0, 0x2e0, 0x241, 0x3ba, 0x3e3, 0x1f1, 0x1e6, 0x73, 0x128, 0x21f, 0x209, 0x1a, 0x47, 0x1a6, 0x153, 0xaf, 0x144, 0x2cf, 0x31, 0x131, 0x2cd, 0xd7, 0x361, 0x2fa, 0xcc, 0x355, 0x274, 0x380, 0x1f3, 0x32a, 0x108, 0x64, 0x348, 0x36a, 0x1f7, 0x2e6, 0x1a1, 0xa, 0x37e, 0x302, 0xeb, 0x77, 0xe4, 0x2b6, 0x267, 0x2c, 0x2f, 0xba, 0x3c2, 0x1ea, 0x3f8, 0x3d6, 0x31f, 0x1f5, 0x200, 0x3f1, 0x3d, 0x365, 0x336, 0x65, 0x33b, 0x242, 0x3e8, 0xef, 0x1bb, 0x4d, 0x2d8, 0x251, 0x44, 0x133, 0x22b, 0x287, 0x356, 0x2e1, 0xf8, 0x3db, 0x138, 0x126, 0xad, 0x1a2, 0x9f, 0x6, 0x12a, 0x2f9, 0x59, 0x2d, 0x5c, 0x192, 0x1dd, 0x3e3, 0x3e2, 0x391, 0x2b9, 0xa6, 0x2af, 0x2b5, 0x2f2, 0x354, 0x207, 0x2a8, 0x3ec, 0x123, 0x112, 0x23, 0x2ee, 0x239, 0x158, 0x3a2, 0x36e, 0x3b, 0x24f, 0x1cf, 0x3c, 0x316, 0x21e, 0x27a, 0x132, 0x258, 0x3af, 0x149, 0xe8, 0xe6, 0xa9, 0xdc, 0xd8, 0x340, 0x1e4, 0x294, 0x1f4, 0xef, 0x376, 0x134, 0x2ed, 0x151, 0x92, 0x4b, 0x3ed, 0x2a0, 0xe8, 0x1c4, 0x26b, 0xf9, 0x359, 0x40, 0x1fe, 0x21a, 0x365, 0x265, 0x194, 0x1ee, 0x61, 0x1e7, 0x3be, 0xf, 0x18b, 0x21e, 0xfd, 0xc1, 0x2e4, 0x28e, 0x17a, 0x27e, 0x1fc, 0x3d6, 0x237, 0x3dd, 0x24, 0x367, 0x3a9, 0xc6, 0x56, 0x1d1, 0x36e, 0x76, 0x12e, 0x263, 0x3c0, 0x218, 0x2a9, 0x337, 0x2c, 0x5e, 0x2e8, 0x22f, 0x29f, 0x3e7, 0x55, 0xfb, 0x295, 0x112, 0x46, 0x3aa, 0x1ec, 0x1ad, 0xb5, 0x206, 0x1bf, 0x302, 0x1d6, 0x1dc, 0x329, 0x33a, 0x6b, 0x312, 0x3ad, 0x35e, 0x2f2, 0x2a1, 0xe, 0x16d, 0x2b7, 0x21, 0x19, 0x1a4, 0x36a, 0x3ee, 0x38a, 0x113, 0xa0, 0x303, 0x130, 0x175, 0x3f5, 0x3e2, 0x32b, 0x2f6, 0x139, 0x2aa, 0x21d, 0x1d7, 0x13a, 0x380, 0x3e6, 0xb3, 0x52, 0x1cc, 0x2a4, 0x2e9, 0x19b, 0xca, 0x1ee, 0xc2, 0x395, 0x1cf, 0xf0, 0x10c, 0x2a9, 0x267, 0xb0, 0x2f0, 0x2d3, 0x179, 0x2a1, 0x1c, 0x1bd, 0x195, 0x210, 0x320, 0x1ca, 0x205, 0x12a, 0x3f6, 0x199, 0x352, 0xaf, 0x119, 0xa3, 0x5b, 0x32c, 0x88, 0x18a, 0x1f9, 0x150, 0xe8, 0x388, 0x1be, 0x3c1, 0x1f5, 0x12, 0x367, 0x35b, 0x318, 0x2b0, 0x12f, 0x103, 0x1bf, 0x20d, 0x351, 0x2fb, 0x2fc, 0x391, 0x2f6, 0x272, 0x2ba, 0xcc, 0x14f, 0x301, 0x1f8, 0x9c, 0x24c, 0x161, 0x25, 0x30b, 0x1b, 0xd0, 0xf2, 0x294, 0x3e8, 0x3bc, 0x386, 0x364, 0x10f, 0xfd, 0x182, 0x382, 0x5d, 0x38d, 0x34b, 0x3e7, 0xaa, 0x3ec, 0x85, 0x104, 0xd2, 0x36a, 0x3d5, 0x233, 0x8a, 0x212, 0xb8, 0x8b, 0x3de, 0x21c, 0x262, 0x245, 0x2d6, 0x38c, 0x287, 0x143, 0x243, 0x277, 0x4f, 0xea, 0x10, 0xff, 0x21a, 0x2c3, 0x186, 0xbb, 0x398, 0x282, 0x365, 0x186, 0x176, 0x36e, 0x1d8, 0x2c4, 0x1d6, 0x379, 0x2fc, 0x32b, 0x3ca, 0x3b4, 0x3fa, 0x1b6, 0x374, 0x3e0, 0x38e, 0x23e, 0x8, 0xff, 0x3d, 0x31e, 0x2b, 0x3a2, 0x346, 0x2db, 0x20d, 0x2ab, 0x3fe, 0x3cd, 0x16e, 0x26f, 0x19f, 0x3ef, 0x1ab, 0x396, 0x33f, 0x4f, 0x1d4, 0x40, 0x3f1, 0x1e8, 0xc6, 0x158, 0x12f, 0x206, 0x2f5, 0x4c, 0x175, 0x3cf, 0x257, 0x362, 0x35c, 0xe3, 0x347, 0x143, 0x8f, 0x1ce, 0x278, 0x2bb, 0x200, 0x3b7, 0x35b, 0x239, 0x2d2, 0x16a, 0x14, 0x385, 0x260, 0x3ba, 0x247, 0x29c, 0x326, 0x2d6, 0x311, 0x20e, 0x20a, 0x71, 0x26b, 0x3e4, 0x1f5, 0x24, 0x187, 0x2ee, 0x1ec, 0x2bd, 0x342, 0xa0, 0x17, 0x324, 0x1ef, 0x21c, 0xcd, 0x106, 0x29d, 0xbe, 0x54, 0x74, 0x388, 0x37c, 0x31f, 0x3b3, 0x120, 0x23, 0x35d, 0x37b, 0x1c5, 0x226, 0x109, 0xb8, 0x116, 0x363, 0x339, 0x21a, 0x31e, 0x56, 0x293, 0x206, 0x1e3, 0x130, 0x3ba, 0x87, 0x262, 0x106, 0x133, 0x2f8, 0x2a0, 0x349, 0x1fc, 0x28f, 0xfb, 0x85, 0x19, 0x13b, 0x306, 0x254, 0x38f, 0x34c, 0x23a, 0xef, 0x386, 0x18b, 0xd4, 0x337, 0x160, 0x3ad, 0x2c6, 0x1d7, 0x1c2, 0x1f8, 0x270, 0x81, 0xe6, 0x141, 0x365, 0x30c, 0x1d1, 0x346, 0x1bf, 0x26, 0x175, 0x397, 0x14e, 0x326, 0x1a5, 0x5f, 0x54, 0xe8, 0x23b, 0x3d6, 0x19c, 0x295, 0x82, 0x1a4, 0x366, 0x24e, 0x3f6, 0x26d, 0x145, 0x39a, 0x376, 0x1b2, 0x21e, 0x3e1, 0x2c, 0x2f0, 0x35e, 0x3bd, 0x13a, 0x3f, 0x4e, 0x91, 0x31a, 0xa9, 0x2e9, 0x265, 0xbb, 0x36e, 0x3b0, 0x302, 0x2ab, 0x3f5, 0x32f, 0x362, 0x2b1, 0x38c, 0x20e, 0x1d, 0x1c4, 0x37c, 0x237, 0x2d7, 0x112, 0x230, 0x36a, 0x34f, 0x378, 0x2c8, 0x2ad, 0x171, 0x368, 0x134, 0x345, 0xfd, 0x201, 0x5e, 0x27b, 0x7a, 0xc6, 0x169, 0x2d4, 0xa0, 0x5c, 0x22c, 0x32e, 0xb6, 0x2ac, 0x99, 0x1c1, 0x174, 0x15c, 0x14b, 0x1c0, 0x30f, 0x126, 0x18d, 0xa9, 0x1db, 0x186, 0x1d1, 0x285, 0x2f5, 0x130, 0x37d, 0x21c, 0x334, 0x44, 0x221, 0x357, 0x2f4, 0x34b, 0x307, 0x2da, 0x25d, 0x290, 0x281, 0x30b, 0xd8, 0x65, 0x3b1, 0x76, 0x2c4, 0x351, 0x3f5, 0x257, 0x193, 0x1a5, 0xbe, 0x150, 0x349, 0x3f8, 0x22e, 0x3d1, 0x42, 0x320, 0x24b, 0x60, 0x34, 0x1e4, 0x11a, 0x395, 0x263, 0x77, 0xbf, 0x32b, 0x333, 0x33e, 0x347, 0x105, 0xe2, 0x37c, 0x67, 0x34e, 0x82, 0x348, 0x183, 0x254, 0x317, 0x12b, 0x1f4, 0x2eb, 0x3c, 0x218, 0x2ca, 0x1ac, 0x139, 0x2fa, 0x1b6, 0x1cb, 0x277, 0x278, 0x2fe, 0x48, 0x23, 0x16f, 0x3d5, 0x1bc, 0x2c8, 0x153, 0x1cd, 0x376, 0x364, 0x6a, 0x337, 0x2c0, 0x2af, 0x21d, 0x14f, 0x3e, 0x2e7, 0xff, 0x1e8, 0x239, 0x2bd, 0x226, 0x5a, 0x253, 0xda, 0x134, 0x10f, 0x3cb, 0x160, 0x2af, 0x33, 0x135, 0x1f0, 0x223, 0x359, 0x12, 0x215, 0x16f, 0x3a3, 0x2f9, 0x26d, 0x11d, 0x1de, 0xf, 0x10c, 0x2ca, 0x358, 0xed, 0x3fd, 0x356, 0x11e, 0xdf, 0x237, 0x34e, 0x104, 0x13b, 0x3, 0x101, 0x238, 0x242, 0x3ce, 0x263, 0xee, 0x2fc, 0x16e, 0x35c, 0x311, 0x54, 0x3a0, 0x3f8, 0x55, 0x35f, 0x210, 0x26c, 0x1e2, 0x36, 0x236, 0x3b1, 0xec, 0x302, 0x2be, 0x327, 0x262, 0x11, 0x314, 0x357, 0x1e1, 0x137, 0xe, 0x1f3, 0x322, 0x161, 0x250, 0x1db, 0x30c, 0x34d, 0x5, 0x303, 0x241, 0x2cf, 0x5b, 0x2ac, 0x132, 0x30d, 0x3b2, 0x1ed, 0x13a, 0xfc, 0xe9, 0x1, 0xff, 0x1e8, 0x239, 0x2bd, 0x226, 0x5a, 0x253, 0xda, 0x134, 0x10f, 0x3cb, 0x160, 0x2af, 0x33, 0x135, 0x1f0, 0x223, 0x359, 0x12, 0x215, 0x16f, 0x1fe, 0x3a9, 0x1ec, 0x38a, 0x59, 0x2ad, 0x39a, 0x386, 0x43, 0x165, 0x358, 0x1da, 0x3ef, 0x286, 0x1c4, 0x3d6, 0xfb, 0x21, 0x249, 0x27c, 0x1b, 0x236, 0x36b, 0x3b0, 0x26, 0x3ba, 0x31, 0x196, 0x92, 0x2e4, 0x2e8, 0x2f2, 0x13a, 0x1f8, 0x3a4, 0x8, 0x3eb, 0x177, 0x37b, 0x6f, 0x2c8, 0x145, 0xef, 0xf, 0x218, 0x33a, 0x2f6, 0x2cb, 0x347, 0x1d, 0x23b, 0x28f, 0x3d1, 0x108, 0x26c, 0x3c4, 0xd8, 0x194, 0x36e, 0x1bf, 0x130, 0x1ef, 0x188, 0xab, 0x99, 0x30d, 0x36d, 0x3bd, 0x1c2, 0x3db, 0x11f, 0x40, 0x367, 0x3aa, 0x3ee, 0x378, 0x26d, 0x23a, 0x371, 0x78, 0xe4, 0x1e6, 0x39d, 0x275, 0x20e, 0xe8, 0x1fc, 0x55, 0x2b7, 0x52, 0x344, 0x21f, 0x2c9, 0xbb, 0x346, 0x1e3, 0x192, 0x363, 0x5b, 0x151, 0xc1, 0x5e, 0x35e, 0x1d7, 0x20b, 0x2e7, 0xea, 0x200, 0x30e, 0x16f, 0x34f, 0x3f6, 0x34c, 0x1f4, 0x3fc, 0x2bf, 0x37b, 0xde, 0x332, 0x23a, 0x2eb, 0x1e0, 0x329, 0x25f, 0x35c, 0x5f, 0x149, 0x1ea, 0x307, 0x2fd, 0x24d, 0x31a, 0x282, 0x63, 0x1ad, 0x226, 0x168, 0x171, 0x2e5, 0x225, 0x165, 0x2b9, 0x361, 0x347, 0x3a, 0xfe, 0x55, 0x167, 0x148, 0x216, 0x1b8, 0x186, 0x293, 0x28, 0xb8, 0x288, 0x4d, 0x10f, 0x337, 0x22d, 0x2ba, 0x36c, 0x8f, 0x1be, 0x19c, 0x10a, 0x320, 0x27c, 0x36, 0xca, 0x36e, 0x37e, 0xc9, 0x363, 0xb6, 0x14d, 0x201, 0x1e9, 0x30a, 0x135, 0x3c9, 0x278, 0x3dd, 0x224, 0x299, 0x6, 0x1a, 0x399, 0x308, 0x2c4, 0x2be, 0x87, 0x261, 0x49, 0x2e4, 0x1d9, 0x3da, 0x1c2, 0x3bf, 0x75, 0x200, 0x215, 0x1b5, 0x24e, 0x317, 0x14a, 0x1e7, 0xcf, 0x379, 0x32f, 0x245, 0xc5, 0x357, 0x38d, 0x354, 0x380, 0x9c, 0x204, 0x1fe, 0x35b, 0x3b9, 0x6f, 0x199, 0x11d, 0x371, 0xf0, 0x390, 0x32b, 0x3f1, 0x2ee, 0x3ee, 0x1fb, 0x291, 0x3bb, 0x335, 0x3b8, 0x32f, 0x83, 0x314, 0x28e, 0xae, 0x24a, 0x1f8, 0x28b, 0x80, 0x30e, 0x1b5, 0x95, 0x47, 0x242, 0x24f, 0x1d6, 0x3cf, 0xcd, 0x110, 0x172, 0x1d9, 0x3bd, 0x301, 0x1c7, 0x359, 0x90, 0x69, 0x306, 0x202, 0x3c8, 0x308, 0x181, 0x2ea, 0x31, 0x251, 0x132, 0x5e, 0x163, 0x14f, 0x3e0, 0x278, 0x3b3, 0x82, 0xe5, 0x60, 0x340, 0x3b1, 0x369, 0x130, 0x3b5, 0xb6, 0x29a, 0x16, 0x353, 0xcc, 0x2e1, 0x39c, 0x237, 0x246, 0x190, 0x27c, 0x6c, 0x328, 0x346, 0x385, 0x116, 0x146, 0x3a6, 0x3cb, 0x312, 0x2ba, 0x2d1, 0x23c, 0x1eb, 0x1f6, 0x108, 0x1a2, 0x37, 0x265, 0x34d, 0x28, 0x170, 0x232, 0x268, 0xd4, 0x231, 0x272, 0x3ef, 0x20a, 0x7f, 0x55, 0x2ce, 0x129, 0x94, 0x3b6, 0xac, 0x1a1, 0x2d, 0x15e, 0x376, 0x225, 0x2ca, 0x2f6, 0x33e, 0x15, 0x349, 0x3eb, 0x3aa, 0x34f, 0x38f, 0x294, 0x323, 0x1d6, 0x397, 0x334, 0x92, 0x30d, 0x35e, 0x2a3, 0x3e0, 0xf9, 0x2d7, 0x19, 0x24b, 0x1b, 0x194, 0x346, 0x303, 0x51, 0x222, 0x21e, 0x18e, 0x139, 0x3ef, 0x1d, 0x1fc, 0x2a8, 0xb3, 0x161, 0x141, 0xc6, 0x173, 0x59, 0x145, 0x371, 0x3c0, 0x17e, 0x362, 0x133, 0x357, 0x22f, 0x125, 0x1f8, 0x11f, 0x200, 0x46, 0x366, 0x284, 0x1e4, 0x308, 0x302, 0x3ba, 0x188, 0x151, 0x201, 0x3ad, 0xcc, 0x1cb, 0x26b, 0x19c, 0x21, 0x26c, 0x21f, 0x265, 0x293, 0xa0, 0x392, 0x368, 0x18b, 0x165, 0x2f6, 0x275, 0x54, 0x27e, 0x307, 0x3e6, 0x91, 0x339, 0x3a9, 0x37b, 0x378, 0x34c, 0x3bb, 0x263, 0x2fb, 0x14e, 0x22, 0x258, 0x2e8, 0x3bd, 0x20b, 0x315, 0x2fe, 0x112, 0x13b, 0x30, 0x340, 0x36b, 0x1bf, 0x192, 0x32e, 0x2ed, 0x3e1, 0x312, 0x17d, 0x356, 0x1c4, 0x28f, 0x2b7, 0x290, 0x3df, 0x2b3, 0x24e, 0x8e, 0x234, 0x162, 0x2ea, 0xc4, 0x151, 0xb, 0x2af, 0x269, 0x8f, 0x1eb, 0x3d1, 0xa4, 0x4a, 0x365, 0x169, 0x45, 0x2ad, 0x1de, 0x1e0, 0x17e, 0x2cd, 0xc5, 0x28e, 0x2b8, 0xe1, 0x2e7, 0x2bb, 0x89, 0x13b, 0x60, 0x11b, 0x36e, 0x3c6, 0x22c, 0x222, 0x35, 0x231, 0x1da, 0x287, 0x3a0, 0x3e7, 0x2fd, 0x24c, 0x339, 0x35b, 0x1f7, 0x3f6, 0xa5, 0x395, 0x1d6, 0x327, 0xcb, 0x99, 0xbc, 0x30a, 0x1ba, 0x39c, 0xce, 0x21, 0xd1, 0x6e, 0x30c, 0x16a, 0x2d, 0x171, 0x305, 0x72, 0x32b, 0x16b, 0x3f2, 0x3c2, 0x14b, 0xfc, 0x11f, 0x9, 0x118, 0x306, 0x1a, 0xf7, 0x3b0, 0x260, 0x197, 0x2ed, 0x3cb, 0x53, 0x3fa, 0x105, 0xfe, 0x2a8, 0x166, 0x18d, 0x21a, 0x7b, 0x233, 0x26d, 0x3e8, 0x335, 0x2fb, 0x29c, 0x88, 0x2e4, 0x2d3, 0x355, 0x3e0, 0x1f2, 0x34e, 0xc8, 0xf1, 0x360, 0x1d1, 0x3b7, 0x2de, 0x254, 0xf2, 0x219, 0x26, 0x3b5, 0x1b9, 0x3e1, 0x53, 0x3fd, 0x1d, 0x3f9, 0x2da, 0x93, 0x398, 0x35b, 0x3ee, 0x3c3, 0x121, 0x12e, 0x2be, 0x62, 0x151, 0x16, 0x2ae, 0x36c, 0xe2, 0x117, 0x195, 0x2b4, 0x282, 0x239, 0x233, 0xd3, 0x3bb, 0x19e, 0x3e3, 0x334, 0x248, 0xbc, 0x21d, 0x2e1, 0xdf, 0xfb, 0x29, 0x25, 0x365, 0x2d2, 0x114, 0x145, 0x1df, 0x77, 0x32f, 0x11, 0xb9, 0x36d, 0x355, 0x3c9, 0x3c1, 0x246, 0x9b, 0x21f, 0x186, 0x16a, 0x5a, 0x1cd, 0x1e, 0x329, 0x1b1, 0x266, 0x28e, 0x179, 0x384, 0x315, 0x3ea, 0x104, 0x24b, 0x6c, 0x176, 0x14, 0x1c9, 0x2d9, 0x43, 0xf3, 0x1ae, 0x2f8, 0x1e1, 0x14b, 0x1f8, 0x75, 0x48, 0x1a4, 0x18, 0x289, 0x36e, 0x385, 0xa2, 0x134, 0x350, 0x2b9, 0x275, 0x150, 0x3a1, 0x70, 0x138, 0x10, 0x30e, 0x1b3, 0x101, 0x33b, 0x1d8, 0x260, 0x32e, 0x367, 0x36a, 0x284, 0x33b, 0x3b0, 0x192, 0x146, 0x21e, 0x6b, 0x2cb, 0x54, 0x3d4, 0x70, 0x270, 0x40, 0x46, 0x306, 0x68, 0x36b, 0x1e3, 0x51, 0x134, 0x2a9, 0x2f6, 0x38c, 0x12d, 0xd5, 0x3f, 0x11f, 0x24, 0x1a4, 0x30, 0x236, 0x346, 0x2e, 0x6d, 0x18b, 0x33a, 0xd7, 0x2f8, 0x3c2, 0x125, 0x3db, 0x359, 0x112, 0x1ca, 0x1b, 0xbb, 0x14, 0x392, 0x376, 0x218, 0x32b, 0x1a5, 0x357, 0x15c, 0x1c2, 0x315, 0x3dd, 0x19, 0x27c, 0x2c9, 0x293, 0x109, 0x171, 0xf, 0x329, 0x362, 0x18a, 0x5d, 0x3bd, 0x7c, 0xf9, 0x295, 0x249, 0x21f, 0x30c, 0x1a1, 0x2d0, 0xef, 0x3c0, 0x3e2, 0x106, 0x258, 0x36d, 0x2a3, 0x33f, 0x237, 0x21, 0x344, 0x2e9, 0x2b0, 0x8a, 0x145, 0x3be, 0x1dc, 0x14e, 0x110, 0x30d, 0x2c6, 0x1ba, 0x26b, 0xfb, 0x52, 0x94, 0x31e, 0x173, 0x2c8, 0x1f4, 0x263, 0x3f5, 0x334, 0x99, 0x2f0, 0x2c7, 0x1b3, 0xd, 0x3dc, 0x2f5, 0x51, 0x268, 0x2b6, 0x39d, 0xbe, 0x1e1, 0x125, 0x3bf, 0x17f, 0x82, 0x9f, 0x360, 0x293, 0x212, 0x1cd, 0x78, 0x2fc, 0x83, 0x258, 0x2d3, 0x29e, 0x1ce, 0x338, 0x29, 0x94, 0x235, 0x1c5, 0x26d, 0x37f, 0xeb, 0x87, 0x156, 0x16, 0x2aa, 0x2a5, 0xfe, 0x16d, 0x126, 0xff, 0x3aa, 0x95, 0xf2, 0x76, 0x260, 0xa3, 0x21e, 0xd6, 0x33e, 0x2a0, 0x137, 0x21b, 0x11f, 0x48, 0x299, 0x180, 0x328, 0xa, 0x392, 0x2e5, 0x72, 0x16e, 0x266, 0x22a, 0x3bd, 0xf8, 0x3e4, 0x85, 0xd1, 0x370, 0x2b0, 0x114, 0x11d, 0x1cf, 0x1ff, 0x19a, 0x99, 0x1e9, 0x330, 0x23c, 0x117, 0x25d, 0x31a, 0x1e8, 0x1f7, 0x38f, 0x11a, 0x181, 0x1ef, 0x1b9, 0x39f, 0x139, 0x287, 0x13f, 0xe, 0x9c, 0x20, 0x46, 0x205, 0x1a0, 0x36e, 0x20f, 0x232, 0x18b, 0x27d, 0x35c, 0x3ed, 0x57, 0xe1, 0x315, 0x187, 0x2c5, 0x68, 0x1b7, 0x20f, 0x6d, 0x225, 0x3cc, 0x1a5, 0x147, 0x1ed, 0x7c, 0x3e4, 0x10a, 0x344, 0x3b6, 0x35a, 0x2c8, 0x3d9, 0x271, 0x87, 0x2ac, 0x58, 0x17d, 0x20a, 0x3ff, 0x3e6, 0x204, 0x2c7, 0x366, 0x34, 0x2df, 0x303, 0x232, 0x316, 0x1e6, 0x2d6, 0x2a7, 0x2f2, 0x3e, 0x1f2, 0x85, 0x1a2, 0x1db, 0x1ad, 0x164, 0x3e8, 0x33c, 0x247, 0x156, 0x2c, 0x2ba, 0x105, 0x3fb, 0x1f3, 0x102, 0x367, 0x1b3, 0x1a, 0x36b, 0x385, 0x119, 0x18b, 0xf3, 0x16b, 0x357, 0x179, 0x1f, 0xf9, 0x246, 0xd1, 0x2e9, 0x2d2, 0xb2, 0x1f4, 0x19e, 0x327, 0xab, 0x16, 0x15d, 0x286, 0x3f9, 0x2fd, 0x81, 0x3b7, 0x2dd, 0xd, 0x3b1, 0x3c6, 0x288, 0x2c1, 0x27d, 0x2b1, 0x3af, 0x2b8, 0x20b, 0x278, 0x123, 0x26c, 0x370, 0x169, 0x59, 0xfa, 0xcf, 0x397, 0x251, 0xb, 0x2aa, 0x143, 0x3f8, 0x37a, 0x244, 0x3df, 0x36a, 0x30e, 0x306, 0x340, 0x346, 0x170, 0x376, 0xe4, 0x362, 0x4b, 0x36d, 0x135, 0x26b, 0x3d1, 0xad, 0x21a, 0x37b, 0x38f, 0x61, 0x26, 0x32e, 0x21e, 0x358, 0x38c, 0x17a, 0x125, 0x2e7, 0x3dd, 0xc8, 0x21f, 0x56, 0x8a, 0x23a, 0x263, 0x397, 0xab, 0x2c, 0x17d, 0x1d, 0x3e7, 0x30f, 0x8, 0x46, 0x6, 0x236, 0x206, 0x392, 0x386, 0x329, 0x326, 0x258, 0x35e, 0x1ba, 0x37c, 0x2b7, 0x161, 0xf4, 0x3ee, 0x47, 0x308, 0x130, 0x146, 0xd4, 0x2f6, 0x5f, 0x3c2, 0x13a, 0x315, 0x2d7, 0x249, 0xdc, 0x2b0, 0x59, 0x1f4, 0x33c, 0x87, 0x151, 0x160, 0x3fa, 0xe8, 0x307, 0x4e, 0x40, 0x230, 0x30, 0x194, 0x14, 0xaf, 0xf, 0x17e, 0x106, 0x2e4, 0x2c6, 0x1cb, 0x3d6, 0x195, 0x31a, 0x3a9, 0x34f, 0x238, 0x76, 0x192, 0x222, 0x2a9, 0x39d, 0x2f8, 0x22f, 0x1c2, 0x9e, 0x295, 0x26c, 0x2e9, 0x1ad, 0x2c8, 0x3bb, 0x215, 0x3, 0x236, 0x5, 0x253, 0xf, 0x2fc, 0x11, 0x30d, 0x33, 0x11e, 0x55, 0x322, 0xff, 0x16f, 0x101, 0x3b1, 0x303, 0xda, 0x10c, 0x16e, 0x314, 0x3b2, 0x135, 0xdf, 0x35f, 0x161, 0x1e8, 0x3a3, 0x238, 0xec, 0x241, 0x134, 0x2ca, 0x35c, 0x357, 0x1ed, 0x1f0, 0x237, 0x210, 0x250, 0x239, 0x2f9, 0x242, 0x302, 0x2cf, 0x10f, 0x358, 0x311, 0x1e1, 0x13a, 0x223, 0x34e, 0x26c, 0x1db, 0x2bd, 0x26d, 0x3ce, 0x2be, 0x5b, 0x3cb, 0xed, 0x54, 0x137, 0xfc, 0x359, 0x104, 0x1e2, 0x30c, 0x226, 0x11d, 0x263, 0x327, 0x2ac, 0x160, 0x3fd, 0x3a0, 0xe, 0xe9, 0x12, 0x13b, 0x36, 0x34d, 0x5a, 0x1de, 0xee, 0x262, 0x132, 0x2af, 0x356, 0x3f8, 0x1f3, 0x1, 0x215, 0x3, 0x236, 0x5, 0x253, 0xf, 0x2fc, 0x11, 0x30d, 0x33, 0x11e, 0x55, 0x322, 0xff, 0x16f, 0x101, 0x3b1, 0x303, 0xda, 0x10c, 0x16e, 0x23, 0xc, 0x194, 0x50, 0x2e2, 0x3c0, 0xa7, 0x124, 0x3ad, 0x1ab, 0x3f8, 0x3e6, 0x4, 0x8c, 0x30, 0x259, 0x140, 0x39a, 0x31b, 0x29c, 0x99, 0x2af, 0x2a5, 0x3fb, 0x383, 0x10, 0x230, 0xc0, 0x176, 0x109, 0x273, 0x77, 0x262, 0x264, 0x2ae, 0x286, 0x3f7, 0x217, 0x40, 0xd2, 0x300, 0x1d1, 0x2d, 0x1de, 0x1dc, 0x19a, 0x182, 0x2aa, 0x20a, 0x3c7, 0x4e, 0x100, 0x348, 0x1b, 0x34d, 0xb4, 0x371, 0x379, 0x261, 0x201, 0x2ba, 0x3a, 0x307, 0x138, 0x9, 0x13b, 0x6c, 0x12f, 0x2d0, 0x1df, 0x1ff, 0x196, 0x16, 0x2fa, 0xe8, 0x7, 0xe9, 0x24, 0xe5, 0x1b0, 0xb5, 0x352, 0x375, 0x3f5, 0x251, 0x58, 0x3fa, 0x3a0, 0x1c, 0x3a4, 0x90, 0x394, 0x2c9, 0x2d4, 0x153, 0x1cf, 0x3cf, 0x156, 0x160, 0x3f3, 0x29b, 0x70, 0x28b, 0x240, 0x24b, 0x336, 0x342, 0x145, 0x335, 0x327, 0x151, 0x189, 0x3d7, 0x27e, 0x46, 0x30, 0xbb, 0x109, 0xef, 0x1dc, 0x334, 0x201, 0x17d, 0xe8, 0xe, 0x3a4, 0x120, 0x24b, 0x265, 0x113, 0x23a, 0x33c, 0x31, 0xfd, 0x139, 0x54, 0xd5, 0x3db, 0x3dd, 0x249, 0x2e9, 0x173, 0x34c, 0x12e, 0x1ef, 0x345, 0x358, 0x5f, 0x22f, 0x20b, 0x3c1, 0x108, 0xa9, 0x1ec, 0x38f, 0x308, 0x192, 0x134, 0x33a, 0x1a5, 0x5d, 0x2a3, 0x26b, 0x2b7, 0x31a, 0x177, 0x254, 0x1ee, 0x303, 0x368, 0xe4, 0x326, 0x2e4, 0x21d, 0x23c, 0x2a8, 0x91, 0x367, 0x306, 0x236, 0x14, 0x171, 0x3c0, 0x14e, 0x99, 0x157, 0x286, 0x3e7, 0x4e, 0x200, 0x13b, 0xd8, 0xb5, 0x2ad, 0x1cf, 0x397, 0x151, 0x312, 0x347, 0x3d4, 0x3f, 0x359, 0x19, 0x21f, 0x2b0, 0x2c8, 0x1e7, 0x175, 0x2d8, 0x18e, 0x275, 0x17a, 0x13a, 0x9e, 0x85, 0x216, 0xc6, 0x378, 0x8d, 0x26, 0x146, 0x2a9, 0xd7, 0x357, 0x3bd, 0x33f, 0xfb, 0xad, 0x8c, 0xc0, 0x1d1, 0xb4, 0x1df, 0x3f5, 0x156, 0x189, 0x347, 0x3a1, 0xfc, 0x2fe, 0x190, 0x370, 0x173, 0x291, 0xb1, 0x363, 0x35, 0x3ca, 0x3ed, 0x1ed, 0x39b, 0xfb, 0x15a, 0x3d0, 0x24e, 0x27f, 0x385, 0x368, 0x1c8, 0x83, 0x30d, 0x198, 0x319, 0x37a, 0x2, 0x118, 0x180, 0x3a2, 0x168, 0x3be, 0x3e3, 0x2ac, 0x312, 0x287, 0x34b, 0x1f8, 0x1f5, 0x320, 0x2e9, 0x2e6, 0x12b, 0x162, 0x2cf, 0x6a, 0x39d, 0x3d3, 0x3da, 0x33f, 0x1f6, 0x2b4, 0x3a9, 0x95, 0xf7, 0x303, 0x2d9, 0x390, 0x106, 0x213, 0x330, 0x23b, 0x2fd, 0x4, 0x230, 0x300, 0x34d, 0x2d0, 0x375, 0x3cf, 0x151, 0x22d, 0x107, 0x29f, 0x3f0, 0x3ea, 0x249, 0x1db, 0x1c5, 0x256, 0x2c4, 0x197, 0xd4, 0x333, 0x3af, 0x3bd, 0x277, 0x3ec, 0x161, 0x35b, 0x12a, 0x1ee, 0x20f, 0x1bb, 0x329, 0x20c, 0x2f, 0x269, 0x7f, 0x1f3, 0x8, 0x69, 0x209, 0x293, 0x118, 0x300, 0x293, 0x352, 0x39e, 0x87, 0x27a, 0x272, 0x2a0, 0x296, 0x223, 0x85, 0x4a, 0x7b, 0x38f, 0x3b, 0x116, 0x18b, 0xb7, 0x96, 0x2c6, 0x11e, 0x159, 0x81, 0x23, 0x60, 0x1d1, 0x168, 0x375, 0x397, 0x14d, 0x14c, 0x54, 0x354, 0x1c7, 0x295, 0x10b, 0x18c, 0x3f6, 0x184, 0x324, 0x1b2, 0x391, 0x314, 0x35e, 0x325, 0xaa, 0x91, 0x187, 0xc, 0xbb, 0x2d, 0x2eb, 0x3f5, 0x2ac, 0x22d, 0x20e, 0x26e, 0x3bf, 0x2d7, 0x1a2, 0x235, 0x378, 0x234, 0x260, 0x134, 0xf3, 0x266, 0x36d, 0x2e1, 0x117, 0x93, 0x3b7, 0x205, 0x194, 0x280, 0x1de, 0x2fb, 0x251, 0x2c0, 0x347, 0x34b, 0x3f0, 0x3dd, 0x136, 0x2c3, 0x6f, 0x242, 0x4c, 0x222, 0x19d, 0x34a, 0x2e8, 0xdd, 0x3a5, 0x191, 0x3f1, 0x2c5, 0x236, 0x50, 0x33d, 0x1dc, 0xcb, 0x58, 0x3ef, 0x1ea, 0x7e, 0x2fe, 0x320, 0x1db, 0x38a, 0x14a, 0x20d, 0x146, 0x230, 0x1b, 0xb5, 0x145, 0x33c, 0x188, 0x337, 0x275, 0x3c2, 0x20b, 0x237, 0x290, 0xf4, 0x24e, 0x1ee, 0x2e, 0x386, 0x3e2, 0x92, 0x157, 0x1d, 0xe, 0x11f, 0x82, 0x21f, 0x1ad, 0x34c, 0x162, 0x32e, 0x2a9, 0x2b1, 0x5d, 0x135, 0x3d6, 0x191, 0x3eb, 0x306, 0x194, 0x109, 0x371, 0x3f5, 0x151, 0xa6, 0x54, 0x2a1, 0x315, 0x85, 0x94, 0x1ec, 0x47, 0x3b0, 0x288, 0x218, 0x326, 0x30d, 0x269, 0x1fc, 0x30f, 0x200, 0x1ca, 0x265, 0x8a, 0x3bb, 0x175, 0x2ed, 0x358, 0x2f8, 0x2f2, 0x33f, 0x3d1, 0x31a, 0x3aa, 0xd, 0x346, 0xaf, 0x3c0, 0x262, 0x201, 0x3fa, 0x27e, 0x3f, 0x2fe, 0x249, 0x365, 0x6f, 0x8d, 0x130, 0x134, 0x1e6, 0x18a, 0x35e, 0x243, 0x2a8, 0x81, 0x46, 0x180, 0x293, 0x2ad, 0x263, 0x31, 0x3e1, 0x2cb, 0x17a, 0x1c2, 0x3c1, 0x52, 0x21a, 0x34f, 0x33b, 0x303, 0x376, 0x17e, 0x110, 0x3ad, 0x69, 0x6c, 0x1a1, 0x7d, 0x351, 0x2d8, 0xd6, 0x17c, 0x2f2, 0x277, 0x35f, 0xe6, 0x2de, 0x1a0, 0x14, 0x33d, 0x379, 0xab, 0x22d, 0x2a, 0x2a1, 0x223, 0x214, 0xa9, 0x2ff, 0xf2, 0x1e3, 0x2d9, 0xbf, 0x110, 0x353, 0x20a, 0xe, 0x23e, 0x208, 0xdc, 0x2e6, 0x14a, 0x26, 0x4d, 0xf3, 0x18a, 0x2b5, 0x11e, 0x16d, 0x2, 0xd2, 0xd8, 0x342, 0xfa, 0x2ab, 0x1b9, 0x1ac, 0x2f8, 0x1ed, 0xe7, 0x2b7, 0x1cc, 0x1b5, 0x340, 0x28, 0x273, 0x2fb, 0x156, 0x53, 0x54, 0x14b, 0x4f, 0x21, 0x152, 0x1f7, 0x1e4, 0x3c6, 0x1bb, 0x17e, 0x220, 0x2af, 0x1d, 0x1c, 0x75, 0x19, 0x1b8, 0x1c5, 0x294, 0x4c, 0x9a, 0x1e6, 0x314, 0x163, 0x23c, 0x2da, 0x4, 0x1a4, 0x1b0, 0x28d, 0x1f4, 0x15f, 0x372, 0x358, 0x1f9, 0x3da, 0x1ce, 0x167, 0x398, 0x36a, 0x289, 0x50, 0xef, 0x1ff, 0x2ac, 0xa6, 0xa8, 0x296, 0x9e, 0xd2, 0x1b0, 0x113, 0x3d9, 0x2ea, 0x345, 0x3ca, 0x2a7, 0x2a3, 0x1eb, 0x322, 0x367, 0x18, 0x3a2, 0x2ad, 0x19e, 0x310, 0x18e, 0x22b, 0x2b8, 0x33f, 0x35f, 0x1cc, 0x36a, 0x11b, 0x140, 0x371, 0x3cf, 0x13d, 0x1da, 0xbd, 0x384, 0x237, 0x252, 0x35b, 0x284, 0x1a3, 0x15e, 0x23f, 0xcb, 0x2c0, 0x20e, 0x354, 0x223, 0x21, 0x2a4, 0x3d5, 0x33b, 0x17, 0x305, 0x32f, 0x264, 0x2fa, 0x27e, 0xfc, 0x3b3, 0x344, 0x318, 0x317, 0x3b0, 0x232, 0x1c8, 0x22, 0x3d2, 0x105, 0xe, 0x75, 0x32, 0x2e9, 0x233, 0x11a, 0x192, 0x2c1, 0x2dc, 0x2e4, 0x330, 0x3f8, 0x4e, 0x90, 0xf1, 0x2b0, 0x1a6, 0x2c4, 0x146, 0x19d, 0x266, 0x35e, 0x11e, 0x2da, 0x8, 0x299, 0x19b, 0x8a, 0x2f7, 0x37d, 0x21e, 0x26f, 0x115, 0x135, 0x343, 0x126, 0x30e, 0xc0, 0x12f, 0x145, 0xeb, 0xb6, 0x6b, 0x17c, 0x1ed, 0x1ce, 0x2ce, 0x27b, 0x366, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x348, 0x336, 0x59, 0x24f, 0x197, 0x165, 0x266, 0x163, 0x1c4, 0x3c5, 0x12, 0x27c, 0x169, 0x12b, 0x26, 0x268, 0xb7, 0x2e4, 0xdb, 0x3f7, 0x3a4, 0x104, 0x370, 0x6f, 0xc2, 0x22c, 0x218, 0x20c, 0x3d2, 0x1d, 0xe0, 0x17f, 0x26c, 0x18c, 0x227, 0x1bf, 0x2d9, 0x1f1, 0x99, 0x2fa, 0x1ea, 0x3db, 0x123, 0x250, 0x3ee, 0x27f, 0xb8, 0x78, 0xcd, 0xb0, 0x20e, 0x14b, 0x278, 0x52, 0x1e8, 0x142, 0x346, 0x2e2, 0x379, 0x151, 0x272, 0xbd, 0x20b, 0x338, 0x18d, 0x16f, 0x289, 0x280, 0x3be, 0x10e, 0x39f, 0x38c, 0x2b8, 0xe7, 0x195, 0x3fc, 0x3, 0x1d1, 0x153, 0xeb, 0x2d8, 0x2b9, 0x3af, 0x2a3, 0x3a5, 0x24c, 0x46, 0x36, 0x28d, 0x3bb, 0x37d, 0x6a, 0x2b1, 0x1d9, 0x325, 0x16d, 0x10, 0xe5, 0x30c, 0x199, 0xb1, 0x146, 0x27d, 0x221, 0x21d, 0x7f, 0x27, 0x120, 0x381, 0x2bd, 0x294, 0x260, 0x2c1, 0x362, 0x299, 0xc3, 0x2c8, 0xb1, 0x28c, 0x1e6, 0x12c, 0x198, 0x3fb, 0x1d2, 0x104, 0x2e9, 0x1bc, 0x219, 0x288, 0x390, 0x220, 0x2aa, 0x13f, 0x3f0, 0x295, 0x250, 0x3d5, 0x1ee, 0x1c9, 0x389, 0x196, 0x53, 0x149, 0x1c2, 0xce, 0x2c2, 0x16f, 0x11b, 0x212, 0x1cf, 0xc4, 0x31c, 0x2f8, 0x2ef, 0x2f1, 0x93, 0x23, 0x36, 0x113, 0x2f7, 0x3de, 0x2a9, 0x29d, 0x2b5, 0x1c4, 0x383, 0x48, 0x3c4, 0x2bd, 0x121, 0x192, 0x225, 0x245, 0x2f0, 0x20a, 0xe0, 0x2fe, 0x1a2, 0x7b, 0x238, 0x385, 0x305, 0x14e, 0x16, 0x287, 0x2a1, 0x278, 0xa4, 0x3a9, 0x202, 0x5, 0xef, 0x3cf, 0x1fa, 0x275, 0xae, 0x277, 0x195, 0x3f1, 0xc, 0x293, 0x11d, 0x15f, 0x345, 0x26f, 0xba, 0x1cb, 0x2b2, 0x10, 0x1ca, 0x2b, 0xd3, 0x302, 0x9a, 0x25f, 0x2e4, 0x1b6, 0x3c7, 0x11f, 0x64, 0x2c3, 0x3f6, 0x1d8, 0xda, 0x17e, 0x248, 0x2fa, 0x3d4, 0x13b, 0x30c, 0x26d, 0x302, 0x134, 0x16e, 0x30d, 0x356, 0xe, 0x359, 0x26c, 0x239, 0x238, 0x303, 0xf, 0x262, 0x160, 0x54, 0x13a, 0x237, 0x161, 0x16f, 0x236, 0x5a, 0x263, 0x5b, 0x358, 0x357, 0x135, 0x55, 0x1, 0x13b, 0x30c, 0x26d, 0x302, 0x134, 0x16e, 0x30d, 0x356, 0xe, 0x359, 0x26c, 0x239, 0x238, 0x303, 0xf, 0x262, 0x160, 0x54, 0x13a, 0x237, 0x161, 0x16f, 0x236, 0x5a, 0x263, 0x5b, 0x358, 0x357, 0x135, 0x55, 0x1, 0x13b, 0x30c, 0x26d, 0x302, 0x134, 0x16e, 0x30d, 0x356, 0xe, 0x359, 0x26c, 0x239, 0x238, 0x303, 0xf, 0x262, 0x160, 0x54, 0x13a, 0x237, 0x161, 0x16f, 0x236, 0x5a, 0x263, 0x5b, 0x358, 0x357, 0x135, 0x55, 0x1, 0x13b, 0x30c, 0x26d, 0x302, 0x134, 0x16e, 0x30d, 0x356, 0xe, 0x359, 0x26c, 0x239, 0x238, 0x303, 0xf, 0x262, 0x160, 0x54, 0x13a, 0x237, 0x161, 0x276, 0x2b, 0x34c, 0x4c, 0x2c1, 0x326, 0x1e9, 0x74, 0x3f, 0x1a7, 0x250, 0x34f, 0x2df, 0x2bc, 0x2fb, 0x13d, 0x33e, 0x15c, 0x39c, 0x2cc, 0x30e, 0x36, 0x45, 0x323, 0x255, 0xf3, 0x258, 0xdb, 0x387, 0xea, 0x9b, 0x318, 0x238, 0x20f, 0x3c, 0x334, 0x22d, 0x292, 0x20b, 0x1f6, 0x398, 0x306, 0x3a2, 0x11d, 0x175, 0x35, 0x2d6, 0x35e, 0x388, 0x27, 0x112, 0x1b8, 0x1bc, 0x76, 0xda, 0x1f1, 0xc1, 0x3d7, 0x354, 0xf9, 0x129, 0x1d5, 0x340, 0x212, 0x335, 0x5b, 0x2b9, 0x147, 0x1ba, 0x159, 0x20, 0x24b, 0x169, 0x14a, 0x192, 0x86, 0x11, 0x157, 0x29b, 0x3e9, 0x85, 0x282, 0x12a, 0x346, 0x33d, 0x3cf, 0x3e1, 0x311, 0x3da, 0x37c, 0x126, 0x118, 0x2c9, 0xb2, 0xb1, 0x222, 0x25f, 0x382, 0x356, 0x1c, 0x17f, 0x344, 0x3d8, 0x399, 0x170, 0x389, 0x251, 0x139, 0x2f4, 0x1f0, 0x2b7, 0x3fc, 0x18, 0xb5, 0xe5, 0xac, 0x256, 0xc9, 0x86, 0x22, 0x155, 0xf5, 0x2e7, 0x84, 0x1e8, 0xd, 0x50, 0x375, 0x188, 0x1ac, 0x2a7, 0x1ba, 0x2b2, 0x80, 0x27c, 0x2bd, 0x11a, 0x51, 0x390, 0x124, 0x3fa, 0x26e, 0x13c, 0x290, 0x1d5, 0x289, 0x5a, 0x19e, 0x1b9, 0x39d, 0x174, 0x8f, 0x3e6, 0x90, 0x37, 0x6f, 0x3b, 0xda, 0x3e2, 0x304, 0x287, 0x125, 0x31f, 0x2c2, 0x36a, 0x259, 0x153, 0x2ab, 0x10f, 0x16b, 0x35e, 0x319, 0x9c, 0x82, 0x3b6, 0x3e5, 0x1bf, 0x1c3, 0x29c, 0x160, 0x150, 0x384, 0xfb, 0x398, 0x205, 0x293, 0xfa, 0x37d, 0x2a9, 0xc5, 0x33, 0x3fb, 0x28b, 0x190, 0xc6, 0x11c, 0x20f, 0x78, 0xcb, 0x14c, 0x17a, 0x1f0, 0x167, 0x3eb, 0xc0, 0x342, 0x1e7, 0x197, 0x27d, 0x258, 0x1b6, 0x207, 0x359, 0x1a2, 0x3d8, 0x33b, 0x1c9, 0x77, 0x151, 0x361, 0x57, 0x1ce, 0x2cc, 0x215, 0xd8, 0x228, 0x25c, 0x222, 0x1ca, 0x2b0, 0x294, 0x8b, 0xe4, 0x92, 0x3fa, 0xd5, 0xf9, 0xad, 0x16f, 0x194, 0x2ad, 0x2ab, 0x21e, 0x1a5, 0x2c6, 0x1fc, 0x3a4, 0xc8, 0xc6, 0x238, 0x2e, 0x3c0, 0xab, 0x1da, 0x22f, 0x1ce, 0x191, 0x46, 0x2c9, 0x2c8, 0x302, 0x1b2, 0x326, 0x3ad, 0x349, 0x3db, 0x21, 0xf4, 0xd, 0xa0, 0x1cf, 0x5b, 0x2f6, 0x5d, 0x243, 0x3e6, 0x120, 0xdc, 0x378, 0x3b0, 0x376, 0x14e, 0x160, 0x2a0, 0x20b, 0x3d1, 0x1fe, 0x30, 0x1a1, 0x1e7, 0x32e, 0x1e6, 0x2e4, 0x356, 0x70, 0x3dd, 0x94, 0x34f, 0x36e, 0x39a, 0x397, 0x337, 0x2f8, 0x2a3, 0x55, 0x8, 0x24b, 0x1ad, 0x8d, 0x51, 0x329, 0x99, 0x3ef, 0x2a1, 0x3c1, 0x161, 0x36a, 0xbb, 0x145, 0x175, 0xd4, 0x133, 0x21d, 0x3fb, 0x11f, 0x249, 0x239, 0x1e4, 0x170, 0x23f, 0x151, 0x2cb, 0x15c, 0x26b, 0x93, 0x230, 0x265, 0x26d, 0x26, 0x18b, 0x106, 0x157, 0x394, 0x2d2, 0x8d, 0xa2, 0xbf, 0xc1, 0x287, 0x9d, 0x19c, 0x1cc, 0x3, 0xb5, 0x37f, 0x197, 0x1e6, 0x1c1, 0x143, 0x380, 0x1a7, 0x2a4, 0x254, 0x5, 0x1df, 0x188, 0x2b9, 0x22a, 0x243, 0x3c5, 0x89, 0x2e9, 0x3e5, 0x2f5, 0xf, 0x261, 0x298, 0x3c2, 0x277, 0x2cc, 0x46, 0x19b, 0x332, 0x26, 0x316, 0x11, 0x2aa, 0x3a1, 0x4f, 0x290, 0x35d, 0xca, 0x2ad, 0x15f, 0x6a, 0x133, 0x33, 0x3f7, 0xea, 0xd1, 0x3b9, 0x1ee, 0x15e, 0x3fe, 0x3e1, 0xbe, 0x355, 0x55, 0x10, 0x13e, 0x173, 0xc2, 0x232, 0x3e2, 0xb, 0x2a, 0x1c2, 0x1f6, 0xff, 0x30, 0x342, 0x395, 0x146, 0x25f, 0x2f, 0x1d, 0x7e, 0x246, 0x21a, 0x101, 0x50, 0x1cf, 0xb6, 0x3ca, 0x2e8, 0x71, 0x27, 0x82, 0x2c3, 0x227, 0x303, 0xf0, 0x251, 0x1da, 0x57, 0x331, 0x93, 0x69, 0x186, 0x34c, 0x260, 0x10c, 0x110, 0x2fa, 0x26e, 0xf9, 0x321, 0x35a, 0x61, 0x232, 0x3cd, 0x2c, 0x150, 0x1f, 0x2b7, 0x3b7, 0x36, 0x59, 0x181, 0x364, 0x106, 0x155, 0x3a1, 0x9e, 0x252, 0x2de, 0xbb, 0x11d, 0x37d, 0x165, 0x12c, 0x2d1, 0x70, 0x36f, 0x152, 0x254, 0xa, 0x375, 0x5b, 0x3ca, 0x1d9, 0x1c4, 0x138, 0x32, 0xc6, 0xf2, 0x2e0, 0x1dc, 0x27a, 0x311, 0x1d7, 0x22e, 0x10, 0x27c, 0x1c5, 0x219, 0x368, 0xa7, 0x2c0, 0x12d, 0x1f0, 0x32a, 0x30e, 0x360, 0x199, 0x26, 0x225, 0x44, 0x17d, 0x26e, 0x1f2, 0x161, 0x1b3, 0x3a2, 0x1f4, 0x3b5, 0x27d, 0x2e4, 0x143, 0x309, 0x295, 0x10d, 0x101, 0xa0, 0x335, 0x1b9, 0xd7, 0x1af, 0x7f, 0x3a4, 0x320, 0x7b, 0x33b, 0x253, 0x1ff, 0x3e1, 0x17c, 0x14f, 0x2a8, 0x100, 0x381, 0x6f, 0x1d8, 0x2e5, 0x262, 0x53, 0x2f4, 0x33f, 0x2cc, 0x8c, 0x265, 0x1a6, 0x260, 0x218, 0x49, 0x3fd, 0x2a1, 0x31f, 0x23d, 0x306, 0x24b, 0x173, 0x308, 0x368, 0x14e, 0x312, 0x17a, 0x33f, 0x191, 0x230, 0x30c, 0x256, 0x8b, 0x329, 0xc1, 0x20e, 0x1c2, 0x3d1, 0x3eb, 0x1b, 0x59, 0x302, 0x18b, 0x22, 0x17d, 0xd5, 0x3c1, 0x31a, 0x306, 0xb5, 0x1e7, 0x146, 0x16e, 0x2f0, 0x349, 0x2e7, 0x52, 0x3aa, 0x194, 0x145, 0x3ba, 0x165, 0x258, 0x356, 0x380, 0x295, 0x21a, 0xd, 0x109, 0x33c, 0x345, 0x1a5, 0x21d, 0x3e7, 0x359, 0x216, 0x34f, 0x346, 0x371, 0x188, 0x2f6, 0x2e8, 0x1c4, 0x270, 0xc8, 0x239, 0x33b, 0xaf, 0x3f5, 0x337, 0x3ed, 0x1ba, 0x37a, 0x120, 0x2e9, 0x38f, 0x303, 0x3c0, 0x151, 0x275, 0x3bd, 0x28f, 0x8, 0x27c, 0x38a, 0x76, 0x376, 0x262, 0xa6, 0x3c2, 0x1ce, 0x93, 0x1a4, 0x56, 0x294, 0x51, 0x17e, 0x201, 0x54, 0x20b, 0x2b7, 0x367, 0xd8, 0x2c8, 0x26, 0x43, 0x110, 0x3fa, 0x2a1, 0x237, 0xe6, 0x6, 0x1a1, 0x323, 0x9f, 0x1c5, 0x76, 0x2e5, 0x19a, 0x139, 0x57, 0x1be, 0x81, 0x394, 0x2bd, 0x308, 0x2d9, 0x131, 0xa6, 0x38d, 0x331, 0x91, 0x276, 0x2d2, 0x61, 0xda, 0xa7, 0x312, 0x2f4, 0xe7, 0x93, 0x348, 0x158, 0x8d, 0x119, 0x393, 0x160, 0x25a, 0x39b, 0x191, 0x69, 0x2b, 0x294, 0xa2, 0x1f1, 0x2c, 0x149, 0x1f0, 0xb3, 0x8c, 0x186, 0x256, 0x116, 0xbf, 0x201, 0xa8, 0x3e, 0x195, 0x215, 0x336, 0x34c, 0x324, 0x390, 0xc1, 0x15, 0x301, 0x2b7, 0x2c7, 0x360, 0x26d, 0x260, 0x72, 0x99, 0x287, 0xe1, 0x3d1, 0x3df, 0x6c, 0x2c8, 0x4c, 0x10c, 0x92, 0x3d7, 0x9d, 0xfb, 0x3fc, 0x209, 0x59, 0x20d, 0x225, 0x110, 0x3fd, 0x296, 0x19c, 0x27b, 0xc0, 0x8a, 0x2c4, 0x2c1, 0x22, 0x2fa, 0x354, 0x237, 0x1cc, 0x18, 0x113, 0x25c, 0xd9, 0x106, 0x15d, 0x26e, 0x3c1, 0x23d, 0x3, 0x1a1, 0x24f, 0x9a, 0x326, 0x13e, 0x31d, 0x3b0, 0x203, 0x32c, 0x2cb, 0x3da, 0x117, 0x40, 0x30b, 0x2f9, 0x1e3, 0x1e0, 0x2a2, 0x38c, 0x355, 0x159, 0x24, 0x370, 0x317, 0x2e, 0xee, 0x1fa, 0x2f8, 0xdd, 0x2fd, 0x112, 0x18f, 0x79, 0x392, 0x3fe, 0x267, 0x357, 0x325, 0x217, 0x19, 0x318, 0x27f, 0x171, 0x247, 0xd6, 0x5d, 0xe2, 0xe9, 0x249, 0x3b9, 0x2df, 0xef, 0xc4, 0x1e5, 0x36d, 0xfe, 0x23e, 0x344, 0x3a3, 0x285, 0x3be, 0x16c, 0x1ae, 0x2c6, 0x3f7, 0x2bb, 0x94, 0x12a, 0x28, 0x263, 0x3a6, 0x34a, 0xcc, 0x7, 0x3b3, 0x141, 0x202, 0x212, 0x1d6, 0x6a, 0x314, 0x36c, 0x1c0, 0x123, 0xf4, 0x1a0, 0x1a9, 0x175, 0x2b6, 0xb9, 0x286, 0xfc, 0x42, 0x177, 0xca, 0x28a, 0x1ef, 0xf3, 0x213, 0xe8, 0x377, 0xa4, 0x16f, 0x2ec, 0x3e8, 0x32e, 0xb7, 0x1e9, 0x27e, 0x4f, 0x15a, 0x366, 0x25e, 0x3ce, 0x222, 0x193, 0x2ae, 0x29f, 0x27c, 0x6f, 0x1bf, 0x78, 0x151, 0x38c, 0x2a3, 0x16d, 0x120, 0x365, 0x238, 0x392, 0x3f5, 0x18e, 0x28e, 0x23c, 0x270, 0x249, 0x37b, 0x36e, 0x371, 0x5b, 0xd7, 0x2c6, 0x3e7, 0x2fe, 0xa9, 0x284, 0x109, 0x1d6, 0xd4, 0x4b, 0x356, 0x3f, 0x21, 0x177, 0x194, 0x23a, 0x363, 0x32b, 0x2f0, 0x27e, 0x9e, 0x161, 0x306, 0x1a1, 0x12e, 0x1b2, 0x22, 0x3fa, 0x125, 0xfb, 0x3eb, 0xd8, 0x26d, 0x192, 0x329, 0x201, 0x2a0, 0x3e0, 0x191, 0x1a4, 0x2b0, 0x61, 0x368, 0x262, 0x139, 0x15c, 0x3d6, 0x8, 0x3c4, 0x378, 0x1e3, 0x3c0, 0x29a, 0x5f, 0x135, 0x37a, 0x112, 0x31e, 0x1e4, 0xaf, 0x397, 0x6b, 0x5d, 0x1c4, 0x3a4, 0x26c, 0x3ee, 0x346, 0x3be, 0x2d8, 0x2b1, 0x21d, 0x307, 0x3dd, 0x141, 0xd, 0x5a, 0x2ab, 0x2a9, 0x258, 0x286, 0x1f8, 0x108, 0x3aa, 0xbb, 0x1f4, 0x32e, 0x16e, 0x3ad, 0x3d4, 0xf9, 0x31a, 0xf1, 0x1bc, 0x1e3, 0x389, 0x27a, 0x2f8, 0x374, 0x383, 0x19, 0x7b, 0x3b1, 0xef, 0x310, 0x26f, 0x2c6, 0x3c7, 0x3ea, 0x141, 0x1a, 0x168, 0x175, 0x2ca, 0x382, 0xe8, 0x1c7, 0x252, 0x366, 0x16a, 0x97, 0x1b2, 0x44, 0x3f3, 0x13a, 0x3ab, 0x187, 0x265, 0xa5, 0x144, 0x32f, 0x22d, 0x313, 0x37c, 0x2, 0x1e2, 0x378, 0x3c6, 0x31b, 0xfd, 0x1f9, 0x2e1, 0x30f, 0x32, 0xf6, 0x36b, 0x1de, 0x229, 0xd7, 0x185, 0x387, 0x3dd, 0x282, 0x34, 0x2d0, 0x2ea, 0x19d, 0x30d, 0x1d0, 0x38e, 0xad, 0x2c5, 0x2d4, 0x12e, 0x364, 0x88, 0x3ef, 0x274, 0x35f, 0x30e, 0xc3, 0x14a, 0x288, 0x257, 0x53, 0x22f, 0x2f1, 0x4, 0x3c4, 0x2f9, 0x385, 0x23f, 0x1fa, 0x3f2, 0x1cb, 0x217, 0x64, 0x1ec, 0x2df, 0x3bc, 0x5b, 0x1ae, 0x30a, 0x307, 0x3b3, 0x10d, 0x68, 0x1a9, 0x1dd, 0x33a, 0x213, 0x3a0, 0x315, 0x15a, 0x183, 0x1a1, 0x1e2, 0x2f9, 0x303, 0xee, 0x3cb, 0x357, 0x11e, 0xe9, 0x26c, 0x3a3, 0x5, 0x263, 0x10f, 0x314, 0x356, 0xfc, 0x210, 0x16f, 0x34d, 0x3ce, 0x134, 0x11, 0x3fd, 0x13a, 0x35f, 0x215, 0x30c, 0x242, 0xda, 0x262, 0xed, 0x1ed, 0x55, 0x12, 0x1db, 0x238, 0x253, 0x327, 0x358, 0x3b2, 0x3f8, 0x359, 0x250, 0x101, 0x5a, 0x2be, 0x2ca, 0x30d, 0x3a0, 0x223, 0x161, 0x3, 0x226, 0x302, 0x10c, 0x132, 0x54, 0x1f0, 0x322, 0x13b, 0x2bd, 0xec, 0xf, 0x2ac, 0x311, 0x135, 0x1f3, 0x104, 0x239, 0x3b1, 0x1de, 0x5b, 0x35c, 0x33, 0xe, 0x34e, 0x1e8, 0x236, 0x11d, 0x2cf, 0x16e, 0x2af, 0x137, 0x237, 0xff, 0x36, 0x26d, 0x241, 0x2fc, 0x160, 0x1e1, 0xdf, 0x1, 0x1e2, 0x2f9, 0x303, 0xee, 0x3cb, 0x357, 0x11e, 0xe9, 0x26c, 0x3a3, 0x5, 0x263, 0x10f, 0x314, 0x356, 0xfc, 0x210, 0x16f, 0x34d, 0x3ce, 0x134, 0x3c4, 0x3f6, 0x2e, 0x2fb, 0x18e, 0x5d, 0x23b, 0xea, 0x94, 0x284, 0x5a, 0x175, 0x33a, 0x5e, 0x27e, 0xf9, 0xe6, 0x180, 0x2c8, 0x192, 0x17e, 0x160, 0x3c2, 0x37c, 0x8, 0x21f, 0x38f, 0x170, 0x3f5, 0x6b, 0x2e8, 0x1fc, 0x359, 0xa9, 0xd, 0x2d0, 0x3ba, 0x1e6, 0x2f0, 0x3d4, 0x3c1, 0x339, 0x1b, 0x26d, 0x8b, 0x3e2, 0x312, 0x22f, 0x3d6, 0x40, 0xdc, 0x47, 0x392, 0x397, 0x358, 0x36d, 0x3fb, 0x2fe, 0x141, 0x68, 0x2ad, 0x1ef, 0x32b, 0x3ad, 0x29f, 0x237, 0x1fe, 0xd8, 0x34c, 0x51, 0x32f, 0xa6, 0x15c, 0x28f, 0x200, 0x2e9, 0x238, 0xaf, 0x87, 0x2f6, 0x35e, 0x3e7, 0x3dd, 0x21a, 0x340, 0x145, 0x363, 0x16e, 0x157, 0xd5, 0x19c, 0x3eb, 0x2c9, 0x256, 0x288, 0x14e, 0x139, 0x2f2, 0x55, 0x24, 0x365, 0x1e4, 0x171, 0x31, 0x39d, 0x2c6, 0x307, 0x2d7, 0xf4, 0x236, 0x23a, 0x32e, 0x362, 0x2aa, 0x381, 0x3c3, 0x170, 0x3e3, 0x1ac, 0x36d, 0x3ff, 0x3ea, 0x21a, 0x289, 0x11d, 0x32e, 0x2cd, 0x2ba, 0x125, 0x3ab, 0x23, 0x56, 0xc2, 0x1c3, 0xab, 0x311, 0xdd, 0x30f, 0x190, 0x1f7, 0x206, 0xcf, 0x6a, 0x258, 0x3a, 0x38e, 0x161, 0xc, 0x228, 0x130, 0x25b, 0xb0, 0x3c2, 0x2f1, 0x20, 0xdc, 0x8e, 0x253, 0x87, 0x1e5, 0x163, 0x307, 0x1a7, 0x3d0, 0x194, 0x3e8, 0x111, 0x106, 0x3fd, 0xe1, 0x195, 0x69, 0x2d2, 0x76, 0x1e, 0x14d, 0x2f8, 0x396, 0x138, 0x26c, 0x297, 0x50, 0x1d6, 0x15b, 0x382, 0x349, 0x13c, 0x73, 0x180, 0x199, 0x241, 0x3e2, 0x22d, 0xae, 0x28f, 0x9, 0x3b6, 0x1e4, 0x2e2, 0xc4, 0xd7, 0x33, 0x38, 0x85, 0x2ee, 0x2ec, 0x1e7, 0x268, 0x88, 0x347, 0x1f, 0x2cc, 0x13b, 0x2e6, 0x2db, 0x3c0, 0x1fa, 0x3af, 0x23c, 0x341, 0x10b, 0x254, 0x212, 0x2be, 0x33a, 0xbc, 0x1ea, 0x3c1, 0x30b, 0x317, 0x392, 0x247, 0x1e5, 0x2c6, 0x7, 0x123, 0x177, 0x2ec, 0x3ce, 0x1b2, 0x49, 0x15, 0x3e0, 0x24c, 0x9f, 0x378, 0x17, 0x1ff, 0x6b, 0x3b2, 0x3ff, 0x3dd, 0x7a, 0x65, 0x1f4, 0x111, 0x20c, 0x3ef, 0x301, 0x166, 0x13b, 0x1c5, 0x37e, 0x23f, 0x39f, 0x115, 0x23b, 0x3a8, 0x152, 0x68, 0x2a6, 0x2cf, 0x362, 0x2ba, 0x24a, 0x2b7, 0x118, 0x169, 0x76, 0x3c, 0x13d, 0x3ed, 0x11e, 0x341, 0x216, 0x142, 0xb4, 0x3ba, 0x391, 0x353, 0xd5, 0x279, 0x2c7, 0x30c, 0x234, 0x2e5, 0xab, 0x22b, 0x374, 0x4e, 0x136, 0x297, 0xa0, 0x351, 0x2ca, 0x5e, 0x1ea, 0x38b, 0x1fe, 0x360, 0xa5, 0x6d, 0x19a, 0x19f, 0x2a3, 0x1f3, 0x32, 0x37b, 0x103, 0xcf, 0xd4, 0x172, 0x1d0, 0x9e, 0x73, 0x300, 0x26d, 0x22c, 0x257, 0x139, 0x3da, 0x159, 0x112, 0x318, 0x2df, 0x3be, 0x3a6, 0x314, 0x286, 0x377, 0x15a, 0x6, 0x21f, 0x47, 0xaf, 0x31, 0xd7, 0xcc, 0x380, 0x108, 0x36a, 0x1a1, 0x302, 0xe4, 0x2c, 0x3c2, 0x3d6, 0x200, 0x365, 0x33b, 0xef, 0x2d8, 0x133, 0x356, 0x3db, 0xad, 0x6, 0x59, 0x192, 0x3e2, 0xa6, 0x2f2, 0x2a8, 0x112, 0x239, 0x36e, 0x1cf, 0x21e, 0x258, 0xe8, 0x9e, 0xe6, 0x1b, 0x34c, 0x288, 0x262, 0x2cb, 0x2a3, 0x3e6, 0xc8, 0x3ee, 0x14, 0x1d6, 0x165, 0x5e, 0x3d4, 0x237, 0x3eb, 0x265, 0x8d, 0x376, 0xab, 0x5f, 0x1cb, 0x270, 0x344, 0x254, 0x5a, 0x3ba, 0x32b, 0x157, 0x2a1, 0x3d1, 0x46, 0x2b0, 0x76, 0x78, 0xfd, 0x357, 0x1c4, 0xea, 0xa9, 0x68, 0x145, 0x32e, 0x326, 0x3fa, 0x1c2, 0xb3, 0x13b, 0x38a, 0x1e3, 0x1dc, 0x18e, 0x2e8, 0x3fb, 0x3dd, 0xf4, 0x194, 0x3bb, 0x134, 0x110, 0x20e, 0x3e0, 0x91, 0x27c, 0x3f6, 0x170, 0x397, 0x2f6, 0x2c6, 0xe, 0x85, 0x3aa, 0x293, 0x12e, 0x37, 0x11c, 0x171, 0x310, 0x2d6, 0x36c, 0x3f0, 0x252, 0x6, 0xb2, 0x241, 0x32f, 0x272, 0x2ef, 0x37a, 0x32, 0x1f7, 0x14, 0x3ac, 0x19d, 0x2f0, 0x137, 0x279, 0x30e, 0xac, 0x3b, 0x78, 0x1fa, 0x147, 0x23b, 0x2bb, 0x10d, 0x236, 0x3e8, 0x9a, 0x110, 0x15, 0x39b, 0x81, 0x381, 0x227, 0xaf, 0x62, 0x35c, 0x269, 0x7e, 0x148, 0x306, 0x114, 0xc9, 0x3e2, 0x14c, 0x3da, 0x16d, 0x104, 0x3b9, 0x206, 0x271, 0x2b6, 0x5e, 0x3a1, 0xce, 0x367, 0x211, 0x184, 0xf, 0x13d, 0x3af, 0x1c4, 0x1d4, 0x2a4, 0x340, 0x7d, 0x111, 0x22, 0x287, 0x1f0, 0x91, 0xf1, 0x3c3, 0x392, 0x10e, 0x26f, 0xcc, 0x309, 0x29, 0x366, 0x226, 0x98, 0x17e, 0x22d, 0x179, 0x2a8, 0x224, 0xf6, 0x346, 0xcf, 0x350, 0x30d, 0xf5, 0x31f, 0x3eb, 0xc3, 0x234, 0x386, 0x2a2, 0x3f2, 0x23c, 0x23e, 0x250, 0x68, 0x28a, 0xa3, 0x106, 0x6e, 0x79, 0x39a, 0x16c, 0x266, 0x286, 0x38e, 0x23d, 0x1b, 0x12b, 0xda, 0x196, 0x22b, 0x396, 0x3a4, 0x4a, 0x1a, 0x145, 0xa3, 0x20c, 0x347, 0x1f0, 0x122, 0x3c4, 0x227, 0x15e, 0x188, 0x2d6, 0x2d1, 0x3db, 0x2b4, 0x60, 0x26d, 0x144, 0xcd, 0x275, 0xdd, 0x9c, 0x344, 0x142, 0x1a9, 0x363, 0x193, 0x3fd, 0x20b, 0x24d, 0x9f, 0x3f6, 0x1c9, 0x10e, 0xd7, 0x330, 0x7e, 0x290, 0x3, 0xb2, 0x8b, 0xa7, 0x3b4, 0x2a3, 0x383, 0x9b, 0x24e, 0x2d, 0x37d, 0x16e, 0x2ba, 0x274, 0xb3, 0xe5, 0xde, 0x2e, 0x3cf, 0x1e5, 0x21d, 0x1c0, 0x210, 0x366, 0x45, 0x260, 0x3e2, 0x298, 0x373, 0x37a, 0x64, 0x3d5, 0xa0, 0x2be, 0x3cc, 0x157, 0x296, 0x167, 0x1a4, 0x1c5, 0x3c6, 0x2fb, 0x1ac, 0x2b5, 0xe, 0x214, 0x2de, 0x1a1, 0x13, 0x25b, 0x312, 0x179, 0x159, 0x82, 0x3b9, 0x5, 0x1d6, 0x19d, 0x1e9, 0xd5, 0xdc, 0x1e4, 0xef, 0x2ed, 0x4b, 0xe8, 0xf9, 0x1fe, 0x265, 0x61, 0xf, 0xfd, 0x28e, 0x1fc, 0x3dd, 0x3a9, 0x1d1, 0x12e, 0x218, 0x2c, 0x22f, 0x55, 0x112, 0x1ec, 0x206, 0x1d6, 0x33a, 0x3ad, 0x2a1, 0x2b7, 0x1a4, 0x38a, 0x303, 0x3f5, 0x2f6, 0x21d, 0x380, 0x52, 0x306, 0x59, 0x8b, 0x14e, 0x2cb, 0x135, 0x4e, 0x344, 0x284, 0x2ad, 0x32e, 0x106, 0x347, 0x3e0, 0x81, 0x21f, 0x238, 0x39a, 0x2d8, 0x18a, 0x1d, 0x9e, 0x339, 0x2c9, 0x8d, 0x386, 0x29a, 0x357, 0x23b, 0x2fe, 0xf4, 0xbb, 0x323, 0x43, 0x201, 0x3c2, 0x28f, 0x120, 0x239, 0x346, 0x33c, 0x165, 0x2f0, 0xd5, 0x3d1, 0x230, 0x173, 0x1e3, 0x2fb, 0x358, 0x2c6, 0x70, 0x108, 0x366, 0x8a, 0x192, 0x32f, 0x1da, 0x2a3, 0x30f, 0x26c, 0x254, 0x2d0, 0x363, 0x326, 0x3ef, 0x7c, 0x91, 0x3c4, 0x47, 0x171, 0x5b, 0x133, 0x286, 0x315, 0xe6, 0x1b8, 0x399, 0x371, 0x283, 0x172, 0x27e, 0x67, 0x187, 0x2b0, 0x369, 0xee, 0x6b, 0x2b5, 0x38, 0x108, 0x2c5, 0x228, 0x8b, 0x29c, 0x33e, 0x1ba, 0xe9, 0x4a, 0x68, 0x7d, 0x9a, 0x92, 0x149, 0x1be, 0x200, 0x235, 0x1b7, 0x263, 0x15b, 0x178, 0xd5, 0x3ab, 0xd2, 0x38a, 0x20f, 0x3cf, 0x39d, 0x198, 0xfc, 0xad, 0x60, 0x1a6, 0x6d, 0x32c, 0x17c, 0x23c, 0x1d4, 0x10d, 0x194, 0x3ce, 0x225, 0x201, 0x38d, 0x22e, 0x112, 0x3d8, 0xa, 0x2ab, 0x3cc, 0x155, 0x13a, 0x166, 0x321, 0x3f6, 0x32d, 0xc4, 0x1a5, 0x2a5, 0x38e, 0xe6, 0x1b0, 0x242, 0x386, 0x13d, 0x147, 0x1fc, 0x3b3, 0x2bf, 0x293, 0x2c4, 0x390, 0x312, 0x1ed, 0x1bd, 0xc8, 0x297, 0x2d, 0x1ef, 0x2cd, 0x3f3, 0x7c, 0x122, 0x30b, 0x238, 0x33d, 0x372, 0x4b, 0x1d0, 0x3e4, 0x3eb, 0x211, 0x3b, 0x3c0, 0x267, 0x3b2, 0x307, 0x10a, 0x1b5, 0x113, 0x370, 0x27f, 0x3be, 0x6a, 0x213, 0x29f, 0x3ec, 0x69, 0x38a, 0x17, 0x327, 0xd7, 0x1b6, 0x3bf, 0x31a, 0x6c, 0x121, 0x386, 0x27a, 0x115, 0x3fb, 0x34e, 0x35d, 0x1a1, 0x98, 0x3cd, 0x1da, 0x29e, 0x9c, 0x216, 0x34, 0x7d, 0x134, 0x248, 0x25a, 0x3d6, 0x90, 0x7b, 0x206, 0x351, 0x3cc, 0x2aa, 0xe1, 0x322, 0x27c, 0x227, 0x2e2, 0x2d8, 0x221, 0x1d0, 0x3c1, 0x3b7, 0xac, 0x3b0, 0xee, 0xd6, 0x2c6, 0x1c0, 0xa4, 0x6, 0x332, 0x119, 0x196, 0x17c, 0x71, 0x359, 0x7a, 0x176, 0x12e, 0x72, 0x2c0, 0x2f2, 0x1bd, 0x190, 0x24e, 0x168, 0x2cf, 0x106, 0x107, 0x277, 0x8, 0x3b6, 0x3dc, 0x1cf, 0x350, 0xbc, 0xd5, 0x35f, 0x348, 0x6f, 0xb8, 0x10e, 0x2b1, 0x1ab, 0x1c7, 0xe6, 0x360, 0x11a, 0xf, 0x3f4, 0xba, 0x3e7, 0x246, 0x2de, 0x113, 0xc9, 0x257, 0x2cb, 0xdd, 0xe9, 0x94, 0x1a0, 0x3e8, 0x1b2, 0x2e9, 0x1ee, 0x1cf, 0x2a9, 0x2f0, 0x2a1, 0x195, 0x1ca, 0x3f6, 0xaf, 0x5b, 0x18a, 0xe8, 0x3c1, 0x367, 0x2b0, 0x1bf, 0x2fb, 0x2f6, 0xcc, 0x1f8, 0x161, 0x1b, 0x294, 0x386, 0xfd, 0x5d, 0x3e7, 0x85, 0x36a, 0x8a, 0x8b, 0x262, 0x38c, 0x243, 0xea, 0x21a, 0xbb, 0x12e, 0xe4, 0x312, 0x3bd, 0x3e6, 0x26c, 0x284, 0x145, 0x222, 0x92, 0x12d, 0x3d6, 0x120, 0x1ec, 0x14, 0x175, 0x16e, 0x3fa, 0x7c, 0x81, 0xdc, 0x33b, 0x3be, 0xd4, 0x5e, 0xd5, 0x2b7, 0x13b, 0x378, 0x392, 0x188, 0x133, 0x1d, 0xf9, 0x3eb, 0x56, 0x3b0, 0x1dc, 0x358, 0x21d, 0x3f, 0xad, 0x180, 0x256, 0x376, 0x29a, 0x28e, 0x3fb, 0x295, 0x16f, 0x113, 0x192, 0x14e, 0x275, 0x1cb, 0x11f, 0x141, 0x194, 0x323, 0x218, 0x160, 0x2f2, 0x37a, 0x249, 0x254, 0x2ad, 0x146, 0x110, 0x2a0, 0x37c, 0x24, 0x239, 0x206, 0x2ab, 0x32b, 0x17d, 0x1db, 0x3b1, 0x263, 0x2ca, 0x2af, 0x13a, 0x322, 0x1e2, 0x238, 0x1de, 0x10f, 0x30d, 0x137, 0x35f, 0x13b, 0x2f9, 0x253, 0x5b, 0x314, 0x3a0, 0x237, 0x215, 0x2bd, 0x303, 0x327, 0x35c, 0x356, 0x223, 0xff, 0x30c, 0xec, 0xee, 0x358, 0x33, 0xfc, 0x161, 0x36, 0x242, 0xf, 0x3cb, 0x3b2, 0xe, 0x210, 0x3, 0x26d, 0xda, 0x2ac, 0x357, 0x3f8, 0x34e, 0x16f, 0x226, 0x241, 0x262, 0x311, 0x11e, 0x359, 0x1e8, 0x34d, 0x302, 0x2fc, 0xed, 0x135, 0xe9, 0x250, 0x236, 0x3ce, 0x10c, 0x160, 0x1ed, 0x1f3, 0x26c, 0x101, 0x11d, 0x134, 0x132, 0x1e1, 0x55, 0x104, 0x3a3, 0x5a, 0x2cf, 0x11, 0x54, 0xdf, 0x12, 0x239, 0x5, 0x2be, 0x16e, 0x3fd, 0x1f0, 0x1, 0x1db, 0x3b1, 0x263, 0x2ca, 0x2af, 0x13a, 0x322, 0x1e2, 0x238, 0x1de, 0x10f, 0x30d, 0x137, 0x35f, 0x13b, 0x2f9, 0x253, 0x5b, 0x314, 0x3a0, 0x237, 0x3b6, 0x2df, 0x33c, 0xf3, 0x15d, 0x20b, 0x244, 0x1b8, 0x1ee, 0x335, 0x2ca, 0x157, 0xe1, 0x126, 0x21f, 0x399, 0x375, 0x2a9, 0x3d2, 0x24a, 0x191, 0x1e2, 0x79, 0x371, 0x6a, 0xbc, 0x2a1, 0x25d, 0x9f, 0x47, 0x273, 0x283, 0x30d, 0x26e, 0x167, 0x1ca, 0x3c3, 0x2e2, 0x2ed, 0x172, 0x3a1, 0x3d1, 0x299, 0x2f9, 0xaf, 0x16c, 0x96, 0x27e, 0x279, 0x69, 0x6f, 0x1c9, 0x310, 0x18a, 0x3a0, 0x67, 0x46, 0x1c5, 0x5c, 0x31, 0x29d, 0x3a, 0x3c1, 0x187, 0x35a, 0x303, 0x247, 0x16b, 0x286, 0x278, 0x3df, 0x2b0, 0x2f5, 0x3e3, 0xd7, 0x1ab, 0x223, 0x1fe, 0x2b, 0x369, 0x2fb, 0x3ca, 0xdb, 0x2e7, 0x398, 0xc3, 0x76, 0xee, 0x2b9, 0xcc, 0x3e9, 0x23d, 0x2c9, 0x184, 0x389, 0x6b, 0x30a, 0x7e, 0x161, 0x6c, 0x11a, 0x78, 0xc7, 0x2b5, 0x380, 0x252, 0x300, 0x294, 0x203, 0x3cb, 0x36d, 0x38, 0xa4, 0x30, 0x365, 0x36e, 0x1d6, 0x32b, 0x3fa, 0x3e0, 0x8, 0x31e, 0x346, 0x2ab, 0x16e, 0x3ef, 0x33f, 0x40, 0xc6, 0x206, 0x175, 0x362, 0x347, 0x1ce, 0x200, 0x239, 0x14, 0x3ba, 0x326, 0x20e, 0x26b, 0x24, 0x1ec, 0xa0, 0x1ef, 0x106, 0x54, 0x37c, 0x120, 0x37b, 0x109, 0x363, 0x22, 0x2a0, 0x3d6, 0x112, 0x3ee, 0x5a, 0x32e, 0x110, 0x12d, 0x28f, 0x82, 0x34f, 0x2d0, 0x146, 0x92, 0x17a, 0x55, 0x19, 0x24e, 0x2ad, 0x222, 0x99, 0x3c2, 0x2a8, 0xc8, 0x254, 0x145, 0x134, 0xc1, 0x22f, 0x16d, 0x249, 0x284, 0x23a, 0x1b2, 0x201, 0x15c, 0x37a, 0x26c, 0xd, 0x1f4, 0x18b, 0x2c, 0x2f2, 0x3e6, 0x344, 0x68, 0x3bb, 0x43, 0x160, 0x3bd, 0x30f, 0x216, 0x340, 0x1e7, 0x218, 0x312, 0x1d7, 0x4e, 0x94, 0x236, 0x323, 0xe4, 0xa6, 0x2a3, 0x270, 0xa9, 0x194, 0x12e, 0x329, 0x139, 0x135, 0x3a4, 0x141, 0xbb, 0x162, 0x2c3, 0x1a3, 0x2ab, 0x2dc, 0x3a7, 0x1ce, 0x9, 0xf6, 0xa0, 0x3de, 0x11, 0x2a0, 0x3a5, 0x41, 0x34f, 0x1a9, 0x111, 0x99, 0x38d, 0x2b2, 0x249, 0x101, 0xfa, 0x18b, 0x58, 0x3da, 0x30f, 0x25, 0x11b, 0x323, 0x1c8, 0x298, 0x135, 0x341, 0x10d, 0x1d1, 0x20d, 0x393, 0x275, 0x8f, 0x17f, 0x177, 0x342, 0x241, 0x334, 0x1f9, 0xfe, 0x295, 0x2dd, 0x164, 0x6d, 0x2a2, 0x22a, 0x307, 0x210, 0x18, 0x256, 0x305, 0x39f, 0x35e, 0x309, 0x2b4, 0xd8, 0xc2, 0x31b, 0x358, 0x198, 0x377, 0x339, 0x211, 0x2db, 0x3f5, 0x1ae, 0x143, 0xf9, 0x2c7, 0x2bd, 0x2e, 0x62, 0xc5, 0x349, 0x338, 0xd2, 0x378, 0x15e, 0x372, 0x2e4, 0x137, 0x2ce, 0x24b, 0x8e, 0x3bc, 0xd4, 0x1e9, 0x9d, 0x93, 0x37, 0xf7, 0x263, 0x27d, 0x2ba, 0x7c, 0x2, 0x18f, 0x346, 0x15f, 0x1b1, 0x347, 0x39c, 0x12, 0x1ec, 0x140, 0x3b5, 0x22, 0x18f, 0x285, 0x175, 0x193, 0x15, 0x37c, 0x89, 0x3d5, 0x2d0, 0x111, 0x132, 0x22f, 0x1bd, 0xd1, 0x68, 0x2f7, 0x39, 0xa6, 0x29e, 0x341, 0x21a, 0x34d, 0x4c, 0x14e, 0x22b, 0x388, 0x2d7, 0x1b5, 0xb2, 0x6d, 0x14d, 0xba, 0xe, 0x148, 0x300, 0x8d, 0x1e0, 0xd6, 0xcc, 0x377, 0x27b, 0x56, 0x2f5, 0x327, 0x1a5, 0x74, 0x67, 0x230, 0x1bc, 0x15e, 0x2ed, 0x382, 0x1aa, 0xb3, 0x1e2, 0x3c8, 0x1cf, 0x19d, 0x15d, 0x7c, 0x4, 0x235, 0x206, 0x1dd, 0x245, 0x54, 0x1eb, 0x224, 0x34f, 0x352, 0x4d, 0xc1, 0xae, 0x2fd, 0x344, 0x1a0, 0x3ce, 0xe4, 0x298, 0x26a, 0x11f, 0x7a, 0x12f, 0x130, 0x131, 0xbe, 0x23b, 0x34e, 0x2dd, 0x2c8, 0x1b4, 0x13d, 0x2e8, 0x38, 0x129, 0x1b, 0x234, 0x389, 0x358, 0x330, 0x1c7, 0x1fe, 0x158, 0x3c6, 0x87, 0x29d, 0x1d0, 0x19c, 0xd2, 0x2f9, 0x171, 0x3a6, 0x213, 0x2a1, 0x31e, 0x206, 0x3ba, 0x106, 0x2a0, 0x28f, 0x19, 0x254, 0x23a, 0x18b, 0x160, 0x1d7, 0x270, 0x141, 0x1d1, 0x26, 0x14e, 0x5f, 0x23b, 0x295, 0x366, 0x26d, 0x376, 0x3e1, 0x35e, 0x3f, 0x31a, 0x265, 0x3b0, 0x3f5, 0x2b1, 0x1d, 0x237, 0x230, 0x378, 0x171, 0x345, 0x5e, 0x125, 0x93, 0xdc, 0x36b, 0x1d6, 0x16e, 0x347, 0x26b, 0x120, 0x3ee, 0x2d0, 0x222, 0xc1, 0x15c, 0x3e6, 0x216, 0x236, 0x12e, 0x17e, 0x2cb, 0x243, 0x2fe, 0x3aa, 0x8a, 0x288, 0x151, 0x5d, 0xe, 0x290, 0x1b, 0x61, 0x23f, 0x2f6, 0x36c, 0x9e, 0x367, 0x173, 0x170, 0x5b, 0x258, 0x29f, 0x195, 0x27c, 0x1e4, 0x1cf, 0x33a, 0x17d, 0x3e0, 0x40, 0x239, 0xa0, 0x363, 0x110, 0x17a, 0x2a8, 0x249, 0xd, 0x3bb, 0x218, 0xa6, 0x135, 0x11f, 0xf4, 0xb5, 0x192, 0x334, 0x3ed, 0x3fb, 0x21, 0x6, 0x256, 0xf, 0x18e, 0x21d, 0x3db, 0x339, 0x235, 0xa, 0x1ef, 0x44, 0xbd, 0x2a8, 0x9b, 0x34, 0x1e7, 0x1c8, 0xed, 0x1cb, 0x2bb, 0x1d5, 0x8a, 0x119, 0x14d, 0x2e8, 0xe0, 0x2b4, 0x2c9, 0xec, 0x3fe, 0x2b1, 0x3a, 0xce, 0x1a4, 0x3e5, 0x273, 0xd4, 0x353, 0x301, 0x1, 0x235, 0xa, 0x1ef, 0x44, 0xbd, 0x2a8, 0x9b, 0x34, 0x1e7, 0x1c8, 0xed, 0x1cb, 0x2bb, 0x1d5, 0x8a, 0x119, 0x14d, 0x2e8, 0xe0, 0x2b4, 0x2c9, 0xec, 0x3fe, 0x2b1, 0x3a, 0xce, 0x1a4, 0x3e5, 0x273, 0xd4, 0x353, 0x301, 0x1, 0x235, 0xa, 0x1ef, 0x44, 0xbd, 0x2a8, 0x9b, 0x34, 0x1e7, 0x1c8, 0xed, 0x1cb, 0x2bb, 0x1d5, 0x8a, 0x119, 0x14d, 0x2e8, 0xe0, 0x2b4, 0x2c9, 0xec, 0x3fe, 0x2b1, 0x3a, 0xce, 0x1a4, 0x3e5, 0x273, 0xd4, 0x353, 0x301, 0x1, 0x235, 0xa, 0x1ef, 0x44, 0xbd, 0x2a8, 0x9b, 0x34, 0x1e7, 0x1c8, 0xed, 0x1cb, 0x2bb, 0x1d5, 0x8a, 0x63, 0x28, 0x363, 0x49, 0x38d, 0x37a, 0x10b, 0x65, 0x162, 0x393, 0x311, 0x23b, 0x246, 0x205, 0x256, 0x3c, 0xd6, 0x269, 0x4f, 0x2c7, 0x38a, 0x253, 0x1d3, 0x5e, 0x9d, 0x122, 0x365, 0x103, 0x37d, 0x22, 0xbd, 0x159, 0x26c, 0x1a0, 0x24f, 0x17e, 0x33e, 0x71, 0x2d7, 0x1b3, 0xd3, 0x386, 0xc7, 0x33, 0x2e7, 0x3f1, 0x35a, 0x170, 0x16c, 0x1c1, 0x2a1, 0x24d, 0x1b8, 0x36e, 0x2be, 0x245, 0x2a0, 0x22e, 0x190, 0xd, 0x2f7, 0x1c8, 0x1da, 0x325, 0x1f5, 0x16f, 0x164, 0x2d9, 0x3e1, 0x163, 0x3f0, 0x339, 0x158, 0x20f, 0x188, 0x12c, 0x137, 0xb3, 0x30b, 0x3dc, 0x1d6, 0x1b1, 0x15, 0x3d6, 0x208, 0xa1, 0x1f4, 0x10c, 0x14c, 0x1ba, 0x3a8, 0x2ee, 0x8a, 0x232, 0x13d, 0x36d, 0x21b, 0x23d, 0x30c, 0x2f5, 0x10e, 0x18a, 0x1ea, 0x167, 0x27c, 0x399, 0xcf, 0x32b, 0x3a7, 0xdf, 0x112, 0x127, 0x28a, 0x18b, 0xc6, 0xa0, 0x32e, 0x99, 0x15c, 0x30f, 0xa9, 0x1d1, 0x130, 0x334, 0x357, 0x307, 0x290, 0xd8, 0x76, 0x3f5, 0x1a5, 0x349, 0x3d1, 0x24b, 0x1e4, 0x263, 0x32b, 0x347, 0x37c, 0x82, 0x254, 0x1f4, 0x218, 0x139, 0x1cb, 0x2fe, 0x16f, 0x2c8, 0x376, 0x337, 0x21d, 0x2e7, 0x3eb, 0x173, 0x392, 0x2ed, 0x5e, 0x13a, 0x81, 0x31e, 0x14, 0x363, 0x92, 0x22f, 0x3e6, 0x94, 0xbb, 0x26, 0x262, 0x3ed, 0x3e7, 0x52, 0x1b, 0x308, 0x2fb, 0x2b1, 0xe8, 0xfb, 0x1ca, 0x238, 0x1cf, 0x1e6, 0x3ef, 0x26b, 0x112, 0x24e, 0x23a, 0x43, 0xa6, 0x1ba, 0x359, 0x3aa, 0x59, 0x368, 0x3e1, 0x2c6, 0x3db, 0x1fe, 0x1ad, 0x170, 0x2d8, 0x30d, 0x125, 0x91, 0x365, 0x206, 0x1ef, 0x110, 0x3c2, 0x37a, 0x216, 0x194, 0x302, 0x14e, 0x2f8, 0x3fb, 0x108, 0x180, 0x61, 0x1dc, 0xd7, 0x1d, 0x19c, 0x13b, 0x47, 0x3be, 0x33a, 0x3fa, 0x18c, 0x280, 0x146, 0x182, 0x3da, 0x270, 0x3d, 0x2d4, 0x51, 0x2a2, 0x3b2, 0x3f, 0x1cc, 0x158, 0x2e, 0xb6, 0x382, 0x125, 0x122, 0x18f, 0x14, 0x2cf, 0x248, 0x15c, 0x217, 0x2a4, 0x293, 0x324, 0x251, 0x5d, 0xe0, 0x18d, 0x30c, 0x3c6, 0xc4, 0x258, 0x1aa, 0x24d, 0x2e9, 0x285, 0x2f3, 0x110, 0x38d, 0x1f3, 0x94, 0x176, 0x98, 0x334, 0x2a7, 0x7, 0xad, 0x19b, 0x2db, 0x87, 0x314, 0x34b, 0xb3, 0x37, 0x1b7, 0x175, 0x20c, 0xbd, 0x16d, 0x281, 0xca, 0x302, 0x29c, 0x3f2, 0x3e7, 0xa4, 0x6c, 0x76, 0x3e3, 0x29d, 0x27e, 0x167, 0x1e2, 0x1ee, 0x3ac, 0x193, 0x2a0, 0xaa, 0x136, 0x340, 0x25c, 0x393, 0x5f, 0x3f8, 0x84, 0x180, 0xc2, 0x379, 0x2b1, 0x1d0, 0x3ec, 0x24b, 0x3c8, 0x19e, 0x16e, 0x15, 0x343, 0xc8, 0x1a, 0x395, 0x17e, 0xe3, 0x319, 0x85, 0xc, 0x242, 0x23f, 0x333, 0x20a, 0x19c, 0x318, 0x212, 0x222, 0x16, 0x3ae, 0x11f, 0x2bf, 0x114, 0x368, 0x39f, 0x33, 0x315, 0x187, 0xde, 0x39a, 0x350, 0x15d, 0x33f, 0x90, 0x297, 0x23a, 0x10c, 0x272, 0x243, 0x36f, 0x2c5, 0x256, 0x1e0, 0x1e5, 0x286, 0xce, 0x276, 0x238, 0x335, 0x25f, 0x20e, 0x343, 0x190, 0x68, 0x97, 0x3cd, 0x5f, 0x3f9, 0x210, 0x1b, 0x3b, 0x3e3, 0x133, 0x1ea, 0x32a, 0x21f, 0x1b7, 0x2ea, 0x22, 0x1e1, 0x2fd, 0x94, 0x2ec, 0x260, 0x196, 0x22a, 0xe0, 0x31a, 0x2b, 0x20f, 0x5b, 0x382, 0x24a, 0x81, 0x63, 0x140, 0x146, 0x304, 0x373, 0x3a4, 0x3d0, 0x226, 0x6d, 0x3f4, 0x185, 0x2e7, 0x3b7, 0x31d, 0x171, 0x6a, 0x2ae, 0x3e0, 0x12, 0x3d5, 0x145, 0x225, 0x14c, 0x1cb, 0x3ea, 0x2dd, 0x34c, 0x3c, 0x2b9, 0x356, 0x31f, 0x348, 0x47, 0x2e3, 0x3cc, 0x347, 0x1eb, 0x32, 0xd, 0x395, 0x2fc, 0x38c, 0xfe, 0x42, 0x180, 0x239, 0x5a, 0x134, 0x160, 0x135, 0x359, 0x16f, 0x26d, 0xf, 0x358, 0x356, 0x237, 0x13b, 0x238, 0x263, 0x16e, 0x54, 0x55, 0x26c, 0x236, 0x302, 0x262, 0x357, 0xe, 0x161, 0x30c, 0x303, 0x5b, 0x30d, 0x13a, 0x1, 0x239, 0x5a, 0x134, 0x160, 0x135, 0x359, 0x16f, 0x26d, 0xf, 0x358, 0x356, 0x237, 0x13b, 0x238, 0x263, 0x16e, 0x54, 0x55, 0x26c, 0x236, 0x302, 0x262, 0x357, 0xe, 0x161, 0x30c, 0x303, 0x5b, 0x30d, 0x13a, 0x1, 0x239, 0x5a, 0x134, 0x160, 0x135, 0x359, 0x16f, 0x26d, 0xf, 0x358, 0x356, 0x237, 0x13b, 0x238, 0x263, 0x16e, 0x54, 0x55, 0x26c, 0x236, 0x302, 0x262, 0x357, 0xe, 0x161, 0x30c, 0x303, 0x5b, 0x30d, 0x13a, 0x1, 0x239, 0x5a, 0x134, 0x160, 0x135, 0x359, 0x16f, 0x26d, 0xf, 0x358, 0x356, 0x237, 0x13b, 0x238, 0x263, 0x16e, 0x54, 0x55, 0x26c, 0x236, 0x302, 0x7b, 0x168, 0x1b2, 0x22d, 0x2e1, 0x3dd, 0x2c5, 0x14a, 0x23f, 0x1ae, 0x3a0, 0x2b7, 0x381, 0x1b7, 0x3ba, 0x220, 0xae, 0x4e, 0x3d, 0x28d, 0x6d, 0x3cb, 0x66, 0x9e, 0x8c, 0x3c3, 0x3be, 0x3cc, 0x107, 0x28f, 0x9b, 0x11b, 0x302, 0xcd, 0x147, 0x70, 0x23d, 0x158, 0x170, 0x1d3, 0x3d2, 0x7c, 0x9, 0x3a3, 0x23a, 0x39, 0x361, 0x1c4, 0x10a, 0xc0, 0x308, 0x3e3, 0xc5, 0x29f, 0x322, 0x3b6, 0x14, 0x255, 0x304, 0x1d7, 0x23e, 0x1d5, 0x2c8, 0x305, 0x1ac, 0x356, 0x67, 0xe5, 0x1e4, 0x271, 0x193, 0x12d, 0x2da, 0x4a, 0x1d1, 0x324, 0x2ac, 0x36d, 0x3f0, 0x3f1, 0x38a, 0x2e2, 0x350, 0x17d, 0x39c, 0x41, 0x284, 0x3ce, 0x1f1, 0x5f, 0x3ff, 0x148, 0x2c9, 0x37e, 0xc4, 0x2e4, 0x24a, 0x204, 0x239, 0xb4, 0xd9, 0x312, 0x374, 0x3ea, 0x366, 0xa5, 0x31b, 0xd7, 0x1d0, 0x35f, 0x3c4, 0x2df, 0x1dd, 0x110, 0xf6, 0x1a9, 0x18b, 0x298, 0x8f, 0x295, 0x18, 0xc2, 0x3f5, 0xc5, 0x137, 0x93, 0x18f, 0x140, 0x222, 0xb0, 0x26a, 0x2fe, 0x1b3, 0xa5, 0x23f, 0x35c, 0x29b, 0x195, 0x6e, 0x285, 0x363, 0x264, 0x373, 0x11f, 0x1d5, 0x199, 0xf, 0x17b, 0x105, 0xfb, 0x13e, 0x3dc, 0x175, 0x88, 0x57, 0x4e, 0x7a, 0x226, 0x368, 0xc7, 0xdb, 0x3c1, 0x299, 0x79, 0x33c, 0x193, 0x25a, 0x37a, 0x250, 0x12f, 0x51, 0x27a, 0x185, 0x315, 0x23, 0x3e5, 0x3be, 0x391, 0x15, 0x55, 0x1a2, 0x328, 0x130, 0x251, 0x1d9, 0x1f8, 0x3f1, 0x31d, 0x39a, 0x2b6, 0x3fd, 0x37c, 0x64, 0xd0, 0x162, 0x131, 0x2a7, 0x70, 0x73, 0x169, 0x392, 0x10f, 0x2ae, 0x33f, 0x89, 0xa1, 0x1e7, 0x1f1, 0xbe, 0x3e7, 0x252, 0xc3, 0x303, 0x16c, 0xbc, 0x20b, 0x100, 0x3d5, 0x23a, 0x72, 0x19f, 0x23b, 0x84, 0x36, 0x3b0, 0x21c, 0xb9, 0x125, 0x1ec, 0x2ad, 0x43, 0x1da, 0x1c4, 0x21, 0x1b, 0x3b0, 0x31, 0x2e4, 0x13a, 0x8, 0x37b, 0x145, 0x218, 0x2cb, 0x23b, 0x108, 0xd8, 0x1bf, 0x188, 0x30d, 0x1c2, 0x40, 0x3ee, 0x23a, 0xe4, 0x275, 0x1fc, 0x52, 0x2c9, 0x1e3, 0x5b, 0x5e, 0x20b, 0x200, 0x34f, 0x1f4, 0x329, 0x38c, 0x3fb, 0x290, 0x265, 0x303, 0x2d8, 0x2f0, 0x7c, 0x24, 0x24e, 0x3bb, 0x17e, 0x5f, 0x3e7, 0xad, 0x30c, 0x2e, 0x2ed, 0x3ad, 0x3e0, 0x120, 0x254, 0x1e7, 0x3e2, 0x2f8, 0x307, 0x161, 0x56, 0x170, 0x345, 0x157, 0x33f, 0x112, 0x284, 0x323, 0x32f, 0x3ed, 0xe, 0x31a, 0x2b0, 0x392, 0x21e, 0x2aa, 0x1ce, 0x82, 0xd, 0x12e, 0x14e, 0x357, 0x70, 0xe6, 0x1ad, 0xaf, 0xd4, 0x17d, 0x26b, 0x19, 0x68, 0x162, 0x262, 0x28e, 0x380, 0x339, 0x173, 0x171, 0x2a9, 0x3fa, 0x37c, 0xc8, 0x340, 0x302, 0x334, 0x5d, 0x3f, 0x1fe, 0x3d8, 0x2a6, 0x218, 0x19f, 0xfe, 0x52, 0x19b, 0x385, 0x2d8, 0x1e9, 0x1f0, 0x120, 0xa1, 0x395, 0x32f, 0x3d3, 0x38, 0xe6, 0x35a, 0x2bc, 0x2a9, 0x3fd, 0x1eb, 0x249, 0x65, 0x98, 0xab, 0x2d3, 0x377, 0x30e, 0x3e5, 0x2e3, 0x16e, 0x149, 0x1bd, 0xa9, 0x16a, 0x232, 0x337, 0xdb, 0x31f, 0x1ca, 0x27f, 0x2be, 0x110, 0x2b8, 0x1d2, 0x177, 0x199, 0x3c, 0x39d, 0x1d0, 0x2ce, 0xdc, 0x5, 0xa3, 0x2c, 0x26a, 0x3ea, 0x306, 0x11a, 0x3fe, 0x18a, 0x1aa, 0x244, 0x239, 0x1a9, 0x225, 0x1da, 0x388, 0x84, 0xd8, 0x37e, 0x229, 0x5e, 0x1f, 0x12, 0x24e, 0x37f, 0x1f1, 0x2f8, 0x207, 0x18d, 0x2b0, 0x32d, 0x6a, 0x17d, 0xdf, 0x64, 0x340, 0x20d, 0xcb, 0x2e8, 0x3f0, 0x3b7, 0x378, 0x2eb, 0x391, 0x54, 0x159, 0x4a, 0x293, 0xa2, 0x3f4, 0xcc, 0x1f2, 0x299, 0x1e4, 0x3ac, 0x11, 0x22f, 0x9c, 0x3d0, 0x59, 0x3b9, 0x28a, 0xe4, 0x1c6, 0x3ff, 0xad, 0x2b, 0x2e0, 0x21e, 0x2ba, 0xdf, 0xc8, 0x11b, 0x4c, 0xab, 0x1af, 0x1c7, 0x46, 0x227, 0xcf, 0x326, 0x1e1, 0x217, 0xf4, 0x228, 0x305, 0x2f6, 0x74, 0x167, 0xdc, 0xa, 0x28c, 0x160, 0x2e1, 0x1a7, 0x30, 0x3b, 0x10e, 0x2e4, 0xe1, 0x80, 0x34f, 0x3d9, 0x2fc, 0x2f8, 0x7, 0x23d, 0x1ad, 0x2bc, 0x15b, 0x3ef, 0x343, 0xd1, 0xbb, 0x241, 0x13d, 0x21d, 0x278, 0x348, 0x1e4, 0x351, 0x44, 0x15c, 0x1d2, 0x2ee, 0x26d, 0x1e0, 0x1ae, 0x27e, 0x2cc, 0x2c3, 0x109, 0xd9, 0x14c, 0x23c, 0x214, 0x36, 0x1bf, 0x229, 0xbc, 0x7c, 0x90, 0xa1, 0x323, 0xa7, 0x2a7, 0x380, 0xff, 0x31d, 0xef, 0xf3, 0x15, 0x2a8, 0x4a, 0x12f, 0x288, 0x39f, 0xdb, 0x237, 0x321, 0x3dc, 0x3ba, 0x248, 0x373, 0xea, 0x1b5, 0xa5, 0x1dc, 0x29d, 0x137, 0x91, 0x318, 0x1a9, 0x43, 0x37b, 0x23a, 0x329, 0x5f, 0x307, 0x31a, 0x1ad, 0x171, 0x165, 0x347, 0x55, 0x216, 0x293, 0x288, 0x337, 0x36c, 0x19c, 0x27c, 0x36e, 0x363, 0x201, 0x135, 0x3dd, 0x6, 0x308, 0x87, 0x2e4, 0x1c2, 0x200, 0x24e, 0x1e7, 0x32f, 0x357, 0x380, 0x1fe, 0x6f, 0x371, 0x32b, 0x2a0, 0x37a, 0x141, 0x113, 0x376, 0x358, 0x1d, 0x2b7, 0xdc, 0x14, 0x222, 0x312, 0x243, 0x85, 0x1b, 0x1bf, 0x5b, 0x2f0, 0x3e0, 0x112, 0xd, 0x162, 0x334, 0x2e8, 0x3db, 0x30e, 0x38f, 0x263, 0x326, 0x3c2, 0x4e, 0x3a9, 0x2c8, 0x78, 0xd7, 0x27e, 0x191, 0x31e, 0x5a, 0x18b, 0x1da, 0x23b, 0x52, 0x265, 0x2e, 0x345, 0x2aa, 0x26b, 0xc8, 0x236, 0x130, 0x151, 0x2c6, 0x9e, 0x1a4, 0x1e4, 0x2ab, 0x110, 0x2f2, 0x11f, 0x16f, 0x256, 0x1dc, 0x133, 0xd5, 0x81, 0x1ec, 0x145, 0xe4, 0x38c, 0x3e7, 0x161, 0x2b0, 0xaf, 0x2a9, 0x3ef, 0x2ff, 0xfa, 0x17e, 0x1f9, 0x38, 0x339, 0x31d, 0x3bc, 0x32b, 0x149, 0x1f3, 0x21a, 0x114, 0x203, 0x39d, 0x29b, 0x2cc, 0x31e, 0xb4, 0x225, 0x2cb, 0x3f8, 0x252, 0x56, 0x32d, 0x350, 0x3ef, 0x117, 0x10b, 0x293, 0x119, 0xc7, 0x356, 0x1f6, 0x30b, 0x206, 0x28c, 0x189, 0x243, 0x10a, 0x6c, 0x1e3, 0x1b9, 0x2af, 0x1ce, 0x32, 0x11b, 0x130, 0x2a2, 0x30a, 0xf9, 0x276, 0xf7, 0x3ba, 0x132, 0x355, 0x2fe, 0x205, 0x184, 0x87, 0x1c1, 0x301, 0x24, 0xa1, 0x97, 0x262, 0xba, 0x3e9, 0x30e, 0x317, 0x19e, 0x106, 0x57, 0x1d2, 0x3aa, 0x291, 0xee, 0x133, 0x1aa, 0x204, 0x37b, 0x7d, 0xbf, 0x2f8, 0x1c, 0x398, 0x38a, 0x1de, 0x391, 0x2a0, 0x2fd, 0x10d, 0x8a, 0x305, 0x3ca, 0x349, 0x166, 0x18f, 0x5a, 0x316, 0x361, 0x1fc, 0x129, 0x2b, 0x392, 0x1a8, 0x3f3, 0x28f, 0x281, 0x34d, 0x288, 0x267, 0x1ab, 0xfb, 0x1f7, 0x3e8, 0x3e2, 0x3af, 0x309, 0x3eb, 0x1fb, 0x39e, 0x326, 0x313, 0xe9, 0x3aa, 0x12b, 0x3b8, 0x18a, 0x296, 0x10, 0x34f, 0x2f7, 0x257, 0x28e, 0xfc, 0x2c7, 0x38f, 0x19e, 0x20c, 0x15c, 0x28b, 0x2de, 0x294, 0x3fe, 0x96, 0x13a, 0x100, 0x95, 0x323, 0x131, 0xba, 0x3db, 0x23, 0x8e, 0x1d6, 0x88, 0x1ed, 0xea, 0x1b3, 0x11a, 0x397, 0x172, 0x384, 0x24, 0x142, 0x25c, 0x334, 0x3b2, 0x1c7, 0x230, 0xf2, 0x15f, 0x92, 0x2ef, 0x2bb, 0x306, 0x184, 0x10e, 0x30d, 0x3e, 0x240, 0xd, 0x181, 0x32c, 0x35e, 0x4f, 0x348, 0x33b, 0x1dd, 0x132, 0x2a3, 0x3ea, 0xc, 0x76, 0xc4, 0xbc, 0x3e0, 0x41, 0xd0, 0x26, 0x2ac, 0x185, 0xf9, 0xe5, 0x3dc, 0x1ef, 0x304, 0x26a, 0x2d7, 0xc0, 0x369, 0x5b, 0x3d2, 0x277, 0x19, 0x11b, 0x260, 0x29a, 0x66, 0x38b, 0x24b, 0x1b7, 0x2cf, 0x2c, 0x2e1, 0x123, 0x1b, 0x3ee, 0x3bb, 0x32f, 0x28e, 0x1f8, 0x30e, 0x47, 0x1d6, 0x110, 0x3bd, 0x359, 0x306, 0x308, 0x31, 0x5e, 0x3e0, 0x82, 0x340, 0x130, 0x29a, 0xcc, 0x237, 0x27c, 0x346, 0x146, 0x312, 0x23c, 0x108, 0x265, 0x170, 0xd4, 0x3ef, 0x55, 0x94, 0x1a1, 0x376, 0x2f6, 0x349, 0x191, 0xc6, 0x2ad, 0xe4, 0x5f, 0xe, 0x339, 0x6f, 0x3be, 0x362, 0x3c2, 0x270, 0x3aa, 0x256, 0x2fb, 0x4b, 0x13a, 0x200, 0x254, 0x12e, 0x334, 0x36d, 0x315, 0x1a4, 0x33b, 0x3ba, 0xc1, 0x135, 0x2d7, 0x180, 0x1bf, 0x2d8, 0x157, 0x26b, 0x249, 0xbb, 0x51, 0x337, 0x356, 0x3d1, 0xdc, 0xa0, 0x1b2, 0x1da, 0x1fc, 0xad, 0x2b0, 0x171, 0x33a, 0x54, 0x37a, 0x21a, 0x59, 0x78, 0x2b1, 0x29f, 0x81, 0x37b, 0x1f4, 0x3e2, 0x357, 0x3f, 0x367, 0x38f, 0x33c, 0x22, 0x2f2, 0xea, 0x366, 0x61, 0x87, 0x30d, 0x7c, 0x112, 0x68, 0x26, 0x3d5, 0x2f7, 0x14e, 0xba, 0x377, 0x230, 0x3c8, 0x1dd, 0xc1, 0x26a, 0x34e, 0x1b, 0x3c6, 0x3a6, 0x17d, 0x3a5, 0x10b, 0xb5, 0x2d9, 0x17b, 0x349, 0x322, 0x318, 0x145, 0x25b, 0x3f2, 0x380, 0x3df, 0x3c3, 0x33c, 0x44, 0x3da, 0x359, 0x205, 0x3b, 0x188, 0x1e9, 0xe7, 0xc8, 0x328, 0x22c, 0x337, 0x2a5, 0x35f, 0x2e9, 0x212, 0x225, 0x275, 0x3c7, 0x73, 0x38a, 0x2eb, 0x1b1, 0x3c2, 0xe9, 0x2b3, 0x294, 0x3e3, 0x172, 0x20b, 0x240, 0x34, 0x26, 0x2a2, 0x66, 0x237, 0xf1, 0x103, 0x222, 0x14c, 0x319, 0x290, 0xac, 0x2bc, 0x33a, 0xa8, 0x1f3, 0xf4, 0x199, 0x31b, 0x133, 0x14b, 0x20, 0x24e, 0x24f, 0x19a, 0x36d, 0x223, 0x299, 0x1ee, 0x3de, 0x16, 0x1cb, 0x10a, 0x360, 0x2e, 0x35, 0x3f3, 0x55, 0x128, 0x28d, 0x386, 0x333, 0x1ea, 0x91, 0x3d8, 0xfa, 0x3e2, 0x2a7, 0xfc, 0x30e, 0x8e, 0x351, 0x92, 0x3a3, 0x3ce, 0x262, 0x3b2, 0x223, 0x13b, 0x3b1, 0x2cf, 0x160, 0x11e, 0x210, 0x30c, 0x253, 0x2ca, 0x54, 0x1f3, 0x1e8, 0x26d, 0xee, 0x314, 0x13a, 0x12, 0x101, 0x302, 0x2ac, 0x33, 0x237, 0x1e2, 0x5, 0x134, 0xed, 0x3f8, 0x161, 0x2bd, 0x1de, 0x16e, 0x1e1, 0xe9, 0x16f, 0x242, 0x327, 0x30d, 0x1f0, 0x104, 0x236, 0x241, 0x3cb, 0x356, 0x35f, 0x1db, 0x5a, 0x10c, 0x311, 0xe, 0xff, 0x2f9, 0x263, 0x11, 0x1ed, 0x359, 0x3, 0xec, 0x5b, 0x2af, 0xdf, 0x26c, 0x34d, 0xda, 0x358, 0x3a0, 0x322, 0x239, 0x11d, 0x2fc, 0x357, 0xfc, 0x215, 0x238, 0x2be, 0x132, 0x135, 0x34e, 0x36, 0x303, 0x10f, 0x3fd, 0x55, 0x250, 0x226, 0xf, 0x35c, 0x137, 0x1, 0x3a3, 0x3ce, 0x262, 0x3b2, 0x223, 0x13b, 0x3b1, 0x2cf, 0x160, 0x11e, 0x210, 0x30c, 0x253, 0x2ca, 0x54, 0x1f3, 0x1e8, 0x26d, 0xee, 0x314, 0x13a, 0x34f, 0x323, 0x334, 0x35e, 0xf9, 0x24b, 0x346, 0x222, 0x139, 0x1fc, 0x161, 0x173, 0x371, 0x362, 0x22f, 0x11f, 0x366, 0x308, 0x188, 0x3ad, 0x26b, 0x26c, 0x293, 0x368, 0x2f6, 0x27e, 0x91, 0x37b, 0x3bb, 0x14e, 0x2e8, 0x315, 0x13b, 0x36b, 0x32e, 0x312, 0x1c4, 0x290, 0x2b0, 0x39a, 0x32b, 0x17a, 0x270, 0x16f, 0x8d, 0x87, 0x5e, 0x33f, 0xc8, 0xbb, 0x288, 0x6b, 0xe8, 0x191, 0x239, 0x23a, 0x3e2, 0x28e, 0x3db, 0x230, 0x33b, 0x1ef, 0x2c, 0x243, 0x108, 0x30c, 0xaf, 0x33a, 0x2a0, 0x30f, 0x177, 0x256, 0x3f5, 0x2e4, 0x7c, 0x82, 0x236, 0x8b, 0x337, 0x286, 0x195, 0x31e, 0x2ad, 0x329, 0x3ed, 0x3f, 0x30e, 0x238, 0x175, 0xc1, 0x1ba, 0x85, 0x2c9, 0x170, 0x2a9, 0x20e, 0x37a, 0xf4, 0x26d, 0x1dc, 0x4b, 0x1c2, 0x120, 0x68, 0x130, 0xfd, 0x36c, 0x3d1, 0x2e9, 0x5a, 0x218, 0x5f, 0x70, 0x3eb, 0x297, 0x97, 0x196, 0x185, 0x31f, 0x3c4, 0x28, 0x2c1, 0x275, 0x207, 0xff, 0x3f6, 0x271, 0x49, 0x2a3, 0x1a7, 0x6c, 0x2e, 0x1a8, 0x107, 0x37a, 0x1e8, 0x1a6, 0x2fb, 0xb9, 0x3e, 0x82, 0x65, 0x22c, 0x18e, 0x3a, 0x2cc, 0x239, 0x7d, 0x393, 0x5d, 0x1c7, 0x299, 0x36b, 0x255, 0x53, 0x23b, 0x15a, 0x2bd, 0x371, 0x2cd, 0xae, 0xea, 0x205, 0x1d8, 0x2d8, 0x15d, 0x343, 0x94, 0x226, 0x3c, 0x1a5, 0x14b, 0x100, 0x284, 0x20d, 0x14d, 0x269, 0x1f6, 0x370, 0x5a, 0x39, 0x17c, 0x380, 0x2c7, 0x11c, 0x175, 0x182, 0x2e1, 0x21, 0xc3, 0x253, 0x33a, 0x149, 0x27, 0x3aa, 0x121, 0x247, 0x5e, 0x277, 0x320, 0x1d1, 0xda, 0x17b, 0x27e, 0x122, 0x1f7, 0x1e7, 0xcd, 0x1af, 0xf9, 0x9f, 0x103, 0x134, 0x3b4, 0x3f7, 0xe6, 0xde, 0x335, 0x22, 0x373, 0x3ea, 0x180, 0x3c6, 0x10f, 0x3ef, 0x159, 0x10d, 0x2c8, 0x127, 0x25c, 0xab, 0x66, 0x338, 0xdc, 0x2d, 0x39, 0x2f8, 0x21b, 0x215, 0x1e4, 0x2f3, 0x58, 0x23c, 0x148, 0x169, 0xef, 0x1b1, 0x57, 0xea, 0x3, 0x369, 0x2ed, 0x1fd, 0xaa, 0x141, 0x164, 0x77, 0x4b, 0x301, 0x224, 0x236, 0x22c, 0x31c, 0xe8, 0x24d, 0x3d8, 0x3bb, 0x131, 0x2d3, 0xf9, 0x13e, 0x5, 0x1b2, 0x33e, 0x207, 0x1fe, 0x3c3, 0x3ac, 0x99, 0xdd, 0x10a, 0x265, 0x253, 0x27d, 0x12d, 0x138, 0x2de, 0x61, 0xc4, 0x353, 0x37c, 0x10b, 0x342, 0xf, 0x2d6, 0x14b, 0x200, 0x202, 0x4c, 0xfd, 0x1ab, 0x167, 0x31e, 0x2a6, 0x2fc, 0x28e, 0x377, 0x348, 0x36b, 0xa3, 0x14c, 0x1fc, 0x18d, 0x31d, 0x1cf, 0x11, 0x373, 0x3dd, 0x209, 0x20f, 0xd4, 0x107, 0x2fd, 0x3a9, 0x12b, 0x3e3, 0x30d, 0x39b, 0x190, 0x1d1, 0x1b4, 0x1e5, 0x3d4, 0x204, 0x297, 0x12e, 0x251, 0x33, 0x19c, 0x6e, 0x212, 0x218, 0x24e, 0x162, 0x151, 0x269, 0x3d1, 0x365, 0x2ad, 0x17e, 0x28e, 0x2e7, 0x13b, 0x36e, 0x222, 0x1da, 0x3e7, 0x339, 0x3f6, 0x1d6, 0x99, 0x1ba, 0x21, 0x30c, 0x171, 0x32b, 0x3c2, 0x11f, 0x306, 0x3b0, 0x2ed, 0x3fa, 0x2a8, 0x21a, 0x26d, 0x2fb, 0x2e4, 0x3e0, 0xc8, 0x1d1, 0x368, 0x39d, 0x29f, 0x8, 0x254, 0x302, 0x29a, 0x36c, 0x2b7, 0x31e, 0x145, 0x3e2, 0x5d, 0x315, 0x1ca, 0x346, 0x134, 0x2cb, 0x307, 0x1fe, 0x38f, 0x2ab, 0xc1, 0x1cb, 0x108, 0x56, 0x39a, 0x16e, 0x22f, 0xea, 0x6, 0x1bf, 0x345, 0x3ef, 0x16d, 0xf4, 0x34c, 0x3f5, 0x30d, 0x33f, 0x249, 0x293, 0x376, 0xd7, 0xd5, 0x40, 0x284, 0x26, 0xfd, 0x356, 0x195, 0xc6, 0x23a, 0x32f, 0x2e8, 0x9e, 0x24b, 0x206, 0x1b2, 0x275, 0xe, 0x3eb, 0x47, 0x175, 0x201, 0x243, 0x52, 0x2b0, 0xef, 0x362, 0x15c, 0x359, 0x30, 0x1e3, 0x21e, 0x347, 0x95, 0x181, 0x29a, 0x2d1, 0x2ce, 0xc6, 0x7d, 0xa7, 0x36d, 0x1f2, 0x1e2, 0xa0, 0x86, 0x17c, 0x3f, 0x8c, 0xf7, 0x32e, 0x14c, 0x3f9, 0xe6, 0x2f9, 0xeb, 0x99, 0x374, 0x84, 0x56, 0x33d, 0x1b1, 0x15c, 0x2bb, 0xc0, 0x303, 0x1a8, 0x2a, 0x30f, 0x35d, 0x234, 0x188, 0x2ae, 0x343, 0xa9, 0xb2, 0xee, 0x258, 0xf8, 0x64, 0x1d1, 0x2d9, 0x26f, 0xd5, 0x80, 0x202, 0x130, 0x3cb, 0x20a, 0x191, 0x3d8, 0x2f7, 0x334, 0x185, 0xce, 0xdc, 0xb4, 0x390, 0x357, 0x3bf, 0x299, 0x36e, 0x4d, 0x361, 0x307, 0x3fc, 0x227, 0x175, 0xb, 0x11e, 0x290, 0x35a, 0x1df, 0x106, 0x373, 0x36f, 0xd8, 0x2e0, 0x19d, 0x12d, 0xe9, 0x1b3, 0x76, 0x1b9, 0x1fd, 0x2a8, 0x3d, 0x1a6, 0x3f5, 0x213, 0xe7, 0x26c, 0x16a, 0x203, 0x1a5, 0x24a, 0x90, 0x340, 0x116, 0x231, 0x349, 0x122, 0x3a3, 0x12e, 0x156, 0x330, 0x3d1, 0x12a, 0x20d, 0xfd, 0x143, 0x166, 0x1ec, 0x2f7, 0x261, 0x21d, 0x279, 0x1db, 0x2ad, 0x1f1, 0xba, 0x9e, 0x13e, 0x28, 0x43, 0x17c, 0x7e, 0x230, 0x3b1, 0x28c, 0x1da, 0x387, 0x3fc, 0x47, 0x1dd, 0x58, 0x1c4, 0x2b4, 0x31d, 0x263, 0x49, 0x26a, 0x21, 0x2b, 0x33d, 0x362, 0x179, 0x1f5, 0x1b, 0xb8, 0x2ca, 0x12d, 0x1d2, 0x2c5, 0x3b0, 0x3a6, 0x3d7, 0x37a, 0x2bf, 0x121, 0x31, 0x2af, 0x3a5, 0xa9, 0x164, 0x3b8, 0x2e4, 0x39b, 0x9b, 0xb5, 0x203, 0x34a, 0x13a, 0x89, 0x65, 0x288, 0x17b, 0x3a1, 0x8, 0x142, 0x4c, 0x3e1, 0x20a, 0x322, 0x37b, 0x395, 0x32c, 0xcc, 0x3ec, 0x2c3, 0x145, 0x393, 0x1d9, 0xf9, 0x1e2, 0x140, 0x218, 0x3f2, 0x3f0, 0x1a4, 0x1b7, 0x4d, 0x2cb, 0x7, 0x3df, 0x238, 0x2f3, 0x2c0, 0x23b, 0x18d, 0xde, 0x33c, 0x248, 0x374, 0x108, 0x158, 0x1de, 0x326, 0x3da, 0x3b3, 0xd8, 0x254, 0x26, 0x3e1, 0x1d, 0x93, 0x3ee, 0x12e, 0x151, 0x36c, 0x195, 0x239, 0x3bb, 0x334, 0x21d, 0xfb, 0x365, 0x145, 0x32f, 0x36d, 0x3c1, 0x21f, 0x5a, 0x329, 0x28e, 0x315, 0x24b, 0x14, 0x43, 0x2f8, 0x1f8, 0x1a4, 0x36e, 0x134, 0x275, 0x70, 0x30e, 0x33b, 0x32e, 0x139, 0x3e7, 0x1fe, 0x47, 0x3ba, 0x160, 0x23b, 0x31a, 0x378, 0x1d6, 0xc1, 0x243, 0x290, 0x173, 0x1cf, 0x110, 0x135, 0x21, 0x56, 0xef, 0x326, 0x3bd, 0x2d7, 0x2c9, 0xaf, 0x32b, 0x22f, 0x359, 0x180, 0x2e, 0x165, 0x12d, 0x3a4, 0x306, 0x1bf, 0x21e, 0x20e, 0x30f, 0x16f, 0x308, 0x2d8, 0x3fa, 0x16d, 0x3a9, 0x294, 0x31, 0x157, 0x28f, 0x141, 0x26d, 0x3f5, 0x5e, 0x26b, 0x216, 0x8a, 0x23f, 0x258, 0x3e0, 0x249, 0xb5, 0xf, 0x133, 0x1c2, 0x82, 0xbb, 0x368, 0xd7, 0x2a1, 0x24, 0x340, 0x51, 0x358, 0x3d4, 0x8, 0x284, 0x130, 0xa1, 0x98, 0x337, 0x1d0, 0x244, 0x24e, 0x20d, 0x3f4, 0x1d, 0x126, 0x3a3, 0x162, 0x13d, 0x143, 0x191, 0x2ff, 0x97, 0x151, 0x2d1, 0x25d, 0x1ec, 0x3ce, 0x251, 0x269, 0x167, 0x318, 0x3bb, 0x261, 0x66, 0x3d1, 0x235, 0xfa, 0x262, 0x185, 0x279, 0x365, 0x28a, 0xa7, 0x35e, 0x67, 0x370, 0x2ad, 0x3cd, 0x3b2, 0x3c1, 0x37, 0x168, 0x17e, 0xba, 0x278, 0x3c4, 0x212, 0x390, 0x28e, 0x223, 0x13e, 0xa0, 0x39, 0x3af, 0x2e7, 0x394, 0xa, 0x43, 0x1f9, 0x3e9, 0x13b, 0x285, 0x2c1, 0x5f, 0x7e, 0xd2, 0x36e, 0x268, 0x1c6, 0x380, 0x8c, 0x3b1, 0x222, 0x19f, 0x38, 0x30e, 0x27f, 0xa3, 0x1da, 0x207, 0x3b7, 0x1e4, 0x2cf, 0x298, 0x3e7, 0x3fc, 0x11c, 0x1ef, 0x22d, 0x3f9, 0x339, 0x317, 0x1dd, 0x160, 0x7f, 0x73, 0x3f6, 0x15f, 0x16, 0x1c4, 0x2c2, 0x1bc, 0x1d6, 0x182, 0x11e, 0xad, 0x31d, 0x19e, 0x99, 0x142, 0x260, 0x18e, 0x13f, 0x2, 0x284, 0xc9, 0x31c, 0x27e, 0x4, 0x101, 0x192, 0x231, 0xf5, 0x8, 0x202, 0x324, 0x6b, 0x1ea, 0x10, 0xd, 0x241, 0xd6, 0x3d4, 0x20, 0x1a, 0x8b, 0x1ac, 0x3a1, 0x40, 0x34, 0x116, 0x358, 0x34b, 0x80, 0x68, 0x22c, 0x2b9, 0x29f, 0x100, 0xd0, 0x51, 0x17b, 0x137, 0x200, 0x1a0, 0xa2, 0x2f6, 0x26e, 0x9, 0x340, 0x144, 0x1e5, 0xd5, 0x12, 0x289, 0x288, 0x3ca, 0x1aa, 0x24, 0x11b, 0x119, 0x39d, 0x354, 0x48, 0x236, 0x232, 0x333, 0x2a1, 0x90, 0x65, 0x6d, 0x26f, 0x14b, 0x120, 0xca, 0xda, 0xd7, 0x296, 0x240, 0x194, 0x1b4, 0x1ae, 0x125, 0x89, 0x328, 0x368, 0x35c, 0x24a, 0x112, 0x259, 0x2d9, 0x2b1, 0x9d, 0x224, 0xbb, 0x1bb, 0x16b, 0x13a, 0x41, 0x176, 0x376, 0x2d6, 0x274, 0x82, 0x2ec, 0x2e5, 0x1a5, 0xe1, 0x104, 0x1d1, 0x1c3, 0x34a, 0x1c2, 0x284, 0x192, 0x6b, 0x3d4, 0x40, 0x68, 0x51, 0x2f6, 0xd5, 0x24, 0x236, 0x6d, 0xd7, 0x125, 0x112, 0xbb, 0x376, 0x1a5, 0x1c2, 0x19, 0x293, 0xf, 0x18a, 0x7c, 0x249, 0x1a1, 0x3c0, 0x258, 0x33f, 0x344, 0x8a, 0x1dc, 0x30d, 0x26b, 0x94, 0x2c8, 0x3f5, 0x2f0, 0x3d6, 0x141, 0x34c, 0x87, 0x157, 0x55, 0xf4, 0x294, 0x188, 0x17d, 0x16d, 0x177, 0x61, 0x2d8, 0x3ef, 0x3e6, 0x16f, 0x76, 0x345, 0x20e, 0x4e, 0x366, 0x1bf, 0xd4, 0x2a0, 0x3a4, 0x6, 0x303, 0x165, 0x17a, 0xea, 0x180, 0x170, 0x1e6, 0x22f, 0x2fe, 0xd8, 0xaf, 0x16e, 0x2f2, 0x2d7, 0x265, 0x39a, 0x326, 0x1d7, 0x85, 0x56, 0x371, 0x22, 0x135, 0x108, 0x1ad, 0x1cf, 0x92, 0x1cb, 0x290, 0x38a, 0x33c, 0xc1, 0x23c, 0x161, 0x378, 0x2ab, 0x2c, 0x23b, 0xe6, 0x38f, 0x3ba, 0x312, 0x3fb, 0x1fe, 0x238, 0x363, 0x139, 0x307, 0x367, 0x101, 0x241, 0x358, 0x137, 0x12, 0x236, 0xda, 0x35c, 0x13a, 0x104, 0x34d, 0xf, 0x314, 0x1f0, 0x26c, 0x226, 0xee, 0x30d, 0xdf, 0x250, 0x26d, 0x327, 0x2af, 0x55, 0x1e8, 0x242, 0x5b, 0x3fd, 0x1f3, 0x16f, 0xec, 0x10f, 0x54, 0xe9, 0x3, 0x303, 0x2ca, 0x1e1, 0x359, 0x36, 0x253, 0x16e, 0x1ed, 0x34e, 0x30c, 0x1de, 0x11, 0x135, 0x210, 0x2bd, 0x263, 0x132, 0x11e, 0x161, 0x2f9, 0x2be, 0x160, 0x3f8, 0xff, 0x238, 0x2cf, 0xed, 0xe, 0x215, 0x3b1, 0x134, 0x311, 0xfc, 0x13b, 0x5, 0x10c, 0x357, 0x223, 0x1e2, 0x5a, 0x2fc, 0x3b2, 0x237, 0x1db, 0x11d, 0x262, 0x33, 0x35f, 0x239, 0x3ce, 0x2ac, 0x356, 0x322, 0x3a3, 0x302, 0x3cb, 0x3a0, 0x1, 0x101, 0x241, 0x358, 0x137, 0x12, 0x236, 0xda, 0x35c, 0x13a, 0x104, 0x34d, 0xf, 0x314, 0x1f0, 0x26c, 0x226, 0xee, 0x30d, 0xdf, 0x250, 0x26d, 0x202, 0x116, 0x2f6, 0x354, 0x240, 0xbb, 0x1c3, 0x266, 0x7c, 0x136, 0x226, 0x1dc, 0x2f, 0x2f1, 0x141, 0x12b, 0x62, 0x17d, 0x1bd, 0x35d, 0x76, 0x10f, 0xa8, 0x3a4, 0x18, 0x5c, 0x1e6, 0xae, 0x3b3, 0x265, 0x273, 0x20c, 0x135, 0x29, 0x2e6, 0x33c, 0x304, 0x388, 0xe6, 0x227, 0x3de, 0x139, 0x7, 0x215, 0x36b, 0xd9, 0xbe, 0x3db, 0x321, 0x140, 0x329, 0x174, 0x38b, 0x2e9, 0x11d, 0xcd, 0xcc, 0x2ce, 0x3d8, 0x12e, 0x27a, 0x3a, 0x81, 0x142, 0x324, 0x358, 0x26e, 0x48, 0x194, 0x1bb, 0x34a, 0x20b, 0x320, 0x342, 0x23f, 0x382, 0xdf, 0xa9, 0x1a6, 0x10e, 0x2aa, 0x2b2, 0x2ee, 0x308, 0x3a6, 0x15, 0x270, 0x3, 0x20f, 0x33a, 0x313, 0x1f5, 0x2c9, 0x1cd, 0x245, 0x2a3, 0x84, 0x35a, 0x263, 0x264, 0x71, 0x31a, 0x3c3, 0x37d, 0xa6, 0x387, 0x2c7, 0x1ee, 0x9a, 0x311, 0x1f8, 0xe5, 0x28, 0xe4, 0xd, 0x51, 0x39d, 0x125, 0x82, 0x293, 0x78, 0x258, 0x1ce, 0x94, 0x26d, 0x87, 0x2aa, 0x16d, 0x3aa, 0x76, 0x21e, 0x2a0, 0x11f, 0x180, 0x392, 0x16e, 0x3bd, 0x85, 0x2b0, 0x1cf, 0x99, 0x23c, 0x31a, 0x38f, 0x1ef, 0x139, 0xe, 0x46, 0x36e, 0x18b, 0x3ed, 0x315, 0x3c4, 0x2d0, 0x32f, 0x2c6, 0x3d1, 0x239, 0x323, 0x29a, 0x1d, 0x81, 0x284, 0x8b, 0x2f6, 0x2a1, 0x112, 0x1d1, 0xf, 0x4b, 0x33f, 0x216, 0x2c8, 0x397, 0x157, 0x2a8, 0x177, 0x308, 0x345, 0x54, 0x3a4, 0x30, 0x170, 0x32b, 0x2f2, 0x295, 0x56, 0x3be, 0x92, 0x243, 0x161, 0x3f6, 0x3ba, 0xa6, 0x307, 0x30e, 0x36b, 0x1b2, 0x2f8, 0x2e7, 0x27c, 0x5a, 0x3e2, 0x35e, 0xfb, 0xc6, 0x1e7, 0x151, 0x286, 0x91, 0x254, 0x192, 0x358, 0xd5, 0x120, 0xbb, 0x386, 0x18a, 0x3e0, 0x344, 0x59, 0x3f5, 0x3ad, 0x55, 0x3a9, 0x61, 0x2ed, 0x20e, 0x1a, 0x144, 0xd7, 0x274, 0x64, 0x1a1, 0x77, 0x2f, 0x3d6, 0x3d, 0x242, 0x2d8, 0x287, 0x138, 0x6, 0x5c, 0x391, 0x2f2, 0x123, 0x158, 0x1cf, 0x132, 0xe2, 0xe6, 0x8e, 0x197, 0x2cb, 0x309, 0x299, 0x14, 0x1c8, 0x174, 0x237, 0x2c3, 0x3d9, 0xab, 0x2a5, 0x24c, 0x254, 0x324, 0x17b, 0x2a1, 0x224, 0x34d, 0x78, 0xb9, 0x331, 0xa9, 0x291, 0xc4, 0x3fa, 0x3c5, 0x1b3, 0x1e3, 0x2ca, 0x313, 0x3dd, 0xc3, 0x3bc, 0x110, 0x396, 0x2b4, 0x3f6, 0x37d, 0x298, 0xe, 0x8c, 0x1a3, 0x43, 0x2a7, 0x278, 0xdc, 0x28a, 0x19a, 0x269, 0x166, 0x3a3, 0x26, 0x31c, 0x34b, 0x24, 0x328, 0x1c3, 0x18a, 0x3c9, 0x10b, 0x2c8, 0x327, 0x155, 0x16d, 0x35d, 0x1d8, 0xd4, 0x25a, 0x3a8, 0xd8, 0x2e2, 0x83, 0x135, 0xa4, 0x233, 0x2ab, 0x2c0, 0x3f7, 0x367, 0x3dc, 0xd9, 0x2f8, 0x1c7, 0x1e2, 0x2d0, 0x257, 0x30a, 0x2b7, 0x34, 0x119, 0x2b1, 0x301, 0x9b, 0x8a, 0x3fe, 0x353, 0x2a8, 0x1d5, 0xec, 0xd4, 0xbd, 0x2bb, 0x2c9, 0x273, 0x44, 0x1cb, 0x2b4, 0x3e5, 0x1ef, 0xed, 0xe0, 0x1a4, 0xa, 0x1c8, 0x2e8, 0xce, 0x235, 0x1e7, 0x14d, 0x3a, 0x1, 0x34, 0x119, 0x2b1, 0x301, 0x9b, 0x8a, 0x3fe, 0x353, 0x2a8, 0x1d5, 0xec, 0xd4, 0xbd, 0x2bb, 0x2c9, 0x273, 0x44, 0x1cb, 0x2b4, 0x3e5, 0x1ef, 0xed, 0xe0, 0x1a4, 0xa, 0x1c8, 0x2e8, 0xce, 0x235, 0x1e7, 0x14d, 0x3a, 0x1, 0x34, 0x119, 0x2b1, 0x301, 0x9b, 0x8a, 0x3fe, 0x353, 0x2a8, 0x1d5, 0xec, 0xd4, 0xbd, 0x2bb, 0x2c9, 0x273, 0x44, 0x1cb, 0x2b4, 0x3e5, 0x1ef, 0xed, 0xe0, 0x1a4, 0xa, 0x1c8, 0x2e8, 0xce, 0x235, 0x1e7, 0x14d, 0x3a, 0x1, 0x34, 0x119, 0x2b1, 0x301, 0x9b, 0x8a, 0x3fe, 0x353, 0x2a8, 0x1d5, 0xec, 0xd4, 0xbd, 0x2bb, 0x2c9, 0x68, 0x6d, 0x1a5, 0x7c, 0x344, 0x2c8, 0x87, 0x17d, 0x3e6, 0x366, 0x303, 0x1e6, 0x2f2, 0x85, 0x1ad, 0x33c, 0x2c, 0x3fb, 0x367, 0x36b, 0x18b, 0x357, 0xf9, 0x2e9, 0x1f4, 0xab, 0x286, 0x81, 0xd, 0x288, 0x2b1, 0x20b, 0x26c, 0x59, 0x397, 0x2aa, 0x37a, 0x36a, 0x1e3, 0x33a, 0x15c, 0x295, 0x2b0, 0x263, 0x201, 0x1fc, 0x3eb, 0x1ee, 0x1b2, 0x3ed, 0x9e, 0xdc, 0x23a, 0x196, 0x356, 0x91, 0x284, 0x51, 0xd7, 0x1c2, 0x249, 0x8a, 0x3f5, 0x157, 0x16d, 0x16f, 0x1bf, 0x165, 0x22f, 0x2d7, 0x56, 0x1cf, 0xc1, 0x23b, 0x1fe, 0x33b, 0x134, 0x2f8, 0x315, 0x21f, 0x145, 0x334, 0x36c, 0x93, 0x254, 0x8b, 0x39d, 0x13a, 0xc8, 0x113, 0x2fb, 0x3ad, 0x2a8, 0x3aa, 0x3b0, 0x2a9, 0x3c2, 0x3dd, 0x30c, 0x3be, 0x99, 0x1c4, 0x339, 0x1e4, 0x222, 0x5f, 0x2e7, 0x3c4, 0x2ad, 0x262, 0x269, 0x191, 0x24e, 0x192, 0xd0, 0x1b4, 0x133, 0x3c9, 0x4a, 0x34c, 0x310, 0x3a7, 0x270, 0x60, 0x253, 0x326, 0x26a, 0x252, 0x3f6, 0x3de, 0x361, 0x3f, 0x394, 0x2d, 0x32f, 0x33, 0x25d, 0x34f, 0x260, 0x17b, 0x125, 0x32, 0x28d, 0x2fb, 0x353, 0x2b2, 0x16f, 0x37e, 0x19d, 0x15c, 0x123, 0x2d2, 0x33c, 0x58, 0x3f7, 0x30e, 0x2d5, 0x10c, 0x5d, 0x67, 0x63, 0x323, 0x1fa, 0x13f, 0x200, 0x328, 0x203, 0x258, 0xdf, 0x10d, 0x8d, 0x1d3, 0x150, 0xea, 0x1b0, 0x273, 0x110, 0x8f, 0x73, 0x238, 0x28c, 0x22b, 0x2e7, 0x381, 0x2a6, 0x334, 0x2d1, 0x24c, 0x284, 0xa2, 0x35c, 0x20b, 0xd1, 0x164, 0x87, 0x2fa, 0x383, 0x306, 0x5c, 0xb7, 0x1d7, 0x210, 0x233, 0x175, 0x14c, 0x38, 0x1a4, 0x28, 0xbf, 0x35e, 0x3ab, 0x3b9, 0x302, 0x31c, 0x26e, 0x112, 0x12f, 0x31b, 0x5e, 0x117, 0x2bf, 0x76, 0x1a8, 0x1e1, 0x3dd, 0x211, 0x2e3, 0xc1, 0x1a0, 0x2d9, 0x18a, 0xe7, 0x152, 0x294, 0x372, 0xa8, 0xea, 0x360, 0x1de, 0x92, 0xe2, 0x27b, 0x33b, 0xd9, 0x3d3, 0xf9, 0x3b6, 0x37f, 0x29a, 0x3a0, 0x80, 0x194, 0x203, 0xb9, 0x37c, 0x7a, 0xc2, 0x21e, 0xbd, 0x1f5, 0x30c, 0x2e3, 0x182, 0x1fc, 0x3b7, 0x2df, 0x43, 0x22a, 0x67, 0xc6, 0x97, 0x3cb, 0x3d4, 0x90, 0x3a2, 0x3c0, 0x2f, 0x117, 0x177, 0x1d8, 0x15b, 0x22f, 0x34e, 0x169, 0x33c, 0xb0, 0x3c7, 0x46, 0x103, 0x1c8, 0x36d, 0x3ec, 0x3d8, 0x302, 0x231, 0x1aa, 0x82, 0x2d4, 0x3b8, 0x3ad, 0x2b2, 0x2de, 0x1e3, 0xf3, 0x1ed, 0x21, 0x1c5, 0x15f, 0xa6, 0x38, 0x348, 0xa0, 0x1f1, 0x185, 0x195, 0x3a3, 0x260, 0x2f6, 0x9d, 0x190, 0x8a, 0x3cf, 0x15d, 0x3e6, 0x183, 0x5c, 0x16e, 0x355, 0xa4, 0x378, 0x2f3, 0x3b4, 0x3f, 0x321, 0xb4, 0x14e, 0x330, 0x322, 0x254, 0x22c, 0x1ae, 0x20b, 0x340, 0x376, 0x4b, 0x26b, 0x21a, 0x61, 0x21e, 0x17a, 0x3dd, 0x56, 0x263, 0x2c, 0x3e7, 0x46, 0x206, 0x329, 0x35e, 0x2b7, 0x3ee, 0x130, 0x2f6, 0x13a, 0x249, 0x59, 0x87, 0x3fa, 0x4e, 0x30, 0xaf, 0x106, 0x1cb, 0x31a, 0x238, 0x222, 0x2f8, 0x9e, 0x2e9, 0x3bb, 0x29a, 0x349, 0x200, 0xbb, 0x78, 0x30d, 0x28f, 0x177, 0x3b0, 0x165, 0x15c, 0x85, 0x173, 0x2ab, 0xa6, 0x70, 0x13b, 0x109, 0x32f, 0xcc, 0x191, 0x254, 0x51, 0x2b1, 0x7c, 0x216, 0x34c, 0x5b, 0x20e, 0x11f, 0xd8, 0xef, 0x92, 0x1c4, 0x1fe, 0x1ee, 0x18b, 0x28e, 0x237, 0xc6, 0x12e, 0x337, 0x29f, 0x112, 0xb5, 0x1dc, 0x3ad, 0x16d, 0x36a, 0x303, 0x32b, 0x1d7, 0x52, 0x378, 0x1ef, 0x2cb, 0x1f8, 0x27c, 0x2ad, 0x334, 0x356, 0x81, 0x68, 0x368, 0x18a, 0x1ce, 0x141, 0x8d, 0x345, 0x12d, 0x2fe, 0x30c, 0x1cf, 0x201, 0x3fb, 0x30e, 0x289, 0x1c3, 0x258, 0x2f1, 0x3d0, 0x76, 0x15b, 0xae, 0x85, 0x2e6, 0x2be, 0x139, 0x309, 0x321, 0x2d0, 0xcd, 0x1ab, 0x81, 0xd0, 0x1bb, 0x4b, 0xdf, 0x7a, 0x308, 0x1a8, 0x313, 0x295, 0x35a, 0x351, 0xa6, 0xe0, 0xe5, 0x5a, 0x29c, 0x1b6, 0x91, 0x1a, 0x1b4, 0x18a, 0x39c, 0x10d, 0x61, 0x35, 0x1e1, 0x2d7, 0x169, 0xeb, 0x312, 0x1c, 0x299, 0x109, 0x257, 0x330, 0x93, 0x101, 0x232, 0x133, 0x277, 0x2a4, 0x8d, 0x283, 0xbd, 0x3dd, 0xac, 0x19e, 0x160, 0x207, 0xd2, 0xa0, 0x3cd, 0x66, 0x191, 0xa1, 0x144, 0x1a5, 0x3c9, 0x250, 0x294, 0x1d3, 0x292, 0x2fe, 0x211, 0x335, 0x2c, 0x3c7, 0x118, 0x14, 0x2fc, 0x30a, 0xb3, 0x95, 0x22c, 0x2b1, 0xf8, 0x4a, 0x256, 0x1b9, 0x150, 0x359, 0xc3, 0x2e3, 0x201, 0x3ff, 0x23, 0x206, 0x25b, 0x163, 0x195, 0x297, 0x241, 0xd7, 0x1f, 0x10b, 0x34c, 0x11b, 0x305, 0x2e4, 0x343, 0x2ee, 0x1bf, 0xf3, 0x373, 0x52, 0x1fb, 0x2cf, 0x38c, 0x38e, 0x1b8, 0x3bb, 0x27a, 0xf5, 0x120, 0x25e, 0x3b8, 0x157, 0x1f3, 0x205, 0x392, 0x83, 0x396, 0xe6, 0x399, 0x364, 0x28e, 0xce, 0x7b, 0x302, 0x1ac, 0x24a, 0x249, 0x164, 0x62, 0x347, 0x28b, 0x1b0, 0x371, 0x264, 0x3f8, 0x30e, 0x103, 0x25b, 0x2c6, 0x25d, 0x95, 0x51, 0x2d6, 0x3c9, 0xa9, 0x242, 0x283, 0x17a, 0x36f, 0x169, 0x1d6, 0x53, 0xe0, 0x1ca, 0x168, 0xcd, 0x356, 0x204, 0x289, 0x386, 0x172, 0x3a5, 0x177, 0x2db, 0x27d, 0x3bd, 0x29, 0x2f9, 0x363, 0x1c6, 0x1c7, 0xdc, 0x3d9, 0x13d, 0x27e, 0x90, 0x12f, 0x1dc, 0x2af, 0x2fd, 0x306, 0x1c9, 0x245, 0x1cb, 0x73, 0x3c8, 0x1b2, 0x147, 0x67, 0x239, 0x181, 0xd6, 0x125, 0x320, 0xb2, 0x31, 0x3a7, 0x341, 0xd8, 0x3bc, 0x132, 0x1fc, 0x187, 0x285, 0x329, 0x236, 0xf, 0x30d, 0x55, 0x16f, 0x303, 0x16e, 0x135, 0x161, 0x238, 0x134, 0x357, 0x237, 0x239, 0x302, 0x358, 0x13a, 0x26c, 0x26d, 0x5b, 0x54, 0x359, 0x30c, 0x263, 0x160, 0xe, 0x13b, 0x5a, 0x262, 0x356, 0x1, 0x236, 0xf, 0x30d, 0x55, 0x16f, 0x303, 0x16e, 0x135, 0x161, 0x238, 0x134, 0x357, 0x237, 0x239, 0x302, 0x358, 0x13a, 0x26c, 0x26d, 0x5b, 0x54, 0x359, 0x30c, 0x263, 0x160, 0xe, 0x13b, 0x5a, 0x262, 0x356, 0x1, 0x236, 0xf, 0x30d, 0x55, 0x16f, 0x303, 0x16e, 0x135, 0x161, 0x238, 0x134, 0x357, 0x237, 0x239, 0x302, 0x358, 0x13a, 0x26c, 0x26d, 0x5b, 0x54, 0x359, 0x30c, 0x263, 0x160, 0xe, 0x13b, 0x5a, 0x262, 0x356, 0x1, 0x236, 0xf, 0x30d, 0x55, 0x16f, 0x303, 0x16e, 0x135, 0x161, 0x238, 0x134, 0x357, 0x237, 0x239, 0x302, 0x358, 0x13a, 0x26c, 0x26d, 0x5b, 0x54, 0x65, 0x3c, 0x5e, 0x159, 0x1b3, 0x170, 0x245, 0x325, 0x339, 0x3dc, 0x10c, 0x36d, 0x167, 0x127, 0x51, 0x34a, 0xe7, 0x21a, 0x219, 0x2b6, 0x2f2, 0x210, 0x1fb, 0x32e, 0xbe, 0x278, 0x31e, 0x25c, 0x231, 0x125, 0x9b, 0x332, 0x5b, 0xa8, 0x17f, 0x56, 0x271, 0x53, 0x380, 0x9f, 0x2a6, 0xab, 0x1d0, 0x12, 0x293, 0x3b8, 0x155, 0x30f, 0x60, 0x1cd, 0x92, 0x7f, 0x187, 0x206, 0x2fc, 0x66, 0x93, 0x1a, 0x1bb, 0x258, 0x3a5, 0x1d5, 0x1e3, 0x25f, 0x29e, 0x161, 0x79, 0xd9, 0x28e, 0x338, 0x3b9, 0x130, 0x333, 0x3e, 0x94, 0x121, 0x10f, 0x3c2, 0x123, 0x1c5, 0x3ba, 0x19f, 0x377, 0xdc, 0x37f, 0x3f4, 0x29f, 0x104, 0x45, 0x87, 0x3d7, 0x28b, 0x2c9, 0x375, 0x16, 0x307, 0x348, 0x2d, 0x262, 0x2a5, 0x4, 0x194, 0xf0, 0x178, 0x16d, 0x2c5, 0x1c9, 0x106, 0x8f, 0xff, 0x36b, 0x39, 0x1af, 0x195, 0xca, 0xf0, 0x2f0, 0x1bd, 0x205, 0xaf, 0x88, 0x388, 0x367, 0x103, 0x2fc, 0xcc, 0x24c, 0xd0, 0x386, 0x382, 0xaa, 0x36a, 0xb8, 0x245, 0x243, 0xff, 0x2df, 0xe4, 0x163, 0x166, 0x284, 0x1b4, 0x96, 0x3d6, 0x1d5, 0x3c6, 0x16e, 0xdd, 0x23d, 0x33b, 0x225, 0x1d9, 0x2b7, 0x127, 0xa2, 0x133, 0x331, 0x1e8, 0x3b0, 0xf3, 0x3ae, 0xad, 0x11c, 0x268, 0x28e, 0x279, 0x2ff, 0x192, 0x35c, 0x3c9, 0x141, 0x184, 0x15b, 0x2f2, 0x29, 0x3e5, 0x146, 0x3f2, 0x38b, 0x239, 0x13, 0x1e5, 0x20b, 0x4a, 0x121, 0x21e, 0x313, 0x10a, 0x6f, 0x3b5, 0x311, 0x9e, 0x18f, 0x25c, 0x6b, 0x9d, 0xd1, 0x34c, 0x372, 0x25a, 0x2d7, 0x2bd, 0x2ea, 0x2cb, 0x377, 0x1b8, 0x1e7, 0x39f, 0x1aa, 0xc8, 0x164, 0x310, 0x54, 0x17f, 0xac, 0x1d6, 0x298, 0x7e, 0x3c4, 0xfa, 0x13d, 0x3d4, 0x41, 0x226, 0x87, 0x3a7, 0x23e, 0x265, 0x194, 0x3c0, 0x3ad, 0x3e6, 0x30, 0x39a, 0x99, 0x3fb, 0x230, 0x109, 0x262, 0x286, 0x40, 0x1d1, 0x1dc, 0x2aa, 0x4e, 0x1b, 0x371, 0x201, 0x307, 0x13b, 0x2d0, 0x196, 0xe8, 0x24, 0xb5, 0x3f5, 0x3fa, 0x3a4, 0x2c9, 0x1cf, 0x160, 0x70, 0x24b, 0x145, 0x151, 0x27e, 0x112, 0x113, 0x87, 0x347, 0xea, 0x30c, 0x33c, 0xa6, 0x3f, 0x3c4, 0x1f4, 0xfd, 0x29f, 0x19, 0x59, 0x188, 0x54, 0x2fe, 0x2b0, 0x2ab, 0x1da, 0x3db, 0xdc, 0x1e7, 0x337, 0x2a1, 0x249, 0x26d, 0x2d8, 0x12d, 0x2d7, 0x173, 0x3ba, 0x275, 0x315, 0x365, 0x12e, 0x6b, 0x13a, 0x344, 0x256, 0x345, 0x3c2, 0x85, 0x6f, 0x363, 0x5f, 0xf9, 0xc6, 0x302, 0x2f6, 0x20b, 0x94, 0x8d, 0xd4, 0x15c, 0x108, 0x3f6, 0x146, 0x3ed, 0x237, 0x1ec, 0x130, 0xd7, 0x3e0, 0x141, 0x308, 0x165, 0x3bd, 0x290, 0x47, 0x134, 0x28e, 0xfb, 0x3ee, 0x8b, 0x328, 0x31b, 0x157, 0x217, 0x209, 0x371, 0xb, 0x7, 0x1ca, 0x153, 0x2ac, 0x27e, 0x224, 0x45, 0x31, 0x15, 0x17f, 0x2b0, 0x15f, 0x361, 0x2e7, 0x1db, 0x97, 0x6b, 0x274, 0x10b, 0x294, 0x35, 0xae, 0x108, 0x3e5, 0x111, 0x357, 0x338, 0x1f7, 0x8b, 0x34a, 0x331, 0x3a9, 0x37e, 0xb7, 0x1ba, 0x1cc, 0x3b1, 0xe4, 0x185, 0x24d, 0x68, 0x305, 0x2f, 0x16d, 0x205, 0x2bc, 0x92, 0x3f8, 0x118, 0x109, 0xcd, 0x20a, 0x200, 0x12f, 0x3fe, 0x3fa, 0x341, 0x336, 0x263, 0x22d, 0x21b, 0x3c4, 0x3e8, 0x3f4, 0xd5, 0x190, 0x332, 0x2d8, 0x25a, 0x34e, 0x38a, 0x3de, 0x22b, 0xf9, 0x18c, 0x13, 0x39d, 0xf8, 0x2a4, 0x308, 0x2ca, 0x2ef, 0xad, 0x79, 0x2c1, 0x2e8, 0x167, 0x12a, 0x6d, 0x96, 0x343, 0x16f, 0x5c, 0x83, 0x23c, 0x3df, 0x103, 0x3e2, 0xdb, 0x204, 0x194, 0x389, 0x2af, 0x30f, 0x300, 0x3bc, 0x201, 0x259, 0x77, 0x2aa, 0x138, 0x1b0, 0x1cf, 0x189, 0x309, 0x3c4, 0x3d9, 0x3cb, 0x2a1, 0x136, 0x291, 0x345, 0x313, 0x42, 0x3f6, 0x111, 0x2a7, 0xfb, 0x3a3, 0xa2, 0x18a, 0x1eb, 0x35d, 0x2e, 0x83, 0x71, 0x367, 0xa, 0x257, 0x356, 0x20, 0x3a2, 0x2fb, 0x1fd, 0x341, 0x265, 0x19e, 0x14c, 0x1f8, 0x6e, 0x3ce, 0x18e, 0x9d, 0x281, 0x294, 0x6a, 0x2b8, 0x52, 0x227, 0x268, 0x5d, 0x35f, 0x95, 0x6d, 0x12c, 0x117, 0x36a, 0x1c9, 0x44, 0x23b, 0x23, 0x140, 0x262, 0x20a, 0x9, 0xb5, 0x3cf, 0x3d7, 0xea, 0x2b, 0x3ac, 0x1da, 0x377, 0x1db, 0x12e, 0x1ac, 0x384, 0x94, 0x234, 0x15b, 0x3bd, 0x252, 0x79, 0x18b, 0x3b2, 0x32a, 0x284, 0x1bb, 0x1c1, 0x2a8, 0x183, 0x15e, 0x92, 0x3f9, 0x69, 0x5a, 0xcb, 0x1d0, 0x120, 0x28d, 0x10e, 0x20e, 0x17f, 0x169, 0x175, 0x33e, 0x223, 0x31e, 0x181, 0x1e5, 0x7c, 0xbb, 0x1dc, 0x17d, 0x3a4, 0x265, 0x33c, 0x139, 0x3db, 0x2e9, 0x12e, 0x358, 0x20b, 0xa9, 0x308, 0x33a, 0x2a3, 0x31a, 0x1ee, 0xe4, 0x21d, 0x91, 0x236, 0x3c0, 0x157, 0x4e, 0xd8, 0x1cf, 0x312, 0x3f, 0x21f, 0x1e7, 0x18e, 0x13a, 0x216, 0x8d, 0x2a9, 0x3bd, 0xad, 0x1e4, 0x43, 0x35e, 0x191, 0x68, 0xf, 0x2f0, 0x3e6, 0x180, 0x371, 0x2c, 0x70, 0x27c, 0x1f4, 0x3e1, 0x2a1, 0x26c, 0x256, 0x21e, 0x15c, 0x52, 0x47, 0x1b2, 0x2e8, 0x195, 0x284, 0x376, 0x30d, 0x16d, 0x6, 0x39a, 0xc1, 0x307, 0x1ca, 0x145, 0x29a, 0x29f, 0xc8, 0x26d, 0x2ed, 0x3c2, 0x21, 0x3f6, 0x222, 0x28e, 0x3d1, 0x24e, 0x6d, 0x258, 0x55, 0x366, 0xaf, 0x92, 0x3fb, 0x1a4, 0x2d0, 0xab, 0x27e, 0x82, 0x59, 0x5b, 0x12d, 0x295, 0x6f, 0x32e, 0x3ed, 0x19c, 0x3ee, 0x51, 0x18a, 0x3d6, 0x16f, 0x170, 0x22, 0x23b, 0x46, 0x176, 0x379, 0x3fa, 0x23e, 0x2b, 0x2ab, 0x19f, 0x4f, 0xc6, 0x4c, 0x35c, 0x1ce, 0x35b, 0x385, 0x326, 0x71, 0x187, 0xa0, 0xcd, 0x74, 0x120, 0x226, 0xc4, 0x2a0, 0x1a7, 0x233, 0x32e, 0x3d3, 0x279, 0x34f, 0x119, 0x12c, 0x55, 0x2c5, 0x2bc, 0x99, 0x3c7, 0xe5, 0x145, 0x13d, 0x26e, 0x249, 0x291, 0x10f, 0x15c, 0xa4, 0x11c, 0x18b, 0x2d3, 0x2cc, 0x68, 0x1e, 0x3d2, 0x30f, 0x36, 0x2e3, 0x312, 0x7e, 0x6e, 0x323, 0xd6, 0x301, 0xa9, 0x219, 0xf3, 0x135, 0x1cc, 0x1b7, 0x17e, 0xdb, 0x4, 0x1d1, 0x1ff, 0x3f3, 0xea, 0xac, 0x2be, 0x275, 0x13c, 0x318, 0x130, 0x16b, 0x331, 0x177, 0x20f, 0x83, 0x1c4, 0x215, 0x280, 0x334, 0x1d0, 0x89, 0x8a, 0x310, 0x292, 0x295, 0xde, 0xa3, 0x357, 0x1f6, 0x127, 0x6d, 0xb9, 0x154, 0x306, 0x2e2, 0x264, 0x307, 0x394, 0x11d, 0xfd, 0x1aa, 0x136, 0x256, 0x2ec, 0x1ff, 0x3ef, 0x3a8, 0x169, 0x3ba, 0x22b, 0x38b, 0x37b, 0x22c, 0x314, 0x28f, 0x1b3, 0x15e, 0x99, 0x387, 0x394, 0x23a, 0x3f4, 0x14b, 0x344, 0x242, 0x15b, 0x1d7, 0x18d, 0x3dc, 0x329, 0x330, 0x2, 0x1d1, 0x3fe, 0x3d7, 0x359, 0x2d2, 0x37d, 0x5f, 0x31f, 0x2ff, 0x51, 0x221, 0x117, 0x366, 0x2bc, 0x132, 0x307, 0x321, 0x7d, 0x3e1, 0x296, 0x281, 0x8d, 0x2b6, 0x3ae, 0x31a, 0x3b1, 0x25b, 0x269, 0x4, 0x3a2, 0x3f5, 0x3a7, 0x2bb, 0x1ad, 0x2f3, 0xbe, 0x237, 0x1f7, 0xa2, 0x4b, 0x22e, 0x2c5, 0x171, 0x264, 0x207, 0x24b, 0xfa, 0x3cb, 0x125, 0x10b, 0x11a, 0x165, 0x355, 0x23d, 0x36b, 0xbf, 0xdb, 0x8, 0x34d, 0x3e3, 0x347, 0x17f, 0x35a, 0x1ef, 0x17c, 0x67, 0x3ee, 0x144, 0x96, 0x55, 0x183, 0x2e2, 0xc1, 0x7, 0x9f, 0x1f4, 0x39f, 0x24a, 0x216, 0x234, 0x2ca, 0x2a3, 0x73, 0x2df, 0x17e, 0x1d1, 0x3f5, 0x347, 0x2fe, 0x173, 0x363, 0x3ed, 0xfb, 0x24e, 0x368, 0x30d, 0x37a, 0x180, 0x3be, 0x312, 0x1f8, 0x2e9, 0x162, 0x39d, 0x33f, 0x3a9, 0x303, 0x106, 0x23b, 0x230, 0x2d0, 0x151, 0x29f, 0x249, 0x256, 0xd4, 0x3bd, 0x161, 0x1ee, 0x329, 0x269, 0x8, 0x293, 0x397, 0x20e, 0x3dd, 0x38a, 0x32e, 0x357, 0x3d1, 0x254, 0x376, 0x5e, 0x3e6, 0x1b, 0x1cf, 0xa6, 0x3db, 0x365, 0x302, 0xd7, 0x1ce, 0x177, 0x2e, 0x22, 0x1fc, 0x1a4, 0x2ad, 0x29a, 0xd5, 0x26c, 0x294, 0x2a9, 0x1d7, 0x31a, 0x36b, 0x17e, 0x36c, 0x40, 0xb5, 0x87, 0x54, 0x2d7, 0x6f, 0x146, 0x28e, 0x2b7, 0x284, 0x386, 0x2f0, 0x30f, 0xd8, 0x263, 0x139, 0x2e7, 0x31e, 0x26, 0x2b1, 0x26b, 0x3aa, 0x170, 0x110, 0x3fb, 0x13b, 0x145, 0xfd, 0x2a1, 0x344, 0x8d, 0x165, 0x2a3, 0xe6, 0x36e, 0x3e2, 0x356, 0x200, 0x1a1, 0x31, 0x2a0, 0x3a2, 0x3cf, 0x20e, 0x3b3, 0x233, 0x146, 0x115, 0x2ce, 0xd, 0x1e, 0x2af, 0x270, 0xc3, 0x351, 0x275, 0x1f2, 0x3b9, 0x51, 0x96, 0x154, 0x6, 0x1de, 0xb0, 0x3f, 0x1b8, 0xb1, 0x39d, 0x277, 0x2bf, 0x2e, 0x44, 0x3f9, 0x13b, 0x28a, 0x3f4, 0x125, 0x25, 0x184, 0x1e6, 0x374, 0x3f1, 0x14, 0xcd, 0x3a0, 0x82, 0x199, 0x3a6, 0x15c, 0x129, 0x399, 0xe4, 0x198, 0x4, 0x293, 0x327, 0x2a, 0x2d7, 0xde, 0x111, 0x5d, 0x32a, 0x34, 0x78, 0x2ae, 0x1d2, 0x30c, 0x15f, 0x1c6, 0x3c1, 0x2ff, 0x144, 0x258, 0x159, 0x18, 0x371, 0x2c0, 0xfc, 0x2e9, 0x2c4, 0x26f, 0x1ce, 0x2ee, 0xb8, 0x110, 0x3ff, 0xe5, 0x23a, 0x3cb, 0x9d, 0x94, 0x219, 0x391, 0x1cb, 0x3df, 0x50, 0x334, 0x29b, 0x208, 0x26d, 0x283, 0x179, 0xad, 0x27f, 0x390, 0x269, 0x10, 0x25e, 0x87, 0xa8, 0x34e, 0x378, 0x4d, 0x174, 0xb3, 0x34d, 0x327, 0x54, 0x34e, 0x2f9, 0x134, 0x3b2, 0x322, 0x236, 0xee, 0x3fd, 0x359, 0x2bd, 0x2cf, 0x357, 0x35f, 0x101, 0xf, 0x2af, 0xe9, 0x30c, 0x2be, 0x311, 0x237, 0x3a3, 0xda, 0x30d, 0x1f3, 0x36, 0x263, 0xed, 0x223, 0x239, 0x241, 0x314, 0x55, 0x3, 0x1de, 0x160, 0xfc, 0x1db, 0x302, 0x35c, 0xdf, 0x16f, 0x253, 0x132, 0xe, 0x1e2, 0x3ce, 0x358, 0x1f0, 0x1e8, 0x303, 0x11, 0x3f8, 0x13b, 0x11d, 0x3cb, 0x13a, 0x250, 0xec, 0x16e, 0x11e, 0x215, 0x5a, 0x2ac, 0x137, 0x26c, 0x242, 0x2ca, 0x135, 0xff, 0x5, 0x262, 0x3a0, 0x104, 0x26d, 0x10f, 0x1ed, 0x161, 0x3b1, 0x2fc, 0x356, 0x12, 0x226, 0x5b, 0x1e1, 0x210, 0x238, 0x10c, 0x33, 0x1, 0x34d, 0x327, 0x54, 0x34e, 0x2f9, 0x134, 0x3b2, 0x322, 0x236, 0xee, 0x3fd, 0x359, 0x2bd, 0x2cf, 0x357, 0x35f, 0x101, 0xf, 0x2af, 0xe9, 0x30c, 0x293, 0x87, 0x2a0, 0x85, 0x38f, 0x18b, 0x2c6, 0x81, 0x1d1, 0x397, 0x54, 0x295, 0x3f6, 0x1b2, 0x35e, 0x91, 0xbb, 0x3f5, 0x20e, 0x2d7, 0x378, 0x134, 0x36d, 0x93, 0x194, 0x2fb, 0x347, 0x3dd, 0x6f, 0x222, 0x2e8, 0x191, 0x236, 0x1dc, 0x3ef, 0x2fe, 0x38a, 0x146, 0x5d, 0xb3, 0x340, 0x23f, 0x3fa, 0x359, 0x173, 0x32e, 0x28e, 0x195, 0x68, 0x3c0, 0x17d, 0xea, 0x1ad, 0x363, 0x357, 0x2b7, 0xd, 0x78, 0x2aa, 0x11f, 0x2b0, 0x1ef, 0x3ed, 0x3d1, 0x284, 0xf, 0x157, 0x3a4, 0x56, 0x3ba, 0x2f8, 0xfb, 0x254, 0x386, 0x3ad, 0x270, 0x30c, 0x175, 0x5f, 0x19c, 0x24e, 0x376, 0x2f0, 0x4e, 0x265, 0x2ab, 0x38c, 0x237, 0x34f, 0x368, 0x5e, 0x30f, 0x2c9, 0x1d6, 0x275, 0x3c1, 0x3ee, 0x6d, 0x30d, 0x3e6, 0xd8, 0x33c, 0x2cb, 0xf9, 0x37b, 0x288, 0x2e4, 0x37a, 0x1b, 0x263, 0x1da, 0x9e, 0x1ec, 0x51, 0x12f, 0x21c, 0x12d, 0x42, 0x11c, 0x218, 0x198, 0x20, 0x1a1, 0x310, 0x1e1, 0x52, 0x3c8, 0x390, 0x36c, 0x9, 0x45, 0x2d8, 0x57, 0x252, 0x1ee, 0x2fc, 0x143, 0x120, 0xb2, 0x3a6, 0x2f2, 0x2c2, 0x1b7, 0x32f, 0x3a, 0x41, 0x26d, 0x35, 0x2ef, 0xe6, 0x285, 0x131, 0x349, 0x32, 0x12b, 0x2a9, 0x14f, 0xff, 0x14, 0x261, 0x1ea, 0x249, 0x121, 0x19d, 0x1ba, 0x3df, 0x280, 0xab, 0x137, 0x1a2, 0x61, 0x3cc, 0x325, 0x30e, 0xb4, 0x14d, 0x2a1, 0x25, 0x3b, 0x16e, 0x71, 0x118, 0x2ad, 0x1fa, 0x9d, 0xa9, 0x369, 0x193, 0x23b, 0x348, 0x11d, 0x337, 0x384, 0x10d, 0x1e3, 0x20c, 0x3f9, 0x1ca, 0x3e8, 0x231, 0x7c, 0x1e8, 0x17, 0x110, 0x3c7, 0x13e, 0x1e7, 0x2b9, 0x39b, 0x177, 0x2e0, 0x248, 0xe, 0x381, 0x97, 0x39d, 0x39c, 0x2b3, 0xaf, 0x182, 0x1c0, 0xdc, 0x2c4, 0x35c, 0x37c, 0x2dd, 0x1cd, 0x2c, 0x25e, 0x62, 0x17a, 0x29, 0x3c8, 0x329, 0x1ab, 0x48, 0x59, 0x3a6, 0x1ed, 0x31a, 0x1a3, 0x29c, 0x349, 0x64, 0xa5, 0x165, 0xdd, 0x3df, 0x109, 0x2ac, 0x1aa, 0x216, 0x3b, 0x2dc, 0x1c4, 0xd2, 0x28a, 0x337, 0x301, 0x3d, 0x303, 0x88, 0x3c7, 0x27c, 0x395, 0x1e5, 0x1ce, 0x2b3, 0x15e, 0x201, 0x21b, 0x1db, 0x26, 0x29d, 0x117, 0x6, 0x1df, 0x14c, 0x315, 0xf6, 0xa2, 0x2e4, 0x1f3, 0x1b0, 0x1d6, 0x1c6, 0x67, 0x24e, 0x1c3, 0x353, 0x3a4, 0x158, 0x3de, 0x357, 0x2ce, 0xd0, 0x23f, 0x3f3, 0x1f5, 0x6f, 0x9a, 0x2d3, 0x91, 0x2ec, 0x327, 0x2a0, 0x214, 0x8e, 0x218, 0x330, 0x80, 0x113, 0x16c, 0x57, 0xad, 0x3b1, 0x3cd, 0x1d, 0x41, 0xd3, 0xd4, 0x355, 0x27b, 0x14, 0xcb, 0x3a1, 0x26c, 0x234, 0x3cc, 0x243, 0x23, 0x1a9, 0xfd, 0x9d, 0x152, 0x1bf, 0x83, 0x3f8, 0x1ca, 0x3d9, 0xd6, 0x3e0, 0xb5, 0x188, 0x3c2, 0x290, 0x1ee, 0x3e2, 0x1d, 0x82, 0x34c, 0x2a9, 0x135, 0x3eb, 0x109, 0x151, 0x2a1, 0x94, 0x3b0, 0x326, 0x1fc, 0x1ca, 0x3bb, 0x358, 0x33f, 0x3aa, 0xaf, 0x201, 0x3f, 0x365, 0x130, 0x18a, 0x2a8, 0x180, 0x263, 0x2cb, 0x3c1, 0x34f, 0x376, 0x3ad, 0x3a4, 0x2b0, 0x363, 0x28e, 0xb3, 0x236, 0x2fb, 0x20e, 0x295, 0x38f, 0x43, 0xcc, 0x40, 0x113, 0x2d8, 0x15c, 0x161, 0x36e, 0x14e, 0x349, 0xc8, 0x294, 0x33a, 0x1cb, 0x30e, 0x2d0, 0xfd, 0x13a, 0x141, 0x1e3, 0x22, 0x3e7, 0x27c, 0x323, 0x39d, 0x26b, 0x36a, 0x39a, 0x160, 0x3db, 0xc6, 0x8b, 0x258, 0x37a, 0xd8, 0x1d6, 0x38c, 0x19c, 0x254, 0xf, 0x2aa, 0xea, 0x173, 0x146, 0x2e8, 0x93, 0xbb, 0x397, 0x2a0, 0x21, 0x238, 0xe4, 0x36c, 0x24, 0x59, 0x345, 0x3bd, 0xe6, 0x206, 0x334, 0x3d4, 0x26c, 0x61, 0x32b, 0x23c, 0x230, 0x16a, 0x229, 0x22f, 0x15a, 0x1b7, 0x14e, 0x29b, 0x320, 0x8d, 0x3cc, 0x11e, 0x230, 0x28a, 0xc7, 0x7c, 0x35b, 0x1c9, 0xc1, 0x309, 0x3b6, 0x130, 0x314, 0x2b2, 0x1b, 0x271, 0x1c6, 0x19c, 0xa1, 0x3c, 0x17d, 0x2bb, 0x233, 0x134, 0x2b5, 0x204, 0xb5, 0x310, 0x313, 0xad, 0x2df, 0xa7, 0x349, 0x190, 0x242, 0x1e6, 0x8f, 0x118, 0x145, 0x267, 0x3e, 0x3a9, 0x2e0, 0x264, 0x380, 0x1db, 0x98, 0x18a, 0x159, 0x209, 0x33c, 0xe3, 0xce, 0x254, 0x1e, 0x2ba, 0x359, 0x31d, 0x9a, 0x35e, 0x102, 0x25e, 0x188, 0x38d, 0x252, 0x36b, 0x257, 0x3a0, 0xc8, 0x121, 0xf3, 0x243, 0x8c, 0x2a6, 0x337, 0x1f, 0x3d0, 0x170, 0x132, 0x1c0, 0x2e9, 0x4c, 0xc5, 0x2a8, 0x300, 0x19e, 0x275, 0x67, 0x12a, 0xf, 0x15d, 0x3a8, 0x38a, 0x4d, 0x1af, 0x81, 0x12f, 0xc4, 0x3c2, 0x129, 0x3b1, 0x32f, 0x1d0, 0x64, 0x294, 0x2d4, 0xb6, 0x15c, 0x18d, 0x285, 0x334, 0x34b, 0x281, 0x76, 0x193, 0x3f8, 0x24b, 0x395, 0x333, 0x37c, 0x183, 0x2eb, 0x139, 0x278, 0x3d5, 0x376, 0x2af, 0x23e, 0x173, 0x111, 0x2d3, 0x81, 0x25e, 0x310, 0x22f, 0x2b4, 0x2d5, 0x262, 0x1ea, 0xd1, 0x308, 0x1b1, 0x7f, 0x1ca, 0x2f7, 0x1e5, 0x26b, 0x1b3, 0x1de, 0xa6, 0x4f, 0x2ff, 0x368, 0x3d2, 0x341, 0x1ad, 0xa3, 0x1d9, 0x91, 0x34d, 0x62, 0x3c2, 0x252, 0x2df, 0x14e, 0x13f, 0x9b, 0x61, 0xb7, 0x388, 0x13b, 0x3d9, 0x2b9, 0x1ce, 0x1b5, 0x33d, 0x312, 0x38e, 0x3d8, 0x6d, 0x178, 0xe9, 0x2b0, 0x197, 0xba, 0x93, 0x2ec, 0x10e, 0x17a, 0x148, 0x3dc, 0x32f, 0x3a0, 0x190, 0x8d, 0x391, 0x71, 0x1a4, 0xfa, 0xd6, 0x33f, 0x2b3, 0x2e2, 0x160, 0x377, 0x7b, 0x288, 0x2f, 0x9c, 0x56, 0x3b5, 0x115, 0x191, 0x259, 0x327, 0x12d, 0x29, 0x27f, 0x3e2, 0x1a1, 0x2d8, 0x2f2, 0xe6, 0x14, 0xab, 0x2a1, 0xa9, 0x1e3, 0x110, 0xe, 0xdc, 0x26, 0x18a, 0x16d, 0xd8, 0x2ab, 0x2f8, 0x2b7, 0x340, 0x2fb, 0x54, 0x21, 0x1e4, 0x17e, 0x1d, 0x19, 0x294, 0x1e6, 0x23c, 0x1a4, 0x1f4, 0x358, 0x1ce, 0x36a, 0xef, 0xa6, 0x9e, 0x3ee, 0x376, 0x157, 0xea, 0x38a, 0x134, 0x2c6, 0x8, 0x113, 0x2ed, 0x3bd, 0x339, 0xa0, 0x151, 0x125, 0x141, 0x303, 0x92, 0x70, 0x2e9, 0x130, 0x4b, 0x37a, 0x2c9, 0x175, 0x3ed, 0x195, 0x236, 0x3f5, 0x2a0, 0x108, 0x33b, 0x3e2, 0xe8, 0xc8, 0x8d, 0x32b, 0x1c4, 0x13b, 0x3bb, 0x2f6, 0x26b, 0x366, 0x371, 0x139, 0xf9, 0x34f, 0x386, 0x2aa, 0x359, 0x6f, 0x1b2, 0x21d, 0x40, 0x8a, 0x345, 0x1d7, 0x1fe, 0x109, 0x29a, 0x13a, 0x21a, 0x2e, 0x99, 0x380, 0x365, 0x192, 0x258, 0x3e6, 0x265, 0x3ba, 0x357, 0xb3, 0x194, 0x397, 0x12d, 0x342, 0x372, 0x3bd, 0x27b, 0x280, 0x29a, 0x274, 0x7a, 0x170, 0x182, 0xfc, 0xc6, 0xa2, 0x2f, 0x270, 0x169, 0xa3, 0x36d, 0x102, 0x2d4, 0x2d8, 0x1ed, 0x398, 0xa0, 0x2a2, 0x9d, 0x21a, 0x5c, 0x264, 0x3f, 0x235, 0x22c, 0x30d, 0x9c, 0x158, 0x32e, 0x1d9, 0x244, 0xb5, 0xb6, 0x179, 0xe6, 0x28, 0x2ac, 0x125, 0x282, 0x17, 0x99, 0x309, 0x18f, 0x8b, 0x1c1, 0x27, 0x56, 0x2cf, 0x174, 0x91, 0x12f, 0x229, 0x15c, 0x23d, 0xa, 0xab, 0x14b, 0x2a4, 0x303, 0x124, 0x1c0, 0x365, 0x324, 0x172, 0x30f, 0x211, 0x3b5, 0x5d, 0x126, 0x34d, 0x188, 0x57, 0x18d, 0x206, 0x32c, 0x354, 0xa9, 0x3c6, 0x49, 0x70, 0x1db, 0xc9, 0x258, 0x3c5, 0x186, 0x1ef, 0x115, 0x24d, 0x1d1, 0x62, 0x313, 0x161, 0x285, 0xcb, 0xd5, 0x128, 0x2f5, 0x110, 0x1c, 0x370, 0x130, 0x96, 0x1f3, 0x265, 0x37d, 0x147, 0x191, 0x28d, 0x1d3, 0x1d7, 0x3f1, 0xb4, 0x3e1, 0x3e, 0x2ee, 0x171, 0x189, 0x223, 0x3ee, 0x1c3, 0x15d, 0x2fe, 0x1fb, 0x86, 0x36c, 0x89, 0x291, 0x33a, 0x11e, 0x348, 0x3bb, 0x3ca, 0x2f1, 0x6, 0x335, 0xe3, 0xfb, 0x34, 0x3b8, 0x54, 0x84, 0x27f, 0x32f, 0x13f, 0xd1, 0x76, 0x83, 0x3c7, 0x21f, 0x13, 0x314, 0x37a, 0x336, 0x37d, 0x28e, 0x24d, 0x3a2, 0x188, 0xae, 0x23d, 0x14, 0x2ac, 0x24a, 0x21a, 0xb8, 0x182, 0x1f8, 0x318, 0x119, 0x2f0, 0x28b, 0x2e6, 0x134, 0x30a, 0x80, 0x59, 0x6a, 0x26a, 0x30e, 0x2a6, 0x31c, 0x33f, 0x1b5, 0x1de, 0x139, 0x3e4, 0x95, 0x78, 0x3f3, 0x1a7, 0x47, 0x390, 0x105, 0x19, 0x242, 0x25f, 0x23b, 0x321, 0x24f, 0x2b1, 0x22e, 0x300, 0x1d6, 0x17c, 0x167, 0x236, 0x3cf, 0x25a, 0x290, 0x1b7, 0xcd, 0x29f, 0x4a, 0x37e, 0x110, 0x38, 0x1db, 0x192, 0x172, 0x217, 0x56, 0x113, 0x345, 0x2a3, 0x367, 0x2ad, 0x18e, 0x33f, 0x36a, 0x371, 0x1da, 0x237, 0x284, 0x23f, 0x20e, 0x21, 0x33b, 0x32f, 0x27e, 0x344, 0x3b0, 0x22, 0xe, 0x2e9, 0x192, 0x2e4, 0x4e, 0x2b0, 0x146, 0x35e, 0x8, 0x8a, 0x21e, 0x135, 0x30e, 0x145, 0x6b, 0x1ce, 0x366, 0x3be, 0x2cb, 0x19c, 0xd, 0x1dc, 0x54, 0x108, 0x1ee, 0x14e, 0x3d4, 0x216, 0x1bf, 0x110, 0x70, 0x365, 0x8b, 0x30d, 0x270, 0x1ad, 0x222, 0x2c6, 0x40, 0x59, 0xd4, 0x1ba, 0x46, 0x23a, 0x358, 0x26b, 0x306, 0x1cf, 0x275, 0xfb, 0x68, 0x2fb, 0x2a0, 0x52, 0x36b, 0x262, 0x29f, 0x94, 0x1e3, 0x92, 0x380, 0x31e, 0x51, 0x5e, 0x3a4, 0x173, 0x134, 0x21d, 0x200, 0x2c8, 0x2a9, 0x1cb, 0x230, 0x1f4, 0x2f6, 0x37c, 0x6, 0x263, 0x38c, 0x3d1, 0x340, 0x3f5, 0x12d, 0x290, 0x36e, 0x334, 0xd5, 0xa9, 0x303, 0x99, 0x3f, 0xc6, 0x288, 0x226, 0x10f, 0x135, 0x215, 0x11d, 0x358, 0xdf, 0x3, 0x263, 0x311, 0x35f, 0x236, 0x327, 0x1e1, 0x161, 0x5, 0x2ac, 0x13a, 0x1e8, 0x253, 0x160, 0x223, 0x3a3, 0xf, 0x3fd, 0x34e, 0x238, 0x2fc, 0x3a0, 0x26c, 0xec, 0x11, 0xe, 0x1db, 0x241, 0x30d, 0xe9, 0x2bd, 0x134, 0x33, 0x12, 0x26d, 0x2ca, 0x11e, 0x13b, 0x3ce, 0x35c, 0x55, 0x36, 0x2be, 0x357, 0x322, 0x34d, 0x5b, 0x1ed, 0xff, 0x5a, 0x3cb, 0x1f0, 0x16f, 0x1de, 0xed, 0x237, 0x101, 0xee, 0x54, 0x210, 0x3b1, 0x262, 0x137, 0x250, 0x303, 0x132, 0xfc, 0x239, 0xda, 0x2af, 0x359, 0x2f9, 0x10c, 0x356, 0x104, 0x242, 0x16e, 0x3f8, 0x1e2, 0x302, 0x314, 0x1f3, 0x30c, 0x2cf, 0x3b2, 0x1, 0x226, 0x10f, 0x135, 0x215, 0x11d, 0x358, 0xdf, 0x3, 0x263, 0x311, 0x35f, 0x236, 0x327, 0x1e1, 0x161, 0x5, 0x2ac, 0x13a, 0x1e8, 0x253, 0x160, 0x45, 0x35, 0x1ba, 0x118, 0x3e8, 0x39d, 0x343, 0x300, 0x2ab, 0x3af, 0x322, 0x293, 0x16c, 0x373, 0x3eb, 0x352, 0x31c, 0x1ce, 0x183, 0x39e, 0x38c, 0x35f, 0x65, 0x87, 0x313, 0x23d, 0xa0, 0x27a, 0x1f, 0x3aa, 0x273, 0x272, 0x237, 0x202, 0x3b8, 0x2a0, 0x148, 0x2d5, 0x196, 0x296, 0x3d, 0x392, 0xb0, 0x223, 0x34f, 0x3c, 0x3d7, 0x85, 0x399, 0x257, 0x3d4, 0x4a, 0x3c6, 0x99, 0xfc, 0x7b, 0x368, 0x155, 0x1f5, 0x38f, 0x390, 0x3a, 0x249, 0x3b, 0x20c, 0xe, 0x3b6, 0x116, 0x5e, 0x28b, 0x31d, 0x18b, 0x1b6, 0x224, 0x294, 0xb7, 0x3f8, 0x3c4, 0x13, 0x96, 0x30f, 0x158, 0x28c, 0x2c6, 0x100, 0x199, 0x165, 0x11e, 0x276, 0x323, 0x2d6, 0x159, 0x2c9, 0x2f3, 0xba, 0x81, 0x28d, 0x283, 0x135, 0x23, 0x7d, 0x2f6, 0x1eb, 0x60, 0x1d6, 0x3f2, 0x166, 0x1d1, 0x229, 0x1ed, 0x1fe, 0x168, 0x267, 0x33f, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x114, 0x350, 0x243, 0x276, 0x97, 0x133, 0x2fd, 0x2b, 0x146, 0x185, 0x12, 0x34c, 0x3cc, 0xfe, 0x3c4, 0x4c, 0x172, 0x270, 0x2e6, 0x2c1, 0x36c, 0x104, 0x234, 0x326, 0x207, 0x3b6, 0x51, 0x1e9, 0x3a8, 0x3f6, 0x1c8, 0x74, 0x26c, 0x369, 0x49, 0x3f, 0x7b, 0x1bb, 0x17d, 0x1a7, 0xf2, 0x32f, 0x3a1, 0x250, 0x2e, 0xb, 0x38e, 0x34f, 0xf0, 0x107, 0x108, 0x2df, 0xcb, 0x125, 0x1e8, 0x2bc, 0xa6, 0x38b, 0x202, 0x2fb, 0x25a, 0x2b4, 0x14, 0x13d, 0x3e, 0x16f, 0x2eb, 0x33e, 0x3d1, 0x65, 0x21c, 0x15c, 0x27b, 0x168, 0x18e, 0x39c, 0x3, 0x33c, 0x1f9, 0x2cc, 0x293, 0x1b9, 0x355, 0x30e, 0x7d, 0x3ca, 0x28f, 0x36, 0x1dd, 0x5d, 0x102, 0x45, 0xd4, 0x396, 0x299, 0x323, 0x34a, 0x1bd, 0x30c, 0x255, 0x163, 0x200, 0xd3, 0xf3, 0x23b, 0xf1, 0x13, 0x258, 0x9c, 0x2bd, 0x1b2, 0xdb, 0x41, 0x8d, 0x228, 0x15b, 0x23c, 0x321, 0x2c4, 0x4b, 0x27, 0x35a, 0x1b2, 0x1b6, 0x104, 0x61, 0x83, 0x1c, 0x31e, 0x232, 0x2ae, 0x3dd, 0x11c, 0x3cd, 0x3d4, 0x250, 0x5c, 0x2c, 0x4f, 0x95, 0x23f, 0x150, 0x129, 0x206, 0x14d, 0x1f, 0x16f, 0x1df, 0xe3, 0x2b7, 0x259, 0x310, 0x3bd, 0x3b7, 0x28a, 0x2f6, 0x343, 0x36, 0x3ba, 0x174, 0x2, 0x59, 0x2b6, 0x71, 0x24b, 0x181, 0x96, 0x4e, 0x2bd, 0x364, 0x36c, 0x208, 0xc2, 0x106, 0x38, 0x235, 0x6d, 0x155, 0x3b3, 0x238, 0x393, 0x3a1, 0xa9, 0xb8, 0x58, 0x9e, 0x12a, 0x77, 0x2a0, 0x252, 0x5, 0x29a, 0x3e, 0x2de, 0x3be, 0x1c6, 0x167, 0xbb, 0x229, 0x373, 0x367, 0x11d, 0x1e5, 0x28f, 0x6c, 0x37d, 0x2e8, 0x4, 0xb2, 0x165, 0xe2, 0x9f, 0x302, 0x12c, 0x9c, 0x173, 0x2c1, 0x2d1, 0x19, 0x184, 0x20c, 0x70, 0x63, 0xda, 0x2aa, 0x36f, 0x79, 0x32f, 0x59, 0x165, 0x1c4, 0x27c, 0x26, 0x2e4, 0x3a4, 0x6f, 0x218, 0x1d, 0x26c, 0x1bf, 0x99, 0x3db, 0x3ee, 0x78, 0x20e, 0x52, 0x346, 0x151, 0x20b, 0x16f, 0x3be, 0x38c, 0x195, 0x1d1, 0x2d8, 0x2a3, 0x46, 0x3bb, 0x2b1, 0x16d, 0x30c, 0x146, 0x21d, 0x120, 0x294, 0x362, 0x307, 0x365, 0x288, 0x157, 0x3dd, 0x238, 0x32f, 0x29f, 0x141, 0x392, 0x312, 0x3c1, 0xd, 0x3f5, 0x3c2, 0xe6, 0x5a, 0x18e, 0x26b, 0x30, 0x2ab, 0x28e, 0x81, 0x8a, 0x2a9, 0x23c, 0x24b, 0x302, 0x258, 0x270, 0x38a, 0x43, 0x286, 0x249, 0x3b0, 0x92, 0x1f8, 0x37b, 0xf, 0x347, 0x108, 0x36e, 0xab, 0x1c2, 0x3aa, 0x371, 0x275, 0x2b7, 0xbb, 0x5b, 0x1d7, 0x30e, 0x1f4, 0xd7, 0x2a8, 0x265, 0x32e, 0x2c6, 0x24, 0x256, 0x16e, 0x3e7, 0x2e9, 0x51, 0x3ad, 0x2fe, 0x47, 0x3e2, 0x3d4, 0xa9, 0x170, 0x160, 0xf9, 0x284, 0x2fb, 0x17a, 0xb2, 0x19d, 0x23b, 0x381, 0xc9, 0x5e, 0x1d4, 0x3c3, 0x17e, 0xf5, 0x250, 0x170, 0x2c0, 0x3e4, 0xd, 0x3e3, 0x313, 0x339, 0x1a9, 0x1ac, 0x3d6, 0x36, 0x2f3, 0x36d, 0x80, 0x1a6, 0x32b, 0x3ff, 0x370, 0x51, 0x353, 0x3ea, 0x238, 0x257, 0x26e, 0x21a, 0x15e, 0x298, 0x19c, 0x289, 0x21c, 0x2f2, 0x3df, 0x11d, 0x39d, 0xaa, 0x336, 0x32e, 0x185, 0x90, 0x294, 0x2cd, 0x7, 0x31e, 0xda, 0x2ba, 0x295, 0x27f, 0x19a, 0x125, 0x35b, 0x273, 0x2cb, 0x3ab, 0x259, 0x5b, 0x3ae, 0x23, 0x3bb, 0x16b, 0x1bd, 0x56, 0x4d, 0x330, 0x82, 0xc2, 0x11, 0x380, 0x7b, 0x1c3, 0x3ef, 0x42, 0x1b7, 0xab, 0x384, 0x2b3, 0x3be, 0x311, 0x25d, 0x293, 0x1d3, 0xdd, 0x1a4, 0x24f, 0xc5, 0x30f, 0x35a, 0x2c1, 0x356, 0x190, 0x1d8, 0x92, 0x3f0, 0x1f7, 0x78, 0x15, 0x148, 0x206, 0x13d, 0x1f0, 0x366, 0xcf, 0x3f2, 0x93, 0x164, 0x27d, 0x1fc, 0x6e, 0x116, 0x3ad, 0x3ea, 0x79, 0x14e, 0x354, 0x1e8, 0x39a, 0x361, 0x3ab, 0xbb, 0x16c, 0x14f, 0x230, 0x395, 0x266, 0x30f, 0x2bd, 0x316, 0x286, 0x136, 0x37e, 0xc1, 0x38e, 0x95, 0x1dc, 0xbd, 0x23d, 0x5a, 0x231, 0x2f1, 0x1b, 0x2f3, 0x2d3, 0x200, 0x12b, 0x2dc, 0x307, 0x18f, 0xda, 0x17d, 0x246, 0x3dc, 0x196, 0xe1, 0x35d, 0x3be, 0x22b, 0x166, 0xb5, 0x10f, 0x396, 0x1ca, 0x181, 0xb9, 0x3a4, 0x1bc, 0x1c8, 0x349, 0x4a, 0x5c, 0x160, 0x3e4, 0x1a, 0x397, 0xae, 0x3fc, 0x145, 0x3ca, 0xaa, 0x265, 0xa3, 0x33, 0x112, 0x234, 0x20c, 0x380, 0xf6, 0x305, 0x347, 0x29, 0x285, 0x29a, 0x1f0, 0x2c5, 0x33c, 0x3af, 0x122, 0x8a, 0x2b6, 0x388, 0x3c4, 0xc9, 0xbc, 0x359, 0x227, 0x3cd, 0x29f, 0x10d, 0x15e, 0x139, 0x279, 0x65, 0x188, 0x2ef, 0x215, 0x3bb, 0x2d6, 0x2fd, 0x2b0, 0x2c8, 0x1e6, 0x3fb, 0x2e9, 0x288, 0x2aa, 0x295, 0x1ee, 0x196, 0x1c2, 0x16f, 0x1cf, 0x2f8, 0x93, 0x113, 0x2a9, 0x1c4, 0x3c4, 0x192, 0x2f0, 0x2fe, 0x238, 0x14e, 0x2a1, 0x3a9, 0xef, 0x275, 0x195, 0x293, 0x345, 0x1cb, 0x1ca, 0x302, 0x2e4, 0x11f, 0x3f6, 0x17e, 0x3d4, 0x141, 0xaf, 0x139, 0xfb, 0x194, 0x5b, 0x2a3, 0x230, 0x323, 0x18a, 0x4e, 0x38a, 0x218, 0xe8, 0x216, 0x2e, 0x160, 0x3c1, 0x68, 0x87, 0x2f2, 0x367, 0x1f4, 0x2b1, 0x37a, 0x2b0, 0x1b2, 0x356, 0x249, 0x1bf, 0xc1, 0x315, 0x254, 0x2fb, 0x3c2, 0x339, 0x2ad, 0x2f6, 0x55, 0x265, 0x146, 0xcc, 0x82, 0x308, 0x110, 0x1f8, 0x3ee, 0x3c0, 0x2a0, 0x161, 0x109, 0x18e, 0x37c, 0x1b, 0x1ef, 0x35e, 0x24, 0x294, 0x326, 0x70, 0x239, 0x386, 0x347, 0x52, 0x206, 0xfd, 0x33f, 0x6, 0x2ab, 0x5d, 0x8, 0x26d, 0x32b, 0x3e7, 0x365, 0x6d, 0x199, 0x391, 0x3e7, 0x2c3, 0x1b4, 0x3fa, 0x42, 0x1a3, 0x29a, 0x3c9, 0x3, 0x2ab, 0xba, 0x20, 0x34c, 0x2dc, 0x7, 0xc6, 0x2e5, 0x3a7, 0x52, 0x5, 0x3f4, 0x1ce, 0x60, 0x1dd, 0x36d, 0x9, 0x14a, 0x326, 0xe0, 0xf6, 0xf, 0x15, 0x252, 0xa0, 0x267, 0x1be, 0x1b, 0x3de, 0x163, 0x120, 0x11a, 0x11, 0x3f, 0x2ff, 0x1e0, 0x2a0, 0x2c2, 0x2d, 0x6b, 0x3a5, 0x360, 0x32e, 0x33, 0x41, 0x308, 0x220, 0x3e9, 0x34f, 0x77, 0xbd, 0xe6, 0x1a9, 0x17b, 0x55, 0xc3, 0x111, 0x269, 0x32, 0x1d8, 0x99, 0x1c7, 0x12a, 0x2fb, 0x38d, 0xff, 0x145, 0x333, 0x2b2, 0x56, 0x268, 0x1ab, 0x249, 0x37e, 0x304, 0x9e, 0x101, 0x3cf, 0x15c, 0x3df, 0xfa, 0x2b1, 0x2fd, 0x2d2, 0x18b, 0x105, 0x1a2, 0x303, 0x58, 0x3e4, 0x68, 0x10e, 0x3da, 0x30e, 0x37f, 0x29d, 0x30f, 0x2e6, 0x10c, 0xe8, 0x25, 0xb8, 0x312, 0x332, 0x25f, 0x307, 0x63, 0x2e5, 0x347, 0x148, 0x28, 0x337, 0x1be, 0x36, 0x363, 0x30a, 0x224, 0x308, 0x49, 0x3bf, 0x24e, 0x379, 0x38d, 0x1fe, 0x11d, 0x1ae, 0x37a, 0x2d2, 0x316, 0x1d, 0x10b, 0x5c, 0x312, 0xce, 0x65, 0x5b, 0x29e, 0x348, 0x162, 0x172, 0x23e, 0x38f, 0x393, 0x1aa, 0x3a9, 0x3bc, 0x311, 0x191, 0x28d, 0x15b, 0x23b, 0x6e, 0xa2, 0x2aa, 0x246, 0x2df, 0x151, 0x1f0, 0x205, 0x2ab, 0x174, 0x80, 0x256, 0x193, 0xe0, 0x1ec, 0x3c, 0xa8, 0x161, 0x2d, 0xd6, 0x28f, 0x336, 0x28c, 0x269, 0x64, 0x369, 0xc1, 0x4f, 0x101, 0x397, 0x179, 0x2c7, 0x3bb, 0x29d, 0x217, 0x38a, 0x72, 0x29b, 0xa9, 0x253, 0x272, 0x3d1, 0x2ec, 0x1d3, 0x1cb, 0x321, 0x4c, 0x5e, 0x17f, 0x79, 0x262, 0x9d, 0x35d, 0x1cf, 0x3f2, 0x122, 0x59, 0xf3, 0x3ff, 0x365, 0x1b4, 0x3fd, 0x108, 0x103, 0x1fa, 0x1ce, 0x26d, 0x16e, 0xe, 0x239, 0xf, 0x54, 0x161, 0x5a, 0x358, 0x55, 0x30c, 0x134, 0x356, 0x26c, 0x303, 0x160, 0x237, 0x236, 0x5b, 0x135, 0x13b, 0x302, 0x30d, 0x359, 0x238, 0x262, 0x13a, 0x16f, 0x263, 0x357, 0x1, 0x26d, 0x16e, 0xe, 0x239, 0xf, 0x54, 0x161, 0x5a, 0x358, 0x55, 0x30c, 0x134, 0x356, 0x26c, 0x303, 0x160, 0x237, 0x236, 0x5b, 0x135, 0x13b, 0x302, 0x30d, 0x359, 0x238, 0x262, 0x13a, 0x16f, 0x263, 0x357, 0x1, 0x26d, 0x16e, 0xe, 0x239, 0xf, 0x54, 0x161, 0x5a, 0x358, 0x55, 0x30c, 0x134, 0x356, 0x26c, 0x303, 0x160, 0x237, 0x236, 0x5b, 0x135, 0x13b, 0x302, 0x30d, 0x359, 0x238, 0x262, 0x13a, 0x16f, 0x263, 0x357, 0x1, 0x26d, 0x16e, 0xe, 0x239, 0xf, 0x54, 0x161, 0x5a, 0x358, 0x55, 0x30c, 0x134, 0x356, 0x26c, 0x303, 0x160, 0x237, 0x236, 0x5b, 0x135, 0x13b, 0xd3, 0x1b1, 0x70, 0x3d8, 0x1e0, 0x12d, 0x1cc, 0x2a6, 0xd7, 0x2fd, 0x2bd, 0x218, 0x29b, 0x2a4, 0x171, 0x19f, 0x25d, 0x1a1, 0x15b, 0xfe, 0x2e9, 0xda, 0x3f3, 0x52, 0x28, 0xc7, 0x3d6, 0x19b, 0x111, 0x36c, 0x9b, 0x385, 0x160, 0x67, 0xca, 0x2d8, 0x374, 0x321, 0x130, 0x1e9, 0x36f, 0x1ee, 0x156, 0x1f0, 0x6, 0x2ea, 0x1af, 0x120, 0xc2, 0x49, 0x2e7, 0xa1, 0x3cf, 0x2f2, 0x215, 0x395, 0x4b, 0x341, 0x3c3, 0x32f, 0x14b, 0x1d5, 0x1cf, 0x3d3, 0x204, 0x26d, 0x2dc, 0x38, 0x1ec, 0xf0, 0x292, 0xe6, 0x153, 0x26f, 0x37a, 0x35a, 0x10c, 0x349, 0x152, 0x2bc, 0x2cb, 0x32a, 0x2d4, 0x2a9, 0x7f, 0x370, 0x6d, 0x3fd, 0x29, 0x14, 0x267, 0x1eb, 0x2c9, 0x28c, 0x1b6, 0x249, 0x3c6, 0xb0, 0x237, 0x65, 0x16c, 0x1ba, 0x394, 0x98, 0x2f0, 0x3b3, 0xf7, 0xab, 0xf8, 0x3, 0x175, 0x2d3, 0x90, 0x61, 0x1a6, 0x2cd, 0x380, 0x1f7, 0x77, 0x3c2, 0x3f1, 0x3e8, 0x133, 0x138, 0x2f9, 0x3e2, 0x354, 0x2ee, 0x1cf, 0x3af, 0x2, 0x34c, 0x193, 0x309, 0x3ee, 0xee, 0x38d, 0x3eb, 0x3d9, 0x266, 0x270, 0x1fb, 0x3cd, 0x2a1, 0x1d5, 0x39e, 0x357, 0x4, 0x291, 0x326, 0x21b, 0x3d5, 0x1dc, 0x313, 0x3df, 0x3bb, 0xc5, 0xe9, 0x3f6, 0x393, 0x14b, 0x3aa, 0x335, 0x2a7, 0x8, 0x12b, 0x245, 0x3f, 0x3a3, 0x3b8, 0x22f, 0x3b7, 0x37f, 0x18a, 0x1d2, 0x3e5, 0x32f, 0x296, 0x35d, 0x263, 0x147, 0x10, 0x256, 0x83, 0x7e, 0x34f, 0x379, 0x57, 0x367, 0x2f7, 0x314, 0x3a4, 0x3c3, 0x257, 0x125, 0x2b3, 0xcf, 0x28e, 0x20, 0xa5, 0x106, 0xfc, 0x297, 0x2fb, 0xae, 0x2c7, 0x1e7, 0x221, 0x341, 0x38f, 0xa7, 0x24a, 0x16f, 0x19e, 0x115, 0x40, 0x14a, 0x20c, 0x1f8, 0x127, 0x1ff, 0x15c, 0x187, 0x3ce, 0x4b, 0x28b, 0x317, 0x14e, 0x34c, 0x326, 0x3f, 0x34f, 0x2fb, 0x15c, 0x30e, 0x323, 0x258, 0xea, 0x238, 0x334, 0x20b, 0x306, 0x175, 0x35e, 0x112, 0x76, 0xc1, 0xf9, 0x340, 0x5b, 0x1ba, 0x24b, 0x192, 0x157, 0x85, 0x346, 0x3e1, 0x37c, 0x2c9, 0x222, 0x356, 0x344, 0x170, 0x139, 0x2b7, 0xb5, 0x2a9, 0x1fc, 0x365, 0x376, 0x20e, 0x161, 0x2d0, 0x39d, 0x37a, 0x173, 0xe4, 0x3d4, 0xf4, 0x371, 0x2f8, 0x81, 0x26d, 0x362, 0x380, 0x3ee, 0x1dc, 0x22f, 0x367, 0x1e7, 0x4b, 0x11f, 0x47, 0x262, 0x1c2, 0x366, 0x2ab, 0x36d, 0x120, 0x308, 0x99, 0x9e, 0x68, 0x188, 0x135, 0x1ca, 0x130, 0x3ad, 0x295, 0x36e, 0xfd, 0x26b, 0xd8, 0x146, 0x36c, 0x26c, 0x2e, 0xa6, 0x3d1, 0x293, 0xd4, 0x23b, 0x2e9, 0x368, 0x347, 0xad, 0x5a, 0x2f6, 0x16d, 0x1ad, 0x218, 0x27e, 0x21a, 0xef, 0x5f, 0x91, 0x2c8, 0x16e, 0x70, 0x37b, 0x23f, 0x3c2, 0x291, 0x83, 0x1f8, 0x95, 0x3cf, 0x3bd, 0x69, 0x181, 0x5e, 0x3b3, 0x3b1, 0x29a, 0x39c, 0x6c, 0x146, 0x2d1, 0x1a2, 0x170, 0x272, 0x2ce, 0x1a1, 0x2ca, 0x3f7, 0xc6, 0x1e, 0x292, 0x339, 0x7d, 0x29d, 0x270, 0x3e5, 0xa7, 0x13a, 0x2dd, 0x351, 0x36d, 0x240, 0x3b, 0xc1, 0x1f2, 0x11b, 0x2d8, 0x396, 0x1e2, 0x51, 0x2fa, 0x29, 0xa0, 0xd6, 0x154, 0x2b0, 0x86, 0x13f, 0x21a, 0x1de, 0x17c, 0x81, 0xd3, 0x193, 0x3f, 0x297, 0x3fe, 0x2f2, 0x8c, 0xb1, 0x30d, 0x1f5, 0xf7, 0x151, 0x277, 0x209, 0x32e, 0xdb, 0x136, 0x2e, 0x14c, 0x35f, 0xb5, 0x15b, 0x3f9, 0x31e, 0x305, 0x150, 0xe6, 0x28a, 0x2d6, 0x4e, 0x2f9, 0x393, 0x125, 0x2de, 0xeb, 0x2e8, 0x48, 0x184, 0x99, 0x13c, 0x1a0, 0x5b, 0x374, 0x13e, 0x8b, 0x15d, 0x84, 0x14, 0x31c, 0x22e, 0x56, 0x316, 0x3a0, 0x141, 0x33d, 0x22b, 0x91, 0x12b, 0x20c, 0x3db, 0x142, 0x10e, 0x2a3, 0xe5, 0x260, 0x157, 0x214, 0x5, 0x18e, 0x22e, 0xac, 0x43, 0x13f, 0x3d, 0x371, 0x3f2, 0x2, 0x256, 0x11, 0x3bf, 0x284, 0x21c, 0x14f, 0x1ca, 0xc9, 0x2ae, 0x21, 0xa, 0x31c, 0x55, 0x158, 0x86, 0x27e, 0x7a, 0x2eb, 0x3ed, 0x4, 0xa5, 0x22, 0x377, 0x101, 0x31, 0x29e, 0x394, 0x192, 0x155, 0x42, 0x14, 0x231, 0xaa, 0x2b0, 0x10c, 0xf5, 0xf4, 0x1df, 0x3d3, 0x8, 0x14a, 0x44, 0x2e7, 0x202, 0x62, 0x135, 0x321, 0x324, 0x2aa, 0x84, 0x28, 0x6b, 0x154, 0x169, 0x218, 0x1ea, 0x1e8, 0x3be, 0x3af, 0x10, 0x294, 0x88, 0x1c7, 0xd, 0xc4, 0x26a, 0x24b, 0x241, 0x15d, 0x108, 0x50, 0xd6, 0x2a8, 0x2d2, 0x39, 0x3d4, 0x3d0, 0x375, 0x357, 0x20, 0x121, 0x110, 0x38e, 0x1a, 0x188, 0xdd, 0x9f, 0x8b, 0x2ba, 0x210, 0xa0, 0x1ac, 0x159, 0x1ad, 0x256, 0x22, 0x2e7, 0xd, 0x188, 0x1ba, 0x27c, 0x51, 0x3fa, 0x290, 0x5a, 0x39d, 0x3e6, 0x6f, 0x3e2, 0x125, 0x36a, 0x2ab, 0x35e, 0x82, 0x1bf, 0x160, 0xfb, 0x293, 0x2a9, 0x3fb, 0xc6, 0x78, 0x17a, 0x3eb, 0x1e7, 0x258, 0x359, 0x33b, 0x151, 0x1ce, 0xd8, 0x222, 0x286, 0x94, 0x171, 0x38c, 0x91, 0x26d, 0x326, 0x1f8, 0x254, 0x87, 0x2a3, 0x1ca, 0x192, 0x2aa, 0x108, 0xa0, 0x358, 0x16d, 0x173, 0x329, 0xd5, 0x3aa, 0x33c, 0x2e8, 0x120, 0x76, 0x201, 0x237, 0xbb, 0x21e, 0x23b, 0x365, 0x386, 0x2a0, 0x339, 0x1f4, 0x18a, 0x11f, 0x238, 0x196, 0x3e0, 0x180, 0x32e, 0x36c, 0x344, 0x392, 0x2cb, 0x191, 0x59, 0x16e, 0x380, 0x34f, 0x3f5, 0x3bd, 0x1a4, 0x26, 0x3ad, 0x85, 0x206, 0x18e, 0x55, 0x2b0, 0x218, 0x3d4, 0x3a9, 0x1cf, 0x28e, 0x200, 0x61, 0x99, 0xf9, 0x236, 0x2ed, 0x23c, 0xdc, 0x368, 0xa5, 0x88, 0x315, 0xd0, 0x16c, 0x243, 0x37, 0x1b4, 0x20e, 0x23d, 0x11d, 0x133, 0x341, 0x11c, 0x196, 0x3c9, 0x209, 0x146, 0x2a5, 0x4a, 0x171, 0x311, 0x244, 0x34c, 0x20c, 0x377, 0xd, 0x310, 0x2e1, 0x3c4, 0x119, 0x3a7, 0x161, 0x153, 0x2d6, 0x270, 0x317, 0x19a, 0x7c, 0x60, 0x197, 0x36c, 0x281, 0x253, 0x275, 0x126, 0x332, 0x326, 0x3f0, 0x142, 0x31, 0x26a, 0x13e, 0x51, 0x3fd, 0x252, 0x2d0, 0x1ae, 0x27, 0x3f6, 0x29c, 0x301, 0x6, 0x3de, 0x330, 0x26c, 0x2e0, 0x361, 0x191, 0xb2, 0x1b1, 0x3f, 0x95, 0x247, 0x2a3, 0x394, 0x241, 0x17d, 0xa4, 0x2d, 0x39d, 0x3c5, 0x1bc, 0x32f, 0x274, 0x183, 0x3ba, 0x33, 0x320, 0x2e, 0x272, 0x25d, 0x8a, 0x25f, 0x1c0, 0x34f, 0x3e3, 0x2ef, 0x13b, 0x260, 0x155, 0x108, 0x140, 0x17b, 0x37a, 0x31d, 0x1f1, 0x125, 0x2dd, 0x2be, 0x2c6, 0x32, 0x385, 0xa6, 0x14a, 0x220, 0x9e, 0x11b, 0x1d3, 0x1c4, 0x3b6, 0x305, 0x12d, 0x3f1, 0x3ce, 0x2e4, 0x3ea, 0x2df, 0x3e1, 0x343, 0xac, 0x218, 0x34b, 0x2ee, 0x33c, 0x3b2, 0x224, 0x1bf, 0x189, 0x3ab, 0x1a1, 0xf3, 0x1c, 0x3ee, 0x3fe, 0x373, 0x13b, 0xc9, 0x15d, 0x52, 0x2d, 0x333, 0x30f, 0x1fb, 0x29c, 0x20b, 0x18, 0x2cf, 0x36c, 0x10b, 0x15e, 0x38c, 0x244, 0x291, 0x22, 0x38e, 0xd0, 0x2d8, 0x11e, 0x1b8, 0x376, 0x150, 0x27b, 0x3bb, 0x12c, 0x2bb, 0x1ee, 0x27a, 0x2f1, 0x30c, 0x225, 0xf5, 0x3a9, 0x335, 0xba, 0x120, 0x1d8, 0x58, 0xfb, 0x25e, 0x2ca, 0x307, 0x3b9, 0x3b8, 0x2f2, 0xd2, 0x4c, 0x157, 0x84, 0x140, 0x2f6, 0x1f3, 0xde, 0x32f, 0xe1, 0x205, 0x1ef, 0x330, 0xd1, 0x392, 0x33e, 0x126, 0x26d, 0x83, 0x3bf, 0xd, 0x229, 0x396, 0x21f, 0x1b4, 0x15, 0xe6, 0xfa, 0x314, 0xea, 0x399, 0x2a2, 0x26b, 0x294, 0x92, 0xf9, 0x194, 0x21e, 0x1fc, 0xc6, 0x3c0, 0x22f, 0x46, 0x302, 0x3ad, 0x21, 0xa0, 0x2f6, 0x3e6, 0x378, 0x14e, 0x20b, 0x30, 0x32e, 0x356, 0x94, 0x39a, 0x2f8, 0x8, 0x8d, 0x99, 0x3c1, 0xbb, 0xd4, 0x3fb, 0x239, 0x23f, 0x15c, 0x230, 0x26, 0x157, 0x108, 0x109, 0x39d, 0x30f, 0x3f6, 0x262, 0x7c, 0x180, 0x146, 0x286, 0xa9, 0xef, 0x3ed, 0x40, 0x61, 0xc1, 0x237, 0x1d1, 0x2a9, 0x3e7, 0x1ec, 0x1dc, 0x2f2, 0x1a4, 0x130, 0x2aa, 0x52, 0x5a, 0xd7, 0x4e, 0x38f, 0x334, 0x3e0, 0x1b, 0x222, 0x1d, 0x141, 0x371, 0x357, 0x200, 0x308, 0x201, 0x19c, 0x293, 0x165, 0x307, 0x37b, 0x2fb, 0x3bd, 0x13b, 0x192, 0x17d, 0x290, 0x2d0, 0x2b1, 0x270, 0x47, 0x196, 0x33f, 0xd8, 0x134, 0xe8, 0x21a, 0x3be, 0x28e, 0x24, 0x76, 0x2c, 0xfb, 0xb5, 0x33a, 0xe, 0x3ee, 0x3f5, 0x1d7, 0x1ca, 0x121, 0x248, 0x3c1, 0x176, 0x350, 0x3e7, 0x3d8, 0x379, 0x3bd, 0x276, 0x241, 0x3fa, 0x15a, 0x2a6, 0x133, 0x23e, 0x399, 0x29a, 0x2f1, 0x2b, 0x218, 0x137, 0x2b3, 0x2ab, 0x185, 0x320, 0x170, 0x19f, 0x24c, 0x34c, 0x44, 0x4f, 0x236, 0x283, 0xfe, 0xc6, 0x389, 0xae, 0x230, 0x4c, 0x155, 0x52, 0xb4, 0x35c, 0x270, 0x8e, 0x251, 0x1ce, 0x19b, 0x2c1, 0x27e, 0x35b, 0x19e, 0x36d, 0x104, 0x385, 0x139, 0x166, 0x164, 0x326, 0x3bf, 0x34, 0x2d8, 0x71, 0x3b6, 0xf, 0x2f4, 0x187, 0x162, 0x1e9, 0x214, 0xa0, 0x1e5, 0x383, 0x3f6, 0xcd, 0x1f0, 0x1b, 0x4d, 0x74, 0x21a, 0x375, 0x22a, 0x120, 0x369, 0x189, 0x2b7, 0x226, 0xb7, 0x3f, 0xa1, 0xc4, 0x1cb, 0x37, 0x1bb, 0x2a0, 0x3fc, 0x395, 0x30d, 0x1a7, 0x103, 0x6b, 0x2da, 0x233, 0x32f, 0x384, 0x18, 0x32e, 0x2a5, 0x250, 0xef, 0x3d3, 0x100, 0x308, 0x242, 0x132, 0x237, 0x34d, 0x2ca, 0xe, 0x3a3, 0x327, 0x135, 0x1e2, 0xda, 0x54, 0xff, 0x3ce, 0x30d, 0x34e, 0x5, 0x358, 0x1f3, 0x2f9, 0x262, 0x1f0, 0x36, 0x134, 0x3a0, 0x1e8, 0x263, 0x3b2, 0x104, 0x303, 0xed, 0x322, 0x26d, 0x11, 0x223, 0x236, 0x10f, 0x3f8, 0x239, 0xee, 0x1ed, 0x13b, 0x241, 0x3fd, 0x161, 0x11d, 0x314, 0x359, 0x3b1, 0x3cb, 0x55, 0x2bd, 0x2fc, 0x13a, 0x3, 0x2cf, 0x356, 0x250, 0x1de, 0x357, 0x12, 0xec, 0x160, 0x35f, 0x226, 0x16e, 0xfc, 0x101, 0x5b, 0x11e, 0x1db, 0xf, 0x1e1, 0x215, 0x302, 0x2af, 0x210, 0x5a, 0x35c, 0xe9, 0x238, 0x2ac, 0xdf, 0x30c, 0x10c, 0x137, 0x16f, 0x2be, 0x33, 0x26c, 0x253, 0x311, 0x1, 0x242, 0x132, 0x237, 0x34d, 0x2ca, 0xe, 0x3a3, 0x327, 0x135, 0x1e2, 0xda, 0x54, 0xff, 0x3ce, 0x30d, 0x34e, 0x5, 0x358, 0x1f3, 0x2f9, 0x262, 0x8d, 0xc1, 0x19c, 0xb5, 0x1e6, 0x380, 0x254, 0x188, 0x243, 0x2e9, 0xf, 0x3c2, 0x46, 0x26, 0x2aa, 0x290, 0x2ad, 0x133, 0xea, 0x1ee, 0x3e1, 0x55, 0x173, 0x3e2, 0x1c2, 0x30, 0x146, 0x1d, 0x21a, 0x1cf, 0x2e8, 0x82, 0x303, 0x1da, 0x93, 0x34c, 0x110, 0xf9, 0xbb, 0x2a9, 0x307, 0x3ee, 0x397, 0x135, 0x3c4, 0x368, 0x2a0, 0x3eb, 0x12e, 0x2f0, 0x21, 0x109, 0xd7, 0x270, 0x238, 0x151, 0x37c, 0x56, 0xe4, 0x2a1, 0x366, 0x1ef, 0x36c, 0x94, 0xef, 0x357, 0x24, 0x3b0, 0x312, 0x195, 0x59, 0x326, 0x2e7, 0x340, 0x345, 0x1fc, 0x239, 0x1dc, 0x3bd, 0x1ca, 0x51, 0x347, 0xe6, 0x3bb, 0x2e4, 0x2d7, 0x206, 0x358, 0x3e6, 0x3f6, 0x334, 0x33f, 0x2c9, 0x18b, 0x3d4, 0x3aa, 0x2ab, 0x21d, 0x26c, 0xaf, 0x5f, 0x8, 0x61, 0x201, 0xfb, 0x1a1, 0x32b, 0x3f, 0x284, 0x5b, 0x23c, 0x365, 0x78, 0x22f, 0x11a, 0x304, 0xfb, 0x342, 0xb7, 0x1f8, 0x1a, 0x372, 0x23b, 0x18c, 0xee, 0x3bd, 0x394, 0x144, 0x20e, 0x27b, 0x395, 0x5e, 0x10a, 0x280, 0xd7, 0xe9, 0xf2, 0x29a, 0x3a5, 0x2d2, 0x17e, 0x274, 0x18, 0x146, 0x3a, 0x7a, 0x263, 0x2d3, 0x64, 0x170, 0xe3, 0x204, 0x8d, 0x182, 0x279, 0x1a1, 0x25f, 0xfc, 0xd, 0x1b9, 0x319, 0xc6, 0x77, 0x3da, 0x1ca, 0xa2, 0x107, 0x339, 0x3ce, 0x2f, 0x85, 0x140, 0x26f, 0x270, 0x79, 0x14d, 0x3d6, 0x169, 0xbf, 0x13a, 0xc, 0xa3, 0x1d, 0x3d, 0x335, 0x36d, 0x32, 0xb8, 0x275, 0x102, 0x242, 0xc1, 0x338, 0x2d4, 0x32b, 0x7e, 0x202, 0x2d8, 0x388, 0x63, 0x23f, 0x1ed, 0xe5, 0x51, 0x287, 0x398, 0x1e7, 0x213, 0x246, 0xa0, 0x333, 0x138, 0x238, 0x2a2, 0x1eb, 0x2b0, 0x25b, 0x9d, 0x6, 0x255, 0x20a, 0x21a, 0x39e, 0x3b2, 0x19, 0x5c, 0x33e, 0x81, 0x234, 0xb, 0x3d1, 0x45, 0x2cd, 0x2e7, 0x11b, 0x35, 0x3e7, 0x1f7, 0x327, 0x1ba, 0x6e, 0x305, 0x3c2, 0x118, 0x260, 0x3fa, 0x18d, 0x3e8, 0x2e4, 0x34e, 0x28, 0x39d, 0x138, 0x79, 0x29a, 0x343, 0x35a, 0x3e2, 0x301, 0x300, 0x134, 0x13f, 0x2ee, 0x2ab, 0x66, 0x281, 0x39a, 0x3af, 0x48, 0x1bf, 0x298, 0x322, 0x34c, 0x49, 0x38b, 0x293, 0xf3, 0x309, 0x284, 0x16c, 0x388, 0xc6, 0xee, 0x373, 0x24b, 0x232, 0xa8, 0x3eb, 0xb1, 0x353, 0x52, 0x352, 0x266, 0x359, 0x1b7, 0x31c, 0x37a, 0x1fb, 0x261, 0x1ce, 0x186, 0x39, 0x2a1, 0x183, 0x2cf, 0x286, 0x10d, 0x39e, 0x36d, 0x64, 0x2e0, 0x38c, 0x4, 0xc2, 0x2c, 0x35f, 0x114, 0x326, 0x38e, 0x65, 0xd4, 0x387, 0x3d5, 0x87, 0x2e1, 0x1b8, 0xf, 0x313, 0x69, 0x192, 0x3f3, 0x23d, 0x3bb, 0x382, 0x123, 0xa0, 0x26f, 0xe9, 0x1e4, 0x27a, 0x117, 0x173, 0x61, 0x2c, 0x2b7, 0x59, 0x106, 0x9e, 0xbb, 0x165, 0x70, 0x254, 0x5b, 0x1c4, 0xc6, 0x1dc, 0x1d7, 0x27c, 0x368, 0x12d, 0x30e, 0x26, 0x17d, 0x161, 0x1f4, 0x2e4, 0x295, 0xa0, 0xd7, 0x3a4, 0x33b, 0x3e1, 0x2a8, 0x6f, 0x262, 0x33f, 0x265, 0x218, 0x2a1, 0x306, 0x32e, 0x1d, 0xf4, 0x33c, 0x2c6, 0x26c, 0x171, 0x3ed, 0x24, 0x1bf, 0x139, 0x93, 0x256, 0x99, 0x19c, 0x1a1, 0x16e, 0x3db, 0x340, 0x21e, 0x3e7, 0x3ee, 0x87, 0x1cb, 0x2e9, 0x78, 0x15c, 0x13b, 0x51, 0x20e, 0x1fe, 0x12e, 0x3ad, 0x52, 0x2ad, 0x18a, 0x2fe, 0x346, 0x358, 0x30f, 0x47, 0x151, 0x3d6, 0x1ad, 0x3e2, 0x20b, 0x1b, 0x1b2, 0x3d4, 0x16f, 0x3ba, 0x36c, 0xa9, 0x3be, 0x2e8, 0x19, 0x170, 0x38c, 0x8, 0x308, 0x160, 0x195, 0x2c8, 0x22, 0xf9, 0x1d1, 0x33a, 0x380, 0x284, 0x2d8, 0x23b, 0x239, 0x2fb, 0x2a3, 0x3c4, 0x376, 0xc2, 0xb0, 0x195, 0x199, 0x88, 0x3c1, 0x12f, 0x391, 0x1f8, 0xd0, 0x10f, 0x3e7, 0x3d5, 0x21c, 0x243, 0x2c3, 0x31b, 0x3bd, 0x9f, 0x1b4, 0x12d, 0x215, 0x98, 0x3fa, 0x23d, 0x2f7, 0x5e, 0x42, 0x168, 0x133, 0x2bb, 0x1a3, 0x358, 0x217, 0x11c, 0x29a, 0x117, 0x1c5, 0x14e, 0x3c9, 0x336, 0x218, 0x14b, 0x3, 0x146, 0x1d0, 0x2bf, 0x2ab, 0x198, 0x4a, 0x371, 0xba, 0x208, 0x170, 0x311, 0x20, 0x76, 0x22d, 0x2cc, 0x34c, 0x124, 0xce, 0x1a1, 0x2dc, 0x377, 0x236, 0x1a8, 0x7, 0x24e, 0x310, 0xe2, 0xc6, 0x3b8, 0x355, 0x3c4, 0x2e5, 0x1e1, 0x230, 0x324, 0x3a7, 0x339, 0x24f, 0x3d2, 0x52, 0x153, 0x221, 0x3dd, 0x5, 0x3ca, 0x270, 0x3c8, 0x3f4, 0x2a8, 0xde, 0x19a, 0x1ce, 0x211, 0x390, 0x13a, 0x60, 0x9a, 0x27e, 0x35d, 0x1dd, 0x36c, 0x152, 0x2e3, 0x36d, 0x190, 0x253, 0x2f8, 0x9, 0x2db, 0x139, 0x184, 0x2c0, 0xb3, 0x1a6, 0x124, 0x19c, 0x28d, 0x2cd, 0x315, 0x259, 0x2ca, 0x380, 0x202, 0x1d3, 0x3fb, 0x1f7, 0x10e, 0x243, 0x18f, 0x77, 0x1d7, 0x1e2, 0x2e5, 0x3c2, 0xd2, 0x116, 0x20e, 0x3f1, 0x2c4, 0x2aa, 0x2b4, 0x3e8, 0x30d, 0x214, 0xb4, 0x133, 0x17f, 0x285, 0x2f6, 0x138, 0x3c8, 0x3e1, 0x2b2, 0x2f9, 0x196, 0x1be, 0x169, 0x3e2, 0x3e, 0x1b0, 0x43, 0x354, 0x205, 0x146, 0x3a0, 0x2ee, 0x175, 0x1b6, 0x152, 0x1cf, 0x1af, 0x9b, 0x171, 0x3af, 0x240, 0x303, 0x33e, 0x2, 0x308, 0x189, 0x166, 0x34c, 0x248, 0x338, 0x113, 0x193, 0x223, 0xbb, 0x19d, 0x309, 0xd, 0x3a6, 0x3ff, 0x3ee, 0x21c, 0x8f, 0x31e, 0xee, 0x3ae, 0x3c4, 0x1c3, 0x38d, 0x1a4, 0x22c, 0x15, 0x3eb, 0x181, 0x15d, 0x161, 0x3d9, 0x213, 0x21, 0x168, 0x266, 0x2fe, 0x103, 0x1e5, 0x270, 0x399, 0x3cb, 0x16d, 0x1fb, 0x32c, 0x37c, 0x308, 0x312, 0x191, 0x256, 0xc1, 0x3d1, 0x59, 0x22, 0x3c1, 0xb5, 0x16e, 0x2e7, 0x194, 0x165, 0x380, 0xd, 0x345, 0x3e7, 0x34f, 0x188, 0x1c4, 0x239, 0x3f5, 0x1ba, 0x2e9, 0x3c0, 0x3bd, 0x27c, 0x376, 0x3c2, 0x1a4, 0x51, 0x54, 0x367, 0x26, 0x3fa, 0xe6, 0x323, 0x3ad, 0x290, 0x23a, 0x2e4, 0x85, 0x5a, 0x133, 0x2fe, 0x206, 0x39d, 0x3a4, 0x1ee, 0x18e, 0x3e6, 0x47, 0x29a, 0x55, 0x6f, 0x334, 0x26b, 0x2b0, 0x3e2, 0x7c, 0x2c9, 0x218, 0x125, 0x30, 0x134, 0x3d4, 0x36a, 0x363, 0x1d, 0x3a9, 0x2ab, 0x269, 0xa9, 0x1cf, 0x35e, 0x26c, 0x39a, 0x28e, 0x82, 0x170, 0x5f, 0x200, 0x1bf, 0x1da, 0x81, 0x61, 0x160, 0xb3, 0x34c, 0x99, 0xfb, 0x8a, 0x106, 0xf9, 0x293, 0x32b, 0x3db, 0x236, 0x2a9, 0x70, 0x284, 0x2ed, 0x3fb, 0x3ee, 0x31, 0x23c, 0xc6, 0x2fb, 0x135, 0xdc, 0x78, 0x2f2, 0x24b, 0x219, 0x53, 0x93, 0x121, 0x16, 0x195, 0xd3, 0x248, 0xfb, 0x114, 0x11, 0x3c1, 0x16a, 0x1b1, 0x315, 0x176, 0xf3, 0x1f8, 0x289, 0x350, 0x70, 0x101, 0x3a6, 0x3e7, 0x297, 0x229, 0x23b, 0x3d8, 0x247, 0x243, 0x235, 0x379, 0x135, 0x1b8, 0x1e0, 0x3bd, 0xf1, 0x1c3, 0x22f, 0x276, 0x232, 0x12d, 0x8c, 0x241, 0x20e, 0x3df, 0x13, 0x3fa, 0x1cc, 0x97, 0x157, 0x15a, 0x3d9, 0x5e, 0x210, 0x2a6, 0x258, 0x123, 0x2d, 0x133, 0x1f5, 0xa, 0xd7, 0x23e, 0x1b7, 0x358, 0x9c, 0x399, 0x337, 0x2fd, 0x227, 0x29a, 0xaa, 0x1bc, 0x196, 0x2f1, 0x2bd, 0x14e, 0x277, 0x2b, 0x17e, 0x1f, 0x360, 0x218, 0x24a, 0xc0, 0x1b2, 0x137, 0x183, 0x146, 0x29b, 0x2b3, 0x1ef, 0x105, 0x3d0, 0x2ab, 0xdb, 0x2a4, 0x263, 0x185, 0x10b, 0x371, 0x1d9, 0x320, 0x171, 0x2a7, 0x41, 0x170, 0xbe, 0x12, 0x1e3, 0x19f, 0x4, 0x76, 0x3b, 0x14c, 0x91, 0x234, 0x2c0, 0x191, 0x14a, 0xb, 0x195, 0x1a6, 0x132, 0x3d1, 0x164, 0x220, 0x19c, 0x45, 0x20c, 0x3c1, 0x2d4, 0x2cd, 0x9e, 0x34d, 0x25f, 0x2e7, 0x259, 0x27d, 0x1f8, 0x11b, 0x15b, 0x380, 0x34, 0x35, 0xe, 0x142, 0x1d3, 0x3e7, 0x127, 0xb6, 0x1fc, 0x1f7, 0x62, 0x1c4, 0xf6, 0x327, 0x243, 0x63, 0x1ff, 0x1ba, 0x3b6, 0x77, 0x2a3, 0x6e, 0xf0, 0x3bd, 0x1e2, 0x305, 0x15c, 0x321, 0x2d9, 0x3c2, 0x299, 0x119, 0x12d, 0x118, 0x116, 0x54, 0x187, 0x260, 0x347, 0x3f1, 0x20d, 0x3fa, 0x398, 0x25c, 0x2aa, 0x18d, 0x3ce, 0x3ad, 0x252, 0x3e8, 0x5e, 0x29, 0x28a, 0x2e4, 0x214, 0x1a9, 0x4b, 0x34e, 0x212, 0x133, 0x3ea, 0x28, 0x2b1, 0x3a8, 0x285, 0x39d, 0x28b, 0x2df, 0x358, 0x138, 0x27f, 0x18e, 0x383, 0x79, 0x3e1, 0x1bd, 0x317, 0x29a, 0x154, 0x2f9, 0xab, 0x343, 0x31d, 0x334, 0x76, 0x139, 0x81, 0x308, 0xa6, 0x91, 0x61, 0x312, 0x93, 0x8d, 0x160, 0x191, 0x294, 0x2c, 0xb3, 0x256, 0x201, 0x195, 0x34c, 0xc1, 0x2b7, 0x26d, 0x99, 0x3d1, 0x2c8, 0x92, 0xfb, 0x59, 0x110, 0x19c, 0x8a, 0x22, 0x237, 0x113, 0x106, 0x3c1, 0x1a1, 0x326, 0xf9, 0xb5, 0x362, 0x9e, 0x293, 0x16e, 0x315, 0x1d1, 0x32b, 0x2e7, 0xbb, 0x1e6, 0x3db, 0x194, 0x33a, 0x1f8, 0x236, 0x165, 0x3f, 0x340, 0x2a9, 0x380, 0x68, 0xd4, 0x70, 0xd, 0x21e, 0xe, 0x284, 0x345, 0x307, 0x254, 0x2ed, 0x3e7, 0x24e, 0x2d8, 0x3fb, 0x34f, 0x5b, 0x1fc, 0x3ee, 0x188, 0x23b, 0x37b, 0x31, 0x1c4, 0x1ec, 0x87, 0x23c, 0x239, 0x397, 0x243, 0xc6, 0x3f5, 0x1cb, 0x31e, 0x2fb, 0x1ba, 0x365, 0x1dc, 0x135, 0x2e9, 0x23f, 0x2a3, 0xdc, 0x3c0, 0x1d7, 0x21f, 0x78, 0x3bd, 0x3c4, 0xf, 0x2f2, 0x27c, 0x386, 0x15c, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0x1d8, 0x3b4, 0x8, 0x2db, 0x19f, 0x40, 0x2f5, 0xe3, 0x200, 0x385, 0x311, 0x24, 0x17, 0xbe, 0x120, 0xb8, 0x1f9, 0x112, 0x1c9, 0x3d3, 0x82, 0x253, 0x2a7, 0x19, 0x2bc, 0x115, 0xc8, 0x1cd, 0xba, 0x249, 0x273, 0x1d9, 0x26c, 0x3bc, 0x2d3, 0x344, 0x1df, 0x2b5, 0x216, 0x2e3, 0x185, 0x94, 0x335, 0x33, 0xa9, 0x19e, 0x198, 0x141, 0xeb, 0xdb, 0x21a, 0x351, 0x2d1, 0xf4, 0x2be, 0x2a5, 0x3a9, 0x1dd, 0x105, 0x177, 0x2f3, 0x3a, 0x3aa, 0x3b5, 0x1d0, 0x16f, 0x197, 0x29b, 0x36a, 0xa3, 0xf5, 0x366, 0x111, 0x3a1, 0x306, 0x9a, 0x137, 0x6, 0xd9, 0x1aa, 0x30, 0x2c1, 0x14b, 0x180, 0x225, 0x24a, 0x1b, 0x10c, 0x274, 0xd8, 0x72, 0x384, 0x2c9, 0x390, 0x1f, 0x265, 0xbf, 0xf8, 0x30c, 0x1f1, 0x3c9, 0x56, 0x393, 0x277, 0x2b0, 0xa7, 0x39c, 0x1ad, 0x131, 0xdf, 0x173, 0x19a, 0x2f1, 0x38a, 0x3b0, 0x2cb, 0x40, 0x1e3, 0x38c, 0x24, 0x2e, 0x2f8, 0x112, 0x392, 0x357, 0x19, 0x171, 0x5d, 0x249, 0xef, 0x36d, 0x344, 0x3be, 0x2c6, 0x94, 0x263, 0xcc, 0x141, 0x1d6, 0x36c, 0xf4, 0x175, 0x286, 0x177, 0x1ef, 0xe8, 0x16f, 0x32e, 0x27e, 0x366, 0x222, 0x29f, 0x6, 0x1b2, 0x2a1, 0x180, 0x43, 0x13a, 0xd8, 0xe4, 0x20b, 0x265, 0x17e, 0x3e0, 0x56, 0x32f, 0x1ce, 0x1ad, 0x262, 0x37c, 0x38a, 0x196, 0x28f, 0x378, 0x151, 0x2a8, 0x38f, 0xfd, 0x37a, 0x238, 0x337, 0x30f, 0x33b, 0x6b, 0x270, 0x36b, 0x2f6, 0x11f, 0x346, 0xd7, 0x359, 0x14, 0x1a5, 0x3dd, 0x109, 0x18a, 0x295, 0x2d0, 0x258, 0x21, 0x145, 0x30d, 0x52, 0x1f4, 0x2f0, 0xad, 0x1e7, 0x157, 0x31a, 0x12e, 0x17d, 0x339, 0x302, 0x3ef, 0x3eb, 0x130, 0x20e, 0x30e, 0x8b, 0x2a0, 0x230, 0x288, 0x17a, 0x13b, 0x368, 0x22f, 0x24b, 0x386, 0x369, 0x33e, 0x200, 0x20f, 0x17c, 0x112, 0x32d, 0x147, 0xc8, 0x33d, 0x3b2, 0x344, 0x375, 0x30a, 0xa9, 0x271, 0x1b6, 0xf4, 0x2ea, 0x20a, 0x3aa, 0x2cf, 0x13f, 0x366, 0x4d, 0x26e, 0x30, 0x316, 0x9d, 0xd8, 0x1c8, 0x3e, 0x30c, 0x3cd, 0xe7, 0x1ad, 0xcd, 0x1eb, 0x6f, 0x156, 0x154, 0x38f, 0x1fa, 0x1f3, 0x1e4, 0x31c, 0x138, 0x36b, 0x1e5, 0x75, 0x206, 0x16b, 0x3ea, 0x109, 0x314, 0x246, 0x2ad, 0x1c1, 0x29, 0x1f4, 0x1e9, 0x2b4, 0x323, 0x15d, 0x398, 0x302, 0x3d7, 0x3b7, 0x192, 0xa8, 0x118, 0x288, 0x2f4, 0xe5, 0x376, 0x2b8, 0x1e2, 0x78, 0x3ae, 0x370, 0x1dc, 0x374, 0x63, 0x397, 0x71, 0x3b9, 0x188, 0x3f8, 0x127, 0x2ed, 0x207, 0x202, 0xd4, 0x309, 0x11b, 0x33a, 0x3bf, 0x2ec, 0x16e, 0x13c, 0x2d4, 0x106, 0x67, 0x228, 0x92, 0x3ab, 0x1a6, 0x201, 0x166, 0x242, 0x312, 0x122, 0x3b, 0x1da, 0x2db, 0xe3, 0x24, 0xb8, 0x3d3, 0x19, 0x1cd, 0x1d9, 0x344, 0x2e3, 0x33, 0x141, 0x351, 0x2a5, 0x177, 0x3b5, 0x29b, 0x366, 0x9a, 0x1aa, 0x180, 0x10c, 0x384, 0x265, 0x1f1, 0x277, 0x1ad, 0x19a, 0x3a5, 0x378, 0x14d, 0x2da, 0x238, 0xc7, 0x9c, 0x36b, 0x3ca, 0x1d4, 0x14, 0x29d, 0x1a7, 0x2d0, 0x172, 0x210, 0x1f4, 0x3d2, 0x2c2, 0x12e, 0x1fd, 0x3fc, 0x130, 0x2a, 0x8c, 0x288, 0x1e1, 0x394, 0x386, 0x3da, 0x37, 0x23f, 0xdd, 0x235, 0x397, 0xe2, 0x2ff, 0x5b, 0x3f7, 0xa1, 0x21e, 0x1c0, 0x289, 0x33a, 0x377, 0x3a2, 0x362, 0x3e4, 0x226, 0x110, 0x3ec, 0xd3, 0x201, 0x2cc, 0x11a, 0xa6, 0x204, 0x369, 0x275, 0x12, 0x5c, 0x3ed, 0x208, 0x2e2, 0x2e8, 0x1a2, 0x375, 0x21d, 0x2a4, 0x3ac, 0x356, 0x2bf, 0x3de, 0x349, 0x1b3, 0x4d, 0xd5, 0xc0, 0x86, 0x1c2, 0x336, 0x2fc, 0x33f, 0x2d2, 0xcd, 0x3d6, 0x1bf, 0x38c, 0x120, 0x392, 0x28e, 0x249, 0x371, 0x2c6, 0xa9, 0x1d6, 0x356, 0x177, 0x363, 0x27e, 0x306, 0x1b2, 0x125, 0xd8, 0x329, 0x3e0, 0x2b0, 0x262, 0x3d6, 0x378, 0x29a, 0x37a, 0x1e4, 0x6b, 0x3a4, 0x346, 0x2b1, 0x3dd, 0x5a, 0x258, 0x108, 0x1f4, 0x3ad, 0x31a, 0x162, 0x3ef, 0x367, 0x8b, 0x12d, 0x13b, 0x376, 0x2f2, 0x21f, 0x23f, 0x1ba, 0xc6, 0x87, 0x23b, 0x34f, 0x2ed, 0xe, 0x68, 0x165, 0x3db, 0x1d1, 0x362, 0x3c1, 0x8a, 0x92, 0x2b7, 0x256, 0x160, 0x91, 0x76, 0x2cb, 0x200, 0x2e, 0x3ed, 0x19, 0x39a, 0x36d, 0x216, 0x263, 0x269, 0xf4, 0x3ba, 0xe8, 0x36a, 0x222, 0xd5, 0x180, 0x218, 0x20b, 0x30c, 0x32f, 0x26b, 0x38a, 0xab, 0x2a8, 0x47, 0x337, 0x4e, 0x36b, 0x39d, 0x359, 0xa0, 0x18a, 0x85, 0x145, 0x5e, 0xad, 0x323, 0x17d, 0x1fe, 0x130, 0x54, 0x230, 0x6d, 0x22f, 0x27c, 0x37e, 0x22b, 0x112, 0x15e, 0x174, 0x344, 0x39e, 0x330, 0xf4, 0x37d, 0x3a0, 0x366, 0x268, 0x296, 0xd8, 0x25b, 0x39b, 0x1ad, 0x261, 0x22e, 0x38f, 0x3cb, 0x27, 0x36b, 0x333, 0x17f, 0x109, 0x96, 0x84, 0x1f4, 0x353, 0x73, 0x302, 0x287, 0x23, 0x288, 0x38d, 0x13e, 0x78, 0x14f, 0x18f, 0x397, 0x388, 0x3a3, 0x2ed, 0x1c, 0x1a0, 0x33a, 0x1c7, 0x25e, 0x106, 0x338, 0x332, 0x201, 0x322, 0x184, 0x1da, 0x80, 0x17, 0x3ed, 0x32, 0x273, 0x35e, 0x128, 0xeb, 0x356, 0x2ee, 0x197, 0x3d4, 0xc, 0x225, 0x1c2, 0xc3, 0x393, 0x26b, 0x31d, 0x2ac, 0x16d, 0x79, 0x231, 0x3a4, 0x285, 0x2d6, 0x2d7, 0x1a9, 0x382, 0x290, 0x3ce, 0x2ba, 0x1fe, 0x260, 0x150, 0x1a4, 0x2d9, 0x179, 0x21f, 0x77, 0x2e1, 0x239, 0x62, 0x3f9, 0x254, 0x35, 0x21b, 0x194, 0x25f, 0x278, 0x113, 0x220, 0x35f, 0x256, 0x2c0, 0x244, 0x3b0, 0x2f5, 0xbe, 0x82, 0x1cd, 0x2d3, 0x94, 0xeb, 0x2a5, 0x3aa, 0xa3, 0x137, 0x180, 0x72, 0xf8, 0x2b0, 0x19a, 0x117, 0x38f, 0x39f, 0x9c, 0x36e, 0x35c, 0x3b3, 0x2d0, 0x382, 0x129, 0x323, 0x1fd, 0x3df, 0x8b, 0xbd, 0x394, 0xf, 0x355, 0x2c3, 0x397, 0x319, 0x297, 0x345, 0x1c0, 0x65, 0x32b, 0x278, 0x226, 0x92, 0x2ce, 0x121, 0xa6, 0x4, 0x3c6, 0x2f8, 0x208, 0x33d, 0x35e, 0x250, 0x3ac, 0x286, 0x2b3, 0x28c, 0xd5, 0x209, 0x1c8, 0x3e0, 0x2d2, 0x261, 0x55, 0x227, 0x267, 0x270, 0x1a3, 0x16b, 0x2d7, 0x352, 0x213, 0xad, 0x97, 0x3fd, 0x367, 0x22c, 0x2f4, 0x24b, 0x3c, 0x14f, 0x31e, 0x247, 0x7f, 0x24e, 0x10f, 0x309, 0x194, 0xb7, 0x1f2, 0x8a, 0x248, 0x32a, 0x8d, 0x298, 0x10, 0x303, 0x3f2, 0x32, 0xef, 0x163, 0x152, 0x2ab, 0x20a, 0x2de, 0x222, 0x354, 0x36, 0x329, 0x39b, 0x35a, 0x196, 0x1e3, 0x2f8, 0x19, 0xef, 0x2c6, 0x141, 0x175, 0xe8, 0x366, 0x1b2, 0x13a, 0x265, 0x32f, 0x37c, 0x378, 0xfd, 0x30f, 0x36b, 0xd7, 0x3dd, 0x2d0, 0x30d, 0xad, 0x12e, 0x3ef, 0x30e, 0x288, 0x22f, 0x3c4, 0x23f, 0x1cb, 0x1ec, 0x5b, 0x307, 0x68, 0x33a, 0x315, 0x1a1, 0x110, 0x2b7, 0x294, 0xa6, 0x8, 0x303, 0x3ed, 0xc8, 0x371, 0x21d, 0x21a, 0x3ba, 0x349, 0x306, 0x18b, 0x1c2, 0x30c, 0x14e, 0x3d6, 0x3f6, 0x3e1, 0x4e, 0x36e, 0x2b1, 0x2d7, 0x2ad, 0x5e, 0x161, 0x162, 0x347, 0x46, 0x6d, 0x15c, 0x21f, 0x1dc, 0x243, 0x37b, 0x2d8, 0xe, 0x340, 0x1e6, 0x9e, 0x113, 0x92, 0x195, 0x8d, 0x139, 0x40, 0x2e, 0x357, 0x249, 0x3be, 0xcc, 0xf4, 0x1ef, 0x27e, 0x6, 0x43, 0x20b, 0x56, 0x262, 0x28f, 0x38f, 0x337, 0x270, 0x346, 0x1a5, 0x295, 0x145, 0x2f0, 0x31a, 0x302, 0x20e, 0x230, 0x368, 0x2f2, 0x3c6, 0x3f2, 0xc8, 0x2eb, 0x66, 0xf4, 0x3de, 0x1ea, 0x30, 0x39, 0x1f0, 0x1ad, 0x32c, 0x2b2, 0x1e4, 0x2b9, 0x3a8, 0x109, 0xb9, 0x148, 0x323, 0x3fd, 0x187, 0x288, 0x57, 0x30b, 0x1dc, 0x8f, 0x1f7, 0x2ed, 0xe0, 0xca, 0x16e, 0x38b, 0x164, 0x201, 0x126, 0x1d8, 0x38c, 0x224, 0x1cd, 0x35e, 0x152, 0x2be, 0xe8, 0x2c5, 0x2c1, 0x1c2, 0x211, 0x131, 0x28f, 0x317, 0xc7, 0x3a4, 0x5, 0xc5, 0x21, 0x3e8, 0x155, 0x1fe, 0x324, 0xbd, 0x24b, 0xf0, 0xdd, 0x239, 0x310, 0x387, 0x68, 0x27d, 0x4f, 0x113, 0x124, 0x25d, 0x61, 0x3b4, 0x12, 0x392, 0xba, 0x10b, 0x33c, 0x2a5, 0x2b3, 0x222, 0x14b, 0x360, 0x3e2, 0xdf, 0x1bc, 0xfd, 0x217, 0x1b7, 0x2b1, 0x1a7, 0x2a6, 0x2f0, 0x23d, 0x13, 0x54, 0x348, 0x1c3, 0x1d7, 0x2c3, 0x247, 0x1fc, 0xa1, 0x350, 0x3db, 0x12f, 0x11, 0x3d1, 0xa5, 0x53, 0x8, 0x385, 0x3d3, 0x249, 0x2e3, 0xdb, 0x177, 0xa3, 0x1aa, 0xd8, 0x1f1, 0xdf, 0x378, 0x3f4, 0x9c, 0x346, 0x29d, 0x10a, 0x1f4, 0x155, 0x3fc, 0x8b, 0x1e1, 0xf1, 0x23f, 0x325, 0x2ff, 0x2ed, 0x1c0, 0x328, 0x362, 0xce, 0xd3, 0x160, 0x204, 0x3c6, 0x3ed, 0x320, 0x375, 0x269, 0x2bf, 0x255, 0xd5, 0x6c, 0x2fc, 0x26b, 0x1bc, 0x1fa, 0x4e, 0x1a3, 0x34a, 0x85, 0xfa, 0x2ae, 0x1fe, 0x241, 0x2f4, 0x27c, 0x31b, 0x396, 0x37b, 0x372, 0xe0, 0x194, 0x1b1, 0x67, 0x26d, 0xb0, 0x102, 0x1e3, 0x3f2, 0x190, 0x3be, 0x330, 0x35b, 0x32e, 0x26e, 0x36, 0x17e, 0x331, 0xde, 0xfd, 0x27, 0x2d5, 0x1a5, 0x246, 0x7d, 0x157, 0xff, 0x324, 0x17a, 0x13e, 0x389, 0x1cb, 0x3b9, 0x1b9, 0x70, 0xca, 0x2dc, 0x237, 0x332, 0x58, 0x81, 0x2f5, 0x1f9, 0xc8, 0x1df, 0x198, 0x3a9, 0x197, 0x137, 0x1b, 0xbf, 0x39c, 0x6f, 0x303, 0x357, 0x26c, 0x263, 0x356, 0x16f, 0x134, 0x13a, 0x30c, 0x262, 0x55, 0x238, 0x358, 0x359, 0x5a, 0x30d, 0x161, 0x302, 0x54, 0x13b, 0xf, 0x135, 0x239, 0x5b, 0xe, 0x236, 0x16e, 0x237, 0x26d, 0x160, 0x1, 0x303, 0x357, 0x26c, 0x263, 0x356, 0x16f, 0x134, 0x13a, 0x30c, 0x262, 0x55, 0x238, 0x358, 0x359, 0x5a, 0x30d, 0x161, 0x302, 0x54, 0x13b, 0xf, 0x135, 0x239, 0x5b, 0xe, 0x236, 0x16e, 0x237, 0x26d, 0x160, 0x1, 0x303, 0x357, 0x26c, 0x263, 0x356, 0x16f, 0x134, 0x13a, 0x30c, 0x262, 0x55, 0x238, 0x358, 0x359, 0x5a, 0x30d, 0x161, 0x302, 0x54, 0x13b, 0xf, 0x135, 0x239, 0x5b, 0xe, 0x236, 0x16e, 0x237, 0x26d, 0x160, 0x1, 0x303, 0x357, 0x26c, 0x263, 0x356, 0x16f, 0x134, 0x13a, 0x30c, 0x262, 0x55, 0x238, 0x358, 0x359, 0x5a, 0x30d, 0x161, 0x302, 0x54, 0x13b, 0xf, 0x20f, 0x147, 0x344, 0x271, 0x20a, 0x366, 0x316, 0x3e, 0x1ad, 0x156, 0x1f3, 0x36b, 0x16b, 0x246, 0x1f4, 0x15d, 0x3b7, 0x288, 0x2b8, 0x370, 0x397, 0x3f8, 0x202, 0x33a, 0x13c, 0x228, 0x201, 0x122, 0x2f5, 0x3ed, 0x9b, 0x335, 0x356, 0x2de, 0xd9, 0x1c2, 0xac, 0xcb, 0x16d, 0x27f, 0x26f, 0x2d7, 0x28a, 0x2af, 0x1fe, 0x116, 0x313, 0x21f, 0x1ff, 0x319, 0x254, 0x15b, 0x38e, 0x113, 0x132, 0x24d, 0x3b0, 0xbe, 0x64, 0x3be, 0xdb, 0x1d5, 0x222, 0x24a, 0x186, 0x262, 0xaa, 0xf2, 0x2f6, 0x1f5, 0x352, 0x2f0, 0x1cc, 0xc9, 0x17a, 0xf1, 0xee, 0x23c, 0x297, 0x6a, 0x3db, 0x16a, 0x49, 0xb3, 0x219, 0x1c6, 0x82, 0x1de, 0x66, 0x3a9, 0x255, 0x354, 0x2c9, 0x257, 0x343, 0x47, 0xd6, 0x3a8, 0x5a, 0x213, 0x18d, 0x26, 0x149, 0x321, 0x3c0, 0x396, 0x1f7, 0x345, 0x7e, 0x34d, 0x22, 0x167, 0x234, 0x2cb, 0x17, 0x115, 0x216, 0x351, 0x1d0, 0x6, 0x72, 0x277, 0x6f, 0x3f4, 0xe9, 0x14, 0x12c, 0x129, 0x162, 0x2a, 0x276, 0x78, 0x2e1, 0x2ff, 0x345, 0xfc, 0x12f, 0x110, 0x25d, 0x219, 0x38c, 0x208, 0x2eb, 0x269, 0x1d5, 0x4d, 0x13a, 0x2b, 0x261, 0x16d, 0xf7, 0x1ae, 0x295, 0xfa, 0x15d, 0x367, 0x232, 0x1ed, 0x365, 0x21c, 0x3c7, 0x340, 0xb7, 0x67, 0x34c, 0x53, 0x80, 0x392, 0x3b2, 0x152, 0x3ba, 0x1ea, 0x300, 0x17e, 0x1be, 0x3e5, 0x18e, 0x75, 0x212, 0x30d, 0x18d, 0x4c, 0x12d, 0x13e, 0x77, 0x23c, 0x127, 0x1a8, 0x2e7, 0x28d, 0x132, 0x93, 0x2db, 0x1f9, 0x249, 0x335, 0x2a5, 0x36a, 0x2c1, 0x1f, 0x1ad, 0x2ac, 0x3c5, 0x36e, 0x29d, 0x42, 0x1e7, 0x3f3, 0x8c, 0x376, 0x355, 0x18c, 0x5b, 0x38, 0x328, 0x326, 0x3ec, 0x121, 0x1da, 0x90, 0x2e2, 0x2c6, 0x7a, 0x2cf, 0xd5, 0x360, 0x257, 0x28f, 0x2e, 0x5d, 0x94, 0x175, 0x27e, 0x180, 0x17e, 0x37c, 0x38f, 0x6b, 0x359, 0x2d0, 0x2f0, 0x339, 0x8b, 0x22f, 0xdc, 0x397, 0x3fb, 0x68, 0x32b, 0x237, 0x34c, 0xa6, 0x200, 0xaf, 0x35e, 0x21a, 0x363, 0xd5, 0x2c9, 0x14e, 0x55, 0x1e4, 0x39d, 0x2d7, 0x23a, 0x2aa, 0x367, 0x6d, 0x3bd, 0x31e, 0x188, 0xe, 0x194, 0x326, 0x3d1, 0x8d, 0x2cb, 0x112, 0xef, 0xcc, 0x177, 0x222, 0x13a, 0x56, 0x196, 0x37a, 0x36b, 0x1a5, 0x21, 0x1e7, 0x3ef, 0x230, 0x386, 0x135, 0x1ec, 0x2ed, 0x3f, 0x293, 0x110, 0xb3, 0x76, 0x5f, 0xc8, 0x1cf, 0x356, 0x36a, 0x18b, 0x7c, 0x173, 0x29a, 0x4e, 0x206, 0x4b, 0x290, 0x162, 0x54, 0x1ca, 0x3c0, 0x243, 0x34f, 0xd4, 0x2e7, 0x113, 0xc1, 0x91, 0x1e3, 0x357, 0x344, 0x1d6, 0xe8, 0x6, 0xe4, 0x1ce, 0x378, 0x337, 0x11f, 0x109, 0x30d, 0x31a, 0x130, 0x17a, 0x3c4, 0x5c, 0x174, 0xa9, 0x37d, 0x34b, 0xd8, 0x257, 0x22e, 0x1e4, 0x333, 0x34e, 0x1f4, 0x2fa, 0x23, 0x376, 0x14f, 0xf6, 0x2ed, 0x7e, 0x25e, 0x92, 0x322, 0x2db, 0x3ed, 0xd1, 0xeb, 0xe8, 0xc, 0x390, 0x26b, 0x3e5, 0x231, 0x359, 0x1a9, 0x3d2, 0x1fe, 0xa2, 0x179, 0x365, 0x62, 0x7, 0x194, 0x245, 0x35f, 0x61, 0xe3, 0x208, 0x3be, 0x2d1, 0x1b5, 0x18b, 0xf8, 0x1c5, 0xfd, 0xe9, 0x50, 0x2e4, 0x2c2, 0x98, 0x17a, 0x381, 0x3fe, 0x1fc, 0x1a, 0x391, 0x237, 0x291, 0x298, 0x24, 0x2e2, 0x30a, 0x3a9, 0x28c, 0x9d, 0x56, 0x32c, 0x1f3, 0x36e, 0x266, 0x29, 0x12e, 0x15, 0xe5, 0x3c0, 0x8f, 0x127, 0x2a9, 0x223, 0x228, 0x2c, 0x2, 0xb8, 0x2e8, 0x152, 0x2f3, 0x29f, 0x1b0, 0xa7, 0x55, 0x3c8, 0x26f, 0x295, 0x3e8, 0x1fd, 0x46, 0x2e5, 0x29e, 0x1ec, 0x1d3, 0xfc, 0xb5, 0x124, 0x24d, 0x1bf, 0xb8, 0x1d9, 0x141, 0x3b5, 0x1aa, 0x265, 0x19a, 0x2da, 0x36b, 0x29d, 0x210, 0x12e, 0x2a, 0x394, 0x23f, 0xe2, 0xa1, 0x33a, 0x3e4, 0xd3, 0xa6, 0x12, 0x2e2, 0x21d, 0x2bf, 0x4d, 0x1c2, 0x2d2, 0x2a2, 0x4e, 0xa, 0xb9, 0x161, 0x98, 0x2f4, 0x21f, 0x3cf, 0x3ff, 0x340, 0x1b1, 0x1f6, 0x8d, 0x33e, 0x104, 0x3be, 0x1ab, 0x2dd, 0x43, 0x39b, 0xde, 0x337, 0x75, 0xb4, 0x2f0, 0xff, 0xa2, 0x2f2, 0x18f, 0x310, 0x70, 0x2ec, 0x44, 0xb3, 0x1d8, 0x1f9, 0x26c, 0xeb, 0x1d0, 0x30, 0xbf, 0x2f1, 0x47, 0x17b, 0x3b3, 0x23a, 0x2ba, 0x215, 0x376, 0x29e, 0x3d8, 0x345, 0x3e9, 0x342, 0xc1, 0x244, 0x20f, 0x5d, 0x250, 0x37d, 0x29f, 0x360, 0x29c, 0x2a8, 0xf7, 0x16b, 0x21, 0x395, 0x287, 0x13b, 0x1e0, 0x8f, 0x24e, 0x2b6, 0x13c, 0x2c8, 0x189, 0x80, 0xaf, 0x163, 0x1e8, 0x146, 0x9d, 0xac, 0xab, 0x170, 0x36d, 0x21a, 0x32e, 0x125, 0x56, 0xab, 0x30f, 0x206, 0x258, 0x161, 0x130, 0x3c2, 0xdc, 0x87, 0x307, 0x194, 0x106, 0x195, 0x76, 0x2f8, 0x26c, 0x1d6, 0x349, 0x180, 0x3e2, 0x28f, 0x1e4, 0xd7, 0x85, 0x1e7, 0x347, 0x13b, 0x3c0, 0x23c, 0x254, 0x33a, 0x3c1, 0x34c, 0x139, 0x120, 0xef, 0x269, 0x16f, 0x18b, 0x3e0, 0x6f, 0x337, 0xea, 0x2d0, 0x3ad, 0x3eb, 0x6d, 0x1d7, 0x239, 0x2ed, 0x1f8, 0x1a1, 0xc1, 0x81, 0x2e, 0x2e8, 0x141, 0x363, 0x2a1, 0x30c, 0x196, 0x3e6, 0x346, 0x4b, 0xad, 0x26, 0x17a, 0x21f, 0x397, 0x3e7, 0x236, 0x326, 0x2b7, 0x308, 0x5f, 0x249, 0x33c, 0xe8, 0x30, 0x17e, 0x3d6, 0x238, 0x39d, 0x295, 0x3bb, 0x3ef, 0x1a4, 0x78, 0x243, 0x24e, 0x165, 0xf9, 0x26d, 0xa6, 0x24, 0x39a, 0xcc, 0x3aa, 0x1b2, 0x7c, 0x38a, 0x3e1, 0x11f, 0x5a, 0x2f0, 0x1fe, 0x288, 0x3bd, 0x2e0, 0x1af, 0xf4, 0x28c, 0xe1, 0x1ad, 0x13d, 0x1d2, 0x109, 0xbc, 0xff, 0x288, 0x373, 0x318, 0x2ed, 0x3f0, 0x28d, 0x201, 0x2, 0x1c9, 0x35e, 0x1e8, 0x111, 0x1c2, 0x35a, 0x27a, 0x3a4, 0x212, 0x178, 0x1fe, 0x119, 0x2ef, 0x239, 0x1d3, 0x3e9, 0x113, 0xb, 0x4, 0x392, 0x2b5, 0x3d0, 0x222, 0x384, 0x2bd, 0xfd, 0x341, 0x2d, 0x2f0, 0x3fc, 0x232, 0x1d7, 0x7b, 0x3a6, 0x3db, 0x226, 0x16, 0x8, 0x32d, 0x163, 0x3a9, 0x4d, 0x301, 0x173, 0x1fa, 0x28b, 0x5a, 0x1e9, 0x3f1, 0x6d, 0x3ae, 0xf6, 0x345, 0x3bf, 0x45, 0x2c, 0x10, 0x253, 0x2c6, 0x35b, 0x9a, 0x20b, 0x2e6, 0x3f4, 0x11f, 0xb4, 0x3d2, 0x3eb, 0xda, 0x355, 0x1ec, 0x283, 0x377, 0x8a, 0x58, 0x20, 0xaf, 0x185, 0x2bf, 0x134, 0x1f, 0x1c5, 0x3e1, 0x23e, 0x168, 0x3ad, 0x3df, 0x1b4, 0x2a3, 0x3d8, 0x10f, 0x2e7, 0x114, 0xb0, 0x40, 0x1c9, 0x2b5, 0x3a9, 0x9a, 0x1f, 0x38a, 0x39f, 0x1d4, 0x2ad, 0x155, 0x215, 0x386, 0x2e1, 0x297, 0x165, 0x3e4, 0x291, 0x1da, 0x41, 0x375, 0x286, 0x3, 0x25b, 0x3d6, 0xf2, 0x1ae, 0x21, 0x97, 0xa8, 0x27c, 0x3fe, 0x3ff, 0x236, 0x83, 0x32a, 0x3b0, 0x3af, 0x25, 0x3ba, 0x26e, 0xc3, 0x196, 0x383, 0x5, 0x2e4, 0x73, 0x116, 0x2f2, 0x63, 0x1b9, 0x1f8, 0x28d, 0xb, 0x8, 0x253, 0x185, 0x177, 0xd9, 0xf8, 0x6f, 0xc7, 0x2bb, 0x145, 0x2ba, 0x8c, 0xf, 0x325, 0x95, 0x33a, 0x31f, 0xa5, 0x2cb, 0x208, 0x39e, 0x1d, 0x18, 0x2fc, 0x28f, 0x399, 0x16b, 0x108, 0xb1, 0x149, 0x3c4, 0x3cf, 0x3c7, 0x194, 0x11, 0x166, 0x1bf, 0x147, 0x128, 0x1ef, 0x354, 0x211, 0xab, 0x27, 0x28, 0x30d, 0x398, 0xa2, 0x3bd, 0x318, 0x1d3, 0x3db, 0x45, 0x58, 0x40, 0x2bc, 0x33, 0x3aa, 0x2c1, 0x3c9, 0x378, 0x392, 0x2c6, 0x177, 0x1b2, 0x3e0, 0x378, 0x6b, 0x3dd, 0x1f4, 0x3ef, 0x13b, 0x23f, 0x23b, 0x68, 0x362, 0x2b7, 0x76, 0x3ed, 0x216, 0x3ba, 0xd5, 0x30c, 0xab, 0x4e, 0xa0, 0x5e, 0x1fe, 0x6d, 0x2a3, 0x37b, 0xd4, 0x9e, 0x26d, 0x139, 0x112, 0x3be, 0x286, 0x6, 0x17e, 0x28f, 0x33b, 0x1a5, 0x52, 0x302, 0x17a, 0xdc, 0x31, 0x70, 0x293, 0x99, 0x81, 0x170, 0x35e, 0x3a9, 0x134, 0x7c, 0x6f, 0x18e, 0x2fe, 0x23a, 0x3fa, 0x1a4, 0x3c0, 0x1c4, 0xd, 0x16e, 0x3d1, 0x308, 0x2f8, 0x344, 0x175, 0x29f, 0x265, 0x196, 0x30f, 0x14, 0x30d, 0x339, 0x288, 0x1d7, 0x1ec, 0x21e, 0x315, 0x2c8, 0xa6, 0x120, 0x371, 0x356, 0x306, 0x329, 0x3d6, 0x1e4, 0x2b1, 0x108, 0x162, 0x12d, 0x21f, 0x87, 0xe, 0x1d1, 0x92, 0x91, 0x2e, 0x36d, 0xf4, 0x222, 0x20b, 0x38a, 0x337, 0x359, 0x145, 0x17d, 0x230, 0x78, 0x32d, 0x30a, 0x3aa, 0x316, 0xe7, 0x38f, 0x1e5, 0x246, 0x323, 0xa8, 0x1e2, 0x397, 0x207, 0x2ec, 0x92, 0x122, 0xb8, 0x35e, 0x35b, 0xd9, 0x3e0, 0x2f9, 0x1ac, 0x2d7, 0x37f, 0x107, 0x24b, 0x1ff, 0x3f7, 0x194, 0x44, 0x24d, 0x303, 0x1d9, 0x7a, 0x222, 0x1f, 0x233, 0x18e, 0x1f5, 0xfa, 0x3ef, 0x276, 0xee, 0x1fc, 0x289, 0x83, 0xb3, 0x37e, 0x22a, 0x141, 0x255, 0xe1, 0x173, 0x3cb, 0x3a8, 0x145, 0x2fa, 0xd2, 0x3c0, 0x388, 0x34, 0x362, 0x167, 0x1d8, 0x357, 0x128, 0x3b5, 0x125, 0x169, 0x27a, 0x11f, 0x1a9, 0x155, 0x46, 0x1e, 0x11e, 0x284, 0x25f, 0x3ec, 0x308, 0x1f9, 0x10b, 0x3ba, 0x1aa, 0x2b, 0x151, 0xe9, 0x2d, 0x3ad, 0x2c7, 0x1c3, 0x1cb, 0x95, 0xf3, 0x19c, 0x11a, 0x22b, 0x26c, 0x15f, 0x34b, 0x265, 0x32c, 0x27, 0xa0, 0xbc, 0x3f1, 0x368, 0x26a, 0x3a3, 0x165, 0x38b, 0x14a, 0x275, 0x253, 0x33, 0x16f, 0x10c, 0xdf, 0x238, 0x35c, 0x210, 0x302, 0x1e1, 0x1db, 0x5b, 0xfc, 0x226, 0x160, 0x12, 0x1de, 0x356, 0x3, 0x2fc, 0x55, 0x3b1, 0x314, 0x161, 0x241, 0x1ed, 0x239, 0x10f, 0x223, 0x26d, 0xed, 0x104, 0x263, 0x3a0, 0x36, 0x262, 0x1f3, 0x5, 0x30d, 0xff, 0xda, 0x135, 0x3a3, 0x2ca, 0x237, 0x242, 0x311, 0x26c, 0x2be, 0x137, 0x30c, 0x2ac, 0xe9, 0x5a, 0x2af, 0x215, 0xf, 0x11e, 0x101, 0x16e, 0x35f, 0xec, 0x357, 0x250, 0x2cf, 0x13a, 0x2bd, 0x3cb, 0x359, 0x11d, 0x3fd, 0x13b, 0xee, 0x3f8, 0x236, 0x11, 0x322, 0x303, 0x3b2, 0x1e8, 0x134, 0x1f0, 0x2f9, 0x358, 0x34e, 0x3ce, 0x54, 0x1e2, 0x327, 0xe, 0x34d, 0x132, 0x1, 0x253, 0x33, 0x16f, 0x10c, 0xdf, 0x238, 0x35c, 0x210, 0x302, 0x1e1, 0x1db, 0x5b, 0xfc, 0x226, 0x160, 0x12, 0x1de, 0x356, 0x3, 0x2fc, 0x55, 0xaf, 0xcc, 0x36a, 0xe4, 0x3d6, 0x33b, 0x133, 0xad, 0x192, 0x2f2, 0x239, 0x21e, 0x9e, 0x34c, 0x2cb, 0xc8, 0x1d6, 0x3d4, 0x265, 0xab, 0x270, 0x5a, 0x157, 0x46, 0x78, 0x1c4, 0x68, 0x326, 0xb3, 0x1e3, 0x2e8, 0xf4, 0x134, 0x3e0, 0x3f6, 0x2f6, 0x85, 0x12e, 0x12d, 0xdc, 0x188, 0x3f, 0x113, 0x160, 0x24, 0x371, 0x286, 0x30, 0x32f, 0x16d, 0x346, 0x2e4, 0x339, 0x6d, 0x135, 0x34f, 0x33a, 0x19c, 0x61, 0x2f8, 0x216, 0x1ef, 0x125, 0x1ad, 0x3e1, 0x359, 0x23a, 0x3ef, 0x1ca, 0x2fb, 0x3e7, 0xbb, 0x92, 0x81, 0x392, 0x21d, 0x16f, 0x218, 0x37c, 0x1e4, 0x1a5, 0x290, 0x130, 0x15c, 0xc6, 0x345, 0x315, 0x26d, 0x1da, 0x19, 0x33c, 0x27e, 0x2c9, 0x196, 0x4e, 0x109, 0x3ad, 0x30e, 0xf, 0x23c, 0xd, 0x362, 0x195, 0x1bf, 0x5d, 0x21a, 0x222, 0x7c, 0x378, 0x358, 0x295, 0x323, 0x2a0, 0x21f, 0x15e, 0x330, 0x366, 0x25b, 0x22e, 0x36b, 0x96, 0x73, 0x288, 0x14f, 0x3a3, 0x33a, 0x338, 0x184, 0x3ed, 0x128, 0x197, 0x1c2, 0x31d, 0x231, 0x2d7, 0x3ce, 0x150, 0x21f, 0x62, 0x21b, 0x113, 0x2c0, 0x90, 0x3be, 0x3a, 0x209, 0x262, 0x3c5, 0x50, 0x2f0, 0x2c7, 0x203, 0x23c, 0x1a, 0x193, 0xb3, 0x3c6, 0x3b2, 0x3a9, 0x364, 0xe7, 0x47, 0x1ae, 0x29, 0x26, 0x57, 0x63, 0x345, 0x223, 0x1a6, 0x2cb, 0x190, 0x351, 0x29f, 0x211, 0x14d, 0x11f, 0x153, 0x1fd, 0x13b, 0x3b8, 0x3f7, 0xbb, 0x124, 0x204, 0xaf, 0x198, 0x1b3, 0x329, 0x117, 0x3b1, 0x4b, 0x23d, 0x144, 0x2a3, 0x3d5, 0x19d, 0x19c, 0xc2, 0x3f2, 0x94, 0x2cf, 0xe1, 0x38a, 0x31c, 0x36f, 0x1e7, 0xa8, 0x30b, 0x31, 0x309, 0x28d, 0x160, 0x48, 0x1df, 0x1d, 0x300, 0x131, 0x3e6, 0x28, 0x178, 0x367, 0x305, 0x11e, 0xd, 0x2cd, 0x25d, 0x1e3, 0x2bc, 0xdb, 0x306, 0x1f1, 0x159, 0x346, 0x382, 0x3fc, 0x376, 0x325, 0x101, 0x362, 0x25d, 0x3c6, 0x36d, 0x2bf, 0x316, 0x26b, 0xf2, 0x34a, 0xad, 0x241, 0x373, 0x37b, 0x2b6, 0x67, 0x61, 0x3f2, 0x128, 0x32e, 0x301, 0xde, 0x358, 0x246, 0x25c, 0x17a, 0x3b6, 0x1b9, 0x2e7, 0x332, 0x3b4, 0xc8, 0x351, 0x137, 0x56, 0x27a, 0x1d4, 0x23a, 0x3a7, 0x9f, 0x397, 0x38, 0x16a, 0x2c, 0x12, 0x2eb, 0x1d, 0x209, 0xcd, 0x30f, 0x280, 0x353, 0x46, 0x1e0, 0x7f, 0x236, 0x88, 0x122, 0x392, 0x66, 0x2dd, 0x329, 0x22e, 0x2df, 0x258, 0x398, 0xda, 0x1ba, 0x12a, 0x25f, 0x2b7, 0x2db, 0xba, 0xf4, 0xd9, 0x277, 0x47, 0x35c, 0xa4, 0x130, 0x179, 0x7b, 0xd4, 0x3e4, 0x121, 0x5f, 0x10b, 0x3de, 0x13a, 0x1c5, 0x31c, 0x2d7, 0x395, 0x149, 0xdc, 0x229, 0x3f0, 0x59, 0x298, 0x104, 0x33c, 0x1ea, 0xc3, 0x151, 0x171, 0x36c, 0x6, 0x32f, 0x37a, 0x14, 0x2f0, 0x30e, 0x78, 0x23b, 0x236, 0x110, 0x81, 0xaf, 0x269, 0x306, 0x3e2, 0x16d, 0x206, 0x5e, 0x367, 0xf, 0x1c4, 0x340, 0x22, 0x91, 0x392, 0xcc, 0x366, 0x17e, 0x2a8, 0x346, 0x30d, 0x3eb, 0x386, 0x23c, 0x68, 0x106, 0x93, 0x170, 0x21d, 0x36a, 0x329, 0x55, 0x36e, 0x2e4, 0x1fe, 0x376, 0x243, 0xd, 0x326, 0x191, 0x2e, 0x2c6, 0x16f, 0xe4, 0x28f, 0x36b, 0x258, 0x339, 0x368, 0x1cb, 0x284, 0x362, 0xb3, 0x303, 0x35e, 0x3aa, 0x218, 0x3d6, 0x1ee, 0x4b, 0xe6, 0x6d, 0x1ba, 0x254, 0x16e, 0x195, 0x1e3, 0x36d, 0x177, 0x43, 0x37c, 0x33b, 0x18a, 0x31a, 0x288, 0x135, 0x24e, 0x32b, 0x2b7, 0x1bf, 0x2e8, 0x3a9, 0x18b, 0x26b, 0x1e4, 0x133, 0x161, 0x51, 0x2a3, 0x34f, 0x1e6, 0x3d1, 0x3b0, 0x5d, 0xf4, 0x1b2, 0x1ce, 0x238, 0x1a5, 0xad, 0x8b, 0x1d7, 0x2e2, 0x1ab, 0x30, 0x29c, 0x383, 0x109, 0x2ae, 0xd2, 0x1dc, 0x3c7, 0x34d, 0x201, 0x9, 0x1df, 0xe8, 0x1b0, 0x251, 0x3a4, 0x153, 0x3f3, 0x24b, 0x327, 0x1c0, 0x113, 0x22d, 0x41, 0x33c, 0x3a1, 0x2b, 0xfd, 0x2bb, 0x3d9, 0x54, 0x37, 0x229, 0x3db, 0x199, 0x361, 0x249, 0x2ea, 0x296, 0x173, 0x31c, 0x34e, 0x12e, 0x2f4, 0x18f, 0x345, 0x13c, 0x14a, 0x5f, 0x25, 0x197, 0x20b, 0x2f9, 0x3ca, 0x108, 0x4c, 0x179, 0x1ec, 0x15b, 0xce, 0x308, 0x2a7, 0x10d, 0x134, 0x277, 0x11c, 0x1a5, 0x15a, 0x22c, 0x2a3, 0x297, 0x391, 0x2b7, 0x37e, 0x3b2, 0x177, 0x86, 0x1eb, 0x1ee, 0x96, 0x398, 0x368, 0x396, 0x202, 0x326, 0x322, 0xb8, 0x21d, 0x2dd, 0xbf, 0x2a8, 0x285, 0x2f, 0x367, 0x1e, 0x319, 0x236, 0x220, 0x204, 0x171, 0x2d1, 0x18, 0x14e, 0x3c5, 0x280, 0x157, 0x69, 0xee, 0x3e7, 0x3a2, 0x304, 0x200, 0x1cd, 0x2a5, 0x180, 0x19a, 0x9c, 0x2d0, 0x1fd, 0x394, 0x397, 0x1c0, 0x226, 0xa6, 0x208, 0x3ac, 0xd5, 0x2d2, 0x267, 0x2d7, 0x97, 0x2f4, 0x31e, 0x10f, 0x1f2, 0x8d, 0x3f2, 0x152, 0x222, 0x39b, 0x8e, 0x1a5, 0x2b4, 0xa2, 0x135, 0x12a, 0x2dc, 0xb3, 0x17, 0x185, 0x36a, 0xbf, 0x159, 0x206, 0x178, 0x215, 0x3c0, 0x3f9, 0x176, 0xc1, 0x100, 0x2eb, 0xe8, 0x360, 0x156, 0x11f, 0x11d, 0x287, 0x3c4, 0xc4, 0x3f0, 0x2c8, 0x361, 0x9b, 0x3ba, 0x9d, 0x31d, 0x358, 0x214, 0x20d, 0x15c, 0xf6, 0x15b, 0x19c, 0x3b, 0x115, 0xf4, 0x2c1, 0xdf, 0x33b, 0x221, 0x1cc, 0x368, 0x325, 0x1a, 0x106, 0x24c, 0x32d, 0x269, 0x3, 0x257, 0x3e6, 0x280, 0x2ae, 0x1a4, 0x379, 0x207, 0xb5, 0xb0, 0x240, 0x263, 0x1ea, 0x211, 0xfd, 0x17f, 0x37f, 0x2a0, 0x370, 0x1b9, 0x315, 0x12b, 0x311, 0x216, 0x197, 0x1f, 0x3f6, 0x39a, 0x286, 0x1b, 0x196, 0x3a4, 0x145, 0x347, 0x3c4, 0x188, 0x3db, 0x26d, 0x275, 0x344, 0x363, 0x20b, 0x3f6, 0xd7, 0x290, 0x8b, 0x2a3, 0x24e, 0x16e, 0xb3, 0x2e, 0x21d, 0x366, 0x3e2, 0x37a, 0xa0, 0x157, 0x1a4, 0x2fb, 0xe, 0x1a1, 0x312, 0x82, 0x1d6, 0xd5, 0x1ad, 0x18e, 0x295, 0x162, 0x22f, 0x239, 0x2a9, 0x19c, 0x76, 0x5d, 0x3a9, 0x43, 0x3d6, 0x36b, 0x2e4, 0x3eb, 0xf, 0x23b, 0x194, 0x99, 0x40, 0x371, 0xe8, 0x2c9, 0x151, 0xea, 0x1f4, 0x54, 0xdc, 0x2d8, 0x315, 0x256, 0x5f, 0x94, 0x146, 0x3e0, 0x47, 0x1a5, 0x161, 0x288, 0x1ba, 0x284, 0x326, 0x93, 0x392, 0x269, 0x6, 0x14e, 0x30f, 0x5a, 0x17d, 0x1ca, 0x397, 0x380, 0x8a, 0x139, 0xc8, 0x175, 0x125, 0x38a, 0x358, 0x21, 0x26, 0x2f2, 0x37b, 0x33a, 0x3d1, 0x1bf, 0x36d, 0x3aa, 0xe4, 0x55, 0x346, 0x5e, 0x30e, 0x3c0, 0x33d, 0x20a, 0xd8, 0x156, 0x75, 0x1f4, 0xa8, 0x370, 0x2ed, 0x13c, 0x242, 0x3ed, 0x282, 0xd9, 0x26b, 0x27f, 0x12c, 0x1fe, 0x305, 0x319, 0x194, 0x132, 0x100, 0x3be, 0x29b, 0x186, 0xfd, 0x1f5, 0x395, 0x17a, 0x235, 0x6a, 0x237, 0x219, 0x22a, 0x3a9, 0x86, 0x343, 0x36e, 0x213, 0x187, 0x3c0, 0x3ff, 0x34d, 0x2c, 0x240, 0x19e, 0x29f, 0x169, 0xc7, 0x295, 0x2c4, 0xae, 0x1ec, 0x2ca, 0x3ec, 0x1bf, 0x2d3, 0x2b3, 0x329, 0x159, 0xa, 0x3ad, 0x69, 0x379, 0xe, 0x342, 0x53, 0x19, 0x15f, 0x296, 0x38a, 0x2b9, 0x84, 0x130, 0x373, 0x3a3, 0x32b, 0x32a, 0x17, 0x21d, 0x2c5, 0x393, 0x3e6, 0x212, 0x2ba, 0x1ca, 0x327, 0x21b, 0x59, 0x3b4, 0x136, 0x1ef, 0x384, 0x1fb, 0xd7, 0x129, 0x22c, 0x135, 0xa1, 0x193, 0x93, 0x32d, 0x1b6, 0x30, 0xcd, 0x138, 0x2ad, 0x3d7, 0x1e2, 0x188, 0x3bf, 0x1a6, 0x38c, 0x273, 0x3a, 0x2c9, 0x14d, 0x2bb, 0x1e7, 0xbd, 0x235, 0xd4, 0xce, 0xec, 0x2e8, 0x1d5, 0x1c8, 0x2a8, 0xa, 0x353, 0x1a4, 0x3fe, 0xe0, 0x8a, 0xed, 0x9b, 0x1ef, 0x301, 0x3e5, 0x2b1, 0x2b4, 0x119, 0x1cb, 0x34, 0x44, 0x1, 0x273, 0x3a, 0x2c9, 0x14d, 0x2bb, 0x1e7, 0xbd, 0x235, 0xd4, 0xce, 0xec, 0x2e8, 0x1d5, 0x1c8, 0x2a8, 0xa, 0x353, 0x1a4, 0x3fe, 0xe0, 0x8a, 0xed, 0x9b, 0x1ef, 0x301, 0x3e5, 0x2b1, 0x2b4, 0x119, 0x1cb, 0x34, 0x44, 0x1, 0x273, 0x3a, 0x2c9, 0x14d, 0x2bb, 0x1e7, 0xbd, 0x235, 0xd4, 0xce, 0xec, 0x2e8, 0x1d5, 0x1c8, 0x2a8, 0xa, 0x353, 0x1a4, 0x3fe, 0xe0, 0x8a, 0xed, 0x9b, 0x1ef, 0x301, 0x3e5, 0x2b1, 0x2b4, 0x119, 0x1cb, 0x34, 0x44, 0x1, 0x273, 0x3a, 0x2c9, 0x14d, 0x2bb, 0x1e7, 0xbd, 0x235, 0xd4, 0xce, 0xec, 0x2e8, 0x1d5, 0x1c8, 0x2a8, 0xef, 0xe8, 0x265, 0xfd, 0x3dd, 0x12e, 0x22f, 0x1ec, 0x33a, 0x2b7, 0x303, 0x21d, 0x306, 0x14e, 0x4e, 0x2ad, 0x347, 0x21f, 0x2d8, 0x9e, 0x8d, 0x357, 0xf4, 0x43, 0x28f, 0x346, 0x2f0, 0x230, 0x2fb, 0x70, 0x8a, 0x1da, 0x26c, 0x363, 0x7c, 0x47, 0x133, 0xe6, 0x376, 0x1c4, 0x194, 0xc1, 0x24, 0x263, 0x29f, 0x1ad, 0x6b, 0x21, 0x130, 0x1d7, 0x24e, 0x362, 0x93, 0xaf, 0x356, 0x1b, 0xab, 0xea, 0x3bb, 0x12d, 0x31e, 0xd4, 0x19c, 0x3b0, 0x36d, 0x16f, 0x17e, 0x37a, 0x109, 0x17d, 0x24b, 0x31, 0x3db, 0x34c, 0x5f, 0xa9, 0x134, 0x26b, 0x1ee, 0x2e4, 0x367, 0x3c0, 0x3e7, 0xb5, 0x312, 0x19, 0x175, 0x13a, 0x378, 0xd7, 0xad, 0x288, 0x1cb, 0x68, 0x110, 0x8, 0x371, 0x349, 0x30c, 0x3e1, 0x2d7, 0x162, 0x15c, 0x37b, 0x1e6, 0x195, 0x2e, 0xcc, 0x6, 0x262, 0x270, 0x145, 0x20e, 0xdc, 0x1de, 0x3a0, 0x30c, 0x3cb, 0x34e, 0x302, 0x1ed, 0x3a3, 0x16e, 0x322, 0x253, 0x356, 0x36, 0x2ac, 0x359, 0x3ce, 0x1e1, 0x239, 0x2ca, 0x35f, 0x303, 0x33, 0x3, 0x262, 0xe9, 0x11d, 0x54, 0x1db, 0x10f, 0x237, 0xec, 0x3b2, 0x16f, 0x2fc, 0x1f3, 0x5a, 0x3fd, 0x1e2, 0x5b, 0x223, 0x242, 0x357, 0x1e8, 0x10c, 0x55, 0x5, 0x2af, 0x13b, 0x327, 0xfc, 0x26d, 0x311, 0x250, 0x134, 0xdf, 0x3b1, 0x30d, 0x215, 0xee, 0xe, 0x226, 0xed, 0x26c, 0x2cf, 0x1f0, 0x238, 0x314, 0xff, 0xf, 0x3f8, 0x34d, 0x160, 0x104, 0x2be, 0x13a, 0x2f9, 0x35c, 0x161, 0xda, 0x11e, 0x236, 0x132, 0x12, 0x263, 0x137, 0x2bd, 0x358, 0x210, 0x241, 0x135, 0x101, 0x11, 0x1, 0x1de, 0x3a0, 0x30c, 0x3cb, 0x34e, 0x302, 0x1ed, 0x3a3, 0x16e, 0x322, 0x253, 0x356, 0x36, 0x2ac, 0x359, 0x3ce, 0x1e1, 0x239, 0x2ca, 0x35f, 0x303, 0x3bc, 0x29b, 0x56, 0xc7, 0x10a, 0x130, 0x355, 0xa1, 0x106, 0x204, 0x1de, 0x349, 0x2b, 0x267, 0x85, 0x98, 0x3ae, 0x254, 0x83, 0x102, 0xef, 0x3a0, 0x211, 0x337, 0x246, 0x4c, 0x1d7, 0x12a, 0x245, 0x81, 0x273, 0x1d0, 0x30c, 0x39f, 0x123, 0x26, 0x2ef, 0x95, 0x326, 0x244, 0x33d, 0xe8, 0x186, 0x3cb, 0x295, 0x13, 0x373, 0x24e, 0x193, 0x122, 0x39a, 0x74, 0xc3, 0x3e1, 0x34e, 0x20d, 0x3bd, 0x127, 0x2cd, 0x91, 0x1cd, 0x3a, 0x265, 0x3f4, 0x1a7, 0x302, 0x3da, 0x297, 0x362, 0x24c, 0x2e2, 0x1d, 0x336, 0x1fa, 0x2d7, 0x181, 0x1ed, 0x34f, 0x1b1, 0x126, 0x171, 0x20a, 0x19b, 0xfd, 0x36f, 0x2c4, 0x2f2, 0x3a3, 0x2dc, 0x93, 0x2bc, 0x105, 0x2c9, 0x27a, 0x3b3, 0x162, 0x179, 0x3d5, 0x16e, 0x24d, 0x15e, 0x286, 0x360, 0x13d, 0x3dd, 0xb1, 0x2b8, 0x3ee, 0xb7, 0x322, 0xaf, 0x143, 0x1b0, 0x29a, 0x371, 0x27e, 0x2b0, 0x6b, 0x108, 0x8b, 0x1ba, 0x68, 0x92, 0x200, 0x263, 0xd5, 0x38a, 0x39d, 0xad, 0x6d, 0x23c, 0x194, 0x201, 0x112, 0x2ab, 0x13a, 0x3f6, 0x1a5, 0xe6, 0x386, 0x1fc, 0x293, 0x312, 0xc8, 0x1ef, 0x7c, 0x238, 0x4b, 0x3eb, 0x3c0, 0x307, 0x113, 0x1da, 0x344, 0x146, 0x1ce, 0x1ee, 0x30d, 0x46, 0x2fb, 0x380, 0x2c8, 0x38c, 0xa9, 0x1b2, 0x3d6, 0x346, 0x3ad, 0x13b, 0x87, 0x3db, 0x256, 0x3ed, 0xf4, 0x218, 0x2a8, 0xa0, 0x17d, 0x27c, 0x5b, 0x9e, 0x61, 0x5d, 0x3aa, 0x17e, 0x3e6, 0x2d0, 0x347, 0xdc, 0x345, 0x237, 0x3b0, 0x35e, 0x366, 0x14e, 0x270, 0x23a, 0x2a0, 0x31e, 0x2a9, 0x3d1, 0x303, 0xcc, 0x30, 0x196, 0xea, 0x1e7, 0x3c2, 0x1ec, 0x1e6, 0xb3, 0x392, 0x356, 0xd8, 0x29a, 0x3dd, 0x162, 0x2f2, 0x34f, 0x362, 0x91, 0x39a, 0xe8, 0x30c, 0x337, 0x85, 0x130, 0x2a3, 0x2eb, 0x1ea, 0x1ad, 0x2b9, 0x148, 0x288, 0x8f, 0xca, 0x201, 0x224, 0x2be, 0x1c2, 0x317, 0xc5, 0x1fe, 0xf0, 0x387, 0x113, 0x3b4, 0x10b, 0x222, 0xdf, 0x1b7, 0x2f0, 0x348, 0x247, 0x3db, 0xa5, 0x3af, 0x3a9, 0x1c8, 0x1bd, 0x5a, 0x3d7, 0x6e, 0x345, 0x67, 0x2db, 0x2c6, 0x205, 0x19a, 0x11f, 0x37f, 0x1e1, 0x1ec, 0x3cc, 0x2cc, 0xaf, 0x105, 0x336, 0x3e1, 0x123, 0x98, 0x2a3, 0x101, 0x88, 0x40, 0x39e, 0x26e, 0x38a, 0x333, 0x2b4, 0x368, 0x388, 0x2ec, 0x160, 0x32, 0x2f3, 0x7c, 0x79, 0x12c, 0x367, 0x77, 0x38, 0x59, 0xe3, 0x250, 0x1b2, 0x3a5, 0x103, 0x157, 0x394, 0xc4, 0x315, 0x11a, 0x22a, 0x3aa, 0x2fc, 0x383, 0x2ad, 0x15, 0x3b6, 0xd4, 0x1f6, 0x385, 0xcc, 0x60, 0x251, 0x359, 0x24f, 0xae, 0x3ee, 0x2dc, 0x24c, 0x39a, 0x1d0, 0x2b, 0x18e, 0x42, 0x241, 0x1ba, 0xd0, 0x248, 0x24, 0x1df, 0x3a1, 0x173, 0x3ca, 0x15a, 0x368, 0x319, 0x3a2, 0x312, 0x320, 0x2cf, 0x33f, 0xf7, 0x213, 0x230, 0x3cf, 0x3f0, 0x256, 0x3af, 0x35b, 0x329, 0x1f3, 0x1a9, 0x20e, 0x3b6, 0x1a8, 0x3d1, 0x17, 0xdb, 0x1b, 0x14d, 0x3b3, 0x302, 0x2ef, 0xa1, 0x22, 0x20, 0x39e, 0xd5, 0x233, 0x1ae, 0x31a, 0x1c3, 0x3f8, 0xb5, 0x298, 0xd1, 0x146, 0x331, 0x2df, 0x2f0, 0x299, 0x10e, 0x2e7, 0x242, 0x115, 0x3aa, 0x1f1, 0x217, 0x145, 0x150, 0x235, 0x165, 0x2ce, 0x2e0, 0x356, 0x360, 0x1fa, 0x295, 0x98, 0x14f, 0xd, 0x49, 0x9, 0x33c, 0x296, 0x2f9, 0x1a5, 0x398, 0x1e, 0x3e7, 0x28d, 0x3b4, 0x216, 0x9a, 0x2f1, 0x346, 0x2af, 0x394, 0x188, 0x4f, 0xc2, 0x2e8, 0x1b5, 0x257, 0x270, 0xfa, 0x25a, 0x239, 0xf3, 0x166, 0xaf, 0x20a, 0xc3, 0x337, 0x214, 0x324, 0x1ba, 0x1a0, 0x132, 0x120, 0x351, 0x274, 0x38f, 0x3be, 0x29f, 0x38a, 0xd7, 0x31a, 0x386, 0x3fb, 0x1a1, 0x1da, 0x216, 0x134, 0x3d6, 0x206, 0x2aa, 0x27c, 0x2d8, 0x3c1, 0x3b0, 0x2c6, 0x6, 0x196, 0x359, 0x12e, 0x2f2, 0x24e, 0x106, 0x8, 0x1cf, 0xd5, 0x6f, 0x2b1, 0xe6, 0xf, 0x3e7, 0x113, 0x2cb, 0x94, 0x1b2, 0x28f, 0x14, 0x17d, 0x3c4, 0x2ed, 0x237, 0x1bf, 0x21d, 0x30, 0xab, 0x2fe, 0x162, 0x3bd, 0x254, 0x22, 0x40, 0x263, 0x2a1, 0x378, 0x1a5, 0x339, 0x78, 0x307, 0x8a, 0x275, 0xa9, 0x18b, 0x55, 0xa0, 0x3fa, 0x21f, 0x345, 0x19c, 0x1e3, 0xcc, 0x180, 0x151, 0x3dd, 0x302, 0x1d7, 0x284, 0x110, 0x200, 0x33c, 0x125, 0x3f6, 0x133, 0x1fe, 0x3c0, 0xe, 0x59, 0x38c, 0x141, 0x43, 0x2a8, 0x109, 0x3ef, 0xdc, 0x21e, 0xfb, 0x303, 0x269, 0x1b, 0x29a, 0x2d7, 0x26, 0x2a3, 0xd, 0x92, 0x24, 0x1d6, 0x13a, 0x38f, 0x18a, 0x3eb, 0x23f, 0x375, 0x26e, 0x6f, 0x16b, 0x398, 0x78, 0x207, 0x228, 0x38c, 0x282, 0x10c, 0x16d, 0xb4, 0x107, 0x365, 0x15b, 0x2ce, 0x392, 0x105, 0x186, 0x18e, 0x210, 0x144, 0x23c, 0x176, 0x189, 0x249, 0x255, 0x331, 0x36e, 0x353, 0x321, 0x5b, 0x1f2, 0x1d8, 0x2c6, 0xc, 0x251, 0x2fe, 0x2c4, 0x2ef, 0x284, 0x220, 0x12, 0x1d6, 0x274, 0x227, 0x4b, 0x2c7, 0x379, 0x3f, 0x291, 0x3af, 0x177, 0x2fc, 0x27, 0x23a, 0x25a, 0xf6, 0x32b, 0x126, 0x273, 0x27e, 0x35a, 0x3ca, 0x161, 0x2e5, 0x3f9, 0x1a1, 0x3b4, 0x4a, 0x1b2, 0x117, 0x50, 0x3fa, 0x37, 0x10f, 0xfb, 0x20f, 0x1b6, 0xd8, 0x1fa, 0x246, 0x192, 0x374, 0x11b, 0x201, 0x104, 0x2f3, 0x3e0, 0x27f, 0x2f, 0x1a4, 0x10e, 0x38e, 0x61, 0x1d9, 0x1b3, 0x262, 0x23e, 0x395, 0x15c, 0x297, 0x83, 0x8, 0x39e, 0x354, 0x378, 0x34a, 0xff, 0x3c0, 0x1c, 0x164, 0x5f, 0x2e3, 0x1aa, 0x378, 0x29d, 0x3fc, 0x23f, 0x1c0, 0xd3, 0x3ed, 0x2bf, 0x2fc, 0x4e, 0xfa, 0x2f4, 0x37b, 0x1b1, 0x102, 0x3be, 0x26e, 0xde, 0x1a5, 0xff, 0x389, 0x70, 0x332, 0x1f9, 0x3a9, 0xbf, 0x217, 0x23a, 0xbd, 0x3d8, 0x16e, 0x244, 0x2eb, 0x29f, 0x233, 0x16b, 0x339, 0x1e0, 0x1c, 0x2c8, 0x17c, 0x1e8, 0x329, 0x383, 0x28a, 0x12d, 0xf6, 0x25f, 0x91, 0x3bc, 0x3a1, 0x38a, 0x35c, 0x1cc, 0x78, 0x7, 0xb2, 0x5f, 0x7a, 0x1c8, 0x3e6, 0x2a6, 0x149, 0x239, 0x391, 0x126, 0xef, 0x1ea, 0x2e6, 0xd7, 0x73, 0x1e, 0x307, 0x228, 0x311, 0x21a, 0x72, 0x2fd, 0x2ad, 0x150, 0x18c, 0x1e6, 0x24d, 0x33d, 0x27e, 0x2bd, 0x333, 0x31a, 0x203, 0x3c7, 0x8a, 0x1c6, 0x282, 0x218, 0x1bd, 0x1a9, 0x54, 0x63, 0x27d, 0x191, 0x1cd, 0x29b, 0x1ad, 0x3ca, 0x2c2, 0x386, 0x3f7, 0x226, 0x275, 0x2a4, 0x86, 0x16d, 0x1cf, 0x2a1, 0x3f6, 0x18a, 0x367, 0x2fb, 0x1f8, 0x294, 0x5d, 0x36a, 0x262, 0xea, 0x12e, 0x3bd, 0x284, 0x92, 0x120, 0x175, 0x7c, 0x33b, 0x5e, 0x13b, 0x188, 0xf9, 0x3b0, 0x21d, 0x180, 0x29a, 0x295, 0x192, 0x1cb, 0x194, 0x160, 0x249, 0x146, 0x37c, 0x206, 0x17d, 0x21f, 0x21e, 0x3d1, 0x170, 0x286, 0x30c, 0x6b, 0x290, 0x368, 0x1fc, 0x1a1, 0x2cb, 0xa9, 0x43, 0x16d, 0x2d0, 0x54, 0xc6, 0x1e6, 0x93, 0xef, 0x3d4, 0x38a, 0x2b1, 0x339, 0x3c0, 0x70, 0x26d, 0x3ed, 0x177, 0x3e2, 0x270, 0x3bb, 0x22f, 0x34f, 0x106, 0x40, 0x33c, 0x13a, 0x47, 0x258, 0x46, 0x397, 0x2e7, 0x61, 0x36d, 0x306, 0x196, 0x2fe, 0x302, 0x2a3, 0x68, 0xc1, 0x82, 0x1ef, 0x33f, 0x36b, 0x3ad, 0x24b, 0x2d8, 0x237, 0x1e3, 0x269, 0xd8, 0x3e1, 0x21, 0x51, 0x23c, 0x1d1, 0xa6, 0x344, 0x134, 0x28f, 0xa0, 0x3ef, 0x2e9, 0x39e, 0x296, 0x38f, 0x96, 0x23, 0x397, 0x1c7, 0x184, 0x35e, 0xc, 0x2ac, 0x2d7, 0x260, 0x2e1, 0x194, 0x2c0, 0x136, 0x222, 0x3a5, 0x50, 0x3ef, 0x1db, 0x2b6, 0xb3, 0x2e2, 0x13f, 0x173, 0x1ae, 0x398, 0x3c0, 0xe0, 0x1a6, 0x357, 0x35d, 0xa7, 0x11f, 0x24f, 0x3da, 0x284, 0x124, 0x89, 0x3ba, 0x3c9, 0x3b1, 0x3ad, 0x9f, 0x372, 0x19c, 0x20f, 0x1ab, 0x265, 0x31c, 0x148, 0x368, 0x3f8, 0x28d, 0x275, 0x282, 0x72, 0x3e6, 0x28a, 0xbd, 0x37b, 0x2cd, 0x4, 0x263, 0x24a, 0x227, 0x258, 0x8c, 0x247, 0x315, 0x219, 0x163, 0x30, 0x2a2, 0x34e, 0x192, 0x396, 0x259, 0x312, 0xd1, 0x9a, 0x28f, 0x140, 0x3a7, 0x365, 0x2ca, 0x2cc, 0x39a, 0xf5, 0x1c5, 0x2b1, 0x27b, 0x31b, 0x380, 0x291, 0x147, 0x16f, 0x29c, 0x75, 0x12e, 0x373, 0x202, 0x99, 0x224, 0x2f3, 0x33f, 0x2df, 0x2af, 0x27c, 0x1d3, 0x279, 0x2e, 0x335, 0x24a, 0x47, 0x172, 0x69, 0x31, 0x278, 0x369, 0xcc, 0x6c, 0x3cb, 0x108, 0x232, 0x7f, 0x1a1, 0x33e, 0x282, 0xe4, 0x383, 0x7d, 0x3c2, 0x3a3, 0x20c, 0x200, 0x351, 0x1f, 0x33b, 0x178, 0x394, 0x2d8, 0xce, 0x20f, 0x356, 0x186, 0xd6, 0xad, 0x1c3, 0x3c7, 0x59, 0x17c, 0x35b, 0x3e2, 0x1d2, 0x3ce, 0x2f2, 0x142, 0x124, 0x112, 0x2f3, 0x277, 0x36e, 0x155, 0x381, 0x21e, 0x35f, 0x32d, 0xe8, 0x2d2, 0x333, 0xe6, 0x1e0, 0xe0, 0x34c, 0x147, 0x2de, 0x262, 0x3a8, 0x2c4, 0x2a3, 0x1a0, 0xb, 0xc8, 0xa3, 0x2f1, 0x14, 0x3f3, 0x1db, 0x165, 0x2cc, 0x33d, 0x3d4, 0x233, 0x34a, 0x3eb, 0x379, 0x3f0, 0x8d, 0x3b2, 0x205, 0xab, 0x36f, 0x260, 0x1cb, 0x259, 0x22d, 0x344, 0xd9, 0xaa, 0x5a, 0x2a, 0x18c, 0x32b, 0x244, 0x375, 0x2a1, 0x3c3, 0x96, 0x46, 0x247, 0x223, 0x76, 0x30a, 0x300, 0xfd, 0x263, 0x13a, 0x238, 0x30d, 0x13b, 0x5b, 0x237, 0x303, 0x356, 0x30c, 0x358, 0x161, 0xf, 0xe, 0x26d, 0x357, 0x16f, 0x262, 0x359, 0x302, 0x135, 0x236, 0x160, 0x26c, 0x134, 0x55, 0x5a, 0x54, 0x239, 0x16e, 0x1, 0x263, 0x13a, 0x238, 0x30d, 0x13b, 0x5b, 0x237, 0x303, 0x356, 0x30c, 0x358, 0x161, 0xf, 0xe, 0x26d, 0x357, 0x16f, 0x262, 0x359, 0x302, 0x135, 0x236, 0x160, 0x26c, 0x134, 0x55, 0x5a, 0x54, 0x239, 0x16e, 0x1, 0x263, 0x13a, 0x238, 0x30d, 0x13b, 0x5b, 0x237, 0x303, 0x356, 0x30c, 0x358, 0x161, 0xf, 0xe, 0x26d, 0x357, 0x16f, 0x262, 0x359, 0x302, 0x135, 0x236, 0x160, 0x26c, 0x134, 0x55, 0x5a, 0x54, 0x239, 0x16e, 0x1, 0x263, 0x13a, 0x238, 0x30d, 0x13b, 0x5b, 0x237, 0x303, 0x356, 0x30c, 0x358, 0x161, 0xf, 0xe, 0x26d, 0x357, 0x16f, 0x262, 0x359, 0x302, 0x135, 0xcf, 0xe1, 0x1e4, 0xbc, 0x321, 0x2ed, 0x1f6, 0x1c9, 0xe8, 0x35a, 0x35c, 0x1fe, 0x3b8, 0x3e9, 0x61, 0x2b5, 0xc0, 0xfd, 0x42, 0x232, 0x1fc, 0x226, 0x22b, 0x3a9, 0x3cd, 0x28b, 0x12e, 0x3ae, 0x1a0, 0x2c, 0x9b, 0x9a, 0x55, 0xb4, 0x150, 0x1ec, 0x2cd, 0x20, 0x1d6, 0x1f, 0xf7, 0x3ad, 0xf1, 0x10f, 0x2b7, 0x15e, 0x13f, 0x38a, 0x34a, 0x3b7, 0x3f5, 0x1c7, 0x3b, 0x21d, 0x36, 0x39f, 0x52, 0x2d9, 0x3f7, 0x59, 0x1f9, 0x1d5, 0x14e, 0x1d4, 0x181, 0x135, 0x65, 0x189, 0x344, 0x364, 0x2b2, 0x2ad, 0x25a, 0x1f7, 0x106, 0x9, 0x2be, 0x3e0, 0x2df, 0x155, 0x21f, 0x1a8, 0x25d, 0x39a, 0x3a1, 0x1bc, 0x18a, 0x215, 0x247, 0x9e, 0x369, 0x330, 0x2c9, 0x31c, 0x252, 0x386, 0x207, 0x332, 0x357, 0x2de, 0x19a, 0x2fe, 0x4c, 0x2e1, 0xbb, 0x14c, 0x4a, 0x43, 0x2fd, 0x11d, 0x3c2, 0x297, 0x88, 0x120, 0x19e, 0x384, 0x33b, 0x3d2, 0xf1, 0x21e, 0x2ce, 0x2e2, 0x3d4, 0x1bc, 0x314, 0x46, 0x21c, 0x1f2, 0x1e3, 0x1ab, 0x211, 0x2f6, 0x73, 0x389, 0x3f, 0x242, 0x2d3, 0x30, 0x27a, 0x42, 0x6d, 0x3f9, 0x114, 0x2f8, 0x1d5, 0x29c, 0x359, 0x13, 0x374, 0xbb, 0x298, 0x128, 0x218, 0x383, 0x3e8, 0x15c, 0x142, 0x132, 0x19, 0xa3, 0x3a5, 0x109, 0x2a, 0x7b, 0x362, 0x20, 0x3ac, 0x7c, 0x3b1, 0x2ae, 0x21f, 0x350, 0x166, 0xef, 0x26e, 0x3e5, 0x258, 0xd2, 0x310, 0x237, 0x17, 0x105, 0x2b0, 0x26f, 0x27b, 0x1dc, 0x3e9, 0xc2, 0x2c6, 0x209, 0x3cb, 0x52, 0x1bb, 0x3c7, 0x2c8, 0x3af, 0x2de, 0x334, 0x3ea, 0x260, 0x243, 0x34d, 0x3b4, 0x141, 0x390, 0x9c, 0x1e7, 0x3da, 0x1a, 0x201, 0x320, 0x4d, 0x55, 0x168, 0x149, 0x37b, 0x83, 0x9, 0x175, 0x39b, 0x2d5, 0x17d, 0x370, 0x2ca, 0x93, 0x1df, 0x14b, 0x47, 0x33c, 0x20b, 0x1ee, 0x157, 0x21f, 0x2a9, 0x191, 0x371, 0x2a1, 0x47, 0x30d, 0x1ca, 0x2ed, 0x3d1, 0xaf, 0x27e, 0x6f, 0x18a, 0x46, 0x31, 0x3c1, 0x303, 0x286, 0x2b0, 0xd7, 0x1fe, 0x2fb, 0x2e7, 0x76, 0xcc, 0x2c9, 0x6b, 0x161, 0x78, 0x380, 0x294, 0x36d, 0x30, 0xfd, 0x108, 0x368, 0x3e7, 0x2c8, 0x357, 0x36a, 0x196, 0x2d7, 0x8b, 0x1c4, 0x1a1, 0x38c, 0x3a9, 0x32f, 0xea, 0x302, 0x1ba, 0xbb, 0x139, 0xa9, 0xe4, 0x4e, 0x1e7, 0x3bd, 0x68, 0x2c, 0x26c, 0x1b2, 0x16d, 0x145, 0x3c2, 0x24e, 0x92, 0x82, 0x32e, 0x3d6, 0x109, 0x54, 0x1ec, 0x326, 0x200, 0x175, 0x33f, 0x346, 0x3fa, 0x365, 0x1e6, 0x81, 0x263, 0x1c2, 0x33b, 0x3ad, 0x3c4, 0xd4, 0xb3, 0xef, 0xd5, 0x38f, 0x2e4, 0x13b, 0x2d8, 0xfb, 0x392, 0x349, 0x38a, 0x133, 0x30e, 0x87, 0xf9, 0x1e3, 0x356, 0x56, 0x39d, 0x339, 0x1dc, 0x271, 0x3e, 0x36b, 0x15d, 0x370, 0x33a, 0x122, 0x335, 0x1c2, 0x27f, 0x2af, 0x21f, 0x15b, 0x24d, 0x3be, 0x24a, 0xf2, 0x2f0, 0xf1, 0x6a, 0xb3, 0x1de, 0x354, 0x47, 0x213, 0x321, 0x345, 0x167, 0x1cd, 0x29f, 0x3e5, 0x172, 0x13b, 0x1b9, 0x3ec, 0xaf, 0xf5, 0x1bc, 0x4b, 0x69, 0x229, 0x19c, 0x2e0, 0x3a0, 0x38a, 0x266, 0x23, 0x31, 0x38b, 0x17, 0x1d, 0x35a, 0x2d6, 0x367, 0x327, 0x278, 0x1e3, 0x2a5, 0x158, 0xd7, 0x3fc, 0x3fe, 0x315, 0x369, 0x1b6, 0x30c, 0x1e5, 0x398, 0x1dc, 0x3bf, 0x3b, 0xcc, 0x19b, 0x1ac, 0x31a, 0x389, 0xfc, 0x61, 0x185, 0x6c, 0x18e, 0x15a, 0x3c, 0x380, 0x121, 0x1af, 0x180, 0x3cb, 0x148, 0x386, 0x1c, 0x12b, 0x2e8, 0xc, 0x27a, 0x108, 0x2d9, 0x387, 0x26d, 0x115, 0x183, 0x151, 0x10a, 0x232, 0x3fb, 0xb2, 0x3af, 0x36a, 0x32c, 0x34e, 0x51, 0x7f, 0x45, 0x2f8, 0xeb, 0xf8, 0x36e, 0x1fd, 0x2c3, 0x32b, 0x4, 0x3ac, 0x3e0, 0x1a3, 0x3fd, 0x31e, 0xb7, 0x10, 0x2ab, 0x39b, 0x285, 0x3ef, 0x63, 0x2dc, 0x40, 0x2be, 0x277, 0x206, 0x3a7, 0x18c, 0x362, 0x100, 0x2ea, 0x1ce, 0xa, 0x287, 0x239, 0x193, 0x9, 0x3ba, 0x331, 0x28, 0x20e, 0xf6, 0x245, 0x24, 0x2f3, 0xdf, 0xa0, 0x2a, 0x3d8, 0x106, 0x90, 0x3de, 0x37c, 0x280, 0xa8, 0x37b, 0x11, 0x240, 0x363, 0x1eb, 0x212, 0x2a0, 0x1f7, 0x44, 0x112, 0x197, 0x3a5, 0x5a, 0x292, 0x3d5, 0x110, 0x41, 0x255, 0x28f, 0x168, 0x25a, 0x34f, 0x49, 0x104, 0x146, 0x22e, 0x1a9, 0x17a, 0x127, 0x124, 0x19, 0x111, 0xaa, 0x2ad, 0x1e1, 0x95, 0x99, 0x64, 0x4d, 0x2a8, 0x2a6, 0x38d, 0x254, 0x264, 0x190, 0x134, 0x2b2, 0x28a, 0x22f, 0x142, 0x182, 0x249, 0xd9, 0x2da, 0x23a, 0xae, 0x101, 0x201, 0x136, 0x364, 0x37a, 0x1d6, 0x3e0, 0x346, 0x3ef, 0xc6, 0x362, 0x200, 0x3ba, 0x26b, 0xa0, 0x54, 0x37b, 0x22, 0x112, 0x32e, 0x28f, 0x2d0, 0x17a, 0x24e, 0x99, 0xc8, 0x134, 0x16d, 0x23a, 0x15c, 0xd, 0x2c, 0x344, 0x43, 0x30f, 0x1e7, 0x1d7, 0x236, 0xa6, 0xa9, 0x329, 0x3a4, 0x162, 0x1ba, 0x1d1, 0x2cb, 0xf4, 0x32f, 0x359, 0x130, 0x23c, 0x1a1, 0x5f, 0x3aa, 0x334, 0x2d7, 0x51, 0x1fc, 0x59, 0x357, 0x366, 0x151, 0x21, 0x368, 0x307, 0x34c, 0x2e8, 0x30, 0x3e1, 0x290, 0xf, 0x380, 0x8d, 0x2c6, 0xd8, 0x6b, 0x31a, 0x23f, 0x3db, 0x76, 0x269, 0x30c, 0x39d, 0x1fe, 0x3f5, 0x9e, 0x1e3, 0x286, 0x1ad, 0x1a5, 0x30e, 0x31, 0x237, 0x170, 0x349, 0x6f, 0x4b, 0x1a4, 0x2d8, 0x3d1, 0x171, 0x29f, 0x38f, 0x30d, 0x24b, 0x21e, 0xb3, 0x371, 0x125, 0x1e4, 0x3ad, 0x21f, 0x165, 0x91, 0x263, 0x20b, 0x36b, 0x17d, 0x365, 0x3ac, 0x39b, 0x206, 0x287, 0xf6, 0x106, 0x240, 0x197, 0x28f, 0x1a9, 0x1e1, 0x254, 0x182, 0x136, 0x18b, 0x3c5, 0x2f7, 0x1d7, 0x65, 0x298, 0x141, 0x2fc, 0x75, 0x26, 0x8f, 0x2d4, 0x5f, 0x35d, 0xcb, 0x295, 0x119, 0x3f7, 0x26d, 0xba, 0x18, 0x3e1, 0x129, 0x3c, 0x3f, 0xc2, 0x66, 0x265, 0x1e5, 0xff, 0x3f5, 0x13c, 0x385, 0x1d, 0x2e6, 0xc5, 0x230, 0xb6, 0x3ec, 0x171, 0x137, 0x227, 0x5e, 0xf1, 0x350, 0x93, 0x39e, 0x301, 0x36b, 0x2fa, 0x18f, 0x16e, 0x80, 0x1dd, 0x26b, 0x140, 0x150, 0x3ee, 0x220, 0x208, 0x222, 0x159, 0x11d, 0x15c, 0x1a, 0xb0, 0x216, 0x39, 0x138, 0x12e, 0x26a, 0x2ec, 0x2cb, 0x1e8, 0xa7, 0x2fe, 0x324, 0x319, 0x8a, 0x3d3, 0x1b3, 0x151, 0x42, 0x1bb, 0xe, 0xa5, 0x1af, 0x1b, 0x31c, 0x18d, 0x23f, 0x3bf, 0x1d8, 0x36c, 0xac, 0x35c, 0x367, 0x10e, 0x31f, 0x170, 0x351, 0x277, 0x14, 0x2a, 0x2ff, 0x110, 0x208, 0x4d, 0x16d, 0xfa, 0x1ed, 0x340, 0x53, 0x152, 0x17e, 0x75, 0x4c, 0x23c, 0x28d, 0x1f9, 0x36a, 0x2ac, 0x42, 0x376, 0x38, 0x121, 0x2c6, 0x360, 0x2b9, 0x339, 0x3fe, 0x13c, 0x303, 0x74, 0x31d, 0x4b, 0x299, 0x1d3, 0x195, 0x3bc, 0x24a, 0x33b, 0x155, 0x1db, 0x32b, 0x20, 0x2ea, 0x26b, 0x280, 0x149, 0x34f, 0x248, 0x190, 0x1b2, 0x1f3, 0x37f, 0x1d7, 0xca, 0x272, 0x21a, 0x393, 0x2bb, 0x192, 0x319, 0x114, 0x357, 0x183, 0x13d, 0x52, 0x203, 0x309, 0x61, 0x66, 0xc3, 0x39d, 0x3f1, 0x327, 0x3c1, 0xb8, 0x29b, 0x378, 0x172, 0x394, 0x21e, 0x2cc, 0x375, 0x1c2, 0x3b1, 0x2fa, 0x31e, 0x1b1, 0x9, 0x1ef, 0x1eb, 0xb4, 0x17a, 0x12a, 0x182, 0x26c, 0x225, 0x217, 0x323, 0x29e, 0x176, 0x2cb, 0x3d0, 0x29c, 0x3dd, 0x22c, 0x3f8, 0x2c8, 0x22a, 0xc, 0x3e1, 0x2ab, 0x1ce, 0xa0, 0x2a0, 0x34f, 0x99, 0x249, 0x18b, 0x30f, 0x323, 0x135, 0x1d1, 0x275, 0x177, 0x334, 0x295, 0x6d, 0x307, 0x256, 0x35e, 0xd8, 0x358, 0x339, 0x3f5, 0xf9, 0x2e, 0x349, 0x378, 0x2e4, 0x24b, 0xd4, 0x93, 0x263, 0x7c, 0x346, 0x347, 0x1ec, 0x22, 0x82, 0x222, 0x16d, 0x1f4, 0x3bd, 0x236, 0x139, 0x21a, 0x32f, 0x2fe, 0x8b, 0x1fc, 0x2c8, 0x5d, 0x30, 0x337, 0x161, 0x23f, 0x2e7, 0x1bf, 0x286, 0x173, 0x18a, 0x1a4, 0x2ed, 0x195, 0x371, 0x13a, 0x1ee, 0x17d, 0x31e, 0x362, 0x24, 0x363, 0x28f, 0x2ad, 0x22f, 0xd, 0x160, 0x94, 0x329, 0x11f, 0x26, 0x23c, 0x113, 0x3ed, 0x366, 0x29a, 0x52, 0xf, 0x3f, 0x308, 0x269, 0x56, 0x2b1, 0x30e, 0x188, 0xfb, 0x171, 0xd5, 0x238, 0x3ad, 0xdc, 0x1e6, 0x8, 0x175, 0x26b, 0x109, 0x12d, 0x24e, 0xc1, 0x26c, 0x43, 0x4e, 0x12e, 0x1ba, 0x15f, 0x331, 0x109, 0x25a, 0x12a, 0x201, 0x281, 0x72, 0x3a4, 0x20d, 0x11e, 0x113, 0x3d3, 0x183, 0xfd, 0x129, 0x1e0, 0x3db, 0x369, 0x143, 0x173, 0x314, 0x299, 0x345, 0x166, 0x2e3, 0x20b, 0x2d5, 0x3a7, 0x1ec, 0x44, 0x208, 0x134, 0x2fd, 0x2f7, 0x2a3, 0x176, 0x33e, 0x177, 0x261, 0x246, 0x368, 0x1c, 0x242, 0x21d, 0xc3, 0x26f, 0x367, 0x62, 0x279, 0x171, 0x1aa, 0xf2, 0x157, 0x1db, 0xb7, 0x200, 0x3de, 0x343, 0x2ad, 0x57, 0x34, 0x312, 0x152, 0x1f1, 0x359, 0x324, 0xfe, 0x2c8, 0xba, 0xc0, 0x18e, 0x23d, 0x379, 0x9e, 0x20f, 0x3a0, 0x378, 0x1c1, 0x13e, 0x2a9, 0x122, 0xeb, 0x33f, 0x28, 0x150, 0x34f, 0x132, 0x136, 0x43, 0x9c, 0xb1, 0x1cb, 0x16a, 0x17c, 0x36a, 0x2a2, 0x29, 0xf, 0x7e, 0x3b, 0x36c, 0x169, 0x29d, 0x230, 0x1b9, 0x2ce, 0x371, 0x274, 0x3b1, 0x3fa, 0x18c, 0x83, 0x112, 0x2be, 0xdf, 0x5a, 0x1e1, 0x101, 0x160, 0x250, 0x2fc, 0x359, 0x241, 0x3f8, 0x26d, 0x3b2, 0x36, 0x358, 0xff, 0x327, 0x237, 0x253, 0x137, 0x238, 0x2af, 0x1db, 0x16e, 0x12, 0x2cf, 0x55, 0x11d, 0x1ed, 0x236, 0xed, 0x1e8, 0x262, 0x34e, 0xda, 0xe, 0x242, 0x33, 0x30c, 0x35c, 0x215, 0x5b, 0x35f, 0x1de, 0x13a, 0x3b1, 0x3fd, 0x239, 0x11, 0x104, 0x134, 0x1f3, 0x3ce, 0x135, 0x34d, 0x311, 0x16f, 0x2ac, 0x210, 0xf, 0xfc, 0xec, 0x356, 0x2bd, 0x314, 0x13b, 0x10f, 0x322, 0x263, 0x1f0, 0x5, 0x54, 0x3a3, 0x132, 0x26c, 0x10c, 0xe9, 0x302, 0x11e, 0x226, 0x357, 0x3, 0x3cb, 0x161, 0xee, 0x223, 0x303, 0x3a0, 0x2f9, 0x30d, 0x1e2, 0x2ca, 0x1, 0x2be, 0xdf, 0x5a, 0x1e1, 0x101, 0x160, 0x250, 0x2fc, 0x359, 0x241, 0x3f8, 0x26d, 0x3b2, 0x36, 0x358, 0xff, 0x327, 0x237, 0x253, 0x137, 0x238, 0x175, 0x37c, 0x2d0, 0x22f, 0x68, 0xa6, 0x21a, 0x14e, 0x2d7, 0x6d, 0xe, 0x8d, 0xcc, 0x56, 0x1a5, 0x230, 0x2ed, 0xb3, 0x1cf, 0x7c, 0x206, 0x54, 0x34f, 0xc1, 0x344, 0xe4, 0x11f, 0x130, 0x23b, 0x2c8, 0x2e8, 0x1b, 0x358, 0x1fe, 0x87, 0x19c, 0x171, 0x2a1, 0x33b, 0x17d, 0xc6, 0x106, 0x82, 0x134, 0x3e6, 0x323, 0x1ba, 0xb5, 0x2f8, 0x366, 0xfd, 0xad, 0x23f, 0x315, 0x303, 0x349, 0x3f6, 0x5e, 0x21f, 0x1e6, 0x40, 0x1ef, 0x28f, 0x145, 0x2f2, 0x236, 0x1da, 0x3a9, 0x334, 0x85, 0x376, 0x380, 0x308, 0x36c, 0x1ad, 0x18a, 0x13b, 0x21e, 0x93, 0x33c, 0x33f, 0xa0, 0x12d, 0x254, 0x2c, 0x94, 0x17e, 0x359, 0x8b, 0x3fb, 0x34c, 0x35e, 0x2c9, 0x39d, 0x367, 0x188, 0x3d1, 0xef, 0x13a, 0x36b, 0x3ef, 0x1ec, 0x110, 0xc8, 0x18b, 0x4e, 0x162, 0x243, 0x113, 0x357, 0x6, 0x337, 0x31a, 0x2fb, 0x2ea, 0x1eb, 0x2ad, 0x2b8, 0x11b, 0x1da, 0x35b, 0xcb, 0x21, 0x305, 0xfc, 0x3b0, 0x105, 0x233, 0x2e4, 0xf1, 0x19d, 0x8, 0x37d, 0x343, 0x145, 0x1ed, 0xca, 0x2cb, 0x2ee, 0x251, 0x108, 0x1e, 0x3e9, 0x1bf, 0x3a, 0x1bc, 0x30d, 0x381, 0xf3, 0x40, 0x3de, 0x22e, 0x23a, 0x373, 0x259, 0x275, 0x35d, 0x2ac, 0x52, 0xf0, 0x377, 0x1e3, 0x1d0, 0x1fb, 0x5e, 0x37, 0x391, 0x200, 0x2cf, 0x154, 0x1f4, 0x3ae, 0x2ec, 0x38c, 0x2de, 0x14d, 0x290, 0x389, 0x38e, 0x303, 0x29b, 0x3c3, 0x2f0, 0x1b8, 0xb7, 0x24, 0x255, 0x2b2, 0x3bb, 0x14f, 0x34d, 0x5f, 0x2dd, 0x27a, 0xad, 0x77, 0x4f, 0x2e, 0xf5, 0x227, 0x3ad, 0x1db, 0x1b1, 0x120, 0x28c, 0x1bd, 0x1e7, 0x26a, 0x25e, 0x2f8, 0x2c5, 0x3f4, 0x161, 0x3b8, 0x278, 0x170, 0x3a1, 0x11c, 0x157, 0x2c3, 0x193, 0x112, 0x4d, 0x1f3, 0x323, 0x374, 0x2d4, 0x3ed, 0x1dd, 0x3a5, 0x145, 0x3da, 0x328, 0x275, 0x2b3, 0x2a2, 0x290, 0x31b, 0x223, 0x2e, 0x1ea, 0x8e, 0x157, 0x18f, 0x245, 0x82, 0xd9, 0x217, 0x162, 0x11e, 0x114, 0x5d, 0x209, 0x2b9, 0x3eb, 0xc4, 0x3ab, 0x371, 0x301, 0x285, 0x54, 0x127, 0xb, 0x94, 0x1f1, 0x1f5, 0x288, 0x7, 0x11a, 0x269, 0x2d2, 0x314, 0x1ca, 0x350, 0x102, 0x175, 0x1eb, 0x153, 0x2f2, 0xca, 0x19f, 0x3aa, 0x2ac, 0xa4, 0x3c0, 0x38e, 0x20f, 0x27e, 0x227, 0x353, 0x365, 0x193, 0x224, 0x134, 0x383, 0x25c, 0x243, 0x45, 0x115, 0x180, 0x1ac, 0x3fc, 0x31, 0x3ec, 0x1de, 0x1c2, 0x1a3, 0x15, 0x34f, 0x304, 0x25, 0x17e, 0x17f, 0xa2, 0x307, 0x242, 0x198, 0x2b0, 0xc5, 0x276, 0xd4, 0x244, 0x15f, 0x37c, 0x352, 0x2b8, 0x236, 0x361, 0x2ee, 0xab, 0x29, 0xf0, 0x2e7, 0x385, 0x29b, 0x38f, 0x3d2, 0x1db, 0x362, 0x89, 0x4d, 0x3e6, 0x3ba, 0x28f, 0x23a, 0x1d7, 0x1d1, 0x5f, 0x366, 0x3e1, 0x31a, 0x3f5, 0x237, 0x171, 0x125, 0x36b, 0x347, 0x3ee, 0xc1, 0x216, 0x17e, 0x2fe, 0x288, 0xe, 0x61, 0x36c, 0x173, 0x258, 0x27c, 0x33a, 0x40, 0x363, 0x2a8, 0x3bb, 0x135, 0xb5, 0x3ed, 0x6, 0x18e, 0x339, 0x87, 0xfb, 0xef, 0x1c2, 0x346, 0x54, 0x24e, 0x2c, 0xa9, 0x32f, 0x2d7, 0x368, 0x380, 0x76, 0x286, 0x6f, 0x30d, 0x21f, 0x32b, 0x24, 0x146, 0x37a, 0x323, 0x1cb, 0x113, 0x28e, 0x180, 0x358, 0x3eb, 0x188, 0x2b7, 0x3be, 0x7c, 0x14, 0x12d, 0x284, 0x312, 0x21a, 0x262, 0x85, 0x386, 0x1f8, 0x1bf, 0xe8, 0x3f6, 0x2f0, 0x2e9, 0x362, 0x112, 0x134, 0x30f, 0x162, 0x23c, 0x59, 0x2e8, 0xd8, 0x39d, 0x30e, 0x2d8, 0xb3, 0x263, 0x33f, 0x109, 0x3c2, 0x68, 0x139, 0x3a9, 0x196, 0x108, 0x78, 0x2e7, 0x303, 0x27e, 0x47, 0x157, 0x31e, 0x37d, 0x22e, 0x1f4, 0x14f, 0x25e, 0x3ed, 0xc, 0x231, 0x1fe, 0x62, 0x35f, 0x3be, 0xf8, 0x50, 0x17a, 0x1a, 0x298, 0x3a9, 0x32c, 0x29, 0x3c0, 0x223, 0xb8, 0x29f, 0x3c8, 0x1fd, 0x1ec, 0x124, 0x1a2, 0x329, 0x2bb, 0x144, 0xe, 0xc2, 0x1ab, 0x38a, 0x1c1, 0x30b, 0x32b, 0x48, 0x111, 0x3e6, 0x25c, 0x11e, 0x59, 0x1d9, 0x360, 0xd7, 0x8c, 0x3a6, 0x93, 0x3ac, 0x1be, 0x2ad, 0x1ed, 0x259, 0x38c, 0x2dd, 0x3f4, 0x31a, 0x3e3, 0xce, 0x39a, 0x274, 0x1a3, 0x54, 0x95, 0xb0, 0x141, 0x29c, 0x246, 0x386, 0x3f0, 0x2f5, 0x349, 0x317, 0x2af, 0x31e, 0x20c, 0x64, 0x43, 0x341, 0xc9, 0x3fb, 0xa5, 0x66, 0x2b0, 0x314, 0x321, 0x165, 0x10, 0x3b5, 0x2a8, 0x37f, 0xdd, 0x1a1, 0x2a7, 0xc0, 0x358, 0x3df, 0x229, 0x195, 0x39e, 0x39b, 0x109, 0x38d, 0x1a0, 0x1da, 0x2ee, 0x2ac, 0x290, 0x77, 0x278, 0x392, 0x2f3, 0xaa, 0x3bb, 0xdd, 0x342, 0x28e, 0x209, 0x1e5, 0x30e, 0x372, 0x322, 0x1d6, 0x1be, 0x153, 0x3bd, 0x2ec, 0xbe, 0x306, 0xc7, 0x27b, 0x31, 0x35f, 0x375, 0x3e0, 0x280, 0x38d, 0x340, 0x361, 0x35d, 0x29a, 0x2b4, 0x1ff, 0x237, 0x1cd, 0x274, 0x346, 0x150, 0xa1, 0x312, 0x7a, 0x261, 0x108, 0x1e0, 0x223, 0x170, 0x26e, 0x27f, 0x3ef, 0x1f7, 0x182, 0x94, 0x393, 0x1a7, 0x376, 0xfc, 0x37e, 0x349, 0x227, 0x2ae, 0xc6, 0x88, 0x9b, 0xe4, 0x3a8, 0xa2, 0xe, 0x184, 0x2a5, 0x6f, 0x2f, 0x1b8, 0x362, 0x41, 0x364, 0x270, 0x98, 0x3f8, 0x256, 0x66, 0x169, 0x4b, 0x13e, 0x27d, 0x200, 0xa3, 0x2fd, 0x12e, 0x11e, 0xb2, 0x36d, 0x336, 0x16b, 0x1a4, 0x6a, 0x102, 0x3ba, 0x22e, 0x3e8, 0x135, 0x2d4, 0x2a7, 0x180, 0x17b, 0x2c7, 0x2d8, 0x2cc, 0x271, 0x26b, 0x352, 0x1ed, 0xbb, 0x22b, 0x2c5, 0x337, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x3de, 0x2b2, 0x323, 0x8f, 0x164, 0x35e, 0x211, 0xc5, 0x24b, 0x27d, 0x12, 0x222, 0x217, 0x13, 0x1fc, 0xa5, 0x330, 0x173, 0x1c1, 0x6e, 0x362, 0x104, 0x225, 0x11f, 0x116, 0x7, 0x308, 0x105, 0x1fb, 0x3ad, 0x235, 0x88, 0x26c, 0x25b, 0x3ea, 0x368, 0x7e, 0x2f5, 0x27e, 0x79, 0x1fd, 0x37b, 0x182, 0x250, 0x14e, 0x10a, 0x3c, 0x315, 0x2e0, 0x354, 0x36b, 0x15, 0x12a, 0x312, 0x1e8, 0x251, 0x290, 0x3b8, 0x31f, 0x39a, 0x384, 0xa, 0x17a, 0xd0, 0x361, 0x16f, 0x1fa, 0x73, 0x87, 0x3ab, 0x2e3, 0x33f, 0xb4, 0x179, 0xbb, 0xbe, 0x3, 0x6b, 0x3df, 0x16c, 0x191, 0x3ac, 0x1eb, 0x23a, 0x14f, 0x2d4, 0x28e, 0x36, 0x26f, 0x230, 0x35, 0x204, 0x1ef, 0x159, 0x395, 0x243, 0xb2, 0x1af, 0x30c, 0x266, 0x321, 0x33a, 0x9, 0x111, 0x30f, 0x20d, 0xfe, 0x256, 0x198, 0x2bd, 0x2e4, 0x37, 0x1b1, 0x82, 0x3b5, 0x2da, 0x12e, 0xe2, 0xd3, 0x21d, 0x2d2, 0xb9, 0x21f, 0x1b1, 0x104, 0x43, 0x75, 0xa2, 0x70, 0x1d8, 0x1d0, 0x47, 0x2ba, 0x3d8, 0xc1, 0x250, 0x29c, 0x21, 0x1e0, 0x13c, 0xaf, 0x9d, 0x285, 0x12d, 0x34, 0x3b4, 0x16f, 0x3f4, 0x1cc, 0x31, 0x2ce, 0xcf, 0x26b, 0x2a6, 0x3ae, 0xb5, 0x147, 0x36, 0xd7, 0xd2, 0x1a8, 0x8, 0x197, 0x2fd, 0x162, 0x319, 0x291, 0xcc, 0x2bd, 0x1c1, 0xdc, 0x193, 0x32, 0x218, 0x3a8, 0x119, 0x380, 0x2db, 0x29b, 0x238, 0x1fd, 0x2ff, 0x201, 0x2a4, 0xcd, 0x108, 0x31b, 0x1f2, 0x171, 0xe1, 0x5, 0x17a, 0x1a0, 0x19f, 0x36a, 0x39f, 0x27b, 0x188, 0x25d, 0x271, 0x37c, 0x11d, 0x14f, 0x1a1, 0x22a, 0x1b0, 0x2b1, 0x299, 0x15b, 0x40, 0xa3, 0x3c5, 0x302, 0xfe, 0xa5, 0x269, 0x1c5, 0x213, 0x2e9, 0x83, 0x190, 0xe4, 0x17f, 0xda, 0x3f, 0x2f5, 0xf5, 0x1e4, 0x363, 0x37a, 0x162, 0x23b, 0x256, 0x269, 0x38a, 0x5e, 0x365, 0x22, 0x26c, 0x17e, 0x2d7, 0x386, 0x2e7, 0x170, 0x2a1, 0x36e, 0x2a0, 0xd, 0x1da, 0x16f, 0x3e1, 0x339, 0x188, 0xb3, 0x1d6, 0x3d6, 0x1f4, 0x1ba, 0x8a, 0x36d, 0x30c, 0x18a, 0x27c, 0x32b, 0x112, 0x18b, 0x11f, 0x51, 0x70, 0x3b0, 0x349, 0x238, 0x3fa, 0x3ee, 0x2c, 0x21a, 0x196, 0x290, 0x2fb, 0x19c, 0x371, 0x3e0, 0x5a, 0x2f2, 0x1d1, 0x3ed, 0x180, 0x39d, 0x230, 0xd4, 0x8, 0x32e, 0x3e6, 0x302, 0x1fc, 0x294, 0x36c, 0x6f, 0x2f0, 0x31e, 0x110, 0x344, 0x3e2, 0x295, 0xf, 0x315, 0x392, 0x125, 0x346, 0x12d, 0x68, 0x2cb, 0x36a, 0x337, 0x1fe, 0x5b, 0x191, 0x2ab, 0x28f, 0x3bb, 0x1cb, 0x59, 0x35e, 0x56, 0x4b, 0x3c4, 0x16e, 0x82, 0x43, 0xea, 0x288, 0x380, 0x1bf, 0x27e, 0x1e4, 0x3ef, 0x34f, 0x160, 0xf4, 0xab, 0xad, 0x3f5, 0x2cf, 0x1f3, 0x302, 0x3f8, 0x242, 0x356, 0x2f9, 0x2af, 0x239, 0x132, 0x250, 0x262, 0x210, 0xee, 0x237, 0x1de, 0x1f0, 0x5a, 0x1ed, 0x34d, 0x357, 0x36, 0x35c, 0x13b, 0x2ca, 0x12, 0x134, 0xe9, 0x241, 0xe, 0xec, 0x3a0, 0x238, 0x3fd, 0x3a3, 0x160, 0x1e8, 0x2ac, 0x161, 0x327, 0x35f, 0x263, 0xdf, 0x11d, 0x135, 0x226, 0x3b2, 0x30c, 0x314, 0x1e2, 0x16e, 0x104, 0x10c, 0x359, 0xda, 0xfc, 0x303, 0x137, 0x3b1, 0x54, 0x101, 0xed, 0x16f, 0x3cb, 0xff, 0x5b, 0x322, 0x2be, 0x55, 0x3ce, 0x11e, 0x26d, 0x33, 0x2bd, 0x30d, 0x1db, 0x11, 0x26c, 0x2fc, 0x34e, 0xf, 0x223, 0x253, 0x13a, 0x5, 0x1e1, 0x236, 0x311, 0x3, 0x358, 0x215, 0x10f, 0x1, 0x2cf, 0x1f3, 0x302, 0x3f8, 0x242, 0x356, 0x2f9, 0x2af, 0x239, 0x132, 0x250, 0x262, 0x210, 0xee, 0x237, 0x1de, 0x1f0, 0x5a, 0x1ed, 0x34d, 0x357, 0x197, 0x3c5, 0x26, 0x3f7, 0xc2, 0x1d, 0x227, 0x2fa, 0x3ee, 0xb0, 0x1e8, 0x151, 0x18d, 0x10e, 0x195, 0xeb, 0x3a5, 0x3bb, 0x325, 0x199, 0x21d, 0x2bd, 0x213, 0x365, 0x88, 0x281, 0x32f, 0x214, 0x389, 0x3c1, 0x273, 0xf8, 0x5a, 0x3da, 0x12f, 0x28e, 0x360, 0x34a, 0x24b, 0x391, 0x224, 0x43, 0x3a8, 0xda, 0x1f8, 0x17, 0x1aa, 0x36e, 0x292, 0xd0, 0x275, 0x183, 0xd6, 0x30e, 0x10f, 0x2, 0x32e, 0x383, 0x4c, 0x3e7, 0x184, 0x3a, 0x47, 0x1fd, 0x3d5, 0x160, 0x3d0, 0x2a2, 0x31a, 0x21c, 0x32a, 0x1d6, 0x343, 0x37f, 0x243, 0x332, 0x33, 0x173, 0x2f, 0x2c3, 0x110, 0x10b, 0x257, 0x21, 0x31b, 0x38b, 0xef, 0x1f0, 0xb4, 0x3bd, 0x25e, 0x115, 0x2c9, 0x29d, 0x9f, 0x32b, 0x41, 0x86, 0x359, 0x1b4, 0x3f0, 0x2e, 0x354, 0x2d5, 0x12d, 0x1a0, 0xe3, 0x306, 0x1ac, 0x215, 0x21e, 0x4, 0x255, 0x30f, 0x32e, 0x30f, 0x130, 0x307, 0x76, 0x349, 0x1e4, 0x347, 0x254, 0x139, 0x16f, 0x337, 0x3eb, 0x2ed, 0x81, 0x363, 0x3e6, 0x26, 0x3e7, 0x308, 0xe8, 0x238, 0x3ef, 0x24e, 0xa6, 0x3aa, 0x3e1, 0x1fe, 0x2d8, 0x91, 0x1ef, 0x37a, 0x302, 0x3fb, 0x61, 0x1d, 0x47, 0x3fa, 0x34f, 0x312, 0x177, 0xfd, 0x339, 0x5b, 0x93, 0x3ba, 0x16d, 0x162, 0x1fc, 0x8d, 0x286, 0x38f, 0x17d, 0x3ee, 0x160, 0x3a9, 0x29a, 0xe6, 0x188, 0x191, 0x175, 0x2a8, 0x12e, 0x23b, 0x294, 0x356, 0x3f6, 0x2aa, 0x37b, 0x2c, 0xf4, 0x151, 0x31a, 0x31, 0xb3, 0x2ab, 0x55, 0x323, 0x1c4, 0x256, 0x36c, 0x378, 0x157, 0x1ec, 0x201, 0x21a, 0xab, 0x161, 0x87, 0x195, 0x1d6, 0x28f, 0x1e7, 0x23c, 0x34c, 0x269, 0x6f, 0x3ad, 0x239, 0xc1, 0x141, 0x196, 0xad, 0x397, 0x2b7, 0x33c, 0x3d6, 0x3bb, 0x243, 0x26d, 0xcc, 0x38a, 0x2f0, 0xc6, 0x255, 0x27, 0x192, 0x1c, 0x2db, 0x3d4, 0x3dc, 0x150, 0x68, 0xe3, 0x3, 0x2f6, 0x69, 0x2b6, 0x24, 0x364, 0x75, 0x6d, 0x3f0, 0xb8, 0x125, 0x5, 0x313, 0xbb, 0x3d3, 0x6c, 0x1a5, 0x9f, 0xb7, 0x19, 0x1c8, 0x36f, 0xf, 0x13c, 0x1cd, 0x7c, 0xb4, 0x2ef, 0x1a1, 0x1d9, 0x2b, 0x258, 0x1b8, 0x11, 0x344, 0x257, 0x84, 0x1dc, 0x338, 0x2e3, 0x26b, 0x7d, 0x2e1, 0x2c8, 0x33, 0x1c5, 0x2f0, 0x18c, 0x264, 0x141, 0x32c, 0x2b4, 0x87, 0x32a, 0x351, 0x55, 0x24f, 0x319, 0x294, 0x2a5, 0x3c3, 0x17d, 0x3d5, 0x189, 0x177, 0x1fa, 0xff, 0x2d8, 0x122, 0x3b5, 0x3e6, 0x4c, 0x387, 0x76, 0x29b, 0x399, 0x20e, 0x101, 0x361, 0x366, 0xd6, 0x23, 0xd4, 0x80, 0x9a, 0x3a4, 0xa2, 0x21b, 0x303, 0x1aa, 0x1a3, 0x17a, 0x65, 0x17c, 0x180, 0x1ae, 0xe5, 0x1e6, 0x224, 0x10c, 0x2fe, 0x2e5, 0x38e, 0xaf, 0xa3, 0x9c, 0x8b, 0x1c0, 0x3c6, 0xd5, 0x1a3, 0x2f4, 0x194, 0x3f2, 0x36, 0x1a5, 0x13e, 0x2dc, 0xc8, 0xbf, 0x123, 0x3c0, 0x31f, 0x2eb, 0x1ce, 0x11d, 0x374, 0x2c8, 0x66, 0x31d, 0x3ad, 0xf6, 0xb, 0xf4, 0x14d, 0x1cc, 0x5b, 0x24c, 0x3de, 0x3e6, 0x98, 0x207, 0x3b0, 0x1ea, 0x3dc, 0x2a0, 0x1a0, 0x311, 0x30, 0x26f, 0x276, 0x1e6, 0x41, 0x39, 0x3dd, 0x203, 0x13c, 0x39a, 0x1f0, 0x1a9, 0x2a3, 0x45, 0x2b5, 0x1ad, 0x2f, 0x235, 0x99, 0x2a4, 0x32c, 0x161, 0x21c, 0x166, 0x175, 0x2b2, 0x2c4, 0x3fb, 0x184, 0x1d0, 0x1e4, 0x107, 0x101, 0x2cb, 0x183, 0x2b9, 0x230, 0x2b6, 0x48, 0x18b, 0x3a8, 0x2d9, 0x2e7, 0x253, 0x384, 0x109, 0x3da, 0x16a, 0x2e8, 0x2b, 0xb9, 0x2e9, 0x88, 0x25, 0x262, 0x148, 0x3e3, 0x2b7, 0xeb, 0x117, 0x323, 0x319, 0x121, 0x286, 0x227, 0x3fd, 0x24e, 0x298, 0x2de, 0x18e, 0x146, 0x270, 0x51, 0x3f, 0x2e, 0x125, 0x14, 0x15c, 0x293, 0x5d, 0x30c, 0x258, 0x2e9, 0x110, 0x94, 0x334, 0xad, 0x87, 0xb3, 0x175, 0x16d, 0x302, 0x3e7, 0x76, 0x27e, 0x1ee, 0x2a0, 0x340, 0x5f, 0x180, 0x2b1, 0x24b, 0x16e, 0xc8, 0x17e, 0x85, 0x23f, 0x19c, 0x1cf, 0x37c, 0x3bb, 0x23c, 0x256, 0x356, 0x38f, 0x3fa, 0x24e, 0x139, 0x36a, 0x6b, 0x46, 0x2a9, 0x24, 0x18b, 0x359, 0x376, 0x315, 0x171, 0x7c, 0x2d0, 0x2a3, 0x8a, 0x2c6, 0x173, 0x2f0, 0x239, 0x201, 0xf4, 0x29a, 0x339, 0x2d8, 0x81, 0x32e, 0x4e, 0x8b, 0x380, 0x303, 0x2a1, 0x206, 0x22f, 0x1d1, 0x28e, 0x265, 0x4b, 0xdc, 0x22, 0x216, 0x262, 0x290, 0x397, 0x195, 0x2ab, 0x2a8, 0x162, 0x3fb, 0x308, 0x349, 0x33b, 0x54, 0x68, 0x38c, 0x30, 0xd7, 0x1ca, 0x32b, 0x19, 0x329, 0x295, 0x3c0, 0x237, 0x3be, 0x26b, 0x1f4, 0x243, 0x28c, 0x1d2, 0x288, 0x3f0, 0x1c9, 0x1c2, 0x212, 0x2ef, 0x113, 0x2b5, 0x2bd, 0x2f0, 0x7b, 0x16, 0x3a9, 0x1fa, 0x3f1, 0x345, 0x10, 0x9a, 0x11f, 0xda, 0x377, 0xaf, 0x1f, 0x168, 0x2a3, 0x114, 0x30a, 0x38a, 0x353, 0x3b9, 0x160, 0x2ee, 0x39f, 0x367, 0x35, 0x100, 0x1b2, 0x1d4, 0x1bb, 0x315, 0x2e2, 0x1f0, 0x2ad, 0x26a, 0x164, 0xcc, 0xde, 0x155, 0x3ee, 0x22d, 0x2b3, 0x18e, 0x215, 0x350, 0x24, 0x316, 0x17f, 0x386, 0x13c, 0x273, 0x33f, 0x28a, 0x2e1, 0x26d, 0xdb, 0x1fb, 0x17d, 0x297, 0x298, 0x36a, 0xd6, 0x118, 0x165, 0x240, 0x10c, 0x3dd, 0x1e, 0x3e4, 0x371, 0x39c, 0xfa, 0x243, 0x291, 0x1ab, 0x38f, 0x3fd, 0x12a, 0x1da, 0x2c5, 0x17b, 0x1a4, 0x27d, 0x41, 0xe4, 0x1a7, 0x1e0, 0x237, 0x375, 0x1be, 0x3bb, 0x71, 0x14a, 0x286, 0x8e, 0x3a7, 0x284, 0x19f, 0x3, 0x39d, 0x276, 0x391, 0x19, 0x111, 0x341, 0x6d, 0x377, 0x15e, 0x7c, 0x352, 0x26a, 0x2c8, 0x330, 0x2f9, 0x17d, 0x127, 0x272, 0x366, 0x17b, 0x348, 0x1e6, 0x208, 0x25b, 0x85, 0xee, 0x1f6, 0x33c, 0x22e, 0x25c, 0x3fb, 0x3b, 0xf5, 0x36b, 0xbd, 0x328, 0x357, 0x336, 0x96, 0x2e9, 0x49, 0x152, 0xab, 0x73, 0xb6, 0x81, 0xa3, 0xe9, 0x288, 0x3e9, 0x32d, 0x20b, 0x168, 0x14f, 0x59, 0x66, 0xde, 0x2aa, 0x3a3, 0x14c, 0x36a, 0x1ac, 0x69, 0x33a, 0x41, 0x1c8, 0x295, 0x31b, 0x338, 0x263, 0x343, 0x24f, 0x1fc, 0x184, 0x29b, 0x1ee, 0x292, 0x65, 0x3ed, 0x360, 0x314, 0xdc, 0x88, 0x128, 0x196, 0x18d, 0x310, 0x91, 0x197, 0x9c, 0x51, 0xfc, 0x2e0, 0x1c2, 0x2d, 0x3ae, 0x8a, 0x30a, 0x31d, 0x157, 0x1f7, 0x22d, 0x16f, 0x231, 0x8c, 0x165, 0x89, 0x39, 0x2d7, 0x1e0, 0x67, 0x1cf, 0x1eb, 0x3ce, 0x23b, 0x234, 0x1d0, 0x33b, 0x222, 0x11f, 0x368, 0x315, 0x39a, 0x33f, 0x23a, 0x243, 0x256, 0x286, 0x238, 0x20e, 0x68, 0x5f, 0x1b, 0x133, 0x21f, 0x22, 0x94, 0x196, 0x31a, 0x5b, 0x81, 0x146, 0x3a4, 0x6d, 0x2e7, 0x171, 0x3e0, 0x145, 0x1cb, 0x34c, 0x356, 0x47, 0x347, 0xd, 0x38c, 0x180, 0x1a5, 0x3c4, 0x106, 0x216, 0x334, 0x161, 0x188, 0x91, 0x32e, 0x270, 0x288, 0x3db, 0xaf, 0x7c, 0x2ad, 0x1ba, 0x26d, 0x36c, 0x38f, 0x3ef, 0x284, 0x275, 0x30, 0x2b1, 0x27c, 0x326, 0x344, 0x262, 0xad, 0x31, 0x93, 0x363, 0x4e, 0x51, 0x1f8, 0x392, 0x20b, 0x2d0, 0x135, 0x2c8, 0x269, 0x3f6, 0x3fa, 0x254, 0x2cb, 0x6, 0xd7, 0x24b, 0x362, 0x26c, 0x14e, 0x290, 0x87, 0x191, 0x1ef, 0x30f, 0x8b, 0x3f, 0x170, 0x1c2, 0x5a, 0x2a3, 0x59, 0xcc, 0x378, 0x17d, 0x24e, 0x1da, 0x306, 0x39d, 0x1ca, 0x16e, 0x249, 0x32f, 0x52, 0x397, 0x4d, 0x75, 0x376, 0x13c, 0x3bc, 0x26b, 0x37f, 0x319, 0x61, 0x29b, 0x3b1, 0x17a, 0x176, 0x22a, 0x56, 0x213, 0x318, 0x2c, 0x2ee, 0xc7, 0x46, 0x2ca, 0x41, 0x329, 0x10a, 0x379, 0x2b7, 0x15f, 0x1bd, 0x130, 0xe0, 0x17, 0x13a, 0x212, 0x355, 0x59, 0x198, 0x1fb, 0x3fa, 0xa1, 0x33e, 0x30, 0x16b, 0x1e2, 0x106, 0x25, 0xcb, 0x31a, 0xb6, 0x204, 0x222, 0x23e, 0x1bb, 0x9e, 0x1de, 0x331, 0x3bb, 0x388, 0x234, 0x349, 0x3dc, 0xbd, 0xbb, 0x115, 0x2b, 0x30d, 0x18c, 0x16, 0x177, 0x267, 0x23, 0x165, 0x224, 0x390, 0x85, 0x3b8, 0x35f, 0x2ab, 0x2da, 0x98, 0x70, 0x20f, 0x9d, 0x109, 0x3ae, 0x228, 0xcc, 0x2f9, 0x1fd, 0x254, 0x19f, 0x18, 0x2b1, 0xf1, 0x83, 0x216, 0x261, 0x18d, 0x5b, 0x102, 0x111, 0x11f, 0x2d9, 0x4f, 0xef, 0x39c, 0x3d9, 0x1c4, 0x11a, 0x3a0, 0x1ee, 0x25a, 0x259, 0x28e, 0x9a, 0x1d4, 0x386, 0x3e4, 0x375, 0x3d6, 0x97, 0x3ff, 0x3b0, 0x26e, 0x5, 0x2f2, 0x28d, 0x185, 0x6f, 0x2ba, 0x95, 0x2cb, 0x18, 0x16b, 0x3c4, 0x11, 0x128, 0xab, 0x398, 0x1d3, 0x40, 0x2c1, 0x1f5, 0x78, 0xce, 0xcf, 0x55, 0x181, 0x207, 0x1e3, 0x296, 0x140, 0x1d7, 0x228, 0x198, 0x3f6, 0x3f3, 0x101, 0x38c, 0x209, 0x266, 0xdc, 0x49, 0x282, 0x29a, 0x3f1, 0x35, 0x24, 0x10c, 0x1a7, 0x23f, 0x3ec, 0x3ac, 0x16d, 0x98, 0xe0, 0x2e, 0xe1, 0xb4, 0x135, 0x332, 0x2d1, 0x47, 0x107, 0xd0, 0x2f8, 0x360, 0x96, 0x365, 0x264, 0x1e8, 0x3e1, 0x187, 0x15b, 0x112, 0x390, 0x10a, 0x2fb, 0x2ce, 0x2ea, 0x3e6, 0x241, 0x7e, 0x392, 0x3e, 0x153, 0x1cb, 0x12b, 0x105, 0x1e4, 0x150, 0x65, 0x357, 0x186, 0x1c1, 0xc6, 0x16, 0x2ee, 0x18e, 0x118, 0x27d, 0x19, 0x1f1, 0x210, 0x397, 0x2cc, 0x3de, 0x4e, 0x134, 0x359, 0xf, 0x237, 0x263, 0x55, 0x302, 0xe, 0x303, 0x13a, 0x5a, 0x135, 0x26d, 0x356, 0x238, 0x54, 0x236, 0x357, 0x30c, 0x30d, 0x239, 0x160, 0x16f, 0x358, 0x13b, 0x16e, 0x26c, 0x262, 0x161, 0x5b, 0x1, 0x134, 0x359, 0xf, 0x237, 0x263, 0x55, 0x302, 0xe, 0x303, 0x13a, 0x5a, 0x135, 0x26d, 0x356, 0x238, 0x54, 0x236, 0x357, 0x30c, 0x30d, 0x239, 0x160, 0x16f, 0x358, 0x13b, 0x16e, 0x26c, 0x262, 0x161, 0x5b, 0x1, 0x134, 0x359, 0xf, 0x237, 0x263, 0x55, 0x302, 0xe, 0x303, 0x13a, 0x5a, 0x135, 0x26d, 0x356, 0x238, 0x54, 0x236, 0x357, 0x30c, 0x30d, 0x239, 0x160, 0x16f, 0x358, 0x13b, 0x16e, 0x26c, 0x262, 0x161, 0x5b, 0x1, 0x134, 0x359, 0xf, 0x237, 0x263, 0x55, 0x302, 0xe, 0x303, 0x13a, 0x5a, 0x135, 0x26d, 0x356, 0x238, 0x54, 0x236, 0x357, 0x30c, 0x30d, 0x239, 0x268, 0x17f, 0x78, 0x338, 0xeb, 0x16d, 0x260, 0x21b, 0x392, 0xf8, 0x11d, 0x23c, 0x11a, 0x13f, 0x36e, 0x57, 0x2d4, 0x2c6, 0xde, 0x1fd, 0x284, 0x311, 0x6c, 0x4b, 0x2c3, 0x304, 0x177, 0x31c, 0xd2, 0x32b, 0x9b, 0x131, 0x161, 0xb6, 0x4, 0x1b2, 0x1f5, 0x1e0, 0xfb, 0x3ac, 0x1bd, 0x192, 0x7e, 0x253, 0x3e0, 0x7d, 0xe2, 0x61, 0xf5, 0x1a3, 0x15c, 0x342, 0x30a, 0x378, 0x3fd, 0x202, 0x5f, 0x1b0, 0x12c, 0x31e, 0xb, 0x1d5, 0x6b, 0x348, 0xb7, 0x26c, 0xcd, 0x18d, 0x2d8, 0x10, 0x2c1, 0x3dd, 0x389, 0x3ec, 0x2ab, 0x2fd, 0x241, 0x1f8, 0x15e, 0x39b, 0x1f4, 0x388, 0x184, 0x3d4, 0x285, 0x179, 0x113, 0x33, 0x1fb, 0x3ef, 0x1a, 0x17c, 0x2c9, 0xb9, 0x63, 0x2c, 0x35d, 0x1ac, 0x13b, 0x2dc, 0x1a2, 0x334, 0x23d, 0x372, 0x40, 0x316, 0x36f, 0x23f, 0x3ab, 0x2be, 0x3e6, 0x116, 0x3e9, 0x171, 0xd9, 0x1f5, 0x3c0, 0x3ec, 0x15f, 0x3e6, 0x22c, 0x3bf, 0x39a, 0x331, 0x3ce, 0x3fb, 0x2db, 0x14b, 0x109, 0x29e, 0xd3, 0x286, 0x399, 0x25a, 0x1d1, 0x3b2, 0x2e6, 0x2aa, 0x12a, 0xe3, 0x1b, 0x221, 0x2c3, 0x201, 0x1d5, 0xd6, 0x13b, 0x1b1, 0x281, 0x196, 0x398, 0x283, 0x24, 0x72, 0x10a, 0x3f5, 0x2cc, 0x2cf, 0x3a4, 0x1bb, 0x1f2, 0x1cf, 0x22e, 0x20d, 0x70, 0xb8, 0x1f, 0x145, 0x11e, 0x11a, 0x27e, 0x1a3, 0x2b8, 0x113, 0x66, 0x3e5, 0x347, 0x1a0, 0x3d3, 0x30c, 0x2f, 0x3d8, 0xa6, 0x183, 0x1ae, 0x3c4, 0x88, 0x282, 0xfd, 0x187, 0x2ca, 0x19, 0x393, 0x129, 0x188, 0x204, 0x268, 0x2fe, 0x1e0, 0x1f6, 0x2ab, 0x1f3, 0x116, 0x3db, 0x1cd, 0x39c, 0x1e7, 0x3f9, 0x369, 0x2a1, 0x280, 0x14f, 0x26d, 0x143, 0x3c8, 0x12d, 0x2ec, 0x1d9, 0x173, 0x155, 0x95, 0x275, 0x209, 0x314, 0x365, 0x304, 0x2ee, 0x6b, 0x1b2, 0x3dd, 0x23f, 0x2b7, 0x3ba, 0x4e, 0x6d, 0x9e, 0x3be, 0x28f, 0x302, 0x70, 0x170, 0x7c, 0x23a, 0x1c4, 0x308, 0x29f, 0x14, 0x1d7, 0x2c8, 0x356, 0x1e4, 0x12d, 0x1d1, 0x36d, 0x38a, 0x17d, 0x284, 0x5f, 0x2c9, 0x2e4, 0x239, 0x312, 0x366, 0xd7, 0x3c4, 0x110, 0x21a, 0x3e1, 0x46, 0x1e6, 0x249, 0x262, 0x31a, 0x2ed, 0x200, 0x218, 0x85, 0x3f5, 0x191, 0x32e, 0x11f, 0x386, 0x237, 0x33c, 0x16d, 0x192, 0x1f8, 0x171, 0x1ce, 0x1e7, 0x3fb, 0x1bf, 0x125, 0x5a, 0x1ba, 0x256, 0xe8, 0x36b, 0x22f, 0x1a1, 0x21d, 0x3f6, 0x347, 0x340, 0x357, 0x56, 0x2f0, 0x3ee, 0x1da, 0x30, 0x133, 0x2e9, 0xc1, 0x177, 0x6b, 0x13b, 0x362, 0x216, 0xab, 0x1fe, 0xd4, 0x112, 0x17e, 0x52, 0x31, 0x81, 0x134, 0x2fe, 0x3c0, 0x3d1, 0x175, 0x30f, 0x288, 0x315, 0x371, 0x3d6, 0x162, 0xe, 0x2e, 0x20b, 0x145, 0x23c, 0x364, 0x36f, 0x1dc, 0x32a, 0x3b5, 0x3a4, 0x2e5, 0x31f, 0x33c, 0x2da, 0x241, 0x3db, 0x33d, 0x1be, 0x12e, 0x207, 0x17, 0x20b, 0x28a, 0xe2, 0x308, 0x137, 0x50, 0x2a3, 0xd3, 0x20a, 0x1ee, 0x38d, 0x2d4, 0x21d, 0x3e5, 0x107, 0x236, 0x115, 0x2d2, 0x157, 0x95, 0x1c6, 0xd8, 0xb9, 0x318, 0x312, 0x2c5, 0x35c, 0x21f, 0x124, 0x3d0, 0x18e, 0x348, 0x1b1, 0x216, 0x156, 0x3f1, 0x2a9, 0x104, 0x393, 0xad, 0xb6, 0x20, 0x43, 0x123, 0x3fe, 0x191, 0x255, 0x75, 0xf, 0x338, 0x351, 0x3e6, 0xa2, 0x38e, 0x371, 0x3a5, 0x181, 0x70, 0x2e0, 0x1f0, 0x1f4, 0x7f, 0x1d8, 0x2a1, 0x212, 0xdd, 0x256, 0x1d0, 0x1b7, 0x15c, 0x226, 0x330, 0x47, 0xa8, 0x259, 0x2e8, 0x2e6, 0x2ba, 0x284, 0xbe, 0x336, 0x30d, 0x3d8, 0x298, 0x6, 0x34a, 0x370, 0xc1, 0x2ee, 0x1ac, 0x1ca, 0x245, 0x250, 0x29a, 0x2c7, 0x19d, 0xc8, 0x2c1, 0x1a7, 0x2fb, 0x2cc, 0x255, 0xea, 0x3c, 0x1f6, 0x175, 0x27, 0xda, 0xf9, 0x335, 0x159, 0x192, 0x3e9, 0x33d, 0x37c, 0xb1, 0x1c, 0x170, 0x1f0, 0x3e8, 0x1fc, 0x2db, 0x24a, 0x2d0, 0x325, 0x11a, 0x3d4, 0xa, 0x3ae, 0x26d, 0x20a, 0x3dc, 0x22f, 0x28d, 0x198, 0x47, 0x150, 0x176, 0x36d, 0x233, 0x3fd, 0x68, 0x3af, 0xac, 0x3ad, 0x127, 0xe3, 0xd8, 0x172, 0x7b, 0xa6, 0x3, 0x34a, 0x2e9, 0x304, 0x35d, 0x2f6, 0x13e, 0x44, 0x21a, 0x39f, 0x69, 0x16e, 0x10b, 0x156, 0x3eb, 0x2b6, 0x32, 0x14e, 0x18d, 0x1d3, 0x24, 0x390, 0x210, 0x31, 0x204, 0x364, 0x2d7, 0x379, 0x166, 0x32e, 0x75, 0x1e, 0xfb, 0x2be, 0x217, 0x6d, 0x278, 0x39e, 0x2a8, 0xc9, 0x3f0, 0x39a, 0x1be, 0x25c, 0xe, 0xb8, 0xf8, 0x1f4, 0xfe, 0x369, 0x125, 0x168, 0x396, 0x8d, 0x1ea, 0x5, 0x1d7, 0x332, 0x105, 0x1ee, 0x18b, 0x295, 0x3f5, 0x93, 0x222, 0x2fe, 0x23f, 0x195, 0x363, 0x11f, 0xf, 0xfb, 0x175, 0x4e, 0x368, 0x3c1, 0x33c, 0x37a, 0x51, 0x315, 0x3be, 0x55, 0x130, 0x1f8, 0x39a, 0x37c, 0x162, 0x70, 0x392, 0x33f, 0x1e7, 0x3e7, 0x303, 0x20b, 0x23a, 0x23b, 0x3b0, 0x125, 0x2d0, 0x243, 0x61, 0x29f, 0xa0, 0x135, 0x256, 0x349, 0x346, 0x3bd, 0x2c8, 0x286, 0x1ee, 0x22f, 0x113, 0x269, 0x238, 0x12d, 0x293, 0x2c6, 0x3f6, 0x20e, 0x194, 0x2e8, 0x38a, 0x3fa, 0x68, 0x357, 0x2b0, 0x157, 0x254, 0x5f, 0x265, 0x5e, 0x3ee, 0x2cb, 0x1b, 0x258, 0x239, 0xa6, 0x6, 0x133, 0x365, 0x2c, 0x36a, 0xd7, 0x21f, 0x99, 0x177, 0x358, 0x24b, 0x22, 0x21a, 0x337, 0x1a4, 0x362, 0x94, 0x29a, 0x30e, 0x1e6, 0x26c, 0x196, 0x1fe, 0x2a9, 0x19, 0x14e, 0x31a, 0x345, 0x120, 0x17e, 0x290, 0x5b, 0x40, 0x218, 0x21, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,}; + +#endif diff --git a/crypto_kem/hqc-192/avx2/api.h b/crypto_kem/hqc-192/avx2/api.h new file mode 100644 index 00000000..c4ff0b9e --- /dev/null +++ b/crypto_kem/hqc-192/avx2/api.h @@ -0,0 +1,25 @@ +#ifndef PQCLEAN_HQC192_AVX2_API_H +#define PQCLEAN_HQC192_AVX2_API_H +/** + * @file api.h + * @brief NIST KEM API used by the HQC_KEM IND-CCA2 scheme + */ + +#define PQCLEAN_HQC192_AVX2_CRYPTO_ALGNAME "HQC-192" + +#define PQCLEAN_HQC192_AVX2_CRYPTO_SECRETKEYBYTES 5730 +#define PQCLEAN_HQC192_AVX2_CRYPTO_PUBLICKEYBYTES 5690 +#define PQCLEAN_HQC192_AVX2_CRYPTO_BYTES 64 +#define PQCLEAN_HQC192_AVX2_CRYPTO_CIPHERTEXTBYTES 11364 + +// As a technicality, the public key is appended to the secret key in order to respect the NIST API. +// Without this constraint, PQCLEAN_HQC192_AVX2_CRYPTO_SECRETKEYBYTES would be defined as 32 + +int PQCLEAN_HQC192_AVX2_crypto_kem_keypair(unsigned char *pk, unsigned char *sk); + +int PQCLEAN_HQC192_AVX2_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk); + +int PQCLEAN_HQC192_AVX2_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-192/avx2/bch.c b/crypto_kem/hqc-192/avx2/bch.c new file mode 100644 index 00000000..7bf08ed3 --- /dev/null +++ b/crypto_kem/hqc-192/avx2/bch.c @@ -0,0 +1,367 @@ +#include "alpha_table.h" +#include "bch.h" +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include "vector.h" +#include +#include +#include +/** + * @file bch.c + * Constant time implementation of BCH codes + */ + + +static uint16_t mod(uint16_t i, uint16_t modulus); +static void compute_cyclotomic_cosets(uint16_t *cosets, uint16_t upper_bound); +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes); +static void message_from_codeword(uint64_t *message, const uint64_t *codeword); +static void compute_syndromes(__m256i *syndromes, const uint64_t *rcv); +static void compute_roots(uint64_t *error, const uint16_t *sigma); + +/** + * @brief Returns i modulo the given modulus. + * + * i must be less than 2*modulus. + * Therefore, the return value is either i or i-modulus. + * @returns i mod (modulus) + * @param[in] i The integer whose modulo is taken + * @param[in] modulus The modulus + */ +static uint16_t mod(uint16_t i, uint16_t modulus) { + uint16_t tmp = i - modulus; + + // mask = 0xffff if(i < PARAM_GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & modulus); +} + + + +/** + * @brief Computes the odd binary cyclotomic cosets modulo 2^m-1 for integers less than upper_bound. + * + * The array cosets of size 2^m-1 is filled by placing at index i the coset representative of i. + * @param[out] cosets Array receiving the coset representatives + * @param[in] upper_bound The upper bound + */ +static void compute_cyclotomic_cosets(uint16_t *cosets, uint16_t upper_bound) { + // Compute the odd cyclotomic classes + for (uint16_t i = 1 ; i < upper_bound ; i += 2) { + if (cosets[i] == 0) { // If i does not already belong to a class + uint16_t tmp = i; + size_t j = PARAM_M; + cosets[i] = i; + while (--j) { // Complete i's class + tmp = mod(2 * tmp, PARAM_GF_MUL_ORDER); + cosets[tmp] = i; + } + } + } +} + + + +/** + * @brief Computes the generator polynomial of the primitive BCH code with given parameters. + * + * Code length is 2^m-1.
+ * Parameter t is the targeted correction capacity of the code + * and receives the real correction capacity (which is at least equal to the target).
+ * exp and log are arrays giving antilog and log of GF(2^m) elements. + * @returns the degree of the generator polynomial + * @param[out] bch_poly Array of size (m*t + 1) receiving the coefficients of the generator polynomial + * @param[in,out] t Targeted correction capacity; receives the real correction capacity + * @param[in] exp Antilog table of GF(2^m) + * @param[in] log Log table of GF(2^m) + */ +size_t PQCLEAN_HQC192_AVX2_compute_bch_poly(uint16_t *bch_poly, size_t *t, const uint16_t *exp, const uint16_t *log) { + uint16_t cosets[PARAM_GF_MUL_ORDER]; + size_t deg_bch_poly = 0; + + memset(cosets, 0, 2 * PARAM_GF_MUL_ORDER); + compute_cyclotomic_cosets(cosets, 2 * *t); + + // Start with bch_poly(X) = 1 + bch_poly[0] = 1; + + for (uint16_t i = 1 ; i < PARAM_GF_MUL_ORDER ; ++i) { + if (cosets[i] == 0) { + continue; + } + + // Multiply bch_poly(X) by X-a^i + for (size_t j = deg_bch_poly ; j ; --j) { + int16_t mask = -((uint16_t) - bch_poly[j] >> 15); + bch_poly[j] = (mask & exp[mod(log[bch_poly[j]] + i, PARAM_GF_MUL_ORDER)]) ^ bch_poly[j - 1]; + } + bch_poly[0] = exp[mod(log[bch_poly[0]] + i, PARAM_GF_MUL_ORDER)]; + bch_poly[++deg_bch_poly] = 1; + } + + // Determine the real correction capacity + while (cosets[2 * *t + 1] != 0) { + ++*t; + } + + return deg_bch_poly; +} + + + +/** + * @brief Computes the values alpha^ij for decoding syndromes + * + * function to initialize a table which contains values alpha^ij for i in [0,N1[ and j in [1,2*PARAM_DELTA] + * these values are used in order to compute the syndromes of the received word v(x)=v_0+v_1x+...+v_{n1-1}x^{n1-1} + * value alpha^ij is stored in alpha_ij_table[2*PARAM_DELTA*i+j-1] + * The syndromes are equal to v(alpha^k) for k in [1,2*PARAM_DELTA] + * Size of the table is fixed to match 256 bit representation + * Useless values are filled with 0. + * + * @param[in] exp Exp look-up-table of GF + */ +void PQCLEAN_HQC192_AVX2_table_alphaij_generation(const uint16_t *exp) { + int32_t tmp_value; + int16_t *alpha_tmp; + + // pre-computation of alpha^ij for i in [0, N1[ and j in [1, 2*PARAM_DELTA] + // see comment of alpha_ij_table_init() function. + for (uint16_t i = 0; i < PARAM_N1 ; ++i) { + tmp_value = 0; + alpha_tmp = table_alpha_ij + i * (PARAM_DELTA << 1); + for (uint16_t j = 0 ; j < (PARAM_DELTA << 1) ; j++) { + tmp_value = PQCLEAN_HQC192_AVX2_gf_mod(tmp_value + i); + alpha_tmp[j] = exp[tmp_value]; + } + } +} + + + +/** + * @brief Computes the error locator polynomial (ELP) sigma + * + * This is a constant time implementation of Berlekamp's simplified algorithm (see @cite joiner1995decoding).
+ * We use the letter p for rho which is initialized at -1/2.
+ * The array X_sigma_p represents the polynomial X^(2(mu-rho))*sigma_p(X).
+ * Instead of maintaining a list of sigmas, we update in place both sigma and X_sigma_p.
+ * sigma_copy serves as a temporary save of sigma in case X_sigma_p needs to be updated.
+ * We can properly correct only if the degree of sigma does not exceed PARAM_DELTA. + * This means only the first PARAM_DELTA + 1 coefficients of sigma are of value + * and we only need to save its first PARAM_DELTA - 1 coefficients. + * + * @returns the degree of the ELP sigma + * @param[out] sigma Array of size (at least) PARAM_DELTA receiving the ELP + * @param[in] syndromes Array of size (at least) 2*PARAM_DELTA storing the syndromes + */ +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes) { + sigma[0] = 1; + size_t deg_sigma = 0; + size_t deg_sigma_p = 0; + uint16_t sigma_copy[PARAM_DELTA - 1] = {0}; + size_t deg_sigma_copy = 0; + uint16_t X_sigma_p[PARAM_DELTA + 1] = {0, 1}; + int32_t pp = -1; // 2*rho + uint16_t d_p = 1; + uint16_t d = syndromes[0]; + + for (size_t mu = 0 ; mu < PARAM_DELTA ; ++mu) { + // Save sigma in case we need it to update X_sigma_p + memcpy(sigma_copy, sigma, 2 * (PARAM_DELTA - 1)); + deg_sigma_copy = deg_sigma; + + uint16_t dd = PQCLEAN_HQC192_AVX2_gf_mul(d, PQCLEAN_HQC192_AVX2_gf_inverse(d_p)); // 0 if(d == 0) + for (size_t i = 1 ; (i <= 2 * mu + 1) && (i <= PARAM_DELTA) ; ++i) { + sigma[i] ^= PQCLEAN_HQC192_AVX2_gf_mul(dd, X_sigma_p[i]); + } + + size_t deg_X = 2 * mu - pp; // 2*(mu-rho) + size_t deg_X_sigma_p = deg_X + deg_sigma_p; + + // mask1 = 0xffff if(d != 0) and 0 otherwise + int16_t mask1 = -((uint16_t) - d >> 15); + + // mask2 = 0xffff if(deg_X_sigma_p > deg_sigma) and 0 otherwise + int16_t mask2 = -((uint16_t) (deg_sigma - deg_X_sigma_p) >> 15); + + // mask12 = 0xffff if the deg_sigma increased and 0 otherwise + int16_t mask12 = mask1 & mask2; + deg_sigma = (mask12 & deg_X_sigma_p) ^ (~mask12 & deg_sigma); + + if (mu == PARAM_DELTA - 1) { + break; + } + + // Update pp, d_p and X_sigma_p if needed + pp = (mask12 & (2 * mu)) ^ (~mask12 & pp); + d_p = (mask12 & d) ^ (~mask12 & d_p); + for (size_t i = PARAM_DELTA - 1 ; i ; --i) { + X_sigma_p[i + 1] = (mask12 & sigma_copy[i - 1]) ^ (~mask12 & X_sigma_p[i - 1]); + } + X_sigma_p[1] = 0; + X_sigma_p[0] = 0; + deg_sigma_p = (mask12 & deg_sigma_copy) ^ (~mask12 & deg_sigma_p); + + // Compute the next discrepancy + d = syndromes[2 * mu + 2]; + for (size_t i = 1 ; (i <= 2 * mu + 1) && (i <= PARAM_DELTA) ; ++i) { + d ^= PQCLEAN_HQC192_AVX2_gf_mul(sigma[i], syndromes[2 * mu + 2 - i]); + } + } + + return deg_sigma; +} + + + +/** + * @brief Retrieves the message message from the codeword codeword + * + * Since we performed a systematic encoding, the message is the last PARAM_K bits of the codeword. + * + * @param[out] message Array of size VEC_K_SIZE_BYTES receiving the message + * @param[in] codeword Array of size VEC_N1_SIZE_BYTES storing the codeword + */ +static void message_from_codeword(uint64_t *message, const uint64_t *codeword) { + int32_t val = PARAM_N1 - PARAM_K; + + uint64_t mask1 = (uint64_t) (0xffffffffffffffff << val % 64); + uint64_t mask2 = (uint64_t) (0xffffffffffffffff >> (64 - val % 64)); + size_t index = val / 64; + + for (size_t i = 0 ; i < VEC_K_SIZE_64 - 1 ; ++i) { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + uint64_t message2 = (codeword[++index] & mask2) << (64 - val % 64); + message[i] = message1 | message2; + } + + // Last byte (8-val % 8 is the number of bits given by message1) + if ((PARAM_K % 64 == 0) || (64 - val % 64 < PARAM_K % 64)) { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + uint64_t message2 = (codeword[++index] & mask2) << (64 - val % 64); + message[VEC_K_SIZE_64 - 1] = message1 | message2; + } else { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + message[VEC_K_SIZE_64 - 1] = message1; + } +} + + + +/** + * @brief Computes the 2^PARAM_DELTA syndromes from the received vector vector + * + * Syndromes are the sum of powers of alpha weighted by vector's coefficients. + * These powers have been pre-computed in table_alphaPARAM_DELTA.h + * Syndromes are 16-bits long , hence we can simultaneously compute 16 syndromes + * in a 256-bit register + * + * @param[out] syndromes Array of size 2^(PARAM_FFT_T) receiving the 2*PARAM_DELTA syndromes + * @param[in] rcv Array of size VEC_N1_SIZE_BYTES storing the received word + */ +void compute_syndromes(__m256i *syndromes, const uint64_t *rcv) { + const __m256i zero_256 = _mm256_set1_epi64x(0); + const __m256i mask_one = _mm256_set_epi64x(0x0303030303030303, 0x0202020202020202, 0x0101010101010101, 0x0); + const __m256i mask_two = _mm256_set1_epi64x(-0x7FBFDFEFF7FBFDFF); + const __m256i un_256 = _mm256_set1_epi64x(1); + + __m256i y; + __m256i S; + __m256i L; + __m256i tmp_repeat; + uint32_t *aux; + int16_t *alpha_tmp; + uint32_t i; + // static variable so that it is stored in the DATA segment + // not in the STACK segment + static uint8_t tmp_array[PARAM_N1 + 4]; // +4 to control overflow due to management of 256 bits + __m256i *z = (__m256i *) tmp_array; + // vectorized version of the separation of the coordinates of the vector v in order to put each coordinate in an unsigned char + // aux is used to consider 4 elements in v at each step of the loop + aux = (uint32_t *) rcv; + for (i = 0 ; i < ((VEC_N1_SIZE_BYTES >> 2) << 2) ; i += 4) { + // duplicate aux 8 times in y , i.e y= (aux aux aux .... aux) + y = _mm256_set1_epi32(*aux); + // shuffle the bytes of y so that if aux=(a0 a1 a2 a3) + // then y = (a0 a0 a0 a0 a0 a0 a0 a0 a1 a1 a1 a1 a1 a1 a1 a1 .... a3) + y = _mm256_shuffle_epi8(y, mask_one); + // apply a mask on each byte of y to determine if jth bit of a_k is 0 or 1 + z[i >> 2] = _mm256_and_si256(y, mask_two); + aux ++; + } + + // Evaluation of the polynomial corresponding to the vector v in alpha^i for i in {1, ..., 2 * PARAM_DELTA} + for (size_t j = 0 ; j < SYND_SIZE_256 ; ++j) { + S = zero_256; + alpha_tmp = table_alpha_ij + (j << 4); + + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + tmp_repeat = _mm256_set1_epi64x((long long)(tmp_array[i] != 0)); + L = _mm256_cmpeq_epi64(tmp_repeat, un_256); + tmp_repeat = _mm256_lddqu_si256((__m256i *)(alpha_tmp + i * (PARAM_DELTA << 1))); + L = _mm256_and_si256(L, tmp_repeat); + S = _mm256_xor_si256(L, S); + } + _mm256_storeu_si256(syndromes + j, S); + } +} + + +/** + * @brief Computes the error polynomial error from the error locator polynomial sigma + * + * See function PQCLEAN_HQC192_AVX2_fft for more details. + * + * @param[out] error Array of VEC_N1_SIZE_BYTES elements receiving the error polynomial + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + */ +static void compute_roots(uint64_t *error, const uint16_t *sigma) { + uint16_t w[1 << PARAM_M] = {0}; // w will receive the evaluation of sigma in all field elements + + PQCLEAN_HQC192_AVX2_fft(w, sigma, PARAM_DELTA + 1); + PQCLEAN_HQC192_AVX2_fft_retrieve_bch_error_poly(error, w); +} + + + +/** + * @brief Decodes the received word + * + * This function relies on four steps: + *
    + *
  1. The first step, done by additive FFT transpose, is the computation of the 2*PARAM_DELTA syndromes. + *
  2. The second step is the computation of the error-locator polynomial sigma. + *
  3. The third step, done by additive FFT, is finding the error-locator numbers by calculating the roots of the polynomial sigma and takings their inverses. + *
  4. The fourth step is the correction of the errors in the received polynomial. + *
+ * For a more complete picture on BCH decoding, see Shu. Lin and Daniel J. Costello in Error Control Coding: Fundamentals and Applications @cite lin1983error + * + * @param[out] message Array of size VEC_K_SIZE_BYTES receiving the decoded message + * @param[in] vector Array of size VEC_N1_SIZE_BYTES storing the received word + */ + +void PQCLEAN_HQC192_AVX2_bch_code_decode(uint64_t *message, uint64_t *vector) { + uint16_t sigma[1 << PARAM_FFT] = {0}; + uint64_t error[(1 << PARAM_M) / 8] = {0}; + static __m256i syndromes_256[SYND_SIZE_256]; + + // Calculate the 2*PARAM_DELTA syndromes + compute_syndromes(syndromes_256, vector); + + // Compute the error locator polynomial sigma + // Sigma's degree is at most PARAM_DELTA but the FFT requires the extra room + compute_elp(sigma, (uint16_t *)syndromes_256); + + // Compute the error polynomial error + compute_roots(error, sigma); + + // Add the error polynomial to the received polynomial + PQCLEAN_HQC192_AVX2_vect_add(vector, vector, error, VEC_N1_SIZE_64); + + // Retrieve the message from the decoded codeword + message_from_codeword(message, vector); + +} diff --git a/crypto_kem/hqc-192/avx2/bch.h b/crypto_kem/hqc-192/avx2/bch.h new file mode 100644 index 00000000..b623325a --- /dev/null +++ b/crypto_kem/hqc-192/avx2/bch.h @@ -0,0 +1,23 @@ +#ifndef BCH_H +#define BCH_H + + +/** + * @file bch.h + * Header file of bch.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQC192_AVX2_bch_code_decode(uint64_t *message, uint64_t *vector); + + +size_t PQCLEAN_HQC192_AVX2_compute_bch_poly(uint16_t *bch_poly, size_t *t, const uint16_t *exp, const uint16_t *log); + +void PQCLEAN_HQC192_AVX2_table_alphaij_generation(const uint16_t *exp); + + +#endif diff --git a/crypto_kem/hqc-192/avx2/code.c b/crypto_kem/hqc-192/avx2/code.c new file mode 100644 index 00000000..e2efc876 --- /dev/null +++ b/crypto_kem/hqc-192/avx2/code.c @@ -0,0 +1,104 @@ +#include "bch.h" +#include "code.h" +#include "gen_matrix.h" +#include "parameters.h" +#include "repetition.h" +#include +#include +#include +/** + * @file code.c + * @brief Implementation of tensor code + */ + + +static inline uint64_t mux(uint64_t a, uint64_t b, int64_t bit); + +static inline uint64_t mux(uint64_t a, uint64_t b, int64_t bit) { + uint64_t ret = a ^ b; + return (ret & (-bit >> 63)) ^ a; +} + + + +/** + * + * @brief Encoding the message m to a code word em using the tensor code + * + * We encode the message using the BCH code. For each bit obtained, + * we duplicate the bit PARAM_N2 times to apply repetition code. + * BCH encoding is done using the classical mG operation, + * columns of the matrix are stored in 256-bit registers + * + * @param[out] em Pointer to an array that is the tensor code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQC192_AVX2_code_encode(uint64_t *em, const uint64_t *m) { + uint64_t res; + uint32_t i; + static const uint64_t mask[2][2] = {{0x0UL, 0x0UL}, {0x7FFFFFFFFFFFFFFUL, 0x3FFFFFFFFFFFFFFUL}}; + + + __m256i *colonne, y, aux0; + __m256i msg = _mm256_lddqu_si256((const __m256i *) m); + colonne = ((__m256i *) gen_matrix); + + for (i = 0 ; i < PARAM_N1 - PARAM_K ; i++) { + // y is the and operation between m and ith column of G + y = _mm256_and_si256(colonne[i], msg); + // aux0 = (y2 y3 y0 y1) + aux0 = _mm256_permute2x128_si256(y, y, 1); + // y = (y0^y2 y1^y3 y2^y0 y3^y1) + y = _mm256_xor_si256(y, aux0); + // aux0 = (y1^y3 y0^y2 y1^y3 y0^y2) + aux0 = _mm256_shuffle_epi32(y, 0x4e); + // y = (y0^y1^y2^y3 repeated 4 times) + y = _mm256_xor_si256(aux0, y); + res = _mm_popcnt_u64(_mm256_extract_epi64(y, 0)) & 1; + + + uint16_t pos_r = PARAM_N2 * i; + uint16_t idx_r = (pos_r & 0x3f); + uint64_t *p64 = em; + p64 += pos_r >> 6; + uint64_t select = mux(mask[0][0], mask[1][0], res); + *p64 ^= select << idx_r; + select = mux(mask[0][1], mask[1][1], res); + *(p64 + 1) ^= select >> ((63 - idx_r)); + } + + /* now we add the message m */ + /* systematic encoding */ + for (int32_t i = 0 ; i < 4 ; i++) { + for (int32_t j = 0 ; j < 64 ; j++) { + uint8_t bit = (m[i] >> j) & 0x1; + uint32_t pos_r = PARAM_N2 * ((PARAM_N1 - PARAM_K) + ((i << 6) + j)); + uint16_t idx_r = (pos_r & 0x3f); + uint64_t *p64 = em; + + + p64 += pos_r >> 6; + uint64_t select = mux(mask[0][0], mask[1][0], bit); + *p64 ^= select << idx_r; + select = mux(mask[0][1], mask[1][1], bit); + *(p64 + 1) ^= select >> ((63 - idx_r)); + } + } + +} + + +/** + * @brief Decoding the code word em to a message m using the tensor code + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQC192_AVX2_code_decode(uint64_t *m, const uint64_t *em) { + + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQC192_AVX2_repetition_code_decode(tmp, em); + PQCLEAN_HQC192_AVX2_bch_code_decode(m, tmp); + +} diff --git a/crypto_kem/hqc-192/avx2/code.h b/crypto_kem/hqc-192/avx2/code.h new file mode 100644 index 00000000..511e82cf --- /dev/null +++ b/crypto_kem/hqc-192/avx2/code.h @@ -0,0 +1,20 @@ +#ifndef CODE_H +#define CODE_H + + +/** + * @file code.h + * Header file of code.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQC192_AVX2_code_encode(uint64_t *em, const uint64_t *message); + +void PQCLEAN_HQC192_AVX2_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-192/avx2/fft.c b/crypto_kem/hqc-192/avx2/fft.c new file mode 100644 index 00000000..18769698 --- /dev/null +++ b/crypto_kem/hqc-192/avx2/fft.c @@ -0,0 +1,333 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include +#include +#include +/** + * @file fft.c + * Implementation of the additive FFT and its transpose. + * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + */ + + +static void compute_fft_betas(uint16_t *betas); +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size); +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f); +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); + + +/** + * @brief Computes the basis of betas (omitting 1) used in the additive FFT and its transpose + * + * @param[out] betas Array of size PARAM_M-1 + */ +static void compute_fft_betas(uint16_t *betas) { + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + betas[i] = 1 << (PARAM_M - 1 - i); + } +} + + + +/** + * @brief Computes the subset sums of the given set + * + * The array subset_sums is such that its ith element is + * the subset sum of the set elements given by the binary form of i. + * + * @param[out] subset_sums Array of size 2^set_size receiving the subset sums + * @param[in] set Array of set_size elements + * @param[in] set_size Size of the array set + */ +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size) { + subset_sums[0] = 0; + + for (size_t i = 0 ; i < set_size ; ++i) { + for (size_t j = 0 ; j < (1U << i) ; ++j) { + subset_sums[(1 << i) + j] = set[i] ^ subset_sums[j]; + } + } +} + + + +/** + * @brief Computes the radix conversion of a polynomial f in GF(2^m)[x] + * + * Computes f0 and f1 such that f(x) = f0(x^2-x) + x.f1(x^2-x) + * as proposed by Bernstein, Chou and Schwabe: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f0 Array half the size of f + * @param[out] f1 Array half the size of f + * @param[in] f Array of size a power of 2 + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f) { + switch (m_f) { + case 4: + f0[4] = f[8] ^ f[12]; + f0[6] = f[12] ^ f[14]; + f0[7] = f[14] ^ f[15]; + f1[5] = f[11] ^ f[13]; + f1[6] = f[13] ^ f[14]; + f1[7] = f[15]; + f0[5] = f[10] ^ f[12] ^ f1[5]; + f1[4] = f[9] ^ f[13] ^ f0[5]; + + f0[0] = f[0]; + f1[3] = f[7] ^ f[11] ^ f[15]; + f0[3] = f[6] ^ f[10] ^ f[14] ^ f1[3]; + f0[2] = f[4] ^ f0[4] ^ f0[3] ^ f1[3]; + f1[1] = f[3] ^ f[5] ^ f[9] ^ f[13] ^ f1[3]; + f1[2] = f[3] ^ f1[1] ^ f0[3]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 3: + f0[0] = f[0]; + f0[2] = f[4] ^ f[6]; + f0[3] = f[6] ^ f[7]; + f1[1] = f[3] ^ f[5] ^ f[7]; + f1[2] = f[5] ^ f[6]; + f1[3] = f[7]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 2: + f0[0] = f[0]; + f0[1] = f[2] ^ f[3]; + f1[0] = f[1] ^ f0[1]; + f1[1] = f[3]; + return; + + case 1: + f0[0] = f[0]; + f1[0] = f[1]; + return; + + default: + ; + size_t n = 1 << (m_f - 2); + + uint16_t Q[2 * (1 << (PARAM_FFT - 2))]; + uint16_t R[2 * (1 << (PARAM_FFT - 2))]; + + uint16_t Q0[1 << (PARAM_FFT - 2)]; + uint16_t Q1[1 << (PARAM_FFT - 2)]; + uint16_t R0[1 << (PARAM_FFT - 2)]; + uint16_t R1[1 << (PARAM_FFT - 2)]; + + memcpy(Q, f + 3 * n, 2 * n); + memcpy(Q + n, f + 3 * n, 2 * n); + memcpy(R, f, 4 * n); + + for (size_t i = 0 ; i < n ; ++i) { + Q[i] ^= f[2 * n + i]; + R[n + i] ^= Q[i]; + } + + radix(Q0, Q1, Q, m_f - 1); + radix(R0, R1, R, m_f - 1); + + memcpy(f0, R0, 2 * n); + memcpy(f0 + n, Q0, 2 * n); + memcpy(f1, R1, 2 * n); + memcpy(f1 + n, Q1, 2 * n); + } +} + + + +/** + * @brief Evaluates f at all subset sums of a given set + * + * This function is a subroutine of the function fft. + * + * @param[out] w Array + * @param[in] f Array + * @param[in] f_coeffs Number of coefficients of f + * @param[in] m Number of betas + * @param[in] m_f Number of coefficients of f (one more than its degree) + * @param[in] betas FFT constants + */ +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + uint16_t f0[1 << (PARAM_FFT - 2)]; + uint16_t f1[1 << (PARAM_FFT - 2)]; + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + size_t k = 1 << (m - 1); + uint16_t gammas_sums[1 << (PARAM_M - 2)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + uint16_t tmp[PARAM_M - (PARAM_FFT - 1)]; + for (size_t i = 0 ; i < m ; ++i) { + tmp[i] = PQCLEAN_HQC192_AVX2_gf_mul(betas[i], f[1]); + } + + w[0] = f[0]; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + w[(1 << j) + k] = w[k] ^ tmp[j]; + } + } + + return; + } + + // Step 2: compute g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQC192_AVX2_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQC192_AVX2_gf_mul(beta_m_pow, f[i]); + } + } + + // Step 3 + radix(f0, f1, f, m_f); + + // Step 4: compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQC192_AVX2_gf_mul(betas[i], PQCLEAN_HQC192_AVX2_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQC192_AVX2_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + + if (f_coeffs <= 3) { // 3-coefficient polynomial f case: f1 is constant + w[0] = u[0]; + w[k] = u[0] ^ f1[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC192_AVX2_gf_mul(gammas_sums[i], f1[0]); + w[k + i] = w[i] ^ f1[0]; + } + } else { + fft_rec(v, f1, f_coeffs / 2, m - 1, m_f - 1, deltas); + + // Step 6 + memcpy(w + k, v, 2 * k); + w[0] = u[0]; + w[k] ^= u[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC192_AVX2_gf_mul(gammas_sums[i], v[i]); + w[k + i] ^= w[i]; + } + } +} + + + +/** + * @brief Evaluates f on all fields elements using an additive FFT algorithm + * + * f_coeffs is the number of coefficients of f (one less than its degree).
+ * The FFT proceeds recursively to evaluate f at all subset sums of a basis B.
+ * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf
+ * Note that on this first call (as opposed to the recursive calls to fft_rec), gammas are equal to betas, + * meaning the first gammas subset sums are actually the subset sums of betas (except 1).
+ * Also note that f is altered during computation (twisted at each level). + * + * @param[out] w Array + * @param[in] f Array of 2^PARAM_FFT elements + * @param[in] f_coeffs Number coefficients of f (i.e. deg(f)+1) + */ +void PQCLEAN_HQC192_AVX2_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs) { + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + uint16_t f0[1 << (PARAM_FFT - 1)]; + uint16_t f1[1 << (PARAM_FFT - 1)]; + uint16_t deltas[PARAM_M - 1]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)]; + uint16_t v[1 << (PARAM_M - 1)]; + + // Follows Gao and Mateer algorithm + compute_fft_betas(betas); + + // Step 1: PARAM_FFT > 1, nothing to do + + // Compute gammas sums + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + // Step 2: beta_m = 1, nothing to do + + // Step 3 + radix(f0, f1, f, PARAM_FFT); + + // Step 4: Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQC192_AVX2_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + fft_rec(v, f1, f_coeffs / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + + // Step 6, 7 and error polynomial computation + memcpy(w + k, v, 2 * k); + + // Check if 0 is root + w[0] = u[0]; + + // Check if 1 is root + w[k] ^= u[0]; + + // Find other roots + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC192_AVX2_gf_mul(betas_sums[i], v[i]); + w[k + i] ^= w[i]; + } +} + + + +/** + * @brief Retrieves the error polynomial error from the evaluations w of the ELP (Error Locator Polynomial) on all field elements. + * + * @param[out] error Array of size VEC_N1_SIZE_BYTES + * @param[in] w Array of size 2^PARAM_M + */ +void PQCLEAN_HQC192_AVX2_fft_retrieve_bch_error_poly(uint64_t *error, const uint16_t *w) { + uint16_t gammas[PARAM_M - 1]; + uint16_t gammas_sums[1 << (PARAM_M - 1)]; + size_t k = 1 << (PARAM_M - 1); + size_t index = PARAM_GF_MUL_ORDER; + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + error[0] ^= ((uint64_t) 1) ^ ((uint16_t) - w[0] >> 15); + uint64_t bit = ((uint64_t) 1) ^ ((uint16_t) - w[k] >> 15); + error[index / 8] ^= bit << (index % 64); + + for (size_t i = 1 ; i < k ; ++i) { + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQC192_AVX2_gf_log(gammas_sums[i]); + bit = ((uint64_t) 1) ^ ((uint16_t) - w[i] >> 15); + error[index / 64] ^= bit << (index % 64); + + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQC192_AVX2_gf_log(gammas_sums[i] ^ 1); + bit = ((uint64_t) 1) ^ ((uint16_t) - w[k + i] >> 15); + error[index / 64] ^= bit << (index % 64); + } +} diff --git a/crypto_kem/hqc-192/avx2/fft.h b/crypto_kem/hqc-192/avx2/fft.h new file mode 100644 index 00000000..a7f8c460 --- /dev/null +++ b/crypto_kem/hqc-192/avx2/fft.h @@ -0,0 +1,20 @@ +#ifndef FFT_H +#define FFT_H + + +/** + * @file fft.h + * Header file of fft.c + */ + +#include + +#include +#include + +void PQCLEAN_HQC192_AVX2_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs); + +void PQCLEAN_HQC192_AVX2_fft_retrieve_bch_error_poly(uint64_t *error, const uint16_t *w); + + +#endif diff --git a/crypto_kem/hqc-192/avx2/gen_matrix.h b/crypto_kem/hqc-192/avx2/gen_matrix.h new file mode 100644 index 00000000..2db7c74b --- /dev/null +++ b/crypto_kem/hqc-192/avx2/gen_matrix.h @@ -0,0 +1,16 @@ +#ifndef GEN_MATRIX_H +#define GEN_MATRIX_H + + +/** + * @file gen_matrix.h + * Header file that contain precomputed generator matrix of the BCH code defined in the file parameters.h + */ + +#include "parameters.h" +#include "parameters.h" + + +uint64_t gen_matrix[(PARAM_N1 - PARAM_K) * 4] = {0x9901f502cd17fcafUL, 0xd2f8231a9952fc37UL, 0xb2a55153e9eb5bffUL, 0xb1c0755014aa5204UL, 0xab021f07573805f1UL, 0x7708652fabf70458UL, 0xd7eff3f43a3dec00UL, 0xd2409ff03dfef60dUL, 0x56043e0eae700be2UL, 0xee10ca5f57ee08b1UL, 0xafdfe7e8747bd800UL, 0xa4813fe07bfdec1bUL, 0xac087c1d5ce017c4UL, 0xdc2194beafdc1162UL, 0x5fbfcfd0e8f7b001UL, 0x49027fc0f7fbd837UL, 0x5810f83ab9c02f88UL, 0xb843297d5fb822c5UL, 0xbf7f9fa1d1ef6003UL, 0x9204ff81eff7b06eUL, 0xb021f07573805f10UL, 0x708652fabf70458aUL, 0x7eff3f43a3dec007UL, 0x2409ff03dfef60ddUL, 0xf94215e82a17428fUL, 0x33f486efe7b27722UL, 0x4f5b2fd4ae56dbf1UL, 0xf9d38b57ab7493beUL, 0xf2842bd0542e851eUL, 0x67e90ddfcf64ee45UL, 0x9eb65fa95cadb7e2UL, 0xf3a716af56e9277cUL, 0xe50857a0a85d0a3cUL, 0xcfd21bbf9ec9dc8bUL, 0x3d6cbf52b95b6fc4UL, 0xe74e2d5eadd24ef9UL, 0x53115a439dade8d7UL, 0x4d5c1465a4c14520UL, 0xc87c2ff69b5d8476UL, 0x7f5c2fed4f0ecff6UL, 0x3f234185f64c2d01UL, 0x48400bd1d0d07677UL, 0x225d0ebedf505313UL, 0x4f782a8a8ab7cde9UL, 0x7e46830bec985a02UL, 0x908017a3a1a0eceeUL, 0x44ba1d7dbea0a626UL, 0x9ef05515156f9bd2UL, 0x658cf315142748abUL, 0xf3f80c5dda1325ebUL, 0x3bd16ba894aa17b2UL, 0x8c20df7a3e7565a0UL, 0x52181328e5596df9UL, 0x35083ba12d74b7e1UL, 0xc5078602c0bf749aUL, 0xa981cba468409944UL, 0xa4302651cab2dbf2UL, 0x6a1077425ae96fc2UL, 0x8a0f0c05817ee934UL, 0x53039748d0813289UL, 0xd161b9a158724b4bUL, 0x6d8cd9e2c8023b2UL, 0xa6bb4958eb168997UL, 0x17c75bc1b5a83717UL, 0xa2c37342b0e49696UL, 0xdb19b3c59004765UL, 0x4d7692b1d62d132eUL, 0x2f8eb7836b506e2fUL, 0xdc871387acded183UL, 0xc99b15622b5272fcUL, 0x2848743045b17da3UL, 0xeedd1a56c20a8e5aUL, 0x200fd20d94aa5fa9UL, 0x41ce09decff619ceUL, 0xe235b9336289a0b8UL, 0x6c7a41fd90bf4eb0UL, 0x401fa41b2954bf52UL, 0x839c13bd9fec339cUL, 0xc46b7266c5134170UL, 0xd8f483fb217e9d61UL, 0x803f483652a97ea4UL, 0x738277b3fd86738UL, 0x88d6e4cd8a2682e1UL, 0xb1e907f642fd3ac3UL, 0x997f656e684501e7UL, 0xdc886dece6e23246UL, 0xa30898c8fda65e3dUL, 0xd2127abc91502783UL, 0x32fecadcd08a03ceUL, 0xb910dbd9cdc4648dUL, 0x46113191fb4cbc7bUL, 0xa424f57922a04f07UL, 0x65fd95b9a114079cUL, 0x7221b7b39b88c91aUL, 0x8c226323f69978f7UL, 0x4849eaf245409e0eUL, 0x52fade718f3ff397UL, 0x36bb4c7dae436e03UL, 0xaae1971404d9aa11UL, 0x2153a0b49e2b6e19UL, 0x3cf449e1d3681b81UL, 0xbf8ebbe1c5d42031UL, 0xe7667f7be0580fddUL, 0xf367343928fc8e37UL, 0xe0e966c16bc7cbadUL, 0xade554d912fabc55UL, 0x7c69afa4295b4444UL, 0x570e1d2245534e6bUL, 0x58d338801a986bf5UL, 0x89328aa8bca7849cUL, 0x4a760e1bbb5dd376UL, 0x1fdc4f149e0cced2UL, 0x28a78402f8272b45UL, 0xc09d364be01df50fUL, 0x26494d649f50fd12UL, 0x8e78eb7928b3cfa0UL, 0xc84efd073d59aa25UL, 0x53c24f8d59691629UL, 0xfe37cb9ad74aa1daUL, 0xad31a3a245cdcd44UL, 0x909dfa0e7ab3544aUL, 0xa7849f1ab2d22c53UL, 0xfc6f9735ae9543b4UL, 0x5a6347448b9b9a89UL, 0x213bf41cf566a894UL, 0x4f093e3565a458a7UL, 0xf8df2e6b5d2a8769UL, 0xb4c68e8917373513UL, 0xdb761d3b27daad87UL, 0x4cea5f70521a4d79UL, 0x431b0d8553be552dUL, 0xd84d68423ac43823UL, 0x2fedcf7482a2a7a1UL, 0x4b2c9dfa3d6666c4UL, 0x34934a594e97f1a5UL, 0x15aa5d461222242UL, 0x5fdb9ee905454f42UL, 0x96593bf47acccd88UL, 0x692694b29d2fe34aUL, 0x2b54ba8c2444484UL, 0x26b6c8d0c79d622bUL, 0xfe4a54f26ccb6727UL, 0x60e87836d3b49d6aUL, 0xb4aae2019022db0cUL, 0xd46c64a3422d38f9UL, 0x2e6c8afe40c43279UL, 0x7375a13e4e82612aUL, 0xd895b15334efe41cUL, 0x31d93c44494d8d5dUL, 0x8e2136e618da98c4UL, 0x544e132f74ef99abUL, 0xeb17f67d759a3cUL, 0xfab38d8a5f8ce615UL, 0xceba4ed6a8e7cdbfUL, 0x1a39770d003468a8UL, 0xb0165abcee41667cUL, 0xf5671b14bf19cc2aUL, 0x9d749dad51cf9b7fUL, 0x3472ee1a0068d151UL, 0x602cb579dc82ccf8UL, 0x73cfc32bb32464fbUL, 0xe81118403acdcac8UL, 0xda408d67e93af95cUL, 0x71991fa3adafcbf4UL, 0x7e9e7355ab5f3559UL, 0x2da139aecc969a7UL, 0x6244b9c3b9ea946UL, 0x52f24a174ff5c5edUL, 0x643d13a99ba9961dUL, 0xd74c042f40c02f79UL, 0xbeedc66b9ed60973UL, 0x1424e17e8b41d9deUL, 0x517bd251fa44d095UL, 0x7c602b4418d2a2c5UL, 0xcf7edd84d4474918UL, 0x9989b7ad0229e1b9UL, 0xa2f7a4a3f489a12aUL, 0xf8c0568831a5458aUL, 0x9efdbb09a88e9230UL, 0x33136f5a0453c373UL, 0xdceebc452404befbUL, 0x23788e0afa187722UL, 0x8f5e2740b8f67f9eUL, 0xd7e6abe41c0dd4e3UL, 0xb9dd788a48097df6UL, 0x46f11c15f430ee45UL, 0x1ebc4e8171ecff3cUL, 0xafcd57c8381ba9c7UL, 0x73baf1149012fbecUL, 0x8de2382be861dc8bUL, 0x3d789d02e3d9fe78UL, 0x5f9aaf907037538eUL, 0xe775e2292025f7d8UL, 0x1bc47057d0c3b916UL, 0x7af13a05c7b3fcf1UL, 0xbf355f20e06ea71cUL, 0x57ea31508d5c131fUL, 0xe570c3b538d58e1aUL, 0x47472558668ca21dUL, 0xcfaacb11d4771c3cUL, 0xafd462a11ab8263eUL, 0xcae1876a71ab1c34UL, 0x8e8e4ab0cd19443bUL, 0x9f559623a8ee3878UL, 0x5fa8c54235704c7cUL, 0x95c30ed4e3563869UL, 0x1d1c95619a328877UL, 0x3eab2c4751dc70f1UL, 0x26507f86a7f76457UL, 0xf97e3eb35ffe8ce5UL, 0x889c7b90dd8e4b10UL, 0xcc962ddeb712b3e6UL, 0xd5a10a0f82f93401UL, 0x20045e7c26afe5fdUL, 0xa39da67252f7cddeUL, 0x28ec2eed7a8f35c9UL, 0x3243e11dc8e594adUL, 0x92f09fe2d40d37ccUL, 0xf59e1db74c04c043UL, 0xe018288ae1b43997UL, 0x6487c23b91cb295aUL, 0x25e13fc5a81a6f98UL, 0xeb3c3b6e98098087UL, 0xc0305115c368732fUL, 0x500e7175ee81ae1bUL, 0x993a5c91c9662307UL, 0x64dd278ed9f85af1UL, 0x31a0d77b927ab45bUL, 0x391d17e91014a099UL, 0xe08c9a390b9eba39UL, 0x7b1f1e4e5a1bee1cUL, 0xd281dba7305f3ab2UL, 0x723a2fd220294132UL, 0xc1193472173d7472UL, 0xf63e3c9cb437dc39UL, 0xa503b74e60be7564UL, 0x7d75aaa68d457ecbUL, 0x50ca4bfeb72814d3UL, 0x5ed9286a8184e38cUL, 0xfbc71bccd5d6b8cdUL, 0xfaeb554d1a8afd96UL, 0xa19497fd6e5029a6UL, 0xbdb250d50309c718UL, 0xf78e3799abad719aUL, 0x6cd75f98f8020783UL, 0x91d10ce045f2af7aUL, 0xc9c1f0f9eff8d5ceUL, 0x5edc1a6343f0b131UL, 0x40af4a333d13f3a9UL, 0xf15a3ada12b7a2c3UL, 0x2126b0a0361af062UL, 0xc784196934b3067UL, 0x185f6164b7301bfdUL, 0x304c56aebc3db9b1UL, 0xf0e8301385debb3aUL, 0xa930f67d323c32caUL, 0x30bec2c96e6037faUL, 0x6098ad5d787b7362UL, 0xe1d060270bbd7674UL, 0x5261ecfa64786595UL, 0xf87c709011d7935bUL, 0x13c979a069a41af3UL, 0x7105911dfe91b717UL, 0x1503aca4dc5a992fUL, 0xf0f8e12023af26b6UL, 0x2792f340d34835e7UL, 0xe20b223bfd236e2eUL, 0x2a075949b8b5325eUL, 0x78f037428a49b1c3UL, 0x9dddc59b3fc297f8UL, 0x76b3152413ad87a3UL, 0xe5cec7c365c036b9UL, 0xf1e06e8514936386UL, 0x3bbb8b367f852ff0UL, 0xed662a48275b0f47UL, 0xcb9d8f86cb806d72UL, 0xe3c0dd0a2926c70cUL, 0x7777166cff0a5fe1UL, 0xdacc54904eb61e8eUL, 0x973b1f0d9700dae5UL, 0x5e804f169f5a72b7UL, 0x3c160fc3674643f4UL, 0x73df873748766e3UL, 0x9fb64b4b3aabe7cfUL, 0xbd009e2d3eb4e56eUL, 0x782c1f86ce8c87e8UL, 0xe7bf0e6e90ecdc6UL, 0x3f6c96967557cf9eUL, 0x7a013c5a7d69cadcUL, 0xf0583f0d9d190fd1UL, 0x1cf7e1cdd21d9b8cUL, 0x7ed92d2ceaaf9f3cUL, 0xf40278b4fad395b8UL, 0xe0b07e1b3a321fa2UL, 0x39efc39ba43b3719UL, 0xfdb25a59d55f3e78UL, 0xe804f169f5a72b70UL, 0xc160fc3674643f45UL, 0x73df873748766e33UL, 0xfb64b4b3aabe7cf0UL, 0x490817d12659aa4fUL, 0x5039db76719a82bcUL, 0x551a5f3d79078798UL, 0x47091c3741d6abe4UL, 0xb11daa081a4a831UL, 0x728b95f67a67f94fUL, 0x1891ef291be454cfUL, 0x3fd24d3e970705ccUL, 0x8f224043ce5eaccdUL, 0x37ef08f66d9d0ea9UL, 0x83868f01de23f261UL, 0xce64ef2d3aa4599cUL, 0x8745758551aaa535UL, 0xbd2632f64268e164UL, 0xb5a84f5055acbf3dUL, 0x2d09ab0a61e2e13dUL, 0xe8aeb0aa3554a6aUL, 0x7a4c65ec84d1c2c9UL, 0x6b509ea0ab597e7bUL, 0x5a135614c3c5c27bUL, 0x841423178bbd687bUL, 0x2660e8c390f179a5UL, 0x64046c12bf59a709UL, 0x5e6d9799321d6f2UL, 0x9129b32dda6d2c59UL, 0x9e39f29db8b00f7cUL, 0x7aad8976975815edUL, 0xba0dc7a332e9ffe0UL, 0xbb52935979cda41dUL, 0xee8bc621e832e2ceUL, 0x47fe43bec75b7024UL, 0xc5dbfa167179adc4UL, 0xefa4d3b03e8cb495UL, 0xfefaf59493739aaUL, 0x3d59d62e675dbbb6UL, 0x3a77817cf659098cUL, 0x46485262b00e9585UL, 0xcd277da80b3c8f62UL, 0xc816fd0f27502c93UL, 0xc52f77a9f818411cUL, 0x8c90a4c5601d2b0aUL, 0x9a4efb5016791ec4UL, 0x902dfa1e4ea05927UL, 0x8a5eef53f0308239UL, 0x1921498ac03a5614UL, 0x349df6a02cf23d89UL, 0x205bf43c9d40b24fUL, 0x14bddea7e0610473UL, 0x324293158074ac28UL, 0x693bed4059e47b12UL, 0x40b7e8793a81649eUL, 0x297bbd4fc0c208e6UL, 0x6485262b00e95850UL, 0xd277da80b3c8f624UL, 0x816fd0f27502c93cUL, 0x52f77a9f818411ccUL, 0x500bb954ccc54c0fUL, 0x7617961bfec3107fUL, 0xb07af0b703eec986UL, 0x142e806f17a2719dUL, 0xa01772a9998a981eUL, 0xec2f2c37fd8620feUL, 0x60f5e16e07dd930cUL, 0x285d00de2f44e33bUL, 0x402ee5533315303cUL, 0xd85e586ffb0c41fdUL, 0xc1ebc2dc0fbb2619UL, 0x50ba01bc5e89c676UL, 0x195c3fa4ab3d9cd7UL, 0x624493c56f4a7fcdUL, 0x3172d4ebf69d17ccUL, 0x10b47628a9b9dee9UL, 0x32b87f49567b39aeUL, 0xc489278ade94ff9aUL, 0x62e5a9d7ed3a2f98UL, 0x2168ec515373bdd2UL, 0x6570fe92acf6735cUL, 0x89124f15bd29ff34UL, 0xc5cb53afda745f31UL, 0x42d1d8a2a6e77ba4UL, 0x53e0082794fb1a17UL, 0xc0dcbd31e301025fUL, 0x3933f60c5d03e59cUL, 0x3463c4155964a54dUL, 0x3ec1e54de4e1c881UL, 0x534159795f50f889UL, 0xc0c2bd4b53ec90c6UL, 0xd907fd7aa663189eUL, 0xe4823f9904d46dadUL, 0x747a91e827f30d25UL, 0x33202bc54e327a73UL, 0x3cf8fa5586c6339UL, 0xc9047f3209a8db5aUL, 0xe8f523d04fe61a4bUL, 0x6640578a9c64f4e6UL, 0x79f1f4ab0d8c672UL, 0x9208fe641351b6b4UL, 0xd1ea47a09fcc3497UL, 0xcc80af1538c9e9cdUL, 0xf3e3e9561b18ce4UL, 0x2411fcc826a36d68UL, 0xa3d48f413f98692fUL, 0x99015e2a7193d39bUL, 0x1e7c7d2ac36319c9UL, 0xd1220c928051267fUL, 0x95513d98e6622e69UL, 0x80a7ed070accfcc8UL, 0x8d388f05926c6197UL, 0x3b45ec27cdb5b051UL, 0xf85a582b5596a0e4UL, 0xb3ea8b5dfc72a26eUL, 0xabb16b5b3072912bUL, 0x768bd84f9b6b60a2UL, 0xf0b4b056ab2d41c8UL, 0x67d516bbf8e544ddUL, 0x5762d6b660e52257UL, 0xed17b09f36d6c144UL, 0xe16960ad565a8390UL, 0xcfaa2d77f1ca89bbUL, 0xaec5ad6cc1ca44aeUL, 0x432e943ca0ba7e27UL, 0x102ae24035e7fb16UL, 0x2df10bbc0a7e4888UL, 0xec4b2f89973edb59UL, 0x865d28794174fc4eUL, 0x2055c4806bcff62cUL, 0x5be2177814fc9110UL, 0xd8965f132e7db6b2UL, 0x95bba5f04ffe0433UL, 0x9253aa1a4ecd106eUL, 0x5617fa3c01279dfUL, 0xeccb7648513f60UL, 0x2b774be09ffc0866UL, 0x24a754349d9a20ddUL, 0xac2ff478024f3bfUL, 0x1d996ec90a27ec0UL, 0x56ee97c13ff810ccUL, 0x494ea8693b3441baUL, 0x1585fe8f0049e77eUL, 0x3b32dd92144fd80UL, 0xaddd2f827ff02198UL, 0x929d50d276688374UL, 0x2b0bfd1e0093cefcUL, 0x7665bb24289fb00UL, 0xc2bbaa0632f7bf9fUL, 0xf7c282be7583fadeUL, 0xe4b2ab6fe8ccc606UL, 0xbf0cc23491b9a404UL, 0x8577540c65ef7f3eUL, 0xef85057ceb07f5bdUL, 0xc96556dfd1998c0dUL, 0x7e19846923734809UL, 0xaeea818cbdefe7cUL, 0xdf0a0af9d60feb7bUL, 0x92caadbfa333181bUL, 0xfc3308d246e69013UL, 0x15dd503197bdfcf8UL, 0xbe1415f3ac1fd6f6UL, 0x25955b7f46663037UL, 0xf86611a48dcd2027UL, 0x2bbaa0632f7bf9f0UL, 0x7c282be7583fadecUL, 0x4b2ab6fe8ccc606fUL, 0xf0cc23491b9a404eUL, 0xce74b5c493e00f4fUL, 0x2aa874d4292da7efUL, 0x24f03caef0739b21UL, 0x505833c2239ed298UL, 0x9ce96b8927c01e9eUL, 0x5550e9a8525b4fdfUL, 0x49e0795de0e73642UL, 0xa0b06784473da530UL, 0x39d2d7124f803d3cUL, 0xaaa1d350a4b69fbfUL, 0x93c0f2bbc1ce6c84UL, 0x4160cf088e7b4a60UL, 0x73a5ae249f007a78UL, 0x5543a6a1496d3f7eUL, 0x2781e577839cd909UL, 0x82c19e111cf694c1UL, 0x7e4aa94bf317085fUL, 0x787f6e580b8882cbUL, 0xfda69bbceed2e9edUL, 0xb44349722d477b86UL, 0xfc955297e62e10beUL, 0xf0fedcb017110596UL, 0xfb4d3779dda5d3daUL, 0x688692e45a8ef70dUL, 0x602b502d014bddd3UL, 0x33059a7ab770f71aUL, 0x443f3fa052a0fc4aUL, 0x60cd5098a1b7bc1fUL, 0x59575558cf804709UL, 0xb4f317eff7b31203UL, 0x3adb2e134caaa36bUL, 0x705ad46157c52a3aUL, 0xb2aeaab19f008e12UL, 0x69e62fdfef662406UL, 0x75b65c26995546d7UL, 0xe0b5a8c2af8a5474UL, 0x655d55633e011c24UL, 0xd3cc5fbfdecc480dUL, 0xeb6cb84d32aa8daeUL, 0xc16b51855f14a8e8UL, 0xcabaaac67c023848UL, 0xa798bf7fbd98901aUL, 0xd6d9709a65551b5dUL, 0x82d6a30abe2951d1UL, 0x9575558cf8047090UL, 0x4f317eff7b312035UL, 0xadb2e134caaa36bbUL, 0x5ad46157c52a3a3UL, 0xb3eb5e1b3d1f1d8fUL, 0x4c9adee46f30bc5cUL, 0xe9c0933a7cbf3689UL, 0xba9af97aec0f1543UL, 0xfed74934b729c7b1UL, 0x4bcd9ed24733848eUL, 0x61247727109536edUL, 0xc4f587a5ccb47883UL, 0xfdae92696e538f62UL, 0x979b3da48e67091dUL, 0xc248ee4e212a6ddaUL, 0x89eb0f4b9968f106UL, 0xfb5d24d2dca71ec4UL, 0x2f367b491cce123bUL, 0x8491dc9c4254dbb5UL, 0x13d61e9732d1e20dUL, 0x6fbbbca77459c127UL, 0x8c94d588a0ced840UL, 0xbb86e86b6d42ec95UL, 0x966c487e7109961fUL, 0x46768c4c25a47ee1UL, 0xcbd1880bd8cf4cb7UL, 0xc5a88185336e82d4UL, 0x9d18e5acf6b97e3bUL, 0x8ced18984b48fdc2UL, 0x97a31017b19e996eUL, 0x8b51030a66dd05a9UL, 0x3a31cb59ed72fc77UL, 0x80dbc4325b86072bUL, 0xfdbe0335fa6fceeaUL, 0xa4075747245150acUL, 0xc5a3e3e3ce4faaebUL, 0x1b78864b70c0e56UL, 0xfb7c066bf4df9dd5UL, 0x480eae8e48a2a159UL, 0x8b47c7c79c9f55d7UL, 0x9a6ee5cba30fe003UL, 0x24002fcd70edc79dUL, 0x22b80c4f78ae194cUL, 0xa74ffadf2d94f9aaUL, 0x34ddcb97461fc006UL, 0x48005f9ae1db8f3bUL, 0x4570189ef15c3298UL, 0x4e9ff5be5b29f354UL, 0xf0ba622c41287ca3UL, 0x42f89c2f5ae5e241UL, 0x3845606e0b533ecfUL, 0x2cff9e2ca2f9b4acUL, 0xe174c4588250f946UL, 0x85f1385eb5cbc483UL, 0x708ac0dc16a67d9eUL, 0x59ff3c5945f36958UL, 0x5be87db3c9b60e23UL, 0xd91a53a7f2c57530UL, 0x53b0d0ebc4a7a0c2UL, 0x23e0de29f4c80b4UL, 0x2ed10e655e7be0e9UL, 0x60cc84557cd81657UL, 0x15c4f08460a41a7aUL, 0xb5bc6e952a33536cUL, 0xc4a3e9c871e03d7dUL, 0x13612bb060e2d099UL, 0x992cb05b28a36f0bUL, 0xdab8a87a40ccf4dcUL, 0x104626922ed78655UL, 0xf43a747a58975d04UL, 0x80fc31e5b8ad85e9UL, 0x4b125a49533bbbdUL, 0x208c4d245daf0caaUL, 0xe874e8f4b12eba08UL, 0x1f863cb715b0bd3UL, 0x9624b492a67777bUL, 0xd8196f4a7649e5fbUL, 0x211f2f3fb0f8827UL, 0xb15596c50b5d4c58UL, 0xa304e3c24064bcf2UL, 0xb032de94ec93cbf6UL, 0x423e5e7f61f104fUL, 0x62ab2d8a16ba98b0UL, 0x4609c78480c979e5UL, 0x6065bd29d92797ecUL, 0x847cbcfec3e209fUL, 0xc5565b142d753160UL, 0x8c138f090192f3caUL, 0x59ca8f517f58d377UL, 0xc277b485412ebd09UL, 0x3809e77bb301393fUL, 0xa9e76b42178fb591UL, 0x2a94eba033a65a41UL, 0x56174a101b0f8625UL, 0xc2b69fa48fe92980UL, 0xe20ea3d43bb53926UL, 0x5529d740674cb482UL, 0xac2e9420361f0c4aUL, 0x856d3f491fd25300UL, 0xc41d47a8776a724dUL, 0x33525b82038e95abUL, 0x8aa50b5af56ce4a3UL, 0xb87f2fc1d64ffdfeUL, 0x39fafa00fa7eb69fUL, 0x66a4b704071d2b56UL, 0x154a16b5ead9c946UL, 0x70fe5f83ac9ffbfdUL, 0x73f5f401f4fd6d3fUL, 0x54489b0ac32daa03UL, 0xf86c0e714ce16ebbUL, 0x5359ee54b0d4ac05UL, 0x562b9d53fd50887aUL, 0x3190c3174b4ca8a9UL, 0x22203ff800902141UL, 0x14168dfa884203f4UL, 0x1d974ff7ee0b42f0UL, 0x6321862e96995152UL, 0x44407ff001204282UL, 0x282d1bf5108407e8UL, 0x3b2e9fefdc1685e0UL, 0xc6430c5d2d32a2a4UL, 0x8880ffe002408504UL, 0x505a37ea21080fd0UL, 0x765d3fdfb82d0bc0UL, 0x1587edb89772b9e7UL, 0xc3f9dcda9dd3f63eUL, 0x12113e87abfb445eUL, 0x5d7a0aef64f04584UL, 0xb20e2e73e3f28f61UL, 0x550b9aafa2f5104bUL, 0x96872c5cbe1dd342UL, 0xb34608edd4ad90cUL, 0x641c5ce7c7e51ec2UL, 0xaa17355f45ea2097UL, 0x2d0e58b97c3ba684UL, 0x1668c11dba95b219UL, 0x51394ccd42ddc12bUL, 0x86d649a41286bd19UL, 0xe8b9e021119c16f6UL, 0x9d11f76b61813636UL, 0x3b736c9848ac7ef9UL, 0xdf54b052bc5f8605UL, 0x63d69111cad37612UL, 0x8be39b86d7a83e69UL, 0xefe72c325c4f015dUL, 0x6c5143bfe1edf03dUL, 0x750873707c4db7daUL, 0xa607425dbbfa2ed6UL, 0x46cfad667589fe15UL, 0xa5aa4655a891c4cUL, 0x58b5b7b31170344bUL, 0xfdcef1eb635e0fa8UL, 0x149eafce26040085UL, 0xc64d6bd02c40c4afUL, 0x3ce3e35cb0b3369UL, 0x4a5d9686d2164d54UL, 0x293d5f9c4c08010aUL, 0x8c9ad7a05881895eUL, 0x79c7c6b961666d3UL, 0x94bb2d0da42c9aa8UL, 0xcb7b4a3a5507febbUL, 0xcbcd8c5a2851ee8bUL, 0xbd9da984c5c79658UL, 0x98b62f4b5cf36754UL, 0x96f69474aa0ffd76UL, 0x979b18b450a3dd17UL, 0x7b3b53098b8f2cb1UL, 0x316c5e96b9e6cea9UL, 0xb4ecddeb99080643UL, 0xfdce127238154618UL, 0x44d3f740fef5029cUL, 0xd318c87d6767cf56UL, 0xf0d84ed5ff07f029UL, 0x296407fee9787006UL, 0x3b02bfd214015ec6UL, 0x17f1e5aada65cca8UL, 0x78b168a933181cfdUL, 0x80302ce74ba21c3aUL, 0xc4a02ef7c1e9e673UL, 0x9e23be05a061cb54UL, 0xf162d152663039faUL, 0x6059ce97443874UL, 0x89405def83d3cce7UL, 0x3c477c0b40c396a9UL, 0x7bc457a601778f5bUL, 0xd2389087b7da8cdeUL, 0xa025ea8cee4cc231UL, 0xc94e8d46952d7f57UL, 0xf788af4c02ef1eb6UL, 0xa471210f6fb519bcUL, 0x404bd519dc998463UL, 0x929d1a8d2a5afeafUL, 0xef115e9805de3d6cUL, 0x48e2421edf6a3379UL, 0x8097aa33b93308c7UL, 0x253a351a54b5fd5eUL, 0xde22bd300bbc7ad8UL, 0x91c4843dbed466f3UL, 0x12f54677266118eUL, 0x4a746a34a96bfabdUL, 0x25448f62da6f091fUL, 0xf1712b61e4fa31d0UL, 0xb0fbf99d0d2778e2UL, 0x2528a139467da77eUL, 0xd388ebc779c9ee91UL, 0x301a75d950a69f97UL, 0xd352a269f3a5aa3aUL, 0xfb91372298511cf9UL, 0xa711d78ef393dd22UL, 0x6034ebb2a14d3f2fUL, 0xa6a544d3e74b5474UL, 0xf7226e4530a239f3UL, 0xd7225a1f2a3046ebUL, 0x1291f47fdbc88268UL, 0xffefd8f4277df317UL, 0x5f84a9da75ee21e3UL, 0x3745413c99777179UL, 0xf7dbcbe52ec3f8e6UL, 0x4d7ae0bba710bdd1UL, 0xec926e4ff7611c3UL, 0xf78b777bfff91e5dUL, 0x3d4fb4d0c4d50dfbUL, 0x28509024a7ca205cUL, 0xac523899ea467182UL, 0x76171bf532e5c015UL, 0xa8674abb10f8e7c0UL, 0xe204711aa67f1b47UL, 0xe9640463c026b100UL, 0xec2e37ea65cb802aUL, 0x50ce957621f1cf80UL, 0xc408e2354cfe368fUL, 0xd2c808c7804d6201UL, 0x415d9ad60680fcfbUL, 0x736509f6dab16336UL, 0x3ab49539701736e1UL, 0x145064df14309607UL, 0x1bbac0aec0160559UL, 0x343230f72c303a5bUL, 0xc7cc7b2109c5363dUL, 0x9960bcee3ccb7e0aUL, 0xae74745f4d3bf61dUL, 0xba9c42f4c1328881UL, 0x3d3da711fa613785UL, 0x83010c8c6d3cae11UL, 0xc5e91dbc57601095UL, 0xa7c0a6f31b37ed34UL, 0xc8de1f701d2934f4UL, 0xb7c26c48ced30e26UL, 0x8bd23b78aec0212aUL, 0x4f814de6366fda69UL, 0x91bc3ee03a5269e9UL, 0x6f84d8919da61c4dUL, 0x17a476f15d804254UL, 0x9f029bcc6cdfb4d3UL, 0x23787dc074a4d3d2UL, 0xdf09b1233b4c389bUL, 0x2f48ede2bb0084a8UL, 0x3e053798d9bf69a6UL, 0x46f0fb80e949a7a5UL, 0xbe13624676987136UL, 0x5e91dbc576010950UL, 0x7c0a6f31b37ed34cUL, 0x8de1f701d2934f4aUL, 0x7c26c48ced30e26cUL, 0x242242882115ee0fUL, 0x2aecfd79ffaf5aafUL, 0xa966bf504ccdc56bUL, 0x498dfc49cecb96ddUL, 0x48448510422bdc1eUL, 0x55d9faf3ff5eb55eUL, 0x52cd7ea0999b8ad6UL, 0x931bf8939d972dbbUL, 0x90890a208457b83cUL, 0xabb3f5e7febd6abcUL, 0xa59afd41333715acUL, 0x2637f1273b2e5b76UL, 0x2112144108af7078UL, 0x5767ebcffd7ad579UL, 0x4b35fa82666e2b59UL, 0x4c6fe24e765cb6edUL, 0x42242882115ee0f0UL, 0xaecfd79ffaf5aaf2UL, 0x966bf504ccdc56b2UL, 0x98dfc49cecb96ddaUL, 0x8448510422bdc1e0UL, 0x5d9faf3ff5eb55e4UL, 0x2cd7ea0999b8ad65UL, 0x31bf8939d972dbb5UL, 0x890a208457b83c0UL, 0xbb3f5e7febd6abc9UL, 0x59afd41333715acaUL, 0x637f1273b2e5b76aUL, 0x8820b11247e0fb2fUL, 0xa4869fe54effaba5UL, 0x1faf9758f09ee6aUL, 0x773e51b771613cd0UL, 0x104162248fc1f65eUL, 0x490d3fca9dff574bUL, 0x3f5f2eb1e13dcd5UL, 0xee7ca36ee2c279a0UL, 0x2082c4491f83ecbcUL, 0x921a7f953bfeae96UL, 0x7ebe5d63c27b9aaUL, 0xdcf946ddc584f340UL, 0x410588923f07d978UL, 0x2434ff2a77fd5d2cUL, 0xfd7cbac784f7355UL, 0xb9f28dbb8b09e680UL, 0x820b11247e0fb2f0UL, 0x4869fe54effaba58UL, 0x1faf9758f09ee6aaUL, 0x73e51b771613cd00UL, 0x4162248fc1f65e0UL, 0x90d3fca9dff574b1UL, 0x3f5f2eb1e13dcd54UL, 0xe7ca36ee2c279a00UL, 0x912db1933529376fUL, 0xf35fda4926b81555UL, 0xcc1b0c302b90c156UL, 0x7e54188c4ce56604UL, 0xbb5a9624a7459271UL, 0x34479788d422d69cUL, 0x2a934933becad952UL, 0x4d6844488d609e0dUL, 0xefb4d94b839cd84dUL, 0xba770c0b3117510eUL, 0xe783c334947ee95bUL, 0x2b10fdc10e6b6e1eUL, 0x46684795ca2e4c35UL, 0xa6163b0cfb7c5e2aUL, 0x7da2d73ac1168948UL, 0xe7e18ed2087c8e39UL, 0x8cd08f2b945c986aUL, 0x4c2c7619f6f8bc54UL, 0xfb45ae75822d1291UL, 0xcfc31da410f91c72UL, 0x19a11e5728b930d4UL, 0x9858ec33edf178a9UL, 0xf68b5ceb045a2522UL, 0x9f863b4821f238e5UL, 0xaa43c9ac9c659d07UL, 0xe249fb7d42b00d65UL, 0x5fb3e885e15f11baUL, 0x8ecc03c0574e23cfUL, 0xcd86665bf5dcc6a1UL, 0x166bd5e01c32e6fcUL, 0xdc280582b55788aUL, 0xac5872d0ba36159aUL, 0x9b0cccb7ebb98d42UL, 0x2cd7abc03865cdf9UL, 0x1b8500b056aaf114UL, 0x58b0e5a1746c2b34UL, 0xaf186c6d1a64e62bUL, 0x8b57749ae99967c4UL, 0x85af503344beb9d7UL, 0xa1be12fc72046cUL, 0x5e30d8da34c9cc56UL, 0x16aee935d332cf89UL, 0xb5ea066897d73afUL, 0x1437c25f8e408d9UL, 0xbc61b1b4699398acUL, 0x2d5dd26ba6659f12UL, 0x16bd40cd12fae75eUL, 0x286f84bf1c811b2UL, 0x78c36368d3273158UL, 0x5abba4d74ccb3e25UL, 0x2d7a819a25f5cebcUL, 0x50df097e3902364UL, 0xf186c6d1a64e62b0UL, 0xb57749ae99967c4aUL, 0x5af503344beb9d78UL, 0xa1be12fc72046c8UL, 0x7a0c78a1818b39cfUL, 0xb816b047aa7e04a2UL, 0x74f573b7e3c610eUL, 0xa5f7b70f9aeadf94UL, 0xf418f1430316739eUL, 0x702d608f54fc0944UL, 0xe9eae76fc78c21dUL, 0x4bef6e1f35d5bf28UL, 0xe831e286062ce73cUL, 0xe05ac11ea9f81289UL, 0x1d3d5cedf8f1843aUL, 0x97dedc3e6bab7e50UL, 0x4962300ec14e32d7UL, 0x124da127caa2d924UL, 0x88dfe8881808538aUL, 0x9e7dcd2cc3fcaea4UL, 0x92c4601d829c65aeUL, 0x249b424f9545b248UL, 0x11bfd1103010a714UL, 0x3cfb9a5987f95d49UL, 0x2588c03b0538cb5cUL, 0x4936849f2a8b6491UL, 0x237fa22060214e28UL, 0x79f734b30ff2ba92UL, 0xd2107574c7666a17UL, 0x40952a24cc443515UL, 0xf45a151329a9c7afUL, 0x422e1c360b4f2720UL, 0xa420eae98eccd42eUL, 0x812a544998886a2bUL, 0xe8b42a2653538f5eUL, 0x845c386c169e4e41UL, 0xd14020d1d08e54f3UL, 0xd0ac8b89a8422860UL, 0x63cd051f4f4c4542UL, 0xb97805883996ce87UL, 0xa28041a3a11ca9e6UL, 0xa1591713508450c1UL, 0xc79a0a3e9e988a85UL, 0x72f00b10732d9d0eUL, 0x45008347423953ccUL, 0x42b22e26a108a183UL, 0x8f34147d3d31150bUL, 0xe5e01620e65b3a1dUL, 0x1300f38c49655b37UL, 0x579c7f57db43bf31UL, 0xaccd79a9938971e9UL, 0x7a005911d81c263fUL, 0xbf00121a5fdd4ac1UL, 0x7dc0ddb52fd58255UL, 0xeb3fa200cef9b82dUL, 0x45c0c773a4921e7bUL, 0x7e002434bfba9582UL, 0xfb81bb6a5fab04abUL, 0xd67f44019df3705aUL, 0x8b818ee749243cf7UL, 0x6501bd6bb262d7abUL, 0x25fb55ce2604f561UL, 0x1e5bd950d20dbb4aUL, 0xa6c3689e86e22bebUL, 0xca037ad764c5af56UL, 0x4bf6ab9c4c09eac2UL, 0x3cb7b2a1a41b7694UL, 0x4d86d13d0dc457d6UL, 0xd0700ac049ca203UL, 0x45157422014129b2UL, 0xcbca3410a1ddb6d7UL, 0x2acdd72a0f22fda8UL, 0x830ff45ac42eb8a9UL, 0x58d2cb5e9bd0af53UL, 0x25313972aa503651UL, 0xe45bdb040aefa955UL, 0x9f1e1db7454a8dfdUL, 0x635db5a7aef3a290UL, 0xf8c723b6bd4b375dUL, 0x7977c358017500aeUL, 0xa73dce6c4782e755UL, 0x14434855c4b5b916UL, 0x432b163e937d3545UL, 0x432ff3e016405359UL, 0xd77a69da42123205UL, 0xfa7eb3b110398e1aUL, 0x34f37d2ecf113175UL, 0x379f9290382af4b6UL, 0xaef4d3b48424640aUL, 0xf4fd676220731c35UL, 0x69e6fa5d9e2262ebUL, 0x6f3f25207055e96cUL, 0xc4e8526bc55f34bbUL, 0x3b02edded9b4c45cUL, 0x6168a5e8d5af9e28UL, 0x6fbe3f10f40180dcUL, 0x10d151d547a995d9UL, 0xa4fdf8a72a3b748eUL, 0x70741a8242b467afUL, 0x6ebc0b71fca953bcUL, 0x21a2a3aa8f532bb2UL, 0x49fbf14e5476e91cUL, 0xe0e835048568cf5fUL, 0xdd7816e3f952a778UL, 0xda44b257d3b1abcbUL, 0x410fc18631bf2e0fUL, 0x73753b5ae33ac541UL, 0xb305897e60f1cf5UL, 0xb48964afa7635796UL, 0x821f830c637e5c1fUL, 0xe6ea76b5c6758a82UL, 0x1660b12fcc1e39eaUL, 0xf0133c5d83d15383UL, 0xd6c725025fae4408UL, 0x7f71bc3865004efaUL, 0x9d01170f8c9621d1UL, 0x79278db9cab55ba9UL, 0x7f76691e260e7426UL, 0x4c46292323ebc60aUL, 0x8bc25b4f0d8611a6UL, 0x6b4eee71587d4bfdUL, 0x2c14f126d54e147bUL, 0x2a290315ae3cd7ebUL, 0xa644c3ce0fa67148UL, 0x4f9c29e07ded6b55UL, 0x8ad1c15733ced4c1UL, 0xe6f75778b592f429UL, 0xfd49f2cc0be6b094UL, 0x639a6c236cd2a05UL, 0xc75ba1b4fecf55b5UL, 0x7f4bffa282ceb3acUL, 0x4b5390c80367332dUL, 0x9572b886a08da8a5UL, 0x5c4f607364cc575dUL, 0x4c32ae16ec763ca6UL, 0x276754c01264345eUL, 0x2ae5710d411b514aUL, 0xb89ec0e6c998aebbUL, 0x98655c2dd8ec794cUL, 0x4ecea98024c868bcUL, 0x55cae21a8236a294UL, 0x713d81cd93315d76UL, 0x30cab85bb1d8f299UL, 0x9d9d53004990d179UL, 0xab95c435046d4528UL, 0xe27b039b2662baecUL, 0x619570b763b1e532UL, 0x3b3aa6009321a2f2UL, 0xce2a7d68c5cd76ffUL, 0x160e242cd59789eeUL, 0x718fb03d2e88919aUL, 0xc7b5395132e917e0UL, 0x9c54fad18b9aedfeUL, 0x2c1c4859ab2f13ddUL, 0xe31f607a5d112334UL, 0x8f6a72a265d22fc0UL, 0xa1a800a1da222753UL, 0x8ac0b3a9cf0cdb8cUL, 0x749b91a753c91d97UL, 0xaf149014df0e0d85UL, 0xda51f4417953b209UL, 0xc7794449074b4b2eUL, 0x5b92721d4e7960d0UL, 0xefe95579aab6490eUL, 0x2da21d803fb098bdUL, 0x5c0aab8897c46a6aUL, 0x581b56975199a5eUL, 0x6e12dfa341c6c018UL, 0xc245ce02b276cdd5UL, 0x6aed740bb6da28e3UL, 0xb9a63b8103d86f43UL, 0x6de5ca169727d234UL, 0x1d8a6907a9fa6705UL, 0x722cb0df4e6adf0UL, 0xc1e92651ee5b8579UL, 0x6a0be17d3ae5f66dUL, 0xa215270d9ee332a5UL, 0xdcbdb501709fa7d7UL, 0x31771df0355c510dUL, 0x65d7b7aa6161bedfUL, 0x442a4e1b3dc6654aUL, 0xb97b6a02e13f4fafUL, 0x62ee3be06ab8a21bUL, 0xcbaf6f54c2c37dbeUL, 0x11556934b69b363bUL, 0xa00ef71f5b2c6369UL, 0x777926933c9a1fc8UL, 0x269eabf9912ca978UL, 0x22aad2696d366c76UL, 0x401dee3eb658c6d2UL, 0xeef24d2679343f91UL, 0x4d3d57f3225952f0UL, 0xdc5451d0177b2443UL, 0x52c3ff67f5e37193UL, 0x6f41cb1f1b8324ddUL, 0x2bbadab65018f7e5UL, 0xb8a8a3a02ef64886UL, 0xa587fecfebc6e327UL, 0xde83963e370649baUL, 0x5775b56ca031efcaUL, 0xe850b24290fb6da3UL, 0x99f7de854edf3a78UL, 0xfa27d2f87e7c88aUL, 0x1f2b1f8954c98d91UL, 0x49a09187ece127e9UL, 0xe1179e1004ec88c6UL, 0xade1ab0ce624caeaUL, 0x8f964a42bd394926UL, 0x9341230fd9c24fd2UL, 0xc22f3c2009d9118cUL, 0x5bc35619cc4995d5UL, 0x1f2c94857a72924dUL, 0x2682461fb3849fa4UL, 0x845e784013b22319UL, 0xb786ac3398932babUL, 0x3e59290af4e5249aUL, 0x4d048c3f67093f48UL, 0x8bcf08027644632UL, 0x6f0d586731265757UL, 0x7cb25215e9ca4935UL, 0x308ed7c0305823fUL, 0xc381c21ad79a7053UL, 0x6cbfe19d8ba7f551UL, 0x48a4d17bc73ec06eUL, 0x9f102ffacb1cf8d1UL, 0x55fba72f36661c91UL, 0x6bda9268fea4b15cUL, 0x2089d7a79ad7d2d8UL, 0x3e205ff59639f1a2UL, 0xabf74e5e6ccc3923UL, 0xd7b524d1fd4962b8UL, 0x4113af4f35afa5b0UL, 0x7c40bfeb2c73e344UL, 0x57ee9cbcd9987246UL, 0xaf6a49a3fa92c571UL, 0x82275e9e6b5f4b61UL, 0x61808ad495f03a27UL, 0x7d251a632a6218bbUL, 0xec71c2141cced11dUL, 0xb58ec86cc214c4c7UL, 0x5a00e0abe6f788e1UL, 0x28b217dccd96cd41UL, 0x6a46d57bd076f9c5UL, 0xdadde5899083db8bUL, 0xb401c157cdef11c2UL, 0x51642fb99b2d9a82UL, 0xd48daaf7a0edf38aUL, 0xb5bbcb132107b716UL, 0xf10277ad56c9df2bUL, 0x70307c69af09c932UL, 0x1bbe04bca830bcebUL, 0xdab7e37656a53c29UL, 0x7b051a58608442f9UL, 0x3298dbc9c7416e52UL, 0x85d9582ab98a2229UL, 0x4afb3bcb9e02a56UL, 0x6f0bc1b20c1f795dUL, 0xb7c9948917d02093UL, 0xb917e1069aff1fadUL, 0xb89f1229676a06a9UL, 0x47167666d5290e15UL, 0xbd6b0a08b6f2bd11UL, 0xc08a935edc1564a4UL, 0xc0fe5102da7e5f57UL, 0x172d19cf6745e085UL, 0xa82e370bf4b78615UL, 0x33b077ee51c192b6UL, 0x303cd755a056ecabUL, 0xb75bc69c039c3da5UL, 0x82a44d0d703df01dUL, 0xd5c5be8f4a687e92UL, 0xd1b9dbfb54078b52UL, 0xf7b6783aca2f87e5UL, 0xd7b0b90079291c0cUL, 0x192e2c4d7d3ba6daUL, 0x12b3c2a6bca544a1UL, 0xef6cf075945f0fcaUL, 0xaf617200f2523819UL, 0x325c589afa774db5UL, 0x2567854d794a8942UL, 0xded9e0eb28be1f94UL, 0x5ec2e401e4a47033UL, 0x64b8b135f4ee9b6bUL, 0x4acf0a9af2951284UL, 0xbdb3c1d6517c3f28UL, 0xbd85c803c948e067UL, 0xc971626be9dd36d6UL, 0x959e1535e52a2508UL, 0xe26676ae6fef82ffUL, 0xa9f3b31d0bc33cf8UL, 0x204795843a513652UL, 0x9afc5f3bdefe1815UL, 0x5dcd185e12c8f951UL, 0x811f45208ed485c6UL, 0xf22a7a5b9d49375aUL, 0x8438cb27a956622eUL, 0x229bc5bee8860e0dUL, 0xd0c6a95b84fbf7bbUL, 0x56f1a5e4d379354aUL, 0xb9b1e31f46069659UL, 0xdc367e7f1c1be0b5UL, 0x737571ad90a51341UL, 0x1f461a9a4f19316aUL, 0xc2a3b36e98a77eb6UL, 0xb86cfcfe3837c16aUL, 0xe6eae35b214a2683UL, 0x3e8c35349e3262d4UL, 0x854766dd314efd6cUL, 0xe9d80cfebd787e7bUL, 0x1f2de5acdbc6b130UL, 0xcfbd3b3ad58f9e56UL, 0xbb4eb8ea7637a8dcUL, 0xd3b019fd7af0fcf6UL, 0x3e5bcb59b78d6261UL, 0x9f7a7675ab1f3cacUL, 0x769d71d4ec6f51b9UL, 0xa76033faf5e1f9ecUL, 0x7cb796b36f1ac4c3UL, 0x3ef4eceb563e7958UL, 0xed3ae3a9d8dea373UL, 0x4ec067f5ebc3f3d8UL, 0xf96f2d66de358987UL, 0x7de9d9d6ac7cf2b0UL, 0xda75c753b1bd46e6UL, 0x4813ae91a901b1fUL, 0x202679d72539ef39UL, 0x4976e2feb112be9eUL, 0x52bfbf777d0dfc8UL, 0x90275d23520363eUL, 0x404cf3ae4a73de72UL, 0x92edc5fd62257d3cUL, 0xa57f7eeefa1bf90UL, 0x1204eba46a406c7cUL, 0x8099e75c94e7bce4UL, 0x25db8bfac44afa78UL, 0x14afefdddf437f21UL, 0xbd08224a19972457UL, 0xd3cbeda3b09d85ffUL, 0xf91246a6617eaf0eUL, 0x989faaebaa2cac46UL, 0xe311b196fe39b401UL, 0x756ff85df869f7c8UL, 0x4081dc1f2b1605e2UL, 0x80ff208740f30a89UL, 0xc623632dfc736802UL, 0xeadff0bbf0d3ef91UL, 0x8103b83e562c0bc4UL, 0x1fe410e81e61512UL, 0x1547335935f12cabUL, 0x747c26d78f52314UL, 0xb0a2212f45b34c76UL, 0xb23cf74d17667821UL, 0xb38f93b0a6f5a5f9UL, 0xdc77a7c068b8ba1fUL, 0xd3e1130d628dc313UL, 0xd5b99bca3a66a247UL, 0x671f27614deb4bf2UL, 0xb8ef4f80d171743fUL, 0xa7c2261ac51b8627UL, 0xab73379474cd448fUL, 0xce3e4ec29bd697e4UL, 0x71de9f01a2e2e87eUL, 0x4f844c358a370c4fUL, 0x56e66f28e99a891fUL, 0x57d6887fabad367UL, 0x31451d19dc972ccaUL, 0x2dadc938fd854361UL, 0x1c0cab01c79f403aUL, 0xafad10ff575a6ceUL, 0x628a3a33b92e5994UL, 0x5b5b9271fb0a86c2UL, 0x381956038f3e8074UL, 0x8cf4571d27fcb133UL, 0x17ec577deb0e4f1fUL, 0x41275b01ffe567bUL, 0xc1f2d9570ad752ecUL, 0x80e95b3882ee9ec9UL, 0xfd208de14f4e6208UL, 0xba81ba33d617f709UL, 0x3225c7fe0104f7dcUL, 0x1d2b67105dd3d92UL, 0xfa411bc29e9cc411UL, 0x75037467ac2fee13UL, 0x644b8ffc0209efb9UL, 0x9aa499e0c6ad878bUL, 0x267a149fa46b7415UL, 0x58a3b99cb1b487d8UL, 0x79576aa810b98d76UL, 0x354933c18d5b0f16UL, 0x4cf4293f48d6e82bUL, 0xb147733963690fb0UL, 0xf2aed55021731aecUL, 0xf3939281d7a1e283UL, 0x4b10716408ff2c61UL, 0xd02bb7212f39449fUL, 0x549ddff0564c67ddUL, 0xe7272503af43c506UL, 0x9620e2c811fe58c3UL, 0xa0576e425e72893eUL, 0xa93bbfe0ac98cfbbUL, 0x574fbf05939076a3UL, 0xfeb9e68abaae4db0UL, 0xf20b8dd7550e4982UL, 0xe3b70a914d9bcd73UL, 0x379e8b09ea3711e9UL, 0x2f8bee0fec0e6757UL, 0x56b24afd43f7c8faUL, 0x76ae60728f9dc8e3UL, 0x6f3d1613d46e23d2UL, 0x5f17dc1fd81cceaeUL, 0xad6495fa87ef91f4UL, 0xed5cc0e51f3b91c6UL, 0xde7a2c27a8dc47a4UL, 0xbe2fb83fb0399d5cUL, 0x5ac92bf50fdf23e8UL, 0xdab981ca3e77238dUL, 0xbcf4584f51b88f48UL, 0x7c5f707f60733ab9UL, 0xb59257ea1fbe47d1UL, 0xb57303947cee471aUL, 0x79e8b09ea3711e90UL, 0xf8bee0fec0e67573UL, 0x6b24afd43f7c8fa2UL, 0x6ae60728f9dc8e35UL, 0xf3d1613d46e23d20UL, 0xf17dc1fd81cceae6UL, 0xd6495fa87ef91f45UL, 0xd5cc0e51f3b91c6aUL, 0x7ea3377840d386efUL, 0x3003a0e19acb29faUL, 0x1e37ee0314196574UL, 0x1a5869f3f3d86ad1UL, 0x64479bf24cb0f171UL, 0xb2ff62d9acc4afc3UL, 0x8eca8d55c1d99117UL, 0x8570a6b7f31a87a6UL, 0x518ec2e654761e4dUL, 0xb706e6a9c0dba3b1UL, 0xaf304bf86a5879d0UL, 0xbb21383ff29f5d49UL, 0x3a1c70ce65fbc035UL, 0xbcf5ee4918e5bb55UL, 0xecc5c6a33d5ba85eUL, 0xc782052ff194e897UL, 0xed39149e06e07cc5UL, 0xab13ff88a8998a9dUL, 0x6b2edc15935c0b42UL, 0x3ec47f0ff783832bUL, 0x4373dc3ec0d70525UL, 0x84dfdc0bc861e90cUL, 0x64f8e978cf534d7aUL, 0xcc488b4ffbad5452UL, 0x1fe64d7f4cb9f6e5UL, 0xdb479b0d09912e2fUL, 0x7b5483a2774dc10aUL, 0x295163cfe3f0faa0UL, 0xa6cd6ffc54641165UL, 0x647715008a70a069UL, 0x440c56170770d9eaUL, 0xe362b2cfd34ba744UL, 0xd49b2afa65dfde65UL, 0x1a16091b8db3bce4UL, 0x3abdfd7de70ae82bUL, 0x770510cfb23d1c8cUL, 0x3037a0f606a84065UL, 0xe6d4312d823585feUL, 0xc7deaba827fe8ba9UL, 0x5fca54cf70d06b1cUL, 0x606f41ec0d5080caUL, 0xcda8625b046b0bfcUL, 0x8fbd57504ffd1753UL, 0xbf94a99ee1a0d639UL, 0x59df76dad7b6fd3bUL, 0x49a8e7ac9184ebcfUL, 0xaddffff376117558UL, 0xcee9266dd7ebfe77UL, 0x2abf18b7627a06d9UL, 0x41a9ec43ba5b2ba9UL, 0xe91aaeb505c9b14fUL, 0x2c12398bbb7daeebUL, 0x557e316ec4f40db2UL, 0x8353d88774b65752UL, 0xd2355d6a0b93629eUL, 0x5824731776fb5dd7UL, 0x33fd97df44ffe7cbUL, 0xd45f9214703e5293UL, 0x16cfeb87fecd9ec2UL, 0x188937ef95ce9abUL, 0x67fb2fbe89ffcf96UL, 0xa8bf2428e07ca526UL, 0x2d9fd70ffd9b3d85UL, 0x31126fdf2b9d356UL, 0x56f7aa7fdee86383UL, 0x83866b4b59abb67bUL, 0xe99aff4c12dd20f4UL, 0xb7e238abf1d9f4a8UL, 0x34eea1fd70c73ba9UL, 0xd5f4f58c2a0590c1UL, 0x6190afcbcc511a16UL, 0xde040407f719bb55UL, 0xf0dcb6f82c998bfdUL, 0x7911c802cd59ddb5UL, 0x71840ec471496fd2UL, 0xdc87d5ffa9924aeUL, 0x78b898f29424eb55UL, 0x20dbb31f03e1475cUL, 0x51ad4cdb0b79845bUL, 0xaa508fefe1981b58UL, 0x6870c4e7e55e2a05UL, 0x934f45249e90728fUL, 0x11ffc8e5ff185349UL, 0xe5616a8fd79a64b4UL, 0x49e07ccd07aba8a5UL, 0xf466a953a4721929UL, 0x915ac09817dbfd6cUL, 0x7b02a04fbb9e9b6cUL, 0xac10c98c240ade5UL, 0x3a3571bdd1b6ce65UL, 0x9010d063c65ca126UL, 0x47c535cf639764ddUL, 0x1582193184815bcaUL, 0x746ae37ba36d9ccaUL, 0x2021a0c78cb9424cUL, 0x8f8a6b9ec72ec9bbUL, 0xb205c761c4154b3bUL, 0x3a2de5eddf89c5a3UL, 0xf2e610dcf099df67UL, 0xaed4a26d9af7c172UL, 0xfd0a7bc1453d6ad9UL, 0xa6a3e8c126417770UL, 0x576970ea08d8e531UL, 0xec69318b2145d0e1UL, 0xfa14f7828a7ad5b2UL, 0x4d47d1824c82eee1UL, 0xaed2e1d411b1ca63UL, 0xd8d26316428ba1c2UL, 0x6d281a07d9e257cbUL, 0x4877801e005721f4UL, 0xef0092fbca88cf39UL, 0x64b37c91bd1181UL, 0x4351c10d7ed35339UL, 0x4217232699fcbfdfUL, 0x6ca474a47cfac58dUL, 0xb10913a937d07107UL, 0x86a3821afda6a672UL, 0x842e464d33f97fbeUL, 0xd948e948f9f58b1aUL, 0x621227526fa0e20eUL, 0xd470435fb4d4ce4UL, 0x85c8c9a67f2ff7dUL, 0xb291d291f3eb1635UL, 0xc4244ea4df41c41dUL, 0x1a8e086bf69a99c8UL, 0x10b91934cfe5fefaUL, 0x6523a523e7d62c6aUL, 0x88489d49be83883bUL, 0xac1de5d52022cf3fUL, 0xf38a1173069901c3UL, 0x78e21b142647032bUL, 0xa1514fc369ad4272UL, 0x583bcbaa40459e7eUL, 0xe71422e60d320387UL, 0xf1c436284c8e0657UL, 0x42a29f86d35a84e4UL, 0xb0779754808b3cfcUL, 0xce2845cc1a64070eUL, 0xe3886c50991c0cafUL, 0x85453f0da6b509c9UL, 0xf9eedbabcc018557UL, 0x4ea8a882ad9af22aUL, 0x75b589f2dbd342a0UL, 0xbb4a0b4b59c04197UL, 0x6adc42555514f601UL, 0x4fa9721fc2671862UL, 0x59ce42b65e4ddebfUL, 0xc75463c6a72ad12aUL, 0x4cb971a8673e10adUL, 0x4daac7251d9cccf3UL, 0x139d43f5570e681UL, 0x3f68b2dd5afff050UL, 0x731652036bddf5UL, 0x49adad50a26b65d1UL, 0xb0d6f92d430a96fdUL, 0xcf1110eaa155b2a4UL, 0x99e7d9a6cbc04745UL, 0x41a379bbdd843795UL, 0xd308a3096ffe7605UL, 0x2fe254855601374dUL, 0x33cfb34d97808e8aUL, 0x8346f377bb086f2bUL, 0xa6114612dffcec0aUL, 0x5fc4a90aac026e9bUL, 0xfe9e9399e216e1bbUL, 0xd475c5f5ef422261UL, 0xfe87dd76561283eaUL, 0xe4927454cae8f33UL, 0xfd3d2733c42dc376UL, 0xa8eb8bebde8444c3UL, 0xfd0fbaecac2507d5UL, 0x1c924e8a995d1e67UL, 0x637bbb65454c7a43UL, 0x832f34cd245a75b0UL, 0x48ba248ab1a15454UL, 0x88e4e84526106ecbUL, 0xc6f776ca8a98f486UL, 0x65e699a48b4eb60UL, 0x917449156342a8a9UL, 0x11c9d08a4c20dd96UL, 0x8deeed951531e90cUL, 0xcbcd3349169d6c1UL, 0x22e8922ac6855152UL, 0x2393a1149841bb2dUL, 0x1bdddb2a2a63d218UL, 0x1979a66922d3ad83UL, 0x45d124558d0aa2a4UL, 0x472742293083765aUL, 0x37bbb65454c7a430UL, 0x32f34cd245a75b06UL, 0x8ba248ab1a154548UL, 0x8e4e84526106ecb4UL, 0xf67699aa6498b4cfUL, 0xb71ebabe121c4a3bUL, 0xa5e1c005ddc1d16fUL, 0xad5d7df4d6a78b6dUL, 0xeced3354c931699eUL, 0x6e3d757c24389477UL, 0x4bc3800bbb83a2dfUL, 0x5abafbe9ad4f16dbUL, 0x40db93ab5f752f93UL, 0xe82c9e2d123d4d8UL, 0x252251449eec1e41UL, 0x4b582834e347fb2UL, 0x18b6d25473fda389UL, 0xcffdb0df3b155587UL, 0xf8e1f3dad433677dUL, 0xb8ab705688c2ad60UL, 0xa86c51aa2aecbbbdUL, 0x4d0342a4ef785739UL, 0x4366b6e6418d9504UL, 0xc09695fd052f08c5UL, 0xc9d9565698ce8bd5UL, 0x48fea65347a25244UL, 0x34683c9f6af071f7UL, 0x30ed5eaa1ef4438eUL, 0x93b2acad319d17aaUL, 0x91fd4ca68f44a489UL, 0x68d0793ed5e0e3eeUL, 0x61dabd543de8871cUL, 0xbe64ac58ae2dd3fbUL, 0xf102ba5787dbb524UL, 0x6305a32e422a9c22UL, 0x72750ff86f7b5c3cUL, 0x7cc958b15c5ba7f6UL, 0xe20574af0fb76a49UL, 0xc60b465c84553845UL, 0xe4ea1ff0def6b878UL, 0xf992b162b8b74fecUL, 0xc40ae95e1f6ed492UL, 0x8c168cb908aa708bUL, 0xc9d43fe1bded70f1UL, 0xf32562c5716e9fd8UL, 0x8815d2bc3edda925UL, 0x182d19721154e117UL, 0x93a87fc37bdae1e3UL, 0xe64ac58ae2dd3fb0UL, 0x102ba5787dbb524bUL, 0x305a32e422a9c22fUL, 0x2750ff86f7b5c3c6UL, 0xcc958b15c5ba7f60UL, 0x20574af0fb76a497UL, 0x60b465c84553845eUL, 0x4ea1ff0def6b878cUL, 0x2ae3294663026fUL, 0x9256b6fb6fbfb518UL, 0x73cd9ac3634c5343UL, 0x2c838b4bca7d5d1cUL, 0x55c6528cc604deUL, 0x24ad6df6df7f6a30UL, 0xe79b3586c698a687UL, 0x5907169794faba38UL, 0xab8ca5198c09bcUL, 0x495adbedbefed460UL, 0xcf366b0d8d314d0eUL, 0xb20e2d2f29f57471UL, 0x9856ec48fe0fefd7UL, 0x404d94c1e4af54f7UL, 0x2cc98748f389c1e3UL, 0xd5dc2f0e4740bae7UL, 0x30add891fc1fdfaeUL, 0x809b2983c95ea9efUL, 0x59930e91e71383c6UL, 0xabb85e1c8e8175ceUL, 0xf85a4421352843f3UL, 0xd3ce701d0befafe9UL, 0x1834c7027cc5c72UL, 0xe6b0c96909a8b998UL, 0x69b57d40a7477b49UL, 0x7564c3208e8da3e4UL, 0xb1a3c9b3a673e31aUL, 0x7ca1e78207fb2134UL, 0x4a6b0f8383990a3dUL, 0x3831a55b8449bbffUL, 0xd1e2c234a50c9dcbUL, 0x4883ba541b5c106dUL, 0xdd7ea05ca25e8d5UL, 0xa29b69ad91c18bc9UL, 0x1160d53aa3f26069UL, 0x20c701f8221272dfUL, 0x82ae2109595c2d05UL, 0x97cef041bad1eba5UL, 0x9064fb26ae0f9b2cUL, 0xf04e76a0508eb7baUL, 0x55c4212b2b85a0aUL, 0x2f9de08375a3d74bUL, 0x20c9f64d5c1f3659UL, 0xe09ced40a11d6f75UL, 0xab884256570b414UL, 0x5f3bc106eb47ae96UL, 0x4193ec9ab83e6cb2UL, 0xc139da81423adeeaUL, 0x1571084acae16828UL, 0xbe77820dd68f5d2cUL, 0x8327d935707cd964UL, 0x8273b5028475bdd4UL, 0x2ae2109595c2d050UL, 0x7cef041bad1eba58UL, 0x64fb26ae0f9b2c9UL, 0x4e76a0508eb7ba9UL, 0x55c4212b2b85a0a0UL, 0xf9de08375a3d74b0UL, 0xc9f64d5c1f36592UL, 0x9ced40a11d6f752UL, 0xab884256570b4140UL, 0xf3bc106eb47ae960UL, 0x193ec9ab83e6cb25UL, 0x139da81423adeea4UL, 0xce1171ae63017e2fUL, 0x358003c7f1a72ef6UL, 0x80d8c204ee26cdb4UL, 0x96fb257853f18f4cUL, 0x523165e0b1500f1UL, 0xb9f824957a1ca1daUL, 0xb314d55a35a6c097UL, 0x9c363fa0b3494c9dUL, 0x9347d9bedb3dfd4dUL, 0xa1086a306d6bbf83UL, 0xd48cfbe782a6dad0UL, 0x89ac0a117238cb3fUL, 0xbf8e467f7b6c0635UL, 0x90e8f77a43858330UL, 0x1bbca69ceca6ee5eUL, 0xa2986172f0dbc47bUL, 0xe61d79fc3bcff0c5UL, 0xf329cdee1e59fa56UL, 0x85dc1c6a30a68742UL, 0xf4f0b7b5f51ddaf2UL, 0xcc3af3f8779fe18aUL, 0xe6539bdc3cb3f4adUL, 0xbb838d4614d0e85UL, 0xe9e16f6bea3bb5e5UL, 0x17412f222283fbbUL, 0x1e5f14a2e035156cUL, 0xa5d520fb2b7146f4UL, 0x6202ab87c0dd39ceUL, 0x2e825e444507f76UL, 0x3cbe2945c06a2ad8UL, 0x4baa41f656e28de8UL, 0xc405570f81ba739dUL, 0x5d04bc888a0feecUL, 0x797c528b80d455b0UL, 0x975483ecadc51bd0UL, 0x880aae1f0374e73aUL, 0x92a16293dc560177UL, 0x2000860d98fa5757UL, 0x9c0c568ab2616c5fUL, 0xa1d5296e12439c71UL, 0x2542c527b8ac02eeUL, 0x40010c1b31f4aeafUL, 0x3818ad1564c2d8beUL, 0x43aa52dc248738e3UL, 0x4a858a4f715805dcUL, 0x8002183663e95d5eUL, 0x70315a2ac985b17cUL, 0x8754a5b8490e71c6UL, 0xc0ae19c2fa7f717UL, 0xd2fc13765e80468bUL, 0x52c7e5067ae03906UL, 0xbf693e2086b6b188UL, 0x8114363a92581281UL, 0x770005f624527121UL, 0x172a9b5f1c2b29f2UL, 0xcf12091119c73114UL, 0x2286c7524b02502UL, 0xee000bec48a4e243UL, 0x2e5536be385653e4UL, 0x9e241222338e6228UL, 0x9d512de88477b6abUL, 0xef834c2081b38b1UL, 0xee0f3c2f9947fc36UL, 0x8d88511473b69654UL, 0x3aa25bd108ef6d56UL, 0x1df0698410367163UL, 0xdc1e785f328ff86cUL, 0x1b10a228e76d2ca9UL, 0x7544b7a211dedaacUL, 0x3be0d308206ce2c6UL, 0xb83cf0be651ff0d8UL, 0x36214451ceda5953UL, 0xea896f4423bdb558UL, 0x77c1a61040d9c58cUL, 0x7079e17cca3fe1b0UL, 0x6c4288a39db4b2a7UL, 0xd512de88477b6ab0UL, 0xef834c2081b38b19UL, 0xe0f3c2f9947fc360UL, 0xd88511473b69654eUL, 0xaa25bd108ef6d560UL, 0xdf06984103671633UL, 0xc1e785f328ff86c1UL, 0xb10a228e76d2ca9dUL, 0x544b7a211dedaac0UL, 0xbe0d308206ce2c67UL, 0x83cf0be651ff0d83UL, 0x6214451ceda5953bUL, 0xa896f4423bdb5580UL, 0x7c1a61040d9c58ceUL, 0x79e17cca3fe1b07UL, 0xc4288a39db4b2a77UL, 0x512de88477b6ab00UL, 0xf834c2081b38b19dUL, 0xf3c2f9947fc360eUL, 0x88511473b69654eeUL, 0x3b5a240a227aaaafUL, 0x2291a70aaf239f0dUL, 0xacdd0e61661337e2UL, 0xa1625db77986fbd8UL, 0xefb5bd1689e2a9f1UL, 0x97db6d0fc715c22dUL, 0xeb1f4d9125cd343bUL, 0xf304ce3ee7a7a5b5UL, 0xdf6b7a2d13c553e2UL, 0x2fb6da1f8e2b845bUL, 0xd63e9b224b9a6877UL, 0xe6099c7dcf4f4b6bUL, 0xbed6f45a278aa7c4UL, 0x5f6db43f1c5708b7UL, 0xac7d36449734d0eeUL, 0xcc1338fb9e9e96d7UL, 0x7dade8b44f154f88UL, 0xbedb687e38ae116fUL, 0x58fa6c892e69a1dcUL, 0x982671f73d3d2dafUL, 0x625a246a533d63bfUL, 0xaf4ef3e6e80edee9UL, 0x3518841b5381846UL, 0x818c96be6ed0095aUL, 0x5db5bdd66b6d3bd1UL, 0x8c65c4d7494f41e5UL, 0xb40641d0839b6b72UL, 0xb2d9582cc90a40b0UL, 0x226a8eae1bcd8b0dUL, 0xca33aab40bcc7ffdUL, 0xdaa9d2f2eedd8d1aUL, 0xd472c50986bed365UL, 0x44d51d5c379b161aUL, 0x946755681798fffaUL, 0xb553a5e5ddbb1a35UL, 0xa8e58a130d7da6cbUL, 0x89aa3ab86f362c34UL, 0x28ceaad02f31fff4UL, 0x6aa74bcbbb76346bUL, 0x51cb14261afb4d97UL, 0x8a558072137ba4c7UL, 0x836576bac73103deUL, 0x67ebc6c49f073329UL, 0x12565d1c215cc92aUL, 0x8daaf5e6ebe0b521UL, 0xd432ce6f1730fb8aUL, 0x7d72dcdad7e53dacUL, 0x956ccf685613c050UL, 0x1b55ebcdd7c16a42UL, 0xa8659cde2e61f715UL, 0xfae5b9b5afca7b59UL, 0x2ad99ed0ac2780a0UL, 0x36abd79baf82d484UL, 0x50cb39bc5cc3ee2aUL, 0xf5cb736b5f94f6b3UL, 0x55b33da1584f0141UL, 0x6d57af375f05a908UL, 0xa1967378b987dc54UL, 0xeb96e6d6bf29ed66UL, 0xab667b42b09e0283UL, 0x43aeab6c731caebfUL, 0x91d4c5ebea5d449fUL, 0x65889cfe97b88132UL, 0xe70c83d575965703UL, 0x1e5ca3da2b2ea1d1UL, 0xf151a8cd4de87509UL, 0x79b468aec69a599aUL, 0x7fd972faff86fc02UL, 0x3cb947b4565d43a2UL, 0xe2a3519a9bd0ea12UL, 0xf368d15d8d34b335UL, 0xffb2e5f5ff0df804UL, 0xe0737a6a61ad7bebUL, 0x17be802faef32813UL, 0x5474f3e8f3823d94UL, 0x4ea5bebbeab1a20dUL, 0xc0e6f4d4c35af7d6UL, 0x2f7d005f5de65027UL, 0xa8e9e7d1e7047b28UL, 0x9d4b7d77d563441aUL, 0x81cde9a986b5efacUL, 0x5efa00bebbcca04fUL, 0x51d3cfa3ce08f650UL, 0x3a96faefaac68835UL, 0x9a9a2651c07c23f7UL, 0x6f0c2267eecbbca8UL, 0x1102ce1475fab75fUL, 0xc4ed808f4127426eUL, 0x35344ca380f847eeUL, 0xde1844cfdd977951UL, 0x22059c28ebf56ebeUL, 0x89db011e824e84dcUL, 0x6a68994701f08fdcUL, 0xbc30899fbb2ef2a2UL, 0x440b3851d7eadd7dUL, 0x13b6023d049d09b8UL, 0xd4d1328e03e11fb8UL, 0x7861133f765de544UL, 0x881670a3afd5bafbUL, 0x276c047a093a1370UL, 0x30a3901ecad5c3dfUL, 0x223a056475e936beUL, 0xa289b014b6402e09UL, 0xff187da406de74e5UL, 0x6147203d95ab87beUL, 0x44740ac8ebd26d7cUL, 0x451360296c805c12UL, 0xfe30fb480dbce9cbUL, 0x5b8fb579e640f3d3UL, 0x5a10368b4ef626cfUL, 0x3883910130ebe3dbUL, 0x4da183c00fd38192UL, 0xb71f6af3cc81e7a6UL, 0xb4206d169dec4d9eUL, 0x7107220261d7c7b6UL, 0x9b4307801fa70324UL, 0xf73f20e5541433e3UL, 0xbab8f937a28a670aUL, 0x50ab15572a44d492UL, 0x87467a502be4544cUL, 0xee7e41caa82867c6UL, 0x7571f26f4514ce15UL, 0xa1562aae5489a925UL, 0xe8cf4a057c8a898UL, 0xdcfc83955050cf8cUL, 0xeae3e4de8a299c2bUL, 0x42ac555ca913524aUL, 0x1d19e940af915131UL, 0xb9f9072aa0a19f18UL, 0xd5c7c9bd14533857UL, 0x8558aab95226a495UL, 0x3a33d2815f22a262UL, 0xeaf3fb578c54c29fUL, 0x7977b060b1f48c98UL, 0xb81404214da612d4UL, 0xc5a7d052aaef16c1UL, 0x4ce603add5be7991UL, 0x201743dbfabbe506UL, 0xc28d591172a77e57UL, 0x3a8fd5f541747f87UL, 0xcdf259666b0f8dUL, 0x92d6a4ad6c25363bUL, 0x37bfe3710ca5a751UL, 0xc4dfdeba9642ad0bUL, 0x989a11b001c1e3b5UL, 0xf7556a4041189041UL, 0xddda97b1f0a0155cUL, 0x387fc825382f0812UL, 0xa835d662ce943bc5UL, 0x3c52f79a1b63dcb4UL, 0x9107e3008ab7146UL, 0xc13fe51a64f44221UL, 0x506bacc59d28778aUL, 0x78a5ef3436c7b969UL, 0x1220fc601156e28cUL, 0x827fca34c9e88442UL, 0xa0d7598b3a50ef14UL, 0xf14bde686d8f72d2UL, 0x2441f8c022adc518UL, 0x4ff946993d10884UL, 0x41aeb31674a1de28UL, 0xe297bcd0db1ee5a5UL, 0x4883f180455b8a31UL, 0x9ff28d327a21108UL, 0x1a5c932e245440ffUL, 0x17d75abb2f6f377dUL, 0x23a2b253635c4f9cUL, 0xa23e24f65bee7014UL, 0x34b9265c48a881feUL, 0x2faeb5765ede6efaUL, 0x474564a6c6b89f38UL, 0x447c49ecb7dce028UL, 0x69724cb8915103fcUL, 0x5f5d6aecbdbcddf4UL, 0x8e8ac94d8d713e70UL, 0x88f893d96fb9c050UL, 0x4be56c73efb5fb57UL, 0x6c42f6c3e22b47dfUL, 0xafb0c3c8f309271fUL, 0xa03152e2cbd9d2a5UL, 0xecb2de5127c0a01UL, 0xa7dce9d5d047389UL, 0xedc4d6c20ff915c1UL, 0xf1a2d0958319f74fUL, 0x1d965bca24f81402UL, 0x14fb9d3aba08e712UL, 0xdb89ad841ff22b82UL, 0xe345a12b0633ee9fUL, 0xa22d429684e7d4abUL, 0xfb0f196fed433213UL, 0x5b60a5bd60f0cfbUL, 0x774b370618cd8f3bUL, 0xdd5b702fc4d855f9UL, 0x24e611c543d49810UL, 0xb9c945e445f54208UL, 0x5f561b5c25314c72UL, 0xbab6e05f89b0abf2UL, 0x49cc238a87a93021UL, 0x73928bc88bea8410UL, 0xbeac36b84a6298e5UL, 0x756dc0bf136157e4UL, 0x939847150f526043UL, 0xe725179117d50820UL, 0x7d586d7094c531caUL, 0x73da747cebd55367UL, 0xf5c8ad3087f63cb1UL, 0x7cef7e71c6414bbeUL, 0x4b70afb13d203191UL, 0xe7b4e8f9d7aaa6ceUL, 0xeb915a610fec7962UL, 0xf9defce38c82977dUL, 0x96e15f627a406322UL, 0x566824f16242b133UL, 0x5da97d8868a0ef2UL, 0x4118a894f0ee7504UL, 0x9c02cb94e02a9441UL, 0x35d1bce009929ec9UL, 0xd94d0cab9446e1d3UL, 0x3094007a0837b1f7UL, 0x89c5e279d4ff7a86UL, 0x6ba379c013253d92UL, 0xb29a1957288dc3a6UL, 0x612800f4106f63efUL, 0x138bc4f3a9fef50cUL, 0x4e470682eb5d878bUL, 0xb7cc11b4c8497b7bUL, 0x70f550bbc9359c20UL, 0x96d7fcb74757b81cUL, 0x58ff8071bacf3b9UL, 0xbd60007309c00ac1UL, 0x534ff0247b8063beUL, 0x9c6f8c3e9a05223cUL, 0x921e050cfa4e1bddUL, 0xa83823fc8ad2e9b5UL, 0x143ab11b1eeb9c82UL, 0x891f6d2d20a0167cUL, 0x243c0a19f49c37baUL, 0x507047f915a5d36bUL, 0x287562363dd73905UL, 0x123eda5a41402cf8UL, 0x48781433e9386f74UL, 0xa0e08ff22b4ba6d6UL, 0x50eac46c7bae720aUL, 0x247db4b4828059f0UL, 0x90f02867d270dee8UL, 0x41c11fe456974dacUL, 0xa1d588d8f75ce415UL, 0x48fb69690500b3e0UL, 0x21e050cfa4e1bdd0UL, 0x83823fc8ad2e9b59UL, 0x43ab11b1eeb9c82aUL, 0x91f6d2d20a0167c1UL, 0xdac1549d84d4870fUL, 0xd5fc5c8bc30fca85UL, 0x35f372303498cbaaUL, 0x922dd0f400a89d86UL, 0x2c835c39c4bef2b1UL, 0x79009a0d1f4d693cUL, 0xd943b53380daccaaUL, 0x959bd4b815fb6908UL, 0x5906b873897de562UL, 0xf201341a3e9ad278UL, 0xb2876a6701b59954UL, 0x2b37a9702bf6d211UL, 0x2b0c85e5dfec366bUL, 0x36fa4b2ee46758c7UL, 0xd7ab859dea806956UL, 0xe7af27b04347f627UL, 0xcf18fec972cf9079UL, 0xbf0cb547519c4db9UL, 0x1df25a683ceb8953UL, 0x7e9e3a309225be4bUL, 0x73008902888dc5dUL, 0xace149943a6a6744UL, 0x8941e583903c4958UL, 0x4cfc013130e12e92UL, 0xe6011205111b8baUL, 0x59c2932874d4ce88UL, 0x1283cb07207892b1UL, 0x99f8026261c25d25UL, 0x85c1d7426f348ddbUL, 0x617d054a70fb6127UL, 0x97a2c75da91a7e9dUL, 0x82307194d72ee84eUL, 0xb83ae84de691bb6UL, 0xc2fa0a94e1f6c24fUL, 0x2f458ebb5234fd3aUL, 0x460e329ae5dd09dUL, 0x17075d09bcd2376cUL, 0x85f41529c3ed849eUL, 0x5e8b1d76a469fa75UL, 0x8c1c6535cbba13aUL, 0x2e0eba1379a46ed8UL, 0xbe82a5387db093cUL, 0xbd163aed48d3f4ebUL, 0x11838ca6b9774274UL, 0x5c1d7426f348ddb0UL, 0x17d054a70fb61278UL, 0x7a2c75da91a7e9d6UL, 0x2307194d72ee84e9UL, 0x213b1d4f2b8647cfUL, 0xfd588a54863ed8c7UL, 0x46fdbae6caa48853UL, 0xf7ce47caf1775bd6UL, 0x42763a9e570c8f9eUL, 0xfab114a90c7db18eUL, 0x8dfb75cd954910a7UL, 0xef9c8f95e2eeb7acUL, 0x84ec753cae191f3cUL, 0xf562295218fb631cUL, 0x1bf6eb9b2a92214fUL, 0xdf391f2bc5dd6f59UL, 0x9d8ea795c323e78UL, 0xeac452a431f6c639UL, 0x37edd7365524429fUL, 0xbe723e578bbadeb2UL, 0x8ab021f07573805fUL, 0x7708652fabf7045UL, 0xdd7eff3f43a3dec0UL, 0xcd2409ff03dfef60UL, 0x156043e0eae700beUL, 0xee10ca5f57ee08bUL, 0xbafdfe7e8747bd80UL, 0x9a4813fe07bfdec1UL, 0x2ac087c1d5ce017cUL, 0x1dc2194beafdc116UL, 0x75fbfcfd0e8f7b00UL, 0x349027fc0f7fbd83UL, 0xcc80fa81668bfe57UL, 0xe97c118d4ca97e1bUL, 0x5952a8a9f4f5adffUL, 0xd8e03aa80a552902UL, }; + +#endif diff --git a/crypto_kem/hqc-192/avx2/gf.c b/crypto_kem/hqc-192/avx2/gf.c new file mode 100644 index 00000000..262bd271 --- /dev/null +++ b/crypto_kem/hqc-192/avx2/gf.c @@ -0,0 +1,167 @@ +#include "gf.h" +#include "parameters.h" +#include +#include +#include +/** + * @file gf.c + * Galois field implementation with multiplication using the pclmulqdq instruction + */ + + +static uint16_t gf_reduce(uint64_t x, size_t deg_x); +static uint16_t gf_quad(uint64_t a); + + + +/** + * Logarithm of elements of GF(2^10) to the base alpha (root of x^10 + x^3 + 1). + * The logarithm of 0 is set to 1024 by convention. + */ +static const uint16_t log[1024] = { + 1024, 0, 1, 77, 2, 154, 78, 956, 3, 10, 155, 325, 79, 618, 957, 231, 4, 308, 11, 200, 156, 889, 326, 695, 80, 24, 619, 87, 958, 402, 232, 436, 5, 513, 309, 551, 12, 40, 201, 479, 157, 518, 890, 101, 327, 164, 696, 860, 81, 258, 25, 385, 620, 277, 88, 577, 959, 772, 403, 680, 233, 52, 437, 966, 6, 20, 514, 768, 310, 650, 552, 129, 13, 314, 41, 849, 202, 757, 480, 980, 158, 213, 519, 335, 891, 462, 102, 907, 328, 654, 165, 264, 697, 369, 861, 354, 82, 675, 259, 590, 26, 628, 386, 991, 621, 556, 278, 822, 89, 219, 578, 117, 960, 937, 773, 533, 404, 491, 681, 241, 234, 133, 53, 595, 438, 178, 967, 943, 7, 1020, 21, 305, 515, 510, 769, 255, 311, 17, 651, 210, 553, 672, 130, 934, 14, 1017, 315, 1014, 42, 610, 850, 191, 203, 318, 758, 31, 481, 428, 981, 568, 159, 613, 214, 752, 520, 667, 336, 788, 892, 45, 463, 801, 103, 525, 908, 705, 329, 194, 655, 1008, 166, 642, 265, 296, 698, 853, 370, 633, 862, 899, 355, 779, 83, 321, 676, 97, 260, 845, 591, 818, 27, 206, 629, 797, 387, 793, 992, 727, 622, 34, 557, 661, 279, 420, 823, 834, 90, 761, 220, 391, 579, 926, 118, 451, 961, 431, 938, 349, 774, 563, 534, 446, 405, 484, 492, 731, 682, 341, 242, 714, 235, 571, 134, 290, 54, 412, 596, 140, 439, 984, 179, 996, 968, 810, 944, 539, 8, 616, 1021, 152, 22, 400, 306, 887, 516, 162, 511, 38, 770, 50, 256, 275, 312, 755, 18, 648, 652, 367, 211, 460, 554, 217, 673, 626, 131, 176, 935, 489, 15, 670, 1018, 508, 316, 426, 1015, 608, 43, 523, 611, 665, 851, 897, 192, 640, 204, 791, 319, 843, 759, 924, 32, 418, 482, 339, 429, 561, 982, 808, 569, 410, 160, 48, 614, 398, 215, 174, 753, 365, 521, 895, 668, 424, 337, 806, 789, 922, 893, 804, 46, 172, 464, 872, 802, 870, 104, 466, 526, 283, 909, 874, 706, 736, 330, 528, 195, 380, 656, 285, 1009, 1003, 167, 106, 643, 838, 266, 468, 297, 66, 699, 708, 854, 111, 371, 738, 634, 60, 863, 911, 900, 827, 356, 876, 780, 497, 84, 197, 322, 74, 677, 382, 98, 548, 261, 332, 846, 765, 592, 530, 819, 587, 28, 1011, 207, 302, 630, 1005, 798, 749, 388, 658, 794, 94, 993, 287, 728, 346, 623, 645, 35, 149, 558, 840, 662, 505, 280, 169, 421, 395, 824, 108, 835, 377, 91, 299, 762, 71, 221, 68, 392, 146, 580, 268, 927, 224, 119, 470, 452, 687, 962, 856, 432, 227, 939, 113, 350, 976, 775, 701, 564, 930, 535, 710, 447, 723, 406, 636, 485, 271, 493, 62, 732, 918, 683, 373, 342, 583, 243, 740, 715, 719, 236, 902, 572, 690, 135, 829, 291, 186, 55, 865, 413, 455, 597, 913, 141, 744, 440, 782, 985, 473, 180, 499, 997, 602, 969, 358, 811, 122, 945, 878, 540, 247, 9, 324, 617, 230, 1022, 76, 153, 955, 23, 86, 401, 435, 307, 199, 888, 694, 517, 100, 163, 859, 512, 550, 39, 478, 771, 679, 51, 965, 257, 384, 276, 576, 313, 848, 756, 979, 19, 767, 649, 128, 653, 263, 368, 353, 212, 334, 461, 906, 555, 821, 218, 116, 674, 589, 627, 990, 132, 594, 177, 942, 936, 532, 490, 240, 16, 209, 671, 933, 1019, 304, 509, 254, 317, 30, 427, 567, 1016, 1013, 609, 190, 44, 800, 524, 704, 612, 751, 666, 787, 852, 632, 898, 778, 193, 1007, 641, 295, 205, 796, 792, 726, 320, 96, 844, 817, 760, 390, 925, 450, 33, 660, 419, 833, 483, 730, 340, 713, 430, 348, 562, 445, 983, 995, 809, 538, 570, 289, 411, 139, 161, 37, 49, 274, 615, 151, 399, 886, 216, 625, 175, 488, 754, 647, 366, 459, 522, 664, 896, 639, 669, 507, 425, 607, 338, 560, 807, 409, 790, 842, 923, 417, 894, 423, 805, 921, 47, 397, 173, 364, 465, 282, 873, 735, 803, 171, 871, 869, 105, 837, 467, 65, 527, 379, 284, 1002, 910, 826, 875, 496, 707, 110, 737, 59, 331, 764, 529, 586, 196, 73, 381, 547, 657, 93, 286, 345, 1010, 301, 1004, 748, 168, 394, 107, 376, 644, 148, 839, 504, 267, 223, 469, 686, 298, 70, 67, 145, 700, 929, 709, 722, 855, 226, 112, 975, 372, 582, 739, 718, 635, 270, 61, 917, 864, 454, 912, 743, 901, 689, 828, 185, 357, 121, 877, 246, 781, 472, 498, 601, 85, 434, 198, 693, 323, 229, 75, 954, 678, 964, 383, 575, 99, 858, 549, 477, 262, 352, 333, 905, 847, 978, 766, 127, 593, 941, 531, 239, 820, 115, 588, 989, 29, 566, 1012, 189, 208, 932, 303, 253, 631, 777, 1006, 294, 799, 703, 750, 786, 389, 449, 659, 832, 795, 725, 95, 816, 994, 537, 288, 138, 729, 712, 347, 444, 624, 487, 646, 458, 36, 273, 150, 885, 559, 408, 841, 416, 663, 638, 506, 606, 281, 734, 170, 868, 422, 920, 396, 363, 825, 495, 109, 58, 836, 64, 378, 1001, 92, 344, 300, 747, 763, 585, 72, 546, 222, 685, 69, 144, 393, 375, 147, 503, 581, 717, 269, 916, 928, 721, 225, 974, 120, 245, 471, 600, 453, 742, 688, 184, 963, 574, 857, 476, 433, 692, 228, 953, 940, 238, 114, 988, 351, 904, 977, 126, 776, 293, 702, 785, 565, 188, 931, 252, 536, 137, 711, 443, 448, 831, 724, 815, 407, 415, 637, 605, 486, 457, 272, 884, 494, 57, 63, 1000, 733, 867, 919, 362, 684, 143, 374, 502, 343, 746, 584, 545, 244, 599, 741, 183, 716, 915, 720, 973, 237, 987, 903, 125, 573, 475, 691, 952, 136, 442, 830, 814, 292, 784, 187, 251, 56, 999, 866, 361, 414, 604, 456, 883, 598, 182, 914, 972, 142, 501, 745, 544, 441, 813, 783, 250, 986, 124, 474, 951, 181, 971, 500, 543, 998, 360, 603, 882, 970, 542, 359, 881, 812, 249, 123, 950, 946, 947, 879, 948, 541, 880, 248, 949 +}; + + + +/** + * Returns the integer i such that elt = a^i + * where a is the primitive element of GF(2^GF_M). + *@returns the logarithm of the given element + */ +uint16_t PQCLEAN_HQC192_AVX2_gf_log(uint16_t elt) { + return log[elt]; +} + + + +/** + * Reduces polynomial x modulo primitive polynomial GF_POLY. + * @returns x mod GF_POLY + * @param[in] x Polynomial of degree less than 64 + * @param[in] deg_x The degree of polynomial x + */ +uint16_t gf_reduce(uint64_t x, size_t deg_x) { + // Compute the distance between the primitive polynomial first two set bits + size_t lz1 = __builtin_clz(PARAM_GF_POLY); + size_t lz2 = __builtin_clz(PARAM_GF_POLY ^ 1 << PARAM_M); + size_t dist = lz2 - lz1; + + // Deduce the number of steps of reduction + size_t steps = CEIL_DIVIDE(deg_x - (PARAM_M - 1), dist); + + // Reduce + for (size_t i = 0; i < steps; ++i) { + uint64_t mod = x >> PARAM_M; + x &= (1 << PARAM_M) - 1; + x ^= mod; + + size_t tz1 = 0; + uint16_t rmdr = PARAM_GF_POLY ^ 1; + for (size_t j = __builtin_popcount(PARAM_GF_POLY) - 2; j; --j) { + size_t tz2 = __builtin_ctz(rmdr); + size_t shift = tz2 - tz1; + mod <<= shift; + x ^= mod; + rmdr ^= 1 << tz2; + tz1 = tz2; + } + } + + return x; +} + + + +/** + * Multiplies two elements of GF(2^GF_M). + * @returns the product a*b + * @param[in] a Element of GF(2^GF_M) + * @param[in] b Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQC192_AVX2_gf_mul(uint16_t a, uint16_t b) { + __m128i va = _mm_cvtsi32_si128(a); + __m128i vb = _mm_cvtsi32_si128(b); + __m128i vab = _mm_clmulepi64_si128(va, vb, 0); + uint32_t ab = _mm_cvtsi128_si32(vab); + + return gf_reduce(ab, 2 * (PARAM_M - 1)); +} + + + +/** + * Squares an element of GF(2^GF_M). + * @returns a^2 + * @param[in] a Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQC192_AVX2_gf_square(uint16_t a) { + uint32_t b = a; + uint32_t s = b & 1; + for (size_t i = 1; i < PARAM_M; ++i) { + b <<= 1; + s ^= b & (1 << 2 * i); + } + + return gf_reduce(s, 2 * (PARAM_M - 1)); +} + + + +/** + * Computes the 4th power of an element of GF(2^GF_M). + * @returns a^4 + * @param[in] a Element of GF(2^GF_M) + */ +uint16_t gf_quad(uint64_t a) { + uint64_t q = a & 1; + for (size_t i = 1; i < PARAM_M; ++i) { + a <<= 3; + q ^= a & (1ull << 4 * i); + } + + return gf_reduce(q, 4 * (PARAM_M - 1)); +} + + + +/** + * Computes the inverse of an element of GF(2^10), + * using a shorter chain of squares and multiplications than fast exponentiation. + * @returns the inverse of a + * @param[in] a Element of GF(2^10) + */ +uint16_t PQCLEAN_HQC192_AVX2_gf_inverse(uint16_t a) { + uint16_t p; + uint16_t a2; + + a2 = PQCLEAN_HQC192_AVX2_gf_square(a); // a^2 + a = PQCLEAN_HQC192_AVX2_gf_mul(a2, a); // a^2.a + p = gf_quad(a); // a^8.a^4 + a = PQCLEAN_HQC192_AVX2_gf_mul(p, a); // a^8.a^4.a^2.a + p = gf_quad(a); // a^32.a^16.a^8.a^4 + p = gf_quad(p); // a^128.a^64.a^32.a^16 + a = PQCLEAN_HQC192_AVX2_gf_mul(p, a); // a^128.a^64.a^32.a^16.a^8.a^4.a^2.a + p = gf_quad(a); // a^512.a^256.a^128.a^64.a^32.a^16.a^8.a^4 + p = PQCLEAN_HQC192_AVX2_gf_mul(p, a2); // a^-1 + + return p; +} + + + +/** + * Returns i modulo 2^GF_M-1. + * i must be less than 2*(2^GF_M-1). + * Therefore, the return value is either i or i-2^GF_M+1. + * @returns i mod (2^GF_M-1) + * @param[in] i The integer whose modulo is taken + */ +uint16_t PQCLEAN_HQC192_AVX2_gf_mod(uint16_t i) { + uint16_t tmp = i - PARAM_GF_MUL_ORDER; + + // mask = 0xffff if (i < GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & PARAM_GF_MUL_ORDER); +} diff --git a/crypto_kem/hqc-192/avx2/gf.h b/crypto_kem/hqc-192/avx2/gf.h new file mode 100644 index 00000000..82b0f5e7 --- /dev/null +++ b/crypto_kem/hqc-192/avx2/gf.h @@ -0,0 +1,29 @@ +#ifndef GF_H +#define GF_H + + +/** + * @file gf.h + * Header file of gf.c + */ + +#include + +#include +#include + +void PQCLEAN_HQC192_AVX2_gf_generate(uint16_t *exp, uint16_t *log, int16_t m); + + +uint16_t PQCLEAN_HQC192_AVX2_gf_log(uint16_t elt); + +uint16_t PQCLEAN_HQC192_AVX2_gf_mul(uint16_t a, uint16_t b); + +uint16_t PQCLEAN_HQC192_AVX2_gf_square(uint16_t a); + +uint16_t PQCLEAN_HQC192_AVX2_gf_inverse(uint16_t a); + +uint16_t PQCLEAN_HQC192_AVX2_gf_mod(uint16_t i); + + +#endif diff --git a/crypto_kem/hqc-192/avx2/gf2x.c b/crypto_kem/hqc-192/avx2/gf2x.c new file mode 100644 index 00000000..eda790ad --- /dev/null +++ b/crypto_kem/hqc-192/avx2/gf2x.c @@ -0,0 +1,598 @@ +#include "gf2x.h" +#include "parameters.h" +#include +#include +#include + +/** + * \file gf2x.c + * \brief AVX2 implementation of multiplication of two polynomials + */ + + +// sizes for Toom-Cook +#define T_TM3_3W_256 64 +#define T_TM3_3W_64 256 + +#define VEC_N_ARRAY_SIZE_VEC CEIL_DIVIDE(PARAM_N, 256) /*!< The number of needed vectors to store PARAM_N bits*/ +#define WORD 64 +#define LAST64 (PARAM_N >> 6) +uint64_t a1_times_a2[2 * VEC_N_256_SIZE_64 + 1]; +uint64_t tmp_reduce[VEC_N_ARRAY_SIZE_VEC << 2]; +__m256i *o256 = (__m256i *) tmp_reduce; +uint64_t bloc64[PARAM_OMEGA_R]; // Allocation with the biggest possible weight +uint64_t bit64[PARAM_OMEGA_R]; // Allocation with the biggest possible weight + + +static inline void reduce(uint64_t *o, const uint64_t *a); +inline static void karat_mult_1(__m128i *C, __m128i *A, __m128i *B); +inline static void karat_mult_2(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_4(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_8(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_16(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_32(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_64(__m256i *C, __m256i *A, __m256i *B); +static inline void divByXplus1(__m256i *out, __m256i *in, int size); +static void TOOM3Mult(uint64_t *Out, const uint64_t *A, const uint64_t *B); + + + +/** + * @brief Compute o(x) = a(x) mod \f$ X^n - 1\f$ + * + * This function computes the modular reduction of the polynomial a(x) + * + * @param[out] o Pointer to the result + * @param[in] a Pointer to the polynomial a(x) + */ +static inline void reduce(uint64_t *o, const uint64_t *a) { + __m256i r256, carry256; + __m256i *a256 = (__m256i *) a; + static const int32_t dec64 = PARAM_N & 0x3f; + static const int32_t d0 = WORD - dec64; + int32_t i, i2; + + for (i = LAST64 ; i < (PARAM_N >> 5) - 4 ; i += 4) { + r256 = _mm256_lddqu_si256((__m256i const *) (& a[i])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_lddqu_si256((__m256i const *) (& a[i + 1])); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = a256[i2] ^ r256; + } + + r256 = _mm256_lddqu_si256((__m256i const *) (& a[i])); + carry256 = _mm256_lddqu_si256((__m256i const *) (& a[i + 1])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = (a256[i2] ^ r256); + tmp_reduce[LAST64] &= RED_MASK; + memcpy(o, tmp_reduce, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * A(x) and B(x) are stored in 128-bit registers + * This function computes A(x)*B(x) using Karatsuba + * + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_1(__m128i *C, __m128i *A, __m128i *B) { + __m128i D1[2]; + __m128i D0[2], D2[2]; + __m128i Al = _mm_loadu_si128(A); + __m128i Ah = _mm_loadu_si128(A + 1); + __m128i Bl = _mm_loadu_si128(B); + __m128i Bh = _mm_loadu_si128(B + 1); + + // Compute Al.Bl=D0 + __m128i DD0 = _mm_clmulepi64_si128(Al, Bl, 0); + __m128i DD2 = _mm_clmulepi64_si128(Al, Bl, 0x11); + __m128i AAlpAAh = _mm_xor_si128(Al, _mm_shuffle_epi32(Al, 0x4e)); + __m128i BBlpBBh = _mm_xor_si128(Bl, _mm_shuffle_epi32(Bl, 0x4e)); + __m128i DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D0[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D0[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Compute Ah.Bh=D2 + DD0 = _mm_clmulepi64_si128(Ah, Bh, 0); + DD2 = _mm_clmulepi64_si128(Ah, Bh, 0x11); + AAlpAAh = _mm_xor_si128(Ah, _mm_shuffle_epi32(Ah, 0x4e)); + BBlpBBh = _mm_xor_si128(Bh, _mm_shuffle_epi32(Bh, 0x4e)); + DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D2[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D2[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Compute AlpAh.BlpBh=D1 + // Initialisation of AlpAh and BlpBh + __m128i AlpAh = _mm_xor_si128(Al, Ah); + __m128i BlpBh = _mm_xor_si128(Bl, Bh); + DD0 = _mm_clmulepi64_si128(AlpAh, BlpBh, 0); + DD2 = _mm_clmulepi64_si128(AlpAh, BlpBh, 0x11); + AAlpAAh = _mm_xor_si128(AlpAh, _mm_shuffle_epi32(AlpAh, 0x4e)); + BBlpBBh = _mm_xor_si128(BlpBh, _mm_shuffle_epi32(BlpBh, 0x4e)); + DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D1[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D1[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Final comutation of C + __m128i middle = _mm_xor_si128(D0[1], D2[0]); + C[0] = D0[0]; + C[1] = middle ^ D0[0] ^ D1[0]; + C[2] = middle ^ D1[1] ^ D2[1]; + C[3] = D2[1]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_2(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[2], D1[2], D2[2], SAA, SBB; + __m128i *A128 = (__m128i *)A, *B128 = (__m128i *)B; + + karat_mult_1((__m128i *) D0, A128, B128); + karat_mult_1((__m128i *) D2, A128 + 2, B128 + 2); + + SAA = A[0] ^ A[1]; + SBB = B[0] ^ B[1]; + + karat_mult_1((__m128i *) D1, (__m128i *) &SAA, (__m128i *) &SBB); + __m256i middle = _mm256_xor_si256(D0[1], D2[0]); + + C[0] = D0[0]; + C[1] = middle ^ D0[0] ^ D1[0]; + C[2] = middle ^ D1[1] ^ D2[1]; + C[3] = D2[1]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_4(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[4], D1[4], D2[4], SAA[2], SBB[2]; + + karat_mult_2( D0, A, B); + karat_mult_2(D2, A + 2, B + 2); + + SAA[0] = A[0] ^ A[2]; + SBB[0] = B[0] ^ B[2]; + SAA[1] = A[1] ^ A[3]; + SBB[1] = B[1] ^ B[3]; + + karat_mult_2( D1, SAA, SBB); + + __m256i middle0 = _mm256_xor_si256(D0[2], D2[0]); + __m256i middle1 = _mm256_xor_si256(D0[3], D2[1]); + + C[0] = D0[0]; + C[1] = D0[1]; + C[2] = middle0 ^ D0[0] ^ D1[0]; + C[3] = middle1 ^ D0[1] ^ D1[1]; + C[4] = middle0 ^ D1[2] ^ D2[2]; + C[5] = middle1 ^ D1[3] ^ D2[3]; + C[6] = D2[2]; + C[7] = D2[3]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_8(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[8], D1[8], D2[8], SAA[4], SBB[4]; + + karat_mult_4( D0, A, B); + karat_mult_4(D2, A + 4, B + 4); + + for (int32_t i = 0 ; i < 4 ; i++) { + int is = i + 4; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_4(D1, SAA, SBB); + + for (int32_t i = 0 ; i < 4 ; i++) { + int32_t is = i + 4; + int32_t is2 = is + 4; + int32_t is3 = is2 + 4; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_16(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[16], D1[16], D2[16], SAA[8], SBB[8]; + + karat_mult_8( D0, A, B); + karat_mult_8(D2, A + 8, B + 8); + + for (int32_t i = 0 ; i < 8 ; i++) { + int32_t is = i + 8; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_8( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 8 ; i++) { + int32_t is = i + 8; + int32_t is2 = is + 8; + int32_t is3 = is2 + 8; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_32(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[32], D1[32], D2[32], SAA[16], SBB[16]; + + karat_mult_16( D0, A, B); + karat_mult_16(D2, A + 16, B + 16); + + for (int32_t i = 0 ; i < 16 ; i++) { + int is = i + 16; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_16( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 16 ; i++) { + int32_t is = i + 16; + int32_t is2 = is + 16; + int32_t is3 = is2 + 16; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_64(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[64], D1[64], D2[64], SAA[32], SBB[32]; + + karat_mult_32( D0, A, B); + karat_mult_32(D2, A + 32, B + 32); + for (int32_t i = 0 ; i < 32 ; i++) { + int32_t is = i + 32; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_32( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 32 ; i++) { + int32_t is = i + 32; + int32_t is2 = is + 32; + int32_t is3 = is2 + 32; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute B(x) = A(x)/(x+1) + * + * This function computes A(x)/(x+1) using a Quercia like algorithm + * @param[out] out Pointer to the result + * @param[in] in Pointer to the polynomial A(x) + * @param[in] size used to define the number of coeeficients of A + */ +static inline void divByXplus1(__m256i *out, __m256i *in, int size) { + uint64_t *A = (uint64_t *) in; + uint64_t *B = (uint64_t *) out; + + B[0] = A[0]; + + for (int32_t i = 1 ; i < 2 * (size << 2) ; i++) { + B[i] = B[i - 1] ^ A[i]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) using TOOM3Mult + * + * This function computes A(x)*B(x) using TOOM-COOK3 Multiplication + * last multiplication are done using Karatsuba + * @param[out] Out Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +static void TOOM3Mult(uint64_t *Out, const uint64_t *A, const uint64_t *B) { + static __m256i U0[T_TM3_3W_256], V0[T_TM3_3W_256], U1[T_TM3_3W_256], V1[T_TM3_3W_256], U2[T_TM3_3W_256], V2[T_TM3_3W_256]; + static __m256i W0[2 * (T_TM3_3W_256)], W1[2 * (T_TM3_3W_256)], W2[2 * (T_TM3_3W_256)], W3[2 * (T_TM3_3W_256)], W4[2 * (T_TM3_3W_256)]; + static __m256i tmp[2 * (T_TM3_3W_256)]; + static __m256i ro256[6 * (T_TM3_3W_256)]; + const __m256i zero = (__m256i) { + 0ul, 0ul, 0ul, 0ul + }; + int32_t T2 = T_TM3_3W_64 << 1; + + for (int32_t i = 0 ; i < T_TM3_3W_256 - 1 ; i++) { + int32_t i4 = i << 2; + int32_t i42 = i4 - 2; + U0[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4])); + V0[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4])); + U1[i] = _mm256_lddqu_si256((__m256i const *)(& A[i42 + T_TM3_3W_64])); + V1[i] = _mm256_lddqu_si256((__m256i const *)(& B[i42 + T_TM3_3W_64])); + U2[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4 + T2 - 4])); + V2[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4 + T2 - 4])); + } + + for (int32_t i = T_TM3_3W_256 - 1 ; i < T_TM3_3W_256 ; i++) { + int32_t i4 = i << 2; + int32_t i41 = i4 + 1; + U0[i] = (__m256i) { + A[i4], A[i41], 0x0ul, 0x0ul + }; + V0[i] = (__m256i) { + B[i4], B[i41], 0x0ul, 0x0ul + }; + U1[i] = (__m256i) { + A[i4 + T_TM3_3W_64 - 2], A[i41 + T_TM3_3W_64 - 2], 0x0ul, 0x0ul + }; + V1[i] = (__m256i) { + B[i4 + T_TM3_3W_64 - 2], B[i41 + T_TM3_3W_64 - 2], 0x0ul, 0x0ul + }; + U2[i] = (__m256i) { + A[i4 - 4 + T2], A[i4 - 3 + T2], 0x0ul, 0x0ul + }; + V2[i] = (__m256i) { + B[i4 - 4 + T2], B[i4 - 3 + T2], 0x0ul, 0x0ul + }; + } + + // Evaluation phase : x= X^64 + // P(X): P0=(0); P1=(1); P2=(x); P3=(1+x); P4=(\infty) + // Evaluation: 5*2 add, 2*2 shift; 5 mul (n) + //W3 = U2 + U1 + U0 ; W2 = V2 + V1 + V0 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W3[i] = U0[i] ^ U1[i] ^ U2[i]; + W2[i] = V0[i] ^ V1[i] ^ V2[i]; + } + + //W1 = W2 * W3 + karat_mult_64( W1, W2, W3); + //W0 =(U1 + U2*x)*x ; W4 =(V1 + V2*x)*x (SIZE = T_TM3_3W_256 !) + int64_t *U1_64 = ((int64_t *) U1); + int64_t *U2_64 = ((int64_t *) U2); + + int64_t *V1_64 = ((int64_t *) V1); + int64_t *V2_64 = ((int64_t *) V2); + + W0[0] = _mm256_set_epi64x(U1_64[2] ^ U2_64[1], U1_64[1] ^ U2_64[0], U1_64[0], 0); + W4[0] = _mm256_set_epi64x(V1_64[2] ^ V2_64[1], V1_64[1] ^ V2_64[0], V1_64[0], 0); + + U1_64 = ((int64_t *) U1); + U2_64 = ((int64_t *) U2); + + V1_64 = ((int64_t *) V1); + V2_64 = ((int64_t *) V2); + + for (int32_t i = 1 ; i < T_TM3_3W_256 ; i++) { + int i4 = i << 2; + W0[i] = _mm256_lddqu_si256((__m256i const *)(& U1_64[i4 - 1])); + W0[i] ^= _mm256_lddqu_si256((__m256i const *)(& U2_64[i4 - 2])); + + W4[i] = _mm256_lddqu_si256((__m256i const *)(& V1_64[i4 - 1])); + W4[i] ^= _mm256_lddqu_si256((__m256i const *)(& V2_64[i4 - 2])); + } + + //W3 = W3 + W0 ; W2 = W2 + W4 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W3[i] ^= W0[i]; + W2[i] ^= W4[i]; + } + + //W0 = W0 + U0 ; W4 = W4 + V0 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W0[i] ^= U0[i]; + W4[i] ^= V0[i]; + } + + karat_mult_64(tmp, W3, W2); + + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W3[i] = tmp[i]; + } + + karat_mult_64( W2, W0, W4); + + //W4 = U2 * V2 ; W0 = U0 * V0 + karat_mult_64(W4, U2, V2); + karat_mult_64(W0, U0, V0); + + // Interpolation phase + // 9 add, 1 shift, 1 Smul, 2 Sdiv (2n) + //W3 = W3 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W3[i] ^= W2[i]; + } + + //W1 = W1 + W0 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W1[i] ^= W0[i]; + } + + //W2 =(W2 + W0)/x -> x = X^64 + U1_64 = ((int64_t *) W2); + U2_64 = ((int64_t *) W0); + for (int32_t i = 0 ; i < (T_TM3_3W_256 << 1) ; i++) { + int32_t i4 = i << 2; + W2[i] = _mm256_lddqu_si256((__m256i const *)(& U1_64[i4 + 1])); + W2[i] ^= _mm256_lddqu_si256((__m256i const *)(& U2_64[i4 + 1])); + } + + //W2 =(W2 + W3 + W4*(x^3+1))/(x+1) + U1_64 = ((int64_t *) W4); + __m256i *U1_256 = (__m256i *) (U1_64 + 1); + tmp[0] = W2[0] ^ W3[0] ^ W4[0] ^ (__m256i) { + 0x0ul, 0x0ul, 0x0ul, U1_64[0] + }; + + for (int32_t i = 1 ; i < (T_TM3_3W_256 << 1) - 1 ; i++) { + tmp[i] = W2[i] ^ W3[i] ^ W4[i] ^ _mm256_lddqu_si256(&U1_256[i - 1]); + } + + divByXplus1(W2, tmp, T_TM3_3W_256); + W2[2 * (T_TM3_3W_256) - 1] = zero; + + //W3 =(W3 + W1)/(x*(x+1)) + U1_64 = (int64_t *) W3; + U1_256 = (__m256i *) (U1_64 + 1); + + U2_64 = (int64_t *) W1; + __m256i *U2_256 = (__m256i *) (U2_64 + 1); + + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) - 1 ; i++) { + tmp[i] = _mm256_lddqu_si256(&U1_256[i]) ^ _mm256_lddqu_si256(&U2_256[i]); + } + + divByXplus1(W3, tmp, T_TM3_3W_256); + W3[2 * (T_TM3_3W_256) - 1] = zero; + + //W1 = W1 + W4 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W1[i] ^= W2[i] ^ W4[i]; + } + + //W2 = W2 + W3 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W2[i] ^= W3[i]; + } + + // Recomposition + //W = W0+ W1*x+ W2*x^2+ W3*x^3 + W4*x^4 + //W0, W1, W4 of size 2*T_TM3_3W_256, W2 and W3 of size 2*(T_TM3_3W_256) + for (int32_t i = 0 ; i < (T_TM3_3W_256 << 1) - 1 ; i++) { + ro256[i] = W0[i]; + ro256[i + 2 * T_TM3_3W_256 - 1] = W2[i]; + ro256[i + 4 * T_TM3_3W_256 - 2] = W4[i]; + } + + ro256[(T_TM3_3W_256 << 1) - 1] = W0[(T_TM3_3W_256 << 1) - 1] ^ W2[0]; + ro256[(T_TM3_3W_256 << 2) - 2] = W2[(T_TM3_3W_256 << 1) - 1] ^ W4[0]; + ro256[(T_TM3_3W_256 * 6) - 3] = W4[(T_TM3_3W_256 << 1) - 1]; + + U1_64 = ((int64_t *) &ro256[T_TM3_3W_256]); + U1_256 = (__m256i *) (U1_64 - 2); + + U2_64 = ((int64_t *) &ro256[3 * T_TM3_3W_256 - 1]); + U2_256 = (__m256i *) (U2_64 - 2); + + for (int32_t i = 0 ; i < T_TM3_3W_256 << 1 ; i++) { + _mm256_storeu_si256(&U1_256[i], W1[i] ^ _mm256_lddqu_si256(&U1_256[i])); + _mm256_storeu_si256(&U2_256[i], W3[i] ^ _mm256_loadu_si256(&U2_256[i])); + } + + for (int32_t i = 0 ; i < 6 * T_TM3_3W_256 - 2 ; i++) { + uint64_t *out64 = Out + (i << 2); + _mm256_storeu_si256((__m256i *)out64, ro256[i]); + } +} + + + +/** + * @brief Multiply two polynomials modulo \f$ X^n - 1\f$. + * + * This functions multiplies a sparse polynomial a1 (of Hamming weight equal to weight) + * and a dense polynomial a2. The multiplication is done modulo \f$ X^n - 1\f$. + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to a polynomial + * @param[in] a2 Pointer to a polynomial + */ +void PQCLEAN_HQC192_AVX2_vect_mul(uint64_t *o, const uint64_t *a1, const uint64_t *a2) { + TOOM3Mult(a1_times_a2, a1, a2); + reduce(o, a1_times_a2); + + // clear all + memset(a1_times_a2, 0, (VEC_N_SIZE_64 << 1) * sizeof(uint64_t)); +} diff --git a/crypto_kem/hqc-192/avx2/gf2x.h b/crypto_kem/hqc-192/avx2/gf2x.h new file mode 100644 index 00000000..3f99e6bf --- /dev/null +++ b/crypto_kem/hqc-192/avx2/gf2x.h @@ -0,0 +1,17 @@ +#ifndef GF2X_H +#define GF2X_H + + +/** + * @file gf2x.h + * @brief Header file for gf2x.c + */ + +#include + +#include + +void PQCLEAN_HQC192_AVX2_vect_mul(uint64_t *o, const uint64_t *a1, const uint64_t *a2); + + +#endif diff --git a/crypto_kem/hqc-192/avx2/hqc.c b/crypto_kem/hqc-192/avx2/hqc.c new file mode 100644 index 00000000..cee719ad --- /dev/null +++ b/crypto_kem/hqc-192/avx2/hqc.c @@ -0,0 +1,138 @@ +#include "code.h" +#include "gf2x.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +/** + * @file hqc.c + * @brief Implementation of hqc.h + */ + + + +/** + * @brief Keygen of the HQC_PKE IND_CPA scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + */ +void PQCLEAN_HQC192_AVX2_hqc_pke_keygen(unsigned char *pk, unsigned char *sk) { + AES_XOF_struct sk_seedexpander; + AES_XOF_struct pk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + uint8_t pk_seed[SEED_BYTES] = {0}; + uint64_t x[VEC_N_256_SIZE_64] = {0}; + uint64_t y[VEC_N_256_SIZE_64] = {0}; + uint64_t h[VEC_N_256_SIZE_64] = {0}; + uint64_t s[VEC_N_256_SIZE_64] = {0}; + + // Create seed_expanders for public key and secret key + randombytes(sk_seed, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + randombytes(pk_seed, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute secret key + PQCLEAN_HQC192_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQC192_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, y, PARAM_OMEGA); + + // Compute public key + PQCLEAN_HQC192_AVX2_vect_set_random(&pk_seedexpander, h); + PQCLEAN_HQC192_AVX2_vect_mul(s, y, h); + PQCLEAN_HQC192_AVX2_vect_add(s, x, s, VEC_N_256_SIZE_64); + + // Parse keys to string + PQCLEAN_HQC192_AVX2_hqc_public_key_to_string(pk, pk_seed, s); + PQCLEAN_HQC192_AVX2_hqc_secret_key_to_string(sk, sk_seed, pk); + +} + + + +/** + * @brief Encryption of the HQC_PKE IND_CPA scheme + * + * The cihertext is composed of vectors u and v. + * + * @param[out] u Vector u (first part of the ciphertext) + * @param[out] v Vector v (second part of the ciphertext) + * @param[in] m Vector representing the message to encrypt + * @param[in] theta Seed used to derive randomness required for encryption + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC192_AVX2_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk) { + AES_XOF_struct seedexpander; + uint64_t h[VEC_N_256_SIZE_64] = {0}; + uint64_t s[VEC_N_256_SIZE_64] = {0}; + uint64_t r1[VEC_N_256_SIZE_64] = {0}; + uint64_t r2[VEC_N_256_SIZE_64] = {0}; + uint64_t e[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp1[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_256_SIZE_64] = {0}; + + // Create seed_expander from theta + seedexpander_init(&seedexpander, theta, theta + 32, SEEDEXPANDER_MAX_LENGTH); + + // Retrieve h and s from public key + PQCLEAN_HQC192_AVX2_hqc_public_key_from_string(h, s, pk); + + // Generate r1, r2 and e + PQCLEAN_HQC192_AVX2_vect_set_random_fixed_weight(&seedexpander, r1, PARAM_OMEGA_R); + PQCLEAN_HQC192_AVX2_vect_set_random_fixed_weight(&seedexpander, r2, PARAM_OMEGA_R); + PQCLEAN_HQC192_AVX2_vect_set_random_fixed_weight(&seedexpander, e, PARAM_OMEGA_E); + + // Compute u = r1 + r2.h + PQCLEAN_HQC192_AVX2_vect_mul(u, r2, h); + PQCLEAN_HQC192_AVX2_vect_add(u, r1, u, VEC_N_256_SIZE_64); + + // Compute v = m.G by encoding the message + PQCLEAN_HQC192_AVX2_code_encode(v, m); + PQCLEAN_HQC192_AVX2_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + + // Compute v = m.G + s.r2 + e + PQCLEAN_HQC192_AVX2_vect_mul(tmp2, r2, s); + PQCLEAN_HQC192_AVX2_vect_add(tmp2, e, tmp2, VEC_N_256_SIZE_64); + PQCLEAN_HQC192_AVX2_vect_add(tmp2, tmp1, tmp2, VEC_N_256_SIZE_64); + PQCLEAN_HQC192_AVX2_vect_resize(v, PARAM_N1N2, tmp2, PARAM_N); + +} + + + +/** + * @brief Decryption of the HQC_PKE IND_CPA scheme + * + * @param[out] m Vector representing the decrypted message + * @param[in] u Vector u (first part of the ciphertext) + * @param[in] v Vector v (second part of the ciphertext) + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQC192_AVX2_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk) { + uint64_t x[VEC_N_256_SIZE_64] = {0}; + uint64_t y[VEC_N_256_SIZE_64] = {0}; + uint8_t pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t tmp1[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_256_SIZE_64] = {0}; + + // Retrieve x, y, pk from secret key + PQCLEAN_HQC192_AVX2_hqc_secret_key_from_string(x, y, pk, sk); + + // Compute v - u.y + PQCLEAN_HQC192_AVX2_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + PQCLEAN_HQC192_AVX2_vect_mul(tmp2, y, u); + PQCLEAN_HQC192_AVX2_vect_add(tmp2, tmp1, tmp2, VEC_N_256_SIZE_64); + + + // Compute m by decoding v - u.y + PQCLEAN_HQC192_AVX2_code_decode(m, tmp2); +} diff --git a/crypto_kem/hqc-192/avx2/hqc.h b/crypto_kem/hqc-192/avx2/hqc.h new file mode 100644 index 00000000..dffc31ea --- /dev/null +++ b/crypto_kem/hqc-192/avx2/hqc.h @@ -0,0 +1,21 @@ +#ifndef HQC_H +#define HQC_H + + +/** + * @file hqc.h + * @brief Functions of the HQC_PKE IND_CPA scheme + */ + +#include + +#include + +void PQCLEAN_HQC192_AVX2_hqc_pke_keygen(unsigned char *pk, unsigned char *sk); + +void PQCLEAN_HQC192_AVX2_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk); + +void PQCLEAN_HQC192_AVX2_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-192/avx2/kem.c b/crypto_kem/hqc-192/avx2/kem.c new file mode 100644 index 00000000..28284080 --- /dev/null +++ b/crypto_kem/hqc-192/avx2/kem.c @@ -0,0 +1,138 @@ +#include "api.h" +#include "fips202.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "sha2.h" +#include "vector.h" +#include +#include +/** + * @file kem.c + * @brief Implementation of api.h + */ + + + +/** + * @brief Keygen of the HQC_KEM IND_CAA2 scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + * @returns 0 if keygen is successful + */ +int PQCLEAN_HQC192_AVX2_crypto_kem_keypair(unsigned char *pk, unsigned char *sk) { + + PQCLEAN_HQC192_AVX2_hqc_pke_keygen(pk, sk); + return 0; +} + + + +/** + * @brief Encapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ct String containing the ciphertext + * @param[out] ss String containing the shared secret + * @param[in] pk String containing the public key + * @returns 0 if encapsulation is successful + */ +int PQCLEAN_HQC192_AVX2_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk) { + + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint64_t u[VEC_N_256_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Computing m + PQCLEAN_HQC192_AVX2_vect_set_random_from_randombytes(m); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m + PQCLEAN_HQC192_AVX2_hqc_pke_encrypt(u, v, m, theta, pk); + + // Computing d + sha512(d, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Computing ciphertext + PQCLEAN_HQC192_AVX2_hqc_ciphertext_to_string(ct, u, v, d); + + + return 0; +} + + + +/** + * @brief Decapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ss String containing the shared secret + * @param[in] ct String containing the cipĥertext + * @param[in] sk String containing the secret key + * @returns 0 if decapsulation is successful, -1 otherwise + */ +int PQCLEAN_HQC192_AVX2_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk) { + + int8_t result = -1; + uint64_t u[VEC_N_256_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t u2[VEC_N_256_SIZE_64] = {0}; + uint64_t v2[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d2[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Retrieving u, v and d from ciphertext + PQCLEAN_HQC192_AVX2_hqc_ciphertext_from_string(u, v, d, ct); + + // Retrieving pk from sk + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); + + // Decryting + PQCLEAN_HQC192_AVX2_hqc_pke_decrypt(m, u, v, sk); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m' + PQCLEAN_HQC192_AVX2_hqc_pke_encrypt(u2, v2, m, theta, pk); + + // Computing d' + sha512(d2, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Abort if c != c' or d != d' + result = (PQCLEAN_HQC192_AVX2_vect_compare(u, u2, VEC_N_SIZE_BYTES) == 0 && PQCLEAN_HQC192_AVX2_vect_compare(v, v2, VEC_N1N2_SIZE_BYTES) == 0 && PQCLEAN_HQC192_AVX2_vect_compare((uint64_t *)d, (uint64_t *)d2, SHA512_BYTES) == 0); + for (size_t i = 0 ; i < SHARED_SECRET_BYTES ; i++) { + ss[i] = result * ss[i]; + } + result--; + + + return result; +} diff --git a/crypto_kem/hqc-192/avx2/parameters.h b/crypto_kem/hqc-192/avx2/parameters.h new file mode 100644 index 00000000..2e9656fd --- /dev/null +++ b/crypto_kem/hqc-192/avx2/parameters.h @@ -0,0 +1,127 @@ +#ifndef HQC_PARAMETERS_H +#define HQC_PARAMETERS_H +/** + * @file parameters.h + * @brief Parameters of the HQC_KEM IND-CCA2 scheme + */ + +#include "api.h" +#include "api.h" +#include "vector.h" + + +#define CEIL_DIVIDE(a, b) (((a)/(b)) + ((a) % (b) == 0 ? 0 : 1)) /*!< Divide a by b and ceil the result*/ +#define BITMASK(a, size) ((1UL << ((a) % (size))) - 1) /*!< Create a mask*/ + +/* + #define PARAM_N Define the parameter n of the scheme + #define PARAM_N1 Define the parameter n1 of the scheme (length of BCH code) + #define PARAM_N2 Define the parameter n2 of the scheme (length of the repetition code) + #define PARAM_N1N2 Define the parameter n1 * n2 of the scheme (length of the tensor code) + #define PARAM_OMEGA Define the parameter omega of the scheme + #define PARAM_OMEGA_E Define the parameter omega_e of the scheme + #define PARAM_OMEGA_R Define the parameter omega_r of the scheme + #define PARAM_SECURITY Define the security level corresponding to the chosen parameters + #define PARAM_DFR_EXP Define the decryption failure rate corresponding to the chosen parameters + + #define SECRET_KEY_BYTES Define the size of the secret key in bytes + #define PUBLIC_KEY_BYTES Define the size of the public key in bytes + #define SHARED_SECRET_BYTES Define the size of the shared secret in bytes + #define CIPHERTEXT_BYTES Define the size of the ciphertext in bytes + + #define UTILS_REJECTION_THRESHOLD Define the rejection threshold used to generate given weight vectors (see vector_set_random_fixed_weight function) + #define VEC_N_SIZE_BYTES Define the size of the array used to store a PARAM_N sized vector in bytes + #define VEC_K_SIZE_BYTES Define the size of the array used to store a PARAM_K sized vector in bytes + #define VEC_N1_SIZE_BYTES Define the size of the array used to store a PARAM_N1 sized vector in bytes + #define VEC_N1N2_SIZE_BYTES Define the size of the array used to store a PARAM_N1N2 sized vector in bytes + + #define VEC_N_SIZE_64 Define the size of the array used to store a PARAM_N sized vector in 64 bits + #define VEC_K_SIZE_64 Define the size of the array used to store a PARAM_K sized vector in 64 bits + #define VEC_N1_SIZE_64 Define the size of the array used to store a PARAM_N1 sized vector in 64 bits + #define VEC_N1N2_SIZE_64 Define the size of the array used to store a PARAM_N1N2 sized vector in 64 bits + + #define VEC_N_256_SIZE_64 Define the size of the array of 64 bits elements used to store an array of size PARAM_N considered as elements of 256 bits + #define VEC_N1N2_256_SIZE_64 Define the size of the array of 64 bits elements used to store an array of size PARAM_N1N2 considered as elements of 256 bits + + #define PARAM_T Define a threshold for decoding repetition code word (PARAM_T = (PARAM_N2 - 1) / 2) + + #define PARAM_DELTA Define the parameter delta of the scheme (correcting capacity of the BCH code) + #define PARAM_M Define a positive integer + #define PARAM_GF_POLY Generator polynomial of galois field GF(2^PARAM_M), represented in hexadecimial form + #define PARAM_GF_MUL_ORDER Define the size of the multiplicative group of GF(2^PARAM_M), i.e 2^PARAM_M -1 + #define PARAM_K Define the size of the information bits of the BCH code + #define PARAM_G Define the size of the generator polynomial of BCH code + #define PARAM_FFT The additive FFT takes a 2^PARAM_FFT polynomial as input + We use the FFT to compute the roots of sigma, whose degree if PARAM_DELTA=60 + The smallest power of 2 greater than 60+1 is 64=2^6 + #define PARAM_BCH_POLY Generator polynomial of the BCH code + + #define RED_MASK A mask fot the higher bits of a vector + #define SHA512_BYTES Define the size of SHA512 output in bytes + #define SEED_BYTES Define the size of the seed in bytes + #define SEEDEXPANDER_MAX_LENGTH Define the seed expander max length +*/ + +#define PARAM_N 45197 +#define PARAM_N1 766 +#define PARAM_N2 59 +#define PARAM_N1N2 45194 +#define PARAM_OMEGA 101 +#define PARAM_OMEGA_E 117 +#define PARAM_OMEGA_R 117 +#define PARAM_SECURITY 192 +#define PARAM_DFR_EXP 192 + +#define SECRET_KEY_BYTES PQCLEAN_HQC192_AVX2_CRYPTO_SECRETKEYBYTES +#define PUBLIC_KEY_BYTES PQCLEAN_HQC192_AVX2_CRYPTO_PUBLICKEYBYTES +#define SHARED_SECRET_BYTES PQCLEAN_HQC192_AVX2_CRYPTO_BYTES +#define CIPHERTEXT_BYTES PQCLEAN_HQC192_AVX2_CRYPTO_CIPHERTEXTBYTES + +#define UTILS_REJECTION_THRESHOLD 16768087 +#define VEC_K_SIZE_BYTES CEIL_DIVIDE(PARAM_K, 8) +#define VEC_N_SIZE_BYTES CEIL_DIVIDE(PARAM_N, 8) +#define VEC_N1_SIZE_BYTES CEIL_DIVIDE(PARAM_N1, 8) +#define VEC_N1N2_SIZE_BYTES CEIL_DIVIDE(PARAM_N1N2, 8) + +#define VEC_N_SIZE_64 CEIL_DIVIDE(PARAM_N, 64) +#define VEC_K_SIZE_64 CEIL_DIVIDE(PARAM_K, 64) +#define VEC_N1_SIZE_64 CEIL_DIVIDE(PARAM_N1, 64) +#define VEC_N1N2_SIZE_64 CEIL_DIVIDE(PARAM_N1N2, 64) + +#define PARAM_N_MULT 48768 +#define VEC_N_256_SIZE_64 (CEIL_DIVIDE(PARAM_N_MULT, 256) << 2) +#define VEC_N1N2_256_SIZE_64 (CEIL_DIVIDE(PARAM_N1N2, 256) << 2) + +#define PARAM_T 29 + +#define PARAM_DELTA 57 +#define PARAM_M 10 +#define PARAM_GF_POLY 0x409 +#define PARAM_GF_MUL_ORDER 1023 +#define PARAM_K 256 +#define PARAM_G 511 +#define PARAM_FFT 6 +#define PARAM_FFT_T 7 +#define PARAM_BCH_POLY { \ + 1,1,0,0,0,0,1,0,0,1,1,0,1,1,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,0,0,1,1,0,1,1, \ + 1,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,1,0,1,1,0,1,0,1,1,1,0,1,0,1,0,0,1,0,0,0, \ + 0,1,1,1,1,0,1,1,1,1,1,0,0,0,0,1,0,0,1,0,0,1,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, \ + 1,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1,1,0,1,0,1,0,1,0,1,1,1,1,0,1,0, \ + 0,1,1,0,1,0,1,1,0,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,0,1,1,1,1,0, \ + 1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,1,0, \ + 0,1,0,0,1,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,0,0,0,1,0,1, \ + 1,1,1,1,1,0,1,0,1,0,1,1,0,0,0,1,1,0,0,1,1,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,0, \ + 1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,0,1,1,0,1,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1, \ + 1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,0,1,0,0,1,1,1,1,1,0,1,0,1, \ + 0,0,0,0,1,0,1,1,1,1,0,1,0,0,0,0,0,1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1, \ + 1,0,1,0,0,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,1, \ + 0,1,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,1,1,1,1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,0,1, \ + 1,0,1,1,1,0,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,1 \ + }; + +#define RED_MASK 0x0000000000001fffUL +#define SHA512_BYTES 64 +#define SEED_BYTES 40 +#define SEEDEXPANDER_MAX_LENGTH 4294967295 + +#endif diff --git a/crypto_kem/hqc-192/avx2/parsing.c b/crypto_kem/hqc-192/avx2/parsing.c new file mode 100644 index 00000000..15d3c22b --- /dev/null +++ b/crypto_kem/hqc-192/avx2/parsing.c @@ -0,0 +1,121 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file parsing.c + * @brief Functions to parse secret key, public key and ciphertext of the HQC scheme + */ + + + +/** + * @brief Parse a secret key into a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] sk String containing the secret key + * @param[in] sk_seed Seed used to generate the secret key + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC192_AVX2_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk) { + memcpy(sk, sk_seed, SEED_BYTES); + memcpy(sk + SEED_BYTES, pk, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a secret key from a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] x uint64_t representation of vector x + * @param[out] y uint64_t representation of vector y + * @param[out] pk String containing the public key + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQC192_AVX2_hqc_secret_key_from_string(uint64_t *x, uint64_t *y, uint8_t *pk, const uint8_t *sk) { + AES_XOF_struct sk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + + memcpy(sk_seed, sk, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + PQCLEAN_HQC192_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQC192_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, y, PARAM_OMEGA); + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a public key into a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] pk String containing the public key + * @param[in] pk_seed Seed used to generate the public key + * @param[in] s uint8_t representation of vector s + */ +void PQCLEAN_HQC192_AVX2_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s) { + memcpy(pk, pk_seed, SEED_BYTES); + memcpy(pk + SEED_BYTES, s, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Parse a public key from a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] h uint8_t representation of vector h + * @param[out] s uint8_t representation of vector s + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC192_AVX2_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk) { + AES_XOF_struct pk_seedexpander; + uint8_t pk_seed[SEED_BYTES] = {0}; + + memcpy(pk_seed, pk, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + PQCLEAN_HQC192_AVX2_vect_set_random(&pk_seedexpander, h); + + memcpy(s, pk + SEED_BYTES, VEC_N_SIZE_BYTES); +} + + +/** + * @brief Parse a ciphertext into a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] ct String containing the ciphertext + * @param[in] u uint8_t representation of vector u + * @param[in] v uint8_t representation of vector v + * @param[in] d String containing the hash d + */ +void PQCLEAN_HQC192_AVX2_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d) { + memcpy(ct, u, VEC_N_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, d, SHA512_BYTES); +} + + +/** + * @brief Parse a ciphertext from a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] u uint8_t representation of vector u + * @param[out] v uint8_t representation of vector v + * @param[out] d String containing the hash d + * @param[in] ct String containing the ciphertext + */ +void PQCLEAN_HQC192_AVX2_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct) { + memcpy(u, ct, VEC_N_SIZE_BYTES); + memcpy(v, ct + VEC_N_SIZE_BYTES, VEC_N1N2_SIZE_BYTES); + memcpy(d, ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, SHA512_BYTES); +} diff --git a/crypto_kem/hqc-192/avx2/parsing.h b/crypto_kem/hqc-192/avx2/parsing.h new file mode 100644 index 00000000..9a336102 --- /dev/null +++ b/crypto_kem/hqc-192/avx2/parsing.h @@ -0,0 +1,29 @@ +#ifndef PARSING_H +#define PARSING_H + + +/** + * @file parsing.h + * @brief Header file for parsing.c + */ + +#include + +#include + +void PQCLEAN_HQC192_AVX2_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk); + +void PQCLEAN_HQC192_AVX2_hqc_secret_key_from_string(uint64_t *x, uint64_t *y, uint8_t *pk, const uint8_t *sk); + + +void PQCLEAN_HQC192_AVX2_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s); + +void PQCLEAN_HQC192_AVX2_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk); + + +void PQCLEAN_HQC192_AVX2_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d); + +void PQCLEAN_HQC192_AVX2_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct); + + +#endif diff --git a/crypto_kem/hqc-192/avx2/repetition.c b/crypto_kem/hqc-192/avx2/repetition.c new file mode 100644 index 00000000..8c873b6f --- /dev/null +++ b/crypto_kem/hqc-192/avx2/repetition.c @@ -0,0 +1,41 @@ +#include "parameters.h" +#include "repetition.h" +#include +#include +#include +#include +/** + * @file repetition.c + * @brief Implementation of repetition codes + */ + + +#define MASK_N2 ((1UL << PARAM_N2) - 1) + +/** + * @brief Decoding the code words to a message using the repetition code + * + * We use a majority decoding. In fact we have that PARAM_N2 = 2 * PARAM_T + 1, thus, + * if the Hamming weight of the vector is greater than PARAM_T, the code word is decoded + * to 1 and 0 otherwise. + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQC192_AVX2_repetition_code_decode(uint64_t *m, const uint64_t *em) { + size_t t = 0, b, bn, bi, c, cn, ci; + uint64_t cx, ones; + + for (b = 0 ; b < PARAM_N1N2 - PARAM_N2 + 1 ; b += PARAM_N2) { + bn = b >> 6; + bi = b & 63; + c = b + PARAM_N2 - 1; + cn = c >> 6; + ci = c & 63; + cx = em[cn] << (63 - ci); + int64_t verif = (cn == (bn + 1)); + ones = _mm_popcnt_u64(((em[bn] >> bi) & MASK_N2) | (cx * verif)); + m[t >> 6] |= ((uint64_t)(ones > PARAM_T)) << (t & 63); + t++; + } +} diff --git a/crypto_kem/hqc-192/avx2/repetition.h b/crypto_kem/hqc-192/avx2/repetition.h new file mode 100644 index 00000000..c75d244b --- /dev/null +++ b/crypto_kem/hqc-192/avx2/repetition.h @@ -0,0 +1,17 @@ +#ifndef REPETITION_H +#define REPETITION_H + + +/** + * @file repetition.h + * @brief Header file for repetition.c + */ + +#include + +#include + +void PQCLEAN_HQC192_AVX2_repetition_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-192/avx2/vector.c b/crypto_kem/hqc-192/avx2/vector.c new file mode 100644 index 00000000..40149c42 --- /dev/null +++ b/crypto_kem/hqc-192/avx2/vector.c @@ -0,0 +1,200 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +#include +/** + * @file vector.c + * @brief Implementation of vectors sampling and some utilities for the HQC scheme + */ + + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC192_AVX2_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight) { + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; + uint32_t random_data = 0; + uint32_t tmp[PARAM_OMEGA_R] = {0}; + uint8_t exist = 0; + size_t j = 0; + __m256i bit256[PARAM_OMEGA_R]; + __m256i bloc256[PARAM_OMEGA_R]; + static __m256i posCmp256 = (__m256i) { + 0UL, 1UL, 2UL, 3UL + }; +#define LOOP_SIZE CEIL_DIVIDE(PARAM_N, 256) + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (tmp[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + tmp[i] = random_data; + } + } + + for (uint32_t i = 0 ; i < weight ; i++) { + // we store the bloc number and bit position of each vb[i] + uint64_t bloc = tmp[i] >> 6; + bloc256[i] = _mm256_set1_epi64x(bloc >> 2); + uint64_t pos = (bloc & 0x3UL); + __m256i pos256 = _mm256_set1_epi64x(pos); + __m256i mask256 = _mm256_cmpeq_epi64(pos256, posCmp256); + uint64_t bit64 = 1ULL << (tmp[i] & 0x3f); + __m256i bloc256 = _mm256_set1_epi64x(bit64); + bit256[i] = bloc256 & mask256; + } + + for (uint32_t i = 0 ; i < LOOP_SIZE ; i++) { + __m256i aux = _mm256_loadu_si256(((__m256i *)v) + i); + __m256i i256 = _mm256_set1_epi64x(i); + + for (uint32_t j = 0 ; j < weight ; j++) { + __m256i mask256 = _mm256_cmpeq_epi64(bloc256[j], i256); + aux ^= bit256[j] & mask256; + } + _mm256_storeu_si256(((__m256i *)v) + i, aux); + } + +#undef LOOP_SIZE +} + + + +/** + * @brief Generates a random vector of dimension PARAM_N + * + * This function generates a random binary vector of dimension PARAM_N. It generates a random + * array of bytes using the seedexpander function, and drop the extra bits using a mask. + * + * @param[in] v Pointer to an array + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC192_AVX2_vect_set_random(AES_XOF_struct *ctx, uint64_t *v) { + uint8_t rand_bytes[VEC_N_SIZE_BYTES] = {0}; + + seedexpander(ctx, rand_bytes, VEC_N_SIZE_BYTES); + + memcpy(v, rand_bytes, VEC_N_SIZE_BYTES); + v[VEC_N_SIZE_64 - 1] &= BITMASK(PARAM_N, 64); +} + + + +/** + * @brief Generates a random vector + * + * This function generates a random binary vector. It uses the the randombytes function. + * + * @param[in] v Pointer to an array + */ +void PQCLEAN_HQC192_AVX2_vect_set_random_from_randombytes(uint64_t *v) { + uint8_t rand_bytes [VEC_K_SIZE_BYTES] = {0}; + + randombytes(rand_bytes, VEC_K_SIZE_BYTES); + memcpy(v, rand_bytes, VEC_K_SIZE_BYTES); +} + + + +/** + * @brief Adds two vectors + * + * @param[out] o Pointer to an array that is the result + * @param[in] v1 Pointer to an array that is the first vector + * @param[in] v2 Pointer to an array that is the second vector + * @param[in] size Integer that is the size of the vectors + */ +void PQCLEAN_HQC192_AVX2_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size) { + for (uint32_t i = 0 ; i < size ; ++i) { + o[i] = v1[i] ^ v2[i]; + } +} + + + +/** + * @brief Compares two vectors + * + * @param[in] v1 Pointer to an array that is first vector + * @param[in] v2 Pointer to an array that is second vector + * @param[in] size Integer that is the size of the vectors + * @returns 0 if the vectors are equals and a negative/psotive value otherwise + */ +int PQCLEAN_HQC192_AVX2_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size) { + unsigned char diff = 0; + + for (uint32_t i = 0 ; i < size ; i++) { + diff |= ((uint8_t *) v1)[i] ^ ((uint8_t *) v2)[i]; + } + return diff != 0; +} + + + +/** + * @brief Resize a vector so that it contains size_o bits + * + * @param[out] o Pointer to the output vector + * @param[in] size_o Integer that is the size of the output vector in bits + * @param[in] v Pointer to the input vector + * @param[in] size_v Integer that is the size of the input vector in bits + */ +void PQCLEAN_HQC192_AVX2_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v) { + if (size_o < size_v) { + uint64_t mask = 0x7FFFFFFFFFFFFFFF; + int8_t val = 0; + + if (size_o % 64) { + val = 64 - (size_o % 64); + } + + memcpy(o, v, VEC_N1N2_SIZE_BYTES); + + for (int8_t i = 0 ; i < val ; ++i) { + o[VEC_N1N2_SIZE_64 - 1] &= (mask >> i); + } + } else { + memcpy(o, v, CEIL_DIVIDE(size_v, 8)); + } +} diff --git a/crypto_kem/hqc-192/avx2/vector.h b/crypto_kem/hqc-192/avx2/vector.h new file mode 100644 index 00000000..0ff92c23 --- /dev/null +++ b/crypto_kem/hqc-192/avx2/vector.h @@ -0,0 +1,29 @@ +#ifndef VECTOR_H +#define VECTOR_H + + +/** + * @file vector.h + * @brief Header file for vector.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQC192_AVX2_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight); + +void PQCLEAN_HQC192_AVX2_vect_set_random(AES_XOF_struct *ctx, uint64_t *v); + +void PQCLEAN_HQC192_AVX2_vect_set_random_from_randombytes(uint64_t *v); + + +void PQCLEAN_HQC192_AVX2_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size); + +int PQCLEAN_HQC192_AVX2_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size); + +void PQCLEAN_HQC192_AVX2_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v); + + +#endif diff --git a/crypto_kem/hqc-192/clean/LICENSE b/crypto_kem/hqc-192/clean/LICENSE new file mode 100644 index 00000000..d5d21fff --- /dev/null +++ b/crypto_kem/hqc-192/clean/LICENSE @@ -0,0 +1 @@ +Public Domain diff --git a/crypto_kem/hqc-192/clean/Makefile b/crypto_kem/hqc-192/clean/Makefile new file mode 100644 index 00000000..35c5d36a --- /dev/null +++ b/crypto_kem/hqc-192/clean/Makefile @@ -0,0 +1,19 @@ +# This Makefile can be used with GNU Make or BSD Make + +LIB=libhqc-192_clean.a +HEADERS=api.h bch.h code.h fft.h gf2x.h gf.h hqc.h parameters.h parsing.h repetition.h vector.h +OBJECTS=bch.o code.o fft.o gf2x.o gf.o hqc.o kem.o parsing.o repetition.o vector.o + +CFLAGS=-O3 -Wall -Wextra -Wpedantic -Wvla -Werror -Wredundant-decls -Wmissing-prototypes -std=c99 -I../../../common $(EXTRAFLAGS) + +all: $(LIB) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +$(LIB): $(OBJECTS) + $(AR) -r $@ $(OBJECTS) + +clean: + $(RM) $(OBJECTS) + $(RM) $(LIB) diff --git a/crypto_kem/hqc-192/clean/Makefile.Microsoft_nmake b/crypto_kem/hqc-192/clean/Makefile.Microsoft_nmake new file mode 100644 index 00000000..1dc03568 --- /dev/null +++ b/crypto_kem/hqc-192/clean/Makefile.Microsoft_nmake @@ -0,0 +1,19 @@ +# This Makefile can be used with Microsoft Visual Studio's nmake using the command: +# nmake /f Makefile.Microsoft_nmake + +LIBRARY=libhqc-192_clean.lib +OBJECTS=bch.obj code.obj fft.obj gf2x.obj gf.obj hqc.obj kem.obj parsing.obj repetition.obj vector.obj + +CFLAGS=/nologo /O2 /I ..\..\..\common /W4 /WX + +all: $(LIBRARY) + +# Make sure objects are recompiled if headers change. +$(OBJECTS): *.h + +$(LIBRARY): $(OBJECTS) + LIB.EXE /NOLOGO /WX /OUT:$@ $** + +clean: + -DEL $(OBJECTS) + -DEL $(LIBRARY) diff --git a/crypto_kem/hqc-192/clean/api.h b/crypto_kem/hqc-192/clean/api.h new file mode 100644 index 00000000..5757c7a9 --- /dev/null +++ b/crypto_kem/hqc-192/clean/api.h @@ -0,0 +1,25 @@ +#ifndef PQCLEAN_HQC192_CLEAN_API_H +#define PQCLEAN_HQC192_CLEAN_API_H +/** + * @file api.h + * @brief NIST KEM API used by the HQC_KEM IND-CCA2 scheme + */ + +#define PQCLEAN_HQC192_CLEAN_CRYPTO_ALGNAME "HQC-192" + +#define PQCLEAN_HQC192_CLEAN_CRYPTO_SECRETKEYBYTES 5730 +#define PQCLEAN_HQC192_CLEAN_CRYPTO_PUBLICKEYBYTES 5690 +#define PQCLEAN_HQC192_CLEAN_CRYPTO_BYTES 64 +#define PQCLEAN_HQC192_CLEAN_CRYPTO_CIPHERTEXTBYTES 11364 + +// As a technicality, the public key is appended to the secret key in order to respect the NIST API. +// Without this constraint, PQCLEAN_HQC192_CLEAN_CRYPTO_SECRETKEYBYTES would be defined as 32 + +int PQCLEAN_HQC192_CLEAN_crypto_kem_keypair(unsigned char *pk, unsigned char *sk); + +int PQCLEAN_HQC192_CLEAN_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk); + +int PQCLEAN_HQC192_CLEAN_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-192/clean/bch.c b/crypto_kem/hqc-192/clean/bch.c new file mode 100644 index 00000000..c46cb71d --- /dev/null +++ b/crypto_kem/hqc-192/clean/bch.c @@ -0,0 +1,383 @@ +#include "bch.h" +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include "vector.h" +#include +#include +/** + * @file bch.c + * Constant time implementation of BCH codes + */ + + +static uint16_t mod(uint16_t i, uint16_t modulus); +static void compute_cyclotomic_cosets(uint16_t *cosets, uint16_t upper_bound); +static void unpack_message(uint8_t *message_unpacked, const uint64_t *message); +static void lfsr_encode(uint8_t *codeword, const uint8_t *message); +static void pack_codeword(uint64_t *codeword, const uint8_t *codeword_unpacked); +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes); +static void message_from_codeword(uint64_t *message, const uint64_t *codeword); +static void compute_syndromes(uint16_t *syndromes, const uint64_t *vector); +static void compute_roots(uint64_t *error, const uint16_t *sigma); + +/** + * @brief Returns i modulo the given modulus. + * + * i must be less than 2*modulus. + * Therefore, the return value is either i or i-modulus. + * @returns i mod (modulus) + * @param[in] i The integer whose modulo is taken + * @param[in] modulus The modulus + */ +static uint16_t mod(uint16_t i, uint16_t modulus) { + uint16_t tmp = i - modulus; + + // mask = 0xffff if(i < PARAM_GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & modulus); +} + + + +/** + * @brief Computes the odd binary cyclotomic cosets modulo 2^m-1 for integers less than upper_bound. + * + * The array cosets of size 2^m-1 is filled by placing at index i the coset representative of i. + * @param[out] cosets Array receiving the coset representatives + * @param[in] upper_bound The upper bound + */ +static void compute_cyclotomic_cosets(uint16_t *cosets, uint16_t upper_bound) { + // Compute the odd cyclotomic classes + for (uint16_t i = 1 ; i < upper_bound ; i += 2) { + if (cosets[i] == 0) { // If i does not already belong to a class + uint16_t tmp = i; + size_t j = PARAM_M; + cosets[i] = i; + while (--j) { // Complete i's class + tmp = mod(2 * tmp, PARAM_GF_MUL_ORDER); + cosets[tmp] = i; + } + } + } +} + + + +/** + * @brief Computes the generator polynomial of the primitive BCH code with given parameters. + * + * Code length is 2^m-1.
+ * Parameter t is the targeted correction capacity of the code + * and receives the real correction capacity (which is at least equal to the target).
+ * exp and log are arrays giving antilog and log of GF(2^m) elements. + * @returns the degree of the generator polynomial + * @param[out] bch_poly Array of size (m*t + 1) receiving the coefficients of the generator polynomial + * @param[in,out] t Targeted correction capacity; receives the real correction capacity + * @param[in] exp Antilog table of GF(2^m) + * @param[in] log Log table of GF(2^m) + */ +size_t PQCLEAN_HQC192_CLEAN_compute_bch_poly(uint16_t *bch_poly, size_t *t, const uint16_t *exp, const uint16_t *log) { + uint16_t cosets[PARAM_GF_MUL_ORDER]; + size_t deg_bch_poly = 0; + + memset(cosets, 0, 2 * PARAM_GF_MUL_ORDER); + compute_cyclotomic_cosets(cosets, 2 * *t); + + // Start with bch_poly(X) = 1 + bch_poly[0] = 1; + + for (uint16_t i = 1 ; i < PARAM_GF_MUL_ORDER ; ++i) { + if (cosets[i] == 0) { + continue; + } + + // Multiply bch_poly(X) by X-a^i + for (size_t j = deg_bch_poly ; j ; --j) { + int16_t mask = -((uint16_t) - bch_poly[j] >> 15); + bch_poly[j] = (mask & exp[mod(log[bch_poly[j]] + i, PARAM_GF_MUL_ORDER)]) ^ bch_poly[j - 1]; + } + bch_poly[0] = exp[mod(log[bch_poly[0]] + i, PARAM_GF_MUL_ORDER)]; + bch_poly[++deg_bch_poly] = 1; + } + + // Determine the real correction capacity + while (cosets[2 * *t + 1] != 0) { + ++*t; + } + + return deg_bch_poly; +} + + + +/** + * @brief Unpacks the message message to the array message_unpacked where each byte stores a bit of the message + * + * @param[out] message_unpacked Array of VEC_K_SIZE_BYTES bytes receiving the unpacked message + * @param[in] message Array of PARAM_K bytes storing the packed message + */ +static void unpack_message(uint8_t *message_unpacked, const uint64_t *message) { + for (size_t i = 0 ; i < (VEC_K_SIZE_64 - (PARAM_K % 64 != 0)) ; ++i) { + for (size_t j = 0 ; j < 64 ; ++j) { + message_unpacked[j + 64 * i] = (message[i] >> j) & 0x0000000000000001; + } + } + + for (int8_t j = 0 ; j < PARAM_K % 64 ; ++j) { + message_unpacked[j + 64 * (VEC_K_SIZE_64 - 1)] = (message[VEC_K_SIZE_64 - 1] >> j) & 0x0000000000000001; + } +} + + +/** + * @brief Encodes the message message to a codeword codeword using the generator polynomial bch_poly of the code + * + * @param[out] codeword Array of PARAM_N1 bytes receiving the codeword + * @param[in] message Array of PARAM_K bytes storing the message to encode + */ +static void lfsr_encode(uint8_t *codeword, const uint8_t *message) { + uint8_t gate_value = 0; + uint8_t bch_poly[PARAM_G] = PARAM_BCH_POLY; + + // Compute the Parity-check digits + for (int16_t i = PARAM_K - 1 ; i >= 0 ; --i) { + gate_value = message[i] ^ codeword[PARAM_N1 - PARAM_K - 1]; + + for (size_t j = PARAM_N1 - PARAM_K - 1 ; j ; --j) { + codeword[j] = codeword[j - 1] ^ (-gate_value & bch_poly[j]); + } + + codeword[0] = gate_value; + } + + // Add the message + memcpy(codeword + PARAM_N1 - PARAM_K, message, PARAM_K); +} + + + +/** + * @brief Packs the codeword from an array codeword_unpacked where each byte stores a bit to a compact array codeword + * + * @param[out] codeword Array of VEC_N1_SIZE_BYTES bytes receiving the packed codeword + * @param[in] codeword_unpacked Array of PARAM_N1 bytes storing the unpacked codeword + */ +static void pack_codeword(uint64_t *codeword, const uint8_t *codeword_unpacked) { + for (size_t i = 0 ; i < (VEC_N1_SIZE_64 - (PARAM_N1 % 64 != 0)) ; ++i) { + for (size_t j = 0 ; j < 64 ; ++j) { + codeword[i] |= ((uint64_t) codeword_unpacked[j + 64 * i]) << j; + } + } + + for (size_t j = 0 ; j < PARAM_N1 % 64 ; ++j) { + codeword[VEC_N1_SIZE_64 - 1] |= ((uint64_t) codeword_unpacked[j + 64 * (VEC_N1_SIZE_64 - 1)]) << j; + } +} + + +/** + * @brief Encodes a message message of PARAM_K bits to a BCH codeword codeword of PARAM_N1 bits + * + * Following @cite lin1983error (Chapter 4 - Cyclic Codes), + * We perform a systematic encoding using a linear (PARAM_N1 - PARAM_K)-stage shift register + * with feedback connections based on the generator polynomial bch_poly of the BCH code. + * + * @param[out] codeword Array of size VEC_N1_SIZE_BYTES receiving the encoded message + * @param[in] message Array of size VEC_K_SIZE_BYTES storing the message + */ +void PQCLEAN_HQC192_CLEAN_bch_code_encode(uint64_t *codeword, const uint64_t *message) { + uint8_t message_unpacked[PARAM_K]; + uint8_t codeword_unpacked[PARAM_N1] = {0}; + + unpack_message(message_unpacked, message); + lfsr_encode(codeword_unpacked, message_unpacked); + pack_codeword(codeword, codeword_unpacked); +} + + +/** + * @brief Computes the error locator polynomial (ELP) sigma + * + * This is a constant time implementation of Berlekamp's simplified algorithm (see @cite joiner1995decoding).
+ * We use the letter p for rho which is initialized at -1/2.
+ * The array X_sigma_p represents the polynomial X^(2(mu-rho))*sigma_p(X).
+ * Instead of maintaining a list of sigmas, we update in place both sigma and X_sigma_p.
+ * sigma_copy serves as a temporary save of sigma in case X_sigma_p needs to be updated.
+ * We can properly correct only if the degree of sigma does not exceed PARAM_DELTA. + * This means only the first PARAM_DELTA + 1 coefficients of sigma are of value + * and we only need to save its first PARAM_DELTA - 1 coefficients. + * + * @returns the degree of the ELP sigma + * @param[out] sigma Array of size (at least) PARAM_DELTA receiving the ELP + * @param[in] syndromes Array of size (at least) 2*PARAM_DELTA storing the syndromes + */ +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes) { + sigma[0] = 1; + size_t deg_sigma = 0; + size_t deg_sigma_p = 0; + uint16_t sigma_copy[PARAM_DELTA - 1] = {0}; + size_t deg_sigma_copy = 0; + uint16_t X_sigma_p[PARAM_DELTA + 1] = {0, 1}; + int32_t pp = -1; // 2*rho + uint16_t d_p = 1; + uint16_t d = syndromes[0]; + + for (size_t mu = 0 ; mu < PARAM_DELTA ; ++mu) { + // Save sigma in case we need it to update X_sigma_p + memcpy(sigma_copy, sigma, 2 * (PARAM_DELTA - 1)); + deg_sigma_copy = deg_sigma; + + uint16_t dd = PQCLEAN_HQC192_CLEAN_gf_mul(d, PQCLEAN_HQC192_CLEAN_gf_inverse(d_p)); // 0 if(d == 0) + for (size_t i = 1 ; (i <= 2 * mu + 1) && (i <= PARAM_DELTA) ; ++i) { + sigma[i] ^= PQCLEAN_HQC192_CLEAN_gf_mul(dd, X_sigma_p[i]); + } + + size_t deg_X = 2 * mu - pp; // 2*(mu-rho) + size_t deg_X_sigma_p = deg_X + deg_sigma_p; + + // mask1 = 0xffff if(d != 0) and 0 otherwise + int16_t mask1 = -((uint16_t) - d >> 15); + + // mask2 = 0xffff if(deg_X_sigma_p > deg_sigma) and 0 otherwise + int16_t mask2 = -((uint16_t) (deg_sigma - deg_X_sigma_p) >> 15); + + // mask12 = 0xffff if the deg_sigma increased and 0 otherwise + int16_t mask12 = mask1 & mask2; + deg_sigma = (mask12 & deg_X_sigma_p) ^ (~mask12 & deg_sigma); + + if (mu == PARAM_DELTA - 1) { + break; + } + + // Update pp, d_p and X_sigma_p if needed + pp = (mask12 & (2 * mu)) ^ (~mask12 & pp); + d_p = (mask12 & d) ^ (~mask12 & d_p); + for (size_t i = PARAM_DELTA - 1 ; i ; --i) { + X_sigma_p[i + 1] = (mask12 & sigma_copy[i - 1]) ^ (~mask12 & X_sigma_p[i - 1]); + } + X_sigma_p[1] = 0; + X_sigma_p[0] = 0; + deg_sigma_p = (mask12 & deg_sigma_copy) ^ (~mask12 & deg_sigma_p); + + // Compute the next discrepancy + d = syndromes[2 * mu + 2]; + for (size_t i = 1 ; (i <= 2 * mu + 1) && (i <= PARAM_DELTA) ; ++i) { + d ^= PQCLEAN_HQC192_CLEAN_gf_mul(sigma[i], syndromes[2 * mu + 2 - i]); + } + } + + return deg_sigma; +} + + + +/** + * @brief Retrieves the message message from the codeword codeword + * + * Since we performed a systematic encoding, the message is the last PARAM_K bits of the codeword. + * + * @param[out] message Array of size VEC_K_SIZE_BYTES receiving the message + * @param[in] codeword Array of size VEC_N1_SIZE_BYTES storing the codeword + */ +static void message_from_codeword(uint64_t *message, const uint64_t *codeword) { + int32_t val = PARAM_N1 - PARAM_K; + + uint64_t mask1 = (uint64_t) (0xffffffffffffffff << val % 64); + uint64_t mask2 = (uint64_t) (0xffffffffffffffff >> (64 - val % 64)); + size_t index = val / 64; + + for (size_t i = 0 ; i < VEC_K_SIZE_64 - 1 ; ++i) { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + uint64_t message2 = (codeword[++index] & mask2) << (64 - val % 64); + message[i] = message1 | message2; + } + + // Last byte (8-val % 8 is the number of bits given by message1) + if ((PARAM_K % 64 == 0) || (64 - val % 64 < PARAM_K % 64)) { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + uint64_t message2 = (codeword[++index] & mask2) << (64 - val % 64); + message[VEC_K_SIZE_64 - 1] = message1 | message2; + } else { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + message[VEC_K_SIZE_64 - 1] = message1; + } +} + + +/** + * @brief Computes the 2^PARAM_DELTA syndromes from the received vector vector + * + * Syndromes are the sum of powers of alpha weighted by vector's coefficients. + * To do so, we use the additive FFT transpose, which takes as input a family w of GF(2^PARAM_M) elements + * and outputs the weighted power sums of these w.
+ * Therefore, this requires twisting and applying a permutation before feeding vector to the PQCLEAN_HQC192_CLEAN_fft transpose.
+ * For more details see Berstein, Chou and Schawbe's explanations: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] syndromes Array of size 2^(PARAM_FFT_T) receiving the 2*PARAM_DELTA syndromes + * @param[in] vector Array of size VEC_N1_SIZE_BYTES storing the received word + */ +static void compute_syndromes(uint16_t *syndromes, const uint64_t *vector) { + uint16_t w[1 << PARAM_M]; + + PQCLEAN_HQC192_CLEAN_fft_t_preprocess_bch_codeword(w, vector); + PQCLEAN_HQC192_CLEAN_fft_t(syndromes, w, 2 * PARAM_DELTA); +} + + +/** + * @brief Computes the error polynomial error from the error locator polynomial sigma + * + * See function PQCLEAN_HQC192_CLEAN_fft for more details. + * + * @param[out] error Array of VEC_N1_SIZE_BYTES elements receiving the error polynomial + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + */ +static void compute_roots(uint64_t *error, const uint16_t *sigma) { + uint16_t w[1 << PARAM_M] = {0}; // w will receive the evaluation of sigma in all field elements + + PQCLEAN_HQC192_CLEAN_fft(w, sigma, PARAM_DELTA + 1); + PQCLEAN_HQC192_CLEAN_fft_retrieve_bch_error_poly(error, w); +} + + + +/** + * @brief Decodes the received word + * + * This function relies on four steps: + *
    + *
  1. The first step, done by additive FFT transpose, is the computation of the 2*PARAM_DELTA syndromes. + *
  2. The second step is the computation of the error-locator polynomial sigma. + *
  3. The third step, done by additive FFT, is finding the error-locator numbers by calculating the roots of the polynomial sigma and takings their inverses. + *
  4. The fourth step is the correction of the errors in the received polynomial. + *
+ * For a more complete picture on BCH decoding, see Shu. Lin and Daniel J. Costello in Error Control Coding: Fundamentals and Applications @cite lin1983error + * + * @param[out] message Array of size VEC_K_SIZE_BYTES receiving the decoded message + * @param[in] vector Array of size VEC_N1_SIZE_BYTES storing the received word + */ +void PQCLEAN_HQC192_CLEAN_bch_code_decode(uint64_t *message, uint64_t *vector) { + uint16_t syndromes[1 << PARAM_FFT_T] = {0}; + uint16_t sigma[1 << PARAM_FFT] = {0}; + uint64_t error[(1 << PARAM_M) / 8] = {0}; + + // Calculate the 2*PARAM_DELTA syndromes + compute_syndromes(syndromes, vector); + + // Compute the error locator polynomial sigma + // Sigma's degree is at most PARAM_DELTA but the FFT requires the extra room + compute_elp(sigma, syndromes); + + // Compute the error polynomial error + compute_roots(error, sigma); + + // Add the error polynomial to the received polynomial + PQCLEAN_HQC192_CLEAN_vect_add(vector, vector, error, VEC_N1_SIZE_64); + + // Retrieve the message from the decoded codeword + message_from_codeword(message, vector); + +} diff --git a/crypto_kem/hqc-192/clean/bch.h b/crypto_kem/hqc-192/clean/bch.h new file mode 100644 index 00000000..62fb70b4 --- /dev/null +++ b/crypto_kem/hqc-192/clean/bch.h @@ -0,0 +1,23 @@ +#ifndef BCH_H +#define BCH_H + + +/** + * @file bch.h + * Header file of bch.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQC192_CLEAN_bch_code_encode(uint64_t *codeword, const uint64_t *message); + +void PQCLEAN_HQC192_CLEAN_bch_code_decode(uint64_t *message, uint64_t *vector); + + +size_t PQCLEAN_HQC192_CLEAN_compute_bch_poly(uint16_t *bch_poly, size_t *t, const uint16_t *exp, const uint16_t *log); + + +#endif diff --git a/crypto_kem/hqc-192/clean/code.c b/crypto_kem/hqc-192/clean/code.c new file mode 100644 index 00000000..7798f037 --- /dev/null +++ b/crypto_kem/hqc-192/clean/code.c @@ -0,0 +1,49 @@ +#include "bch.h" +#include "code.h" +#include "parameters.h" +#include "repetition.h" +#include +#include +/** + * @file code.c + * @brief Implementation of tensor code + */ + + + +/** + * + * @brief Encoding the message m to a code word em using the tensor code + * + * First we encode the message using the BCH code, then with the repetition code to obtain + * a tensor code word. + * + * @param[out] em Pointer to an array that is the tensor code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQC192_CLEAN_code_encode(uint64_t *em, const uint64_t *m) { + + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQC192_CLEAN_bch_code_encode(tmp, m); + PQCLEAN_HQC192_CLEAN_repetition_code_encode(em, tmp); + +} + + + +/** + * @brief Decoding the code word em to a message m using the tensor code + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQC192_CLEAN_code_decode(uint64_t *m, const uint64_t *em) { + + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQC192_CLEAN_repetition_code_decode(tmp, em); + PQCLEAN_HQC192_CLEAN_bch_code_decode(m, tmp); + + +} diff --git a/crypto_kem/hqc-192/clean/code.h b/crypto_kem/hqc-192/clean/code.h new file mode 100644 index 00000000..b6e0a50c --- /dev/null +++ b/crypto_kem/hqc-192/clean/code.h @@ -0,0 +1,20 @@ +#ifndef CODE_H +#define CODE_H + + +/** + * @file code.h + * Header file of code.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQC192_CLEAN_code_encode(uint64_t *em, const uint64_t *message); + +void PQCLEAN_HQC192_CLEAN_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-192/clean/fft.c b/crypto_kem/hqc-192/clean/fft.c new file mode 100644 index 00000000..44a7ab2e --- /dev/null +++ b/crypto_kem/hqc-192/clean/fft.c @@ -0,0 +1,627 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include +#include +#include +/** + * @file fft.c + * Implementation of the additive FFT and its transpose. + * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + */ + + +static void compute_fft_betas(uint16_t *betas); +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size); +static void radix_t(uint16_t *f, const uint16_t *f0, const uint16_t *f1, uint32_t m_f); +static void fft_t_rec(uint16_t *f, const uint16_t *w, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f); +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); + + +/** + * @brief Computes the basis of betas (omitting 1) used in the additive FFT and its transpose + * + * @param[out] betas Array of size PARAM_M-1 + */ +static void compute_fft_betas(uint16_t *betas) { + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + betas[i] = 1 << (PARAM_M - 1 - i); + } +} + + + +/** + * @brief Computes the subset sums of the given set + * + * The array subset_sums is such that its ith element is + * the subset sum of the set elements given by the binary form of i. + * + * @param[out] subset_sums Array of size 2^set_size receiving the subset sums + * @param[in] set Array of set_size elements + * @param[in] set_size Size of the array set + */ +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size) { + subset_sums[0] = 0; + + for (size_t i = 0 ; i < set_size ; ++i) { + for (size_t j = 0 ; j < (1U << i) ; ++j) { + subset_sums[(1 << i) + j] = set[i] ^ subset_sums[j]; + } + } +} + + + +/** + * @brief Transpose of the linear radix conversion + * + * This is a direct transposition of the radix function + * implemented following the process of transposing a linear function as exposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f Array of size a power of 2 + * @param[in] f0 Array half the size of f + * @param[in] f1 Array half the size of f + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix_t(uint16_t *f, const uint16_t *f0, const uint16_t *f1, uint32_t m_f) { + switch (m_f) { + case 4: + f[0] = f0[0]; + f[1] = f1[0]; + f[2] = f0[1] ^ f1[0]; + f[3] = f[2] ^ f1[1]; + f[4] = f[2] ^ f0[2]; + f[5] = f[3] ^ f1[2]; + f[6] = f[4] ^ f0[3] ^ f1[2]; + f[7] = f[3] ^ f0[3] ^ f1[3]; + f[8] = f[4] ^ f0[4]; + f[9] = f[5] ^ f1[4]; + f[10] = f[6] ^ f0[5] ^ f1[4]; + f[11] = f[7] ^ f0[5] ^ f1[4] ^ f1[5]; + f[12] = f[8] ^ f0[5] ^ f0[6] ^ f1[4]; + f[13] = f[7] ^ f[9] ^ f[11] ^ f1[6]; + f[14] = f[6] ^ f0[6] ^ f0[7] ^ f1[6]; + f[15] = f[7] ^ f0[7] ^ f1[7]; + return; + + case 3: + f[0] = f0[0]; + f[1] = f1[0]; + f[2] = f0[1] ^ f1[0]; + f[3] = f[2] ^ f1[1]; + f[4] = f[2] ^ f0[2]; + f[5] = f[3] ^ f1[2]; + f[6] = f[4] ^ f0[3] ^ f1[2]; + f[7] = f[3] ^ f0[3] ^ f1[3]; + return; + + case 2: + f[0] = f0[0]; + f[1] = f1[0]; + f[2] = f0[1] ^ f1[0]; + f[3] = f[2] ^ f1[1]; + return; + + case 1: + f[0] = f0[0]; + f[1] = f1[0]; + return; + + default: + ; + + size_t n = 1 << (m_f - 2); + + uint16_t Q0[1 << (PARAM_FFT_T - 2)]; + uint16_t Q1[1 << (PARAM_FFT_T - 2)]; + uint16_t R0[1 << (PARAM_FFT_T - 2)]; + uint16_t R1[1 << (PARAM_FFT_T - 2)]; + + uint16_t Q[1 << 2 * (PARAM_FFT_T - 2)]; + uint16_t R[1 << 2 * (PARAM_FFT_T - 2)]; + + memcpy(Q0, f0 + n, 2 * n); + memcpy(Q1, f1 + n, 2 * n); + memcpy(R0, f0, 2 * n); + memcpy(R1, f1, 2 * n); + + radix_t (Q, Q0, Q1, m_f - 1); + radix_t (R, R0, R1, m_f - 1); + + memcpy(f, R, 4 * n); + memcpy(f + 2 * n, R + n, 2 * n); + memcpy(f + 3 * n, Q + n, 2 * n); + + for (size_t i = 0 ; i < n ; ++i) { + f[2 * n + i] ^= Q[i]; + f[3 * n + i] ^= f[2 * n + i]; + } + } +} + + + +/** + * @brief Recursively computes syndromes of family w + * + * This function is a subroutine of the function fft_t + * + * @param[out] f Array receiving the syndromes + * @param[in] w Array storing the family + * @param[in] f_coeffs Length of syndromes vector + * @param[in] m 2^m is the smallest power of 2 greater or equal to the length of family w + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the length of f + * @param[in] betas FFT constants + */ +static void fft_t_rec(uint16_t *f, const uint16_t *w, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + size_t k = 1 << (m - 1); + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + uint16_t gammas_sums[1 << (PARAM_M - 1)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t f0[1 << (PARAM_FFT_T - 2)] = {0}; + uint16_t f1[1 << (PARAM_FFT_T - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + f[0] = 0; + for (size_t i = 0 ; i < (1U << m) ; ++i) { + f[0] ^= w[i]; + } + f[1] = 0; + + uint16_t betas_sums[1 << (PARAM_M - 1)]; + betas_sums[0] = 0; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + size_t index = (1 << j) + k; + betas_sums[index] = betas_sums[k] ^ betas[j]; + f[1] ^= PQCLEAN_HQC192_CLEAN_gf_mul(betas_sums[index], w[index]); + } + } + + return; + } + + // Compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQC192_CLEAN_gf_mul(betas[i], PQCLEAN_HQC192_CLEAN_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQC192_CLEAN_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas subset sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + /* Step 6: Compute u and v from w (aka w) + * w[i] = u[i] + G[i].v[i] + * w[k+i] = w[i] + v[i] = u[i] + (G[i]+1).v[i] + * Transpose: + * u[i] = w[i] + w[k+i] + * v[i] = G[i].w[i] + (G[i]+1).w[k+i] = G[i].u[i] + w[k+i] */ + if (f_coeffs <= 3) { // 3-coefficient polynomial f case + // Step 5: Compute f0 from u and f1 from v + f1[1] = 0; + u[0] = w[0] ^ w[k]; + f1[0] = w[k]; + for (size_t i = 1 ; i < k ; ++i) { + u[i] = w[i] ^ w[k + i]; + f1[0] ^= PQCLEAN_HQC192_CLEAN_gf_mul(gammas_sums[i], u[i]) ^ w[k + i]; + } + fft_t_rec(f0, u, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + } else { + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + u[0] = w[0] ^ w[k]; + v[0] = w[k]; + + for (size_t i = 1 ; i < k ; ++i) { + u[i] = w[i] ^ w[k + i]; + v[i] = PQCLEAN_HQC192_CLEAN_gf_mul(gammas_sums[i], u[i]) ^ w[k + i]; + } + + // Step 5: Compute f0 from u and f1 from v + fft_t_rec(f0, u, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + fft_t_rec(f1, v, f_coeffs / 2, m - 1, m_f - 1, deltas); + } + + // Step 3: Compute g from g0 and g1 + radix_t(f, f0, f1, m_f); + + // Step 2: compute f from g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQC192_CLEAN_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQC192_CLEAN_gf_mul(beta_m_pow, f[i]); + } + } +} + + + +/** + * @brief Computes the syndromes f of the family w + * + * Since the syndromes linear map is the transpose of multipoint evaluation, + * it uses exactly the same constants, either hardcoded or precomputed by compute_fft_lut(...).
+ * This follows directives from Bernstein, Chou and Schwabe given here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f Array of size 2*(PARAM_FFT_T) elements receiving the syndromes + * @param[in] w Array of PARAM_GF_MUL_ORDER+1 elements + * @param[in] f_coeffs Length of syndromes vector f + */ +void PQCLEAN_HQC192_CLEAN_fft_t(uint16_t *f, const uint16_t *w, size_t f_coeffs) { + // Transposed from Gao and Mateer algorithm + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)] = {0}; + uint16_t v[1 << (PARAM_M - 1)] = {0}; + uint16_t deltas[PARAM_M - 1]; + uint16_t f0[1 << (PARAM_FFT_T - 1)]; + uint16_t f1[1 << (PARAM_FFT_T - 1)]; + + compute_fft_betas(betas); + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + /* Step 6: Compute u and v from w (aka w) + * + * We had: + * w[i] = u[i] + G[i].v[i] + * w[k+i] = w[i] + v[i] = u[i] + (G[i]+1).v[i] + * Transpose: + * u[i] = w[i] + w[k+i] + * v[i] = G[i].w[i] + (G[i]+1).w[k+i] = G[i].u[i] + w[k+i] */ + u[0] = w[0] ^ w[k]; + v[0] = w[k]; + for (size_t i = 1 ; i < k ; ++i) { + u[i] = w[i] ^ w[k + i]; + v[i] = PQCLEAN_HQC192_CLEAN_gf_mul(betas_sums[i], u[i]) ^ w[k + i]; + } + + // Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQC192_CLEAN_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5: Compute f0 from u and f1 from v + fft_t_rec(f0, u, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT_T - 1, deltas); + fft_t_rec(f1, v, f_coeffs / 2, PARAM_M - 1, PARAM_FFT_T - 1, deltas); + + // Step 3: Compute g from g0 and g1 + radix_t(f, f0, f1, PARAM_FFT_T); + + // Step 2: beta_m = 1 so f = g +} + + + +/** + * @brief Computes the radix conversion of a polynomial f in GF(2^m)[x] + * + * Computes f0 and f1 such that f(x) = f0(x^2-x) + x.f1(x^2-x) + * as proposed by Bernstein, Chou and Schwabe: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f0 Array half the size of f + * @param[out] f1 Array half the size of f + * @param[in] f Array of size a power of 2 + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f) { + switch (m_f) { + case 4: + f0[4] = f[8] ^ f[12]; + f0[6] = f[12] ^ f[14]; + f0[7] = f[14] ^ f[15]; + f1[5] = f[11] ^ f[13]; + f1[6] = f[13] ^ f[14]; + f1[7] = f[15]; + f0[5] = f[10] ^ f[12] ^ f1[5]; + f1[4] = f[9] ^ f[13] ^ f0[5]; + + f0[0] = f[0]; + f1[3] = f[7] ^ f[11] ^ f[15]; + f0[3] = f[6] ^ f[10] ^ f[14] ^ f1[3]; + f0[2] = f[4] ^ f0[4] ^ f0[3] ^ f1[3]; + f1[1] = f[3] ^ f[5] ^ f[9] ^ f[13] ^ f1[3]; + f1[2] = f[3] ^ f1[1] ^ f0[3]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 3: + f0[0] = f[0]; + f0[2] = f[4] ^ f[6]; + f0[3] = f[6] ^ f[7]; + f1[1] = f[3] ^ f[5] ^ f[7]; + f1[2] = f[5] ^ f[6]; + f1[3] = f[7]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 2: + f0[0] = f[0]; + f0[1] = f[2] ^ f[3]; + f1[0] = f[1] ^ f0[1]; + f1[1] = f[3]; + return; + + case 1: + f0[0] = f[0]; + f1[0] = f[1]; + return; + + default: + ; + size_t n = 1 << (m_f - 2); + + uint16_t Q[2 * (1 << (PARAM_FFT - 2))]; + uint16_t R[2 * (1 << (PARAM_FFT - 2))]; + + uint16_t Q0[1 << (PARAM_FFT - 2)]; + uint16_t Q1[1 << (PARAM_FFT - 2)]; + uint16_t R0[1 << (PARAM_FFT - 2)]; + uint16_t R1[1 << (PARAM_FFT - 2)]; + + memcpy(Q, f + 3 * n, 2 * n); + memcpy(Q + n, f + 3 * n, 2 * n); + memcpy(R, f, 4 * n); + + for (size_t i = 0 ; i < n ; ++i) { + Q[i] ^= f[2 * n + i]; + R[n + i] ^= Q[i]; + } + + radix(Q0, Q1, Q, m_f - 1); + radix(R0, R1, R, m_f - 1); + + memcpy(f0, R0, 2 * n); + memcpy(f0 + n, Q0, 2 * n); + memcpy(f1, R1, 2 * n); + memcpy(f1 + n, Q1, 2 * n); + } +} + + + +/** + * @brief Evaluates f at all subset sums of a given set + * + * This function is a subroutine of the function fft. + * + * @param[out] w Array + * @param[in] f Array + * @param[in] f_coeffs Number of coefficients of f + * @param[in] m Number of betas + * @param[in] m_f Number of coefficients of f (one more than its degree) + * @param[in] betas FFT constants + */ +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + uint16_t f0[1 << (PARAM_FFT - 2)]; + uint16_t f1[1 << (PARAM_FFT - 2)]; + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + size_t k = 1 << (m - 1); + uint16_t gammas_sums[1 << (PARAM_M - 2)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + uint16_t tmp[PARAM_M - (PARAM_FFT - 1)]; + for (size_t i = 0 ; i < m ; ++i) { + tmp[i] = PQCLEAN_HQC192_CLEAN_gf_mul(betas[i], f[1]); + } + + w[0] = f[0]; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + w[(1 << j) + k] = w[k] ^ tmp[j]; + } + } + + return; + } + + // Step 2: compute g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQC192_CLEAN_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQC192_CLEAN_gf_mul(beta_m_pow, f[i]); + } + } + + // Step 3 + radix(f0, f1, f, m_f); + + // Step 4: compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQC192_CLEAN_gf_mul(betas[i], PQCLEAN_HQC192_CLEAN_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQC192_CLEAN_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + + if (f_coeffs <= 3) { // 3-coefficient polynomial f case: f1 is constant + w[0] = u[0]; + w[k] = u[0] ^ f1[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC192_CLEAN_gf_mul(gammas_sums[i], f1[0]); + w[k + i] = w[i] ^ f1[0]; + } + } else { + fft_rec(v, f1, f_coeffs / 2, m - 1, m_f - 1, deltas); + + // Step 6 + memcpy(w + k, v, 2 * k); + w[0] = u[0]; + w[k] ^= u[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC192_CLEAN_gf_mul(gammas_sums[i], v[i]); + w[k + i] ^= w[i]; + } + } +} + + + +/** + * @brief Evaluates f on all fields elements using an additive FFT algorithm + * + * f_coeffs is the number of coefficients of f (one less than its degree).
+ * The FFT proceeds recursively to evaluate f at all subset sums of a basis B.
+ * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf
+ * Note that on this first call (as opposed to the recursive calls to fft_rec), gammas are equal to betas, + * meaning the first gammas subset sums are actually the subset sums of betas (except 1).
+ * Also note that f is altered during computation (twisted at each level). + * + * @param[out] w Array + * @param[in] f Array of 2^PARAM_FFT elements + * @param[in] f_coeffs Number coefficients of f (i.e. deg(f)+1) + */ +void PQCLEAN_HQC192_CLEAN_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs) { + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + uint16_t f0[1 << (PARAM_FFT - 1)]; + uint16_t f1[1 << (PARAM_FFT - 1)]; + uint16_t deltas[PARAM_M - 1]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)]; + uint16_t v[1 << (PARAM_M - 1)]; + + // Follows Gao and Mateer algorithm + compute_fft_betas(betas); + + // Step 1: PARAM_FFT > 1, nothing to do + + // Compute gammas sums + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + // Step 2: beta_m = 1, nothing to do + + // Step 3 + radix(f0, f1, f, PARAM_FFT); + + // Step 4: Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQC192_CLEAN_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + fft_rec(v, f1, f_coeffs / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + + // Step 6, 7 and error polynomial computation + memcpy(w + k, v, 2 * k); + + // Check if 0 is root + w[0] = u[0]; + + // Check if 1 is root + w[k] ^= u[0]; + + // Find other roots + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC192_CLEAN_gf_mul(betas_sums[i], v[i]); + w[k + i] ^= w[i]; + } +} + + + +/** + * @brief Arranges the received word vector in a form w such that applying the additive FFT transpose to w yields the BCH syndromes of the received word vector. + * + * Since the received word vector gives coefficients of the primitive element alpha, we twist accordingly.
+ * Furthermore, the additive FFT transpose needs elements indexed by their decomposition on the chosen basis, + * so we apply the adequate permutation. + * + * @param[out] w Array of size 2^PARAM_M + * @param[in] vector Array of size VEC_N1_SIZE_BYTES + */ +void PQCLEAN_HQC192_CLEAN_fft_t_preprocess_bch_codeword(uint16_t *w, const uint64_t *vector) { + uint16_t r[1 << PARAM_M]; + uint16_t gammas[PARAM_M - 1]; + uint16_t gammas_sums[1 << (PARAM_M - 1)]; + size_t k = 1 << (PARAM_M - 1); + + // Unpack the received word vector into array r + size_t i; + for (i = 0 ; i < VEC_N1_SIZE_64 - (PARAM_N1 % 64 != 0) ; ++i) { + for (size_t j = 0 ; j < 64 ; ++j) { + r[64 * i + j] = (uint8_t) ((vector[i] >> j) & 1); + } + } + + // Last byte + for (size_t j = 0 ; j < PARAM_N1 % 64 ; ++j) { + r[64 * i + j] = (uint8_t) ((vector[i] >> j) & 1); + } + + // Complete r with zeros + memset(r + PARAM_N1, 0, 2 * ((1 << PARAM_M) - PARAM_N1)); + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + // Twist and permute r adequately to obtain w + w[0] = 0; + w[k] = -r[0] & 1; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = -r[PQCLEAN_HQC192_CLEAN_gf_log(gammas_sums[i])] & gammas_sums[i]; + w[k + i] = -r[PQCLEAN_HQC192_CLEAN_gf_log(gammas_sums[i] ^ 1)] & (gammas_sums[i] ^ 1); + } +} + + + +/** + * @brief Retrieves the error polynomial error from the evaluations w of the ELP (Error Locator Polynomial) on all field elements. + * + * @param[out] error Array of size VEC_N1_SIZE_BYTES + * @param[in] w Array of size 2^PARAM_M + */ +void PQCLEAN_HQC192_CLEAN_fft_retrieve_bch_error_poly(uint64_t *error, const uint16_t *w) { + uint16_t gammas[PARAM_M - 1]; + uint16_t gammas_sums[1 << (PARAM_M - 1)]; + size_t k = 1 << (PARAM_M - 1); + size_t index = PARAM_GF_MUL_ORDER; + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + error[0] ^= ((uint64_t) 1) ^ ((uint16_t) - w[0] >> 15); + uint64_t bit = ((uint64_t) 1) ^ ((uint16_t) - w[k] >> 15); + error[index / 8] ^= bit << (index % 64); + + for (size_t i = 1 ; i < k ; ++i) { + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQC192_CLEAN_gf_log(gammas_sums[i]); + bit = ((uint64_t) 1) ^ ((uint16_t) - w[i] >> 15); + error[index / 64] ^= bit << (index % 64); + + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQC192_CLEAN_gf_log(gammas_sums[i] ^ 1); + bit = ((uint64_t) 1) ^ ((uint16_t) - w[k + i] >> 15); + error[index / 64] ^= bit << (index % 64); + } +} diff --git a/crypto_kem/hqc-192/clean/fft.h b/crypto_kem/hqc-192/clean/fft.h new file mode 100644 index 00000000..bba8d316 --- /dev/null +++ b/crypto_kem/hqc-192/clean/fft.h @@ -0,0 +1,25 @@ +#ifndef FFT_H +#define FFT_H + + +/** + * @file fft.h + * Header file of fft.c + */ + +#include + +#include +#include + +void PQCLEAN_HQC192_CLEAN_fft_t(uint16_t *f, const uint16_t *w, size_t f_coeffs); + +void PQCLEAN_HQC192_CLEAN_fft_t_preprocess_bch_codeword(uint16_t *w, const uint64_t *vector); + + +void PQCLEAN_HQC192_CLEAN_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs); + +void PQCLEAN_HQC192_CLEAN_fft_retrieve_bch_error_poly(uint64_t *error, const uint16_t *w); + + +#endif diff --git a/crypto_kem/hqc-192/clean/gf.c b/crypto_kem/hqc-192/clean/gf.c new file mode 100644 index 00000000..7be78f3f --- /dev/null +++ b/crypto_kem/hqc-192/clean/gf.c @@ -0,0 +1,132 @@ +#include "gf.h" +#include "parameters.h" +#include +/** + * @file gf.c + * Galois field implementation with multiplication using lookup tables + */ + + + +/** + * Powers of the root alpha of x^10 + x^3 + 1. + * The last two elements are needed by the PQCLEAN_HQC192_CLEAN_gf_mul function from gf_mul.c + * (for example if both elements to multiply are zero). + */ +static const uint16_t exp[1026] = { + 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 9, 18, 36, 72, 144, 288, 576, 137, 274, 548, 65, 130, 260, 520, 25, 50, 100, 200, 400, 800, 585, 155, 310, 620, 209, 418, 836, 641, 267, 534, 37, 74, 148, 296, 592, 169, 338, 676, 321, 642, 269, 538, 61, 122, 244, 488, 976, 937, 859, 703, 375, 750, 469, 938, 861, 691, 367, 734, 437, 874, 733, 435, 870, 709, 387, 774, 517, 3, 6, 12, 24, 48, 96, 192, 384, 768, 521, 27, 54, 108, 216, 432, 864, 713, 411, 822, 613, 195, 390, 780, 529, 43, 86, 172, 344, 688, 361, 722, 429, 858, 701, 371, 742, 453, 906, 797, 563, 111, 222, 444, 888, 761, 507, 1014, 997, 963, 911, 791, 551, 71, 142, 284, 568, 121, 242, 484, 968, 921, 827, 639, 247, 494, 988, 945, 875, 735, 439, 878, 725, 419, 838, 645, 259, 518, 5, 10, 20, 40, 80, 160, 320, 640, 265, 530, 45, 90, 180, 360, 720, 425, 850, 685, 339, 678, 325, 650, 285, 570, 125, 250, 500, 1000, 985, 955, 895, 759, 487, 974, 917, 803, 591, 151, 302, 604, 177, 354, 708, 385, 770, 525, 19, 38, 76, 152, 304, 608, 201, 402, 804, 577, 139, 278, 556, 81, 162, 324, 648, 281, 562, 109, 218, 436, 872, 729, 443, 886, 741, 451, 902, 773, 515, 15, 30, 60, 120, 240, 480, 960, 905, 795, 575, 119, 238, 476, 952, 889, 763, 511, 1022, 1013, 995, 975, 919, 807, 583, 135, 270, 540, 49, 98, 196, 392, 784, 553, 91, 182, 364, 728, 441, 882, 749, 467, 934, 837, 643, 271, 542, 53, 106, 212, 424, 848, 681, 347, 694, 357, 714, 413, 826, 637, 243, 486, 972, 913, 811, 607, 183, 366, 732, 433, 866, 717, 403, 806, 581, 131, 262, 524, 17, 34, 68, 136, 272, 544, 73, 146, 292, 584, 153, 306, 612, 193, 386, 772, 513, 11, 22, 44, 88, 176, 352, 704, 393, 786, 557, 83, 166, 332, 664, 313, 626, 237, 474, 948, 865, 715, 415, 830, 629, 227, 454, 908, 785, 555, 95, 190, 380, 760, 505, 1010, 1005, 979, 943, 855, 679, 327, 654, 277, 554, 93, 186, 372, 744, 473, 946, 877, 723, 431, 862, 693, 355, 710, 389, 778, 541, 51, 102, 204, 408, 816, 617, 219, 438, 876, 721, 427, 854, 677, 323, 646, 261, 522, 29, 58, 116, 232, 464, 928, 841, 667, 319, 638, 245, 490, 980, 929, 843, 671, 311, 622, 213, 426, 852, 673, 331, 662, 293, 586, 157, 314, 628, 225, 450, 900, 769, 523, 31, 62, 124, 248, 496, 992, 969, 923, 831, 631, 231, 462, 924, 817, 619, 223, 446, 892, 753, 491, 982, 933, 835, 655, 279, 558, 85, 170, 340, 680, 345, 690, 365, 730, 445, 890, 765, 499, 998, 965, 899, 783, 535, 39, 78, 156, 312, 624, 233, 466, 932, 833, 651, 287, 574, 117, 234, 468, 936, 857, 699, 383, 766, 501, 1002, 989, 947, 879, 727, 423, 846, 661, 291, 582, 133, 266, 532, 33, 66, 132, 264, 528, 41, 82, 164, 328, 656, 297, 594, 173, 346, 692, 353, 706, 397, 794, 573, 115, 230, 460, 920, 825, 635, 255, 510, 1020, 1009, 1003, 991, 951, 871, 711, 391, 782, 533, 35, 70, 140, 280, 560, 105, 210, 420, 840, 665, 315, 630, 229, 458, 916, 801, 587, 159, 318, 636, 241, 482, 964, 897, 779, 543, 55, 110, 220, 440, 880, 745, 475, 950, 869, 707, 399, 798, 565, 99, 198, 396, 792, 569, 123, 246, 492, 984, 953, 891, 767, 503, 1006, 981, 931, 847, 663, 295, 590, 149, 298, 596, 161, 322, 644, 257, 514, 13, 26, 52, 104, 208, 416, 832, 649, 283, 566, 101, 202, 404, 808, 601, 187, 374, 748, 465, 930, 845, 659, 303, 606, 181, 362, 724, 417, 834, 653, 275, 550, 69, 138, 276, 552, 89, 178, 356, 712, 409, 818, 621, 211, 422, 844, 657, 299, 598, 165, 330, 660, 289, 578, 141, 282, 564, 97, 194, 388, 776, 537, 59, 118, 236, 472, 944, 873, 731, 447, 894, 757, 483, 966, 901, 771, 527, 23, 46, 92, 184, 368, 736, 457, 914, 813, 595, 175, 350, 700, 369, 738, 461, 922, 829, 627, 239, 478, 956, 881, 747, 479, 958, 885, 739, 463, 926, 821, 611, 207, 414, 828, 625, 235, 470, 940, 849, 683, 351, 702, 373, 746, 477, 954, 893, 755, 495, 990, 949, 867, 719, 407, 814, 597, 163, 326, 652, 273, 546, 77, 154, 308, 616, 217, 434, 868, 705, 395, 790, 549, 67, 134, 268, 536, 57, 114, 228, 456, 912, 809, 603, 191, 382, 764, 497, 994, 973, 915, 815, 599, 167, 334, 668, 305, 610, 205, 410, 820, 609, 203, 406, 812, 593, 171, 342, 684, 337, 674, 333, 666, 317, 634, 253, 506, 1012, 993, 971, 927, 823, 615, 199, 398, 796, 561, 107, 214, 428, 856, 697, 379, 758, 485, 970, 925, 819, 623, 215, 430, 860, 689, 363, 726, 421, 842, 669, 307, 614, 197, 394, 788, 545, 75, 150, 300, 600, 185, 370, 740, 449, 898, 781, 531, 47, 94, 188, 376, 752, 489, 978, 941, 851, 687, 343, 686, 341, 682, 349, 698, 381, 762, 509, 1018, 1021, 1011, 1007, 983, 935, 839, 647, 263, 526, 21, 42, 84, 168, 336, 672, 329, 658, 301, 602, 189, 378, 756, 481, 962, 909, 787, 559, 87, 174, 348, 696, 377, 754, 493, 986, 957, 883, 751, 471, 942, 853, 675, 335, 670, 309, 618, 221, 442, 884, 737, 459, 918, 805, 579, 143, 286, 572, 113, 226, 452, 904, 793, 571, 127, 254, 508, 1016, 1017, 1019, 1023, 1015, 999, 967, 903, 775, 519, 7, 14, 28, 56, 112, 224, 448, 896, 777, 539, 63, 126, 252, 504, 1008, 1001, 987, 959, 887, 743, 455, 910, 789, 547, 79, 158, 316, 632, 249, 498, 996, 961, 907, 799, 567, 103, 206, 412, 824, 633, 251, 502, 1004, 977, 939, 863, 695, 359, 718, 405, 810, 605, 179, 358, 716, 401, 802, 589, 147, 294, 588, 145, 290, 580, 129, 258, 516, 1, 2, 4 +}; + + + +/** + * Logarithm of elements of GF(2^10) to the base alpha (root of x^10 + x^3 + 1). + * The logarithm of 0 is set to 1024 by convention. + */ +static const uint16_t log[1024] = { + 1024, 0, 1, 77, 2, 154, 78, 956, 3, 10, 155, 325, 79, 618, 957, 231, 4, 308, 11, 200, 156, 889, 326, 695, 80, 24, 619, 87, 958, 402, 232, 436, 5, 513, 309, 551, 12, 40, 201, 479, 157, 518, 890, 101, 327, 164, 696, 860, 81, 258, 25, 385, 620, 277, 88, 577, 959, 772, 403, 680, 233, 52, 437, 966, 6, 20, 514, 768, 310, 650, 552, 129, 13, 314, 41, 849, 202, 757, 480, 980, 158, 213, 519, 335, 891, 462, 102, 907, 328, 654, 165, 264, 697, 369, 861, 354, 82, 675, 259, 590, 26, 628, 386, 991, 621, 556, 278, 822, 89, 219, 578, 117, 960, 937, 773, 533, 404, 491, 681, 241, 234, 133, 53, 595, 438, 178, 967, 943, 7, 1020, 21, 305, 515, 510, 769, 255, 311, 17, 651, 210, 553, 672, 130, 934, 14, 1017, 315, 1014, 42, 610, 850, 191, 203, 318, 758, 31, 481, 428, 981, 568, 159, 613, 214, 752, 520, 667, 336, 788, 892, 45, 463, 801, 103, 525, 908, 705, 329, 194, 655, 1008, 166, 642, 265, 296, 698, 853, 370, 633, 862, 899, 355, 779, 83, 321, 676, 97, 260, 845, 591, 818, 27, 206, 629, 797, 387, 793, 992, 727, 622, 34, 557, 661, 279, 420, 823, 834, 90, 761, 220, 391, 579, 926, 118, 451, 961, 431, 938, 349, 774, 563, 534, 446, 405, 484, 492, 731, 682, 341, 242, 714, 235, 571, 134, 290, 54, 412, 596, 140, 439, 984, 179, 996, 968, 810, 944, 539, 8, 616, 1021, 152, 22, 400, 306, 887, 516, 162, 511, 38, 770, 50, 256, 275, 312, 755, 18, 648, 652, 367, 211, 460, 554, 217, 673, 626, 131, 176, 935, 489, 15, 670, 1018, 508, 316, 426, 1015, 608, 43, 523, 611, 665, 851, 897, 192, 640, 204, 791, 319, 843, 759, 924, 32, 418, 482, 339, 429, 561, 982, 808, 569, 410, 160, 48, 614, 398, 215, 174, 753, 365, 521, 895, 668, 424, 337, 806, 789, 922, 893, 804, 46, 172, 464, 872, 802, 870, 104, 466, 526, 283, 909, 874, 706, 736, 330, 528, 195, 380, 656, 285, 1009, 1003, 167, 106, 643, 838, 266, 468, 297, 66, 699, 708, 854, 111, 371, 738, 634, 60, 863, 911, 900, 827, 356, 876, 780, 497, 84, 197, 322, 74, 677, 382, 98, 548, 261, 332, 846, 765, 592, 530, 819, 587, 28, 1011, 207, 302, 630, 1005, 798, 749, 388, 658, 794, 94, 993, 287, 728, 346, 623, 645, 35, 149, 558, 840, 662, 505, 280, 169, 421, 395, 824, 108, 835, 377, 91, 299, 762, 71, 221, 68, 392, 146, 580, 268, 927, 224, 119, 470, 452, 687, 962, 856, 432, 227, 939, 113, 350, 976, 775, 701, 564, 930, 535, 710, 447, 723, 406, 636, 485, 271, 493, 62, 732, 918, 683, 373, 342, 583, 243, 740, 715, 719, 236, 902, 572, 690, 135, 829, 291, 186, 55, 865, 413, 455, 597, 913, 141, 744, 440, 782, 985, 473, 180, 499, 997, 602, 969, 358, 811, 122, 945, 878, 540, 247, 9, 324, 617, 230, 1022, 76, 153, 955, 23, 86, 401, 435, 307, 199, 888, 694, 517, 100, 163, 859, 512, 550, 39, 478, 771, 679, 51, 965, 257, 384, 276, 576, 313, 848, 756, 979, 19, 767, 649, 128, 653, 263, 368, 353, 212, 334, 461, 906, 555, 821, 218, 116, 674, 589, 627, 990, 132, 594, 177, 942, 936, 532, 490, 240, 16, 209, 671, 933, 1019, 304, 509, 254, 317, 30, 427, 567, 1016, 1013, 609, 190, 44, 800, 524, 704, 612, 751, 666, 787, 852, 632, 898, 778, 193, 1007, 641, 295, 205, 796, 792, 726, 320, 96, 844, 817, 760, 390, 925, 450, 33, 660, 419, 833, 483, 730, 340, 713, 430, 348, 562, 445, 983, 995, 809, 538, 570, 289, 411, 139, 161, 37, 49, 274, 615, 151, 399, 886, 216, 625, 175, 488, 754, 647, 366, 459, 522, 664, 896, 639, 669, 507, 425, 607, 338, 560, 807, 409, 790, 842, 923, 417, 894, 423, 805, 921, 47, 397, 173, 364, 465, 282, 873, 735, 803, 171, 871, 869, 105, 837, 467, 65, 527, 379, 284, 1002, 910, 826, 875, 496, 707, 110, 737, 59, 331, 764, 529, 586, 196, 73, 381, 547, 657, 93, 286, 345, 1010, 301, 1004, 748, 168, 394, 107, 376, 644, 148, 839, 504, 267, 223, 469, 686, 298, 70, 67, 145, 700, 929, 709, 722, 855, 226, 112, 975, 372, 582, 739, 718, 635, 270, 61, 917, 864, 454, 912, 743, 901, 689, 828, 185, 357, 121, 877, 246, 781, 472, 498, 601, 85, 434, 198, 693, 323, 229, 75, 954, 678, 964, 383, 575, 99, 858, 549, 477, 262, 352, 333, 905, 847, 978, 766, 127, 593, 941, 531, 239, 820, 115, 588, 989, 29, 566, 1012, 189, 208, 932, 303, 253, 631, 777, 1006, 294, 799, 703, 750, 786, 389, 449, 659, 832, 795, 725, 95, 816, 994, 537, 288, 138, 729, 712, 347, 444, 624, 487, 646, 458, 36, 273, 150, 885, 559, 408, 841, 416, 663, 638, 506, 606, 281, 734, 170, 868, 422, 920, 396, 363, 825, 495, 109, 58, 836, 64, 378, 1001, 92, 344, 300, 747, 763, 585, 72, 546, 222, 685, 69, 144, 393, 375, 147, 503, 581, 717, 269, 916, 928, 721, 225, 974, 120, 245, 471, 600, 453, 742, 688, 184, 963, 574, 857, 476, 433, 692, 228, 953, 940, 238, 114, 988, 351, 904, 977, 126, 776, 293, 702, 785, 565, 188, 931, 252, 536, 137, 711, 443, 448, 831, 724, 815, 407, 415, 637, 605, 486, 457, 272, 884, 494, 57, 63, 1000, 733, 867, 919, 362, 684, 143, 374, 502, 343, 746, 584, 545, 244, 599, 741, 183, 716, 915, 720, 973, 237, 987, 903, 125, 573, 475, 691, 952, 136, 442, 830, 814, 292, 784, 187, 251, 56, 999, 866, 361, 414, 604, 456, 883, 598, 182, 914, 972, 142, 501, 745, 544, 441, 813, 783, 250, 986, 124, 474, 951, 181, 971, 500, 543, 998, 360, 603, 882, 970, 542, 359, 881, 812, 249, 123, 950, 946, 947, 879, 948, 541, 880, 248, 949 +}; + + + +/** + * @brief Generates exp and log lookup tables of GF(2^m). + * + * The logarithm of 0 is defined as 2^PARAM_M by convention.
+ * The last two elements of the exp table are needed by the PQCLEAN_HQC192_CLEAN_gf_mul function from gf_lutmul.c + * (for example if both elements to multiply are zero). + * @param[out] exp Array of size 2^PARAM_M + 2 receiving the powers of the primitive element + * @param[out] log Array of size 2^PARAM_M receiving the logarithms of the elements of GF(2^m) + * @param[in] m Parameter of Galois field GF(2^m) + */ +void PQCLEAN_HQC192_CLEAN_gf_generate(uint16_t *exp, uint16_t *log, int16_t m) { + uint16_t elt = 1; + uint16_t alpha = 2; // primitive element of GF(2^PARAM_M) + uint16_t gf_poly = PARAM_GF_POLY; + + for (size_t i = 0 ; i < (1U << m) - 1 ; ++i) { + exp[i] = elt; + log[elt] = i; + + elt *= alpha; + if (elt >= 1 << m) { + elt ^= gf_poly; + } + } + + exp[(1 << m) - 1] = 1; + exp[1 << m] = 2; + exp[(1 << m) + 1] = 4; + log[0] = 1 << m; // by convention +} + + + +/** + * @brief Returns the integer i such that elt = a^i where a is the primitive element of GF(2^PARAM_M). + * + * @returns the logarithm of the given element + */ +uint16_t PQCLEAN_HQC192_CLEAN_gf_log(uint16_t elt) { + return log[elt]; +} + + + +/** + * @brief Multiplies nonzero element a by element b + * + * @returns the product a*b + * @param[in] a First element of GF(2^PARAM_M) to multiply (cannot be zero) + * @param[in] b Second element of GF(2^PARAM_M) to multiply (cannot be zero) + */ +uint16_t PQCLEAN_HQC192_CLEAN_gf_mul(uint16_t a, uint16_t b) { + // mask = 0xffff if neither a nor b is zero. Otherwise mask is 0. + int16_t mask = ((log[a] | log[b]) >> PARAM_M) - 1; + return mask & exp[PQCLEAN_HQC192_CLEAN_gf_mod(log[a] + log[b])]; +} + + + +/** + * @brief Squares an element of GF(2^PARAM_M) + * + * @returns a^2 + * @param[in] a Element of GF(2^PARAM_M) + */ +uint16_t PQCLEAN_HQC192_CLEAN_gf_square(uint16_t a) { + int16_t mask = (log[a] >> PARAM_M) - 1; + return mask & exp[PQCLEAN_HQC192_CLEAN_gf_mod(2 * log[a])]; +} + + + +/** + * @brief Computes the inverse of an element of GF(2^PARAM_M) + * + * @returns the inverse of a + * @param[in] a Element of GF(2^PARAM_M) + */ +uint16_t PQCLEAN_HQC192_CLEAN_gf_inverse(uint16_t a) { + return exp[PARAM_GF_MUL_ORDER - log[a]]; +} + + + +/** + * @brief Returns i modulo 2^PARAM_M-1 + * + * i must be less than 2*(2^PARAM_M-1). + * Therefore, the return value is either i or i-2^PARAM_M+1. + * + * @returns i mod (2^PARAM_M-1) + * @param[in] i The integer whose modulo is taken + */ +uint16_t PQCLEAN_HQC192_CLEAN_gf_mod(uint16_t i) { + uint16_t tmp = i - PARAM_GF_MUL_ORDER; + + // mask = 0xffff if(i < PARAM_GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & PARAM_GF_MUL_ORDER); +} diff --git a/crypto_kem/hqc-192/clean/gf.h b/crypto_kem/hqc-192/clean/gf.h new file mode 100644 index 00000000..5176db14 --- /dev/null +++ b/crypto_kem/hqc-192/clean/gf.h @@ -0,0 +1,29 @@ +#ifndef GF_H +#define GF_H + + +/** + * @file gf.h + * Header file of gf.c + */ + +#include + +#include +#include + +void PQCLEAN_HQC192_CLEAN_gf_generate(uint16_t *exp, uint16_t *log, int16_t m); + + +uint16_t PQCLEAN_HQC192_CLEAN_gf_log(uint16_t elt); + +uint16_t PQCLEAN_HQC192_CLEAN_gf_mul(uint16_t a, uint16_t b); + +uint16_t PQCLEAN_HQC192_CLEAN_gf_square(uint16_t a); + +uint16_t PQCLEAN_HQC192_CLEAN_gf_inverse(uint16_t a); + +uint16_t PQCLEAN_HQC192_CLEAN_gf_mod(uint16_t i); + + +#endif diff --git a/crypto_kem/hqc-192/clean/gf2x.c b/crypto_kem/hqc-192/clean/gf2x.c new file mode 100644 index 00000000..3f264865 --- /dev/null +++ b/crypto_kem/hqc-192/clean/gf2x.c @@ -0,0 +1,155 @@ +#include "gf2x.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include +#include +#include +/** + * \file gf2x.c + * \brief Implementation of multiplication of two polynomials + */ + + +static inline void swap(uint16_t *tab, uint16_t elt1, uint16_t elt2); +static void reduce(uint64_t *o, const uint64_t *a); +static void fast_convolution_mult(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx); + +/** + * @brief swap two elements in a table + * + * This function exchanges tab[elt1] with tab[elt2] + * + * @param[in] tab Pointer to the table + * @param[in] elt1 Index of the first element + * @param[in] elt2 Index of the second element + */ +static inline void swap(uint16_t *tab, uint16_t elt1, uint16_t elt2) { + uint16_t tmp = tab[elt1]; + + tab[elt1] = tab[elt2]; + tab[elt2] = tmp; +} + + + +/** + * @brief Compute o(x) = a(x) mod \f$ X^n - 1\f$ + * + * This function computes the modular reduction of the polynomial a(x) + * + * @param[in] a Pointer to the polynomial a(x) + * @param[out] o Pointer to the result + */ +static void reduce(uint64_t *o, const uint64_t *a) { + uint64_t r; + uint64_t carry; + + for (uint32_t i = 0 ; i < VEC_N_SIZE_64 ; i++) { + r = a[i + VEC_N_SIZE_64 - 1] >> (PARAM_N & 63); + carry = (uint64_t) (a[i + VEC_N_SIZE_64] << (64 - (PARAM_N & 63))); + o[i] = a[i] ^ r ^ carry; + } + + o[VEC_N_SIZE_64 - 1] &= RED_MASK; +} + + + +/** + * @brief computes product of the polynomial a1(x) with the sparse polynomial a2 + * + * o(x) = a1(x)a2(x) + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to the sparse polynomial a2 (list of degrees of the monomials which appear in a2) + * @param[in] a2 Pointer to the polynomial a1(x) + * @param[in] weight Hamming wifht of the sparse polynomial a2 + * @param[in] ctx Pointer to a seed expander used to randomize the multiplication process + */ +static void fast_convolution_mult(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx) { +//static uint32_t fast_convolution_mult(const uint64_t *A, const uint32_t *vB, uint64_t *C, const uint16_t w, AES_XOF_struct *ctx) + uint64_t carry; + uint32_t dec, s; + uint64_t table[16 * (VEC_N_SIZE_64 + 1)]; + uint16_t permuted_table[16]; + uint16_t permutation_table[16]; + uint16_t permuted_sparse_vect[PARAM_OMEGA_E]; + uint16_t permutation_sparse_vect[PARAM_OMEGA_E]; + uint64_t *pt; + uint16_t *res_16; + + for (uint32_t i = 0 ; i < 16; i++) { + permuted_table[i] = i; + } + + seedexpander(ctx, (uint8_t *) permutation_table, 16 * sizeof(uint16_t)); + + for (uint32_t i = 0 ; i < 15 ; i++) { + swap(permuted_table + i, 0, permutation_table[i] % (16 - i)); + } + + pt = table + (permuted_table[0] * (VEC_N_SIZE_64 + 1)); + for (int32_t j = 0 ; j < VEC_N_SIZE_64 ; j++) { + pt[j] = a2[j]; + } + pt[VEC_N_SIZE_64] = 0x0; + + for (uint32_t i = 1 ; i < 16 ; i++) { + carry = 0; + pt = table + (permuted_table[i] * (VEC_N_SIZE_64 + 1)); + for (uint32_t j = 0 ; j < VEC_N_SIZE_64 ; j++) { + pt[j] = (a2[j] << i) ^ carry; + carry = (a2[j] >> ((64 - i))); + } + pt[VEC_N_SIZE_64] = carry; + } + + for (uint32_t i = 0 ; i < weight ; i++) { + permuted_sparse_vect[i] = i; + } + + seedexpander(ctx, (uint8_t *) permutation_sparse_vect, weight * sizeof(uint16_t)); + + for (uint32_t i = 0 ; i + 1 < weight ; i++) { + swap(permuted_sparse_vect + i, 0, permutation_sparse_vect[i] % (weight - i)); + } + + for (uint32_t i = 0 ; i < weight ; i++) { + dec = a1[permuted_sparse_vect[i]] & 0xf; + s = a1[permuted_sparse_vect[i]] >> 4; + res_16 = ((uint16_t *) o) + s; + pt = table + (permuted_table[dec] * (VEC_N_SIZE_64 + 1)); + + for (uint32_t j = 0 ; j < VEC_N_SIZE_64 + 1 ; j++) { + *res_16++ ^= (uint16_t) pt[j]; + *res_16++ ^= (uint16_t) (pt[j] >> 16); + *res_16++ ^= (uint16_t) (pt[j] >> 32); + *res_16++ ^= (uint16_t) (pt[j] >> 48); + } + } +} + + + +/** + * @brief Multiply two polynomials modulo \f$ X^n - 1\f$. + * + * This functions multiplies a sparse polynomial a1 (of Hamming weight equal to weight) + * and a dense polynomial a2. The multiplication is done modulo \f$ X^n - 1\f$. + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to the sparse polynomial + * @param[in] a2 Pointer to the dense polynomial + * @param[in] weight Integer that is the weigt of the sparse polynomial + * @param[in] ctx Pointer to the randomness context + */ +void PQCLEAN_HQC192_CLEAN_vect_mul(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx) { + uint64_t tmp[2 * VEC_N_SIZE_64 + 1]; + for (uint32_t j = 0 ; j < 2 * VEC_N_SIZE_64 + 1 ; j++) { + tmp[j] = 0; + } + + fast_convolution_mult(tmp, a1, a2, weight, ctx); + reduce(o, tmp); +} diff --git a/crypto_kem/hqc-192/clean/gf2x.h b/crypto_kem/hqc-192/clean/gf2x.h new file mode 100644 index 00000000..0ef5fcb2 --- /dev/null +++ b/crypto_kem/hqc-192/clean/gf2x.h @@ -0,0 +1,18 @@ +#ifndef GF2X_H +#define GF2X_H + + +/** + * @file gf2x.h + * @brief Header file for gf2x.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQC192_CLEAN_vect_mul(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx); + + +#endif diff --git a/crypto_kem/hqc-192/clean/hqc.c b/crypto_kem/hqc-192/clean/hqc.c new file mode 100644 index 00000000..248d401f --- /dev/null +++ b/crypto_kem/hqc-192/clean/hqc.c @@ -0,0 +1,143 @@ +#include "code.h" +#include "gf2x.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +/** + * @file hqc.c + * @brief Implementation of hqc.h + */ + + + +/** + * @brief Keygen of the HQC_PKE IND_CPA scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + */ +void PQCLEAN_HQC192_CLEAN_hqc_pke_keygen(unsigned char *pk, unsigned char *sk) { + AES_XOF_struct sk_seedexpander; + AES_XOF_struct pk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + uint8_t pk_seed[SEED_BYTES] = {0}; + uint64_t x[VEC_N_SIZE_64] = {0}; + uint32_t y[PARAM_OMEGA] = {0}; + uint64_t h[VEC_N_SIZE_64] = {0}; + uint64_t s[VEC_N_SIZE_64] = {0}; + + // Create seed_expanders for public key and secret key + randombytes(sk_seed, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + randombytes(pk_seed, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute secret key + PQCLEAN_HQC192_CLEAN_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQC192_CLEAN_vect_set_random_fixed_weight_by_coordinates(&sk_seedexpander, y, PARAM_OMEGA); + + // Compute public key + PQCLEAN_HQC192_CLEAN_vect_set_random(&pk_seedexpander, h); + PQCLEAN_HQC192_CLEAN_vect_mul(s, y, h, PARAM_OMEGA, &sk_seedexpander); + PQCLEAN_HQC192_CLEAN_vect_add(s, x, s, VEC_N_SIZE_64); + + // Parse keys to string + PQCLEAN_HQC192_CLEAN_hqc_public_key_to_string(pk, pk_seed, s); + PQCLEAN_HQC192_CLEAN_hqc_secret_key_to_string(sk, sk_seed, pk); + +} + + + +/** + * @brief Encryption of the HQC_PKE IND_CPA scheme + * + * The cihertext is composed of vectors u and v. + * + * @param[out] u Vector u (first part of the ciphertext) + * @param[out] v Vector v (second part of the ciphertext) + * @param[in] m Vector representing the message to encrypt + * @param[in] theta Seed used to derive randomness required for encryption + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC192_CLEAN_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk) { + AES_XOF_struct seedexpander; + uint64_t h[VEC_N_SIZE_64] = {0}; + uint64_t s[VEC_N_SIZE_64] = {0}; + uint64_t r1[VEC_N_SIZE_64] = {0}; + uint32_t r2[PARAM_OMEGA_R] = {0}; + uint64_t e[VEC_N_SIZE_64] = {0}; + uint64_t tmp1[VEC_N_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_SIZE_64] = {0}; + + // Create seed_expander from theta + seedexpander_init(&seedexpander, theta, theta + 32, SEEDEXPANDER_MAX_LENGTH); + + // Retrieve h and s from public key + PQCLEAN_HQC192_CLEAN_hqc_public_key_from_string(h, s, pk); + + // Generate r1, r2 and e + PQCLEAN_HQC192_CLEAN_vect_set_random_fixed_weight(&seedexpander, r1, PARAM_OMEGA_R); + PQCLEAN_HQC192_CLEAN_vect_set_random_fixed_weight_by_coordinates(&seedexpander, r2, PARAM_OMEGA_R); + PQCLEAN_HQC192_CLEAN_vect_set_random_fixed_weight(&seedexpander, e, PARAM_OMEGA_E); + + // Compute u = r1 + r2.h + PQCLEAN_HQC192_CLEAN_vect_mul(u, r2, h, PARAM_OMEGA_R, &seedexpander); + PQCLEAN_HQC192_CLEAN_vect_add(u, r1, u, VEC_N_SIZE_64); + + // Compute v = m.G by encoding the message + PQCLEAN_HQC192_CLEAN_code_encode(v, m); + PQCLEAN_HQC192_CLEAN_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + + // Compute v = m.G + s.r2 + e + PQCLEAN_HQC192_CLEAN_vect_mul(tmp2, r2, s, PARAM_OMEGA_R, &seedexpander); + PQCLEAN_HQC192_CLEAN_vect_add(tmp2, e, tmp2, VEC_N_SIZE_64); + PQCLEAN_HQC192_CLEAN_vect_add(tmp2, tmp1, tmp2, VEC_N_SIZE_64); + PQCLEAN_HQC192_CLEAN_vect_resize(v, PARAM_N1N2, tmp2, PARAM_N); + +} + + + +/** + * @brief Decryption of the HQC_PKE IND_CPA scheme + * + * @param[out] m Vector representing the decrypted message + * @param[in] u Vector u (first part of the ciphertext) + * @param[in] v Vector v (second part of the ciphertext) + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQC192_CLEAN_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk) { + uint64_t x[VEC_N_SIZE_64] = {0}; + uint32_t y[PARAM_OMEGA] = {0}; + uint8_t pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t tmp1[VEC_N_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_SIZE_64] = {0}; + AES_XOF_struct perm_seedexpander; + uint8_t perm_seed[SEED_BYTES] = {0}; + + // Retrieve x, y, pk from secret key + PQCLEAN_HQC192_CLEAN_hqc_secret_key_from_string(x, y, pk, sk); + + randombytes(perm_seed, SEED_BYTES); + seedexpander_init(&perm_seedexpander, perm_seed, perm_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute v - u.y + PQCLEAN_HQC192_CLEAN_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + PQCLEAN_HQC192_CLEAN_vect_mul(tmp2, y, u, PARAM_OMEGA, &perm_seedexpander); + PQCLEAN_HQC192_CLEAN_vect_add(tmp2, tmp1, tmp2, VEC_N_SIZE_64); + + + // Compute m by decoding v - u.y + PQCLEAN_HQC192_CLEAN_code_decode(m, tmp2); +} diff --git a/crypto_kem/hqc-192/clean/hqc.h b/crypto_kem/hqc-192/clean/hqc.h new file mode 100644 index 00000000..42d1821a --- /dev/null +++ b/crypto_kem/hqc-192/clean/hqc.h @@ -0,0 +1,21 @@ +#ifndef HQC_H +#define HQC_H + + +/** + * @file hqc.h + * @brief Functions of the HQC_PKE IND_CPA scheme + */ + +#include + +#include + +void PQCLEAN_HQC192_CLEAN_hqc_pke_keygen(unsigned char *pk, unsigned char *sk); + +void PQCLEAN_HQC192_CLEAN_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk); + +void PQCLEAN_HQC192_CLEAN_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-192/clean/kem.c b/crypto_kem/hqc-192/clean/kem.c new file mode 100644 index 00000000..3d461958 --- /dev/null +++ b/crypto_kem/hqc-192/clean/kem.c @@ -0,0 +1,138 @@ +#include "api.h" +#include "fips202.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "sha2.h" +#include "vector.h" +#include +#include +/** + * @file kem.c + * @brief Implementation of api.h + */ + + + +/** + * @brief Keygen of the HQC_KEM IND_CAA2 scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + * @returns 0 if keygen is successful + */ +int PQCLEAN_HQC192_CLEAN_crypto_kem_keypair(unsigned char *pk, unsigned char *sk) { + + PQCLEAN_HQC192_CLEAN_hqc_pke_keygen(pk, sk); + return 0; +} + + + +/** + * @brief Encapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ct String containing the ciphertext + * @param[out] ss String containing the shared secret + * @param[in] pk String containing the public key + * @returns 0 if encapsulation is successful + */ +int PQCLEAN_HQC192_CLEAN_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk) { + + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint64_t u[VEC_N_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Computing m + PQCLEAN_HQC192_CLEAN_vect_set_random_from_randombytes(m); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m + PQCLEAN_HQC192_CLEAN_hqc_pke_encrypt(u, v, m, theta, pk); + + // Computing d + sha512(d, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Computing ciphertext + PQCLEAN_HQC192_CLEAN_hqc_ciphertext_to_string(ct, u, v, d); + + + return 0; +} + + + +/** + * @brief Decapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ss String containing the shared secret + * @param[in] ct String containing the cipĥertext + * @param[in] sk String containing the secret key + * @returns 0 if decapsulation is successful, -1 otherwise + */ +int PQCLEAN_HQC192_CLEAN_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk) { + + int8_t result = -1; + uint64_t u[VEC_N_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t u2[VEC_N_SIZE_64] = {0}; + uint64_t v2[VEC_N1N2_SIZE_64] = {0}; + unsigned char d2[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Retrieving u, v and d from ciphertext + PQCLEAN_HQC192_CLEAN_hqc_ciphertext_from_string(u, v, d, ct); + + // Retrieving pk from sk + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); + + // Decryting + PQCLEAN_HQC192_CLEAN_hqc_pke_decrypt(m, u, v, sk); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m' + PQCLEAN_HQC192_CLEAN_hqc_pke_encrypt(u2, v2, m, theta, pk); + + // Computing d' + sha512(d2, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Abort if c != c' or d != d' + result = (PQCLEAN_HQC192_CLEAN_vect_compare(u, u2, VEC_N_SIZE_BYTES) == 0 && PQCLEAN_HQC192_CLEAN_vect_compare(v, v2, VEC_N1N2_SIZE_BYTES) == 0 && memcmp(d, d2, SHA512_BYTES) == 0); + for (size_t i = 0 ; i < SHARED_SECRET_BYTES ; i++) { + ss[i] = result * ss[i]; + } + result--; + + + return result; +} diff --git a/crypto_kem/hqc-192/clean/parameters.h b/crypto_kem/hqc-192/clean/parameters.h new file mode 100644 index 00000000..76d98d6b --- /dev/null +++ b/crypto_kem/hqc-192/clean/parameters.h @@ -0,0 +1,123 @@ +#ifndef HQC_PARAMETERS_H +#define HQC_PARAMETERS_H +/** + * @file parameters.h + * @brief Parameters of the HQC_KEM IND-CCA2 scheme + */ + +#include "api.h" +#include "api.h" +#include "vector.h" + + +#define CEIL_DIVIDE(a, b) (((a)/(b)) + ((a) % (b) == 0 ? 0 : 1)) /*!< Divide a by b and ceil the result*/ +#define BITMASK(a, size) ((1UL << ((a) % (size))) - 1) /*!< Create a mask*/ + +/* + #define PARAM_N Define the parameter n of the scheme + #define PARAM_N1 Define the parameter n1 of the scheme (length of BCH code) + #define PARAM_N2 Define the parameter n2 of the scheme (length of the repetition code) + #define PARAM_N1N2 Define the parameter n1 * n2 of the scheme (length of the tensor code) + #define PARAM_OMEGA Define the parameter omega of the scheme + #define PARAM_OMEGA_E Define the parameter omega_e of the scheme + #define PARAM_OMEGA_R Define the parameter omega_r of the scheme + #define PARAM_SECURITY Define the security level corresponding to the chosen parameters + #define PARAM_DFR_EXP Define the decryption failure rate corresponding to the chosen parameters + + #define SECRET_KEY_BYTES Define the size of the secret key in bytes + #define PUBLIC_KEY_BYTES Define the size of the public key in bytes + #define SHARED_SECRET_BYTES Define the size of the shared secret in bytes + #define CIPHERTEXT_BYTES Define the size of the ciphertext in bytes + + #define UTILS_REJECTION_THRESHOLD Define the rejection threshold used to generate given weight vectors (see vector_set_random_fixed_weight function) + #define VEC_N_SIZE_BYTES Define the size of the array used to store a PARAM_N sized vector in bytes + #define VEC_K_SIZE_BYTES Define the size of the array used to store a PARAM_K sized vector in bytes + #define VEC_N1_SIZE_BYTES Define the size of the array used to store a PARAM_N1 sized vector in bytes + #define VEC_N1N2_SIZE_BYTES Define the size of the array used to store a PARAM_N1N2 sized vector in bytes + + #define VEC_N_SIZE_64 Define the size of the array used to store a PARAM_N sized vector in 64 bits + #define VEC_K_SIZE_64 Define the size of the array used to store a PARAM_K sized vector in 64 bits + #define VEC_N1_SIZE_64 Define the size of the array used to store a PARAM_N1 sized vector in 64 bits + #define VEC_N1N2_SIZE_64 Define the size of the array used to store a PARAM_N1N2 sized vector in 64 bits + + #define PARAM_T Define a threshold for decoding repetition code word (PARAM_T = (PARAM_N2 - 1) / 2) + + #define PARAM_DELTA Define the parameter delta of the scheme (correcting capacity of the BCH code) + #define PARAM_M Define a positive integer + #define PARAM_GF_POLY Generator polynomial of galois field GF(2^PARAM_M), represented in hexadecimial form + #define PARAM_GF_MUL_ORDER Define the size of the multiplicative group of GF(2^PARAM_M), i.e 2^PARAM_M -1 + #define PARAM_K Define the size of the information bits of the BCH code + #define PARAM_G Define the size of the generator polynomial of BCH code + #define PARAM_FFT The additive FFT takes a 2^PARAM_FFT polynomial as input + We use the FFT to compute the roots of sigma, whose degree if PARAM_DELTA=60 + The smallest power of 2 greater than 60+1 is 64=2^6 + #define PARAM_FFT_T The additive FFT transpose computes a (2^PARAM_FFT_T)-sized syndrome vector + We want to compute 2*PARAM_DELTA=120 syndromes + The smallest power of 2 greater than 120 is 2^7 + #define PARAM_BCH_POLY Generator polynomial of the BCH code + + #define RED_MASK A mask fot the higher bits of a vector + #define SHA512_BYTES Define the size of SHA512 output in bytes + #define SEED_BYTES Define the size of the seed in bytes + #define SEEDEXPANDER_MAX_LENGTH Define the seed expander max length +*/ + +#define PARAM_N 45197 +#define PARAM_N1 766 +#define PARAM_N2 59 +#define PARAM_N1N2 45194 +#define PARAM_OMEGA 101 +#define PARAM_OMEGA_E 117 +#define PARAM_OMEGA_R 117 +#define PARAM_SECURITY 192 +#define PARAM_DFR_EXP 192 + +#define SECRET_KEY_BYTES PQCLEAN_HQC192_CLEAN_CRYPTO_SECRETKEYBYTES +#define PUBLIC_KEY_BYTES PQCLEAN_HQC192_CLEAN_CRYPTO_PUBLICKEYBYTES +#define SHARED_SECRET_BYTES PQCLEAN_HQC192_CLEAN_CRYPTO_BYTES +#define CIPHERTEXT_BYTES PQCLEAN_HQC192_CLEAN_CRYPTO_CIPHERTEXTBYTES + +#define UTILS_REJECTION_THRESHOLD 16768087 +#define VEC_K_SIZE_BYTES CEIL_DIVIDE(PARAM_K, 8) +#define VEC_N_SIZE_BYTES CEIL_DIVIDE(PARAM_N, 8) +#define VEC_N1_SIZE_BYTES CEIL_DIVIDE(PARAM_N1, 8) +#define VEC_N1N2_SIZE_BYTES CEIL_DIVIDE(PARAM_N1N2, 8) + +#define VEC_N_SIZE_64 CEIL_DIVIDE(PARAM_N, 64) +#define VEC_K_SIZE_64 CEIL_DIVIDE(PARAM_K, 64) +#define VEC_N1_SIZE_64 CEIL_DIVIDE(PARAM_N1, 64) +#define VEC_N1N2_SIZE_64 CEIL_DIVIDE(PARAM_N1N2, 64) + +#define PARAM_T 29 + +#define PARAM_DELTA 57 +#define PARAM_M 10 +#define PARAM_GF_POLY 0x409 +#define PARAM_GF_MUL_ORDER 1023 +#define PARAM_K 256 +#define PARAM_G 511 +#define PARAM_FFT 6 +#define PARAM_FFT_T 7 +#define PARAM_BCH_POLY { \ + 1,1,0,0,0,0,1,0,0,1,1,0,1,1,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,0,0,1,1,0,1,1, \ + 1,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,1,0,1,1,0,1,0,1,1,1,0,1,0,1,0,0,1,0,0,0, \ + 0,1,1,1,1,0,1,1,1,1,1,0,0,0,0,1,0,0,1,0,0,1,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, \ + 1,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1,1,0,1,0,1,0,1,0,1,1,1,1,0,1,0, \ + 0,1,1,0,1,0,1,1,0,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,0,1,1,1,1,0, \ + 1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,1,0, \ + 0,1,0,0,1,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,0,0,0,1,0,1, \ + 1,1,1,1,1,0,1,0,1,0,1,1,0,0,0,1,1,0,0,1,1,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,0, \ + 1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,0,1,1,0,1,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1, \ + 1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,0,1,0,0,1,1,1,1,1,0,1,0,1, \ + 0,0,0,0,1,0,1,1,1,1,0,1,0,0,0,0,0,1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1, \ + 1,0,1,0,0,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,1, \ + 0,1,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,1,1,1,1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,0,1, \ + 1,0,1,1,1,0,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,1 \ + }; + +#define RED_MASK 0x0000000000001fffUL +#define SHA512_BYTES 64 +#define SEED_BYTES 40 +#define SEEDEXPANDER_MAX_LENGTH 4294967295 + +#endif diff --git a/crypto_kem/hqc-192/clean/parsing.c b/crypto_kem/hqc-192/clean/parsing.c new file mode 100644 index 00000000..9a89a1ee --- /dev/null +++ b/crypto_kem/hqc-192/clean/parsing.c @@ -0,0 +1,121 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file parsing.c + * @brief Functions to parse secret key, public key and ciphertext of the HQC scheme + */ + + + +/** + * @brief Parse a secret key into a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] sk String containing the secret key + * @param[in] sk_seed Seed used to generate the secret key + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC192_CLEAN_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk) { + memcpy(sk, sk_seed, SEED_BYTES); + memcpy(sk + SEED_BYTES, pk, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a secret key from a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] x uint64_t representation of vector x + * @param[out] y uint32_t representation of vector y + * @param[out] pk String containing the public key + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQC192_CLEAN_hqc_secret_key_from_string(uint64_t *x, uint32_t *y, uint8_t *pk, const uint8_t *sk) { + AES_XOF_struct sk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + + memcpy(sk_seed, sk, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + PQCLEAN_HQC192_CLEAN_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQC192_CLEAN_vect_set_random_fixed_weight_by_coordinates(&sk_seedexpander, y, PARAM_OMEGA); + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a public key into a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] pk String containing the public key + * @param[in] pk_seed Seed used to generate the public key + * @param[in] s uint8_t representation of vector s + */ +void PQCLEAN_HQC192_CLEAN_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s) { + memcpy(pk, pk_seed, SEED_BYTES); + memcpy(pk + SEED_BYTES, s, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Parse a public key from a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] h uint8_t representation of vector h + * @param[out] s uint8_t representation of vector s + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC192_CLEAN_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk) { + AES_XOF_struct pk_seedexpander; + uint8_t pk_seed[SEED_BYTES] = {0}; + + memcpy(pk_seed, pk, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + PQCLEAN_HQC192_CLEAN_vect_set_random(&pk_seedexpander, h); + + memcpy(s, pk + SEED_BYTES, VEC_N_SIZE_BYTES); +} + + +/** + * @brief Parse a ciphertext into a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] ct String containing the ciphertext + * @param[in] u uint8_t representation of vector u + * @param[in] v uint8_t representation of vector v + * @param[in] d String containing the hash d + */ +void PQCLEAN_HQC192_CLEAN_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d) { + memcpy(ct, u, VEC_N_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, d, SHA512_BYTES); +} + + +/** + * @brief Parse a ciphertext from a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] u uint8_t representation of vector u + * @param[out] v uint8_t representation of vector v + * @param[out] d String containing the hash d + * @param[in] ct String containing the ciphertext + */ +void PQCLEAN_HQC192_CLEAN_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct) { + memcpy(u, ct, VEC_N_SIZE_BYTES); + memcpy(v, ct + VEC_N_SIZE_BYTES, VEC_N1N2_SIZE_BYTES); + memcpy(d, ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, SHA512_BYTES); +} diff --git a/crypto_kem/hqc-192/clean/parsing.h b/crypto_kem/hqc-192/clean/parsing.h new file mode 100644 index 00000000..a4b663ba --- /dev/null +++ b/crypto_kem/hqc-192/clean/parsing.h @@ -0,0 +1,29 @@ +#ifndef PARSING_H +#define PARSING_H + + +/** + * @file parsing.h + * @brief Header file for parsing.c + */ + +#include + +#include + +void PQCLEAN_HQC192_CLEAN_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk); + +void PQCLEAN_HQC192_CLEAN_hqc_secret_key_from_string(uint64_t *x, uint32_t *y, uint8_t *pk, const uint8_t *sk); + + +void PQCLEAN_HQC192_CLEAN_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s); + +void PQCLEAN_HQC192_CLEAN_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk); + + +void PQCLEAN_HQC192_CLEAN_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d); + +void PQCLEAN_HQC192_CLEAN_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct); + + +#endif diff --git a/crypto_kem/hqc-192/clean/repetition.c b/crypto_kem/hqc-192/clean/repetition.c new file mode 100644 index 00000000..c11de2aa --- /dev/null +++ b/crypto_kem/hqc-192/clean/repetition.c @@ -0,0 +1,91 @@ +#include "parameters.h" +#include "repetition.h" +#include +#include +#include +/** + * @file repetition.c + * @brief Implementation of repetition codes + */ + +#define MASK_N2 ((1UL << PARAM_N2) - 1) + +static inline int32_t popcount(uint64_t n); + +/** + * @brief Encoding each bit in the message m using the repetition code + * + * + * @param[out] em Pointer to an array that is the code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQC192_CLEAN_repetition_code_encode(uint64_t *em, const uint64_t *m) { + static const uint64_t mask[2][2] = {{0x0UL, 0x0UL}, {0x7FFFFFFFFFFFFFFUL, 0x3FFFFFFFFFFFFFFUL}}; + for (size_t i = 0 ; i < VEC_N1_SIZE_64 - 1 ; i++) { + for (size_t j = 0 ; j < 64 ; j++) { + uint8_t bit = (m[i] >> j) & 0x1; + uint32_t pos_r = PARAM_N2 * ((i << 6) + j); + uint16_t idx_r = (pos_r & 0x3f); + uint64_t *p64 = em; + p64 += pos_r >> 6; + *p64 ^= mask[bit][0] << idx_r; + *(p64 + 1) ^= mask[bit][1] >> ((63 - idx_r)); + } + } + + for (size_t j = 0 ; j < (PARAM_N1 & 0x3f) ; j++) { + uint8_t bit = (m[VEC_N1_SIZE_64 - 1] >> j) & 0x1; + uint32_t pos_r = PARAM_N2 * (((VEC_N1_SIZE_64 - 1) << 6) + j); + uint16_t idx_r = (pos_r & 0x3f); + uint64_t *p64 = em; + p64 += pos_r >> 6; + *p64 ^= mask[bit][0] << idx_r; + *(p64 + 1) ^= mask[bit][1] >> ((63 - idx_r)); + } +} + + + +/** + * @brief Compute the Hamming weight of the 64-bit integer n + * + * The Hamming weight is computed using a trick described in + * Henry S. Warren : "Hacker's Delight", chap 5., p. 66 + * @param[out] the Hamming weight of n + * @param[in] a 64-bit integer n + */ +static inline int32_t popcount(uint64_t n) { + n -= (n >> 1) & 0x5555555555555555UL; + n = (n & 0x3333333333333333UL) + ((n >> 2) & 0x3333333333333333UL); + n = (n + (n >> 4)) & 0x0f0f0f0f0f0f0f0fUL; + return (n * 0x0101010101010101UL) >> 56; +} + + + +/** + * @brief Decoding the code words to a message using the repetition code + * + * We use a majority decoding. In fact we have that PARAM_N2 = 2 * PARAM_T + 1, thus, + * if the Hamming weight of the vector is greater than PARAM_T, the code word is decoded + * to 1 and 0 otherwise. + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQC192_CLEAN_repetition_code_decode(uint64_t *m, const uint64_t *em) { + size_t t = 0, b, bn, bi, c, cn, ci; + uint64_t cx, ones; + for (b = 0 ; b < PARAM_N1N2 - PARAM_N2 + 1 ; b += PARAM_N2) { + bn = b >> 6; + bi = b & 63; + c = b + PARAM_N2 - 1; + cn = c >> 6; + ci = c & 63; + cx = em[cn] << (63 - ci); + int64_t verif = (cn == (bn + 1)); + ones = popcount(((em[bn] >> bi) & MASK_N2) | (cx * verif)); + m[t >> 6] |= ((uint64_t) (ones > PARAM_T)) << (t & 63); + t++; + } +} diff --git a/crypto_kem/hqc-192/clean/repetition.h b/crypto_kem/hqc-192/clean/repetition.h new file mode 100644 index 00000000..78f72291 --- /dev/null +++ b/crypto_kem/hqc-192/clean/repetition.h @@ -0,0 +1,19 @@ +#ifndef REPETITION_H +#define REPETITION_H + + +/** + * @file repetition.h + * @brief Header file for repetition.c + */ + +#include + +#include + +void PQCLEAN_HQC192_CLEAN_repetition_code_encode(uint64_t *em, const uint64_t *m); + +void PQCLEAN_HQC192_CLEAN_repetition_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-192/clean/vector.c b/crypto_kem/hqc-192/clean/vector.c new file mode 100644 index 00000000..add1f3ac --- /dev/null +++ b/crypto_kem/hqc-192/clean/vector.c @@ -0,0 +1,226 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file vector.c + * @brief Implementation of vectors sampling and some utilities for the HQC scheme + */ + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. The vector + * is stored by position. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC192_CLEAN_vect_set_random_fixed_weight_by_coordinates(AES_XOF_struct *ctx, uint32_t *v, uint16_t weight) { + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; // weight is expected to be <= PARAM_OMEGA_R + uint32_t random_data = 0; + uint8_t exist = 0; + size_t j = 0; + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (v[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + v[i] = random_data; + } + } +} + + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC192_CLEAN_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight) { + + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; // weight is expected to be <= PARAM_OMEGA_R + uint32_t random_data = 0; + uint32_t tmp[PARAM_OMEGA_R] = {0}; + uint8_t exist = 0; + size_t j = 0; + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (tmp[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + tmp[i] = random_data; + } + } + + for (uint16_t i = 0 ; i < weight ; ++i) { + int32_t index = tmp[i] / 64; + int32_t pos = tmp[i] % 64; + v[index] |= ((uint64_t) 1) << pos; + } +} + + + +/** + * @brief Generates a random vector of dimension PARAM_N + * + * This function generates a random binary vector of dimension PARAM_N. It generates a random + * array of bytes using the seedexpander function, and drop the extra bits using a mask. + * + * @param[in] v Pointer to an array + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC192_CLEAN_vect_set_random(AES_XOF_struct *ctx, uint64_t *v) { + uint8_t rand_bytes[VEC_N_SIZE_BYTES] = {0}; + + seedexpander(ctx, rand_bytes, VEC_N_SIZE_BYTES); + + memcpy(v, rand_bytes, VEC_N_SIZE_BYTES); + v[VEC_N_SIZE_64 - 1] &= BITMASK(PARAM_N, 64); +} + + + +/** + * @brief Generates a random vector + * + * This function generates a random binary vector. It uses the the randombytes function. + * + * @param[in] v Pointer to an array + */ +void PQCLEAN_HQC192_CLEAN_vect_set_random_from_randombytes(uint64_t *v) { + uint8_t rand_bytes [VEC_K_SIZE_BYTES] = {0}; + + randombytes(rand_bytes, VEC_K_SIZE_BYTES); + memcpy(v, rand_bytes, VEC_K_SIZE_BYTES); +} + + + +/** + * @brief Adds two vectors + * + * @param[out] o Pointer to an array that is the result + * @param[in] v1 Pointer to an array that is the first vector + * @param[in] v2 Pointer to an array that is the second vector + * @param[in] size Integer that is the size of the vectors + */ +void PQCLEAN_HQC192_CLEAN_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size) { + for (uint32_t i = 0 ; i < size ; ++i) { + o[i] = v1[i] ^ v2[i]; + } +} + + +/** + * @brief Compares two vectors + * + * @param[in] v1 Pointer to an array that is first vector + * @param[in] v2 Pointer to an array that is second vector + * @param[in] size Integer that is the size of the vectors + * @returns 0 if the vectors are equals and a negative/psotive value otherwise + */ +int PQCLEAN_HQC192_CLEAN_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size) { + return memcmp(v1, v2, size); +} + + + +/** + * @brief Resize a vector so that it contains size_o bits + * + * @param[out] o Pointer to the output vector + * @param[in] size_o Integer that is the size of the output vector in bits + * @param[in] v Pointer to the input vector + * @param[in] size_v Integer that is the size of the input vector in bits + */ +void PQCLEAN_HQC192_CLEAN_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v) { + if (size_o < size_v) { + uint64_t mask = 0x7FFFFFFFFFFFFFFF; + int8_t val = 0; + + if (size_o % 64) { + val = 64 - (size_o % 64); + } + + memcpy(o, v, VEC_N1N2_SIZE_BYTES); + + for (int8_t i = 0 ; i < val ; ++i) { + o[VEC_N1N2_SIZE_64 - 1] &= (mask >> i); + } + } else { + memcpy(o, v, CEIL_DIVIDE(size_v, 8)); + } +} diff --git a/crypto_kem/hqc-192/clean/vector.h b/crypto_kem/hqc-192/clean/vector.h new file mode 100644 index 00000000..fde54f04 --- /dev/null +++ b/crypto_kem/hqc-192/clean/vector.h @@ -0,0 +1,31 @@ +#ifndef VECTOR_H +#define VECTOR_H + + +/** + * @file vector.h + * @brief Header file for vector.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQC192_CLEAN_vect_set_random_fixed_weight_by_coordinates(AES_XOF_struct *ctx, uint32_t *v, uint16_t weight); + +void PQCLEAN_HQC192_CLEAN_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight); + +void PQCLEAN_HQC192_CLEAN_vect_set_random(AES_XOF_struct *ctx, uint64_t *v); + +void PQCLEAN_HQC192_CLEAN_vect_set_random_from_randombytes(uint64_t *v); + + +void PQCLEAN_HQC192_CLEAN_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size); + +int PQCLEAN_HQC192_CLEAN_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size); + +void PQCLEAN_HQC192_CLEAN_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v); + + +#endif diff --git a/crypto_kem/hqc-256/META.yml b/crypto_kem/hqc-256/META.yml new file mode 100644 index 00000000..f49b248a --- /dev/null +++ b/crypto_kem/hqc-256/META.yml @@ -0,0 +1,34 @@ +name: HQC-256 +type: kem +claimed-nist-level: 5 +claimed-security: IND-CCA2 +length-ciphertext: 17379 +length-public-key: 8698 +length-secret-key: 8738 +length-shared-secret: 64 +nistkat-sha256: c940cddc7be19d005a23e7a0b3b4079250fec682d09d093dbcff0bc23a3b9dc4 +principal-submitters: + - Carlos Aguilar Melchor + - Nicolas Aragon + - Slim Bettaieb + - Olivier Blazy + - Jurjen Bos + - Jean-Christophe Deneuville + - Philippe Gaborit + - Edoardo Persichetti + - Jean-Marc Robert + - Pascal Véron + - Gilles Zémor + - Loïc Bidoux +implementations: + - name: clean + version: 2020-05-29 + - name: avx2 + version: 2020-05-29 + supported_platforms: + - architecture: x86_64 + operating_systems: + - Linux + - Darwin + required_flags: + - avx2 diff --git a/crypto_kem/hqc-256/avx2/LICENSE b/crypto_kem/hqc-256/avx2/LICENSE new file mode 100644 index 00000000..d5d21fff --- /dev/null +++ b/crypto_kem/hqc-256/avx2/LICENSE @@ -0,0 +1 @@ +Public Domain diff --git a/crypto_kem/hqc-256/avx2/Makefile b/crypto_kem/hqc-256/avx2/Makefile new file mode 100644 index 00000000..01fd1c07 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/Makefile @@ -0,0 +1,22 @@ +# This Makefile can be used with GNU Make or BSD Make + +LIB=libhqc-256_avx2.a +HEADERS=alpha_table.h api.h bch.h code.h fft.h gen_matrix.h gf2x.h gf.h hqc.h parameters.h parsing.h repetition.h vector.h +OBJECTS=bch.o code.o fft.o gf2x.o gf.o hqc.o kem.o parsing.o repetition.o vector.o + +CFLAGS=-O3 -mavx2 -mbmi -mpclmul -Wall -Wextra -Wpedantic -Wvla -Werror -Wredundant-decls -Wmissing-prototypes -std=c99 -I../../../common $(EXTRAFLAGS) + +all: $(LIB) + +%.o: %.s $(HEADERS) + $(AS) -o $@ $< + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +$(LIB): $(OBJECTS) + $(AR) -r $@ $(OBJECTS) + +clean: + $(RM) $(OBJECTS) + $(RM) $(LIB) diff --git a/crypto_kem/hqc-256/avx2/alpha_table.h b/crypto_kem/hqc-256/avx2/alpha_table.h new file mode 100644 index 00000000..db722fb6 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/alpha_table.h @@ -0,0 +1,18 @@ +#ifndef ALPHA_TABLE_H +#define ALPHA_TABLE_H + + +/** + * @file alpha_table.h + * Header file that contain precomputed power of alpha the root of the generator poly og GF(2^PARAM_M) + */ + +#include "parameters.h" +#include "parameters.h" + + +#define SYND_SIZE_256 CEIL_DIVIDE(PARAM_DELTA, 8) + +static int16_t table_alpha_ij[PARAM_N1 * (SYND_SIZE_256 << 4)] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x9, 0x12, 0x24, 0x48, 0x90, 0x120, 0x240, 0x89, 0x112, 0x224, 0x41, 0x82, 0x104, 0x208, 0x19, 0x32, 0x64, 0xc8, 0x190, 0x320, 0x249, 0x9b, 0x136, 0x26c, 0xd1, 0x1a2, 0x344, 0x281, 0x10b, 0x216, 0x25, 0x4a, 0x94, 0x128, 0x250, 0xa9, 0x152, 0x2a4, 0x141, 0x282, 0x10d, 0x21a, 0x3d, 0x7a, 0xf4, 0x1e8, 0x3d0, 0x3a9, 0x35b, 0x2bf, 0x177, 0x2ee, 0x1d5, 0x3aa, 0x35d, 0x2b3, 0x16f, 0x2de, 0x1b5, 0x36a, 0x2dd, 0x1b3, 0x366, 0x2c5, 0x183, 0x306, 0x205, 0x3, 0x6, 0xc, 0x18, 0x30, 0x60, 0xc0, 0x180, 0x300, 0x209, 0x1b, 0x36, 0x6c, 0xd8, 0x1b0, 0x360, 0x2c9, 0x19b, 0x336, 0x265, 0xc3, 0x186, 0x30c, 0x211, 0x2b, 0x56, 0xac, 0x158, 0x2b0, 0x169, 0x2d2, 0x1ad, 0x35a, 0x2bd, 0x173, 0x2e6, 0x1c5, 0x38a, 0x31d, 0x233, 0x6f, 0xde, 0x1bc, 0x378, 0x4, 0x10, 0x40, 0x100, 0x9, 0x24, 0x90, 0x240, 0x112, 0x41, 0x104, 0x19, 0x64, 0x190, 0x249, 0x136, 0xd1, 0x344, 0x10b, 0x25, 0x94, 0x250, 0x152, 0x141, 0x10d, 0x3d, 0xf4, 0x3d0, 0x35b, 0x177, 0x1d5, 0x35d, 0x16f, 0x1b5, 0x2dd, 0x366, 0x183, 0x205, 0x6, 0x18, 0x60, 0x180, 0x209, 0x36, 0xd8, 0x360, 0x19b, 0x265, 0x186, 0x211, 0x56, 0x158, 0x169, 0x1ad, 0x2bd, 0x2e6, 0x38a, 0x233, 0xde, 0x378, 0x1fb, 0x3e5, 0x38f, 0x227, 0x8e, 0x238, 0xf2, 0x3c8, 0x33b, 0xf7, 0x3dc, 0x36b, 0x1b7, 0x2d5, 0x346, 0x103, 0x5, 0x14, 0x50, 0x140, 0x109, 0x2d, 0xb4, 0x2d0, 0x352, 0x153, 0x145, 0x11d, 0x7d, 0x1f4, 0x3d9, 0x37f, 0x1e7, 0x395, 0x24f, 0x12e, 0xb1, 0x2c4, 0x302, 0x13, 0x4c, 0x130, 0xc9, 0x324, 0x8b, 0x22c, 0xa2, 0x288, 0x232, 0xda, 0x368, 0x1bb, 0x2e5, 0x386, 0x203, 0x1e, 0x78, 0x1e0, 0x389, 0x23f, 0x8, 0x40, 0x200, 0x24, 0x120, 0x112, 0x82, 0x19, 0xc8, 0x249, 0x26c, 0x344, 0x216, 0x94, 0xa9, 0x141, 0x21a, 0xf4, 0x3a9, 0x177, 0x3aa, 0x16f, 0x36a, 0x366, 0x306, 0x6, 0x30, 0x180, 0x1b, 0xd8, 0x2c9, 0x265, 0x30c, 0x56, 0x2b0, 0x1ad, 0x173, 0x38a, 0x6f, 0x378, 0x3f6, 0x38f, 0x47, 0x238, 0x1e4, 0x33b, 0x1ee, 0x36b, 0x36e, 0x346, 0x206, 0x14, 0xa0, 0x109, 0x5a, 0x2d0, 0x2ad, 0x145, 0x23a, 0x1f4, 0x3bb, 0x1e7, 0x323, 0x12e, 0x162, 0x302, 0x26, 0x130, 0x192, 0x8b, 0x51, 0x288, 0x6d, 0x368, 0x376, 0x386, 0xf, 0x78, 0x3c0, 0x23f, 0x1dc, 0x2fb, 0x3f5, 0x397, 0x87, 0x31, 0x188, 0x5b, 0x2d8, 0x2ed, 0x345, 0x21e, 0xd4, 0x2a9, 0x165, 0x33a, 0x1e6, 0x32b, 0x16e, 0x362, 0x326, 0x106, 0x22, 0x110, 0x92, 0x99, 0xc1, 0x201, 0x2c, 0x160, 0x312, 0xa6, 0x139, 0x1da, 0x2cb, 0x275, 0x38c, 0x5f, 0x2f8, 0x3ed, 0x10, 0x100, 0x24, 0x240, 0x41, 0x19, 0x190, 0x136, 0x344, 0x25, 0x250, 0x141, 0x3d, 0x3d0, 0x177, 0x35d, 0x1b5, 0x366, 0x205, 0x18, 0x180, 0x36, 0x360, 0x265, 0x211, 0x158, 0x1ad, 0x2e6, 0x233, 0x378, 0x3e5, 0x227, 0x238, 0x3c8, 0xf7, 0x36b, 0x2d5, 0x103, 0x14, 0x140, 0x2d, 0x2d0, 0x153, 0x11d, 0x1f4, 0x37f, 0x395, 0x12e, 0x2c4, 0x13, 0x130, 0x324, 0x22c, 0x288, 0xda, 0x1bb, 0x386, 0x1e, 0x1e0, 0x23f, 0x3b8, 0x3fe, 0x397, 0x10e, 0xc4, 0x5b, 0x1b9, 0x3a6, 0x21e, 0x1a8, 0x2b6, 0x33a, 0x3cc, 0xb7, 0x362, 0x245, 0x11, 0x110, 0x124, 0x264, 0x201, 0x58, 0x189, 0xa6, 0x272, 0x361, 0x275, 0x311, 0x17c, 0x3ed, 0x2a7, 0x22a, 0x2e8, 0x2d3, 0x163, 0x21d, 0x198, 0x1b6, 0x356, 0x105, 0x74, 0x349, 0xf5, 0x34b, 0xd5, 0x14b, 0x9d, 0x1c2, 0x1f, 0x1f0, 0x33f, 0x39c, 0x1be, 0x3d6, 0x117, 0x154, 0x16d, 0x2fd, 0x383, 0x4e, 0x20, 0x9, 0x120, 0x41, 0x32, 0x249, 0x1a2, 0x25, 0xa9, 0x10d, 0x1e8, 0x177, 0x2b3, 0x2dd, 0x306, 0x18, 0x300, 0xd8, 0x336, 0x211, 0x2b0, 0x2bd, 0x31d, 0x378, 0x3c3, 0x8e, 0x1e4, 0xf7, 0x2df, 0x346, 0xa, 0x140, 0x5a, 0x352, 0x28a, 0x1f4, 0x2f7, 0x24f, 0x162, 0x13, 0x260, 0x8b, 0x144, 0xda, 0x376, 0x203, 0xf0, 0x23f, 0x379, 0x3e3, 0x87, 0xc4, 0xb6, 0x2ed, 0x10f, 0x1a8, 0x165, 0xf3, 0x25f, 0x362, 0x83, 0x44, 0x92, 0x264, 0xb, 0x160, 0x53, 0x272, 0x2cb, 0x1c6, 0xbe, 0x3ed, 0x147, 0xba, 0x36d, 0x163, 0x33, 0x269, 0x1ab, 0x105, 0xe8, 0x13f, 0x3a1, 0xd5, 0x296, 0x274, 0x20b, 0x1f0, 0x277, 0x26b, 0x1eb, 0x117, 0x2a8, 0x1bd, 0x3c5, 0x4e, 0x1d2, 0x23e, 0x359, 0x3ea, 0x1a7, 0x85, 0x84, 0xa4, 0xad, 0x18d, 0x1cc, 0x1fe, 0x3b7, 0x215, 0x230, 0x299, 0x394, 0x27c, 0x30b, 0x1b8, 0x365, 0x63, 0x7b, 0x37b, 0x40, 0x24, 0x112, 0x19, 0x249, 0x344, 0x94, 0x141, 0xf4, 0x177, 0x16f, 0x366, 0x6, 0x180, 0xd8, 0x265, 0x56, 0x1ad, 0x38a, 0x378, 0x38f, 0x238, 0x33b, 0x36b, 0x346, 0x14, 0x109, 0x2d0, 0x145, 0x1f4, 0x1e7, 0x12e, 0x302, 0x130, 0x8b, 0x288, 0x368, 0x386, 0x78, 0x23f, 0x2fb, 0x397, 0x31, 0x5b, 0x2ed, 0x21e, 0x2a9, 0x33a, 0x32b, 0x362, 0x106, 0x110, 0x99, 0x201, 0x160, 0xa6, 0x1da, 0x275, 0x5f, 0x3ed, 0x28e, 0x2e8, 0x35e, 0x21d, 0x269, 0x356, 0x1d, 0x349, 0x3d4, 0xd5, 0x125, 0x1c2, 0x7c, 0x33f, 0x26b, 0x3d6, 0x55, 0x16d, 0x3e6, 0x4e, 0x3a4, 0xea, 0x2fe, 0x2d7, 0x85, 0x108, 0x290, 0x161, 0xe6, 0x1fe, 0x367, 0x46, 0x1a4, 0x1ca, 0x27c, 0x21f, 0x2e9, 0x31e, 0x239, 0x37b, 0x34f, 0x254, 0xd, 0x340, 0x194, 0x1d1, 0xb5, 0x113, 0x59, 0x26d, 0x256, 0x8d, 0x308, 0x3b0, 0x1e3, 0x2e, 0x392, 0x171, 0xef, 0x3be, 0x80, 0x90, 0x82, 0x190, 0x1a2, 0x94, 0x282, 0x3d0, 0x3aa, 0x2dd, 0x3, 0x180, 0x1b0, 0x186, 0x2b0, 0x2e6, 0x1bc, 0x38f, 0x79, 0xf7, 0x36e, 0x5, 0x280, 0x2d0, 0x28a, 0x3d9, 0x323, 0x2c4, 0x98, 0x8b, 0x119, 0x1bb, 0xf, 0x389, 0x379, 0x397, 0x62, 0x16c, 0x345, 0x1a8, 0x19d, 0x32b, 0x2cd, 0x11, 0x92, 0x182, 0xb0, 0xa6, 0x3b4, 0x1c6, 0x2f8, 0x2a7, 0x174, 0x35e, 0x33, 0x1b6, 0x286, 0x1d0, 0x1ea, 0xd5, 0x24a, 0x301, 0x3e0, 0x39c, 0x1eb, 0x55, 0x2da, 0x383, 0x270, 0x23e, 0x17f, 0x2d7, 0x10a, 0x29, 0xad, 0x23d, 0xff, 0x367, 0x8c, 0x299, 0x24b, 0x381, 0x370, 0x31e, 0x7b, 0x1f7, 0x24e, 0x101, 0x1a0, 0x194, 0x3a2, 0x2d4, 0x8a, 0x199, 0x12b, 0x8d, 0x219, 0x2db, 0x303, 0x2e0, 0x2bc, 0xef, 0x375, 0x19e, 0x2ab, 0x37d, 0x197, 0x222, 0x364, 0x10c, 0x329, 0x3cd, 0x131, 0x196, 0x2a2, 0x3f4, 0x18e, 0x2b9, 0x26f, 0x1a5, 0x100, 0x240, 0x19, 0x136, 0x25, 0x141, 0x3d0, 0x35d, 0x366, 0x18, 0x36, 0x265, 0x158, 0x2e6, 0x378, 0x227, 0x3c8, 0x36b, 0x103, 0x140, 0x2d0, 0x11d, 0x37f, 0x12e, 0x13, 0x324, 0x288, 0x1bb, 0x1e, 0x23f, 0x3fe, 0x10e, 0x5b, 0x3a6, 0x1a8, 0x33a, 0xb7, 0x245, 0x110, 0x264, 0x58, 0xa6, 0x361, 0x311, 0x3ed, 0x22a, 0x2d3, 0x21d, 0x1b6, 0x105, 0x349, 0x34b, 0x14b, 0x1c2, 0x1f0, 0x39c, 0x3d6, 0x154, 0x2fd, 0x4e, 0x28b, 0x2bb, 0x2d7, 0x214, 0xa4, 0x161, 0x398, 0x3df, 0x46, 0x299, 0x9f, 0x21f, 0x3b6, 0x18c, 0x37b, 0x127, 0x101, 0x340, 0x259, 0x12f, 0x113, 0x164, 0x291, 0x8d, 0x3b, 0x37e, 0x2e, 0x253, 0x33d, 0x3be, 0x19e, 0x15f, 0x1ef, 0xa3, 0x268, 0x43, 0x390, 0x3cd, 0x262, 0x251, 0x13d, 0x337, 0x1ac, 0x333, 0x1a5, 0x221, 0x1c1, 0x2f0, 0x155, 0x3fd, 0x20e, 0x292, 0x38d, 0x2f2, 0x355, 0x374, 0x23c, 0xfe, 0x3c7, 0x70, 0x200, 0x112, 0xc8, 0x344, 0xa9, 0xf4, 0x3aa, 0x366, 0x30, 0xd8, 0x30c, 0x1ad, 0x6f, 0x38f, 0x1e4, 0x36b, 0x206, 0x109, 0x2ad, 0x1f4, 0x323, 0x302, 0x192, 0x288, 0x376, 0x78, 0x1dc, 0x397, 0x188, 0x2ed, 0xd4, 0x33a, 0x16e, 0x106, 0x92, 0x201, 0x312, 0x1da, 0x38c, 0x3ed, 0x5d, 0x35e, 0xcc, 0x356, 0xe8, 0x3d4, 0x2a1, 0x1c2, 0x3e0, 0x26b, 0x28f, 0x16d, 0x30f, 0x3a4, 0x359, 0x2d7, 0x21, 0x290, 0x31a, 0x1fe, 0x30e, 0x1a4, 0x24b, 0x21f, 0x365, 0x239, 0x3ee, 0x254, 0x68, 0x194, 0x293, 0x113, 0x2c8, 0x256, 0x61, 0x3b0, 0x303, 0x392, 0x39a, 0x3be, 0x33c, 0x175, 0x363, 0x222, 0x18b, 0xe4, 0x3e2, 0x262, 0xab, 0xfd, 0x18e, 0x2f6, 0x2b1, 0x18a, 0x2e4, 0x2f0, 0x2aa, 0x3ef, 0x54, 0x17a, 0x15c, 0x1d7, 0x1ba, 0x23c, 0x1fc, 0x307, 0x380, 0x3db, 0x9e, 0x237, 0x3d1, 0xb3, 0x91, 0x8, 0x24, 0x82, 0x249, 0x216, 0x141, 0x3a9, 0x9, 0x41, 0x249, 0x25, 0x10d, 0x177, 0x2dd, 0x18, 0xd8, 0x211, 0x2bd, 0x378, 0x8e, 0xf7, 0x346, 0x140, 0x352, 0x1f4, 0x24f, 0x13, 0x8b, 0xda, 0x203, 0x23f, 0x3e3, 0xc4, 0x2ed, 0x1a8, 0xf3, 0x362, 0x44, 0x264, 0x160, 0x272, 0x1c6, 0x3ed, 0xba, 0x163, 0x269, 0x105, 0x13f, 0xd5, 0x274, 0x1f0, 0x26b, 0x117, 0x1bd, 0x4e, 0x23e, 0x3ea, 0x85, 0xa4, 0x18d, 0x1fe, 0x215, 0x299, 0x27c, 0x1b8, 0x63, 0x37b, 0x95, 0x34, 0x194, 0x12f, 0x45, 0x26d, 0x121, 0x3b, 0x1e3, 0x2e0, 0x1cd, 0x3be, 0x271, 0x1dd, 0x32e, 0x268, 0x10c, 0x17e, 0x29c, 0x251, 0xfd, 0x31c, 0x3ca, 0x1a5, 0x96, 0x2f, 0x157, 0x3fd, 0x2a, 0x17a, 0x2b8, 0x355, 0x1cb, 0x388, 0x3f7, 0x70, 0x3f0, 0x4f, 0x237, 0x3ab, 0x2cc, 0x81, 0x80, 0x89, 0xc8, 0x281, 0x2a4, 0x3a9, 0x2de, 0x3, 0x1b, 0xc3, 0x2d2, 0x6f, 0x317, 0x399, 0x36e, 0x28, 0x168, 0x23a, 0x12, 0x104, 0x26c, 0x250, 0x1e8, 0x16f, 0x3, 0x36, 0x30c, 0x2bd, 0x2f9, 0x238, 0x3b1, 0x5, 0x5a, 0x11d, 0x3ce, 0x302, 0x241, 0xda, 0xf, 0xee, 0x327, 0x5b, 0x10f, 0x2ca, 0x16e, 0x11, 0x132, 0x160, 0xed, 0x311, 0x357, 0x3b2, 0x33, 0x356, 0x3a0, 0x137, 0x13a, 0x1f0, 0xdf, 0x55, 0x1f3, 0xe9, 0x359, 0x34e, 0x210, 0x161, 0xff, 0x215, 0x13b, 0x1e2, 0x1db, 0x239, 0x3a3, 0x101, 0x236, 0x34d, 0x226, 0x26d, 0x242, 0xec, 0x303, 0x253, 0x1de, 0x263, 0x2be, 0x2cf, 0x134, 0x10c, 0x2fc, 0x262, 0x2ac, 0x3cb, 0x358, 0x35c, 0x314, 0x30d, 0x2af, 0x3fd, 0x54, 0x1e1, 0x1ed, 0x135, 0x11e, 0x3f8, 0xe, 0xfc, 0x223, 0x237, 0x35f, 0x322, 0x1, 0x12, 0x104, 0x26c, 0x250, 0x1e8, 0x16f, 0x3, 0x36, 0x30c, 0x2bd, 0x2f9, 0x238, 0x3b1, 0x5, 0x5a, 0x11d, 0x3ce, 0x302, 0x241, 0xda, 0xf, 0xee, 0x327, 0x5b, 0x10f, 0x2ca, 0x16e, 0x24, 0x19, 0x344, 0x141, 0x177, 0x366, 0x180, 0x265, 0x1ad, 0x378, 0x238, 0x36b, 0x14, 0x2d0, 0x1f4, 0x12e, 0x130, 0x288, 0x386, 0x23f, 0x397, 0x5b, 0x21e, 0x33a, 0x362, 0x110, 0x201, 0xa6, 0x275, 0x3ed, 0x2e8, 0x21d, 0x356, 0x349, 0xd5, 0x1c2, 0x33f, 0x3d6, 0x16d, 0x4e, 0xea, 0x2d7, 0x108, 0x161, 0x1fe, 0x46, 0x1ca, 0x21f, 0x31e, 0x37b, 0x254, 0x340, 0x1d1, 0x113, 0x26d, 0x8d, 0x3b0, 0x2e, 0x171, 0x3be, 0x1d6, 0x1ef, 0x222, 0x43, 0x17e, 0x262, 0x151, 0x337, 0x2f6, 0x1a5, 0x258, 0x2f0, 0x17d, 0x20e, 0x17a, 0x2f2, 0x135, 0x23c, 0x3fb, 0x70, 0x3db, 0xf9, 0xfb, 0xb3, 0x81, 0x200, 0x82, 0x26c, 0xa9, 0x3a9, 0x36a, 0x30, 0x2c9, 0x2b0, 0x6f, 0x47, 0x1ee, 0x206, 0x5a, 0x23a, 0x323, 0x26, 0x51, 0x376, 0x3c0, 0x3f5, 0x188, 0x345, 0x165, 0x16e, 0x22, 0xc1, 0x312, 0x2cb, 0x2f8, 0x5d, 0x2c6, 0x36c, 0xe8, 0x29f, 0x48, 0x64, 0x216, 0x3d, 0x2b3, 0x6, 0x1b0, 0x158, 0x6f, 0x8e, 0x3b1, 0x14, 0x1a9, 0x3d9, 0x162, 0x324, 0x1b4, 0x78, 0x1ff, 0xc4, 0x345, 0x2ca, 0x1b1, 0x110, 0xb, 0x298, 0x38c, 0x2a7, 0x1af, 0x269, 0x3a, 0x34b, 0x13a, 0x3c9, 0x1eb, 0x16d, 0x9c, 0x3a8, 0x295, 0xa4, 0x73, 0x367, 0x348, 0x1e2, 0x365, 0x3d8, 0x12a, 0x340, 0x3a2, 0x45, 0x34c, 0xc2, 0x2f5, 0x392, 0x1de, 0x19e, 0x3ba, 0x28c, 0x225, 0x17e, 0xcd, 0x14d, 0x18e, 0x333, 0xc5, 0x30d, 0x2ae, 0x3a7, 0x12d, 0x2b8, 0x29e, 0x23c, 0x3ff, 0x1c0, 0x2e7, 0x38b, 0x35f, 0x93, 0x10, 0x89, 0x249, 0x128, 0x3d0, 0x36a, 0x60, 0x336, 0x1ad, 0x2f9, 0xf2, 0x36e, 0x140, 0x2a6, 0x1e7, 0x20d, 0x22c, 0x376, 0x389, 0x3cf, 0x5b, 0x35, 0xf3, 0x326, 0x124, 0xb0, 0x1da, 0xbe, 0x22a, 0x2c6, 0x2d1, 0x3a0, 0xd5, 0x384, 0xe7, 0x28f, 0x2fd, 0x1d2, 0x2fe, 0x10a, 0x252, 0x339, 0x90, 0x190, 0x94, 0x3d0, 0x2dd, 0x180, 0x186, 0x2e6, 0x38f, 0xf7, 0x5, 0x2d0, 0x3d9, 0x2c4, 0x8b, 0x1bb, 0x389, 0x397, 0x16c, 0x1a8, 0x32b, 0x11, 0x182, 0xa6, 0x1c6, 0x2a7, 0x35e, 0x1b6, 0x1d0, 0xd5, 0x301, 0x39c, 0x55, 0x383, 0x23e, 0x2d7, 0x29, 0x23d, 0x367, 0x299, 0x381, 0x31e, 0x1f7, 0x101, 0x194, 0x2d4, 0x199, 0x8d, 0x2db, 0x2e0, 0xef, 0x19e, 0x37d, 0x222, 0x10c, 0x3cd, 0x196, 0x3f4, 0x2b9, 0x1a5, 0x172, 0x353, 0x3ef, 0x292, 0x2b8, 0x135, 0xe2, 0x3c7, 0x3f, 0x4f, 0x338, 0xb3, 0x204, 0x48, 0xc8, 0x4a, 0x1e8, 0x36a, 0xc0, 0xc3, 0x173, 0x3c3, 0x27f, 0x206, 0x168, 0x3e8, 0x162, 0x241, 0x2d9, 0x3c0, 0x3cf, 0xb6, 0xd4, 0x391, 0x20c, 0xc1, 0x53, 0xe3, 0x357, 0x1af, 0xdb, 0xe8, 0x26e, 0x384, 0x1ce, 0x22e, 0x3c5, 0x11f, 0x36f, 0x210, 0x31a, 0x3b7, 0x348, 0x3c4, 0x18f, 0x2ff, 0x284, 0xca, 0x16a, 0x2c8, 0x120, 0x249, 0xa9, 0x177, 0x306, 0xd8, 0x2b0, 0x378, 0x1e4, 0x346, 0x5a, 0x1f4, 0x162, 0x8b, 0x376, 0x23f, 0x87, 0x2ed, 0x165, 0x362, 0x92, 0x160, 0x2cb, 0x3ed, 0x36d, 0x269, 0xe8, 0xd5, 0x20b, 0x26b, 0x2a8, 0x4e, 0x359, 0x85, 0xad, 0x1fe, 0x230, 0x27c, 0x365, 0x37b, 0x284, 0x194, 0x1a1, 0x26d, 0x61, 0x1e3, 0xaf, 0x3be, 0x2ab, 0x32e, 0x18b, 0x17e, 0x334, 0xfd, 0x358, 0x1a5, 0x2e4, 0x157, 0x347, 0x17a, 0x3bd, 0x1cb, 0x1fc, 0x70, 0x2e7, 0x237, 0x195, 0x81, 0x24, 0xc8, 0x94, 0x3a9, 0x366, 0x1b, 0x56, 0x6f, 0x238, 0x36e, 0x109, 0x23a, 0x12e, 0x192, 0x368, 0x3c0, 0x397, 0x2d8, 0x2a9, 0x16e, 0x110, 0x2c, 0x1da, 0x2f8, 0x2e8, 0xcc, 0x1d, 0x29f, 0x1c2, 0x1ce, 0x55, 0x30f, 0xea, 0x295, 0x290, 0x339, 0x46, 0x24b, 0x2e9, 0x1ec, 0x254, 0x236, 0xb5, 0x2c8, 0x8d, 0x1bf, 0x392, 0x371, 0x1d6, 0x363, 0x1b2, 0x329, 0x240, 0x136, 0x141, 0x35d, 0x18, 0x265, 0x2e6, 0x227, 0x36b, 0x140, 0x11d, 0x12e, 0x324, 0x1bb, 0x23f, 0x10e, 0x3a6, 0x33a, 0x245, 0x264, 0xa6, 0x311, 0x22a, 0x21d, 0x105, 0x34b, 0x1c2, 0x39c, 0x154, 0x4e, 0x2bb, 0x214, 0x161, 0x3df, 0x299, 0x21f, 0x18c, 0x127, 0x340, 0x12f, 0x164, 0x8d, 0x37e, 0x253, 0x3be, 0x15f, 0xa3, 0x43, 0x3cd, 0x251, 0x337, 0x333, 0x221, 0x2f0, 0x3fd, 0x292, 0x2f2, 0x374, 0xfe, 0x70, 0x1c7, 0xce, 0xb3, 0x2, 0x89, 0x26c, 0x282, 0x2b3, 0x30, 0xc3, 0x1c5, 0x47, 0x2df, 0x280, 0x23a, 0x25c, 0x241, 0x376, 0x77, 0x21c, 0x345, 0x27d, 0x83, 0xc1, 0x14c, 0x22b, 0x5d, 0x33, 0x20a, 0x29f, 0x384, 0x331, 0x2a8, 0x9c, 0x17f, 0x21, 0x2c2, 0x3b7, 0x13b, 0x37, 0x318, 0x24e, 0x289, 0x25e, 0x2c8, 0x11a, 0x2f5, 0xaf, 0x375, 0x2be, 0x146, 0x86, 0x393, 0xab, 0x267, 0x26f, 0x4b, 0x1e9, 0x3f3, 0x12d, 0x89, 0xd1, 0x21a, 0x1b5, 0x300, 0x56, 0x1bc, 0x3c8, 0x206, 0x352, 0x3ce, 0x130, 0x1b4, 0x389, 0x87, 0x3a6, 0x27d, 0x106, 0x304, 0x272, 0x2f8, 0x3b2, 0xdb, 0x349, 0x296, 0x3c9, 0x28f, 0x383, 0x1d4, 0x85, 0x2b4, 0x3df, 0x13b, 0x6e, 0x7b, 0x254, 0xca, 0x342, 0x34c, 0x3b, 0x5c, 0xef, 0xeb, 0x2cf, 0x18b, 0x1f1, 0x32c, 0x337, 0x26f, 0x96, 0x3ad, 0x3a7, 0x2f4, 0x1d7, 0x11e, 0x3c7, 0x1f8, 0x3e4, 0x167, 0x81, 0x90, 0x9b, 0x141, 0x2b3, 0x60, 0x30c, 0x233, 0x79, 0x346, 0x168, 0x37f, 0x26, 0x232, 0xf0, 0x397, 0x372, 0x2ca, 0x326, 0x264, 0x14c, 0x5f, 0x174, 0x198, 0xe8, 0x354, 0xf8, 0x3d6, 0x1f3, 0x23e, 0x295, 0x252, 0x3fc, 0x1a4, 0x30b, 0x18c, 0x24e, 0x11b, 0x16a, 0x26d, 0x184, 0x20f, 0x39a, 0x19e, 0x3de, 0x1b2, 0xbf, 0x261, 0x3e1, 0x3ca, 0x314, 0x2f0, 0x3f3, 0x25a, 0x3bd, 0x325, 0x3ff, 0x3f, 0x278, 0x3ab, 0x91, 0x112, 0x344, 0xf4, 0x366, 0xd8, 0x1ad, 0x38f, 0x36b, 0x109, 0x1f4, 0x302, 0x288, 0x78, 0x397, 0x2ed, 0x33a, 0x106, 0x201, 0x1da, 0x3ed, 0x35e, 0x356, 0x3d4, 0x1c2, 0x26b, 0x16d, 0x3a4, 0x2d7, 0x290, 0x1fe, 0x1a4, 0x21f, 0x239, 0x254, 0x194, 0x113, 0x256, 0x3b0, 0x392, 0x3be, 0x175, 0x222, 0xe4, 0x262, 0xfd, 0x2f6, 0x18a, 0x2f0, 0x3ef, 0x17a, 0x1d7, 0x23c, 0x307, 0x3db, 0x237, 0xb3, 0x8, 0x82, 0x216, 0x3a9, 0x306, 0x2c9, 0x173, 0x47, 0x36e, 0x5a, 0x3bb, 0x26, 0x6d, 0x3c0, 0x87, 0x345, 0x1e6, 0x22, 0x2c, 0x2cb, 0x357, 0x2c6, 0x286, 0x29f, 0x20b, 0x37c, 0x37a, 0x11f, 0x295, 0xad, 0x3eb, 0x13b, 0xdc, 0x1ec, 0x284, 0xbb, 0x8a, 0x294, 0x1bf, 0xaf, 0x1cf, 0x3ba, 0x134, 0x329, 0x334, 0x3e1, 0x39d, 0x4b, 0x3ad, 0x347, 0x3c2, 0x2a3, 0x1c4, 0xe, 0x2e7, 0x19c, 0x191, 0x40, 0x19, 0x94, 0x177, 0x6, 0x265, 0x38a, 0x224, 0x10b, 0x3a9, 0x205, 0x336, 0x38a, 0x79, 0x103, 0x2ad, 0x24f, 0x241, 0x386, 0x1ff, 0x16c, 0x165, 0x245, 0x304, 0x1da, 0x3d3, 0x163, 0x286, 0x137, 0x3e, 0x3d6, 0x3c5, 0x3a8, 0x21, 0x23d, 0x23, 0x27c, 0x235, 0x127, 0x236, 0x342, 0x12b, 0x3b0, 0x32d, 0x2e3, 0x3ba, 0x268, 0xbf, 0x196, 0x267, 0x35c, 0x2e4, 0x15d, 0x150, 0x2f2, 0x396, 0x3f7, 0x1f8, 0x38b, 0x25d, 0x8, 0x104, 0x4a, 0x177, 0xc, 0x186, 0x6f, 0x3c8, 0xa, 0x145, 0x25c, 0x22c, 0xf, 0x3e3, 0x372, 0x33a, 0x20c, 0x16, 0x2cb, 0x2a7, 0x30a, 0x1d, 0x1aa, 0x1f0, 0x28f, 0x217, 0x17f, 0x108, 0x1cc, 0x118, 0x3c4, 0x18c, 0x12a, 0x194, 0x226, 0x14a, 0x1bf, 0x15e, 0x335, 0x1ef, 0x364, 0x1f1, 0xab, 0x31c, 0x2d6, 0x30d, 0x2fa, 0x292, 0x3bd, 0x8f, 0x387, 0x3db, 0x67, 0x2cc, 0x40, 0x32, 0x250, 0x3aa, 0x60, 0x2b, 0x378, 0x27f, 0x50, 0x23a, 0x2c4, 0x144, 0x78, 0x41, 0x25, 0x177, 0x18, 0x211, 0x378, 0xf7, 0x140, 0x1f4, 0x13, 0xda, 0x23f, 0xc4, 0x1a8, 0x362, 0x264, 0x272, 0x3ed, 0x163, 0x105, 0xd5, 0x1f0, 0x117, 0x4e, 0x3ea, 0xa4, 0x1fe, 0x299, 0x1b8, 0x37b, 0x34, 0x12f, 0x26d, 0x3b, 0x2e0, 0x3be, 0x1dd, 0x268, 0x17e, 0x251, 0x31c, 0x1a5, 0x2f, 0x3fd, 0x17a, 0x355, 0x388, 0x70, 0x4f, 0x3ab, 0x81, 0x89, 0x281, 0x3a9, 0x3, 0xc3, 0x6f, 0x399, 0x28, 0x23a, 0x181, 0x119, 0x3c0, 0x21c, 0x35, 0x16e, 0x248, 0x14c, 0x2f8, 0x1af, 0x2a5, 0x29f, 0x3e, 0x3a5, 0x30f, 0x17f, 0x210, 0x339, 0xd2, 0x37, 0x1ec, 0x202, 0x3a2, 0x2c8, 0x184, 0x5c, 0x371, 0x2be, 0x4d, 0x329, 0xcb, 0x267, 0x2b1, 0x382, 0x2fa, 0x12d, 0x2ef, 0x71, 0xe, 0x38e, 0x1f6, 0x91, 0x90, 0xd1, 0xf4, 0x183, 0x19b, 0x38a, 0xf2, 0x5, 0x145, 0xb1, 0xa2, 0x78, 0x247, 0x283, 0x32b, 0x49, 0x22d, 0x5f, 0x82, 0x94, 0x3aa, 0x180, 0x2b0, 0x38f, 0x36e, 0x2d0, 0x323, 0x8b, 0xf, 0x397, 0x345, 0x32b, 0x92, 0xa6, 0x2f8, 0x35e, 0x286, 0xd5, 0x3e0, 0x55, 0x270, 0x2d7, 0xad, 0x367, 0x24b, 0x31e, 0x24e, 0x194, 0x8a, 0x8d, 0x303, 0xef, 0x2ab, 0x222, 0x329, 0x196, 0x18e, 0x1a5, 0x5e, 0x3ef, 0x3c2, 0x135, 0x1fc, 0x3f, 0x3c1, 0xb3, 0x40, 0xc8, 0x141, 0x36a, 0xd8, 0x173, 0x238, 0x206, 0x145, 0x162, 0x288, 0x3c0, 0x31, 0xd4, 0x362, 0xc1, 0x1da, 0x357, 0x21d, 0xe8, 0x125, 0x1ce, 0x16d, 0x11f, 0x85, 0x31a, 0x46, 0x3c4, 0x239, 0x284, 0x1d1, 0x2c8, 0x308, 0x170, 0x3be, 0x3ba, 0x1b2, 0x3e2, 0x151, 0x358, 0x18a, 0x3ad, 0x20e, 0x15c, 0x1cb, 0x3e7, 0x3db, 0x19c, 0x93, 0x24, 0x26c, 0xf4, 0x306, 0x265, 0x6f, 0x33b, 0xa0, 0x1f4, 0x26, 0x368, 0x1dc, 0x5b, 0x165, 0x106, 0x2c, 0x275, 0x5d, 0x269, 0x27e, 0x1c2, 0x37c, 0x3e6, 0x104, 0x250, 0x16f, 0x36, 0x2bd, 0x238, 0x5, 0x11d, 0x302, 0xda, 0xee, 0x5b, 0x2ca, 0x11, 0x160, 0x311, 0x3b2, 0x356, 0x137, 0x1f0, 0x55, 0xe9, 0x34e, 0x161, 0x215, 0x1e2, 0x239, 0x101, 0x34d, 0x26d, 0xec, 0x253, 0x263, 0x2cf, 0x10c, 0x262, 0x3cb, 0x35c, 0x30d, 0x3fd, 0x1e1, 0x135, 0x3f8, 0xfc, 0x237, 0x322, 0x12, 0x26c, 0x1e8, 0x3, 0x30c, 0x2f9, 0x3b1, 0x5a, 0x3ce, 0x241, 0xf, 0x327, 0x10f, 0x16e, 0x132, 0xed, 0x357, 0x33, 0x3a0, 0x13a, 0xdf, 0x1f3, 0x359, 0x210, 0xff, 0x13b, 0x1db, 0x3a3, 0x236, 0x226, 0x242, 0x303, 0x1de, 0x2be, 0x134, 0x2fc, 0x2ac, 0x358, 0x314, 0x2af, 0x54, 0x1ed, 0x11e, 0xe, 0x223, 0x35f, 0x1, 0x104, 0x250, 0x16f, 0x36, 0x2bd, 0x238, 0x5, 0x11d, 0x302, 0xda, 0xee, 0x5b, 0x2ca, 0x11, 0x160, 0x311, 0x3b2, 0x356, 0x137, 0x1f0, 0x55, 0xe9, 0x34e, 0x161, 0x215, 0x1e2, 0x239, 0x208, 0x152, 0x36a, 0x360, 0x31d, 0x33b, 0x280, 0x37f, 0x192, 0x203, 0x327, 0x21e, 0x1b1, 0x182, 0x2cb, 0x22a, 0xdb, 0x3d4, 0x3e, 0x117, 0x270, 0x34e, 0x2c2, 0x46, 0x30b, 0x3d8, 0x68, 0x2d4, 0xa5, 0x1e3, 0x273, 0x15f, 0x134, 0x1f1, 0x2a2, 0x2f6, 0x12c, 0x15d, 0x12d, 0x355, 0x7f, 0x3f, 0x31f, 0x322, 0x24, 0x1a2, 0x35b, 0x30, 0x158, 0x317, 0x346, 0x2a6, 0x2c4, 0x6d, 0xee, 0xb6, 0x33a, 0x88, 0x22d, 0x2f8, 0x163, 0x3a, 0x125, 0x331, 0x2fd, 0x359, 0x29, 0x3fc, 0x1ca, 0x18f, 0x95, 0xbb, 0x164, 0x219, 0x392, 0x335, 0x2cf, 0x218, 0x19a, 0x267, 0x1a5, 0x178, 0x287, 0x15c, 0x325, 0x207, 0x315, 0x35f, 0x2, 0x19, 0x2a4, 0x2dd, 0x2c9, 0x233, 0x27f, 0x109, 0x2f7, 0x324, 0xf, 0x247, 0x35, 0x362, 0x304, 0x19f, 0x5d, 0x1b6, 0x3a1, 0x7c, 0x22e, 0xe9, 0x295, 0x18d, 0x8c, 0x21f, 0x3b9, 0xd0, 0x1a1, 0x14a, 0x3c6, 0xef, 0x19, 0x141, 0x366, 0x265, 0x378, 0x36b, 0x2d0, 0x12e, 0x288, 0x23f, 0x5b, 0x33a, 0x110, 0xa6, 0x3ed, 0x21d, 0x349, 0x1c2, 0x3d6, 0x4e, 0x2d7, 0x161, 0x46, 0x21f, 0x37b, 0x340, 0x113, 0x8d, 0x2e, 0x3be, 0x1ef, 0x43, 0x262, 0x337, 0x1a5, 0x2f0, 0x20e, 0x2f2, 0x23c, 0x70, 0xf9, 0xb3, 0x200, 0x26c, 0x3a9, 0x30, 0x2b0, 0x47, 0x206, 0x23a, 0x26, 0x376, 0x3f5, 0x345, 0x16e, 0xc1, 0x2cb, 0x5d, 0x36c, 0x29f, 0x3e0, 0x2a8, 0x11f, 0x21, 0x339, 0x13b, 0x365, 0x24e, 0xbb, 0x2c8, 0x76, 0xaf, 0x33c, 0x146, 0x329, 0xab, 0x358, 0x4b, 0x2aa, 0x12d, 0x2a3, 0x1fc, 0x1f8, 0x19c, 0x91, 0x112, 0x94, 0x16f, 0xd8, 0x38a, 0x33b, 0x109, 0x1e7, 0x8b, 0x78, 0x31, 0x2a9, 0x106, 0x160, 0x5f, 0x35e, 0x1d, 0x125, 0x26b, 0x3e6, 0x2fe, 0x290, 0x367, 0x27c, 0x239, 0xd, 0xb5, 0x256, 0x1e3, 0xef, 0x175, 0x1b2, 0x32f, 0xfd, 0xd7, 0x32, 0x10d, 0x306, 0x211, 0x3c3, 0x346, 0x28a, 0x13, 0x376, 0x3e3, 0x10f, 0x362, 0xb, 0x1c6, 0x36d, 0x105, 0x296, 0x26b, 0x3c5, 0x3ea, 0xad, 0x215, 0x30b, 0x37b, 0x289, 0x45, 0x61, 0x2e0, 0x335, 0x32e, 0x1c8, 0x251, 0x358, 0x96, 0x2ba, 0x17a, 0x26a, 0x3f7, 0x2e7, 0x3ab, 0x4, 0xc8, 0x3d, 0x3, 0x56, 0x317, 0x103, 0x23a, 0x4c, 0x1c3, 0x397, 0x35, 0x193, 0x2c, 0x311, 0x1af, 0x1d, 0x24a, 0x1be, 0x30f, 0x3b3, 0x2b4, 0x46, 0x37, 0x1f7, 0x236, 0x114, 0x184, 0x392, 0xcf, 0xa3, 0x329, 0x156, 0x17b, 0x258, 0x2fa, 0x1e1, 0x1ba, 0x3c7, 0x38e, 0x2b7, 0x10, 0x320, 0xf4, 0xc, 0x158, 0x47, 0x5, 0xfa, 0x130, 0x305, 0x247, 0xd4, 0x245, 0xb0, 0x5f, 0x2b5, 0x74, 0x13a, 0x2f1, 0x27, 0x2d7, 0x2c2, 0x118, 0xdc, 0x3d5, 0xca, 0x59, 0x219, 0x253, 0x33c, 0x28c, 0xbf, 0x151, 0x1e5, 0x172, 0x3fa, 0x38d, 0x2e1, 0x307, 0x64, 0x3d, 0x6, 0x158, 0x8e, 0x14, 0x3d9, 0x324, 0x78, 0xc4, 0x2ca, 0x110, 0x298, 0x2a7, 0x269, 0x34b, 0x3c9, 0x16d, 0x3a8, 0xa4, 0x367, 0x1e2, 0x3d8, 0x340, 0x45, 0xc2, 0x392, 0x19e, 0x28c, 0x17e, 0x14d, 0x333, 0x30d, 0x3a7, 0x2b8, 0x23c, 0x1c0, 0x38b, 0x93, 0x89, 0x128, 0x36a, 0x336, 0x2f9, 0x36e, 0x2a6, 0x20d, 0x376, 0x3cf, 0x35, 0x326, 0xb0, 0xbe, 0x2c6, 0x3a0, 0x384, 0x28f, 0x1d2, 0x10a, 0x339, 0xe5, 0x235, 0x284, 0x25e, 0xa5, 0x303, 0x1df, 0x3de, 0x218, 0xcb, 0xd6, 0x4b, 0x2ba, 0x2f4, 0x1ba, 0x387, 0x223, 0x195, 0x100, 0xd1, 0x177, 0x209, 0x2e6, 0x33b, 0x2d, 0x24f, 0x288, 0xee, 0x1b9, 0x32b, 0x264, 0x19f, 0x2e8, 0x143, 0x14b, 0x26b, 0x383, 0x3b3, 0x161, 0x118, 0x1b8, 0x34f, 0x259, 0x199, 0x3b0, 0x1cd, 0x15f, 0x1b2, 0xa7, 0x3cb, 0x1a5, 0x3d2, 0xa8, 0x1d7, 0xfe, 0x3f0, 0xfb, 0x204, 0x32, 0x21a, 0xc8, 0xf4, 0x30, 0x1ad, 0x1e4, 0x109, 0x323, 0x288, 0x1dc, 0x2ed, 0x16e, 0x201, 0x38c, 0x35e, 0xe8, 0x1c2, 0x28f, 0x3a4, 0x21, 0x1fe, 0x24b, 0x239, 0x68, 0x113, 0x61, 0x392, 0x33c, 0x222, 0x3e2, 0xfd, 0x2b1, 0x2f0, 0x54, 0x1d7, 0x1fc, 0x3db, 0x3d1, 0x8, 0x249, 0x3a9, 0x180, 0x173, 0x33b, 0x5a, 0x12e, 0x6d, 0x2fb, 0x345, 0x362, 0x2c, 0x5f, 0x2c6, 0x349, 0x20b, 0x55, 0x11f, 0x108, 0x3eb, 0x27c, 0x1ec, 0x340, 0x8a, 0x308, 0xaf, 0x1d6, 0x134, 0x32f, 0x3e1, 0x1a5, 0x3ad, 0x2a0, 0x2a3, 0x3fb, 0x2e7, 0x2b7, 0x40, 0x26c, 0x177, 0x1b, 0x38a, 0x1ee, 0x2d0, 0x162, 0x368, 0x3f5, 0x21e, 0x326, 0x160, 0x2f8, 0x21d, 0x27e, 0x7c, 0x2a8, 0xea, 0x52, 0x367, 0x3c4, 0x37b, 0x236, 0x59, 0x76, 0x171, 0x2ab, 0x1b2, 0x14e, 0x337, 0x133, 0x157, 0x12d, 0x135, 0x3e7, 0x315, 0x195, 0x200, 0x344, 0x3aa, 0xd8, 0x6f, 0x36b, 0x2ad, 0x190, 0x3d0, 0x180, 0x2e6, 0xf7, 0x2d0, 0x2c4, 0x1bb, 0x397, 0x1a8, 0x11, 0xa6, 0x2a7, 0x1b6, 0xd5, 0x39c, 0x383, 0x2d7, 0x23d, 0x299, 0x31e, 0x101, 0x2d4, 0x8d, 0x2e0, 0x19e, 0x222, 0x3cd, 0x3f4, 0x1a5, 0x353, 0x292, 0x135, 0x3c7, 0x4f, 0xb3, 0x48, 0x4a, 0x36a, 0xc3, 0x3c3, 0x206, 0x3e8, 0x241, 0x3c0, 0xb6, 0x391, 0xc1, 0xe3, 0x1af, 0xe8, 0x384, 0x22e, 0x11f, 0x210, 0x3b7, 0x3c4, 0x2ff, 0xca, 0x2c8, 0x369, 0x273, 0x3ba, 0x86, 0xcb, 0x358, 0xb9, 0x3f3, 0x15c, 0x71, 0x21b, 0x19c, 0x102, 0x64, 0xf4, 0x60, 0x2bd, 0x33b, 0xb4, 0xb1, 0x368, 0x3e3, 0x6a, 0x106, 0x22d, 0x3af, 0x269, 0x137, 0xe7, 0x3e6, 0x3b3, 0x18d, 0x1a4, 0x2c3, 0x142, 0xb5, 0x121, 0xb8, 0x263, 0x28c, 0x1f1, 0xfd, 0x16b, 0x3d2, 0x2a0, 0x14f, 0x3f7, 0x315, 0x32a, 0x12, 0x216, 0x2de, 0x336, 0x3f6, 0x285, 0xfa, 0x192, 0xf0, 0x229, 0x1e6, 0x320, 0x35b, 0x1b, 0x233, 0x2df, 0x145, 0x98, 0x1e, 0x188, 0xf3, 0x132, 0x275, 0x1af, 0x1d0, 0x20b, 0x154, 0x1d4, 0x290, 0x23, 0x1b8, 0x24e, 0x34d, 0xa5, 0x2e, 0x335, 0x28c, 0x3e2, 0x3f4, 0x34a, 0x157, 0xbd, 0x374, 0xe, 0x3e4, 0x126, 0x82, 0x10d, 0xc, 0x1ad, 0x399, 0xb4, 0x162, 0x1bb, 0x327, 0x2a9, 0x88, 0x272, 0x5d, 0x143, 0x24a, 0x3d6, 0x1d2, 0x42, 0x3eb, 0x1e2, 0x2ff, 0x194, 0x332, 0x37e, 0x371, 0x3b5, 0x1c8, 0x151, 0x26f, 0xbc, 0x54, 0x355, 0x3ff, 0x315, 0x25d, 0x48, 0x94, 0x1b3, 0x211, 0x47, 0x50, 0x3ce, 0x288, 0x379, 0x283, 0x326, 0x189, 0x3d3, 0x269, 0x26e, 0x39c, 0x30f, 0x34e, 0x1cc, 0x1ca, 0x318, 0xd0, 0x8a, 0x3b, 0x2e2, 0x175, 0x225, 0x261, 0x358, 0x172, 0x3d7, 0x2f2, 0x319, 0x3f0, 0x3d1, 0x20, 0xd1, 0x3aa, 0x360, 0x2f9, 0x346, 0xfa, 0x324, 0x3c0, 0x16c, 0x25f, 0x201, 0x22b, 0x185, 0x27e, 0x249, 0x177, 0xd8, 0x378, 0x346, 0x1f4, 0x8b, 0x23f, 0x2ed, 0x362, 0x160, 0x3ed, 0x269, 0xd5, 0x26b, 0x4e, 0x85, 0x1fe, 0x27c, 0x37b, 0x194, 0x26d, 0x1e3, 0x3be, 0x32e, 0x17e, 0xfd, 0x1a5, 0x157, 0x17a, 0x1cb, 0x70, 0x237, 0x81, 0xc8, 0x3a9, 0x1b, 0x6f, 0x36e, 0x23a, 0x192, 0x3c0, 0x2d8, 0x16e, 0x2c, 0x2f8, 0xcc, 0x29f, 0x1ce, 0x30f, 0x295, 0x339, 0x24b, 0x1ec, 0x236, 0x2c8, 0x1bf, 0x371, 0x363, 0x329, 0x29a, 0x2b1, 0x3ad, 0x12d, 0x1ba, 0xe, 0x3c1, 0x91, 0x19, 0xf4, 0x180, 0x38a, 0x36b, 0x145, 0x130, 0x78, 0x5b, 0x32b, 0x201, 0x5f, 0x21d, 0x3d4, 0x33f, 0x3e6, 0x2d7, 0xe6, 0x1ca, 0x239, 0x340, 0x59, 0x3b0, 0xef, 0x1ef, 0xe4, 0x151, 0xd7, 0x2f0, 0x2a0, 0x135, 0x307, 0xf9, 0x93, 0x82, 0x21a, 0x30, 0x173, 0x1ee, 0x2ad, 0x26, 0xf, 0x188, 0x1e6, 0xc1, 0x38c, 0x2c6, 0x27e, 0x3e0, 0x37a, 0x3dd, 0x31a, 0x9b, 0x1d5, 0x2c9, 0x3e5, 0xa, 0x1e7, 0x119, 0x3fe, 0xd4, 0x44, 0xed, 0x2e8, 0x3a, 0x301, 0x2a8, 0x2bb, 0x2b4, 0x1a4, 0x235, 0x34, 0x8a, 0xec, 0x273, 0x1ef, 0x1c8, 0x14d, 0x2b1, 0x353, 0xbd, 0x1cb, 0xe0, 0xce, 0x1, 0x9b, 0x1d5, 0x2c9, 0x3e5, 0xa, 0x1e7, 0x119, 0x3fe, 0xd4, 0x44, 0xed, 0x2e8, 0x3a, 0x301, 0x2a8, 0x2bb, 0x2b4, 0x1a4, 0x235, 0x34, 0x8a, 0xec, 0x273, 0x1ef, 0x1c8, 0x14d, 0x2b1, 0x353, 0xbd, 0x1cb, 0xe0, 0xce, 0x1, 0x9b, 0x1d5, 0x2c9, 0x3e5, 0xa, 0x1e7, 0x119, 0x3fe, 0xd4, 0x44, 0xed, 0x2e8, 0x3a, 0x301, 0x2a8, 0x2bb, 0x2b4, 0x1a4, 0x235, 0x34, 0x8a, 0xec, 0x273, 0x1ef, 0x1c8, 0x14d, 0x2b1, 0x353, 0xbd, 0x1cb, 0xe0, 0xce, 0x1, 0x9b, 0x1d5, 0x2c9, 0x3e5, 0xa, 0x1e7, 0x119, 0x3fe, 0xd4, 0x44, 0xed, 0x2e8, 0x3a, 0x301, 0x2a8, 0x2bb, 0x2b4, 0x1a4, 0x235, 0x34, 0x8a, 0x136, 0x35d, 0x265, 0x227, 0x140, 0x12e, 0x1bb, 0x10e, 0x33a, 0x264, 0x311, 0x21d, 0x34b, 0x39c, 0x4e, 0x214, 0x3df, 0x21f, 0x127, 0x12f, 0x8d, 0x253, 0x15f, 0x43, 0x251, 0x333, 0x2f0, 0x292, 0x374, 0x70, 0xce, 0x2, 0x26c, 0x2b3, 0xc3, 0x47, 0x280, 0x25c, 0x376, 0x21c, 0x27d, 0xc1, 0x22b, 0x33, 0x29f, 0x331, 0x9c, 0x21, 0x3b7, 0x37, 0x24e, 0x25e, 0x11a, 0xaf, 0x2be, 0x86, 0xab, 0x26f, 0x1e9, 0x12d, 0x2e1, 0xe0, 0x19c, 0x4, 0xd1, 0x16f, 0x186, 0x8e, 0x109, 0xb1, 0x2e5, 0x31, 0xf3, 0x182, 0x5f, 0x66, 0x137, 0x26b, 0x138, 0x42, 0x367, 0x6e, 0x95, 0xb5, 0x234, 0x15e, 0x175, 0x10c, 0x156, 0xd7, 0x3d2, 0x25a, 0x1cb, 0x1c0, 0x338, 0x8, 0x1a2, 0x2de, 0x30c, 0x11c, 0x212, 0x162, 0x1c3, 0x62, 0x1e6, 0x304, 0xbe, 0xcc, 0x26e, 0xdf, 0x270, 0x84, 0x2c7, 0xdc, 0x12a, 0x16a, 0x61, 0x2bc, 0x2ea, 0x218, 0x26c, 0x16f, 0x30c, 0x238, 0x5a, 0x302, 0xf, 0x5b, 0x16e, 0x160, 0x357, 0x356, 0x13a, 0x55, 0x359, 0x161, 0x13b, 0x239, 0x236, 0x26d, 0x303, 0x263, 0x134, 0x262, 0x358, 0x30d, 0x54, 0x135, 0xe, 0x237, 0x1, 0x26c, 0x16f, 0x30c, 0x238, 0x5a, 0x302, 0xf, 0x5b, 0x16e, 0x160, 0x357, 0x356, 0x13a, 0x55, 0x359, 0x161, 0x13b, 0x239, 0x236, 0x26d, 0x303, 0x263, 0x134, 0x262, 0x358, 0x30d, 0x54, 0x135, 0xe, 0x237, 0x1, 0x26c, 0x16f, 0x30c, 0x238, 0x5a, 0x302, 0xf, 0x5b, 0x16e, 0x160, 0x357, 0x356, 0x13a, 0x55, 0x359, 0x161, 0x13b, 0x239, 0x236, 0x26d, 0x303, 0x263, 0x134, 0x262, 0x358, 0x30d, 0x54, 0x135, 0xe, 0x237, 0x1, 0x26c, 0x16f, 0x30c, 0x238, 0x5a, 0x302, 0xf, 0x5b, 0x16e, 0x160, 0x357, 0x356, 0x13a, 0x55, 0x359, 0x161, 0x13b, 0x239, 0x236, 0x26d, 0x303, 0x263, 0x134, 0x262, 0x358, 0x30d, 0x54, 0xd1, 0x1b5, 0x56, 0x3c8, 0x352, 0x130, 0x389, 0x3a6, 0x106, 0x272, 0x3b2, 0x349, 0x3c9, 0x383, 0x85, 0x3df, 0x6e, 0x254, 0x342, 0x3b, 0xef, 0x2cf, 0x1f1, 0x337, 0x96, 0x3a7, 0x1d7, 0x3c7, 0x3e4, 0x81, 0x9b, 0x2b3, 0x30c, 0x79, 0x168, 0x26, 0xf0, 0x372, 0x326, 0x14c, 0x174, 0xe8, 0xf8, 0x1f3, 0x295, 0x3fc, 0x30b, 0x24e, 0x16a, 0x184, 0x39a, 0x3de, 0xbf, 0x3e1, 0x314, 0x3f3, 0x3bd, 0x3ff, 0x278, 0x91, 0x190, 0x1d5, 0x265, 0x8e, 0x2d, 0x302, 0x1e, 0x16c, 0x362, 0x22d, 0x22a, 0x1d, 0x1f, 0x1bd, 0x2d7, 0x27b, 0x1e2, 0x34f, 0x12f, 0x234, 0x171, 0x37d, 0x390, 0xfd, 0x266, 0x1fd, 0x2f2, 0x3f8, 0x4f, 0x93, 0x32, 0x2bf, 0x2c9, 0x317, 0x280, 0x162, 0x305, 0x229, 0x16e, 0x2c0, 0x147, 0x286, 0x384, 0x2b2, 0x3dd, 0x1cc, 0x13e, 0x3ee, 0x3a2, 0x242, 0xaf, 0x2ea, 0x72, 0x29a, 0x34a, 0x2ba, 0x15c, 0x7f, 0x38e, 0x191, 0x1a2, 0x2dd, 0x2b0, 0xf7, 0x28a, 0x8b, 0x379, 0x1a8, 0x92, 0x1c6, 0x33, 0xd5, 0x1eb, 0x23e, 0xad, 0x299, 0x7b, 0x194, 0x12b, 0x2e0, 0x2ab, 0x10c, 0x2a2, 0x1a5, 0x2ba, 0x2b8, 0x1fc, 0x4f, 0x126, 0xc8, 0x1d5, 0xc3, 0x238, 0x168, 0x4c, 0x3c0, 0x3a6, 0x20c, 0x1da, 0x1af, 0xf5, 0x1ce, 0x138, 0x210, 0x46, 0x18f, 0xd0, 0x2c8, 0x385, 0xcf, 0x1b2, 0xcb, 0x333, 0x3ad, 0x1e1, 0x71, 0x3db, 0x25d, 0x224, 0xf4, 0x6c, 0x3e5, 0xa0, 0xb1, 0x305, 0x5b, 0x1b1, 0x22d, 0x5d, 0x74, 0xf8, 0x3e6, 0x246, 0x3df, 0xdc, 0x142, 0x226, 0x3b0, 0x1df, 0x28c, 0x14e, 0x1ac, 0x213, 0x2a0, 0x2e1, 0x309, 0x3d1, 0x12, 0x152, 0x30, 0x233, 0x285, 0x1e7, 0x1b4, 0x10e, 0x1e6, 0x16, 0x3d3, 0x356, 0xe1, 0x159, 0x3dd, 0x398, 0xf1, 0x34f, 0x25e, 0xc2, 0x39a, 0x3b5, 0x2fc, 0x337, 0x12c, 0x287, 0x2a3, 0x7, 0x67, 0x8, 0x10b, 0x2c5, 0x1ad, 0x344, 0x366, 0x1ad, 0x36b, 0x1f4, 0x288, 0x397, 0x33a, 0x201, 0x3ed, 0x356, 0x1c2, 0x16d, 0x2d7, 0x1fe, 0x21f, 0x254, 0x113, 0x3b0, 0x3be, 0x222, 0x262, 0x2f6, 0x2f0, 0x17a, 0x23c, 0x3db, 0xb3, 0x82, 0x3a9, 0x2c9, 0x47, 0x5a, 0x26, 0x3c0, 0x345, 0x22, 0x2cb, 0x2c6, 0x29f, 0x37c, 0x11f, 0xad, 0x13b, 0x1ec, 0xbb, 0x294, 0xaf, 0x3ba, 0x329, 0x3e1, 0x4b, 0x347, 0x2a3, 0xe, 0x19c, 0x40, 0x94, 0x6, 0x38a, 0x346, 0x1e7, 0x368, 0x31, 0x32b, 0x160, 0x28e, 0x1d, 0x7c, 0x3e6, 0x85, 0x367, 0x2e9, 0xd, 0x59, 0x1e3, 0x263, 0x1b2, 0x196, 0xd7, 0x157, 0x22f, 0x23b, 0x315, 0x93, 0xc8, 0x3aa, 0x30c, 0x1e4, 0x2ad, 0x192, 0x1dc, 0xd4, 0x92, 0x38c, 0xcc, 0x2a1, 0x28f, 0x359, 0x31a, 0x24b, 0x3ee, 0x293, 0x61, 0x39a, 0x363, 0x3e2, 0x18e, 0x2e4, 0x54, 0x1ba, 0x380, 0x3d1, 0x24, 0x141, 0x180, 0x378, 0x14, 0x12e, 0x386, 0x281, 0x183, 0x173, 0x2d5, 0x2f7, 0x368, 0x62, 0xb7, 0x312, 0xba, 0x3a0, 0x33f, 0x9c, 0x29, 0x230, 0x18c, 0xca, 0x256, 0x32d, 0x1dd, 0x329, 0x3cb, 0x12c, 0x20e, 0x26a, 0x1c0, 0x3d1, 0x48, 0x10d, 0x1b, 0x3e5, 0x280, 0x302, 0xf0, 0x3a6, 0x22, 0x19f, 0x30a, 0xd5, 0x3a5, 0x3a8, 0x31a, 0x9f, 0x3a3, 0xb5, 0x219, 0x3bc, 0x146, 0x29c, 0x17b, 0x2f0, 0x2f4, 0xe2, 0x2e7, 0x322, 0x64, 0x3aa, 0x211, 0x399, 0x145, 0x116, 0x3fe, 0x165, 0x182, 0x3f2, 0x356, 0x384, 0x1bd, 0x295, 0x3df, 0x370, 0xd, 0xb2, 0x385, 0x33c, 0x316, 0x2ac, 0x1a5, 0x2fa, 0x3da, 0x3e7, 0x38b, 0x4, 0x216, 0x205, 0x1c5, 0x346, 0x3ce, 0x1bb, 0x188, 0x2dc, 0x53, 0x2e8, 0x29b, 0xe7, 0x270, 0xa4, 0xd2, 0x239, 0x328, 0x14a, 0xaf, 0x37d, 0xbf, 0x337, 0xb9, 0x2a, 0x1ba, 0x309, 0x35f, 0x120, 0x3d, 0x6c, 0x38f, 0x212, 0x13, 0x3c0, 0x283, 0x88, 0x275, 0x10b, 0x205, 0x38a, 0x103, 0x24f, 0x386, 0x16c, 0x245, 0x1da, 0x163, 0x137, 0x3d6, 0x3a8, 0x23d, 0x27c, 0x127, 0x342, 0x3b0, 0x2e3, 0x268, 0x196, 0x35c, 0x15d, 0x2f2, 0x3f7, 0x38b, 0x8, 0x4a, 0xc, 0x6f, 0xa, 0x25c, 0xf, 0x372, 0x20c, 0x2cb, 0x30a, 0x1aa, 0x28f, 0x17f, 0x1cc, 0x3c4, 0x12a, 0x226, 0x1bf, 0x335, 0x364, 0xab, 0x2d6, 0x2fa, 0x3bd, 0x387, 0x67, 0x40, 0x250, 0x60, 0x378, 0x50, 0x2c4, 0x78, 0x3a6, 0x44, 0x275, 0x66, 0x14b, 0x55, 0x3ea, 0x27b, 0x21f, 0x142, 0x114, 0x1e3, 0x19e, 0x316, 0x151, 0x29d, 0x3fd, 0x1d7, 0x7, 0x338, 0x200, 0x2a4, 0x300, 0x3f6, 0x280, 0x20d, 0x3c0, 0x10f, 0x220, 0x38c, 0x330, 0x24a, 0x2a8, 0x36f, 0x3fc, 0xdc, 0x202, 0xb2, 0x303, 0xeb, 0x86, 0x29a, 0xc5, 0x3d7, 0x2a3, 0x38, 0x1f6, 0x24, 0x10d, 0x36, 0x38f, 0x2d, 0x4c, 0x23f, 0x6a, 0x124, 0x5f, 0x1b6, 0x274, 0x16d, 0x216, 0x6, 0x6f, 0x14, 0x162, 0x78, 0x345, 0x110, 0x38c, 0x269, 0x13a, 0x16d, 0x295, 0x367, 0x365, 0x340, 0x34c, 0x392, 0x3ba, 0x17e, 0x18e, 0x30d, 0x12d, 0x23c, 0x2e7, 0x93, 0x249, 0x36a, 0x1ad, 0x36e, 0x1e7, 0x376, 0x5b, 0x326, 0x1da, 0x2c6, 0xd5, 0x28f, 0x2fe, 0x339, 0x21f, 0x284, 0x59, 0x303, 0x1d6, 0x218, 0xfd, 0x4b, 0x20e, 0x1ba, 0x3f, 0x195, 0x82, 0x177, 0x30c, 0x33b, 0x23a, 0x288, 0x87, 0x32b, 0x312, 0x2e8, 0x27e, 0x26b, 0x11f, 0x161, 0x24b, 0x34f, 0x1a1, 0x3b0, 0x1cf, 0x1b2, 0xab, 0x1a5, 0x3fa, 0x1d7, 0xe, 0xfb, 0x24, 0x21a, 0xd8, 0x47, 0x2d0, 0x192, 0x2fb, 0x165, 0x201, 0x357, 0x1d, 0x3e0, 0x4e, 0x52, 0x1a4, 0x1ec, 0x1d1, 0x61, 0xef, 0x146, 0x262, 0x39d, 0x157, 0x15c, 0x3fb, 0x3c1, 0x8, 0x94, 0x30, 0x378, 0xa0, 0x302, 0x3c0, 0x21e, 0x92, 0x5f, 0x36c, 0x1c2, 0x37a, 0x85, 0x30e, 0x31e, 0x25, 0x18, 0x378, 0x140, 0x13, 0x23f, 0x1a8, 0x264, 0x3ed, 0x105, 0x1f0, 0x4e, 0xa4, 0x299, 0x37b, 0x12f, 0x3b, 0x3be, 0x268, 0x251, 0x1a5, 0x3fd, 0x355, 0x70, 0x3ab, 0x89, 0x3a9, 0xc3, 0x399, 0x23a, 0x119, 0x21c, 0x16e, 0x14c, 0x1af, 0x29f, 0x3a5, 0x17f, 0x339, 0x37, 0x202, 0x2c8, 0x5c, 0x2be, 0x329, 0x267, 0x382, 0x12d, 0x71, 0x38e, 0x91, 0xd1, 0x183, 0x38a, 0x5, 0xb1, 0x78, 0x283, 0x49, 0x5f, 0x2d1, 0x301, 0x3e6, 0x42, 0x118, 0x239, 0x176, 0x234, 0xef, 0x28c, 0x19a, 0xd7, 0x15d, 0x3da, 0x307, 0x338, 0x12, 0x21a, 0x1b0, 0x11c, 0x2ad, 0x116, 0x3cf, 0x1e6, 0x2c0, 0x174, 0x27e, 0xdf, 0x75, 0x31a, 0xf1, 0x12a, 0x8a, 0x3c6, 0xeb, 0x218, 0x1fa, 0x12c, 0x54, 0x396, 0x3e9, 0x191, 0x190, 0x1b5, 0x1ad, 0x2d5, 0x395, 0x386, 0x1b9, 0x11, 0x275, 0x198, 0x9d, 0x16d, 0x123, 0x187, 0x31e, 0x65, 0x14a, 0x171, 0x4a, 0x60, 0x3f6, 0x2d, 0x260, 0x2fb, 0x19d, 0x58, 0x5d, 0x13f, 0xdf, 0xea, 0x73, 0x381, 0x284, 0x164, 0x5c, 0x175, 0xbf, 0x31c, 0x5e, 0x1e1, 0x7f, 0xf9, 0x4, 0x128, 0x180, 0x3c3, 0xb4, 0x192, 0x3fe, 0x27d, 0x160, 0x174, 0xf5, 0x37c, 0x3a8, 0x1cc, 0x21f, 0x202, 0x199, 0x170, 0x1dd, 0x2fc, 0x6b, 0x178, 0x38d, 0x1fc, 0x3e4, 0x10, 0xa9, 0x209, 0x317, 0x2d0, 0x241, 0x3e3, 0x1e6, 0x189, 0x1d9, 0x3d4, 0x1eb, 0x2bb, 0x339, 0x6e, 0x1a, 0x26d, 0x1c9, 0x37d, 0x3e2, 0x1ac, 0x1e9, 0x22f, 0x3f9, 0x38b, 0x40, 0x2a4, 0x36, 0x47, 0x352, 0x116, 0x397, 0x391, 0x22d, 0x36d, 0x34b, 0x3a5, 0x2fe, 0xff, 0x1b8, 0x68, 0x1a6, 0x32d, 0x1ef, 0x393, 0x2b9, 0x3ad, 0xae, 0x3ff, 0x237, 0x100, 0x282, 0xd8, 0x11c, 0x153, 0x51, 0x247, 0x25f, 0xa6, 0x1af, 0x137, 0x28f, 0x3ea, 0x3fc, 0x2e9, 0x1a0, 0x291, 0xaf, 0x3b5, 0x257, 0x2f6, 0x94, 0x180, 0x38f, 0x2d0, 0x8b, 0x397, 0x32b, 0xa6, 0x35e, 0xd5, 0x55, 0x2d7, 0x367, 0x31e, 0x194, 0x8d, 0xef, 0x222, 0x196, 0x1a5, 0x3ef, 0x135, 0x3f, 0xb3, 0xc8, 0x36a, 0x173, 0x206, 0x162, 0x3c0, 0xd4, 0xc1, 0x357, 0xe8, 0x1ce, 0x11f, 0x31a, 0x3c4, 0x284, 0x2c8, 0x170, 0x3ba, 0x3e2, 0x358, 0x3ad, 0x15c, 0x3e7, 0x19c, 0x24, 0xf4, 0x265, 0x33b, 0x1f4, 0x368, 0x5b, 0x106, 0x275, 0x269, 0x1c2, 0x3e6, 0x108, 0x1a4, 0x37b, 0xb5, 0x3b0, 0x263, 0x43, 0xfd, 0x258, 0x2a0, 0x23c, 0x315, 0x81, 0x216, 0x30, 0x3f6, 0x5a, 0x192, 0x3f5, 0x1e6, 0x312, 0x36d, 0x29f, 0x28f, 0x3dd, 0x3eb, 0x365, 0x236, 0x294, 0x39a, 0x146, 0x334, 0x2b1, 0x3fa, 0x2a3, 0x380, 0x195, 0x19, 0x16f, 0x1ad, 0x346, 0x12e, 0x78, 0x21e, 0x99, 0x3ed, 0x1d, 0x33f, 0x3a4, 0x161, 0x27c, 0x254, 0x59, 0x2e, 0x175, 0x17e, 0x6b, 0x2f0, 0x22f, 0x3fb, 0x128, 0x209, 0x47, 0x153, 0x144, 0x31, 0x2cd, 0x361, 0xcc, 0x274, 0x1f3, 0x108, 0x348, 0x1f7, 0x1a1, 0x37e, 0xeb, 0xe4, 0x267, 0x2f, 0x3c2, 0x3f8, 0x31f, 0x200, 0x3d, 0x336, 0x33b, 0x3e8, 0x1bb, 0x2d8, 0x44, 0x22b, 0x356, 0xf8, 0x138, 0xad, 0x9f, 0x12a, 0x59, 0x5c, 0x1dd, 0x3e2, 0x2b9, 0x2af, 0x2f2, 0x207, 0x3ec, 0x112, 0x2ee, 0x158, 0x36e, 0x24f, 0x3c, 0x21e, 0x132, 0x3af, 0xe8, 0x39c, 0x75, 0xe6, 0x37, 0x34, 0x34c, 0x15e, 0x197, 0x262, 0x1ae, 0x1fd, 0x2a3, 0x309, 0x25d, 0xc8, 0x2dd, 0x1c5, 0x14, 0x20d, 0xee, 0x165, 0x58, 0x174, 0x3d4, 0x3a5, 0x3ea, 0x3eb, 0x2c3, 0xca, 0x8d, 0x1de, 0x9a, 0xab, 0x266, 0x107, 0x1cb, 0x3bf, 0x24c, 0x344, 0xc, 0x1fb, 0x5a, 0x324, 0x3cf, 0x32b, 0x14c, 0x163, 0x2a1, 0x159, 0x246, 0x46, 0x7b, 0x34d, 0x76, 0x39e, 0x225, 0xfd, 0xb9, 0x292, 0x1c4, 0x13c, 0x4, 0xa9, 0x250, 0x36, 0x238, 0x11d, 0xda, 0x5b, 0x11, 0x311, 0x356, 0x1f0, 0xe9, 0x161, 0x1e2, 0x101, 0x26d, 0x253, 0x2cf, 0x262, 0x35c, 0x3fd, 0x135, 0xfc, 0x322, 0x26c, 0x3, 0x2f9, 0x5a, 0x241, 0x327, 0x16e, 0xed, 0x33, 0x13a, 0x1f3, 0x210, 0x13b, 0x3a3, 0x226, 0x303, 0x2be, 0x2fc, 0x358, 0x2af, 0x1ed, 0xe, 0x35f, 0x104, 0x16f, 0x2bd, 0x5, 0x302, 0xee, 0x2ca, 0x160, 0x3b2, 0x137, 0x55, 0x34e, 0x215, 0x239, 0x34d, 0xec, 0x263, 0x10c, 0x3cb, 0x30d, 0x1e1, 0x3f8, 0x237, 0x12, 0x1e8, 0x30c, 0x3b1, 0x3ce, 0xf, 0x10f, 0x132, 0x357, 0x3a0, 0xdf, 0x359, 0xff, 0x1db, 0x236, 0x242, 0x1de, 0x134, 0x2ac, 0x314, 0x54, 0x11e, 0x223, 0x1, 0x250, 0x36, 0x238, 0x11d, 0xda, 0x5b, 0x11, 0x311, 0x356, 0x1f0, 0xe9, 0x161, 0x1e2, 0x101, 0x26d, 0x253, 0x2cf, 0x262, 0x35c, 0x3fd, 0x135, 0xfc, 0x322, 0x26c, 0x3, 0x2f9, 0x5a, 0xa9, 0xd8, 0x1e4, 0x1f4, 0x376, 0x2ed, 0x92, 0x3ed, 0xe8, 0x26b, 0x359, 0x1fe, 0x365, 0x194, 0x61, 0x3be, 0x18b, 0xfd, 0x2e4, 0x17a, 0x1fc, 0x237, 0x24, 0x3a9, 0x56, 0x36e, 0x12e, 0x3c0, 0x2a9, 0x2c, 0x2e8, 0x29f, 0x55, 0x295, 0x46, 0x1ec, 0xb5, 0x1bf, 0x1d6, 0x329, 0x6b, 0x3ad, 0x2f2, 0xe, 0x2b7, 0x19, 0x36a, 0x38a, 0xa0, 0x130, 0x3f5, 0x32b, 0x139, 0x21d, 0x13a, 0x3e6, 0x52, 0x1ca, 0x24e, 0x59, 0x170, 0x1ef, 0x14e, 0xd7, 0x3fa, 0x135, 0x1f8, 0x93, 0x344, 0x30, 0x38f, 0x2ad, 0x288, 0x188, 0x106, 0x38c, 0x356, 0x3e0, 0x3a4, 0x31a, 0x21f, 0x68, 0x256, 0x39a, 0x222, 0xab, 0x18a, 0x54, 0x23c, 0x9e, 0x8, 0x141, 0x2c9, 0x33b, 0x3bb, 0x386, 0x345, 0x99, 0x357, 0x349, 0x37c, 0x2fe, 0x3eb, 0x31e, 0xbb, 0x308, 0x1cf, 0x43, 0x3e1, 0x30d, 0x3c2, 0x3fb, 0x19c, 0x120, 0x177, 0x2b0, 0x346, 0x162, 0x23f, 0x165, 0x152, 0x360, 0x33b, 0x37f, 0x203, 0x21e, 0x182, 0x22a, 0x3d4, 0x117, 0x34e, 0x46, 0x3d8, 0x2d4, 0x1e3, 0x15f, 0x1f1, 0x2f6, 0x15d, 0x355, 0x3f, 0x322, 0x1a2, 0x30, 0x317, 0x2a6, 0x6d, 0xb6, 0x88, 0x2f8, 0x3a, 0x331, 0x359, 0x3fc, 0x18f, 0xbb, 0x219, 0x335, 0x218, 0x267, 0x178, 0x15c, 0x207, 0x35f, 0x19, 0x2dd, 0x233, 0x109, 0x324, 0x247, 0x362, 0x19f, 0x1b6, 0x7c, 0xe9, 0x18d, 0x21f, 0xd0, 0x14a, 0xef, 0x268, 0x14d, 0x258, 0x25a, 0xfe, 0x237, 0x48, 0x2bf, 0x2b0, 0x285, 0x181, 0x1dc, 0x27d, 0x53, 0x2c6, 0x24a, 0x1f3, 0x52, 0x394, 0x12a, 0x2c8, 0x32d, 0x197, 0x334, 0x34a, 0x107, 0x243, 0x223, 0x4, 0x141, 0x19b, 0xf7, 0x1e7, 0x1e, 0x6a, 0x201, 0xba, 0x34b, 0x55, 0x123, 0x118, 0x37b, 0x342, 0x385, 0x175, 0x3cd, 0x3ca, 0x17d, 0x14f, 0xfc, 0x93, 0x281, 0xc0, 0x47, 0x28a, 0x1b4, 0x2d8, 0x220, 0x3f2, 0xe8, 0x2a4, 0x19b, 0x1ee, 0x395, 0xf0, 0x2a9, 0xb0, 0x2d3, 0x2a1, 0x1bd, 0x210, 0x1ca, 0x12a, 0x199, 0xaf, 0xa3, 0x32c, 0x18a, 0x150, 0x388, 0x3c1, 0x12, 0x35b, 0x2b0, 0x103, 0x20d, 0x2fb, 0x391, 0x272, 0xcc, 0x301, 0x9c, 0x161, 0x30b, 0xd0, 0x294, 0x3bc, 0x364, 0xfd, 0x382, 0x38d, 0x3e7, 0x3ec, 0x104, 0x36a, 0x233, 0x212, 0x8b, 0x21c, 0x245, 0x38c, 0x143, 0x277, 0xea, 0xff, 0x2c3, 0xbb, 0x3b, 0xcf, 0xe4, 0x231, 0x353, 0x3bd, 0x1c0, 0x166, 0x26c, 0x18, 0x317, 0x145, 0x1b4, 0x1b9, 0x92, 0x3af, 0x29b, 0x3d6, 0x36f, 0x215, 0x1ec, 0x2d4, 0x3c6, 0x175, 0x393, 0x333, 0x3fa, 0xdd, 0x3bf, 0x81, 0x250, 0x1b0, 0x33b, 0x2f7, 0x1e, 0xd4, 0x16, 0x1d9, 0xd5, 0x2b2, 0x42, 0x13b, 0x127, 0xb2, 0x392, 0x197, 0x261, 0x133, 0x2a, 0x71, 0xf9, 0x100, 0x1e8, 0x56, 0x1a3, 0x2c4, 0x1dc, 0xf3, 0x14c, 0x21d, 0xe1, 0x217, 0xad, 0x141, 0x265, 0x36b, 0x12e, 0x23f, 0x33a, 0xa6, 0x21d, 0x1c2, 0x4e, 0x161, 0x21f, 0x340, 0x8d, 0x3be, 0x43, 0x337, 0x2f0, 0x2f2, 0x70, 0xb3, 0x26c, 0x30, 0x47, 0x23a, 0x376, 0x345, 0xc1, 0x5d, 0x29f, 0x2a8, 0x21, 0x13b, 0x24e, 0x2c8, 0xaf, 0x146, 0xab, 0x4b, 0x12d, 0x1fc, 0x19c, 0x112, 0x16f, 0x38a, 0x109, 0x8b, 0x31, 0x106, 0x5f, 0x1d, 0x26b, 0x2fe, 0x367, 0x239, 0xb5, 0x1e3, 0x175, 0x32f, 0xd7, 0x3ef, 0x1cb, 0x315, 0x8, 0x21a, 0x30c, 0x36e, 0x162, 0x1dc, 0x1e6, 0x139, 0xcc, 0x20b, 0x270, 0x31a, 0xdc, 0x236, 0x61, 0x1cf, 0x218, 0x18e, 0x3ad, 0x3bd, 0x380, 0x191, 0x344, 0x180, 0x238, 0x1f4, 0x386, 0x21e, 0x201, 0x2e8, 0xd5, 0x16d, 0x108, 0x1ca, 0x254, 0x26d, 0x171, 0x222, 0x151, 0x258, 0x17a, 0x3fb, 0xfb, 0x82, 0x36a, 0x6f, 0x5a, 0x51, 0x188, 0x22, 0x2f8, 0xe8, 0x37c, 0x3dd, 0x30e, 0x1ec, 0x1a1, 0x282, 0x186, 0x36e, 0x2c4, 0x379, 0x32b, 0x3b4, 0x1b6, 0x3e0, 0x23e, 0xff, 0x31e, 0x3a2, 0x2db, 0x2ab, 0x3cd, 0x26f, 0x3ef, 0x396, 0x4f, 0x40, 0x1e8, 0x158, 0x206, 0x4c, 0x3cf, 0x362, 0xe3, 0x143, 0x1ce, 0x2bb, 0x3b7, 0x239, 0x16a, 0x385, 0x3ba, 0x29c, 0x2d6, 0x20e, 0x71, 0x3e4, 0x24, 0x2ee, 0x2bd, 0xa0, 0x324, 0x21c, 0x106, 0xbe, 0x74, 0x37c, 0x3b3, 0x23, 0x37b, 0x226, 0xb8, 0x363, 0x261, 0xc5, 0x2a0, 0x7f, 0xce, 0x112, 0x2de, 0x233, 0x5a, 0xa2, 0x229, 0x110, 0x3d3, 0x13f, 0x28f, 0x123, 0xd2, 0x34f, 0xb2, 0x253, 0x146, 0x156, 0x12c, 0x17a, 0x3ff, 0x3ec, 0x19, 0x2c5, 0x1fb, 0x2ad, 0xda, 0x372, 0x99, 0x115, 0x34b, 0x2a8, 0x42, 0xe5, 0x254, 0xd3, 0x1cd, 0x134, 0x13d, 0x382, 0x22f, 0x207, 0x2ce, 0x249, 0xc, 0x227, 0x23a, 0x2e5, 0x10f, 0x201, 0x1d9, 0x354, 0x37a, 0xa4, 0x13e, 0xd, 0xa5, 0x3bc, 0x18b, 0x10d, 0x211, 0x346, 0x13, 0x3e3, 0x362, 0x1c6, 0x105, 0x26b, 0x3ea, 0x215, 0x37b, 0x45, 0x2e0, 0x32e, 0x251, 0x96, 0x17a, 0x3f7, 0x3ab, 0xc8, 0x3, 0x317, 0x23a, 0x1c3, 0x35, 0x2c, 0x1af, 0x24a, 0x30f, 0x2b4, 0x37, 0x236, 0x184, 0xcf, 0x329, 0x17b, 0x2fa, 0x1ba, 0x38e, 0x10, 0xf4, 0x158, 0x5, 0x130, 0x247, 0x245, 0x5f, 0x74, 0x2f1, 0x2d7, 0x118, 0x3d5, 0x59, 0x253, 0x28c, 0x151, 0x172, 0x38d, 0x307, 0x2ce, 0x9b, 0x30, 0x11c, 0x3e8, 0xf, 0x350, 0x2c0, 0x2c6, 0xe1, 0x9c, 0x31a, 0x370, 0x328, 0x76, 0xeb, 0x2fc, 0x39d, 0x3f3, 0x396, 0x9e, 0x100, 0x35b, 0x1ad, 0x50, 0x324, 0x31, 0x11, 0x1f9, 0x349, 0x343, 0x123, 0x1a4, 0x127, 0x199, 0x171, 0x9a, 0x13d, 0x30d, 0xae, 0x1c, 0xb3, 0x1a2, 0x300, 0x1e4, 0x2f7, 0xf0, 0x165, 0x53, 0x33, 0x20b, 0x1d2, 0x1cc, 0x365, 0x2ec, 0x369, 0x2ab, 0x393, 0x1ae, 0x347, 0x21a, 0x56, 0x206, 0x130, 0x87, 0x106, 0x2f8, 0x349, 0x28f, 0x85, 0x13b, 0x254, 0x34c, 0xef, 0x18b, 0x337, 0x3ad, 0x1d7, 0x1f8, 0x81, 0x141, 0x30c, 0x346, 0x26, 0x397, 0x326, 0x5f, 0xe8, 0x3d6, 0x295, 0x1a4, 0x24e, 0x26d, 0x39a, 0x1b2, 0x3e1, 0x2f0, 0x3bd, 0x3f, 0x91, 0xa9, 0x265, 0x36e, 0x302, 0x3f5, 0x362, 0x38c, 0x1d, 0x37c, 0x2d7, 0x230, 0x34f, 0x2c8, 0x171, 0x134, 0xfd, 0x5e, 0x2f2, 0x380, 0x93, 0x94, 0x2c9, 0x36b, 0x162, 0x2fb, 0x16e, 0x275, 0x286, 0x26b, 0x3dd, 0x46, 0x3ee, 0x59, 0xaf, 0x222, 0x29a, 0x30d, 0x15c, 0x70, 0x191, 0x216, 0xd8, 0x1ee, 0x12e, 0x1dc, 0x32b, 0x2cb, 0x356, 0x1ce, 0x2fe, 0x30e, 0x37b, 0x8a, 0x392, 0x146, 0x151, 0x2e4, 0x22f, 0xe, 0xb3, 0x344, 0x1b, 0x33b, 0x323, 0x23f, 0x1e6, 0x1da, 0x36c, 0x33f, 0x359, 0x367, 0x1ec, 0x113, 0x170, 0x32e, 0xab, 0x258, 0x3c2, 0x307, 0x195, 0x3d, 0x158, 0x14, 0x324, 0xc4, 0x110, 0x2a7, 0x34b, 0x16d, 0xa4, 0x1e2, 0x340, 0xc2, 0x19e, 0x17e, 0x333, 0x3a7, 0x23c, 0x38b, 0x89, 0x36a, 0x2f9, 0x2a6, 0x376, 0x35, 0xb0, 0x2c6, 0x384, 0x1d2, 0x339, 0x235, 0x25e, 0x303, 0x3de, 0xcb, 0x4b, 0x2f4, 0x387, 0x195, 0xd1, 0x209, 0x33b, 0x24f, 0xee, 0x32b, 0x19f, 0x143, 0x26b, 0x3b3, 0x118, 0x34f, 0x199, 0x1cd, 0x1b2, 0x3cb, 0x3d2, 0x1d7, 0x3f0, 0x204, 0x21a, 0xac, 0xa, 0x192, 0x62, 0x88, 0x357, 0x3a1, 0x2b2, 0x52, 0xf1, 0x1a0, 0x61, 0xcf, 0xbf, 0x39d, 0x3d7, 0x11e, 0x3c1, 0x240, 0x1b5, 0x378, 0x153, 0x1bb, 0x21e, 0x58, 0x163, 0x1c2, 0xe9, 0x398, 0x31e, 0x12f, 0x385, 0x1ef, 0x261, 0x221, 0x17a, 0x3c7, 0x2ce, 0x26c, 0x300, 0x399, 0x323, 0x77, 0x391, 0x2cb, 0x2a5, 0x331, 0x3dd, 0x8c, 0x3a3, 0x2c8, 0x2e2, 0xd9, 0x3e1, 0x1e9, 0x2ef, 0x1f8, 0x102, 0x10d, 0x56, 0x7a, 0x169, 0xa0, 0x22c, 0xb6, 0x99, 0x174, 0x14b, 0x30f, 0x18d, 0x1db, 0x1d1, 0x2f5, 0x37d, 0x334, 0x221, 0x2f4, 0x307, 0x25d, 0x281, 0xd8, 0x3b1, 0x2c4, 0x3f5, 0x193, 0xbe, 0x349, 0x22e, 0x42, 0x24b, 0x34, 0x11a, 0x263, 0xbf, 0x333, 0x347, 0xe2, 0x67, 0x82, 0x183, 0x317, 0x1f4, 0x3c, 0x2ca, 0x139, 0x1b6, 0x277, 0x2fe, 0x23, 0x3d5, 0x2c8, 0x1cd, 0x364, 0x337, 0x2af, 0x14f, 0x2e7, 0x20, 0x35b, 0x173, 0x2d, 0x119, 0x2ed, 0x304, 0x2d3, 0x13a, 0x138, 0x1cc, 0x31e, 0x25e, 0x20f, 0x363, 0x251, 0xb9, 0x22f, 0x38, 0x322, 0x94, 0x336, 0x2d5, 0x26, 0x247, 0x20c, 0x3ed, 0x1ea, 0x159, 0x52, 0x1e2, 0x289, 0x308, 0xeb, 0x3cd, 0x2b1, 0x2a, 0x7f, 0xfb, 0x64, 0xc, 0x238, 0x2f7, 0x389, 0x1e6, 0x361, 0x2a5, 0x26b, 0x36f, 0x69, 0x24e, 0x1a6, 0x1de, 0x43, 0x231, 0x15d, 0x1ba, 0x4f, 0x9, 0x3aa, 0x233, 0x1a9, 0x368, 0xf4, 0x1ad, 0x109, 0x288, 0x2ed, 0x201, 0x35e, 0x1c2, 0x3a4, 0x1fe, 0x239, 0x113, 0x392, 0x222, 0xfd, 0x2f0, 0x1d7, 0x3db, 0x8, 0x3a9, 0x173, 0x5a, 0x6d, 0x345, 0x2c, 0x2c6, 0x20b, 0x11f, 0x3eb, 0x1ec, 0x8a, 0xaf, 0x134, 0x3e1, 0x3ad, 0x2a3, 0x2e7, 0x40, 0x177, 0x38a, 0x2d0, 0x368, 0x21e, 0x160, 0x21d, 0x7c, 0xea, 0x367, 0x37b, 0x59, 0x171, 0x1b2, 0x337, 0x157, 0x135, 0x315, 0x200, 0x3aa, 0x6f, 0x2ad, 0x376, 0xd4, 0x312, 0xcc, 0x3e0, 0x359, 0x30e, 0x3ee, 0x2c8, 0x39a, 0x18b, 0x18e, 0x2aa, 0x1ba, 0x9e, 0x24, 0x16f, 0x378, 0x145, 0x386, 0x2a9, 0xa6, 0x269, 0x33f, 0x2fe, 0x46, 0x34f, 0x26d, 0xef, 0x43, 0x6b, 0x17d, 0x1cb, 0xf9, 0x120, 0x36a, 0x3f6, 0x23a, 0xf, 0x165, 0x139, 0x36c, 0x1ce, 0x3dd, 0x230, 0x24e, 0x34c, 0x371, 0x218, 0x358, 0x3fa, 0x243, 0x3c1, 0x112, 0x366, 0x38f, 0x1f4, 0x78, 0x33a, 0x1da, 0x1e8, 0x2bd, 0x5a, 0xda, 0x10f, 0x160, 0x33, 0x1f0, 0x359, 0x215, 0x3a3, 0x26d, 0x1de, 0x10c, 0x358, 0x3fd, 0x11e, 0x237, 0x104, 0x3, 0x238, 0x3ce, 0xee, 0x16e, 0x311, 0x3a0, 0x55, 0x210, 0x1e2, 0x236, 0xec, 0x2be, 0x262, 0x314, 0x1e1, 0xe, 0x322, 0x250, 0x30c, 0x5, 0x241, 0x5b, 0x132, 0x3b2, 0x13a, 0xe9, 0xff, 0x239, 0x226, 0x253, 0x134, 0x3cb, 0x2af, 0x135, 0x223, 0x12, 0x16f, 0x2f9, 0x11d, 0xf, 0x2ca, 0xed, 0x356, 0xdf, 0x34e, 0x13b, 0x101, 0x242, 0x263, 0x2fc, 0x35c, 0x54, 0x3f8, 0x35f, 0x26c, 0x36, 0x3b1, 0x302, 0x327, 0x11, 0x357, 0x137, 0x1f3, 0x161, 0x1db, 0x34d, 0x303, 0x2cf, 0x2ac, 0x30d, 0x1ed, 0xfc, 0x1, 0x1e8, 0x2bd, 0x5a, 0xda, 0x10f, 0x160, 0x33, 0x1f0, 0x359, 0x215, 0x3a3, 0x26d, 0x1de, 0x10c, 0x358, 0x3fd, 0x11e, 0x237, 0x104, 0x3, 0x238, 0x3ce, 0xee, 0x16e, 0x311, 0x3a0, 0x55, 0x3d0, 0x2e6, 0x2d0, 0x1bb, 0x1a8, 0xa6, 0x1b6, 0x39c, 0x2d7, 0x299, 0x101, 0x8d, 0x19e, 0x3cd, 0x1a5, 0x292, 0x3c7, 0xb3, 0x4a, 0xc3, 0x206, 0x241, 0xb6, 0xc1, 0x1af, 0x384, 0x11f, 0x3b7, 0x2ff, 0x2c8, 0x273, 0x86, 0x358, 0x3f3, 0x71, 0x19c, 0x64, 0x60, 0x33b, 0xb1, 0x3e3, 0x106, 0x3af, 0x137, 0x3e6, 0x18d, 0x2c3, 0xb5, 0xb8, 0x28c, 0xfd, 0x3d2, 0x14f, 0x315, 0x12, 0x2de, 0x3f6, 0xfa, 0xf0, 0x1e6, 0x33e, 0x3a, 0x28f, 0x84, 0xf1, 0x236, 0x1d8, 0x2ea, 0x334, 0x12c, 0x57, 0x380, 0x244, 0x3d, 0x1ad, 0x2d, 0xda, 0x21e, 0x189, 0x198, 0x33f, 0x3ea, 0x69, 0x254, 0x14a, 0x39e, 0x17e, 0x35c, 0xa8, 0x3fb, 0x2ce, 0x281, 0x2c9, 0x1a3, 0x260, 0x188, 0x248, 0x1d9, 0x13a, 0x1d2, 0x3fc, 0x1ec, 0x228, 0x2e2, 0x18b, 0x231, 0x2fa, 0x243, 0x31f, 0x104, 0x6, 0xf2, 0x24f, 0x2fb, 0x193, 0x1f9, 0x3d4, 0x1bd, 0x15a, 0x2e9, 0x3a9, 0x38a, 0x2ad, 0x386, 0x165, 0x1da, 0x286, 0x3d6, 0x21, 0x27c, 0x236, 0x3b0, 0x3ba, 0x196, 0x2e4, 0x2f2, 0x1f8, 0x8, 0x177, 0x6f, 0x145, 0xf, 0x33a, 0x2cb, 0x1d, 0x28f, 0x108, 0x3c4, 0x194, 0x1bf, 0x1ef, 0xab, 0x30d, 0x3bd, 0x3db, 0x40, 0x3aa, 0x378, 0x23a, 0x78, 0x1e6, 0x275, 0xe8, 0x55, 0x52, 0x21f, 0xbb, 0x1e3, 0x363, 0x151, 0x5e, 0x1d7, 0x2e7, 0x200, 0x16f, 0x3f6, 0x1f4, 0x3c0, 0x32b, 0x38c, 0x349, 0x2a8, 0x290, 0xdc, 0x1d1, 0x303, 0x32e, 0x29a, 0x2f0, 0x2a3, 0x315, 0x24, 0x36a, 0x38f, 0x3bb, 0x23f, 0x16e, 0x5f, 0x27e, 0x16d, 0xad, 0x2e9, 0x293, 0x2e, 0x146, 0xfd, 0x3ad, 0x135, 0x9e, 0x120, 0x366, 0x47, 0x1e7, 0x1dc, 0x362, 0x2f8, 0x3d4, 0x37a, 0x161, 0x365, 0xb5, 0x170, 0x222, 0x3e1, 0x157, 0x1ba, 0xf9, 0x112, 0x306, 0x238, 0x323, 0x2fb, 0x326, 0x3ed, 0x29f, 0x3e6, 0x31a, 0x31e, 0x1a1, 0x392, 0x35b, 0x233, 0x145, 0x1e, 0xf3, 0x275, 0x1d0, 0x154, 0x290, 0x1b8, 0x34d, 0x2e, 0x28c, 0x3f4, 0x157, 0x374, 0x3e4, 0x82, 0xc, 0x399, 0x162, 0x327, 0x88, 0x5d, 0x24a, 0x1d2, 0x3eb, 0x2ff, 0x332, 0x371, 0x1c8, 0x26f, 0x54, 0x3ff, 0x25d, 0x94, 0x211, 0x50, 0x288, 0x283, 0x189, 0x269, 0x39c, 0x34e, 0x1ca, 0xd0, 0x3b, 0x175, 0x261, 0x172, 0x2f2, 0x3f0, 0x20, 0x3aa, 0x2f9, 0xfa, 0x3c0, 0x25f, 0x22b, 0x27e, 0x2da, 0x2b4, 0x365, 0x16a, 0x1c9, 0x134, 0x267, 0x2ba, 0x243, 0x67, 0x64, 0x180, 0x3dc, 0x13, 0x31, 0x124, 0x3b2, 0x1c2, 0x23e, 0x187, 0x34f, 0x291, 0x2e3, 0x17e, 0x16b, 0x292, 0x307, 0x322, 0x2a4, 0x2b0, 0x212, 0x1b4, 0xd4, 0x14c, 0x1ab, 0x37c, 0x10a, 0x13e, 0x236, 0x369, 0x2f3, 0xab, 0x213, 0x2ef, 0x2e7, 0x9, 0x1b5, 0x38f, 0x37f, 0xee, 0x362, 0x1f9, 0x34b, 0x3e6, 0x23d, 0x63, 0x113, 0x15e, 0x2c1, 0x6b, 0x2bf, 0xde, 0x23a, 0x1e0, 0x25f, 0x5f, 0x1ea, 0x2fd, 0x31a, 0x63, 0x226, 0x171, 0x225, 0x2b9, 0x347, 0xfe, 0x167, 0x216, 0x186, 0x28, 0x288, 0x10f, 0x22d, 0x36c, 0x1be, 0x10a, 0x27c, 0xca, 0x37e, 0x363, 0x14d, 0x1e9, 0x135, 0x278, 0x224, 0x6, 0x399, 0x2c4, 0x87, 0x49, 0x1d9, 0x1c2, 0x75, 0x215, 0x24e, 0x14a, 0xcf, 0x32f, 0xc5, 0x38d, 0x380, 0x204, 0x35b, 0x6f, 0x11d, 0xf0, 0x32b, 0x22b, 0xf5, 0x37a, 0x18d, 0x235, 0x113, 0x2bc, 0x316, 0x358, 0x3a7, 0x7f, 0x2b7, 0x10b, 0xc3, 0x14, 0x144, 0x283, 0x312, 0x1b6, 0xdf, 0x85, 0x13e, 0x65, 0x1bf, 0x3b5, 0x2a2, 0x2f0, 0x29e, 0x13c, 0x112, 0x3, 0x3c8, 0x162, 0x247, 0x220, 0x2e8, 0xe1, 0x23e, 0x30e, 0x127, 0xa5, 0x263, 0x393, 0x266, 0x3c2, 0x1c0, 0x102, 0x3a9, 0x233, 0x28a, 0x78, 0x391, 0x311, 0x27e, 0x1bd, 0x2c2, 0x31e, 0x28d, 0x15e, 0x18b, 0x1ac, 0x3d7, 0x23b, 0x177, 0x378, 0x1f4, 0x23f, 0x362, 0x3ed, 0xd5, 0x4e, 0x1fe, 0x37b, 0x26d, 0x3be, 0x17e, 0x1a5, 0x17a, 0x70, 0x81, 0x3a9, 0x6f, 0x23a, 0x3c0, 0x16e, 0x2f8, 0x29f, 0x30f, 0x339, 0x1ec, 0x2c8, 0x371, 0x329, 0x2b1, 0x12d, 0xe, 0x91, 0xf4, 0x38a, 0x145, 0x78, 0x32b, 0x5f, 0x3d4, 0x3e6, 0xe6, 0x239, 0x59, 0xef, 0xe4, 0xd7, 0x2a0, 0x307, 0x93, 0x21a, 0x173, 0x2ad, 0xf, 0x1e6, 0x38c, 0x27e, 0x37a, 0x31a, 0xc6, 0x8a, 0x39a, 0x218, 0x39d, 0x54, 0x3e7, 0x191, 0x141, 0x1ad, 0x2d0, 0x386, 0x33a, 0x275, 0x349, 0x16d, 0x161, 0x31e, 0x113, 0x171, 0x43, 0x2f6, 0x20e, 0x3fb, 0xb3, 0xa9, 0x2b0, 0x5a, 0x376, 0x165, 0x2cb, 0xe8, 0x2a8, 0xad, 0x365, 0x1a1, 0xaf, 0x18b, 0x358, 0x347, 0x1fc, 0x195, 0x94, 0x56, 0x109, 0x368, 0x2a9, 0x1da, 0x1d, 0x55, 0x290, 0x2e9, 0xb5, 0x392, 0x1b2, 0x6b, 0x3ef, 0x23b, 0x2b7, 0x216, 0x2ee, 0x1fb, 0x3bb, 0x3b8, 0x83, 0x28e, 0x24a, 0x28b, 0x30e, 0x95, 0x242, 0x1d6, 0xcd, 0x172, 0x3bd, 0x1c7, 0x90, 0x306, 0x3c8, 0x181, 0x31, 0x132, 0x163, 0x3e0, 0x3b3, 0xe5, 0x340, 0x369, 0x3b5, 0x29a, 0x353, 0x2e1, 0x237, 0x190, 0x6c, 0x346, 0x116, 0x3a6, 0x312, 0x2d1, 0x1eb, 0x108, 0x37, 0x34d, 0x170, 0x268, 0x231, 0x3ef, 0x7f, 0x2ce, 0x94, 0xac, 0x2d, 0x376, 0x2ca, 0x33e, 0x349, 0x2da, 0x18d, 0xc6, 0x114, 0x273, 0xe4, 0x1ae, 0x292, 0xe, 0x122, 0x3d0, 0x6f, 0x7d, 0x31b, 0x362, 0x3d3, 0x354, 0x270, 0x3df, 0x3a3, 0x256, 0xcf, 0xa7, 0x4b, 0x2b8, 0x3e9, 0x200, 0x2dd, 0x11c, 0x12e, 0x327, 0x49, 0x36d, 0x1f, 0x17f, 0x1a4, 0x1a, 0x3b, 0x3ba, 0x156, 0x178, 0x135, 0x1f2, 0x208, 0x180, 0x2df, 0xc9, 0x2d8, 0x58, 0x330, 0x26b, 0x10a, 0x1e2, 0xbb, 0x20f, 0x111, 0x337, 0x2fa, 0xe2, 0x3d1, 0x281, 0x186, 0xa0, 0x1d5, 0x3e5, 0x1e7, 0x3fe, 0x44, 0x2e8, 0x301, 0x2bb, 0x1a4, 0x34, 0xec, 0x1ef, 0x14d, 0x353, 0x1cb, 0xce, 0x9b, 0x2c9, 0xa, 0x119, 0xd4, 0xed, 0x3a, 0x2a8, 0x2b4, 0x235, 0x8a, 0x273, 0x1c8, 0x2b1, 0xbd, 0xe0, 0x1, 0x1d5, 0x3e5, 0x1e7, 0x3fe, 0x44, 0x2e8, 0x301, 0x2bb, 0x1a4, 0x34, 0xec, 0x1ef, 0x14d, 0x353, 0x1cb, 0xce, 0x9b, 0x2c9, 0xa, 0x119, 0xd4, 0xed, 0x3a, 0x2a8, 0x2b4, 0x235, 0x8a, 0x273, 0x1c8, 0x2b1, 0xbd, 0xe0, 0x1, 0x1d5, 0x3e5, 0x1e7, 0x3fe, 0x44, 0x2e8, 0x301, 0x2bb, 0x1a4, 0x34, 0xec, 0x1ef, 0x14d, 0x353, 0x1cb, 0xce, 0x9b, 0x2c9, 0xa, 0x119, 0xd4, 0xed, 0x3a, 0x2a8, 0x2b4, 0x235, 0x8a, 0x273, 0x1c8, 0x2b1, 0xbd, 0xe0, 0x1, 0x1d5, 0x3e5, 0x1e7, 0x3fe, 0x44, 0x2e8, 0x301, 0x2bb, 0x1a4, 0x34, 0xec, 0x1ef, 0x14d, 0x353, 0x1cb, 0xce, 0x9b, 0x2c9, 0xa, 0x119, 0xd4, 0x3aa, 0x38f, 0x323, 0x397, 0x92, 0x35e, 0x3e0, 0x2d7, 0x24b, 0x194, 0x303, 0x222, 0x18e, 0x3ef, 0x1fc, 0xb3, 0x141, 0x173, 0x145, 0x3c0, 0x362, 0x357, 0x125, 0x11f, 0x46, 0x284, 0x308, 0x3ba, 0x151, 0x3ad, 0x1cb, 0x19c, 0x26c, 0x265, 0xa0, 0x368, 0x165, 0x275, 0x27e, 0x3e6, 0x339, 0x37b, 0x34c, 0x263, 0x14e, 0x258, 0x3bd, 0x315, 0x112, 0x30, 0x36b, 0x192, 0x2ed, 0x312, 0x356, 0x28f, 0x290, 0x365, 0x113, 0x39a, 0xe4, 0x2b1, 0x17a, 0x380, 0x8, 0x16f, 0x47, 0x12e, 0x87, 0x99, 0x2c6, 0x33f, 0x295, 0x27c, 0xbb, 0x2e, 0x134, 0x6b, 0x347, 0x3fb, 0x191, 0x21a, 0x38a, 0x23a, 0x23f, 0x326, 0x28e, 0x13a, 0xea, 0x230, 0xd, 0x76, 0x1ef, 0x29a, 0x157, 0x243, 0xfb, 0x344, 0x30c, 0x109, 0x376, 0x33a, 0x38c, 0x3d4, 0x30f, 0x1fe, 0x3ee, 0x256, 0x33c, 0x262, 0x2e4, 0x1d7, 0x9e, 0x82, 0x180, 0x36e, 0x8b, 0x345, 0xa6, 0x286, 0x35d, 0x227, 0x12e, 0x10e, 0x264, 0x21d, 0x39c, 0x214, 0x21f, 0x12f, 0x253, 0x43, 0x333, 0x292, 0x70, 0x2, 0x2b3, 0x47, 0x25c, 0x21c, 0xc1, 0x33, 0x331, 0x21, 0x37, 0x25e, 0xaf, 0x86, 0x26f, 0x12d, 0xe0, 0x4, 0x16f, 0x8e, 0xb1, 0x31, 0x182, 0x66, 0x26b, 0x42, 0x6e, 0xb5, 0x15e, 0x10c, 0xd7, 0x25a, 0x1c0, 0x8, 0x2de, 0x11c, 0x162, 0x62, 0x304, 0xcc, 0xdf, 0x84, 0xdc, 0x16a, 0x2bc, 0x218, 0x1ae, 0xbd, 0x380, 0x10, 0x1b5, 0x238, 0x2c4, 0xc4, 0x201, 0x198, 0x1be, 0x108, 0x1b8, 0x2d4, 0x171, 0x39, 0x35c, 0x17a, 0x309, 0x20, 0x36a, 0x79, 0x181, 0x188, 0xb, 0x330, 0x37c, 0x210, 0x370, 0x1a1, 0x2e2, 0x72, 0x2b1, 0x2f4, 0x21b, 0x40, 0x2dd, 0xf2, 0x302, 0x310, 0x16, 0x269, 0x2f1, 0x29, 0x2e9, 0x342, 0x1cd, 0xe4, 0x16b, 0x1e1, 0x3f, 0x80, 0x1b3, 0x1e4, 0x20d, 0x229, 0x2c, 0xdb, 0x1eb, 0x52, 0x2b3, 0x8e, 0x162, 0xc4, 0xb, 0x269, 0x1eb, 0xa4, 0x365, 0x45, 0x1de, 0x17e, 0xc5, 0x2b8, 0x2e7, 0x89, 0x60, 0x36e, 0x22c, 0x35, 0x1da, 0x3a0, 0x2fd, 0x339, 0x1f7, 0xa5, 0x1d6, 0xcb, 0xbc, 0x1ba, 0xce, 0xd1, 0x30c, 0x2d, 0x305, 0x32b, 0x3f2, 0x14b, 0x11f, 0x118, 0x1a, 0x3b0, 0x197, 0x3cb, 0x3fa, 0xfe, 0x166, 0x21a, 0x233, 0x3e8, 0x2fb, 0x88, 0x2d3, 0x3e0, 0x34e, 0xf1, 0x1d1, 0x1c9, 0x316, 0x39d, 0x292, 0xe0, 0x8, 0x1b5, 0x79, 0x302, 0x229, 0x58, 0x36c, 0x343, 0x129, 0x31e, 0x228, 0x2eb, 0x3e2, 0x221, 0x1ed, 0x315, 0x41, 0x300, 0x346, 0x144, 0x1a8, 0x2cb, 0x13f, 0x3c5, 0x1fe, 0x3a3, 0x121, 0x2ab, 0x251, 0x1e9, 0x1cb, 0x279, 0x281, 0x56, 0x168, 0x1e, 0x16e, 0x3af, 0x24a, 0xea, 0xd2, 0xd0, 0x1bf, 0xa3, 0x267, 0x3ef, 0x3f9, 0x322, 0xf4, 0x1bc, 0x37f, 0x3f5, 0x49, 0x2b5, 0x33f, 0x246, 0x381, 0x293, 0x16f, 0x238, 0x302, 0x5b, 0x160, 0x356, 0x55, 0x161, 0x239, 0x26d, 0x263, 0x262, 0x30d, 0x135, 0x237, 0x26c, 0x30c, 0x5a, 0xf, 0x16e, 0x357, 0x13a, 0x359, 0x13b, 0x236, 0x303, 0x134, 0x358, 0x54, 0xe, 0x1, 0x16f, 0x238, 0x302, 0x5b, 0x160, 0x356, 0x55, 0x161, 0x239, 0x26d, 0x263, 0x262, 0x30d, 0x135, 0x237, 0x26c, 0x30c, 0x5a, 0xf, 0x16e, 0x357, 0x13a, 0x359, 0x13b, 0x236, 0x303, 0x134, 0x358, 0x54, 0xe, 0x1, 0x16f, 0x238, 0x302, 0x5b, 0x160, 0x356, 0x55, 0x161, 0x239, 0x26d, 0x263, 0x262, 0x30d, 0x135, 0x237, 0x26c, 0x30c, 0x5a, 0xf, 0x16e, 0x357, 0x13a, 0x359, 0x13b, 0x236, 0x303, 0x134, 0x358, 0x54, 0xe, 0x1, 0x16f, 0x238, 0x302, 0x5b, 0x160, 0x356, 0x55, 0x161, 0x239, 0x26d, 0x263, 0x262, 0x30d, 0x135, 0x237, 0x26c, 0x30c, 0x5a, 0xf, 0x16e, 0x357, 0x13a, 0x359, 0x13b, 0x236, 0x303, 0x134, 0x2de, 0xf2, 0x26, 0x1b9, 0x53, 0x1d, 0x2da, 0x398, 0x3ee, 0x121, 0x2be, 0x151, 0x2ae, 0xe2, 0x195, 0x282, 0x233, 0x3bb, 0x3e3, 0x248, 0x21d, 0xdf, 0x29, 0x365, 0x114, 0x1df, 0x32f, 0xb9, 0x355, 0x3c1, 0x9b, 0x186, 0x5a, 0x1e, 0x1b1, 0x28e, 0x384, 0x3ea, 0x24b, 0x176, 0x1c9, 0x43, 0x1ae, 0x1e1, 0x1f8, 0x48, 0x18, 0x36e, 0xa2, 0x350, 0x275, 0x3a1, 0x138, 0x30e, 0x101, 0x1d8, 0x32e, 0x267, 0x3a7, 0x3e7, 0x122, 0x1d5, 0x47, 0x2c4, 0x229, 0x160, 0x2a5, 0x154, 0x31a, 0x3d8, 0x12b, 0x1d6, 0x32c, 0x3d2, 0x243, 0x3ab, 0x250, 0x173, 0x7d, 0x379, 0x110, 0x2b5, 0xe7, 0x21, 0x1b8, 0x28d, 0xef, 0x2fc, 0x221, 0x3bd, 0x13c, 0x64, 0x2c9, 0x140, 0x1c3, 0x32b, 0x3d3, 0x9d, 0x359, 0x276, 0xca, 0x2e, 0x364, 0x3ca, 0x12d, 0x309, 0x100, 0x306, 0x3dc, 0x241, 0x21e, 0x3b4, 0x13f, 0x30f, 0x3df, 0x12a, 0x308, 0x3de, 0x3f4, 0x3fa, 0x1b5, 0x3c8, 0x130, 0x3a6, 0x272, 0x349, 0x383, 0x3df, 0x254, 0x3b, 0x2cf, 0x337, 0x3a7, 0x3c7, 0x81, 0x2b3, 0x79, 0x26, 0x372, 0x14c, 0xe8, 0x1f3, 0x3fc, 0x24e, 0x184, 0x3de, 0x3e1, 0x3f3, 0x3ff, 0x91, 0x1d5, 0x8e, 0x302, 0x16c, 0x22d, 0x1d, 0x1bd, 0x27b, 0x34f, 0x234, 0x37d, 0xfd, 0x1fd, 0x3f8, 0x93, 0x2bf, 0x317, 0x162, 0x229, 0x2c0, 0x286, 0x2b2, 0x1cc, 0x3ee, 0x242, 0x2ea, 0x29a, 0x2ba, 0x7f, 0x191, 0x3d0, 0x3e5, 0x12e, 0xc4, 0x58, 0x356, 0x154, 0x23d, 0x37b, 0x14a, 0x15f, 0x151, 0x155, 0x388, 0xb3, 0x7a, 0x2f9, 0x323, 0x21c, 0xb, 0x36c, 0x22e, 0x2c2, 0x1ec, 0x12b, 0x3ac, 0xab, 0x2af, 0x71, 0x195, 0x10d, 0xde, 0x1e7, 0x247, 0x182, 0x269, 0x343, 0x15a, 0x239, 0x1a6, 0x271, 0x196, 0x3d2, 0x8f, 0x2b7, 0x2a4, 0x31d, 0x3bb, 0x3cf, 0x132, 0xcc, 0x1eb, 0x129, 0xc6, 0x332, 0xcf, 0x334, 0x178, 0x396, 0x3d1, 0x36a, 0x33b, 0x192, 0x21e, 0x2cb, 0x3d4, 0x270, 0x46, 0x68, 0x1e3, 0x134, 0x2f6, 0x12d, 0x3f, 0x24, 0x30, 0x346, 0x6d, 0x33a, 0x2f8, 0x125, 0x359, 0x1ca, 0xbb, 0x392, 0x218, 0x1a5, 0x15c, 0x315, 0x19, 0x2c9, 0x109, 0xf, 0x362, 0x5d, 0x7c, 0x295, 0x21f, 0x1a1, 0xef, 0x3e2, 0x258, 0x2a3, 0x237, 0x344, 0x2b0, 0x145, 0x1dc, 0x110, 0x2c6, 0x26b, 0x52, 0x31e, 0x2c8, 0x263, 0x334, 0x2f0, 0x243, 0x2b7, 0x141, 0x6f, 0x1e7, 0x87, 0x201, 0x36c, 0x55, 0x31a, 0x37b, 0x294, 0x175, 0x29a, 0x17d, 0x1fc, 0x93, 0x177, 0x47, 0x302, 0x2d8, 0xa6, 0xe8, 0x3e6, 0x3eb, 0x254, 0x76, 0x32e, 0x18e, 0x20e, 0xe, 0x8, 0x366, 0x1ee, 0x8b, 0xd4, 0x275, 0x29f, 0x3a4, 0x230, 0x340, 0x303, 0x1b2, 0x39d, 0x17a, 0x1f8, 0x120, 0x180, 0x206, 0x368, 0x1e6, 0x3ed, 0x13a, 0x2fe, 0x24b, 0x1d1, 0xaf, 0xe4, 0x133, 0x2f2, 0x9e, 0xc8, 0x265, 0x2dd, 0xf7, 0x8b, 0x1a8, 0x1c6, 0xd5, 0x23e, 0x299, 0x194, 0x2e0, 0x10c, 0x1a5, 0x2b8, 0x4f, 0xc8, 0xc3, 0x168, 0x3c0, 0x20c, 0x1af, 0x1ce, 0x210, 0x18f, 0x2c8, 0xcf, 0xcb, 0x3ad, 0x71, 0x25d, 0xf4, 0x3e5, 0xb1, 0x5b, 0x22d, 0x74, 0x3e6, 0x3df, 0x142, 0x3b0, 0x28c, 0x1ac, 0x2a0, 0x309, 0x12, 0x30, 0x285, 0x1b4, 0x1e6, 0x3d3, 0xe1, 0x3dd, 0xf1, 0x25e, 0x39a, 0x2fc, 0x12c, 0x2a3, 0x67, 0x10b, 0x1ad, 0x7d, 0x3fe, 0x99, 0x198, 0x343, 0x161, 0x3d8, 0x14a, 0x175, 0x13d, 0x1fd, 0x3fb, 0x122, 0x2b3, 0x1e4, 0x260, 0x10f, 0x2cb, 0x3a1, 0x1d2, 0x230, 0x289, 0x17, 0x18b, 0x1ae, 0x313, 0x2e7, 0x104, 0x360, 0x109, 0x1e, 0x193, 0x2e8, 0x3c9, 0x214, 0x2e9, 0x114, 0x2e3, 0x262, 0xbc, 0x325, 0x2b7, 0x282, 0x1bc, 0x323, 0x62, 0xb0, 0x286, 0x2da, 0xff, 0x24e, 0x219, 0x197, 0x18e, 0x15, 0x38, 0x40, 0x205, 0x1b7, 0x288, 0x1b3, 0x3dc, 0x51, 0x2b6, 0xbe, 0x125, 0x17f, 0x9f, 0x293, 0x1cd, 0x2fc, 0x258, 0x29e, 0x338, 0x94, 0x1c5, 0x37f, 0x87, 0x16, 0x2a5, 0x16d, 0xff, 0x95, 0x76, 0xa3, 0xd6, 0x2a0, 0x21b, 0x48, 0x180, 0xa, 0x2e5, 0x16e, 0x22a, 0xf8, 0x85, 0x370, 0x114, 0x1cf, 0x19a, 0x1e9, 0x23c, 0x25d, 0x1e8, 0x38f, 0x181, 0x1b9, 0x139, 0x13f, 0x9c, 0x46, 0x1a0, 0x20f, 0x18b, 0x35c, 0x57, 0x315, 0x64, 0xc3, 0x2d0, 0x31b, 0x44, 0x2c6, 0x1be, 0x129, 0x239, 0x12b, 0x15f, 0x29a, 0x1fd, 0x3ff, 0x81, 0x1b5, 0x27f, 0x8b, 0x350, 0x311, 0x2a1, 0x3a8, 0x394, 0x1d1, 0x2bc, 0x25b, 0x4b, 0x355, 0x67, 0x216, 0x2bd, 0x3e8, 0x397, 0x304, 0x2d1, 0x2a8, 0x398, 0x297, 0x308, 0x197, 0x31c, 0x54, 0x1c0, 0x9, 0x30, 0x103, 0x2d9, 0x32b, 0x147, 0x1f, 0x295, 0x6e, 0x226, 0x3be, 0x131, 0xbc, 0x243, 0x2ce, 0x3d, 0x3f6, 0xb1, 0xb6, 0xa6, 0x366, 0x36b, 0x288, 0x33a, 0x3ed, 0x1c2, 0x2d7, 0x21f, 0x113, 0x3be, 0x262, 0x2f0, 0x23c, 0xb3, 0x3a9, 0x47, 0x26, 0x345, 0x2cb, 0x29f, 0x11f, 0x13b, 0xbb, 0xaf, 0x329, 0x4b, 0x2a3, 0x19c, 0x94, 0x38a, 0x1e7, 0x31, 0x160, 0x1d, 0x3e6, 0x367, 0xd, 0x1e3, 0x1b2, 0xd7, 0x22f, 0x315, 0xc8, 0x30c, 0x2ad, 0x1dc, 0x92, 0xcc, 0x28f, 0x31a, 0x3ee, 0x61, 0x363, 0x18e, 0x54, 0x380, 0x24, 0x180, 0x14, 0x386, 0x362, 0x2e8, 0x33f, 0x108, 0x31e, 0x26d, 0x1d6, 0x151, 0x17d, 0x3fb, 0x81, 0x36a, 0x1ee, 0x51, 0x165, 0x2f8, 0x13a, 0x3dd, 0x3c4, 0x1a1, 0x371, 0x14e, 0x5e, 0x243, 0x195, 0xf4, 0x38f, 0x302, 0x2ed, 0x1da, 0x3d4, 0x3a4, 0x1a4, 0x194, 0x392, 0xe4, 0x18a, 0x1d7, 0x237, 0x216, 0x173, 0x3bb, 0x87, 0x2c, 0x286, 0x37a, 0x3eb, 0x284, 0x1bf, 0x134, 0x39d, 0x3c2, 0x2e7, 0x19, 0x265, 0x2d0, 0x23f, 0x110, 0x21d, 0x3d6, 0x2c5, 0x1b7, 0x6d, 0x3cc, 0x147, 0x7c, 0x10a, 0x3b6, 0x2c8, 0x271, 0x2ac, 0x17d, 0x3ff, 0x204, 0x366, 0x2df, 0x232, 0x1e6, 0x2a7, 0x3e, 0x85, 0x1db, 0x164, 0x33c, 0x156, 0x2ba, 0x3fb, 0x102, 0x1b3, 0x36b, 0x119, 0xf3, 0x357, 0x1f, 0x246, 0x2e9, 0xb2, 0x19e, 0xab, 0x15d, 0x3f9, 0x81, 0x2dd, 0x3b1, 0x288, 0x27d, 0x3af, 0x20b, 0x123, 0x370, 0x59, 0xcf, 0x251, 0x2aa, 0x3f8, 0x244, 0x36a, 0x3dc, 0x144, 0x33a, 0x3d3, 0x301, 0x295, 0x1b8, 0x228, 0x263, 0x32c, 0x155, 0x1fc, 0x122, 0x1b5, 0x1ee, 0xa2, 0x19d, 0x3ed, 0x384, 0x34e, 0xdc, 0x114, 0x335, 0x196, 0x2ae, 0xfe, 0x91, 0x2de, 0xf7, 0x51, 0x2ca, 0x3f2, 0x1c2, 0x1a7, 0x6e, 0x8a, 0x39e, 0xcb, 0x157, 0x7f, 0x24c, 0x16f, 0x27f, 0x22c, 0x165, 0x1f9, 0xe1, 0x2d7, 0x37, 0x45, 0x1cf, 0x261, 0x2af, 0x23b, 0x126, 0x2b3, 0x33b, 0x116, 0x2b6, 0x2f8, 0x274, 0x36f, 0x21f, 0x183, 0x2d5, 0x368, 0xb7, 0xba, 0x33f, 0x29, 0x18c, 0x256, 0x1dd, 0x3cb, 0x20e, 0x1c0, 0x48, 0x1b, 0x280, 0xf0, 0x22, 0x30a, 0x3a5, 0x31a, 0x3a3, 0x219, 0x146, 0x17b, 0x2f4, 0x2e7, 0x64, 0x211, 0x145, 0x3fe, 0x182, 0x356, 0x1bd, 0x3df, 0xd, 0x385, 0x316, 0x1a5, 0x3da, 0x38b, 0x216, 0x1c5, 0x3ce, 0x188, 0x53, 0x29b, 0x270, 0xd2, 0x328, 0xaf, 0xbf, 0xb9, 0x1ba, 0x35f, 0x3d, 0x38f, 0x13, 0x283, 0x275, 0x354, 0x2bb, 0x27c, 0x2d4, 0x2eb, 0x262, 0x3d2, 0x388, 0x93, 0x2b3, 0x27f, 0x51, 0x19d, 0x3d3, 0x20b, 0x246, 0x1db, 0x2c8, 0xeb, 0x2a2, 0x3fa, 0x387, 0x10, 0x6, 0x103, 0x2e5, 0x362, 0x3b2, 0x39c, 0x290, 0xf6, 0x121, 0x1ef, 0xc7, 0xa8, 0x3f, 0x89, 0x1b0, 0x5a, 0x31b, 0x220, 0xcc, 0x22e, 0x1cc, 0x24e, 0x1d8, 0x4d, 0x39d, 0x313, 0x223, 0x249, 0x158, 0x7d, 0x397, 0x16, 0x105, 0x3e6, 0x187, 0xd0, 0x2e, 0x306, 0x346, 0x376, 0x362, 0x36d, 0x26b, 0xad, 0x37b, 0x61, 0x32e, 0x358, 0x17a, 0x2e7, 0xc8, 0x56, 0x23a, 0x397, 0x2c, 0x1d, 0x30f, 0x46, 0x236, 0x392, 0x329, 0x258, 0x1ba, 0x2b7, 0xf4, 0x47, 0x130, 0xd4, 0x5f, 0x13a, 0x2d7, 0xdc, 0x59, 0x33c, 0x151, 0x3fa, 0x307, 0x40, 0x30, 0x14, 0xf, 0x106, 0x2c6, 0x3d6, 0x31a, 0x34f, 0x76, 0x222, 0x39d, 0x22f, 0x9e, 0x26c, 0x1ad, 0x3bb, 0x31, 0x312, 0x349, 0x270, 0x1a4, 0xbb, 0x171, 0x3e2, 0x30d, 0x243, 0xb3, 0x177, 0x1e4, 0x8b, 0x165, 0x3ed, 0x20b, 0x85, 0x365, 0x26d, 0x2ab, 0xfd, 0x347, 0x70, 0x24, 0x1b, 0x109, 0x3c0, 0x110, 0xcc, 0x55, 0x339, 0x254, 0x1bf, 0x1b2, 0x2b1, 0x2f2, 0x3c1, 0x216, 0x38a, 0x323, 0x5b, 0x139, 0x3d4, 0x11f, 0x1ca, 0x293, 0xef, 0x14e, 0x2f0, 0x1c4, 0x93, 0x16f, 0x1ee, 0x288, 0x1e6, 0x28e, 0x3e0, 0x108, 0xc6, 0x256, 0x3ba, 0x337, 0x205, 0x103, 0x386, 0x245, 0x163, 0x3d6, 0x23d, 0x127, 0x3b0, 0x268, 0x35c, 0x2f2, 0x38b, 0x4a, 0x6f, 0x25c, 0x372, 0x2cb, 0x1aa, 0x17f, 0x3c4, 0x226, 0x335, 0xab, 0x2fa, 0x387, 0x40, 0x60, 0x50, 0x78, 0x44, 0x66, 0x55, 0x27b, 0x142, 0x1e3, 0x316, 0x29d, 0x1d7, 0x338, 0x2a4, 0x3f6, 0x20d, 0x10f, 0x38c, 0x24a, 0x36f, 0xdc, 0xb2, 0xeb, 0x29a, 0x3d7, 0x38, 0x24, 0x36, 0x2d, 0x23f, 0x124, 0x1b6, 0x16d, 0x3df, 0x34, 0x2e, 0x39, 0x221, 0x135, 0x3ab, 0x7a, 0x47, 0x260, 0x350, 0x2f8, 0x384, 0x246, 0x365, 0xd3, 0x2be, 0x3e1, 0x15, 0x21b, 0x112, 0x19b, 0x352, 0x2fb, 0x182, 0x143, 0x3e6, 0x215, 0x11b, 0x392, 0x25b, 0x172, 0x1cb, 0x32a, 0x2bf, 0x1e4, 0x116, 0x19d, 0x357, 0xf8, 0x84, 0xc6, 0xa5, 0x2f3, 0x18e, 0x149, 0x3e9, 0x19, 0x211, 0x11d, 0x397, 0x58, 0x74, 0x4e, 0x69, 0x259, 0x171, 0x3cd, 0x2f, 0x23c, 0x3, 0x5, 0xf, 0x11, 0x33, 0x55, 0xff, 0x101, 0x303, 0x10c, 0x314, 0x135, 0x35f, 0x1e8, 0x238, 0x241, 0x2ca, 0x357, 0x1f0, 0x210, 0x239, 0x242, 0x2cf, 0x358, 0x1e1, 0x223, 0x26c, 0x2bd, 0x3ce, 0x5b, 0xed, 0x137, 0x359, 0x1e2, 0x226, 0x263, 0x2ac, 0x3fd, 0xe, 0x12, 0x36, 0x5a, 0xee, 0x132, 0x356, 0x1f3, 0x215, 0x236, 0x253, 0x2fc, 0x30d, 0x11e, 0x322, 0x16f, 0x3b1, 0xda, 0x16e, 0x3b2, 0xdf, 0x161, 0x3a3, 0xec, 0x134, 0x35c, 0x1ed, 0x237, 0x250, 0x2f9, 0x302, 0x10f, 0x311, 0x13a, 0x34e, 0x1db, 0x26d, 0x2be, 0x3cb, 0x54, 0xfc, 0x104, 0x30c, 0x11d, 0x327, 0x160, 0x3a0, 0xe9, 0x13b, 0x34d, 0x1de, 0x262, 0x2af, 0x3f8, 0x1, 0x3, 0x5, 0xf, 0x11, 0x33, 0x55, 0xff, 0x101, 0x303, 0x10c, 0x314, 0x135, 0x35f, 0x1e8, 0x238, 0x241, 0x2ca, 0x357, 0x1f0, 0x210, 0x239, 0x242, 0x2cf, 0x358, 0x1e1, 0x223, 0x26c, 0x6, 0x14, 0x78, 0x110, 0x269, 0x16d, 0x367, 0x340, 0x392, 0x17e, 0x30d, 0x23c, 0x93, 0x36a, 0x36e, 0x376, 0x326, 0x2c6, 0x28f, 0x339, 0x284, 0x303, 0x218, 0x4b, 0x1ba, 0x195, 0x177, 0x33b, 0x288, 0x32b, 0x2e8, 0x26b, 0x161, 0x34f, 0x3b0, 0x1b2, 0x1a5, 0x1d7, 0xfb, 0x21a, 0x47, 0x192, 0x165, 0x357, 0x3e0, 0x52, 0x1ec, 0x61, 0x146, 0x39d, 0x15c, 0x3c1, 0x94, 0x378, 0x302, 0x21e, 0x5f, 0x1c2, 0x85, 0x31e, 0x256, 0x1ef, 0x6b, 0x17a, 0x315, 0x26c, 0x173, 0x323, 0x2d8, 0x2cb, 0x2a1, 0x3dd, 0xdc, 0x2c8, 0x2ab, 0x3e1, 0x54, 0x1f8, 0x19, 0x56, 0x1f4, 0x31, 0xa6, 0x3d4, 0xea, 0x27c, 0x113, 0x263, 0x151, 0x3ef, 0x70, 0x120, 0x2c9, 0x2ad, 0x3f5, 0x2c, 0xe8, 0x270, 0x13b, 0x293, 0x371, 0x334, 0x2aa, 0x3e7, 0x40, 0x180, 0x109, 0x23f, 0x99, 0x356, 0x3e6, 0x46, 0x194, 0x171, 0x32f, 0x2f0, 0x23b, 0x81, 0x306, 0x206, 0xc, 0x50, 0x3c0, 0x124, 0x1ab, 0x3e6, 0x8c, 0x259, 0x39a, 0x29c, 0x2af, 0x3fb, 0x10, 0xc0, 0x109, 0x77, 0x264, 0x286, 0x217, 0xd2, 0x1d1, 0x1de, 0x19a, 0x2aa, 0x3c7, 0x100, 0x1b, 0xb4, 0x379, 0x201, 0x3a, 0x138, 0x13b, 0x12f, 0x1df, 0x196, 0x2fa, 0x7, 0x24, 0x1b0, 0x352, 0x3f5, 0x58, 0x3a0, 0x3a4, 0x394, 0x2d4, 0x1cf, 0x156, 0x3f3, 0x70, 0x240, 0x336, 0x145, 0x327, 0x189, 0x27e, 0x23e, 0x13e, 0x113, 0xcf, 0x14d, 0x347, 0x309, 0x41, 0x30c, 0x7d, 0x21c, 0xa6, 0x3a1, 0x3a8, 0x3c4, 0x114, 0xeb, 0xfd, 0x15, 0xfc, 0x19, 0xac, 0x3d9, 0x188, 0x272, 0x26e, 0x2fe, 0x37, 0x164, 0x2ab, 0x3cb, 0x150, 0x3db, 0x190, 0x2d2, 0x1e7, 0xb6, 0x361, 0x2a1, 0x3b3, 0x370, 0x26d, 0x2ea, 0xc7, 0x12d, 0x1c7, 0x136, 0x173, 0x24f, 0x372, 0x275, 0x24a, 0x34e, 0x365, 0x291, 0x2f3, 0x6b, 0x2f4, 0x4f, 0x344, 0x31d, 0xb1, 0x345, 0x18, 0x140, 0x23f, 0x264, 0x105, 0x4e, 0x299, 0x12f, 0x3be, 0x251, 0x3fd, 0x70, 0x89, 0xc3, 0x23a, 0x21c, 0x14c, 0x29f, 0x17f, 0x37, 0x2c8, 0x2be, 0x267, 0x12d, 0x38e, 0xd1, 0x38a, 0xb1, 0x283, 0x5f, 0x301, 0x42, 0x239, 0x234, 0x28c, 0xd7, 0x3da, 0x338, 0x21a, 0x11c, 0x116, 0x1e6, 0x174, 0xdf, 0x31a, 0x12a, 0x3c6, 0x218, 0x12c, 0x396, 0x191, 0x1b5, 0x2d5, 0x386, 0x11, 0x198, 0x16d, 0x187, 0x65, 0x171, 0xa7, 0x353, 0x3fb, 0x20, 0x300, 0x5a, 0x379, 0xb, 0xe8, 0x1d2, 0x394, 0x1a1, 0x335, 0x2a2, 0x347, 0x21b, 0x104, 0x56, 0x3d9, 0x310, 0x1da, 0x354, 0x3b3, 0x2e9, 0x1a6, 0x37d, 0x6b, 0x1e1, 0x13c, 0x216, 0x1bc, 0x20d, 0xd4, 0x3f2, 0xf8, 0x52, 0x3b9, 0x219, 0x134, 0x2d6, 0x3ae, 0x3d1, 0x3d0, 0x3c8, 0x288, 0xb7, 0x2d3, 0x3d6, 0x398, 0x101, 0x2e, 0x390, 0x1c1, 0x23c, 0x24c, 0x2c5, 0x206, 0x3c, 0x220, 0x36c, 0x30, 0x109, 0x1dc, 0x201, 0xe8, 0x3a4, 0x24b, 0x113, 0x33c, 0xfd, 0x54, 0x3db, 0x249, 0x173, 0x12e, 0x345, 0x5f, 0x20b, 0x108, 0x1ec, 0x308, 0x134, 0x1a5, 0x2a3, 0x2b7, 0x177, 0x1ee, 0x368, 0x326, 0x21d, 0x2a8, 0x367, 0x236, 0x171, 0x14e, 0x157, 0x3e7, 0x200, 0xd8, 0x2ad, 0x397, 0x312, 0x3d4, 0x359, 0x21f, 0x2c8, 0x175, 0x18e, 0x17a, 0x9e, 0x216, 0x378, 0x26, 0x2a9, 0x357, 0x33f, 0xad, 0x34f, 0x1bf, 0x43, 0x4b, 0x1cb, 0x191, 0x36a, 0x346, 0xf, 0x110, 0x36c, 0x3e6, 0x230, 0x1d1, 0x371, 0x196, 0x3fa, 0x70, 0x112, 0x30c, 0x1f4, 0x188, 0x1da, 0x2a1, 0x2d7, 0x365, 0x256, 0x363, 0x2f6, 0x15c, 0x237, 0x141, 0x47, 0x8b, 0x1e6, 0x2e8, 0x37c, 0xe6, 0x284, 0x2e, 0x329, 0x30d, 0x1c4, 0x81, 0x6, 0xa0, 0x23f, 0xc1, 0x1d, 0x270, 0x1ca, 0x1a1, 0x263, 0x29a, 0x20e, 0x1f8, 0xc8, 0x1ad, 0x323, 0x2ed, 0x38c, 0x1c2, 0x21, 0x60, 0x2d, 0x2fb, 0x58, 0x13f, 0xea, 0x381, 0x164, 0x175, 0x31c, 0x1e1, 0xf9, 0x128, 0x3c3, 0x192, 0x27d, 0x174, 0x37c, 0x1cc, 0x202, 0x170, 0x2fc, 0x178, 0x1fc, 0x10, 0x209, 0x2d0, 0x3e3, 0x189, 0x3d4, 0x2bb, 0x6e, 0x26d, 0x37d, 0x1ac, 0x22f, 0x38b, 0x2a4, 0x47, 0x116, 0x391, 0x36d, 0x3a5, 0xff, 0x68, 0x32d, 0x393, 0x3ad, 0x3ff, 0x100, 0xd8, 0x153, 0x247, 0xa6, 0x137, 0x3ea, 0x2e9, 0x291, 0x3b5, 0x2f6, 0x2b8, 0xce, 0x21a, 0x79, 0x144, 0x16e, 0x2b5, 0x22e, 0x3eb, 0x289, 0x2bc, 0x14e, 0x2ae, 0x387, 0x24, 0x19b, 0x11d, 0x31, 0x272, 0x354, 0x2d7, 0x2c3, 0x14a, 0x32e, 0x333, 0x3da, 0xfb, 0x1e8, 0x399, 0x6d, 0x2cd, 0x30a, 0x2a8, 0x2c7, 0xca, 0x39a, 0xcd, 0x2ba, 0xe, 0x240, 0x186, 0x1f4, 0x310, 0x361, 0x125, 0x123, 0x63, 0x8d, 0x28c, 0x35c, 0x1d7, 0x3ab, 0x2bf, 0x1ee, 0x2d9, 0x83, 0xcc, 0x2da, 0x23, 0xbb, 0xc0, 0xb4, 0x3f5, 0x189, 0x3a1, 0x2fe, 0x370, 0x291, 0x363, 0x3ca, 0x1ed, 0xfb, 0x3d0, 0x27f, 0x368, 0x83, 0x198, 0x37a, 0x118, 0x3a2, 0x3be, 0x2ac, 0x287, 0x1f8, 0x320, 0x2e6, 0x162, 0x6a, 0x3d3, 0x33f, 0x2b4, 0x95, 0x303, 0x390, 0x213, 0x23b, 0x4, 0x300, 0x2d0, 0x3cf, 0x22d, 0x29f, 0x3ea, 0x1db, 0x256, 0x197, 0x333, 0x3bd, 0x3ec, 0x35b, 0x1ee, 0x1bb, 0x20c, 0x269, 0x1f3, 0x69, 0x293, 0x2e3, 0x2a2, 0x20e, 0x3e9, 0x9b, 0x38a, 0x181, 0x1a8, 0x357, 0xe7, 0x2c2, 0x254, 0x17, 0x25b, 0x5e, 0xfe, 0x10, 0x1b, 0x352, 0x327, 0xa6, 0x26e, 0x3b3, 0x365, 0x14a, 0x255, 0xd7, 0x2ef, 0x3ab, 0x177, 0x3b1, 0x2e5, 0x22, 0x1b6, 0x3c5, 0x1a4, 0x25e, 0x39e, 0x29a, 0x2a, 0x3bf, 0x26c, 0x233, 0x20d, 0x2a9, 0x147, 0x39c, 0x31a, 0x142, 0x5c, 0x17e, 0x178, 0x3f8, 0x40, 0x6c, 0x153, 0x87, 0x298, 0x1aa, 0x2d7, 0x18f, 0x121, 0x146, 0x180, 0x2d0, 0x397, 0xa6, 0xd5, 0x2d7, 0x31e, 0x8d, 0x222, 0x1a5, 0x135, 0xb3, 0x36a, 0x206, 0x3c0, 0xc1, 0xe8, 0x11f, 0x3c4, 0x2c8, 0x3ba, 0x358, 0x15c, 0x19c, 0xf4, 0x33b, 0x368, 0x106, 0x269, 0x3e6, 0x1a4, 0xb5, 0x263, 0xfd, 0x2a0, 0x315, 0x216, 0x3f6, 0x192, 0x1e6, 0x36d, 0x28f, 0x3eb, 0x236, 0x39a, 0x334, 0x3fa, 0x380, 0x19, 0x1ad, 0x12e, 0x21e, 0x3ed, 0x33f, 0x161, 0x254, 0x2e, 0x17e, 0x2f0, 0x3fb, 0x200, 0x2c9, 0x23a, 0x188, 0x2cb, 0x13a, 0x21, 0x1ec, 0x76, 0x18b, 0x4b, 0x243, 0x91, 0x6, 0x109, 0x2fb, 0x160, 0x3d4, 0x2fe, 0x2e9, 0x256, 0x32e, 0xd7, 0x1d7, 0x2b7, 0x3aa, 0x36e, 0xf, 0x92, 0x286, 0x270, 0x24b, 0x8a, 0x2ab, 0x18e, 0x3c2, 0x3c1, 0x141, 0x238, 0x288, 0x362, 0x21d, 0x16d, 0x46, 0x1d1, 0x3be, 0x151, 0x20e, 0x3db, 0x26c, 0x6f, 0x26, 0x165, 0x5d, 0x37c, 0x339, 0x68, 0xaf, 0x14e, 0x2aa, 0x300, 0x352, 0x87, 0x272, 0x296, 0x85, 0x7b, 0x3b, 0x18b, 0x96, 0x11e, 0x81, 0x60, 0x168, 0x397, 0x14c, 0x354, 0x295, 0x18c, 0x184, 0x1b2, 0x314, 0x325, 0x91, 0xc, 0x2d, 0x3f5, 0x22d, 0x26e, 0x2d7, 0x235, 0x234, 0x134, 0x266, 0x2e1, 0x93, 0x205, 0x280, 0x2fb, 0x2c0, 0x34b, 0x3dd, 0x2c3, 0x242, 0x222, 0x34a, 0xdd, 0x191, 0x2c5, 0x50, 0x1dc, 0x58, 0x1ea, 0x2fe, 0x1db, 0x14a, 0x146, 0x16b, 0x29e, 0xb3, 0x2dd, 0xa, 0x23f, 0xb, 0x13f, 0x359, 0x1b8, 0x12b, 0x32e, 0x1ae, 0x355, 0x195, 0x2de, 0x103, 0x3c0, 0x182, 0x3a0, 0xea, 0x37, 0x1a6, 0x363, 0x333, 0x2ef, 0x2b7, 0x35d, 0x1a3, 0x78, 0x132, 0x74, 0x11f, 0x381, 0x332, 0x1ef, 0x1e5, 0x3da, 0x3d1, 0x2ee, 0x1b7, 0xf, 0x124, 0x20a, 0x3a4, 0xf1, 0x164, 0x3ba, 0x2b9, 0x179, 0xfb, 0x35b, 0x3b1, 0x386, 0x220, 0x143, 0x270, 0x9f, 0x228, 0x175, 0xd6, 0xae, 0x19c, 0x209, 0x153, 0x31, 0x361, 0x274, 0x108, 0x1f7, 0x37e, 0xe4, 0x2f, 0x3f8, 0x200, 0x336, 0x3e8, 0x2d8, 0x22b, 0xf8, 0xad, 0x12a, 0x5c, 0x3e2, 0x2af, 0x207, 0x112, 0x158, 0x24f, 0x21e, 0x3af, 0x39c, 0xe6, 0x34, 0x15e, 0x262, 0x1fd, 0x309, 0xc8, 0x1c5, 0x20d, 0x165, 0x174, 0x3a5, 0x3eb, 0xca, 0x1de, 0xab, 0x107, 0x3bf, 0x344, 0x1fb, 0x324, 0x32b, 0x163, 0x159, 0x46, 0x34d, 0x39e, 0xfd, 0x292, 0x13c, 0xa9, 0x11c, 0x119, 0x326, 0x330, 0x3c5, 0x13b, 0x28d, 0x3ac, 0x18e, 0x313, 0x67, 0xf4, 0xf7, 0x2e5, 0x110, 0x143, 0xe9, 0x27c, 0x164, 0x37d, 0x2f6, 0x3da, 0x3ab, 0x3aa, 0x1a3, 0xf0, 0xc1, 0x3a0, 0x1d4, 0xdc, 0x12b, 0x255, 0x2b1, 0x29e, 0x166, 0x366, 0x50, 0x3b8, 0x160, 0x34b, 0x3b3, 0x31e, 0x234, 0x268, 0x18a, 0x325, 0x122, 0x30, 0x168, 0x327, 0x139, 0x296, 0x10a, 0x1ec, 0x1d8, 0x86, 0x2e4, 0x319, 0x10, 0xd8, 0x1b, 0x145, 0x188, 0x275, 0x20b, 0x290, 0x24e, 0x2e, 0x3e2, 0x157, 0xe, 0x82, 0x1ad, 0x162, 0x2a9, 0x5d, 0x3d6, 0x3eb, 0x194, 0x371, 0x151, 0x54, 0x315, 0x94, 0x47, 0x288, 0x326, 0x269, 0x30f, 0x1ca, 0x8a, 0x175, 0x358, 0x2f2, 0x3d1, 0x3aa, 0x346, 0x3c0, 0x201, 0x27e, 0x2fe, 0x365, 0x8d, 0x134, 0x18a, 0x243, 0x81, 0x180, 0x2ad, 0x31, 0x2cb, 0x1c2, 0x52, 0x34f, 0x303, 0x17e, 0x3ad, 0x307, 0x112, 0x2b0, 0x12e, 0xd4, 0x28e, 0x37c, 0x1fe, 0x236, 0xef, 0xab, 0x20e, 0x2e7, 0x216, 0x38f, 0x51, 0x362, 0xcc, 0x3e6, 0x13b, 0x113, 0x2ab, 0x6b, 0x15c, 0xfb, 0x177, 0x36e, 0x78, 0xc1, 0x349, 0x359, 0x2e9, 0x294, 0x222, 0x133, 0x1cb, 0x91, 0x30, 0x2d0, 0x87, 0x1da, 0x13a, 0x108, 0x3ee, 0x1e3, 0x329, 0x2f0, 0x3e7, 0x120, 0x56, 0x323, 0x21e, 0x357, 0x26b, 0x339, 0x340, 0x39a, 0x196, 0x347, 0x3db, 0x344, 0x3f6, 0x8b, 0x36, 0x11d, 0x5b, 0x311, 0x1f0, 0x161, 0x101, 0x253, 0x262, 0x3fd, 0xfc, 0x26c, 0x2f9, 0x241, 0x16e, 0x33, 0x1f3, 0x13b, 0x226, 0x2be, 0x358, 0x1ed, 0x35f, 0x16f, 0x5, 0xee, 0x160, 0x137, 0x34e, 0x239, 0xec, 0x10c, 0x30d, 0x3f8, 0x12, 0x30c, 0x3ce, 0x10f, 0x357, 0xdf, 0xff, 0x236, 0x1de, 0x2ac, 0x54, 0x223, 0x250, 0x238, 0xda, 0x11, 0x356, 0xe9, 0x1e2, 0x26d, 0x2cf, 0x35c, 0x135, 0x322, 0x3, 0x5a, 0x327, 0xed, 0x13a, 0x210, 0x3a3, 0x303, 0x2fc, 0x2af, 0xe, 0x104, 0x2bd, 0x302, 0x2ca, 0x3b2, 0x55, 0x215, 0x34d, 0x263, 0x3cb, 0x1e1, 0x237, 0x1e8, 0x3b1, 0xf, 0x132, 0x3a0, 0x359, 0x1db, 0x242, 0x134, 0x314, 0x11e, 0x1, 0x36, 0x11d, 0x5b, 0x311, 0x1f0, 0x161, 0x101, 0x253, 0x262, 0x3fd, 0xfc, 0x26c, 0x2f9, 0x241, 0x16e, 0x33, 0x1f3, 0x13b, 0x226, 0x2be, 0x358, 0x1ed, 0x35f, 0x16f, 0x5, 0xee, 0x160, 0x6c, 0x7d, 0x2d8, 0x17c, 0x277, 0xe6, 0x1a0, 0x33d, 0xab, 0x2a, 0x223, 0xa9, 0xf2, 0x2d9, 0x110, 0x20a, 0x23e, 0xdc, 0x14a, 0x4d, 0x18a, 0x11e, 0x2, 0xd8, 0xfa, 0x1b9, 0x2f8, 0xe7, 0x1cc, 0x340, 0x273, 0x156, 0x54, 0x4f, 0x152, 0x1e4, 0x1bb, 0x220, 0x1d, 0x75, 0x1b8, 0x294, 0x9a, 0x314, 0x23c, 0x4, 0x1b0, 0x1f4, 0x372, 0x1f9, 0x1ce, 0x398, 0x289, 0xef, 0x2ac, 0xa8, 0x9e, 0x2a4, 0x3c8, 0x376, 0x49, 0x3a, 0xea, 0x370, 0x121, 0x134, 0x221, 0x71, 0x8, 0x360, 0x3e8, 0x2ed, 0x3f2, 0x39c, 0x339, 0x11b, 0x1de, 0x151, 0x150, 0x13c, 0x141, 0x399, 0x2e5, 0x92, 0x74, 0x1d4, 0x2e9, 0x242, 0x268, 0x4b, 0xe2, 0x10, 0x2c9, 0x3d9, 0x1d3, 0x3ed, 0x331, 0x27b, 0x236, 0x3bc, 0x2a2, 0x2a0, 0x278, 0x282, 0x33b, 0x1c3, 0x124, 0xe8, 0x3a8, 0x1db, 0x8d, 0xd9, 0x96, 0x1c4, 0x20, 0x19b, 0x3bb, 0x3a6, 0x3d3, 0x26b, 0xd8, 0x1f4, 0x2ed, 0x3ed, 0x26b, 0x1fe, 0x194, 0x3be, 0xfd, 0x17a, 0x237, 0x3a9, 0x36e, 0x3c0, 0x2c, 0x29f, 0x295, 0x1ec, 0x1bf, 0x329, 0x3ad, 0xe, 0x19, 0x38a, 0x130, 0x32b, 0x21d, 0x3e6, 0x1ca, 0x59, 0x1ef, 0xd7, 0x135, 0x93, 0x30, 0x2ad, 0x188, 0x38c, 0x3e0, 0x31a, 0x68, 0x39a, 0xab, 0x54, 0x9e, 0x141, 0x33b, 0x386, 0x99, 0x349, 0x2fe, 0x31e, 0x308, 0x43, 0x30d, 0x3fb, 0x120, 0x2b0, 0x162, 0x165, 0x36d, 0x2a8, 0x230, 0x1a1, 0x2ab, 0x358, 0x3bd, 0x195, 0x366, 0x109, 0x397, 0x1da, 0x1c2, 0x290, 0x254, 0x392, 0x262, 0x3ef, 0x3db, 0x216, 0x47, 0x6d, 0x22, 0x286, 0x11f, 0xdc, 0x294, 0x134, 0x4b, 0x1c4, 0x40, 0x265, 0x1e7, 0x21e, 0x28e, 0x3d6, 0x367, 0x1d1, 0x263, 0x337, 0x22f, 0xfb, 0x3aa, 0x206, 0x1dc, 0x312, 0x2a1, 0x21, 0x3ee, 0x303, 0x3e2, 0x2aa, 0x380, 0x249, 0x378, 0x8b, 0x362, 0x269, 0x4e, 0x27c, 0x1b0, 0x3d9, 0x345, 0x2a7, 0x1eb, 0x367, 0x3a2, 0x19e, 0x18e, 0x2b8, 0x35f, 0x36a, 0x140, 0x3cf, 0x1da, 0x384, 0x252, 0x284, 0x15e, 0xcb, 0x20e, 0x223, 0x2a4, 0x33b, 0x305, 0x264, 0x27e, 0x3b3, 0x318, 0x3b0, 0x1c8, 0x3d2, 0xe, 0x32, 0x233, 0x192, 0x2dc, 0x330, 0x4e, 0xf1, 0x1a6, 0x146, 0x266, 0x11e, 0x8, 0x19b, 0x2f7, 0x21e, 0x115, 0x343, 0x30e, 0x12f, 0xeb, 0x6b, 0x1ed, 0x2ce, 0x366, 0x212, 0x247, 0x2cb, 0x1f, 0x2b4, 0xd, 0x2e2, 0x251, 0x54, 0x13c, 0x10d, 0x1ee, 0x1e, 0x304, 0x3d4, 0x1a7, 0xf6, 0x1bf, 0x25b, 0x2af, 0x70, 0x190, 0x1bc, 0x8b, 0x2cd, 0x1b6, 0x270, 0x381, 0x12b, 0x222, 0x314, 0xe2, 0x40, 0xc3, 0x395, 0xd4, 0xba, 0x22e, 0x46, 0x16a, 0x351, 0x358, 0x373, 0x25d, 0x306, 0xb4, 0x21c, 0x275, 0xf8, 0x18d, 0x68, 0x33d, 0x2ac, 0x2a0, 0x1f2, 0x7a, 0x36b, 0xf0, 0x16, 0x29f, 0x123, 0x3b9, 0x1e3, 0x360, 0x37f, 0x21e, 0x22a, 0x117, 0x46, 0x2d4, 0x15f, 0x2f6, 0x355, 0x322, 0x30, 0x2a6, 0xb6, 0x2f8, 0x331, 0x3fc, 0xbb, 0x335, 0x267, 0x15c, 0x35f, 0x2dd, 0x109, 0x247, 0x19f, 0x7c, 0x18d, 0xd0, 0xef, 0x14d, 0x25a, 0x237, 0x2bf, 0x285, 0x1dc, 0x53, 0x24a, 0x52, 0x12a, 0x32d, 0x334, 0x107, 0x223, 0x141, 0xf7, 0x1e, 0x201, 0x34b, 0x123, 0x37b, 0x385, 0x3cd, 0x17d, 0xfc, 0x281, 0x47, 0x1b4, 0x220, 0xe8, 0x17f, 0x235, 0x76, 0x72, 0x1e9, 0xe, 0x64, 0xde, 0x8b, 0x193, 0x2d1, 0x3a4, 0x6e, 0x121, 0x1b2, 0x172, 0x3f8, 0x120, 0x2d2, 0x20d, 0x1e6, 0x30a, 0x3c5, 0x24b, 0x332, 0x255, 0x133, 0x11e, 0x10, 0x265, 0x395, 0x1a8, 0x2e8, 0x154, 0x69, 0x113, 0x1dd, 0x333, 0x135, 0x24c, 0x300, 0x23a, 0x372, 0x3d3, 0x37c, 0x3b7, 0x3a2, 0x33c, 0x231, 0x1ed, 0x195, 0x183, 0xb4, 0x31, 0x1c6, 0x3c9, 0xe6, 0x11b, 0x2eb, 0xfd, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x1, 0x2c9, 0x1e7, 0xd4, 0x2e8, 0x2a8, 0x1a4, 0x8a, 0x1ef, 0x2b1, 0x1cb, 0x19b, 0x395, 0x2a9, 0x2d3, 0x1bd, 0x1ca, 0x199, 0xa3, 0x18a, 0x388, 0x12, 0x2b0, 0x20d, 0x391, 0xcc, 0x9c, 0x30b, 0x294, 0x364, 0x382, 0x3e7, 0x104, 0x233, 0x8b, 0x245, 0x143, 0xea, 0x2c3, 0x3b, 0xe4, 0x353, 0x1c0, 0x26c, 0x317, 0x1b4, 0x92, 0x29b, 0x36f, 0x1ec, 0x3c6, 0x393, 0x3fa, 0x3bf, 0x250, 0x33b, 0x1e, 0x16, 0xd5, 0x42, 0x127, 0x392, 0x261, 0x2a, 0xf9, 0x1e8, 0x1a3, 0x1dc, 0x14c, 0xe1, 0xad, 0x1a, 0x273, 0x29a, 0x2f4, 0x279, 0x16f, 0x140, 0x247, 0x275, 0x3c9, 0x398, 0x194, 0x39e, 0xc7, 0x2f2, 0x32a, 0x3, 0x2ad, 0xb6, 0x3f2, 0x37c, 0x2c7, 0x25e, 0x2ab, 0x1e5, 0x29e, 0x91, 0x36, 0x3d9, 0x21e, 0xba, 0x154, 0x1a4, 0x114, 0x3b5, 0x1a5, 0x8f, 0x20, 0x30c, 0x25c, 0x19d, 0x2c6, 0x3c5, 0x13e, 0x34c, 0x4d, 0x12c, 0x1fc, 0x240, 0x2bd, 0x130, 0x2dc, 0x1b6, 0x3a4, 0x1b8, 0x234, 0x43, 0xbc, 0x7, 0xc8, 0x336, 0x24f, 0x165, 0x163, 0x3c5, 0x27c, 0x12b, 0x268, 0x2e4, 0x3f7, 0x104, 0x6f, 0x22c, 0x20c, 0x1d, 0x17f, 0x18c, 0x1bf, 0x1f1, 0x2fa, 0x3db, 0x250, 0x27f, 0x78, 0xb0, 0x14b, 0x52, 0x142, 0x2e2, 0x151, 0xbd, 0x338, 0x16f, 0x280, 0x10e, 0x38c, 0xe7, 0x3fc, 0x1d1, 0xeb, 0x2b9, 0x2a3, 0x24c, 0x36, 0x3bb, 0x6a, 0x1d9, 0x16d, 0xe5, 0x199, 0x146, 0x221, 0x7f, 0x120, 0x2bd, 0x260, 0x362, 0x1ab, 0x23e, 0x365, 0x3b, 0x1c8, 0x157, 0x21b, 0x281, 0x238, 0x1c3, 0x182, 0x29f, 0x214, 0x297, 0x392, 0xcb, 0xa8, 0x3c1, 0x2bf, 0x5, 0x3f5, 0x361, 0xf8, 0xe6, 0xca, 0x39e, 0x18e, 0x3da, 0x166, 0x30, 0x11d, 0x1d3, 0x28e, 0x22e, 0x69, 0x8a, 0x3b5, 0x34a, 0x23c, 0x100, 0xac, 0x302, 0x391, 0x198, 0x270, 0x6e, 0x11a, 0x43, 0x178, 0x1c, 0x249, 0x3c3, 0xda, 0x92, 0x13f, 0x1a7, 0x37b, 0x17, 0x29c, 0x347, 0x4f, 0x3d, 0x36e, 0x265, 0x12e, 0x33a, 0x21d, 0x4e, 0x21f, 0x8d, 0x43, 0x2f0, 0x70, 0x26c, 0x47, 0x376, 0xc1, 0x29f, 0x21, 0x24e, 0xaf, 0xab, 0x12d, 0x19c, 0x16f, 0x109, 0x31, 0x5f, 0x26b, 0x367, 0xb5, 0x175, 0xd7, 0x1cb, 0x8, 0x30c, 0x162, 0x1e6, 0xcc, 0x270, 0xdc, 0x61, 0x218, 0x3ad, 0x380, 0x344, 0x238, 0x386, 0x201, 0xd5, 0x108, 0x254, 0x171, 0x151, 0x17a, 0xfb, 0x36a, 0x5a, 0x188, 0x2f8, 0x37c, 0x30e, 0x1a1, 0x3ba, 0x2b1, 0x243, 0x40, 0x56, 0x302, 0x32b, 0x269, 0x3a4, 0x2e9, 0x308, 0xe4, 0x157, 0x3f, 0x216, 0x1e4, 0xf, 0x2c, 0x2a1, 0x52, 0x284, 0x39a, 0x29a, 0x3c2, 0x3d1, 0x366, 0x2d0, 0x5b, 0x3ed, 0x3d6, 0x46, 0x113, 0x1ef, 0x1a5, 0x23c, 0x200, 0x2b0, 0x26, 0x16e, 0x36c, 0x11f, 0x365, 0x76, 0x329, 0x2aa, 0x1f8, 0x94, 0x33b, 0x78, 0x160, 0x125, 0x290, 0xd, 0xef, 0xfd, 0x22f, 0x2b7, 0x306, 0x2ad, 0x2d8, 0xc3, 0xb1, 0x1e6, 0x198, 0x1d2, 0x2e9, 0x219, 0x390, 0x2aa, 0x3f0, 0x250, 0x1ee, 0x389, 0x53, 0x1c2, 0x2c2, 0x11b, 0x1cf, 0x31c, 0x2ef, 0x93, 0x36, 0x2f7, 0x2a9, 0x2b5, 0x383, 0x3c4, 0x121, 0x225, 0x2f0, 0xe0, 0x1a2, 0x238, 0x305, 0x16, 0x2a1, 0xa4, 0x202, 0xef, 0x1fa, 0xae, 0x195, 0xc, 0x11d, 0x345, 0xba, 0x2b2, 0x1ca, 0xd3, 0x9a, 0x2e4, 0x3c7, 0x64, 0x3f6, 0xda, 0x248, 0x3d4, 0x10a, 0x127, 0xaf, 0x156, 0xbd, 0xfb, 0x2dd, 0x168, 0x5b, 0x3d3, 0x343, 0x230, 0x114, 0x197, 0x18a, 0x7f, 0x89, 0x38a, 0x116, 0x11, 0xe8, 0x3b3, 0x3b9, 0x2e, 0xcd, 0x2a, 0x3c1, 0x2ee, 0x50, 0x87, 0x311, 0x331, 0x367, 0x16a, 0x1dd, 0x2b1, 0x8f, 0x100, 0x2b0, 0x4c, 0x1b1, 0x356, 0x1d4, 0x63, 0x1bf, 0x3cd, 0x3f3, 0x315, 0x3d, 0x1a3, 0x2fb, 0x3b4, 0x1f0, 0x339, 0x176, 0xeb, 0x2f6, 0x26a, 0x204, 0x265, 0x25c, 0xf3, 0xcc, 0x186, 0x2c4, 0x32b, 0x1b6, 0x23e, 0x31e, 0x2db, 0x3cd, 0x3ef, 0x4f, 0x1e8, 0x206, 0x3cf, 0xe3, 0x1ce, 0x3b7, 0x16a, 0x3ba, 0x2d6, 0x71, 0x24, 0x2bd, 0x324, 0x106, 0x74, 0x3b3, 0x37b, 0xb8, 0x261, 0x2a0, 0xce, 0x2de, 0x5a, 0x229, 0x3d3, 0x28f, 0xd2, 0xb2, 0x146, 0x12c, 0x3ff, 0x19, 0x1fb, 0xda, 0x99, 0x34b, 0x42, 0x254, 0x1cd, 0x13d, 0x22f, 0x2ce, 0xc, 0x23a, 0x10f, 0x1d9, 0x37a, 0x13e, 0xa5, 0x18b, 0x178, 0xe0, 0x344, 0xf2, 0x1e, 0x160, 0x9d, 0x15a, 0x340, 0x2e3, 0x31c, 0x1d7, 0x24c, 0x1b0, 0x323, 0x19d, 0x33, 0x270, 0x370, 0x219, 0x329, 0x2ba, 0x3bf, 0x141, 0x1b7, 0x3b8, 0x1da, 0x1f0, 0x27b, 0x1d1, 0x351, 0x333, 0x1cb, 0x20, 0xac, 0x26, 0x1b1, 0x2a5, 0x359, 0x318, 0x3c6, 0x14e, 0x107, 0x1f2, 0x177, 0x50, 0x10e, 0x5f, 0x1be, 0x215, 0x113, 0x3b5, 0x266, 0x23b, 0x89, 0x31d, 0x51, 0x88, 0x29b, 0x295, 0x30c, 0x302, 0x16e, 0x356, 0x359, 0x239, 0x303, 0x262, 0x54, 0x237, 0x16f, 0x5a, 0x5b, 0x357, 0x55, 0x13b, 0x26d, 0x134, 0x30d, 0xe, 0x26c, 0x238, 0xf, 0x160, 0x13a, 0x161, 0x236, 0x263, 0x358, 0x135, 0x1, 0x30c, 0x302, 0x16e, 0x356, 0x359, 0x239, 0x303, 0x262, 0x54, 0x237, 0x16f, 0x5a, 0x5b, 0x357, 0x55, 0x13b, 0x26d, 0x134, 0x30d, 0xe, 0x26c, 0x238, 0xf, 0x160, 0x13a, 0x161, 0x236, 0x263, 0x358, 0x135, 0x1, 0x30c, 0x302, 0x16e, 0x356, 0x359, 0x239, 0x303, 0x262, 0x54, 0x237, 0x16f, 0x5a, 0x5b, 0x357, 0x55, 0x13b, 0x26d, 0x134, 0x30d, 0xe, 0x26c, 0x238, 0xf, 0x160, 0x13a, 0x161, 0x236, 0x263, 0x358, 0x135, 0x1, 0x30c, 0x302, 0x16e, 0x356, 0x359, 0x239, 0x303, 0x262, 0x54, 0x237, 0x16f, 0x5a, 0x5b, 0x357, 0x55, 0x13b, 0x26d, 0x134, 0x30d, 0xe, 0x26c, 0x238, 0xf, 0x160, 0x13a, 0x161, 0x236, 0x211, 0x13, 0x362, 0x105, 0x3ea, 0x37b, 0x2e0, 0x251, 0x17a, 0x3ab, 0x3, 0x23a, 0x35, 0x1af, 0x30f, 0x37, 0x184, 0x329, 0x2fa, 0x38e, 0xf4, 0x5, 0x247, 0x5f, 0x2f1, 0x118, 0x59, 0x28c, 0x172, 0x307, 0x9b, 0x11c, 0xf, 0x2c0, 0xe1, 0x31a, 0x328, 0xeb, 0x39d, 0x396, 0x100, 0x1ad, 0x324, 0x11, 0x349, 0x123, 0x127, 0x171, 0x13d, 0xae, 0xb3, 0x300, 0x2f7, 0x165, 0x33, 0x1d2, 0x365, 0x369, 0x393, 0x347, 0x1f2, 0x1d5, 0x109, 0x310, 0x3af, 0x55, 0x276, 0x1a6, 0x1b2, 0xbc, 0x1c0, 0x216, 0x27f, 0x31b, 0x139, 0xf8, 0xff, 0x293, 0x2ea, 0x2d6, 0x1c4, 0x240, 0x233, 0x288, 0x124, 0x34b, 0x108, 0x101, 0x3bc, 0x337, 0x373, 0x24c, 0x2c9, 0x25c, 0x391, 0x36c, 0x1d4, 0x318, 0x303, 0xcd, 0x150, 0x19c, 0x2dd, 0x352, 0x2ed, 0xba, 0x1bd, 0x27c, 0x121, 0x10c, 0x157, 0x3f0, 0x2a4, 0x36e, 0x1ff, 0x33e, 0x1ce, 0x2c7, 0x28d, 0x363, 0x2b, 0x4c, 0x326, 0x74, 0x1a7, 0x34f, 0x2bc, 0x13d, 0x15c, 0x2cc, 0x36, 0x323, 0xf3, 0xdb, 0xea, 0x318, 0x20f, 0x334, 0x292, 0x1f6, 0x306, 0x11d, 0x35, 0x35e, 0x27, 0x1b8, 0x76, 0x1f1, 0x3d7, 0xf9, 0x1d5, 0x212, 0x5b, 0x147, 0x159, 0x24b, 0x14a, 0x86, 0x157, 0x3e9, 0x282, 0x346, 0x3cf, 0x311, 0x37c, 0x118, 0xb2, 0x222, 0x382, 0x1c, 0x344, 0x399, 0x389, 0x139, 0x1f0, 0x3fc, 0xb5, 0x2f3, 0x266, 0x1fc, 0x208, 0x3e5, 0x376, 0x16, 0x24a, 0x161, 0xca, 0x271, 0x39d, 0x325, 0x9, 0x173, 0x22c, 0x220, 0x3d4, 0x84, 0x101, 0x371, 0xc7, 0x3ae, 0x81, 0x186, 0x20d, 0x362, 0x20a, 0x3b3, 0x3ee, 0x253, 0x2a2, 0x22f, 0x25d, 0x300, 0x1e7, 0x19d, 0x198, 0x11f, 0x63, 0x3c6, 0x262, 0x150, 0x338, 0x366, 0x2a6, 0x283, 0x36d, 0x383, 0x37, 0x308, 0xbf, 0x3fd, 0x9e, 0x2bf, 0x140, 0x188, 0x3af, 0xaa, 0x1ca, 0x12b, 0x316, 0x3ad, 0x56, 0x130, 0x106, 0x349, 0x85, 0x254, 0xef, 0x337, 0x1d7, 0x81, 0x30c, 0x26, 0x326, 0xe8, 0x295, 0x24e, 0x39a, 0x3e1, 0x3bd, 0x91, 0x265, 0x302, 0x362, 0x1d, 0x2d7, 0x34f, 0x171, 0xfd, 0x2f2, 0x93, 0x2c9, 0x162, 0x16e, 0x286, 0x3dd, 0x3ee, 0xaf, 0x29a, 0x15c, 0x191, 0xd8, 0x12e, 0x32b, 0x356, 0x2fe, 0x37b, 0x392, 0x151, 0x22f, 0xb3, 0x1b, 0x323, 0x1e6, 0x36c, 0x359, 0x1ec, 0x170, 0xab, 0x3c2, 0x195, 0x180, 0x1e7, 0x33a, 0x269, 0xea, 0x239, 0x2e, 0x196, 0x17a, 0x2b7, 0x30, 0x3bb, 0x165, 0xcc, 0x11f, 0xc6, 0x303, 0x334, 0x12d, 0x3d1, 0x6, 0x1f4, 0x2a9, 0x21d, 0x3a4, 0x31e, 0x1e3, 0x262, 0x2a0, 0xfb, 0x306, 0x23a, 0xd4, 0x2c6, 0x270, 0x365, 0x1bf, 0x14e, 0x54, 0x19c, 0x366, 0x145, 0x21e, 0x35e, 0x4e, 0x2e9, 0x3b0, 0x32f, 0x20e, 0x237, 0x36a, 0x2ad, 0x345, 0x36d, 0x30f, 0xdc, 0x76, 0x3e2, 0x347, 0x3c1, 0xac, 0xc9, 0x22, 0xf5, 0x84, 0xd, 0x375, 0x1ac, 0x1ba, 0x80, 0x2bd, 0x51, 0x124, 0x26e, 0x290, 0x289, 0x19e, 0x39d, 0x8f, 0x90, 0x6f, 0xda, 0x304, 0x125, 0x2c2, 0x259, 0x2ab, 0x16b, 0x319, 0x82, 0x3e5, 0x1c3, 0x160, 0x384, 0x398, 0x293, 0x37d, 0xc5, 0x3fb, 0x190, 0x11c, 0x78, 0x14c, 0x1f0, 0x3eb, 0x342, 0x197, 0x258, 0x207, 0x1a2, 0x33b, 0x77, 0x361, 0x1ce, 0x215, 0x228, 0x222, 0x213, 0x1c0, 0x94, 0x2df, 0x3fe, 0x38c, 0x2f1, 0xd2, 0x26d, 0x364, 0x3d2, 0x1f8, 0x282, 0x103, 0x87, 0x1f9, 0x22e, 0x1ca, 0xa5, 0x10c, 0x2aa, 0x1c7, 0x3d0, 0xa0, 0x310, 0x147, 0x16d, 0xf1, 0x234, 0x329, 0x3fd, 0x278, 0x3aa, 0xb4, 0x372, 0x2e8, 0x3c5, 0x6e, 0x76, 0x3cd, 0x107, 0x237, 0x2dd, 0x2a6, 0x21e, 0x2b5, 0x138, 0x365, 0x37e, 0x131, 0x2a0, 0x1f6, 0x3, 0x1f4, 0x15b, 0x66, 0x11f, 0x18c, 0x17, 0x196, 0x2f4, 0x2ce, 0x180, 0x158, 0x324, 0x110, 0x34b, 0xa4, 0x340, 0x19e, 0x333, 0x23c, 0x89, 0x2f9, 0x376, 0xb0, 0x384, 0x339, 0x25e, 0x3de, 0x4b, 0x387, 0xd1, 0x33b, 0xee, 0x19f, 0x26b, 0x118, 0x199, 0x1b2, 0x3d2, 0x3f0, 0x21a, 0xa, 0x62, 0x357, 0x2b2, 0xf1, 0x61, 0xbf, 0x3d7, 0x3c1, 0x1b5, 0x153, 0x21e, 0x163, 0xe9, 0x31e, 0x385, 0x261, 0x17a, 0x2ce, 0x300, 0x323, 0x391, 0x2a5, 0x3dd, 0x3a3, 0x2e2, 0x3e1, 0x2ef, 0x102, 0x56, 0xc9, 0x44, 0x3d4, 0x29, 0xd0, 0x263, 0x3ca, 0x8f, 0x120, 0x1bc, 0x2d9, 0x2c, 0xe1, 0x1cc, 0x293, 0x2f3, 0x314, 0x3e7, 0x136, 0x3c8, 0x23f, 0x361, 0x39c, 0x46, 0x164, 0x268, 0x2f0, 0xfc, 0x282, 0x206, 0x21c, 0x3d3, 0x2a8, 0x13e, 0x11a, 0x329, 0x3f3, 0x1f2, 0x16f, 0x352, 0x283, 0x35e, 0x138, 0x2c3, 0x1e3, 0x19a, 0x25a, 0x2b7, 0xc0, 0x3ce, 0x1e6, 0x1ab, 0x1f5, 0x3ee, 0x2bc, 0x1fa, 0x3bd, 0x244, 0x211, 0x130, 0x2b0, 0x8b, 0x92, 0xd5, 0xad, 0x194, 0x2ab, 0x1a5, 0x1fc, 0xc8, 0x238, 0x3c0, 0x1da, 0x1ce, 0x46, 0x2c8, 0x1b2, 0x3ad, 0x3db, 0xf4, 0xa0, 0x5b, 0x5d, 0x3e6, 0xdc, 0x3b0, 0x14e, 0x2a0, 0x3d1, 0x30, 0x1e7, 0x1e6, 0x356, 0x3dd, 0x34f, 0x39a, 0x337, 0x2a3, 0x8, 0x1ad, 0x51, 0x99, 0x2a1, 0x161, 0xbb, 0x175, 0x133, 0x3fb, 0x249, 0x1e4, 0x23f, 0x2cb, 0x26b, 0x230, 0x26d, 0x18b, 0x157, 0x2e7, 0x3a9, 0x109, 0x2d8, 0x2e8, 0x30f, 0x2e9, 0x1bf, 0x262, 0x12d, 0x2b7, 0x180, 0x323, 0x32b, 0x286, 0x2d7, 0x24e, 0xef, 0x18e, 0x135, 0x40, 0x173, 0x288, 0xc1, 0x125, 0x31a, 0x1d1, 0x3ba, 0x18a, 0x3e7, 0x26c, 0x33b, 0x1dc, 0x275, 0x37c, 0x1a4, 0x34c, 0x43, 0x2aa, 0x315, 0x177, 0x5a, 0x2ed, 0x36d, 0x4e, 0x365, 0x1e3, 0x334, 0x17a, 0x195, 0x1b, 0x12e, 0x16e, 0x1d, 0x295, 0x254, 0x371, 0x6b, 0x1ba, 0x200, 0x38a, 0x6d, 0x201, 0x169, 0x22c, 0x99, 0x14b, 0x18d, 0x1d1, 0x37d, 0x221, 0x307, 0x281, 0x3b1, 0x3f5, 0xbe, 0x22e, 0x24b, 0x11a, 0xbf, 0x347, 0x67, 0x183, 0x1f4, 0x2ca, 0x1b6, 0x2fe, 0x3d5, 0x1cd, 0x337, 0x14f, 0x20, 0x173, 0x119, 0x304, 0x13a, 0x1cc, 0x25e, 0x363, 0xb9, 0x38, 0x94, 0x2d5, 0x247, 0x3ed, 0x159, 0x1e2, 0x308, 0x3cd, 0x2a, 0xfb, 0xc, 0x2f7, 0x1e6, 0x2a5, 0x36f, 0x24e, 0x1de, 0x231, 0x1ba, 0x9, 0x233, 0x368, 0x58, 0x301, 0x1fe, 0x342, 0xa3, 0x30d, 0x309, 0x2a4, 0x206, 0x62, 0x147, 0x37a, 0x37, 0x1d8, 0x14e, 0x149, 0x35f, 0x180, 0x24f, 0xb7, 0x1d, 0x123, 0x142, 0x3be, 0x2b9, 0x325, 0x120, 0x2f9, 0x1c3, 0x312, 0xf8, 0x3b7, 0x8a, 0x4d, 0x178, 0x1f8, 0x3d, 0x50, 0x5b, 0xba, 0x383, 0x2e9, 0x37e, 0x19a, 0x17a, 0x32a, 0x6c, 0x162, 0x2cd, 0x3a0, 0x21, 0x1a, 0x335, 0x39d, 0x71, 0x41, 0x38f, 0x1e, 0x298, 0x33f, 0x2d2, 0xa2, 0xc1, 0x9d, 0x1cc, 0xb5, 0x197, 0x1c1, 0x380, 0x2a4, 0x5, 0x188, 0x22a, 0x3c5, 0x2e9, 0x2f5, 0x261, 0x3c2, 0x2cc, 0x19b, 0x26, 0x11, 0x3a1, 0x290, 0xca, 0x15f, 0x133, 0x3f7, 0xd1, 0x1ee, 0x3fe, 0xbe, 0x55, 0x13e, 0xc2, 0x3e2, 0x2a, 0x1f6, 0x30, 0x395, 0x25f, 0x1d, 0x246, 0x101, 0x1cf, 0x3ca, 0x71, 0x82, 0x227, 0xf0, 0x1da, 0x331, 0x69, 0x34c, 0x10c, 0x2fa, 0xf9, 0x1b5, 0x28a, 0x2a9, 0x330, 0x2bb, 0x3ee, 0x1cd, 0x267, 0x135, 0x100, 0x31d, 0x368, 0xb0, 0x1f, 0x3eb, 0x45, 0x4d, 0x2f0, 0x3e9, 0x1e8, 0x109, 0x372, 0x2d3, 0x270, 0x63, 0x5c, 0x151, 0x179, 0x122, 0x56, 0x241, 0x124, 0x2a1, 0x18d, 0x3a2, 0x1ef, 0x12c, 0x1c, 0x94, 0x1a3, 0x10e, 0x357, 0x1bd, 0x37, 0x3b0, 0x131, 0x25a, 0x195, 0x6c, 0x2c4, 0x326, 0x13f, 0x210, 0x340, 0xeb, 0x16b, 0x1fc, 0x320, 0x3c8, 0x1dc, 0x1c6, 0x3a5, 0x1ca, 0x1ad, 0x288, 0x201, 0x1c2, 0x1fe, 0x113, 0x222, 0x2f0, 0x3db, 0x3a9, 0x5a, 0x345, 0x2c6, 0x11f, 0x1ec, 0xaf, 0x3e1, 0x2a3, 0x40, 0x38a, 0x368, 0x160, 0x7c, 0x367, 0x59, 0x1b2, 0x157, 0x315, 0x3aa, 0x2ad, 0xd4, 0xcc, 0x359, 0x3ee, 0x39a, 0x18e, 0x1ba, 0x24, 0x378, 0x386, 0xa6, 0x33f, 0x46, 0x26d, 0x43, 0x17d, 0xf9, 0x36a, 0x23a, 0x165, 0x36c, 0x3dd, 0x24e, 0x371, 0x358, 0x243, 0x112, 0x38f, 0x78, 0x1da, 0x26b, 0x1a4, 0x256, 0xe4, 0x3ef, 0x237, 0x306, 0x3bb, 0x1e6, 0x286, 0x295, 0x284, 0x1cf, 0x39d, 0x1c4, 0x19, 0x238, 0x23f, 0x275, 0x3d6, 0x1ca, 0x8d, 0x17e, 0x20e, 0xfb, 0x30, 0x323, 0x16e, 0xe8, 0x21, 0x68, 0x33c, 0x2b1, 0x1fc, 0x249, 0x33b, 0x2fb, 0x5f, 0x55, 0x27c, 0x308, 0x32f, 0x2a0, 0x2b7, 0x1b, 0x162, 0x326, 0x27e, 0x52, 0x236, 0x2ab, 0x133, 0x3e7, 0x344, 0x36b, 0x397, 0x3ed, 0x16d, 0x21f, 0x3b0, 0x35a, 0x232, 0x2c, 0x1f, 0x3b7, 0x59, 0x364, 0x155, 0x9e, 0x2de, 0x11d, 0x165, 0x2d1, 0x36f, 0x254, 0x375, 0x3ca, 0x1c4, 0x32, 0xf2, 0x1dc, 0x311, 0x22e, 0x27c, 0x219, 0xa7, 0x12d, 0x32a, 0x360, 0x26, 0x44, 0x26e, 0x161, 0x3a2, 0x3b5, 0x2e4, 0x309, 0x10d, 0xa0, 0x1b9, 0x1af, 0x3a4, 0x7b, 0x253, 0x3e1, 0x14f, 0x100, 0x6f, 0x2e5, 0x53, 0x33f, 0x8c, 0x1a6, 0x218, 0x3fd, 0x31f, 0x306, 0x37f, 0x391, 0x1d, 0x10a, 0x34, 0x33c, 0x16b, 0x3f9, 0x26c, 0x3dc, 0x3cf, 0x3ed, 0x2da, 0x6e, 0x1bf, 0x261, 0x313, 0x93, 0x211, 0x241, 0x99, 0x24a, 0x398, 0x1a1, 0x28c, 0x178, 0x3db, 0x35b, 0x168, 0x21e, 0x33, 0x3a8, 0x3ee, 0x33d, 0x231, 0x1cb, 0x240, 0x3c3, 0x78, 0x3b4, 0x1be, 0x13b, 0x121, 0xbf, 0x20e, 0x1f6, 0xc0, 0x12e, 0x2cd, 0x13f, 0x52, 0x65, 0x2be, 0x18a, 0x207, 0x4a, 0x346, 0x62, 0x22a, 0x30f, 0x2c3, 0x17, 0x151, 0x2bd, 0xda, 0x160, 0x1f0, 0x215, 0x26d, 0x10c, 0x3fd, 0x237, 0x3, 0x3ce, 0x16e, 0x3a0, 0x210, 0x236, 0x2be, 0x314, 0xe, 0x250, 0x5, 0x5b, 0x3b2, 0xe9, 0x239, 0x253, 0x3cb, 0x135, 0x12, 0x2f9, 0xf, 0xed, 0xdf, 0x13b, 0x242, 0x2fc, 0x54, 0x35f, 0x36, 0x302, 0x11, 0x137, 0x161, 0x34d, 0x2cf, 0x30d, 0xfc, 0x1e8, 0x5a, 0x10f, 0x33, 0x359, 0x3a3, 0x1de, 0x358, 0x11e, 0x104, 0x238, 0xee, 0x311, 0x55, 0x1e2, 0xec, 0x262, 0x1e1, 0x322, 0x30c, 0x241, 0x132, 0x13a, 0xff, 0x226, 0x134, 0x2af, 0x223, 0x16f, 0x11d, 0x2ca, 0x356, 0x34e, 0x101, 0x263, 0x35c, 0x3f8, 0x26c, 0x3b1, 0x327, 0x357, 0x1f3, 0x1db, 0x303, 0x2ac, 0x1ed, 0x1, 0x2bd, 0xda, 0x160, 0x1f0, 0x215, 0x26d, 0x10c, 0x3fd, 0x237, 0x3, 0x3ce, 0x16e, 0x3a0, 0x210, 0x236, 0x2be, 0x314, 0xe, 0x250, 0x5, 0x5b, 0x3b2, 0xe9, 0x239, 0x253, 0x3cb, 0x135, 0x173, 0x368, 0x312, 0x33f, 0x230, 0x256, 0x329, 0x20e, 0x3d1, 0x1b, 0x302, 0x22, 0xd5, 0x31a, 0xb5, 0x146, 0x2f0, 0x2e7, 0x3aa, 0x145, 0x165, 0x356, 0x295, 0xd, 0x33c, 0x1a5, 0x3e7, 0x216, 0x346, 0x188, 0x2e8, 0x270, 0x239, 0xaf, 0x337, 0x1ba, 0x120, 0x38f, 0x3c0, 0x275, 0x28f, 0x27c, 0x76, 0x262, 0x3c2, 0x93, 0x56, 0x51, 0x201, 0x20b, 0x367, 0x2c8, 0x43, 0x3fa, 0x237, 0x6, 0x323, 0x362, 0x27e, 0x290, 0xbb, 0x1ef, 0x2e4, 0x3f, 0xf4, 0x5a, 0x21e, 0xcc, 0x2fe, 0x24e, 0x3be, 0x39d, 0x23b, 0x249, 0x1ee, 0x397, 0x357, 0x3e6, 0x365, 0x2e, 0x29a, 0x1d7, 0x40, 0x6f, 0x386, 0x139, 0x26b, 0x13b, 0x8d, 0x3e2, 0x2a0, 0x195, 0x2c9, 0x130, 0x92, 0x125, 0x339, 0x113, 0x134, 0x157, 0x9e, 0x36a, 0x1f4, 0x1e6, 0x1d, 0x21, 0x340, 0x2ab, 0x18a, 0xe, 0xa9, 0x14, 0x2d8, 0x35e, 0x11f, 0x37b, 0x39a, 0x6b, 0x243, 0x82, 0x2e6, 0x1bb, 0xa6, 0x39c, 0x299, 0x8d, 0x3cd, 0x292, 0xb3, 0xc3, 0x241, 0xc1, 0x384, 0x3b7, 0x2c8, 0x86, 0x3f3, 0x19c, 0x60, 0xb1, 0x106, 0x137, 0x18d, 0xb5, 0x28c, 0x3d2, 0x315, 0x2de, 0xfa, 0x1e6, 0x3a, 0x84, 0x236, 0x2ea, 0x12c, 0x380, 0x3d, 0x2d, 0x21e, 0x198, 0x3ea, 0x254, 0x39e, 0x35c, 0x3fb, 0x281, 0x1a3, 0x188, 0x1d9, 0x1d2, 0x1ec, 0x2e2, 0x231, 0x243, 0x104, 0xf2, 0x2fb, 0x1f9, 0x1bd, 0x2e9, 0x20f, 0x14d, 0x1d7, 0x80, 0x1bc, 0xf, 0x3b4, 0x1eb, 0x24b, 0x219, 0x131, 0x3c2, 0x126, 0x158, 0x288, 0x58, 0x1f0, 0x46, 0x291, 0x390, 0x20e, 0x3ab, 0x6c, 0x26, 0x220, 0x296, 0x339, 0x226, 0xd9, 0x2aa, 0x1f2, 0x183, 0x1e7, 0x2dc, 0x13f, 0x290, 0x176, 0x3b5, 0x30d, 0x3f0, 0x2bf, 0x2ad, 0x15b, 0x1ab, 0x295, 0x1a, 0xeb, 0x133, 0x207, 0x250, 0x14, 0x1b9, 0x163, 0xea, 0x3d5, 0x3bc, 0x2f6, 0x388, 0x320, 0x1ee, 0x1c5, 0x2e5, 0x139, 0x1be, 0x394, 0x308, 0x131, 0x38d, 0x91, 0x2d2, 0xda, 0x312, 0xe7, 0x348, 0x8d, 0x393, 0x25a, 0x191, 0x2b, 0xa2, 0x2c, 0x1f0, 0x8c, 0x256, 0xbf, 0xa8, 0x195, 0x336, 0x324, 0xc1, 0x301, 0x2c7, 0x26d, 0x72, 0x287, 0x3d1, 0x6c, 0x4c, 0x92, 0x9d, 0x3fc, 0x59, 0x225, 0x3fd, 0x19c, 0xc0, 0x2c4, 0x22, 0x354, 0x1cc, 0x113, 0xd9, 0x15d, 0x3c1, 0x3, 0x24f, 0x326, 0x34b, 0x2c2, 0xb5, 0x111, 0x353, 0x9e, 0x1b3, 0x37f, 0x16e, 0x13f, 0x129, 0x1d1, 0x197, 0xbc, 0x2e7, 0x2b3, 0x7d, 0x1e6, 0x74, 0x210, 0x194, 0x2f3, 0x1c1, 0x1f8, 0x2bf, 0x153, 0x165, 0x143, 0x10a, 0x340, 0x2be, 0x96, 0x380, 0x7a, 0xb4, 0xd4, 0x1b6, 0x1a7, 0xd, 0xeb, 0x266, 0xe, 0x2a4, 0x140, 0x345, 0x66, 0x1f5, 0x254, 0x335, 0x16b, 0x3e7, 0x4a, 0x5, 0x2d8, 0x163, 0x1d4, 0x34f, 0x1df, 0x333, 0x1fc, 0x1a2, 0x2d5, 0x188, 0x38a, 0x386, 0x1da, 0x3d6, 0x27c, 0x3b0, 0x196, 0x2f2, 0x8, 0x6f, 0xf, 0x2cb, 0x28f, 0x3c4, 0x1bf, 0xab, 0x3bd, 0x40, 0x378, 0x78, 0x275, 0x55, 0x21f, 0x1e3, 0x151, 0x1d7, 0x200, 0x3f6, 0x3c0, 0x38c, 0x2a8, 0xdc, 0x303, 0x29a, 0x2a3, 0x24, 0x38f, 0x23f, 0x5f, 0x16d, 0x2e9, 0x2e, 0xfd, 0x135, 0x120, 0x47, 0x1dc, 0x2f8, 0x37a, 0x365, 0x170, 0x3e1, 0x1ba, 0x112, 0x238, 0x2fb, 0x3ed, 0x3e6, 0x31e, 0x392, 0x337, 0x1cb, 0x82, 0x1e4, 0x3f5, 0x357, 0x30f, 0xc6, 0xaf, 0x18e, 0x243, 0x19, 0x33b, 0x397, 0x28e, 0x4e, 0x239, 0x171, 0x6b, 0x23c, 0xc8, 0x1ee, 0x87, 0x5d, 0x270, 0x1ec, 0x39a, 0x358, 0x1c4, 0x249, 0x36b, 0x31, 0x2e8, 0x3a4, 0x37b, 0xef, 0x2f6, 0x23b, 0x26c, 0x36e, 0x188, 0x36d, 0x11f, 0x3ee, 0x371, 0x39d, 0x1fc, 0x344, 0x346, 0x5b, 0x35e, 0xea, 0x34f, 0x3be, 0xd7, 0x3fb, 0x216, 0x206, 0x2d8, 0x2c6, 0x31d, 0x203, 0x2cb, 0x117, 0x30b, 0x1e3, 0x2a2, 0x355, 0x24, 0x317, 0xee, 0x2f8, 0x2fd, 0x18f, 0x392, 0x267, 0x325, 0x19, 0x27f, 0x247, 0x5d, 0xe9, 0x3b9, 0xef, 0x1e5, 0xfe, 0x344, 0x285, 0x16c, 0x2c6, 0x2bb, 0x12a, 0x263, 0x34a, 0x7, 0x141, 0x212, 0x6a, 0x36c, 0x123, 0x1a0, 0x175, 0xb9, 0xfc, 0x177, 0x28a, 0xf3, 0xe8, 0xa4, 0x2ec, 0x32e, 0x1e9, 0x4f, 0x366, 0x3ce, 0x193, 0x29f, 0x23d, 0x28d, 0x1b2, 0x2fa, 0xce, 0x180, 0x20d, 0x49, 0x13a, 0x3df, 0x332, 0xe4, 0x15, 0x2ce, 0x265, 0x116, 0x16, 0x3e0, 0x69, 0x242, 0x32f, 0x2f4, 0x24c, 0x1ad, 0x2d9, 0x298, 0x37c, 0x9f, 0x1d8, 0x196, 0x1ed, 0x20, 0x378, 0xf0, 0x1c6, 0x2a8, 0x1b8, 0x17, 0xfd, 0x26a, 0x89, 0x238, 0x1ff, 0x3af, 0x30f, 0x18c, 0x2bc, 0x6b, 0x71, 0x320, 0x36b, 0x62, 0x3b2, 0x11f, 0x3d5, 0x1df, 0xd7, 0x3ff, 0x4a, 0x14, 0x1d3, 0x66, 0x3dd, 0x233, 0x1e, 0x275, 0x154, 0x1b8, 0x2e, 0x3f4, 0x374, 0x82, 0x399, 0x327, 0x5d, 0x1d2, 0x2ff, 0x371, 0x26f, 0x3ff, 0x94, 0x50, 0x283, 0x269, 0x34e, 0xd0, 0x175, 0x172, 0x3f0, 0x3aa, 0xfa, 0x25f, 0x27e, 0x2b4, 0x16a, 0x134, 0x2ba, 0x67, 0x180, 0x13, 0x124, 0x1c2, 0x187, 0x291, 0x17e, 0x292, 0x322, 0x2b0, 0x1b4, 0x14c, 0x37c, 0x13e, 0x369, 0xab, 0x2ef, 0x9, 0x38f, 0xee, 0x1f9, 0x3e6, 0x63, 0x15e, 0x6b, 0xe2, 0x9b, 0x36e, 0x229, 0x2b5, 0x359, 0x12a, 0xcf, 0x133, 0x38, 0x3d, 0x2d0, 0x2b6, 0x105, 0x108, 0x259, 0x2cf, 0x2f0, 0x4f, 0x2c5, 0x323, 0x83, 0x1aa, 0x339, 0x228, 0x86, 0x347, 0x35f, 0x19b, 0x8b, 0x16, 0x3c9, 0x1a4, 0x234, 0x29c, 0x22f, 0x204, 0x31d, 0xf, 0x33e, 0xaa, 0xdc, 0x17, 0x1fa, 0x1ba, 0x41, 0x3c8, 0x397, 0x22a, 0xe9, 0x37b, 0x3bc, 0x333, 0x3fb, 0x4a, 0x28, 0x345, 0x330, 0x1a7, 0x68, 0x6f, 0x78, 0x38c, 0x16d, 0x365, 0x392, 0x18e, 0x23c, 0x249, 0x36e, 0x5b, 0x2c6, 0x2fe, 0x284, 0x1d6, 0x4b, 0x3f, 0x177, 0x23a, 0x32b, 0x27e, 0x161, 0x1a1, 0x1b2, 0x3fa, 0xfb, 0xd8, 0x192, 0x201, 0x3e0, 0x1a4, 0x61, 0x262, 0x15c, 0x8, 0x378, 0x3c0, 0x5f, 0x37a, 0x31e, 0xaf, 0x6b, 0x1c4, 0x26c, 0x346, 0x2d8, 0x21d, 0x3dd, 0xd, 0x2ab, 0x258, 0x1f8, 0x3aa, 0x1f4, 0x16e, 0x3d4, 0x31a, 0x113, 0x18b, 0x3ef, 0x3d1, 0x2c9, 0x8b, 0x2c, 0x33f, 0x13b, 0x308, 0x334, 0x2f2, 0x40, 0x3f6, 0x23f, 0x2f8, 0x3e6, 0xc6, 0x171, 0x358, 0x23b, 0x344, 0x206, 0x2ed, 0xcc, 0x2d7, 0x68, 0x175, 0x2e4, 0x3db, 0x16f, 0x3bb, 0x362, 0x29f, 0xe6, 0x8a, 0x43, 0x347, 0x2b7, 0x265, 0x51, 0x160, 0x1ce, 0x1ca, 0x76, 0x196, 0x3bd, 0x200, 0x38f, 0x1dc, 0x3ed, 0x30f, 0x239, 0x39a, 0x2f6, 0x1fc, 0x216, 0x14, 0x345, 0x269, 0x295, 0x340, 0x3ba, 0xde, 0x1e0, 0x5f, 0x2fd, 0x63, 0x171, 0x2b9, 0xfe, 0x216, 0x28, 0x10f, 0x36c, 0x10a, 0xca, 0x363, 0x1e9, 0x278, 0x6, 0x2c4, 0x49, 0x1c2, 0x215, 0x14a, 0x32f, 0x38d, 0x204, 0x6f, 0xf0, 0x22b, 0x37a, 0x235, 0x2bc, 0x358, 0x7f, 0x10b, 0x14, 0x283, 0x1b6, 0x85, 0x65, 0x3b5, 0x2f0, 0x13c, 0x3, 0x162, 0x220, 0xe1, 0x30e, 0xa5, 0x393, 0x3c2, 0x102, 0x233, 0x78, 0x311, 0x1bd, 0x31e, 0x15e, 0x1ac, 0x23b, 0x281, 0xa, 0x345, 0xdb, 0x246, 0x236, 0x3de, 0x178, 0x9e, 0x205, 0xb1, 0x110, 0x274, 0x187, 0x256, 0x3cd, 0x1e1, 0x81, 0x31d, 0x3c, 0x38c, 0x2da, 0x18f, 0xaf, 0xd6, 0x319, 0x344, 0x5, 0x3a6, 0x269, 0x123, 0x11b, 0x1ef, 0xbc, 0x4f, 0x306, 0x25c, 0x88, 0x13a, 0x2c7, 0x12b, 0x3e2, 0x2f4, 0x244, 0x38a, 0x1e, 0x1c6, 0x16d, 0x2c3, 0x253, 0x6b, 0x388, 0x1a2, 0x206, 0x1d3, 0x330, 0x295, 0x289, 0x2f3, 0x5e, 0x1bc, 0x389, 0x2f8, 0x383, 0x7b, 0xef, 0x26f, 0x3c7, 0x141, 0x168, 0x2ca, 0xe8, 0x252, 0x16a, 0x1b2, 0x3f3, 0x3ab, 0x265, 0x144, 0x22d, 0x37c, 0x1e2, 0x3c6, 0xfd, 0x2e1, 0x32, 0x36b, 0x229, 0x185, 0x3dd, 0x34, 0x2ea, 0x30d, 0x38e, 0x2c5, 0x12e, 0x88, 0x274, 0x30e, 0x14a, 0x257, 0x22f, 0x4, 0x2f9, 0x23f, 0x3f2, 0x217, 0x1ec, 0x3bc, 0x1ae, 0x307, 0x10d, 0x1a9, 0x33a, 0x3a0, 0x15a, 0x1a1, 0x2c1, 0x3d7, 0x2b7, 0x186, 0x119, 0xa6, 0x1eb, 0x381, 0x303, 0x3f4, 0x396, 0xc8, 0x1b7, 0xb6, 0x21d, 0x36f, 0xd0, 0x3ba, 0x2f, 0x223, 0x306, 0xb1, 0x220, 0x1c2, 0x23, 0x121, 0x14e, 0xae, 0x10, 0x3f6, 0xee, 0x3d3, 0x4e, 0x3b9, 0x2eb, 0x2b1, 0x7, 0x3d, 0x2ad, 0xf3, 0x29b, 0x161, 0x28d, 0x316, 0x347, 0x2ce, 0x211, 0x6d, 0x298, 0x3a5, 0x21f, 0x17, 0x3cb, 0x243, 0x320, 0x2d5, 0x2d8, 0x66, 0x1a7, 0x340, 0x2f3, 0xbc, 0x9e, 0x378, 0x23f, 0x3ed, 0x4e, 0x37b, 0x3be, 0x1a5, 0x70, 0x3a9, 0x23a, 0x16e, 0x29f, 0x339, 0x2c8, 0x329, 0x12d, 0x91, 0x38a, 0x78, 0x5f, 0x3e6, 0x239, 0xef, 0xd7, 0x307, 0x21a, 0x2ad, 0x1e6, 0x27e, 0x31a, 0x8a, 0x218, 0x54, 0x191, 0x1ad, 0x386, 0x275, 0x16d, 0x31e, 0x171, 0x2f6, 0x3fb, 0xa9, 0x5a, 0x165, 0xe8, 0xad, 0x1a1, 0x18b, 0x347, 0x195, 0x56, 0x368, 0x1da, 0x55, 0x2e9, 0x392, 0x6b, 0x23b, 0x216, 0xa0, 0xd4, 0x286, 0x52, 0x293, 0x134, 0x3fa, 0x3d1, 0x265, 0x288, 0xa6, 0x3d6, 0x21f, 0x2e, 0x337, 0x23c, 0x26c, 0x206, 0x345, 0x36c, 0x21, 0xbb, 0x146, 0x2aa, 0x19c, 0xd8, 0x8b, 0x160, 0x26b, 0x27c, 0x1e3, 0xfd, 0x1cb, 0xc8, 0x36e, 0x2d8, 0xcc, 0x295, 0x236, 0x363, 0x3ad, 0x3c1, 0x180, 0x130, 0x201, 0x33f, 0x1ca, 0x3b0, 0x151, 0x135, 0x82, 0x1ee, 0x188, 0x2c6, 0x3dd, 0x68, 0x3ba, 0x5e, 0x9e, 0x6, 0x2f9, 0xee, 0x357, 0xe9, 0x3a3, 0x263, 0x314, 0xfc, 0x16f, 0x3ce, 0x11, 0x13a, 0x215, 0x242, 0x262, 0x1ed, 0x12, 0x238, 0x327, 0x3b2, 0x359, 0x101, 0x2be, 0x30d, 0x223, 0x3, 0x302, 0x132, 0x1f0, 0x13b, 0xec, 0x2ac, 0x135, 0x104, 0x3b1, 0x5b, 0x33, 0x34e, 0x236, 0x2cf, 0x2af, 0x237, 0x36, 0x241, 0x160, 0xdf, 0x1e2, 0x303, 0x3cb, 0x11e, 0x26c, 0x5, 0x10f, 0x356, 0x210, 0x34d, 0x134, 0x3fd, 0x35f, 0x30c, 0xda, 0xed, 0x55, 0x1db, 0x253, 0x358, 0x3f8, 0x250, 0x5a, 0x2ca, 0x3a0, 0x161, 0x226, 0x10c, 0x54, 0x322, 0x2bd, 0xf, 0x311, 0x1f3, 0x239, 0x1de, 0x35c, 0xe, 0x1e8, 0x11d, 0x16e, 0x137, 0xff, 0x26d, 0x2fc, 0x1e1, 0x1, 0x2f9, 0xee, 0x357, 0xe9, 0x3a3, 0x263, 0x314, 0xfc, 0x16f, 0x3ce, 0x11, 0x13a, 0x215, 0x242, 0x262, 0x1ed, 0x12, 0x238, 0x327, 0x3b2, 0x359, 0x101, 0x2be, 0x30d, 0x223, 0x3, 0x302, 0x1fb, 0x3b8, 0x28e, 0x28b, 0x95, 0x1d6, 0x172, 0x1c7, 0x306, 0x181, 0x132, 0x3e0, 0xe5, 0x369, 0x29a, 0x2e1, 0x190, 0x346, 0x3a6, 0x2d1, 0x108, 0x34d, 0x268, 0x3ef, 0x2ce, 0xac, 0x376, 0x33e, 0x2da, 0xc6, 0x273, 0x1ae, 0xe, 0x3d0, 0x7d, 0x362, 0x354, 0x3df, 0x256, 0xa7, 0x2b8, 0x200, 0x11c, 0x327, 0x36d, 0x17f, 0x1a, 0x3ba, 0x178, 0x1f2, 0x180, 0xc9, 0x58, 0x26b, 0x1e2, 0x20f, 0x337, 0xe2, 0x281, 0xa0, 0x350, 0x3a, 0xad, 0x28d, 0x86, 0x54, 0x24d, 0x2e6, 0x78, 0x17c, 0x217, 0x37b, 0x2e3, 0x266, 0x3f, 0x2b3, 0x3ce, 0x22, 0xe1, 0x8c, 0x61, 0xcb, 0x3ae, 0x112, 0xf7, 0x310, 0x21d, 0x34e, 0x65, 0x32e, 0x155, 0x338, 0x2c9, 0x144, 0x14c, 0x28f, 0x370, 0x32d, 0x358, 0x3f9, 0x152, 0x2d0, 0xf3, 0xf5, 0xe6, 0x164, 0x25b, 0x17a, 0x204, 0x2f9, 0x1dc, 0x147, 0x341, 0x24e, 0xeb, 0xb9, 0x2e7, 0x183, 0x2c4, 0x99, 0x3f6, 0x2fb, 0x5d, 0xea, 0x284, 0x175, 0x5e, 0xf9, 0x180, 0x192, 0x160, 0x37c, 0x21f, 0x170, 0x6b, 0x1fc, 0xa9, 0x2d0, 0x1e6, 0x3d4, 0x339, 0x26d, 0x3e2, 0x22f, 0x40, 0x47, 0x397, 0x36d, 0x2fe, 0x68, 0x1ef, 0x3ad, 0x237, 0xd8, 0x51, 0xa6, 0x28f, 0x2e9, 0xaf, 0x2f6, 0x3e7, 0x21a, 0x145, 0x16e, 0xd5, 0x3eb, 0x256, 0x14e, 0x2f2, 0x24, 0x1e4, 0x31, 0x2c6, 0x2d7, 0x236, 0x32e, 0x2aa, 0xfb, 0x265, 0x6d, 0x1da, 0x2a8, 0x31e, 0x39a, 0xd7, 0xe, 0x3a9, 0x1f4, 0x326, 0x125, 0x30e, 0x8d, 0x334, 0x1d7, 0x112, 0x1ee, 0x5b, 0xcc, 0x85, 0xbb, 0x222, 0x3fa, 0x2b7, 0x56, 0x376, 0x275, 0x37a, 0x239, 0x371, 0x1a5, 0x380, 0x3aa, 0x1e7, 0x22, 0x1c2, 0x230, 0x308, 0xab, 0x135, 0x19, 0x36e, 0x2ed, 0x36c, 0x108, 0x293, 0x1b2, 0x347, 0xb3, 0x1ad, 0xf, 0x5f, 0x30f, 0x37b, 0x1cf, 0x18a, 0x1f8, 0x36a, 0x12e, 0x92, 0x7c, 0x3e5, 0x3fe, 0x2e8, 0x2bb, 0x34, 0x1ef, 0x353, 0xce, 0x2c9, 0x119, 0xed, 0x2a8, 0x235, 0x273, 0x2b1, 0xe0, 0x1d5, 0x1e7, 0x44, 0x301, 0x1a4, 0xec, 0x14d, 0x1cb, 0x9b, 0xa, 0xd4, 0x3a, 0x2b4, 0x8a, 0x1c8, 0xbd, 0x1, 0x3e5, 0x3fe, 0x2e8, 0x2bb, 0x34, 0x1ef, 0x353, 0xce, 0x2c9, 0x119, 0xed, 0x2a8, 0x235, 0x273, 0x2b1, 0xe0, 0x1d5, 0x1e7, 0x44, 0x301, 0x1a4, 0xec, 0x14d, 0x1cb, 0x9b, 0xa, 0xd4, 0x3a, 0x2b4, 0x8a, 0x1c8, 0xbd, 0x1, 0x3e5, 0x3fe, 0x2e8, 0x2bb, 0x34, 0x1ef, 0x353, 0xce, 0x2c9, 0x119, 0xed, 0x2a8, 0x235, 0x273, 0x2b1, 0xe0, 0x1d5, 0x1e7, 0x44, 0x301, 0x1a4, 0xec, 0x14d, 0x1cb, 0x9b, 0xa, 0xd4, 0x3a, 0x2b4, 0x8a, 0x1c8, 0xbd, 0x1, 0x3e5, 0x3fe, 0x2e8, 0x2bb, 0x34, 0x1ef, 0x353, 0xce, 0x2c9, 0x119, 0xed, 0x2a8, 0x235, 0x273, 0x2b1, 0xe0, 0x1d5, 0x1e7, 0x44, 0x301, 0x1a4, 0x3c3, 0x3e3, 0x36d, 0x3ea, 0x289, 0x32e, 0x2ba, 0x3ab, 0x56, 0x1c3, 0x311, 0x30f, 0x1f7, 0xcf, 0x258, 0x38e, 0xc, 0x130, 0xb0, 0x2f1, 0xdc, 0x253, 0x1e5, 0x307, 0x3d0, 0x3e8, 0x106, 0xe1, 0x69, 0x76, 0x14d, 0x396, 0x26c, 0x50, 0x15b, 0x349, 0x73, 0x199, 0x3e2, 0xae, 0x9, 0x1e4, 0xc4, 0x33, 0x85, 0x2ec, 0x268, 0x347, 0x2cc, 0x2e6, 0x3c0, 0x3af, 0x341, 0x254, 0x2be, 0xbc, 0x3c1, 0x6c, 0xa2, 0x139, 0x154, 0x235, 0xef, 0x2d6, 0x309, 0x16f, 0x97, 0x124, 0x3e0, 0x321, 0x3c6, 0x337, 0x319, 0x128, 0x2d0, 0x391, 0x137, 0x3eb, 0x14a, 0xcd, 0x1d7, 0x41, 0x2df, 0x2ed, 0x1ab, 0xa4, 0x1a1, 0x10c, 0x149, 0x81, 0x1fb, 0x1ff, 0x2e8, 0x17f, 0xd0, 0x363, 0x155, 0x1f6, 0x30c, 0x1bb, 0xe3, 0x3e6, 0x3b9, 0x39e, 0x4b, 0x377, 0x205, 0x26, 0x16, 0xdf, 0x21f, 0x1c9, 0x2b9, 0x3e7, 0x7a, 0x7d, 0x326, 0x9d, 0x8c, 0x308, 0x38f, 0x397, 0x35e, 0x2d7, 0x194, 0x222, 0x3ef, 0xb3, 0x173, 0x3c0, 0x357, 0x11f, 0x284, 0x3ba, 0x3ad, 0x19c, 0x265, 0x368, 0x275, 0x3e6, 0x37b, 0x263, 0x258, 0x315, 0x30, 0x192, 0x312, 0x28f, 0x365, 0x39a, 0x2b1, 0x380, 0x16f, 0x12e, 0x99, 0x33f, 0x27c, 0x2e, 0x6b, 0x3fb, 0x21a, 0x23a, 0x326, 0x13a, 0x230, 0x76, 0x29a, 0x243, 0x344, 0x109, 0x33a, 0x3d4, 0x1fe, 0x256, 0x262, 0x1d7, 0x82, 0x36e, 0x345, 0x286, 0xad, 0x8a, 0x329, 0x3c2, 0x40, 0x238, 0x31, 0x21d, 0x85, 0x1d1, 0x1b2, 0x20e, 0x93, 0x6f, 0x1dc, 0x5d, 0x359, 0x68, 0x363, 0x2aa, 0x3d1, 0x56, 0x386, 0x5f, 0x4e, 0x34f, 0x1d6, 0x30d, 0xf9, 0x1b, 0x51, 0x139, 0x2a8, 0xc6, 0x371, 0x133, 0x1f8, 0x366, 0x302, 0x201, 0x26b, 0x21f, 0x392, 0x2f6, 0x307, 0x3a9, 0x3bb, 0x22, 0x20b, 0x13b, 0x1bf, 0x3e1, 0x1c4, 0x94, 0x2d0, 0x32b, 0xd5, 0x367, 0x8d, 0x196, 0x317, 0x247, 0x2c6, 0x123, 0x2ec, 0x1b2, 0x15, 0x24c, 0x378, 0x1ff, 0x3b2, 0x3dd, 0x65, 0x111, 0x3ef, 0x166, 0x1c5, 0x23f, 0x115, 0x3a8, 0x68, 0x2cf, 0x2ba, 0x2b7, 0x169, 0x3c, 0x3ed, 0x341, 0x142, 0x3ba, 0x353, 0x279, 0x30c, 0x2e5, 0x22b, 0x4e, 0x297, 0x351, 0x5e, 0x38b, 0x360, 0x6d, 0x19f, 0x1f3, 0x37b, 0xcf, 0x172, 0x9e, 0x300, 0x22c, 0x139, 0x159, 0x318, 0x3be, 0x314, 0x377, 0x6, 0x260, 0x189, 0x28f, 0x2c3, 0x273, 0x1a5, 0x7e, 0x1b3, 0x302, 0xb, 0x1be, 0xdc, 0x15e, 0x26f, 0x70, 0x35d, 0x97, 0x99, 0x277, 0x1e2, 0x170, 0x2b9, 0x387, 0x3a9, 0x37f, 0x88, 0x7c, 0x394, 0x385, 0x18e, 0x3f8, 0x10d, 0x23a, 0x245, 0xe1, 0x1a4, 0x369, 0x3f4, 0x1c4, 0x128, 0x352, 0x16e, 0x14b, 0x23, 0x308, 0x2a2, 0x325, 0x344, 0x212, 0xf3, 0x29f, 0x3df, 0x242, 0x196, 0x26a, 0x320, 0x14, 0x15b, 0x13f, 0x339, 0x291, 0x131, 0x1d7, 0x227, 0x10e, 0x21d, 0x214, 0x12f, 0x43, 0x292, 0x2, 0x47, 0x21c, 0x33, 0x21, 0x25e, 0x86, 0x12d, 0x4, 0x8e, 0x31, 0x66, 0x42, 0xb5, 0x10c, 0x25a, 0x8, 0x11c, 0x62, 0xcc, 0x84, 0x16a, 0x218, 0xbd, 0x10, 0x238, 0xc4, 0x198, 0x108, 0x2d4, 0x39, 0x17a, 0x20, 0x79, 0x188, 0x330, 0x210, 0x1a1, 0x72, 0x2f4, 0x40, 0xf2, 0x310, 0x269, 0x29, 0x342, 0xe4, 0x1e1, 0x80, 0x1e4, 0x229, 0xdb, 0x52, 0x28d, 0x1c8, 0x3c2, 0x100, 0x3c8, 0x5b, 0x1b6, 0xa4, 0x113, 0x390, 0x38d, 0x200, 0x399, 0xb6, 0x36c, 0x148, 0x226, 0x329, 0x313, 0x9, 0x33b, 0x16c, 0x2d1, 0x290, 0x45, 0x25b, 0x22f, 0x12, 0x27f, 0x2d8, 0x1ab, 0x129, 0x8a, 0xbf, 0x57, 0x24, 0xf7, 0x1b9, 0x356, 0x252, 0x114, 0x17e, 0xae, 0x48, 0x1ee, 0x372, 0x2a5, 0xad, 0x228, 0x2fc, 0x15c, 0x90, 0x3dc, 0x2ed, 0x143, 0x15a, 0x59, 0x1f1, 0x2b8, 0x120, 0x47, 0x31, 0xcc, 0x108, 0x1a1, 0xe4, 0x3c2, 0x200, 0x33b, 0x2d8, 0x356, 0xad, 0x59, 0x3e2, 0x2f2, 0x112, 0x36e, 0x21e, 0xe8, 0xe6, 0x34c, 0x262, 0x2a3, 0xc8, 0x14, 0x165, 0x3d4, 0x3eb, 0x8d, 0xab, 0x1cb, 0x344, 0x5a, 0x32b, 0x2a1, 0x46, 0x76, 0xfd, 0x1c4, 0xa9, 0x145, 0x326, 0x1c2, 0x13b, 0x1e3, 0x18e, 0x3fb, 0xf4, 0x3bb, 0x110, 0x3e0, 0x27c, 0x170, 0x2f6, 0xe, 0x3aa, 0x12e, 0xc1, 0x26b, 0xdc, 0x171, 0x2b1, 0x3f, 0x366, 0x26, 0x160, 0x28f, 0x31e, 0x371, 0x18a, 0x2e7, 0x30, 0x8b, 0x139, 0x16d, 0x1ec, 0x263, 0x2e4, 0xf9, 0xd8, 0x6d, 0x275, 0x30f, 0x34f, 0x2ab, 0x2f0, 0x19c, 0x30c, 0x386, 0x2f8, 0x3a4, 0x284, 0x1ef, 0x2aa, 0x2b7, 0x1ad, 0x3c0, 0x28e, 0x359, 0x340, 0x146, 0x3ef, 0x191, 0x6f, 0x2fb, 0x36d, 0x2d7, 0xbb, 0x1b2, 0x54, 0x81, 0x38f, 0x87, 0x21d, 0x21, 0xb5, 0x218, 0x17a, 0x40, 0x1e4, 0x8e, 0xc4, 0x269, 0xa4, 0x45, 0x17e, 0x2b8, 0x89, 0x36e, 0x35, 0x3a0, 0x339, 0xa5, 0xcb, 0x1ba, 0xd1, 0x2d, 0x32b, 0x14b, 0x118, 0x3b0, 0x3cb, 0xfe, 0x21a, 0x3e8, 0x88, 0x3e0, 0xf1, 0x1c9, 0x39d, 0xe0, 0x1b5, 0x302, 0x58, 0x343, 0x31e, 0x2eb, 0x221, 0x315, 0x300, 0x144, 0x2cb, 0x3c5, 0x3a3, 0x2ab, 0x1e9, 0x279, 0x56, 0x1e, 0x3af, 0xea, 0xd0, 0xa3, 0x3ef, 0x322, 0x1bc, 0x3f5, 0x2b5, 0x246, 0x293, 0x86, 0xbd, 0x40, 0x3c8, 0x16c, 0x356, 0x15a, 0x164, 0x32f, 0x373, 0x208, 0x206, 0x15b, 0x1ea, 0x3eb, 0x11a, 0x2ac, 0x243, 0x25, 0x352, 0x362, 0x274, 0x299, 0x1e3, 0x31c, 0x3f7, 0x3a9, 0x3ce, 0x248, 0x1ce, 0x37, 0x2bc, 0x2b1, 0x7e, 0x183, 0x130, 0x22d, 0x154, 0x239, 0x39e, 0x172, 0xf9, 0x1b0, 0x1b4, 0x38c, 0x9c, 0x12a, 0x3ba, 0x2ae, 0x35f, 0x1ad, 0x389, 0x22a, 0x2fe, 0x65, 0x9a, 0x20e, 0x122, 0x3c3, 0x87, 0x11c, 0x310, 0x36c, 0x252, 0xb2, 0x32f, 0x2ef, 0x32, 0x14, 0x19d, 0x137, 0x30e, 0x3b, 0x1fa, 0x23b, 0x10d, 0x3e8, 0x110, 0x39b, 0x381, 0xaf, 0x35c, 0x7e, 0x306, 0xc9, 0x14c, 0x16d, 0x3b9, 0x271, 0x5e, 0xce, 0x211, 0xf, 0x3af, 0x1d4, 0x340, 0x111, 0x287, 0x91, 0x3c3, 0x10e, 0xcc, 0x29, 0x226, 0x17e, 0x179, 0x224, 0x346, 0x350, 0xf5, 0x3eb, 0x234, 0x2a2, 0x23c, 0x250, 0x28a, 0x106, 0x3e, 0x9f, 0x170, 0x3ca, 0xe0, 0x36a, 0x13, 0x2c0, 0x55, 0x318, 0x39e, 0x2e4, 0x3e4, 0x19b, 0x376, 0x17c, 0x341, 0xd, 0x197, 0x3fd, 0x191, 0x1bc, 0x3e3, 0x2c6, 0x214, 0x16a, 0xe4, 0x313, 0x48, 0x36b, 0x10f, 0x1d0, 0x339, 0x14a, 0x32c, 0x1cb, 0x10b, 0x1a9, 0x362, 0xe1, 0x276, 0x303, 0x1ac, 0x207, 0x3aa, 0xb1, 0xb, 0x3d6, 0x18f, 0x2eb, 0x4b, 0x4f, 0x36, 0x6d, 0x1c6, 0x9c, 0x254, 0x2f3, 0x15d, 0x195, 0x1c5, 0x3b8, 0x36d, 0x238, 0x5b, 0x356, 0x161, 0x26d, 0x262, 0x135, 0x26c, 0x5a, 0x16e, 0x13a, 0x13b, 0x303, 0x358, 0xe, 0x16f, 0x302, 0x160, 0x55, 0x239, 0x263, 0x30d, 0x237, 0x30c, 0xf, 0x357, 0x359, 0x236, 0x134, 0x54, 0x1, 0x238, 0x5b, 0x356, 0x161, 0x26d, 0x262, 0x135, 0x26c, 0x5a, 0x16e, 0x13a, 0x13b, 0x303, 0x358, 0xe, 0x16f, 0x302, 0x160, 0x55, 0x239, 0x263, 0x30d, 0x237, 0x30c, 0xf, 0x357, 0x359, 0x236, 0x134, 0x54, 0x1, 0x238, 0x5b, 0x356, 0x161, 0x26d, 0x262, 0x135, 0x26c, 0x5a, 0x16e, 0x13a, 0x13b, 0x303, 0x358, 0xe, 0x16f, 0x302, 0x160, 0x55, 0x239, 0x263, 0x30d, 0x237, 0x30c, 0xf, 0x357, 0x359, 0x236, 0x134, 0x54, 0x1, 0x238, 0x5b, 0x356, 0x161, 0x26d, 0x262, 0x135, 0x26c, 0x5a, 0x16e, 0x13a, 0x13b, 0x303, 0x358, 0xe, 0x16f, 0x302, 0x160, 0x55, 0x239, 0x263, 0x30d, 0x237, 0x30c, 0xf, 0x357, 0x359, 0x79, 0x16c, 0x286, 0x23d, 0x12b, 0x196, 0x396, 0x4a, 0x145, 0x20c, 0x1f0, 0x3c4, 0x15e, 0x2d6, 0x3db, 0x60, 0x144, 0x275, 0x9c, 0x142, 0x363, 0x3fd, 0x24d, 0x3f6, 0x10e, 0x330, 0x290, 0xb2, 0xa7, 0x2a3, 0x9b, 0x2d, 0x16e, 0x274, 0xe5, 0x2e, 0x1e5, 0x1c0, 0x366, 0x260, 0x298, 0x37a, 0x3d5, 0x2be, 0x157, 0x167, 0x1c5, 0x2fb, 0x2b5, 0x214, 0x1a1, 0x25b, 0x179, 0x82, 0x5, 0x19d, 0xd5, 0x8c, 0x2db, 0x18e, 0x3c7, 0x1d5, 0x162, 0x58, 0x22e, 0x239, 0xcf, 0x2f, 0x19c, 0xac, 0x1e0, 0x5d, 0x3b3, 0x2ec, 0x43, 0x2f4, 0x12, 0x36b, 0x35, 0x13f, 0x3eb, 0xc2, 0x27a, 0x23b, 0x3d, 0x2f7, 0x99, 0xdf, 0x3b6, 0x371, 0x96, 0x278, 0x2c9, 0x2e5, 0x3f2, 0xea, 0x289, 0x9a, 0x54, 0x2, 0xf2, 0x2d8, 0x105, 0x73, 0x256, 0x32c, 0x325, 0x94, 0x28a, 0x11, 0x3e0, 0x381, 0x2bc, 0x1a5, 0x3bf, 0xc0, 0x288, 0xe3, 0x138, 0x284, 0xf2, 0x1b9, 0x1d, 0x398, 0x121, 0x151, 0xe2, 0x282, 0x3bb, 0x248, 0xdf, 0x365, 0x1df, 0xb9, 0x3c1, 0x186, 0x1e, 0x28e, 0x3ea, 0x176, 0x43, 0x1e1, 0x48, 0x36e, 0x350, 0x3a1, 0x30e, 0x1d8, 0x267, 0x3e7, 0x1d5, 0x2c4, 0x160, 0x154, 0x3d8, 0x1d6, 0x3d2, 0x3ab, 0x173, 0x379, 0x2b5, 0x21, 0x28d, 0x2fc, 0x3bd, 0x64, 0x140, 0x32b, 0x9d, 0x276, 0x2e, 0x3ca, 0x309, 0x306, 0x241, 0x3b4, 0x30f, 0x12a, 0x3de, 0x3fa, 0x24d, 0x3e5, 0x31, 0x1b6, 0x15a, 0x26d, 0x19a, 0x374, 0x216, 0x2a6, 0x20c, 0x3e0, 0x30b, 0x2e2, 0x133, 0x38e, 0x36, 0x368, 0x17c, 0x23e, 0x340, 0x9a, 0xa8, 0x8, 0x399, 0x1d3, 0xe8, 0xff, 0x11a, 0x29a, 0x319, 0x3d, 0x1e7, 0x264, 0x2f1, 0x31e, 0x2e3, 0x1c1, 0x237, 0x2b, 0xf0, 0x5d, 0x36f, 0x3a2, 0x218, 0x313, 0x240, 0x346, 0x2b6, 0x137, 0x46, 0x2db, 0x31c, 0x307, 0x2b3, 0x20d, 0x312, 0x2b2, 0x2ff, 0x2ab, 0x1e4, 0x2ed, 0xe8, 0x1fe, 0x61, 0xfd, 0x1fc, 0x3a9, 0x12e, 0x2c, 0x55, 0x1ec, 0x1d6, 0x3ad, 0x2b7, 0x38a, 0x3f5, 0x21d, 0x52, 0x59, 0x14e, 0x135, 0x344, 0x2ad, 0x106, 0x3e0, 0x21f, 0x39a, 0x18a, 0x9e, 0x2c9, 0x386, 0x357, 0x2fe, 0xbb, 0x43, 0x3c2, 0x120, 0x346, 0x165, 0xd5, 0x230, 0x1e3, 0x358, 0x70, 0x366, 0x192, 0x1da, 0x30f, 0x254, 0x363, 0x3ef, 0x91, 0x47, 0x5b, 0x286, 0xe6, 0x294, 0x151, 0x1c4, 0x21a, 0x1e7, 0xc1, 0x3d6, 0xc6, 0x263, 0x5e, 0xfb, 0x1ad, 0x1dc, 0x35e, 0x21, 0x113, 0x3e2, 0x1d7, 0x249, 0x5a, 0x362, 0x20b, 0x27c, 0xaf, 0x1a5, 0x2e7, 0x1b, 0x368, 0x2f8, 0xea, 0x236, 0x1b2, 0x12d, 0x200, 0x36b, 0xd4, 0x3d4, 0x30e, 0x3b0, 0x18e, 0x307, 0x16f, 0x26, 0xa6, 0x37a, 0x34f, 0x3ba, 0x17d, 0x191, 0x3f6, 0x31, 0x36c, 0x161, 0x34c, 0x196, 0x243, 0xa9, 0x1f4, 0x92, 0x26b, 0x365, 0x3be, 0x2e4, 0x3c8, 0x3a6, 0x349, 0x3df, 0x3b, 0x337, 0x3c7, 0x2b3, 0x26, 0x14c, 0x1f3, 0x24e, 0x3de, 0x3f3, 0x91, 0x8e, 0x16c, 0x1d, 0x27b, 0x234, 0xfd, 0x3f8, 0x2bf, 0x162, 0x2c0, 0x2b2, 0x3ee, 0x2ea, 0x2ba, 0x191, 0x3e5, 0xc4, 0x356, 0x23d, 0x14a, 0x151, 0x388, 0x7a, 0x323, 0xb, 0x22e, 0x1ec, 0x3ac, 0x2af, 0x195, 0xde, 0x247, 0x269, 0x15a, 0x1a6, 0x196, 0x8f, 0x2a4, 0x3bb, 0x132, 0x1eb, 0xc6, 0xcf, 0x178, 0x3d1, 0x2e6, 0x3fe, 0x21d, 0xa4, 0x164, 0x262, 0x374, 0x4a, 0x23a, 0x220, 0x331, 0x365, 0x375, 0x382, 0x19c, 0x169, 0xee, 0x35e, 0x42, 0x45, 0x32f, 0x14f, 0x1a2, 0x2ad, 0x20c, 0x39b, 0xdc, 0x1de, 0x12c, 0x3c1, 0x211, 0x1e0, 0x2e8, 0x123, 0x2d4, 0x17e, 0x373, 0x320, 0x5a, 0x2cd, 0x3e, 0x3c4, 0x2e2, 0xc5, 0x9e, 0x19b, 0x203, 0x28e, 0x3b3, 0x34d, 0xe4, 0x2b8, 0x208, 0xa0, 0x25f, 0xe1, 0x24b, 0x32d, 0x2d6, 0x2e7, 0x399, 0x283, 0x27e, 0x187, 0x369, 0x6b, 0x38, 0x2c5, 0x8b, 0x33e, 0xe9, 0x68, 0x9a, 0x149, 0x200, 0x1b7, 0x15b, 0xd5, 0xd2, 0x20f, 0x39d, 0xfc, 0x60, 0x6d, 0x17c, 0x1d4, 0x194, 0x225, 0x38d, 0x112, 0xa, 0x3cc, 0x13a, 0x321, 0x32d, 0x1a5, 0x38e, 0x1b0, 0x386, 0x147, 0x3b3, 0x293, 0x390, 0x1ed, 0xc8, 0x2d, 0x2cd, 0x7c, 0x30b, 0x33d, 0x4b, 0x3e4, 0x211, 0x3c0, 0x3b2, 0x10a, 0x113, 0x393, 0x14f, 0x344, 0x2a6, 0x44, 0x1ce, 0x3b6, 0x375, 0x30d, 0x279, 0x35a, 0x2fb, 0x30a, 0xa4, 0x2c8, 0x19a, 0x396, 0xa9, 0x3d9, 0x132, 0x3d6, 0x318, 0x271, 0x3ad, 0x2ce, 0xde, 0x87, 0x1b6, 0x2c2, 0x256, 0x2ac, 0x388, 0xf4, 0x97, 0x58, 0x2a8, 0x1f7, 0x2ea, 0x17d, 0x24d, 0x317, 0x5b, 0x20a, 0x27b, 0x61, 0x3f4, 0x3ff, 0x3aa, 0x13, 0x14c, 0x3e6, 0x12a, 0x2cf, 0x347, 0x204, 0x3c8, 0x345, 0x13f, 0x2c7, 0x3b0, 0x231, 0x1c, 0x366, 0x33b, 0x21e, 0x3d4, 0x46, 0x1e3, 0x2f6, 0x3f, 0x30, 0x6d, 0x2f8, 0x359, 0xbb, 0x218, 0x15c, 0x19, 0x109, 0x362, 0x7c, 0x21f, 0xef, 0x258, 0x237, 0x2b0, 0x1dc, 0x2c6, 0x52, 0x2c8, 0x334, 0x243, 0x141, 0x1e7, 0x201, 0x55, 0x37b, 0x175, 0x17d, 0x93, 0x47, 0x2d8, 0xe8, 0x3eb, 0x76, 0x18e, 0xe, 0x366, 0x8b, 0x275, 0x3a4, 0x340, 0x1b2, 0x17a, 0x120, 0x206, 0x1e6, 0x13a, 0x24b, 0xaf, 0x133, 0x9e, 0x265, 0x78, 0x2e8, 0x85, 0x113, 0x32f, 0x135, 0x216, 0x23a, 0x92, 0x37c, 0xc6, 0x33c, 0x3ad, 0x195, 0x378, 0x31, 0x356, 0xe6, 0x8d, 0xfd, 0x3fb, 0x3aa, 0x26, 0x139, 0x30f, 0x284, 0x146, 0x54, 0x40, 0x36b, 0x2a9, 0xd5, 0x1a4, 0x2e, 0xd7, 0x3db, 0x1b, 0x376, 0x357, 0x3dd, 0x293, 0x329, 0x3bd, 0x249, 0x2d0, 0x106, 0x33f, 0x2e9, 0x3be, 0x30d, 0xfb, 0x173, 0x3f5, 0xcc, 0xad, 0x34c, 0xab, 0x1c4, 0xf4, 0x12e, 0x27f, 0x6a, 0x29f, 0x69, 0x17, 0xd7, 0x3bf, 0x6c, 0x386, 0x115, 0x34e, 0x1a1, 0x3cd, 0x29e, 0x216, 0x7d, 0x248, 0x3d6, 0x7b, 0x351, 0x2aa, 0x322, 0x227, 0x2d8, 0x1d0, 0x3b7, 0x3b0, 0xd6, 0x1c0, 0x6, 0x119, 0x17c, 0x359, 0x176, 0x72, 0x2f2, 0x190, 0x168, 0x106, 0x277, 0x3b6, 0x1cf, 0xbc, 0x35f, 0x6f, 0x10e, 0x1ab, 0xe6, 0x11a, 0x3f4, 0x3e7, 0x2de, 0xc9, 0x2cb, 0xe9, 0x1a0, 0x1b2, 0x2f4, 0x89, 0x14, 0x25f, 0x301, 0x3c4, 0x33d, 0x12c, 0x237, 0x169, 0x379, 0x21d, 0x129, 0x1a6, 0xab, 0x388, 0x3d0, 0x162, 0x22d, 0x1f3, 0x254, 0x255, 0x2a, 0x40, 0x2df, 0x2b6, 0x2a1, 0x276, 0x1c9, 0x1a5, 0x223, 0x336, 0x78, 0x1d9, 0x214, 0x8a, 0x29c, 0x2e1, 0xa9, 0x37f, 0x304, 0x55, 0x2ff, 0x1dd, 0x3fa, 0x122, 0xf2, 0x345, 0xf5, 0x23, 0x1e3, 0x1e5, 0xfc, 0x180, 0x2d9, 0x3af, 0x3dd, 0x12f, 0xbf, 0x1d7, 0xd1, 0x2a6, 0x110, 0xf7, 0x1a8, 0xd5, 0x299, 0x2e0, 0x1a5, 0x4f, 0xc3, 0x3c0, 0x1af, 0x210, 0x2c8, 0xcb, 0x71, 0xf4, 0xb1, 0x22d, 0x3e6, 0x142, 0x28c, 0x2a0, 0x12, 0x285, 0x1e6, 0xe1, 0xf1, 0x39a, 0x12c, 0x67, 0x1ad, 0x3fe, 0x198, 0x161, 0x14a, 0x13d, 0x3fb, 0x2b3, 0x260, 0x2cb, 0x1d2, 0x289, 0x18b, 0x313, 0x104, 0x109, 0x193, 0x3c9, 0x2e9, 0x2e3, 0xbc, 0x2b7, 0x1bc, 0x62, 0x286, 0xff, 0x219, 0x18e, 0x38, 0x205, 0x288, 0x17c, 0x2bb, 0x1d1, 0x390, 0x373, 0x26c, 0x2a6, 0x220, 0x37c, 0x318, 0x3ac, 0x2aa, 0x24d, 0x8e, 0x2ed, 0x13f, 0x215, 0x1e3, 0x3ca, 0x3f0, 0x1b, 0x1c3, 0x115, 0x295, 0x28d, 0x257, 0x1ba, 0x250, 0x37f, 0x201, 0x154, 0x3d5, 0x1ef, 0x3a7, 0x2, 0x1ee, 0x350, 0x1aa, 0x13b, 0x1c9, 0x34a, 0x9e, 0x186, 0x389, 0x35e, 0x29, 0x199, 0x196, 0xe2, 0x1e8, 0x162, 0x53, 0x3c5, 0x284, 0x111, 0x149, 0x24, 0x103, 0x3cc, 0x1c2, 0x1ee, 0x2a9, 0x2a1, 0x1ca, 0xaf, 0x18a, 0x3c1, 0x2b0, 0x2fb, 0xcc, 0x161, 0x294, 0xfd, 0x3e7, 0x36a, 0x8b, 0x38c, 0xea, 0xbb, 0xe4, 0x3bd, 0x26c, 0x145, 0x92, 0x3d6, 0x1ec, 0x175, 0x3fa, 0x81, 0x33b, 0xd4, 0xd5, 0x13b, 0x392, 0x133, 0xf9, 0x56, 0x1dc, 0x21d, 0xad, 0x256, 0x29a, 0x3fb, 0x16f, 0x192, 0x275, 0x11f, 0x194, 0x218, 0x2f2, 0x249, 0x2ad, 0x110, 0x37c, 0x239, 0x2ab, 0x17d, 0x91, 0x1e4, 0x21e, 0x29f, 0x1a4, 0x170, 0x1a5, 0x9e, 0x30c, 0x23f, 0x2c6, 0x290, 0x34c, 0x151, 0x1fc, 0x3aa, 0x130, 0x2cb, 0x3a4, 0x236, 0x43, 0x15c, 0xc8, 0x2d0, 0x22, 0x26b, 0xc6, 0x1d6, 0x2aa, 0x93, 0x238, 0x345, 0x3d4, 0x230, 0x2e, 0x2b1, 0x315, 0x265, 0x3c0, 0x35e, 0x52, 0x26d, 0xab, 0x23b, 0x177, 0x26, 0x1da, 0x270, 0x340, 0x18b, 0x22f, 0x19, 0x5a, 0x106, 0x1ce, 0x31e, 0x33c, 0x157, 0x191, 0x47, 0x2ed, 0x27e, 0x46, 0x3dc, 0x2b6, 0x125, 0x9f, 0x1cd, 0x258, 0x338, 0x1c5, 0x87, 0x2a5, 0xff, 0x76, 0xd6, 0x21b, 0x180, 0x2e5, 0x22a, 0x85, 0x114, 0x19a, 0x23c, 0x1e8, 0x181, 0x139, 0x9c, 0x1a0, 0x18b, 0x57, 0x64, 0x2d0, 0x44, 0x1be, 0x239, 0x15f, 0x1fd, 0x81, 0x27f, 0x350, 0x2a1, 0x394, 0x2bc, 0x4b, 0x67, 0x2bd, 0x397, 0x2d1, 0x398, 0x308, 0x31c, 0x1c0, 0x30, 0x2d9, 0x147, 0x295, 0x226, 0x131, 0x243, 0x3d, 0xb1, 0xa6, 0x217, 0x34, 0x1b2, 0x38d, 0x208, 0x5a, 0x20c, 0x331, 0xc6, 0x3ac, 0x2ba, 0x91, 0x3c8, 0x6a, 0xd5, 0x276, 0x253, 0x18a, 0x38b, 0x2d2, 0x3f5, 0xdb, 0x73, 0x61, 0x267, 0x38, 0x6, 0xda, 0x3af, 0x2d7, 0x342, 0xa7, 0x1cb, 0x282, 0x97, 0x312, 0x3c5, 0x202, 0x134, 0x2f4, 0x41, 0x109, 0x245, 0xe7, 0x31e, 0x271, 0x155, 0x93, 0x79, 0x10f, 0x29f, 0x348, 0x1c9, 0x133, 0x1f2, 0x158, 0x2fb, 0x198, 0x18d, 0x8d, 0x3b1, 0x2ca, 0x13a, 0x1e2, 0x1de, 0x30d, 0x35f, 0x2f9, 0x5b, 0x3a0, 0x215, 0x303, 0x35c, 0x223, 0x30c, 0xee, 0x33, 0x161, 0x242, 0x3cb, 0xe, 0x3, 0xda, 0x357, 0x34e, 0x226, 0x262, 0x11e, 0x1e8, 0x302, 0xed, 0xe9, 0x236, 0x10c, 0x1ed, 0x26c, 0x11d, 0x132, 0x55, 0x3a3, 0x2cf, 0x54, 0x12, 0x5, 0x16e, 0x1f0, 0x1db, 0x263, 0x2af, 0x322, 0x238, 0x10f, 0x137, 0x13b, 0x253, 0x314, 0x237, 0x2bd, 0x327, 0x356, 0xff, 0xec, 0x358, 0xfc, 0x36, 0xf, 0x3b2, 0x210, 0x26d, 0x2ac, 0x3f8, 0x16f, 0x241, 0x311, 0x359, 0x34d, 0x2fc, 0x135, 0x250, 0x3ce, 0x160, 0x1f3, 0x101, 0x134, 0x1e1, 0x104, 0x5a, 0x11, 0xdf, 0x239, 0x2be, 0x3fd, 0x1, 0x3b1, 0x2ca, 0x13a, 0x1e2, 0x1de, 0x30d, 0x35f, 0x2f9, 0x5b, 0x3a0, 0x215, 0x303, 0x35c, 0x223, 0x30c, 0xee, 0x33, 0x161, 0x242, 0x3cb, 0xe, 0x3, 0xda, 0x357, 0x34e, 0x226, 0x262, 0x36b, 0x33a, 0x1c2, 0x21f, 0x3be, 0x2f0, 0xb3, 0x47, 0x345, 0x29f, 0x13b, 0xaf, 0x4b, 0x19c, 0x38a, 0x31, 0x1d, 0x367, 0x1e3, 0xd7, 0x315, 0x30c, 0x1dc, 0xcc, 0x31a, 0x61, 0x18e, 0x380, 0x180, 0x386, 0x2e8, 0x108, 0x26d, 0x151, 0x3fb, 0x36a, 0x51, 0x2f8, 0x3dd, 0x1a1, 0x14e, 0x243, 0xf4, 0x302, 0x1da, 0x3a4, 0x194, 0xe4, 0x1d7, 0x216, 0x3bb, 0x2c, 0x37a, 0x284, 0x134, 0x3c2, 0x19, 0x2d0, 0x110, 0x3d6, 0x37b, 0x1ef, 0x20e, 0x200, 0x206, 0x16e, 0x3e0, 0x365, 0x33c, 0x2aa, 0x91, 0x33b, 0x2a9, 0x125, 0x27c, 0xef, 0x30d, 0x2b7, 0x3f6, 0x2d8, 0x27e, 0x230, 0x170, 0x133, 0x3c1, 0x1ad, 0x397, 0x356, 0x1fe, 0x3b0, 0x2f6, 0x3db, 0x2c9, 0x3c0, 0x2c6, 0xad, 0x294, 0x3e1, 0xe, 0x6, 0x368, 0x28e, 0x85, 0x59, 0x196, 0x23b, 0x3aa, 0x192, 0x38c, 0x359, 0x293, 0x3e2, 0x1ba, 0x141, 0x12e, 0xa6, 0x4e, 0x340, 0x43, 0x2f2, 0x2df, 0xf3, 0x20b, 0x1b8, 0x335, 0x157, 0x126, 0x399, 0x2a9, 0x24a, 0x1e2, 0x371, 0xbc, 0x25d, 0x47, 0x283, 0x26e, 0x1ca, 0x2e2, 0x172, 0x3d1, 0x2f9, 0x16c, 0x27e, 0x69, 0x1c9, 0x18a, 0x67, 0x1c5, 0x31, 0x3a, 0x187, 0x303, 0x16b, 0x278, 0x2b0, 0x3e3, 0x1ab, 0x1fe, 0x369, 0x3ca, 0x2e7, 0xc3, 0xee, 0xcc, 0x23d, 0x184, 0x6b, 0x7e, 0x6c, 0x78, 0x2b5, 0x252, 0x294, 0x3cb, 0x38, 0x30, 0x2e5, 0x174, 0x108, 0xd3, 0x14d, 0x3e7, 0x2c5, 0x232, 0x357, 0x123, 0x228, 0x196, 0x7f, 0x2b3, 0x8b, 0xbe, 0x3ea, 0x1a1, 0x29c, 0x11e, 0x3a9, 0x4c, 0x33e, 0xea, 0x3a2, 0x1f1, 0x1ba, 0x282, 0xb1, 0x139, 0xe9, 0xca, 0xe4, 0x3ae, 0x4a, 0x1e7, 0x2c0, 0x383, 0x68, 0x316, 0x179, 0x26c, 0x7d, 0x304, 0x16d, 0xa1, 0x9a, 0x3c2, 0x32, 0x352, 0x92, 0x117, 0x3a3, 0x32e, 0x149, 0x89, 0x109, 0x20c, 0x1be, 0x1ec, 0x37d, 0x107, 0x200, 0x1b7, 0x3cc, 0x7c, 0x3b6, 0x271, 0x17d, 0x204, 0x2df, 0x1e6, 0x3e, 0x1db, 0x33c, 0x2ba, 0x102, 0x36b, 0xf3, 0x1f, 0x2e9, 0x19e, 0x15d, 0x81, 0x3b1, 0x27d, 0x20b, 0x370, 0xcf, 0x2aa, 0x244, 0x3dc, 0x33a, 0x301, 0x1b8, 0x263, 0x155, 0x122, 0x1ee, 0x19d, 0x384, 0xdc, 0x335, 0x2ae, 0x91, 0xf7, 0x2ca, 0x1c2, 0x6e, 0x39e, 0x157, 0x24c, 0x27f, 0x165, 0xe1, 0x37, 0x1cf, 0x2af, 0x126, 0x33b, 0x2b6, 0x274, 0x21f, 0x2e3, 0x353, 0x93, 0x399, 0x15b, 0x13a, 0x30b, 0x375, 0x3ad, 0x24d, 0x3c8, 0x2a9, 0x9d, 0x381, 0x3be, 0x3d2, 0x322, 0x1e4, 0x350, 0x24a, 0x3c4, 0x1df, 0x1e9, 0x191, 0xf2, 0x1a8, 0x125, 0x1e2, 0x2eb, 0x2f0, 0x2cc, 0x79, 0xd4, 0x296, 0xf1, 0x371, 0x178, 0x166, 0x238, 0x6a, 0x14b, 0x27c, 0x3bc, 0xbc, 0xb3, 0x11c, 0x35, 0x2a1, 0x13e, 0x1de, 0x5e, 0x25d, 0x8e, 0x21e, 0x354, 0x9f, 0xef, 0x2f, 0x32a, 0x47, 0x36e, 0x32b, 0x3e0, 0x31e, 0x2ab, 0x3ef, 0x40, 0x206, 0x362, 0x1ce, 0x239, 0x3ba, 0x20e, 0x24, 0xa0, 0x106, 0x37c, 0x37b, 0x363, 0x2a0, 0x112, 0x5a, 0x110, 0x28f, 0x34f, 0x146, 0x17a, 0x19, 0x2ad, 0x99, 0x2a8, 0x254, 0x134, 0x22f, 0x249, 0x23a, 0x201, 0x37a, 0xd, 0x18b, 0x2f2, 0x344, 0x3bb, 0x160, 0x30f, 0x340, 0x218, 0x1d7, 0x94, 0x323, 0xa6, 0x270, 0x194, 0x329, 0x135, 0x141, 0x162, 0x1da, 0x11f, 0x1d1, 0x3e2, 0x1cb, 0xf4, 0x26, 0x275, 0x359, 0xb5, 0x14e, 0x23c, 0x177, 0x192, 0x5f, 0x3dd, 0x113, 0x334, 0x23b, 0x16f, 0x51, 0x3ed, 0x295, 0x59, 0xab, 0x3fb, 0x366, 0x6d, 0x28e, 0x21, 0x26d, 0x29a, 0x307, 0x6, 0x376, 0x2e8, 0x52, 0x256, 0x3e1, 0x70, 0x180, 0xf, 0x35e, 0xad, 0x8d, 0x18e, 0x3f, 0xd8, 0x3c0, 0x21d, 0x31a, 0x308, 0x358, 0x3db, 0x265, 0x1dc, 0x269, 0x339, 0x3b0, 0x39d, 0x315, 0x56, 0x3f5, 0x2d5, 0xb7, 0x33f, 0x18c, 0x1dd, 0x20e, 0x48, 0x280, 0x22, 0x3a5, 0x3a3, 0x146, 0x2f4, 0x64, 0x145, 0x182, 0x1bd, 0xd, 0x316, 0x3da, 0x216, 0x3ce, 0x53, 0x270, 0x328, 0xbf, 0x1ba, 0x3d, 0x13, 0x275, 0x2bb, 0x2d4, 0x262, 0x388, 0x2b3, 0x51, 0x3d3, 0x246, 0x2c8, 0x2a2, 0x387, 0x6, 0x2e5, 0x3b2, 0x290, 0x121, 0xc7, 0x3f, 0x1b0, 0x31b, 0xcc, 0x1cc, 0x1d8, 0x39d, 0x223, 0x158, 0x397, 0x105, 0x187, 0x2e, 0x266, 0xce, 0x6f, 0xb6, 0x1ea, 0x13b, 0x2e2, 0x382, 0x195, 0x8e, 0x6a, 0x125, 0x381, 0x2e3, 0x157, 0x122, 0x3b1, 0x1e6, 0xf8, 0x18f, 0x2ab, 0x3d7, 0x100, 0x14, 0x245, 0x1be, 0x37b, 0x2cf, 0x292, 0x82, 0x1a9, 0x248, 0x2a8, 0xa1, 0xd9, 0x15c, 0xd1, 0x3d9, 0x160, 0x217, 0x11b, 0xe4, 0x14f, 0x2a4, 0x162, 0x3b4, 0x75, 0x293, 0x257, 0x11e, 0x177, 0x324, 0x17c, 0x2d7, 0x114, 0x251, 0x3fb, 0x2c5, 0x1b4, 0x5d, 0x1a3, 0x2dc, 0x1ce, 0xf6, 0x3de, 0x2a0, 0x41, 0x1a9, 0x99, 0x2b2, 0x101, 0x18b, 0x3da, 0x25, 0x323, 0x298, 0x341, 0x1d1, 0x393, 0x8f, 0x177, 0x241, 0x1f9, 0x295, 0x164, 0x2a2, 0x307, 0x18, 0x305, 0x35e, 0x2b4, 0xc2, 0x358, 0x377, 0x211, 0x3f5, 0x143, 0x2c7, 0x2e, 0xc5, 0x338, 0x378, 0x372, 0x137, 0x24b, 0x3bc, 0x1e9, 0x93, 0xf7, 0x27d, 0x7c, 0x18f, 0x15f, 0x347, 0x12, 0x140, 0x22, 0x343, 0x297, 0x222, 0x313, 0x9b, 0x1f4, 0xb0, 0x217, 0x236, 0x390, 0x26a, 0x21a, 0x13, 0xe3, 0x2fe, 0x28d, 0x261, 0x1fc, 0x1b3, 0xda, 0x5d, 0x29, 0xa5, 0x337, 0x21b, 0x1b0, 0x23f, 0x330, 0x27b, 0x1bf, 0x35c, 0x1f2, 0x173, 0xc4, 0x29b, 0x1a4, 0x2bc, 0x1c1, 0x195, 0x11c, 0x1a8, 0x13a, 0x6e, 0xcf, 0x17d, 0x4, 0x285, 0x362, 0x331, 0x3d8, 0x363, 0x292, 0x104, 0x2ad, 0x264, 0x2da, 0xd, 0x225, 0x373, 0x94, 0x97, 0x272, 0x11f, 0x346, 0x362, 0x26b, 0x37b, 0x32e, 0x17a, 0xc8, 0x23a, 0x2c, 0x30f, 0x236, 0x329, 0x1ba, 0xf4, 0x130, 0x5f, 0x2d7, 0x59, 0x151, 0x307, 0x30, 0xf, 0x2c6, 0x31a, 0x76, 0x39d, 0x9e, 0x1ad, 0x31, 0x349, 0x1a4, 0x171, 0x30d, 0xb3, 0x1e4, 0x165, 0x20b, 0x365, 0x2ab, 0x347, 0x24, 0x109, 0x110, 0x55, 0x254, 0x1b2, 0x2f2, 0x216, 0x323, 0x139, 0x11f, 0x293, 0x14e, 0x1c4, 0x16f, 0x288, 0x28e, 0x108, 0x256, 0x337, 0x3f, 0x2c9, 0x1dc, 0x36c, 0x3eb, 0x303, 0x133, 0x19c, 0x378, 0x2ed, 0xd5, 0x27c, 0x3be, 0x157, 0x81, 0x36e, 0x16e, 0x1ce, 0x1ec, 0x363, 0x12d, 0x19, 0x145, 0x201, 0x3e6, 0x340, 0xe4, 0x135, 0x21a, 0x26, 0x38c, 0x3dd, 0x8a, 0xab, 0x3e7, 0x6, 0x386, 0x35e, 0x161, 0x308, 0x2f6, 0x315, 0x2b0, 0x87, 0xe8, 0x230, 0xaf, 0x2e4, 0x195, 0x238, 0x2a9, 0x1c2, 0x2e9, 0x1d6, 0x3ef, 0x200, 0xa0, 0x22, 0x28f, 0x24e, 0x285, 0x193, 0x37c, 0x3d5, 0x111, 0x22f, 0xd1, 0x2f7, 0xa6, 0x341, 0x34d, 0x14e, 0x388, 0x1b5, 0x6d, 0xba, 0x148, 0x8d, 0xd6, 0x377, 0x56, 0x327, 0x74, 0x230, 0x15e, 0x382, 0xb3, 0x3c8, 0x19d, 0x7c, 0x235, 0x1dd, 0x54, 0x224, 0x352, 0xc1, 0x2fd, 0x1a0, 0xe4, 0x26a, 0x7a, 0x130, 0xbe, 0x34e, 0x2c8, 0x13d, 0x38, 0x1b, 0x389, 0x330, 0x1fe, 0x3c6, 0x29d, 0x19c, 0x2f9, 0x3a6, 0x2a1, 0x381, 0x335, 0x17d, 0x10, 0xa, 0x106, 0x3a5, 0x127, 0x134, 0x2b8, 0x10b, 0x323, 0x272, 0x75, 0xb5, 0xcd, 0xfe, 0x366, 0x2d9, 0x3b2, 0xad, 0xc2, 0x17b, 0x315, 0x169, 0x21c, 0x349, 0x348, 0x1cd, 0x5e, 0x322, 0xf7, 0x1e6, 0x3c9, 0x318, 0x1ef, 0x149, 0x208, 0x145, 0xb, 0x383, 0x236, 0x25b, 0x2e1, 0x3a9, 0x324, 0x3f2, 0x85, 0xd3, 0x3f4, 0x380, 0x1b0, 0xee, 0x36c, 0x3df, 0x17, 0x18a, 0x1f6, 0x3c3, 0x21e, 0x24a, 0x6e, 0x33c, 0x103, 0x245, 0x3d6, 0x127, 0x268, 0x2f2, 0x4a, 0x25c, 0x2cb, 0x17f, 0x226, 0xab, 0x387, 0x60, 0x78, 0x66, 0x27b, 0x1e3, 0x29d, 0x338, 0x3f6, 0x10f, 0x24a, 0xdc, 0xeb, 0x3d7, 0x24, 0x2d, 0x124, 0x16d, 0x34, 0x39, 0x135, 0x7a, 0x260, 0x2f8, 0x246, 0xd3, 0x3e1, 0x21b, 0x19b, 0x2fb, 0x143, 0x215, 0x392, 0x172, 0x32a, 0x1e4, 0x19d, 0xf8, 0xc6, 0x2f3, 0x149, 0x19, 0x11d, 0x58, 0x4e, 0x259, 0x3cd, 0x23c, 0x2b3, 0x119, 0x5d, 0x148, 0x11a, 0x358, 0x38e, 0x169, 0x31, 0x13f, 0x276, 0xef, 0x3d2, 0x122, 0x36e, 0x1b1, 0xdf, 0x3ee, 0x111, 0x57, 0x344, 0x395, 0x272, 0xea, 0x2d4, 0x261, 0x3fb, 0x3, 0x305, 0x2c6, 0x73, 0x369, 0x2b1, 0x31f, 0xde, 0x2ed, 0x354, 0x381, 0x263, 0x1fd, 0x80, 0xa0, 0x88, 0xaa, 0x284, 0x225, 0x3ae, 0x141, 0x13, 0x311, 0x2d7, 0x164, 0x13d, 0x70, 0x6c, 0x77, 0x36c, 0x3b7, 0x5c, 0x4b, 0x206, 0x106, 0x28f, 0x254, 0x18b, 0x1d7, 0x141, 0x26, 0x5f, 0x295, 0x26d, 0x3e1, 0x3f, 0x265, 0x3f5, 0x1d, 0x230, 0x171, 0x5e, 0x93, 0x36b, 0x16e, 0x26b, 0x3ee, 0x222, 0x15c, 0x216, 0x12e, 0x2cb, 0x2fe, 0x8a, 0x151, 0xe, 0x1b, 0x23f, 0x36c, 0x367, 0x170, 0x258, 0x195, 0x1e4, 0x33a, 0x3e0, 0x239, 0x363, 0x17a, 0x249, 0x3bb, 0xa6, 0x11f, 0xb5, 0x334, 0x3fb, 0x6, 0xf, 0x21d, 0x339, 0x1e3, 0x133, 0xfb, 0x38f, 0xd4, 0x1c2, 0x365, 0x175, 0x54, 0x82, 0x145, 0x2c, 0x4e, 0xbb, 0x32f, 0x1c4, 0x36a, 0x368, 0x36d, 0x161, 0x76, 0xd7, 0x3c1, 0x6f, 0x2ed, 0x2a1, 0x21f, 0x33c, 0x3ef, 0x24, 0x5a, 0x99, 0x37a, 0x340, 0x329, 0x1cb, 0x177, 0x51, 0x28e, 0x52, 0x8d, 0x358, 0x315, 0x1ad, 0x188, 0x3d4, 0x24b, 0x3be, 0x2aa, 0x8, 0x14, 0x22, 0x55, 0x284, 0x43, 0x2a3, 0x21a, 0x130, 0x2f8, 0x85, 0x34c, 0x337, 0x1f8, 0x5, 0x11, 0x55, 0x101, 0x10c, 0x135, 0x1e8, 0x241, 0x357, 0x210, 0x242, 0x358, 0x223, 0x2bd, 0x5b, 0x137, 0x1e2, 0x263, 0x3fd, 0x12, 0x5a, 0x132, 0x1f3, 0x236, 0x2fc, 0x11e, 0x16f, 0xda, 0x3b2, 0x161, 0xec, 0x35c, 0x237, 0x2f9, 0x10f, 0x13a, 0x1db, 0x2be, 0x54, 0x104, 0x11d, 0x160, 0xe9, 0x34d, 0x262, 0x3f8, 0x3, 0xf, 0x33, 0xff, 0x303, 0x314, 0x35f, 0x238, 0x2ca, 0x1f0, 0x239, 0x2cf, 0x1e1, 0x26c, 0x3ce, 0xed, 0x359, 0x226, 0x2ac, 0xe, 0x36, 0xee, 0x356, 0x215, 0x253, 0x30d, 0x322, 0x3b1, 0x16e, 0xdf, 0x3a3, 0x134, 0x1ed, 0x250, 0x302, 0x311, 0x34e, 0x26d, 0x3cb, 0xfc, 0x30c, 0x327, 0x3a0, 0x13b, 0x1de, 0x2af, 0x1, 0x5, 0x11, 0x55, 0x101, 0x10c, 0x135, 0x1e8, 0x241, 0x357, 0x210, 0x242, 0x358, 0x223, 0x2bd, 0x5b, 0x137, 0x1e2, 0x263, 0x3fd, 0x12, 0x5a, 0x132, 0x1f3, 0x236, 0x2fc, 0x11e, 0x16f, 0xa, 0x44, 0x2a8, 0x34, 0x1c8, 0x1cb, 0x1d5, 0x119, 0x2e8, 0x2b4, 0xec, 0x2b1, 0xce, 0x3e5, 0xd4, 0x301, 0x235, 0x1ef, 0xbd, 0x9b, 0x1e7, 0xed, 0x2bb, 0x8a, 0x14d, 0xe0, 0x2c9, 0x3fe, 0x3a, 0x1a4, 0x273, 0x353, 0x1, 0xa, 0x44, 0x2a8, 0x34, 0x1c8, 0x1cb, 0x1d5, 0x119, 0x2e8, 0x2b4, 0xec, 0x2b1, 0xce, 0x3e5, 0xd4, 0x301, 0x235, 0x1ef, 0xbd, 0x9b, 0x1e7, 0xed, 0x2bb, 0x8a, 0x14d, 0xe0, 0x2c9, 0x3fe, 0x3a, 0x1a4, 0x273, 0x353, 0x1, 0xa, 0x44, 0x2a8, 0x34, 0x1c8, 0x1cb, 0x1d5, 0x119, 0x2e8, 0x2b4, 0xec, 0x2b1, 0xce, 0x3e5, 0xd4, 0x301, 0x235, 0x1ef, 0xbd, 0x9b, 0x1e7, 0xed, 0x2bb, 0x8a, 0x14d, 0xe0, 0x2c9, 0x3fe, 0x3a, 0x1a4, 0x273, 0x353, 0x1, 0xa, 0x44, 0x2a8, 0x34, 0x1c8, 0x1cb, 0x1d5, 0x119, 0x2e8, 0x2b4, 0xec, 0x2b1, 0xce, 0x3e5, 0xd4, 0x301, 0x235, 0x1ef, 0xbd, 0x9b, 0x1e7, 0x14, 0x110, 0x16d, 0x340, 0x17e, 0x23c, 0x36a, 0x376, 0x2c6, 0x339, 0x303, 0x4b, 0x195, 0x33b, 0x32b, 0x26b, 0x34f, 0x1b2, 0x1d7, 0x21a, 0x192, 0x357, 0x52, 0x61, 0x39d, 0x3c1, 0x378, 0x21e, 0x1c2, 0x31e, 0x1ef, 0x17a, 0x26c, 0x323, 0x2cb, 0x3dd, 0x2c8, 0x3e1, 0x1f8, 0x56, 0x31, 0x3d4, 0x27c, 0x263, 0x3ef, 0x120, 0x2ad, 0x2c, 0x270, 0x293, 0x334, 0x3e7, 0x180, 0x23f, 0x356, 0x46, 0x171, 0x2f0, 0x81, 0x206, 0x22, 0x2a8, 0x68, 0x329, 0x243, 0x16f, 0x368, 0x35e, 0xe6, 0x1e3, 0x18a, 0x2b7, 0x1e4, 0x1e6, 0x1ce, 0x3ee, 0x134, 0x3bd, 0x141, 0x130, 0x3ed, 0x108, 0x8d, 0x2f6, 0xf9, 0x6f, 0x345, 0x13a, 0x365, 0x3ba, 0x12d, 0x249, 0x1e7, 0x1da, 0x2fe, 0x59, 0xfd, 0x3f, 0x30c, 0x87, 0x27e, 0x24b, 0x1cf, 0x3fa, 0x24, 0x2d0, 0x201, 0x4e, 0x1d1, 0x262, 0x3fb, 0x30, 0x3c0, 0x36c, 0x30e, 0xaf, 0x5e, 0x91, 0x346, 0x106, 0x28, 0x49, 0x37a, 0x65, 0x393, 0x23b, 0x205, 0x3c, 0x269, 0x2c7, 0x253, 0x5e, 0x122, 0x103, 0x22, 0x159, 0x1a0, 0x17e, 0x71, 0x1b3, 0x386, 0x33, 0x3f1, 0x170, 0x1c1, 0x24d, 0x36e, 0x245, 0x22e, 0xd, 0x1c8, 0x325, 0x16f, 0x2d9, 0x163, 0x339, 0x20f, 0x12c, 0xb3, 0x3dc, 0x1b1, 0x3d6, 0xa1, 0x10c, 0x1ba, 0x2ee, 0x232, 0x36d, 0x23d, 0x2f5, 0x18a, 0x167, 0x399, 0x32b, 0xdf, 0x127, 0x18b, 0x14f, 0x3d0, 0x51, 0xba, 0x2b4, 0x3b0, 0x34a, 0x3ec, 0x238, 0x27d, 0xe7, 0x3ee, 0x268, 0x2ef, 0x21a, 0x324, 0x147, 0x290, 0x219, 0x35c, 0x19c, 0x317, 0x2b6, 0x3e0, 0x3d8, 0x111, 0x2f2, 0x152, 0x98, 0x3ed, 0x210, 0x234, 0x39d, 0x38b, 0x1fb, 0xd4, 0x1f, 0x318, 0x32e, 0x57, 0x4a, 0x302, 0xbe, 0x214, 0x294, 0x2b9, 0x278, 0x6f, 0x283, 0xe1, 0x31e, 0x3de, 0x1e1, 0x344, 0x25c, 0x1c6, 0x295, 0x291, 0x231, 0x315, 0x2e6, 0x372, 0x125, 0x50, 0x124, 0x3e6, 0x259, 0x29c, 0x3fb, 0xc0, 0x77, 0x286, 0xd2, 0x1de, 0x2aa, 0x100, 0xb4, 0x201, 0x138, 0x12f, 0x196, 0x7, 0x1b0, 0x3f5, 0x3a0, 0x394, 0x1cf, 0x3f3, 0x240, 0x145, 0x189, 0x23e, 0x113, 0x14d, 0x309, 0x30c, 0x21c, 0x3a1, 0x3c4, 0xeb, 0x15, 0x19, 0x3d9, 0x272, 0x2fe, 0x164, 0x3cb, 0x3db, 0x2d2, 0xb6, 0x2a1, 0x370, 0x2ea, 0x12d, 0x136, 0x24f, 0x275, 0x34e, 0x291, 0x6b, 0x4f, 0x31d, 0x345, 0xe1, 0x235, 0x363, 0x313, 0x25, 0x302, 0x17c, 0x42, 0x8d, 0x3ca, 0x38b, 0x3f6, 0x350, 0xf8, 0x1ec, 0x111, 0x1ed, 0x141, 0xc9, 0x2a7, 0x290, 0x3b, 0x16b, 0xfb, 0x11c, 0x27d, 0x1ce, 0x3a3, 0x364, 0x2a3, 0x3d0, 0xa2, 0x2e8, 0x18d, 0x37e, 0x18a, 0x2ce, 0x27f, 0x16e, 0x1eb, 0xa1, 0x218, 0x2e1, 0x35d, 0x368, 0x163, 0x27b, 0x2e, 0x172, 0x322, 0x36e, 0x83, 0xaa, 0x68, 0xbf, 0x71, 0x366, 0x203, 0x198, 0x367, 0xa0, 0x99, 0x30f, 0x1d1, 0x334, 0x307, 0xd8, 0x3f5, 0x349, 0x24b, 0x263, 0x347, 0x82, 0x1f4, 0x139, 0x2fe, 0x2c8, 0x337, 0x2e7, 0x173, 0x2ed, 0x13a, 0x31e, 0x363, 0x22f, 0x94, 0x26, 0x3ed, 0x52, 0x308, 0x2b1, 0xfb, 0x238, 0x1e6, 0x26b, 0x24e, 0x43, 0x1ba, 0x3aa, 0x368, 0x2c6, 0x1fe, 0x170, 0x30d, 0x91, 0x206, 0x110, 0x37a, 0x194, 0x14e, 0x3fb, 0x180, 0x1dc, 0x1d, 0x13b, 0x3be, 0x3fa, 0x120, 0x145, 0x312, 0xea, 0x8a, 0xfd, 0x1f8, 0x2b0, 0x5b, 0x2a1, 0x2e9, 0x3ba, 0x17a, 0x344, 0x162, 0x5f, 0x21, 0x8d, 0x39d, 0x237, 0x38f, 0x165, 0x33f, 0x3ee, 0x1b2, 0x2a3, 0x3a9, 0x288, 0x36d, 0xe6, 0x303, 0x258, 0x191, 0x36e, 0x106, 0x2a8, 0x340, 0x3e2, 0x23b, 0x6, 0x3c0, 0x356, 0x230, 0xef, 0x2aa, 0x200, 0x2d0, 0x2c, 0x3a4, 0x1a1, 0x151, 0x380, 0x30c, 0x31, 0x29f, 0x21f, 0x2ab, 0x2a0, 0x249, 0x323, 0x275, 0x295, 0x256, 0x140, 0x264, 0x4e, 0x12f, 0x251, 0x70, 0xc3, 0x21c, 0x29f, 0x37, 0x2be, 0x12d, 0xd1, 0xb1, 0x5f, 0x42, 0x234, 0xd7, 0x338, 0x11c, 0x1e6, 0xdf, 0x12a, 0x218, 0x396, 0x1b5, 0x386, 0x198, 0x187, 0x171, 0x353, 0x20, 0x5a, 0xb, 0x1d2, 0x1a1, 0x2a2, 0x21b, 0x56, 0x310, 0x354, 0x2e9, 0x37d, 0x1e1, 0x216, 0x20d, 0x3f2, 0x52, 0x219, 0x2d6, 0x3d1, 0x3c8, 0xb7, 0x3d6, 0x101, 0x390, 0x23c, 0x2c5, 0x3c, 0x36c, 0x8c, 0x273, 0x2aa, 0x9, 0x352, 0x160, 0x23e, 0x45, 0xfd, 0x3f0, 0x2d2, 0x2d8, 0x24a, 0x18f, 0x363, 0x57, 0x250, 0x130, 0x2a7, 0x252, 0x3b0, 0x266, 0x2ce, 0x1ee, 0x2cd, 0x22e, 0x68, 0x2fc, 0x319, 0x6, 0x389, 0x143, 0x1a4, 0x2eb, 0x1fd, 0x120, 0x28a, 0x53, 0x359, 0xb2, 0x39f, 0x2e7, 0x2e6, 0x3a6, 0x1c2, 0x18c, 0xa3, 0x2f2, 0x282, 0x241, 0x5d, 0x2c2, 0x2f5, 0x4b, 0x166, 0x1b7, 0x106, 0x159, 0x11b, 0x32f, 0x280, 0x182, 0x270, 0x2d4, 0x2a2, 0x3f, 0x158, 0xb6, 0x125, 0x18f, 0x2cf, 0x15c, 0x2a4, 0x324, 0x5d, 0x18d, 0x3c6, 0x258, 0x24d, 0x285, 0x110, 0x1f3, 0x176, 0x334, 0x7, 0x19b, 0x87, 0x34b, 0x37, 0x175, 0xbd, 0x281, 0x302, 0x3f2, 0xa4, 0x76, 0x29d, 0x167, 0x1ee, 0x193, 0xaa, 0x340, 0x393, 0x3f8, 0x180, 0x379, 0x1d0, 0x24b, 0x19e, 0x15, 0xc8, 0x395, 0xe3, 0x85, 0x242, 0x333, 0x19c, 0x11c, 0x3cc, 0x37c, 0x142, 0x1c8, 0x23c, 0x183, 0xf0, 0x356, 0xd2, 0x2eb, 0x3fa, 0x89, 0x7d, 0x139, 0x3ea, 0xd3, 0x6b, 0x278, 0x2f9, 0x2a9, 0x39b, 0x3d5, 0x18b, 0xdd, 0x35d, 0x376, 0x66, 0x2c7, 0x171, 0x2af, 0x80, 0x2d0, 0xb0, 0x23e, 0x8a, 0x3f4, 0x3bf, 0x173, 0x3a6, 0x384, 0x239, 0x111, 0x373, 0xf4, 0x144, 0x2d3, 0x339, 0xb8, 0x213, 0x81, 0x50, 0x132, 0x4e, 0x25e, 0x156, 0x380, 0x2b, 0x310, 0x2a1, 0x3b6, 0x3de, 0x22f, 0x109, 0x201, 0x3a4, 0x113, 0xfd, 0x3db, 0x173, 0x345, 0x20b, 0x1ec, 0x134, 0x2a3, 0x177, 0x368, 0x21d, 0x367, 0x171, 0x157, 0x200, 0x2ad, 0x312, 0x359, 0x2c8, 0x18e, 0x9e, 0x378, 0x2a9, 0x33f, 0x34f, 0x43, 0x1cb, 0x36a, 0xf, 0x36c, 0x230, 0x371, 0x3fa, 0x112, 0x1f4, 0x1da, 0x2d7, 0x256, 0x2f6, 0x237, 0x47, 0x1e6, 0x37c, 0x284, 0x329, 0x1c4, 0x6, 0x23f, 0x1d, 0x1ca, 0x263, 0x20e, 0xc8, 0x323, 0x38c, 0x21, 0x61, 0x2b1, 0x3d1, 0x33b, 0x362, 0x55, 0x340, 0x32f, 0x3fb, 0x1b, 0x3f5, 0x27e, 0x3c4, 0x2ab, 0x12d, 0x344, 0x302, 0x3ed, 0x290, 0x3b0, 0x18a, 0xb3, 0x36e, 0x22, 0x37a, 0xbb, 0x334, 0xe, 0x265, 0x31, 0xd5, 0x2e9, 0x1ef, 0x22f, 0xa9, 0x192, 0x5d, 0x31a, 0x303, 0x2e4, 0x91, 0x14, 0x99, 0x4e, 0xb5, 0x151, 0x3f, 0x2b0, 0x2d8, 0x13a, 0xc6, 0x146, 0x3bd, 0xf4, 0x288, 0x35e, 0x1fe, 0x392, 0x2f0, 0x8, 0x212, 0x16, 0x11f, 0x114, 0x39f, 0x315, 0xde, 0x350, 0x33f, 0x297, 0x10c, 0x243, 0x2c5, 0x1e0, 0x286, 0x276, 0x335, 0x20e, 0x190, 0x97, 0x5f, 0x210, 0x3b, 0x133, 0x32a, 0x1b7, 0x22, 0x2fd, 0x2ec, 0x196, 0xe0, 0x2b, 0x5b, 0x24a, 0x63, 0x146, 0x373, 0x3d0, 0x6d, 0x185, 0x3b7, 0x171, 0x2ae, 0x12, 0x145, 0x14c, 0x3ea, 0x34c, 0x2b9, 0x31f, 0x47, 0x3cc, 0x1eb, 0xd, 0x2fc, 0xfe, 0x180, 0x1ff, 0x13f, 0x3c4, 0x15f, 0xbd, 0x216, 0x4c, 0x147, 0x161, 0x3c6, 0x172, 0x91, 0x28, 0x264, 0x270, 0x342, 0x27a, 0x3db, 0x2e6, 0x10f, 0x7c, 0x2ff, 0x2c1, 0x1ba, 0x2de, 0x203, 0x36c, 0x69, 0x1df, 0x3ef, 0x104, 0x2f7, 0x275, 0x10a, 0x234, 0x2b1, 0x3ab, 0xf7, 0x326, 0x159, 0xca, 0x262, 0x207, 0x336, 0x31, 0x1aa, 0x3b6, 0x363, 0x2b8, 0x10d, 0x51, 0x2d3, 0xff, 0x392, 0x1e9, 0x20, 0x2d0, 0x2c0, 0x3a8, 0x2c8, 0x31c, 0x278, 0x3f6, 0x2d, 0x58, 0xea, 0x164, 0x31c, 0xf9, 0x3c3, 0x27d, 0x37c, 0x202, 0x2fc, 0x1fc, 0x209, 0x3e3, 0x3d4, 0x6e, 0x37d, 0x22f, 0x2a4, 0x116, 0x36d, 0xff, 0x32d, 0x3ad, 0x100, 0x153, 0xa6, 0x3ea, 0x291, 0x2f6, 0xce, 0x79, 0x16e, 0x22e, 0x289, 0x14e, 0x387, 0x19b, 0x31, 0x354, 0x2c3, 0x32e, 0x3da, 0x1e8, 0x6d, 0x30a, 0x2c7, 0x39a, 0x2ba, 0x240, 0x1f4, 0x361, 0x123, 0x8d, 0x35c, 0x3ab, 0x1ee, 0x83, 0x2da, 0xbb, 0xcb, 0xe0, 0x56, 0x16c, 0x274, 0x239, 0x9a, 0x14f, 0x3aa, 0x1c3, 0xdb, 0x230, 0x1df, 0x3d7, 0x19, 0x395, 0x311, 0x108, 0x3b, 0x266, 0xb3, 0x1a3, 0x220, 0x30f, 0x25e, 0x2a2, 0x1f8, 0x2bd, 0x283, 0x7c, 0x1f7, 0x316, 0x1cb, 0x1b3, 0xf0, 0x286, 0xe5, 0xcf, 0x54, 0x136, 0x2c4, 0x3ed, 0x252, 0x37e, 0x258, 0x24c, 0x28, 0xc1, 0x1d2, 0x226, 0x3e1, 0x38e, 0xde, 0x2a9, 0xe7, 0x95, 0xe4, 0xe2, 0xc, 0x1dc, 0x5a, 0x160, 0x359, 0x26d, 0x358, 0x237, 0x238, 0x16e, 0x55, 0x236, 0x262, 0xe, 0x30c, 0x5b, 0x13a, 0x239, 0x134, 0x135, 0x16f, 0xf, 0x356, 0x13b, 0x263, 0x54, 0x26c, 0x302, 0x357, 0x161, 0x303, 0x30d, 0x1, 0x5a, 0x160, 0x359, 0x26d, 0x358, 0x237, 0x238, 0x16e, 0x55, 0x236, 0x262, 0xe, 0x30c, 0x5b, 0x13a, 0x239, 0x134, 0x135, 0x16f, 0xf, 0x356, 0x13b, 0x263, 0x54, 0x26c, 0x302, 0x357, 0x161, 0x303, 0x30d, 0x1, 0x5a, 0x160, 0x359, 0x26d, 0x358, 0x237, 0x238, 0x16e, 0x55, 0x236, 0x262, 0xe, 0x30c, 0x5b, 0x13a, 0x239, 0x134, 0x135, 0x16f, 0xf, 0x356, 0x13b, 0x263, 0x54, 0x26c, 0x302, 0x357, 0x161, 0x303, 0x30d, 0x1, 0x5a, 0x160, 0x359, 0x26d, 0x358, 0x237, 0x238, 0x16e, 0x55, 0x236, 0x262, 0xe, 0x30c, 0x5b, 0x13a, 0x239, 0x134, 0x135, 0x16f, 0xf, 0x356, 0x13b, 0x263, 0x54, 0x26c, 0x302, 0x357, 0xb4, 0x189, 0x2fe, 0x291, 0x3ca, 0xfb, 0x27f, 0x83, 0x37a, 0x3a2, 0x2ac, 0x1f8, 0x2e6, 0x6a, 0x33f, 0x95, 0x390, 0x23b, 0x300, 0x3cf, 0x29f, 0x1db, 0x197, 0x3bd, 0x35b, 0x1bb, 0x269, 0x69, 0x2e3, 0x20e, 0x9b, 0x181, 0x357, 0x2c2, 0x17, 0x5e, 0x10, 0x352, 0xa6, 0x3b3, 0x14a, 0xd7, 0x3ab, 0x3b1, 0x22, 0x3c5, 0x25e, 0x29a, 0x3bf, 0x233, 0x2a9, 0x39c, 0x142, 0x17e, 0x3f8, 0x6c, 0x87, 0x1aa, 0x18f, 0x146, 0x3ae, 0x1d5, 0x386, 0x2d1, 0x299, 0x263, 0xa8, 0x1a2, 0x26, 0x115, 0x73, 0x170, 0x1e9, 0x100, 0x145, 0x272, 0x34e, 0x8d, 0x16b, 0x2ce, 0x36e, 0x220, 0x27, 0x1a1, 0x1fa, 0x38e, 0x378, 0x2ca, 0x1be, 0xd, 0x3cd, 0x3f7, 0x2c9, 0x62, 0x296, 0xc6, 0x4d, 0x29e, 0x16f, 0x1e, 0x143, 0x1ca, 0x271, 0x292, 0x216, 0x260, 0x174, 0x339, 0x32d, 0x2af, 0x24, 0x7d, 0x361, 0x85, 0xc2, 0x29d, 0xb3, 0x285, 0x248, 0x270, 0x168, 0x22d, 0x3dd, 0x14a, 0x1ae, 0x2b7, 0x1b7, 0x220, 0x4e, 0x28d, 0x3cb, 0x9e, 0x3c3, 0x3cc, 0x28f, 0x11b, 0xcd, 0x70, 0x158, 0x1d3, 0x7c, 0x3a3, 0x39, 0x1c4, 0xc0, 0x3e3, 0x29f, 0x3b6, 0x255, 0x1d7, 0x1d5, 0x305, 0x356, 0xe5, 0x271, 0x12d, 0x4a, 0x324, 0x36d, 0x3f1, 0x2e2, 0x17d, 0x41, 0x3ce, 0x5f, 0x148, 0x37e, 0x2e4, 0x204, 0xb4, 0x312, 0x3ea, 0xa5, 0xd7, 0x35f, 0x2df, 0x110, 0x27, 0x342, 0x3e1, 0x4f, 0x3e5, 0x1e6, 0x343, 0x289, 0x262, 0x38, 0xac, 0x2ed, 0x3e, 0x3d5, 0x218, 0xe2, 0x60, 0x3f5, 0x34b, 0x1db, 0x32e, 0x2ef, 0x2ee, 0x386, 0x1ab, 0x276, 0x33c, 0x292, 0x25, 0x192, 0x3b2, 0x3fc, 0x171, 0x2ba, 0x224, 0x1e7, 0x22b, 0xa4, 0x1bf, 0x172, 0x102, 0x5a, 0x189, 0x1f5, 0x256, 0x26f, 0x3ab, 0x36b, 0x88, 0x217, 0x1a1, 0x3f4, 0x223, 0x3f6, 0xf3, 0x3a5, 0x340, 0x131, 0x1c, 0x56, 0x372, 0x1f, 0x3ee, 0x2d0, 0xa6, 0x2d7, 0x8d, 0x1a5, 0xb3, 0x206, 0xc1, 0x11f, 0x2c8, 0x358, 0x19c, 0x33b, 0x106, 0x3e6, 0xb5, 0xfd, 0x315, 0x3f6, 0x1e6, 0x28f, 0x236, 0x334, 0x380, 0x1ad, 0x21e, 0x33f, 0x254, 0x17e, 0x3fb, 0x2c9, 0x188, 0x13a, 0x1ec, 0x18b, 0x243, 0x6, 0x2fb, 0x3d4, 0x2e9, 0x32e, 0x1d7, 0x3aa, 0xf, 0x286, 0x24b, 0x2ab, 0x3c2, 0x141, 0x288, 0x21d, 0x46, 0x3be, 0x20e, 0x26c, 0x26, 0x5d, 0x339, 0xaf, 0x2aa, 0x112, 0x1e7, 0x5f, 0x290, 0x1e3, 0x30d, 0x8, 0x2ad, 0x139, 0x295, 0x61, 0x133, 0x191, 0x14, 0x201, 0xea, 0x26d, 0x2f6, 0xfb, 0x1ee, 0x22, 0x30f, 0x1a1, 0x3e1, 0x9e, 0x38f, 0x32b, 0x55, 0x194, 0x196, 0x3f, 0x173, 0xd4, 0x1ce, 0x284, 0x3e2, 0x3e7, 0x265, 0x5b, 0x1c2, 0x37b, 0x43, 0x23c, 0x30, 0x3f5, 0x29f, 0x365, 0x146, 0x2a3, 0x16f, 0x78, 0x1d, 0x27c, 0x175, 0x22f, 0x21a, 0x6d, 0xcc, 0x230, 0x1cf, 0x1a9, 0x298, 0x295, 0xc2, 0xc5, 0x93, 0x140, 0xb0, 0x2fe, 0xa5, 0x35c, 0x195, 0x285, 0x264, 0x11f, 0x199, 0x17b, 0xfb, 0x3dc, 0x88, 0x4e, 0x226, 0xc7, 0x3c1, 0x79, 0x193, 0x37a, 0x12f, 0x27a, 0x315, 0x3e5, 0x391, 0x55, 0x328, 0x251, 0x1f8, 0x31d, 0x2b6, 0x37c, 0xd0, 0x131, 0x70, 0x169, 0x10f, 0x33f, 0xa1, 0x1f1, 0x3e7, 0xc3, 0x16c, 0x20b, 0x3d5, 0x72, 0x23b, 0x36, 0x21c, 0x125, 0x7b, 0x2c1, 0x243, 0xc, 0x3fe, 0x29f, 0x2c3, 0x111, 0x135, 0x2dd, 0x31b, 0x349, 0x37, 0x3b5, 0x3bd, 0x2ee, 0x203, 0x286, 0x9f, 0x2be, 0x22f, 0x3d, 0x1b4, 0x269, 0x348, 0x19e, 0x12d, 0x128, 0x22c, 0x2c6, 0x215, 0x1df, 0x20e, 0xd1, 0x98, 0x2e8, 0x3fc, 0x1cd, 0x3fa, 0x32, 0xb1, 0x357, 0x23d, 0x1c9, 0x157, 0x240, 0x2f7, 0x5f, 0x129, 0x385, 0x5e, 0x80, 0x11d, 0x2cb, 0x42, 0x1d8, 0x258, 0x102, 0x168, 0xa6, 0x1a7, 0x234, 0x133, 0x352, 0x272, 0x85, 0x3b, 0x96, 0x81, 0x168, 0x14c, 0x295, 0x184, 0x314, 0x91, 0x2d, 0x22d, 0x2d7, 0x234, 0x266, 0x93, 0x280, 0x2c0, 0x3dd, 0x242, 0x34a, 0x191, 0x50, 0x58, 0x2fe, 0x14a, 0x16b, 0xb3, 0xa, 0xb, 0x359, 0x12b, 0x1ae, 0x195, 0x103, 0x182, 0xea, 0x1a6, 0x333, 0x2b7, 0x1a3, 0x132, 0x11f, 0x332, 0x1e5, 0x3d1, 0x1b7, 0x124, 0x3a4, 0x164, 0x2b9, 0xfb, 0x3b1, 0x220, 0x270, 0x228, 0xd6, 0x19c, 0xf7, 0x44, 0x4e, 0x45, 0x31c, 0x237, 0x399, 0x20c, 0x30f, 0x28d, 0x267, 0x3c1, 0xf2, 0x245, 0x3e6, 0x2d4, 0x3cb, 0xf9, 0x11c, 0x2cd, 0x37a, 0x25e, 0x1fa, 0x9e, 0x227, 0x2dc, 0x16d, 0x34d, 0x13d, 0x315, 0x3c3, 0x25f, 0x2a8, 0x2ec, 0x2a2, 0x2e7, 0x1fb, 0x3cc, 0x55, 0x259, 0x156, 0x3db, 0x1bc, 0x27d, 0x28f, 0xca, 0x32c, 0x1f8, 0x233, 0x2ca, 0x3d6, 0x11b, 0x261, 0x3f, 0x1c5, 0x15b, 0x37c, 0x1a0, 0xcd, 0x380, 0x2ad, 0x1da, 0x21, 0x3b0, 0x2e4, 0x8, 0x145, 0x2cb, 0x108, 0x1bf, 0x30d, 0x40, 0x23a, 0x275, 0x52, 0x1e3, 0x5e, 0x200, 0x1f4, 0x38c, 0x290, 0x303, 0x2f0, 0x24, 0x3bb, 0x5f, 0xad, 0x2e, 0x3ad, 0x120, 0x1e7, 0x2f8, 0x161, 0x170, 0x157, 0x112, 0x323, 0x3ed, 0x31a, 0x392, 0x2aa, 0x82, 0x12e, 0x357, 0xe6, 0xaf, 0x17d, 0x19, 0x162, 0x28e, 0x339, 0x171, 0x3fa, 0xc8, 0x302, 0x5d, 0x1fe, 0x39a, 0x3ef, 0x249, 0x26, 0x2e8, 0x3eb, 0xef, 0x347, 0x26c, 0x130, 0x36d, 0x367, 0x371, 0x20e, 0x344, 0x192, 0x35e, 0x30e, 0x3be, 0x54, 0x216, 0x8b, 0x2c6, 0x46, 0x1cf, 0x2a0, 0x94, 0x51, 0x21d, 0x230, 0x263, 0x12d, 0xa9, 0x288, 0xcc, 0x1a4, 0x33c, 0x17a, 0x141, 0x6d, 0x269, 0x13b, 0x1d6, 0x3c2, 0x21a, 0x368, 0x36c, 0x1ca, 0x2ab, 0x22f, 0xf4, 0x376, 0x356, 0x24b, 0x175, 0x15c, 0x3a9, 0x386, 0x286, 0x27c, 0x3ba, 0x2f2, 0x177, 0x153, 0x361, 0x108, 0x37e, 0x2f, 0x200, 0x3e8, 0x22b, 0xad, 0x5c, 0x2af, 0x112, 0x24f, 0x3af, 0xe6, 0x15e, 0x1fd, 0xc8, 0x20d, 0x174, 0x3eb, 0x1de, 0x107, 0x344, 0x324, 0x163, 0x46, 0x39e, 0x292, 0xa9, 0x119, 0x330, 0x13b, 0x3ac, 0x313, 0xf4, 0x2e5, 0x143, 0x27c, 0x37d, 0x3da, 0x3aa, 0xf0, 0x3a0, 0xdc, 0x255, 0x29e, 0x366, 0x3b8, 0x34b, 0x31e, 0x268, 0x325, 0x30, 0x327, 0x296, 0x1ec, 0x86, 0x319, 0xd8, 0x310, 0x301, 0x34f, 0x25b, 0x3f7, 0x30c, 0x1d3, 0x39b, 0x284, 0x257, 0x38, 0x1ad, 0x1a8, 0x1be, 0x340, 0x261, 0xfc, 0x6f, 0x27d, 0x22e, 0xbb, 0x2a2, 0x38e, 0x38f, 0x2dc, 0x1bd, 0xb5, 0x3cb, 0x3e4, 0x1e4, 0x20c, 0x27, 0x8a, 0xd6, 0x279, 0x36b, 0x124, 0x28b, 0x26d, 0x333, 0x2ce, 0x206, 0xb, 0x17f, 0x294, 0x34a, 0x24d, 0x109, 0x22d, 0x34e, 0x308, 0x96, 0x204, 0x2ad, 0x3b4, 0x84, 0x1bf, 0x213, 0x100, 0x1f4, 0x2a6, 0x19f, 0x52, 0x385, 0x1e9, 0x120, 0x395, 0x3d3, 0xe6, 0x2bc, 0x3fd, 0x249, 0x98, 0x2d3, 0x30e, 0x2e3, 0x149, 0xa9, 0x232, 0xdb, 0x1ca, 0x2be, 0x2b8, 0x177, 0x3c, 0x1d0, 0xdc, 0xa3, 0x26a, 0x306, 0x3fe, 0x1aa, 0x239, 0x225, 0x388, 0xd8, 0x229, 0x1f, 0x24e, 0x1f1, 0x207, 0x2b0, 0x6a, 0xdf, 0x340, 0xcb, 0x3f0, 0x378, 0x391, 0x159, 0x293, 0x3f4, 0x1f2, 0x1e4, 0x11, 0x9c, 0x59, 0x17b, 0x3ab, 0x346, 0x304, 0x2bb, 0x294, 0x29d, 0x126, 0x5a, 0x298, 0x10a, 0x3b0, 0x382, 0x80, 0x1f4, 0x22b, 0x15a, 0x170, 0x155, 0x104, 0x162, 0x22a, 0x3fc, 0xef, 0x107, 0x281, 0x8b, 0x30a, 0x69, 0x33c, 0x1e1, 0x3d, 0x376, 0x143, 0xf1, 0x1ef, 0x2ef, 0x2de, 0x23f, 0x1ea, 0x2c3, 0x134, 0x325, 0x60, 0x87, 0x9d, 0x2ff, 0xe4, 0x3f9, 0xc3, 0x2ed, 0x39b, 0x101, 0x14e, 0x1c0, 0x2e6, 0x165, 0x343, 0x328, 0x151, 0x38e, 0x317, 0x362, 0x145, 0x275, 0x290, 0x2e, 0x157, 0x82, 0x162, 0x5d, 0x3eb, 0x371, 0x54, 0x94, 0x288, 0x269, 0x1ca, 0x175, 0x2f2, 0x3aa, 0x3c0, 0x27e, 0x365, 0x134, 0x243, 0x180, 0x31, 0x1c2, 0x34f, 0x17e, 0x307, 0x2b0, 0xd4, 0x37c, 0x236, 0xab, 0x2e7, 0x38f, 0x362, 0x3e6, 0x113, 0x6b, 0xfb, 0x36e, 0xc1, 0x359, 0x294, 0x133, 0x91, 0x2d0, 0x1da, 0x108, 0x1e3, 0x2f0, 0x120, 0x323, 0x357, 0x339, 0x39a, 0x347, 0x344, 0x8b, 0x21d, 0x1a4, 0x1d6, 0x22f, 0x3a9, 0xf, 0xe8, 0xdc, 0x146, 0x1ba, 0x6, 0x397, 0x125, 0x37b, 0xe4, 0x3fb, 0x30c, 0x345, 0x1ce, 0x68, 0x334, 0x1f8, 0x378, 0x32b, 0x16d, 0xb5, 0x337, 0x237, 0x1ee, 0x92, 0x11f, 0x34c, 0x2b1, 0x191, 0x109, 0xa6, 0x85, 0x3b0, 0x30d, 0x200, 0x3bb, 0x2f8, 0x31a, 0xaf, 0x3fa, 0x249, 0x130, 0x35e, 0x46, 0x263, 0x17a, 0x21a, 0x376, 0x286, 0x3c4, 0x363, 0x2a3, 0x366, 0x2fb, 0xd5, 0x28a, 0x1c6, 0xad, 0x2e0, 0x2ba, 0xc8, 0x4c, 0x1af, 0x46, 0xcf, 0x1e1, 0xf4, 0x305, 0x74, 0xdc, 0x28c, 0x2e1, 0x30, 0x10e, 0xe1, 0x34f, 0x2fc, 0x7, 0x1ad, 0x15b, 0x343, 0xbb, 0x13d, 0x278, 0x1e4, 0x44, 0x1d2, 0x26d, 0x1ae, 0x2cc, 0x109, 0x14c, 0x214, 0x1bf, 0xbc, 0x90, 0x323, 0x2a7, 0xff, 0xef, 0x15, 0x4a, 0x288, 0xdb, 0x321, 0x3ba, 0x373, 0x1b5, 0x1dc, 0x137, 0x318, 0x43, 0x7f, 0x336, 0x2ed, 0x277, 0x34, 0x334, 0x3f0, 0x1fb, 0x16e, 0x2fd, 0x28d, 0x6b, 0x1f6, 0x1a3, 0x201, 0x1f5, 0x234, 0x4b, 0x2, 0x11d, 0x38c, 0x15a, 0x1c9, 0x17d, 0x190, 0x98, 0x35e, 0x8c, 0x19e, 0x3c2, 0x1e8, 0x203, 0xe8, 0x1b8, 0x111, 0x1cb, 0x60, 0x21c, 0x1c2, 0x297, 0x1f1, 0xe, 0x35a, 0x2b6, 0x28f, 0x176, 0x27a, 0xf9, 0x3c8, 0x88, 0x3a4, 0xd3, 0x35c, 0x191, 0x212, 0x298, 0x21, 0x37e, 0x178, 0x120, 0x24f, 0x147, 0x1fe, 0x11d, 0x311, 0x161, 0x253, 0x3fd, 0x26c, 0x241, 0x33, 0x13b, 0x2be, 0x1ed, 0x16f, 0xee, 0x137, 0x239, 0x10c, 0x3f8, 0x30c, 0x10f, 0xdf, 0x236, 0x2ac, 0x223, 0x238, 0x11, 0xe9, 0x26d, 0x35c, 0x322, 0x5a, 0xed, 0x210, 0x303, 0x2af, 0x104, 0x302, 0x3b2, 0x215, 0x263, 0x1e1, 0x1e8, 0xf, 0x3a0, 0x1db, 0x134, 0x11e, 0x36, 0x5b, 0x1f0, 0x101, 0x262, 0xfc, 0x2f9, 0x16e, 0x1f3, 0x226, 0x358, 0x35f, 0x5, 0x160, 0x34e, 0xec, 0x30d, 0x12, 0x3ce, 0x357, 0xff, 0x1de, 0x54, 0x250, 0xda, 0x356, 0x1e2, 0x2cf, 0x135, 0x3, 0x327, 0x13a, 0x3a3, 0x2fc, 0xe, 0x2bd, 0x2ca, 0x55, 0x34d, 0x3cb, 0x237, 0x3b1, 0x132, 0x359, 0x242, 0x314, 0x1, 0x11d, 0x311, 0x161, 0x253, 0x3fd, 0x26c, 0x241, 0x33, 0x13b, 0x2be, 0x1ed, 0x16f, 0xee, 0x137, 0x239, 0x10c, 0x3f8, 0x30c, 0x10f, 0xdf, 0x236, 0x2ac, 0x223, 0x238, 0x11, 0xe9, 0x26d, 0x23a, 0x5f, 0x31a, 0x171, 0x347, 0x216, 0x288, 0x36c, 0x27c, 0x363, 0x135, 0x6, 0x87, 0x1c2, 0x24e, 0x32f, 0x380, 0x6f, 0x32b, 0x37a, 0x113, 0x358, 0x2b7, 0x14, 0x312, 0x85, 0x1bf, 0x2f0, 0x112, 0x162, 0x2e8, 0x30e, 0x263, 0x3c2, 0x3a9, 0x78, 0x27e, 0x31e, 0x18b, 0x23b, 0x265, 0x345, 0x26b, 0x236, 0x151, 0x9e, 0x1e4, 0x110, 0x11f, 0x256, 0x133, 0x81, 0x145, 0x38c, 0x161, 0xaf, 0x3ef, 0x344, 0x51, 0x269, 0x24b, 0x1ef, 0x2a3, 0x306, 0x397, 0x13a, 0x34f, 0x3e2, 0x70, 0x38a, 0x1e6, 0x16d, 0x1a1, 0x6b, 0x3d1, 0x206, 0x160, 0x295, 0x3b0, 0x5e, 0x120, 0x12e, 0x5d, 0x367, 0x1cf, 0x17a, 0xf4, 0xf, 0x349, 0x365, 0x1b2, 0x1c4, 0x2c9, 0x2ed, 0x1ce, 0x340, 0xab, 0x315, 0x238, 0x22, 0x3a4, 0x34c, 0x1a5, 0x91, 0x2ad, 0x275, 0xad, 0x392, 0x3fa, 0x26c, 0x8b, 0xcc, 0x1ca, 0x3ba, 0x1d7, 0x366, 0x3f5, 0x125, 0x3ee, 0x17e, 0x7d, 0x17c, 0xe6, 0x33d, 0x2a, 0xa9, 0x2d9, 0x20a, 0xdc, 0x4d, 0x11e, 0xd8, 0x1b9, 0xe7, 0x340, 0x156, 0x4f, 0x1e4, 0x220, 0x75, 0x294, 0x314, 0x4, 0x1f4, 0x1f9, 0x398, 0xef, 0xa8, 0x2a4, 0x376, 0x3a, 0x370, 0x134, 0x71, 0x360, 0x2ed, 0x39c, 0x11b, 0x151, 0x13c, 0x399, 0x92, 0x1d4, 0x242, 0x4b, 0x10, 0x3d9, 0x3ed, 0x27b, 0x3bc, 0x2a0, 0x282, 0x1c3, 0xe8, 0x1db, 0xd9, 0x1c4, 0x19b, 0x3a6, 0x26b, 0x65, 0x14d, 0xf9, 0x27f, 0x248, 0x359, 0x11a, 0x12c, 0x40, 0x37f, 0x3af, 0x1fe, 0x2eb, 0x292, 0x21a, 0x305, 0x3a0, 0x365, 0x364, 0x319, 0x265, 0x283, 0x1be, 0x194, 0x13d, 0x3e4, 0x1ee, 0x132, 0x17f, 0x61, 0xb9, 0x100, 0x1e7, 0x2a7, 0x3f1, 0x3be, 0x25a, 0x7a, 0xf, 0x29b, 0x18f, 0x18b, 0x7f, 0x186, 0x21e, 0x2f1, 0x259, 0xfd, 0x38b, 0x3b1, 0xc1, 0x1f5, 0x184, 0x2e4, 0x9, 0x395, 0x28e, 0x3df, 0x2e3, 0x17a, 0xfa, 0x1f9, 0x339, 0x3bc, 0x149, 0x21a, 0x203, 0x29b, 0x31e, 0x225, 0x3f8, 0x56, 0x350, 0x117, 0x293, 0xc7, 0x1f6, 0x206, 0x189, 0x10a, 0x1e3, 0x2af, 0x32, 0x130, 0x30a, 0x276, 0x3ba, 0x355, 0x205, 0x87, 0x301, 0xa1, 0x262, 0x3e9, 0x317, 0x106, 0x1d2, 0x291, 0x133, 0x204, 0x7d, 0x2f8, 0x398, 0x1de, 0x2a0, 0x10d, 0x305, 0x349, 0x18f, 0x316, 0x1fc, 0x2b, 0x1a8, 0x28f, 0x34d, 0x267, 0xfb, 0x103, 0x2c0, 0x85, 0x2f5, 0x353, 0x19, 0x98, 0x185, 0x13b, 0x1dd, 0x3ae, 0x306, 0x247, 0x384, 0x254, 0x131, 0x3f0, 0x38f, 0x83, 0xe9, 0x34c, 0x29d, 0x102, 0x23a, 0x17c, 0x1cc, 0xef, 0x150, 0x282, 0x386, 0x3a0, 0x2c3, 0x18b, 0xfe, 0x211, 0xd4, 0x343, 0x3a2, 0x337, 0x279, 0x285, 0x160, 0x246, 0x37e, 0x3ad, 0x208, 0x4c, 0x2c6, 0x299, 0x2ea, 0x1d7, 0x183, 0x327, 0x1c2, 0x12a, 0x29c, 0x1f8, 0x3c3, 0x245, 0x270, 0x1a6, 0x34a, 0x81, 0x1f4, 0x3ed, 0x1fe, 0x3be, 0x17a, 0x3a9, 0x3c0, 0x29f, 0x1ec, 0x329, 0xe, 0x38a, 0x32b, 0x3e6, 0x59, 0xd7, 0x93, 0x2ad, 0x38c, 0x31a, 0x39a, 0x54, 0x141, 0x386, 0x349, 0x31e, 0x43, 0x3fb, 0x2b0, 0x165, 0x2a8, 0x1a1, 0x358, 0x195, 0x109, 0x1da, 0x290, 0x392, 0x3ef, 0x216, 0x6d, 0x286, 0xdc, 0x134, 0x1c4, 0x265, 0x21e, 0x3d6, 0x1d1, 0x337, 0xfb, 0x206, 0x312, 0x21, 0x303, 0x2aa, 0x249, 0x8b, 0x269, 0x27c, 0x32e, 0x1cb, 0x1b, 0x2d8, 0x1ce, 0x236, 0x29a, 0x3c1, 0x36b, 0x201, 0x2d7, 0x3b0, 0x2f0, 0x82, 0x26, 0x2c6, 0x13b, 0x3ba, 0x2a3, 0x6, 0x31, 0x7c, 0xd, 0x196, 0x315, 0x1e4, 0x92, 0x359, 0x61, 0x2e4, 0x24, 0x12e, 0x2e8, 0x46, 0x1d6, 0x2f2, 0x36a, 0x3f5, 0x13a, 0x24e, 0x14e, 0x1f8, 0x38f, 0x106, 0x3a4, 0x256, 0x18a, 0x8, 0x3bb, 0x357, 0x3eb, 0x1cf, 0x3c2, 0x177, 0x23f, 0xd5, 0x37b, 0x17e, 0x70, 0x6f, 0x3e8, 0x3af, 0x3eb, 0x39e, 0x313, 0x3aa, 0x3b8, 0x296, 0x34f, 0x257, 0xfc, 0x38f, 0x20c, 0x28b, 0x294, 0x96, 0x100, 0x323, 0xba, 0x23, 0x1d6, 0x1ed, 0x1b3, 0x397, 0x384, 0x142, 0x334, 0x1c7, 0xf2, 0x92, 0x2bb, 0x184, 0x30d, 0x240, 0x181, 0x35e, 0x348, 0x1dd, 0x2a3, 0xc, 0xc4, 0x3e0, 0xd0, 0x2ac, 0xf9, 0x3dc, 0x304, 0x2d7, 0x369, 0x3d2, 0x19, 0x260, 0x66, 0x24b, 0x2cf, 0x2e1, 0x1b, 0x1b9, 0x331, 0x194, 0x1fa, 0xce, 0x346, 0x2c0, 0x214, 0x303, 0x15d, 0x136, 0x51, 0x2d1, 0x30b, 0x222, 0x71, 0x336, 0x21e, 0x3a5, 0x34d, 0x18e, 0x3ab, 0x50, 0x139, 0xa4, 0x1c9, 0x3ef, 0x25, 0x1b4, 0x1d, 0x1db, 0x2c1, 0x1fc, 0xac, 0x2b6, 0x2a8, 0x342, 0x17b, 0xb3, 0xb4, 0x33e, 0x161, 0x2e2, 0x2a, 0x141, 0x305, 0x13f, 0xc6, 0x39, 0x387, 0x173, 0x3cc, 0x1f3, 0x59, 0x1ae, 0x24c, 0x145, 0xbe, 0x398, 0x371, 0x25a, 0x3d0, 0x3c0, 0x3d9, 0x2a7, 0x367, 0x19e, 0x2b8, 0x36a, 0x3cf, 0x384, 0x284, 0xcb, 0x223, 0x33b, 0x264, 0x3b3, 0x3b0, 0x3d2, 0x32, 0x192, 0x330, 0xf1, 0x146, 0x11e, 0x19b, 0x21e, 0x343, 0x12f, 0x6b, 0x2ce, 0x212, 0x2cb, 0x2b4, 0x2e2, 0x54, 0x10d, 0x1e, 0x3d4, 0xf6, 0x25b, 0x70, 0x1bc, 0x2cd, 0x270, 0x12b, 0x314, 0x40, 0x395, 0xba, 0x46, 0x351, 0x373, 0x306, 0x21c, 0xf8, 0x68, 0x2ac, 0x1f2, 0x36b, 0x16, 0x123, 0x1e3, 0x155, 0x9b, 0x51, 0x1ab, 0x37, 0x134, 0x319, 0x211, 0x2a9, 0x154, 0x342, 0x2f6, 0x2cc, 0x1a9, 0x38c, 0x73, 0x1de, 0x12d, 0x3d0, 0x389, 0xd5, 0x1f7, 0x3cd, 0x3f, 0x3c3, 0x20c, 0x11f, 0x242, 0xb9, 0x24, 0xb1, 0x2d3, 0x1a4, 0x1dd, 0x14f, 0x30, 0x229, 0x277, 0x236, 0x27a, 0x67, 0x346, 0x189, 0x42, 0x2e, 0x1fd, 0x281, 0x6d, 0x20a, 0x1db, 0x18b, 0x3f9, 0x169, 0x33a, 0x1bd, 0x114, 0xd7, 0x24c, 0x28a, 0x2f8, 0x3bb, 0x28e, 0x30e, 0x1d6, 0x3bd, 0x306, 0x31, 0x3e0, 0x340, 0x29a, 0x237, 0x346, 0x312, 0x108, 0x170, 0x3ef, 0x94, 0x376, 0x349, 0xc6, 0xe4, 0xe, 0x6f, 0x362, 0x270, 0x256, 0x4b, 0x200, 0x12e, 0x36d, 0x1a4, 0x3ba, 0x135, 0x180, 0x2d8, 0x26b, 0xbb, 0x337, 0x3d1, 0xa0, 0x1da, 0xad, 0x171, 0x54, 0x21a, 0x78, 0x29f, 0x37b, 0x3e2, 0x3f, 0x38f, 0x22, 0xea, 0x61, 0x30d, 0x112, 0x26, 0x21d, 0x24b, 0x32e, 0x243, 0x2c9, 0x21e, 0x28f, 0xb5, 0x358, 0xb3, 0x2d0, 0x38c, 0xe6, 0x371, 0x17a, 0x177, 0x1dc, 0x125, 0x24e, 0x262, 0x2e7, 0x1e4, 0x99, 0x3dd, 0x3b0, 0x3ad, 0xc8, 0x8b, 0x36c, 0x21f, 0x134, 0x23b, 0x56, 0x165, 0x16d, 0x8a, 0xd7, 0x91, 0x23a, 0x3ed, 0x3eb, 0x263, 0x15c, 0x36a, 0x397, 0x20b, 0xd, 0xab, 0xf9, 0x36b, 0x2c, 0x85, 0x303, 0x17d, 0x344, 0x6d, 0x1d, 0x365, 0x43, 0x3e7, 0x173, 0x32b, 0x30f, 0x37f, 0x22a, 0x46, 0x15f, 0x355, 0x30, 0xb6, 0x331, 0xbb, 0x267, 0x35f, 0x109, 0x19f, 0x18d, 0xef, 0x25a, 0x2bf, 0x1dc, 0x24a, 0x12a, 0x334, 0x223, 0xf7, 0x201, 0x123, 0x385, 0x17d, 0x281, 0x1b4, 0xe8, 0x235, 0x72, 0xe, 0xde, 0x193, 0x3a4, 0x121, 0x172, 0x120, 0x20d, 0x30a, 0x24b, 0x255, 0x11e, 0x265, 0x1a8, 0x154, 0x113, 0x333, 0x24c, 0x23a, 0x3d3, 0x3b7, 0x33c, 0x1ed, 0x183, 0x31, 0x3c9, 0x11b, 0xfd, 0x338, 0xa, 0x139, 0x129, 0x2bc, 0x54, 0x3d, 0x1e0, 0xd5, 0x3d5, 0xa7, 0x3db, 0x79, 0x248, 0x3dd, 0x369, 0x2af, 0x249, 0xa2, 0x143, 0x2e9, 0x316, 0x3f7, 0x173, 0x25f, 0x27, 0x34c, 0x314, 0x100, 0x12e, 0x2d3, 0x299, 0x1ef, 0x374, 0x6c, 0x345, 0x3a5, 0x25e, 0x358, 0x166, 0x352, 0x5f, 0x27b, 0x2e3, 0x22f, 0x2de, 0x3cf, 0x20b, 0x1a, 0x2ac, 0x3c1, 0x2d5, 0x189, 0x108, 0x2e0, 0x3a7, 0xa9, 0x305, 0x1ea, 0x1ec, 0x2f7, 0xba, 0x230, 0x1dd, 0x26a, 0x1b, 0x3a6, 0x3a5, 0xb5, 0x17b, 0x322, 0x145, 0x3f2, 0x3df, 0x33c, 0x3da, 0x205, 0x188, 0xe7, 0x328, 0x337, 0x35f, 0x212, 0x275, 0x73, 0x2eb, 0x3c2, 0x2b3, 0x3e3, 0x20b, 0x34, 0x2a2, 0x237, 0x103, 0x14c, 0x290, 0x2bc, 0xa8, 0xf4, 0x31b, 0x14b, 0x24e, 0x19a, 0x223, 0x1ee, 0x16, 0x10a, 0x2e, 0x3f3, 0x128, 0x386, 0x1ea, 0x3d8, 0x3e2, 0xfc, 0x8e, 0x92, 0x3ea, 0x369, 0x157, 0x136, 0x119, 0x1d, 0x18f, 0x39, 0xe, 0x1bc, 0x245, 0x11f, 0x234, 0x213, 0x82, 0xc9, 0xdb, 0x21f, 0xd9, 0x3f8, 0x1ad, 0x391, 0x217, 0x34c, 0x221, 0x9, 0x162, 0x163, 0x394, 0x32e, 0x11e, 0xc3, 0x2a9, 0x2b2, 0x114, 0x2b1, 0x204, 0x37f, 0x5d, 0x118, 0x2ea, 0x135, 0x209, 0x1d3, 0x3d6, 0x25e, 0x2b9, 0x191, 0x2a6, 0x1f9, 0x3eb, 0x19e, 0x1ed, 0x306, 0xc4, 0x277, 0x194, 0x39f, 0x3ab, 0x109, 0x33e, 0x23d, 0x371, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x1, 0x1e7, 0x2e8, 0x1a4, 0x1ef, 0x1cb, 0x2c9, 0xd4, 0x2a8, 0x8a, 0x2b1, 0x3ce, 0x3b2, 0x13b, 0x2cf, 0x11e, 0x30c, 0x2ca, 0x1f3, 0x26d, 0x314, 0x12, 0x302, 0x33, 0x1e2, 0x134, 0x3f8, 0x2bd, 0x16e, 0xe9, 0x242, 0x30d, 0x104, 0x241, 0x356, 0x1db, 0x10c, 0xe, 0x2f9, 0x11, 0x359, 0xec, 0x2af, 0x26c, 0xda, 0x3a0, 0x239, 0x2fc, 0xfc, 0x238, 0x132, 0x34e, 0x303, 0x3fd, 0x250, 0xf, 0x137, 0x3a3, 0x262, 0x223, 0x3b1, 0x160, 0x210, 0x253, 0x54, 0x1e8, 0xee, 0x13a, 0x101, 0x2ac, 0x237, 0x5, 0xed, 0x161, 0x1de, 0x1e1, 0x16f, 0x327, 0x1f0, 0x236, 0x3cb, 0x35f, 0x5a, 0x311, 0xff, 0x263, 0x1ed, 0x3, 0x5b, 0xdf, 0x34d, 0x358, 0x322, 0x11d, 0x357, 0x215, 0x2be, 0x135, 0x36, 0x10f, 0x55, 0x226, 0x35c, 0x1, 0x3ce, 0x3b2, 0x13b, 0x2cf, 0x11e, 0x30c, 0x2ca, 0x1f3, 0x26d, 0x314, 0x12, 0x302, 0x33, 0x1e2, 0x134, 0x3f8, 0x2bd, 0x16e, 0xe9, 0x242, 0x30d, 0x104, 0x241, 0x356, 0x1db, 0x10c, 0xe, 0x395, 0x2d3, 0x1ca, 0xa3, 0x388, 0x2b0, 0x391, 0x9c, 0x294, 0x382, 0x104, 0x8b, 0x143, 0x2c3, 0xe4, 0x1c0, 0x317, 0x92, 0x36f, 0x3c6, 0x3fa, 0x250, 0x1e, 0xd5, 0x127, 0x261, 0xf9, 0x1a3, 0x14c, 0xad, 0x273, 0x2f4, 0x16f, 0x247, 0x3c9, 0x194, 0xc7, 0x32a, 0x2ad, 0x3f2, 0x2c7, 0x2ab, 0x29e, 0x36, 0x21e, 0x154, 0x114, 0x1a5, 0x20, 0x25c, 0x2c6, 0x13e, 0x4d, 0x1fc, 0x2bd, 0x2dc, 0x3a4, 0x234, 0xbc, 0xc8, 0x144, 0x3a, 0xc6, 0xbf, 0x7e, 0x238, 0x264, 0x123, 0x2e, 0x3a7, 0x282, 0x3c0, 0x296, 0xa1, 0xab, 0x31f, 0x5, 0x1da, 0x18d, 0x2eb, 0x22f, 0x1b3, 0x62, 0x1ce, 0x2ec, 0xd6, 0x191, 0x11d, 0x2a7, 0x46, 0x1dd, 0x374, 0x2c9, 0x350, 0x2da, 0x2c8, 0xc5, 0x9, 0x302, 0x66, 0x381, 0x1b2, 0x3f7, 0x31d, 0x326, 0x75, 0x219, 0x3ad, 0x136, 0xda, 0x349, 0xf6, 0x3cd, 0x3db, 0x399, 0xb, 0x21, 0x1c9, 0x15, 0xf4, 0x323, 0x35e, 0x24b, 0x222, 0x1fc, 0x173, 0x362, 0x11f, 0x308, 0x3ad, 0x26c, 0x368, 0x27e, 0x37b, 0x14e, 0x315, 0x36b, 0x312, 0x290, 0x39a, 0x17a, 0x16f, 0x87, 0x33f, 0xbb, 0x6b, 0x191, 0x23a, 0x28e, 0x230, 0x1ef, 0x243, 0x30c, 0x33a, 0x30f, 0x256, 0x2e4, 0x82, 0x8b, 0x286, 0x31e, 0x329, 0x3f, 0x238, 0xc1, 0x85, 0x170, 0x20e, 0xf4, 0x1dc, 0x1c2, 0x68, 0xfd, 0x3d1, 0x5a, 0x5f, 0x3eb, 0x1d6, 0x2a3, 0x1b, 0x21e, 0x2a8, 0x59, 0x133, 0x200, 0x302, 0xcc, 0x21f, 0x18b, 0x307, 0x378, 0x22, 0x2fe, 0x1bf, 0x17d, 0x94, 0xf, 0xd5, 0x24e, 0x196, 0x3c1, 0x206, 0x1da, 0x31a, 0x3be, 0x15c, 0x306, 0x5b, 0x37c, 0xb5, 0x39d, 0x81, 0x1e7, 0x36d, 0x1ca, 0x146, 0x23b, 0x1ad, 0x16e, 0x3a4, 0x61, 0x2f0, 0x249, 0x6d, 0x349, 0x1ec, 0x32f, 0x2e7, 0x1ee, 0x160, 0x52, 0x171, 0x12d, 0x3aa, 0x397, 0x3e0, 0x194, 0x18e, 0xb3, 0x145, 0x24f, 0x163, 0x27c, 0x268, 0x3f7, 0x6f, 0x20c, 0x17f, 0x1bf, 0x2fa, 0x250, 0x78, 0x14b, 0x142, 0x151, 0x338, 0x280, 0x38c, 0x3fc, 0xeb, 0x2a3, 0x36, 0x6a, 0x16d, 0x199, 0x221, 0x120, 0x260, 0x1ab, 0x365, 0x1c8, 0x21b, 0x238, 0x182, 0x214, 0x392, 0xa8, 0x2bf, 0x3f5, 0xf8, 0xca, 0x18e, 0x166, 0x11d, 0x28e, 0x69, 0x3b5, 0x23c, 0xac, 0x391, 0x270, 0x11a, 0x178, 0x249, 0xda, 0x13f, 0x37b, 0x29c, 0x4f, 0x36e, 0x14c, 0x2b4, 0x371, 0x57, 0x183, 0x5b, 0x2f1, 0x2d4, 0xd7, 0x2, 0x97, 0x2c6, 0xf1, 0xd9, 0x3e7, 0xde, 0x11, 0x2fe, 0x37e, 0x1fd, 0xa9, 0xf0, 0x296, 0x284, 0x2a2, 0x279, 0x109, 0x311, 0x3f1, 0x1d6, 0x14f, 0x6c, 0xd4, 0x2da, 0x332, 0x4b, 0x240, 0xc9, 0x356, 0x2c3, 0x390, 0x3f, 0x79, 0x304, 0x21, 0x32d, 0x150, 0x177, 0x3e3, 0x1f0, 0x194, 0x31c, 0x2cc, 0x23a, 0x115, 0xd2, 0x363, 0x71, 0x158, 0x32b, 0x97, 0x185, 0x3c4, 0x2c1, 0x207, 0x3f6, 0x49, 0x1a7, 0x2e, 0x107, 0x1e8, 0x2fb, 0x3e, 0x65, 0x18e, 0x2cc, 0x7d, 0x5d, 0x299, 0x255, 0x23b, 0x2bd, 0x2cd, 0xea, 0x1d8, 0x15d, 0x94, 0x3c, 0x14b, 0x284, 0x14d, 0x1f6, 0x5a, 0x17c, 0x2c7, 0x175, 0x2e1, 0xc3, 0x33a, 0x27, 0x121, 0x5e, 0x320, 0xda, 0x27e, 0x1f7, 0xcd, 0xf9, 0x103, 0x3b4, 0xe6, 0x335, 0x373, 0x180, 0x10f, 0x159, 0x2c8, 0x221, 0x240, 0x192, 0x143, 0x235, 0x17e, 0x3e9, 0x27f, 0x160, 0x148, 0x33d, 0x3c2, 0x1b3, 0x310, 0x37c, 0x2d4, 0x1ae, 0x8, 0xb1, 0x33, 0x21f, 0x225, 0x1c, 0x38f, 0x248, 0x123, 0x170, 0x2a, 0x35b, 0x3f5, 0x1f0, 0x328, 0x6b, 0x24d, 0x3e8, 0x2e8, 0xe5, 0x28c, 0x1fc, 0x1c5, 0x245, 0x359, 0x2db, 0x2fa, 0xa9, 0x1e0, 0x24a, 0xd, 0x27a, 0x3ab, 0x2d0, 0x3f2, 0x215, 0x3ba, 0x325, 0x211, 0x1e6, 0x138, 0x11a, 0x2f0, 0x136, 0x2d9, 0x3d4, 0x12e, 0x21d, 0x21f, 0x43, 0x70, 0x47, 0xc1, 0x21, 0xaf, 0x12d, 0x16f, 0x31, 0x26b, 0xb5, 0xd7, 0x8, 0x162, 0xcc, 0xdc, 0x218, 0x380, 0x238, 0x201, 0x108, 0x171, 0x17a, 0x36a, 0x188, 0x37c, 0x1a1, 0x2b1, 0x40, 0x302, 0x269, 0x2e9, 0xe4, 0x3f, 0x1e4, 0x2c, 0x52, 0x39a, 0x3c2, 0x366, 0x5b, 0x3d6, 0x113, 0x1a5, 0x200, 0x26, 0x36c, 0x365, 0x329, 0x1f8, 0x33b, 0x160, 0x290, 0xef, 0x22f, 0x306, 0x2d8, 0x28f, 0x8a, 0x133, 0x24, 0x130, 0x356, 0x31e, 0x17e, 0x3db, 0x1ee, 0x312, 0xad, 0x371, 0x15c, 0x6, 0x2ed, 0x55, 0x59, 0x18a, 0x120, 0x192, 0x286, 0xc6, 0x3e2, 0x2e7, 0x36b, 0xa6, 0x161, 0x3be, 0x2f2, 0x30, 0x345, 0x2a8, 0x2c8, 0x4b, 0x112, 0x8b, 0x1d, 0x239, 0x32f, 0x315, 0x36e, 0x139, 0x31a, 0x1cf, 0x3bd, 0x180, 0x21e, 0x16d, 0x26d, 0x258, 0x82, 0x51, 0xe8, 0x1ec, 0x14e, 0x9e, 0x346, 0x1da, 0xe6, 0x25c, 0x66, 0xdc, 0x39, 0x21b, 0x1e4, 0x58, 0x148, 0xef, 0x57, 0x3, 0x2ed, 0xaa, 0x164, 0x4b, 0x224, 0x22c, 0xe8, 0x3d8, 0x131, 0xf9, 0x5, 0x33e, 0x1fe, 0x3ac, 0xdd, 0x265, 0x27d, 0x138, 0x61, 0x353, 0x10b, 0xf, 0x14b, 0x202, 0xfd, 0x167, 0x2a6, 0x28e, 0x348, 0xa3, 0x1fc, 0x31d, 0x11, 0x3dd, 0x20f, 0x107, 0x3a9, 0x3e3, 0x39b, 0x1d1, 0x1e5, 0x204, 0x12e, 0x33, 0x6e, 0x218, 0x309, 0xf2, 0x2c, 0xa4, 0x273, 0x22f, 0x205, 0x372, 0x55, 0xb2, 0x221, 0x112, 0x116, 0x74, 0x1ec, 0x29c, 0x278, 0x206, 0x19f, 0xff, 0x1d6, 0x26a, 0x336, 0x33a, 0x9c, 0x234, 0x3ad, 0x281, 0x203, 0x2a1, 0x101, 0x27a, 0x2b7, 0x153, 0x147, 0x1a4, 0x255, 0xfe, 0x38a, 0x20c, 0x3ea, 0x303, 0x287, 0x3d0, 0x3f5, 0x3c9, 0x2ec, 0x2f6, 0x102, 0x97, 0x21d, 0x37, 0x10c, 0x380, 0x79, 0x16, 0x52, 0x33d, 0x313, 0x306, 0x1b9, 0x22e, 0x59, 0xb1, 0x198, 0x2e9, 0x390, 0x3f0, 0x1ee, 0x53, 0x2c2, 0x1cf, 0x2ef, 0x36, 0x2a9, 0x383, 0x121, 0x2f0, 0x1a2, 0x305, 0x2a1, 0x202, 0x1fa, 0x195, 0x11d, 0xba, 0x1ca, 0x9a, 0x3c7, 0x3f6, 0x248, 0x10a, 0xaf, 0xbd, 0x2dd, 0x5b, 0x343, 0x114, 0x18a, 0x89, 0x116, 0xe8, 0x3b9, 0xcd, 0x3c1, 0x50, 0x311, 0x367, 0x1dd, 0x8f, 0x2b0, 0x1b1, 0x1d4, 0x1bf, 0x3f3, 0x3d, 0x2fb, 0x1f0, 0x176, 0x2f6, 0x204, 0x25c, 0xcc, 0x370, 0x1c8, 0x1f8, 0xf7, 0x22d, 0x161, 0x2e3, 0x373, 0x1b, 0x350, 0x3c5, 0x294, 0x178, 0xd1, 0x386, 0x354, 0x101, 0xfd, 0x2ce, 0x28a, 0x5d, 0xe5, 0x4d, 0x3e7, 0x1fb, 0x124, 0x85, 0x253, 0x25a, 0x36a, 0x229, 0x3a5, 0x8a, 0xc5, 0x240, 0x8b, 0x74, 0x3d8, 0x262, 0x3e4, 0x28, 0x38c, 0x3b7, 0x2ea, 0x243, 0x158, 0x2dc, 0xea, 0x2db, 0x3fd, 0x21a, 0x379, 0xf8, 0xbb, 0x17b, 0x102, 0x12e, 0x66, 0x1b8, 0xe4, 0x162, 0x269, 0x365, 0x17e, 0x2e7, 0x36e, 0x1da, 0x339, 0x1d6, 0x1ba, 0x30c, 0x32b, 0x11f, 0x3b0, 0x3fa, 0x21a, 0x2fb, 0x3e0, 0x1d1, 0x39d, 0x8, 0x302, 0x36c, 0x31e, 0x3e2, 0x315, 0x346, 0x2cb, 0x1fe, 0x2ab, 0x1cb, 0x56, 0x16e, 0xea, 0x1bf, 0x3ef, 0xf4, 0x3f5, 0x33f, 0x293, 0xd7, 0x40, 0x26, 0x356, 0xc6, 0x32f, 0x9e, 0x206, 0x275, 0x3eb, 0x175, 0x243, 0x2b0, 0x362, 0x359, 0x1e3, 0x347, 0x3a9, 0x397, 0x1ce, 0xb5, 0x2b1, 0x200, 0x130, 0x286, 0x239, 0x14e, 0xf9, 0x14, 0x38c, 0x367, 0x3ba, 0x23c, 0x1ad, 0x326, 0x2fe, 0x303, 0x20e, 0x177, 0x87, 0x26b, 0x1a1, 0x1a5, 0x24, 0x192, 0x1d, 0x1ec, 0x262, 0x3c1, 0xa0, 0x5f, 0x30e, 0x1ef, 0x1c4, 0x173, 0x106, 0x3dd, 0x2e, 0x54, 0x3aa, 0x31, 0x37c, 0x113, 0x133, 0x120, 0x8b, 0xe8, 0x37b, 0x334, 0x237, 0x109, 0x2f8, 0x46, 0x363, 0x23b, 0x38a, 0x22, 0x2d7, 0x170, 0x2a0, 0x2c4, 0x1b6, 0x31e, 0x3cd, 0x4f, 0x206, 0xe3, 0x3b7, 0x3ba, 0x71, 0x2bd, 0x106, 0x3b3, 0xb8, 0x2a0, 0x2de, 0x229, 0x28f, 0xb2, 0x12c, 0x19, 0xda, 0x34b, 0x254, 0x13d, 0x2ce, 0x23a, 0x1d9, 0x13e, 0x18b, 0xe0, 0xf2, 0x160, 0x15a, 0x2e3, 0x1d7, 0x1b0, 0x19d, 0x270, 0x219, 0x2ba, 0x141, 0x3b8, 0x1f0, 0x1d1, 0x333, 0x20, 0x26, 0x2a5, 0x318, 0x14e, 0x1f2, 0x50, 0x5f, 0x215, 0x3b5, 0x23b, 0x31d, 0x88, 0x295, 0x32d, 0xbd, 0x366, 0x1b9, 0x154, 0x26d, 0x1c1, 0x320, 0x376, 0x1aa, 0x202, 0x3e1, 0x166, 0x3d9, 0x35e, 0x381, 0x10c, 0x3f, 0x27f, 0x53, 0x31a, 0xcf, 0x29e, 0x265, 0x3cc, 0x28b, 0x3b0, 0x3fd, 0x7a, 0x3f5, 0x277, 0x25e, 0x2b1, 0x9, 0xc9, 0x1d, 0x3d8, 0x19a, 0x237, 0x212, 0x3f2, 0x230, 0x255, 0x3f9, 0x378, 0x124, 0x214, 0x171, 0x38d, 0x3, 0x345, 0x2da, 0x12b, 0x5e, 0xd1, 0x203, 0x125, 0xd0, 0xc7, 0x93, 0x181, 0x2d1, 0xc6, 0xa7, 0x1f2, 0xa0, 0x17c, 0x8c, 0x32e, 0x3f9, 0x2f9, 0x99, 0x84, 0x33d, 0x15c, 0xc0, 0x1a8, 0x30f, 0x234, 0x2ae, 0xa9, 0xee, 0xf8, 0x1d1, 0x26f, 0x80, 0x130, 0x20a, 0x3d8, 0x334, 0xce, 0xb4, 0x357, 0x299, 0x4d, 0x307, 0x227, 0xb, 0x290, 0x1df, 0x373, 0xd8, 0x19d, 0xe9, 0x76, 0x1fd, 0x3d, 0x3f5, 0xe7, 0x16a, 0x1a5, 0x90, 0x116, 0x349, 0x3a3, 0x156, 0x3d1, 0x2a6, 0xba, 0x24b, 0x2c1, 0xe0, 0x1e4, 0x189, 0x2c2, 0x263, 0x29e, 0xc3, 0x32b, 0x75, 0x37e, 0x347, 0x2bf, 0x10e, 0x37c, 0x45, 0x314, 0x82, 0x232, 0x3a1, 0x254, 0x27a, 0x32a, 0x1f4, 0x1af, 0x381, 0x218, 0xfc, 0x3dc, 0x139, 0x398, 0x3ac, 0x1cb, 0x158, 0x2cd, 0x2fe, 0x17, 0xa8, 0x16f, 0x229, 0x117, 0x2c8, 0x172, 0x190, 0x376, 0x354, 0x1a, 0x337, 0x24d, 0x3ce, 0x21d, 0x370, 0x25b, 0x2e7, 0x1a3, 0x19f, 0x3eb, 0x1dd, 0x71, 0x173, 0x302, 0x356, 0x239, 0x262, 0x237, 0x5a, 0x357, 0x13b, 0x134, 0xe, 0x238, 0x160, 0x161, 0x263, 0x135, 0x30c, 0x16e, 0x359, 0x303, 0x54, 0x16f, 0x5b, 0x55, 0x26d, 0x30d, 0x26c, 0xf, 0x13a, 0x236, 0x358, 0x1, 0x302, 0x356, 0x239, 0x262, 0x237, 0x5a, 0x357, 0x13b, 0x134, 0xe, 0x238, 0x160, 0x161, 0x263, 0x135, 0x30c, 0x16e, 0x359, 0x303, 0x54, 0x16f, 0x5b, 0x55, 0x26d, 0x30d, 0x26c, 0xf, 0x13a, 0x236, 0x358, 0x1, 0x302, 0x356, 0x239, 0x262, 0x237, 0x5a, 0x357, 0x13b, 0x134, 0xe, 0x238, 0x160, 0x161, 0x263, 0x135, 0x30c, 0x16e, 0x359, 0x303, 0x54, 0x16f, 0x5b, 0x55, 0x26d, 0x30d, 0x26c, 0xf, 0x13a, 0x236, 0x358, 0x1, 0x302, 0x356, 0x239, 0x262, 0x237, 0x5a, 0x357, 0x13b, 0x134, 0xe, 0x238, 0x160, 0x161, 0x263, 0x135, 0x30c, 0x16e, 0x359, 0x303, 0x54, 0x16f, 0x5b, 0x55, 0x26d, 0x30d, 0x26c, 0xf, 0x20d, 0x143, 0x1ec, 0x261, 0x279, 0x2ad, 0xba, 0x13e, 0x43, 0x7e, 0x3b1, 0x1da, 0x3fc, 0x1dd, 0x1c4, 0x31d, 0x49, 0x21, 0x33d, 0x179, 0x1b, 0x2ca, 0x1d2, 0x3b0, 0x3d7, 0x2bf, 0x31, 0x3a5, 0x164, 0x2e4, 0x9b, 0x203, 0x13a, 0x65, 0x17b, 0x8, 0x4c, 0x20a, 0x37b, 0x32c, 0x3ec, 0x145, 0x1d9, 0x1e2, 0x218, 0x3f0, 0x1b7, 0x2cb, 0x3df, 0x2f3, 0x23b, 0xde, 0x248, 0x108, 0x1de, 0x3da, 0xd8, 0x27d, 0x28b, 0x1bf, 0x287, 0x1d5, 0x188, 0x117, 0x332, 0x30d, 0xd1, 0x3c, 0x1c2, 0x328, 0x3ca, 0x40, 0x260, 0x74, 0x3ee, 0x156, 0x35f, 0x23a, 0x2d3, 0x30b, 0xe4, 0x3bf, 0x1a3, 0x275, 0x2c7, 0x3b5, 0x1fc, 0x2f9, 0x264, 0x52, 0x2eb, 0x2ef, 0x2c9, 0x3cc, 0x75, 0x1e3, 0x15, 0x2b3, 0x5b, 0xaa, 0x1a6, 0x5e, 0x281, 0x1e0, 0x20b, 0x176, 0x26f, 0x200, 0x324, 0x3a0, 0x34f, 0x2a2, 0x2ce, 0x1f4, 0x2b5, 0x6e, 0x329, 0x1c7, 0x103, 0x38c, 0x13, 0x105, 0x37b, 0x251, 0x3ab, 0x23a, 0x1af, 0x37, 0x329, 0x38e, 0x5, 0x5f, 0x118, 0x28c, 0x307, 0x11c, 0x2c0, 0x31a, 0xeb, 0x396, 0x1ad, 0x11, 0x123, 0x171, 0xae, 0x300, 0x165, 0x1d2, 0x369, 0x347, 0x1d5, 0x310, 0x55, 0x1a6, 0xbc, 0x216, 0x31b, 0xf8, 0x293, 0x2d6, 0x240, 0x288, 0x34b, 0x101, 0x337, 0x24c, 0x25c, 0x36c, 0x318, 0xcd, 0x19c, 0x352, 0xba, 0x27c, 0x10c, 0x3f0, 0x36e, 0x33e, 0x2c7, 0x363, 0x3f9, 0x3e5, 0x201, 0x252, 0x39e, 0x135, 0x2b, 0x2cd, 0x3dd, 0x1c9, 0x2f4, 0x6, 0x6a, 0x217, 0x308, 0x1fd, 0x1e8, 0x87, 0x1eb, 0xb2, 0x2e4, 0x136, 0x1e, 0x1c2, 0x259, 0x333, 0x200, 0x241, 0x29b, 0x24e, 0x27a, 0x166, 0x1e7, 0x66, 0x2c3, 0x32f, 0x3e4, 0x212, 0x357, 0xe5, 0x364, 0x380, 0xf7, 0x272, 0x1fe, 0x1dd, 0x388, 0x6f, 0x248, 0x210, 0x371, 0x2ef, 0x19b, 0x32b, 0x3a8, 0x20f, 0x2a0, 0x1b3, 0x1d3, 0x37a, 0x26, 0x1d, 0x3ee, 0x151, 0x195, 0x3bb, 0x21d, 0x365, 0x32f, 0x3c1, 0x5a, 0x28e, 0x24b, 0x43, 0x1f8, 0x36e, 0x275, 0x30e, 0x32e, 0x3e7, 0x47, 0x160, 0x31a, 0x1d6, 0x243, 0x173, 0x110, 0x21, 0xef, 0x3bd, 0x2c9, 0x32b, 0x359, 0x2e, 0x12d, 0x306, 0x21e, 0x30f, 0x308, 0x3fa, 0x3a9, 0x31, 0x28f, 0x26d, 0x5e, 0x216, 0x23f, 0x3e0, 0xb5, 0x133, 0x82, 0x368, 0x2a1, 0x340, 0x358, 0x8, 0x130, 0xe8, 0x34f, 0x29a, 0xb3, 0x1e7, 0xcc, 0x31e, 0x14e, 0x237, 0x2d0, 0x5d, 0x27c, 0x218, 0x3db, 0x346, 0x38c, 0x46, 0x146, 0x307, 0x238, 0x312, 0xe6, 0x2ab, 0x23c, 0x38a, 0x92, 0x108, 0x371, 0x1d7, 0x265, 0x16e, 0x2fe, 0x170, 0x17a, 0x6, 0xd4, 0x4e, 0x76, 0x3ef, 0x177, 0x188, 0x55, 0x34c, 0x2f0, 0x94, 0x1dc, 0x33f, 0x1a1, 0x18a, 0x19, 0x376, 0x125, 0x236, 0x2f6, 0x40, 0x192, 0x349, 0x24e, 0xfd, 0x191, 0x323, 0x269, 0xc6, 0x4c, 0x74, 0x34f, 0x13d, 0x2cc, 0x323, 0xdb, 0x318, 0x334, 0x1f6, 0x11d, 0x35e, 0x1b8, 0x1f1, 0xf9, 0x212, 0x147, 0x24b, 0x86, 0x3e9, 0x346, 0x311, 0x118, 0x222, 0x1c, 0x399, 0x139, 0x3fc, 0x2f3, 0x1fc, 0x3e5, 0x16, 0x161, 0x271, 0x325, 0x173, 0x220, 0x84, 0x371, 0x3ae, 0x186, 0x362, 0x3b3, 0x253, 0x22f, 0x300, 0x19d, 0x11f, 0x3c6, 0x150, 0x366, 0x283, 0x383, 0x308, 0x3fd, 0x2bf, 0x188, 0xaa, 0x12b, 0x3ad, 0x152, 0x3fe, 0x26b, 0x114, 0x172, 0x26c, 0xf0, 0x3e, 0x293, 0x34a, 0x41, 0x368, 0x14b, 0x11b, 0x2f6, 0x80, 0x241, 0x27e, 0xa1, 0x39f, 0x91, 0x2c4, 0x143, 0x37b, 0x156, 0x2ce, 0x3bb, 0x33, 0x18f, 0x14e, 0x67, 0x352, 0x2e8, 0x381, 0x390, 0x315, 0x28, 0x3f2, 0x13b, 0x364, 0x21b, 0x36b, 0x19f, 0x187, 0x32e, 0x3c7, 0x11c, 0x312, 0x1cc, 0x2be, 0x1c4, 0xde, 0x264, 0x290, 0x39e, 0xdd, 0x2b0, 0x20c, 0x246, 0x39a, 0x98, 0x1d0, 0x24e, 0x3f4, 0x126, 0x162, 0x143, 0x2ff, 0x151, 0x25d, 0x3ce, 0x269, 0x318, 0x261, 0x3d1, 0xfa, 0x185, 0x365, 0xa7, 0x67, 0x2ad, 0x3b2, 0x37, 0x17e, 0x278, 0x212, 0x28e, 0x13e, 0x39, 0x2e7, 0xa, 0x1f9, 0x13b, 0x2c1, 0x7e, 0x36e, 0x1c6, 0x8c, 0x222, 0x38, 0x27f, 0x1da, 0x3b7, 0x2cf, 0x3e7, 0x11c, 0x22d, 0x339, 0x1dd, 0x7f, 0x3f6, 0x16, 0x2c2, 0x1d6, 0x11e, 0x31d, 0x99, 0x148, 0x39e, 0x1ba, 0x2d2, 0x44, 0x21, 0x3bc, 0x3ae, 0x30c, 0x193, 0x1a7, 0x171, 0x179, 0x1b0, 0x32b, 0x17f, 0x2e0, 0x3c2, 0xc0, 0x2ca, 0x11f, 0x385, 0x149, 0x306, 0x6a, 0x9c, 0x3b0, 0x107, 0x2de, 0x2ed, 0x1f3, 0xc2, 0x3fa, 0x2bf, 0x310, 0x2a8, 0x14a, 0x2ae, 0x21a, 0x247, 0x3a5, 0x26d, 0x178, 0x128, 0x2fb, 0x331, 0x114, 0x2e4, 0x1a2, 0x389, 0x3e0, 0x2d4, 0x314, 0xc8, 0x203, 0x384, 0x1d1, 0x2d6, 0x224, 0x368, 0x296, 0x65, 0x39d, 0x130, 0x349, 0x254, 0x337, 0x81, 0x26, 0xe8, 0x24e, 0x3e1, 0x91, 0x302, 0x1d, 0x34f, 0xfd, 0x93, 0x162, 0x286, 0x3ee, 0x29a, 0x191, 0x12e, 0x356, 0x37b, 0x151, 0xb3, 0x323, 0x36c, 0x1ec, 0xab, 0x195, 0x1e7, 0x269, 0x239, 0x196, 0x2b7, 0x3bb, 0xcc, 0xc6, 0x334, 0x3d1, 0x1f4, 0x21d, 0x31e, 0x262, 0xfb, 0x23a, 0x2c6, 0x365, 0x14e, 0x19c, 0x145, 0x35e, 0x2e9, 0x32f, 0x237, 0x2ad, 0x36d, 0xdc, 0x3e2, 0x3c1, 0x2d0, 0x2e8, 0x21f, 0x17e, 0xf9, 0x5a, 0x5d, 0x3c4, 0x329, 0x9e, 0x109, 0x28e, 0x27c, 0xe4, 0x315, 0xa0, 0x357, 0x24b, 0x218, 0x2e7, 0x14, 0x3ed, 0x1ca, 0x43, 0x3db, 0x206, 0x2f8, 0x13b, 0x18b, 0x1f8, 0x346, 0x5f, 0x1a4, 0x1b2, 0x3f, 0x36e, 0x38c, 0x230, 0x134, 0x380, 0x36b, 0x275, 0x46, 0x222, 0x70, 0x1ee, 0x2cb, 0x30e, 0x146, 0xe, 0x33b, 0x1da, 0x367, 0x32e, 0x307, 0x1e4, 0x139, 0x3eb, 0x363, 0x3e7, 0x260, 0x13f, 0x284, 0x31c, 0x4, 0x192, 0xf5, 0x202, 0x6b, 0x10, 0x241, 0x3d4, 0x1a, 0x1ac, 0x40, 0x116, 0x34b, 0x68, 0x2b9, 0x100, 0x51, 0x137, 0x1a0, 0x2f6, 0x9, 0x144, 0xd5, 0x289, 0x3ca, 0x24, 0x119, 0x354, 0x236, 0x333, 0x90, 0x6d, 0x14b, 0xca, 0xd7, 0x240, 0x1b4, 0x125, 0x328, 0x35c, 0x112, 0x2d9, 0x9d, 0xbb, 0x16b, 0x41, 0x376, 0x274, 0x2ec, 0x1a5, 0x104, 0x1c3, 0x1c2, 0x3a2, 0x29d, 0x19, 0x305, 0x301, 0x293, 0x266, 0x64, 0xf, 0x1f, 0x25e, 0x18a, 0x190, 0x3c, 0x7c, 0x16a, 0x221, 0x249, 0xf0, 0x1f0, 0x1a1, 0x96, 0x136, 0x3c0, 0x3c9, 0x28d, 0x258, 0xd1, 0x31b, 0x33f, 0x226, 0x172, 0x344, 0x77, 0xe7, 0x8a, 0x1c1, 0x10b, 0x1dc, 0x39c, 0x228, 0x30d, 0x25, 0x379, 0x26b, 0xb2, 0x2f, 0x94, 0x1ff, 0x1be, 0x2c8, 0xbc, 0x250, 0x3f5, 0x2f1, 0x332, 0x2f0, 0x152, 0x3cf, 0x3d6, 0xd3, 0x3d2, 0x141, 0xc9, 0xf5, 0xd, 0x1ac, 0x80, 0x51, 0x26e, 0x289, 0x39d, 0x90, 0xda, 0x125, 0x259, 0x16b, 0x82, 0x1c3, 0x384, 0x293, 0xc5, 0x190, 0x78, 0x1f0, 0x342, 0x258, 0x1a2, 0x77, 0x1ce, 0x228, 0x213, 0x94, 0x3fe, 0x2f1, 0x26d, 0x3d2, 0x282, 0x87, 0x22e, 0xa5, 0x2aa, 0x3d0, 0x310, 0x16d, 0x234, 0x3fd, 0x3aa, 0x372, 0x3c5, 0x76, 0x107, 0x2dd, 0x21e, 0x138, 0x37e, 0x2a0, 0x3, 0x15b, 0x11f, 0x17, 0x2f4, 0x180, 0xf3, 0x2bb, 0x392, 0xae, 0x1b0, 0x16e, 0x36f, 0x2e2, 0x3bd, 0x186, 0x245, 0x85, 0x3bc, 0x14f, 0x2b0, 0x88, 0x210, 0x1cf, 0x2e1, 0x2e6, 0x99, 0x252, 0x271, 0x23c, 0x1bc, 0xb, 0x31a, 0x2be, 0x7f, 0x38f, 0x189, 0x27b, 0x1ef, 0x3f7, 0x79, 0x139, 0x3b7, 0x255, 0xe, 0xf7, 0x19f, 0x46, 0x9a, 0x309, 0x36e, 0x22b, 0x348, 0x18b, 0x3e9, 0x5, 0x3ed, 0x321, 0x39, 0x315, 0x280, 0x115, 0x3c4, 0xbf, 0x1f2, 0x2d0, 0x192, 0x3d4, 0x68, 0x2f6, 0x24, 0x6d, 0x125, 0xbb, 0x1a5, 0x19, 0xf, 0x7c, 0x1a1, 0x258, 0x344, 0x1dc, 0x26b, 0x2c8, 0x2f0, 0x141, 0x87, 0x55, 0x294, 0x17d, 0x177, 0x2d8, 0x3e6, 0x76, 0x20e, 0x366, 0xd4, 0x3a4, 0x303, 0x17a, 0x180, 0x1e6, 0x2fe, 0xaf, 0x2f2, 0x265, 0x326, 0x85, 0x371, 0x135, 0x1ad, 0x92, 0x290, 0x33c, 0x23c, 0x378, 0x2c, 0xe6, 0x3ba, 0x3fb, 0x238, 0x139, 0x367, 0x146, 0x70, 0x36b, 0x38c, 0x1a4, 0x18b, 0x3db, 0x14, 0x357, 0x27c, 0x329, 0xf9, 0x2d0, 0x36d, 0x2e9, 0x14e, 0xfb, 0x1f4, 0xcc, 0x239, 0xab, 0xb3, 0x12e, 0x286, 0x34f, 0x3e1, 0x81, 0x130, 0x27e, 0xd, 0x358, 0x200, 0x288, 0x2a1, 0x194, 0x2b1, 0x82, 0x386, 0x20b, 0xb5, 0x4b, 0x26c, 0x23f, 0x1ce, 0x59, 0x5e, 0xa9, 0x397, 0x28f, 0x256, 0x2aa, 0x3a9, 0x5b, 0x37a, 0x308, 0x347, 0x36a, 0x21e, 0x270, 0x1e3, 0x12d, 0x30, 0x33a, 0x324, 0x34b, 0x340, 0x333, 0x89, 0x376, 0x384, 0x25e, 0x4b, 0xd1, 0xee, 0x26b, 0x199, 0x3d2, 0x21a, 0x62, 0x2b2, 0x61, 0x3d7, 0x1b5, 0x21e, 0xe9, 0x385, 0x17a, 0x300, 0x391, 0x3dd, 0x2e2, 0x2ef, 0x56, 0x44, 0x29, 0x263, 0x8f, 0x1bc, 0x2c, 0x1cc, 0x2f3, 0x3e7, 0x3c8, 0x361, 0x46, 0x268, 0xfc, 0x206, 0x3d3, 0x13e, 0x329, 0x1f2, 0x352, 0x35e, 0x2c3, 0x19a, 0x2b7, 0x3ce, 0x1ab, 0x3ee, 0x1fa, 0x244, 0x130, 0xf5, 0x34, 0x2f6, 0x48, 0x1b4, 0x13a, 0x3a2, 0xc5, 0x249, 0x389, 0xe7, 0x59, 0xbc, 0x2a4, 0x87, 0xaa, 0x242, 0x3fa, 0x35d, 0x3a6, 0x4e, 0x37e, 0x292, 0x30, 0x27d, 0x17f, 0xaf, 0x1ed, 0x186, 0x106, 0x42, 0x2e3, 0x1cb, 0x31d, 0x304, 0x31a, 0x2ea, 0x3f9, 0x238, 0x272, 0x187, 0x222, 0x309, 0x1a3, 0x2f8, 0x394, 0x72, 0x9e, 0xb4, 0x3b2, 0x2e9, 0x29c, 0x3ec, 0x3bb, 0xdb, 0x3b9, 0x29a, 0x126, 0x13, 0x349, 0x241, 0x137, 0x236, 0x35c, 0x104, 0xf, 0x1f0, 0x226, 0x30d, 0x250, 0x327, 0x55, 0x242, 0x3fd, 0x16f, 0x10f, 0xe9, 0x303, 0x1e1, 0x36, 0x16e, 0x34e, 0x1de, 0x135, 0x2bd, 0x132, 0x161, 0x2be, 0x3f8, 0x238, 0xed, 0x215, 0x134, 0xfc, 0x5, 0x357, 0x1e2, 0x2fc, 0x237, 0x11d, 0x33, 0x239, 0x2ac, 0x322, 0x302, 0x3a0, 0x101, 0x358, 0x12, 0xda, 0x13a, 0x34d, 0x314, 0x26c, 0xee, 0xdf, 0x26d, 0x2af, 0x1e8, 0x5b, 0x1f3, 0xec, 0x54, 0x3, 0x2ca, 0x359, 0x253, 0x1ed, 0x30c, 0x11, 0x210, 0x263, 0x11e, 0x2f9, 0x160, 0xff, 0x2cf, 0xe, 0x3b1, 0x311, 0x13b, 0x10c, 0x223, 0x5a, 0x3b2, 0x1db, 0x262, 0x35f, 0x3ce, 0x356, 0x3a3, 0x3cb, 0x1, 0x241, 0x137, 0x236, 0x35c, 0x104, 0xf, 0x1f0, 0x226, 0x30d, 0x250, 0x327, 0x55, 0x242, 0x3fd, 0x16f, 0x10f, 0xe9, 0x303, 0x1e1, 0x36, 0x16e, 0x34e, 0x1de, 0x135, 0x2bd, 0x132, 0x161, 0x8b, 0xd5, 0x194, 0x1a5, 0xc8, 0x3c0, 0x1ce, 0x2c8, 0x3ad, 0xf4, 0x5b, 0x3e6, 0x3b0, 0x2a0, 0x30, 0x1e6, 0x3dd, 0x39a, 0x2a3, 0x1ad, 0x99, 0x161, 0x175, 0x3fb, 0x1e4, 0x2cb, 0x230, 0x18b, 0x2e7, 0x109, 0x2e8, 0x2e9, 0x262, 0x2b7, 0x323, 0x286, 0x24e, 0x18e, 0x40, 0x288, 0x125, 0x1d1, 0x18a, 0x26c, 0x1dc, 0x37c, 0x34c, 0x2aa, 0x177, 0x2ed, 0x4e, 0x1e3, 0x17a, 0x1b, 0x16e, 0x295, 0x371, 0x1ba, 0x38a, 0x201, 0xe6, 0x1ef, 0x307, 0x1ee, 0x38c, 0x13b, 0x218, 0x9e, 0x2d0, 0x35e, 0x31e, 0x196, 0xb3, 0x162, 0xe8, 0x284, 0x358, 0x24, 0x368, 0x1c2, 0xb5, 0x258, 0x216, 0x3f5, 0x28f, 0x294, 0x3fa, 0x16f, 0x21e, 0x3a4, 0x2e, 0x22f, 0x2c9, 0x326, 0x21, 0x1cf, 0x243, 0x378, 0x160, 0x1fe, 0x32e, 0x70, 0x36e, 0x2f8, 0x24b, 0x329, 0x3c1, 0x145, 0x21d, 0x239, 0x151, 0x93, 0x26, 0x27e, 0x68, 0x39d, 0x112, 0x386, 0x7c, 0x113, 0x116, 0x354, 0xbb, 0x266, 0x136, 0x1dc, 0x2f1, 0x12b, 0x17d, 0x35d, 0x10f, 0x3a4, 0x5c, 0xae, 0x265, 0x20c, 0x29, 0x33c, 0x388, 0x227, 0x139, 0x215, 0xd9, 0x3db, 0x140, 0x174, 0x2e9, 0xcd, 0x2ce, 0x12e, 0x3a, 0x142, 0x358, 0x48, 0x1bb, 0x20b, 0x342, 0x382, 0xa9, 0x10e, 0x2b2, 0x308, 0x15, 0x3, 0x33a, 0x1f5, 0x1cd, 0x2a3, 0x35a, 0x264, 0x31a, 0x37d, 0x387, 0x1ee, 0x311, 0xe5, 0xe4, 0x1f2, 0x2a6, 0x21d, 0x7b, 0x14d, 0x91, 0x260, 0x34b, 0x236, 0x16b, 0x64, 0x3c0, 0x39c, 0x332, 0x157, 0x35b, 0x372, 0x4e, 0x3c6, 0x1e1, 0xd8, 0x2cd, 0x214, 0x1cf, 0x8f, 0x1fb, 0x312, 0x3df, 0x111, 0x3f, 0x5, 0x147, 0x21f, 0x257, 0x3ec, 0x1e7, 0x2a5, 0x127, 0x18e, 0x80, 0x232, 0x13a, 0x12f, 0x12c, 0x216, 0x3e3, 0x22e, 0x8d, 0x3d7, 0x1b3, 0x2a9, 0x1d4, 0x253, 0x3bd, 0xac, 0x49, 0xad, 0x15f, 0x3f9, 0x1e4, 0x19f, 0xd2, 0x43, 0x22c, 0x14b, 0x1d1, 0x221, 0x281, 0x3f5, 0x22e, 0x11a, 0x347, 0x183, 0x2ca, 0x2fe, 0x1cd, 0x14f, 0x173, 0x304, 0x1cc, 0x363, 0x38, 0x2d5, 0x3ed, 0x1e2, 0x3cd, 0xfb, 0x2f7, 0x2a5, 0x24e, 0x231, 0x9, 0x368, 0x301, 0x342, 0x30d, 0x2a4, 0x62, 0x37a, 0x1d8, 0x149, 0x180, 0xb7, 0x123, 0x3be, 0x325, 0x2f9, 0x312, 0x3b7, 0x4d, 0x1f8, 0x50, 0xba, 0x2e9, 0x19a, 0x32a, 0x162, 0x3a0, 0x1a, 0x39d, 0x41, 0x1e, 0x33f, 0x164, 0x353, 0x3a9, 0x372, 0x9c, 0x303, 0x313, 0x19b, 0x106, 0x29, 0x271, 0x23b, 0x11c, 0x3b4, 0x230, 0x225, 0x223, 0x2d0, 0x163, 0x18c, 0x151, 0x24c, 0x260, 0x29f, 0xca, 0x34a, 0x249, 0xee, 0x2f1, 0x256, 0x1fd, 0x2de, 0xd4, 0x75, 0x32d, 0x3bd, 0x158, 0x124, 0x161, 0x1dd, 0x3c7, 0x1ee, 0x22b, 0x394, 0x329, 0x31f, 0x7d, 0x269, 0x1f7, 0x3cb, 0x8, 0x144, 0x24a, 0x293, 0x12c, 0x25, 0x397, 0x154, 0xc2, 0x20e, 0x51, 0x125, 0x293, 0x258, 0x94, 0x87, 0x16d, 0x76, 0x2a0, 0x180, 0x16e, 0x85, 0x1cf, 0x23c, 0x38f, 0x139, 0x46, 0x18b, 0x315, 0x2d0, 0x2c6, 0x239, 0x29a, 0x81, 0x8b, 0x2a1, 0x1d1, 0x4b, 0x216, 0x397, 0x2a8, 0x308, 0x54, 0x30, 0x32b, 0x295, 0x3be, 0x243, 0x3f6, 0xa6, 0x30e, 0x1b2, 0x2e7, 0x5a, 0x35e, 0xc6, 0x151, 0x91, 0x192, 0xd5, 0xbb, 0x18a, 0x344, 0x3f5, 0x55, 0x61, 0x20e, 0x6, 0x1e6, 0x2d7, 0x371, 0x1cb, 0x378, 0x312, 0x367, 0x134, 0x3db, 0x109, 0x36d, 0x31e, 0xab, 0x93, 0x130, 0x29f, 0x194, 0x133, 0x26c, 0x2fb, 0x28f, 0x8d, 0x347, 0x306, 0x33a, 0x3dd, 0xef, 0x1ba, 0x6f, 0x160, 0x3eb, 0x222, 0x1f8, 0xa0, 0x2e8, 0x365, 0x196, 0x191, 0x26, 0x3d4, 0x236, 0x1a5, 0x249, 0x1dc, 0x3d6, 0x294, 0x3ef, 0x366, 0x165, 0x2fe, 0x39a, 0x135, 0x38a, 0x2c, 0x1fe, 0x146, 0x3f, 0x14, 0x5d, 0x2e9, 0x334, 0xb3, 0xa2, 0x9d, 0xb5, 0x1c1, 0x2a4, 0x188, 0x3c5, 0x2f5, 0x3c2, 0x19b, 0x11, 0x290, 0x15f, 0x3f7, 0x1ee, 0xbe, 0x13e, 0x3e2, 0x1f6, 0x395, 0x1d, 0x101, 0x3ca, 0x82, 0xf0, 0x331, 0x34c, 0x2fa, 0x1b5, 0x2a9, 0x2bb, 0x1cd, 0x135, 0x31d, 0xb0, 0x3eb, 0x4d, 0x3e9, 0x109, 0x2d3, 0x63, 0x151, 0x122, 0x241, 0x2a1, 0x3a2, 0x12c, 0x94, 0x10e, 0x1bd, 0x3b0, 0x25a, 0x6c, 0x326, 0x210, 0xeb, 0x1fc, 0x3c8, 0x1c6, 0x1ca, 0x25b, 0xce, 0x3bb, 0x2a5, 0x12a, 0x358, 0x240, 0x203, 0x33f, 0x199, 0x155, 0x3aa, 0x35, 0x75, 0xaf, 0x3ae, 0x2bd, 0x201, 0x27b, 0xa3, 0x3f, 0x28, 0x174, 0x365, 0x32c, 0x24d, 0x130, 0x137, 0x259, 0x18a, 0x281, 0x3cf, 0x2a8, 0x219, 0x150, 0x180, 0x2dc, 0x214, 0x263, 0x388, 0x11c, 0x2cb, 0x348, 0x72, 0x3c1, 0x7d, 0x1b6, 0x34f, 0x31c, 0x12, 0x376, 0xf8, 0x228, 0x3ad, 0x35b, 0x3a6, 0x3a4, 0x2e0, 0x3da, 0x2b0, 0x144, 0x274, 0x1a1, 0x2f, 0x3d, 0x2d8, 0x138, 0x5c, 0x2f2, 0x158, 0x132, 0xe6, 0x197, 0x309, 0x14, 0x174, 0x2c3, 0xab, 0x24c, 0x324, 0x2a1, 0x34d, 0xb9, 0xa9, 0xc4, 0x3c5, 0x1e3, 0x313, 0xc3, 0x110, 0x2b4, 0x37d, 0xe, 0x1a3, 0x2a7, 0xdc, 0x19a, 0x166, 0x26, 0x34b, 0x328, 0x18a, 0x10b, 0x327, 0x16d, 0x1d8, 0x25a, 0xd8, 0x83, 0xa4, 0x2ab, 0x3f7, 0x3dc, 0x2f8, 0x1e2, 0x257, 0x2b7, 0xb1, 0x29b, 0x340, 0x2d6, 0x9b, 0x2fb, 0x22e, 0xc2, 0x54, 0xc0, 0x2dc, 0x21, 0x19e, 0x7f, 0x1e4, 0x1c6, 0x394, 0x17e, 0x279, 0x3ce, 0x1d, 0x202, 0x333, 0x19, 0x31b, 0x2f1, 0x294, 0x3a7, 0x205, 0x1e6, 0x34e, 0x375, 0x23c, 0x227, 0x3b4, 0x1a4, 0x72, 0x38b, 0x1f4, 0x1ab, 0x95, 0x358, 0x89, 0x1e, 0x1ce, 0x1a6, 0x2fa, 0x36a, 0x2b6, 0x1f5, 0xef, 0x2e1, 0x2f9, 0xa6, 0x23, 0x316, 0x9e, 0x2a6, 0x198, 0x3ee, 0xc7, 0x9, 0x376, 0x288, 0x1c2, 0x113, 0x2f0, 0x3a9, 0x345, 0x11f, 0xaf, 0x2a3, 0x38a, 0x160, 0x367, 0x1b2, 0x315, 0x2ad, 0xcc, 0x3ee, 0x18e, 0x24, 0x386, 0x33f, 0x26d, 0x17d, 0x36a, 0x165, 0x3dd, 0x371, 0x243, 0x38f, 0x1da, 0x1a4, 0xe4, 0x237, 0x3bb, 0x286, 0x284, 0x39d, 0x19, 0x23f, 0x3d6, 0x8d, 0x20e, 0x30, 0x16e, 0x21, 0x33c, 0x1fc, 0x33b, 0x5f, 0x27c, 0x32f, 0x2b7, 0x162, 0x27e, 0x236, 0x133, 0x344, 0x397, 0x16d, 0x3b0, 0x17a, 0x2c9, 0x22, 0xad, 0x3ba, 0xe, 0x346, 0x28e, 0x2e9, 0x196, 0x93, 0x192, 0x2a1, 0x293, 0x2e4, 0x141, 0x5b, 0x4e, 0x2e, 0x2f2, 0x2b0, 0xc1, 0x339, 0x146, 0x1f8, 0x109, 0x35e, 0x239, 0xfd, 0x8, 0x6d, 0x20b, 0x8a, 0x3ad, 0x177, 0x21e, 0xea, 0x171, 0x135, 0x6f, 0x312, 0x30e, 0x18b, 0x9e, 0x145, 0x269, 0x34f, 0x6b, 0x120, 0xf, 0x1ce, 0x34c, 0x3fa, 0x366, 0x33a, 0x2d7, 0x3be, 0x23c, 0x47, 0x2cb, 0x119, 0x301, 0x8a, 0x353, 0x1d5, 0xd4, 0x2bb, 0x273, 0x1cb, 0x3e5, 0xed, 0x1a4, 0x1c8, 0xce, 0x1e7, 0x3a, 0x34, 0x2b1, 0x9b, 0x3fe, 0x2a8, 0xec, 0xbd, 0x2c9, 0x44, 0x2b4, 0x1ef, 0xe0, 0xa, 0x2e8, 0x235, 0x14d, 0x1, 0x119, 0x301, 0x8a, 0x353, 0x1d5, 0xd4, 0x2bb, 0x273, 0x1cb, 0x3e5, 0xed, 0x1a4, 0x1c8, 0xce, 0x1e7, 0x3a, 0x34, 0x2b1, 0x9b, 0x3fe, 0x2a8, 0xec, 0xbd, 0x2c9, 0x44, 0x2b4, 0x1ef, 0xe0, 0xa, 0x2e8, 0x235, 0x14d, 0x1, 0x119, 0x301, 0x8a, 0x353, 0x1d5, 0xd4, 0x2bb, 0x273, 0x1cb, 0x3e5, 0xed, 0x1a4, 0x1c8, 0xce, 0x1e7, 0x3a, 0x34, 0x2b1, 0x9b, 0x3fe, 0x2a8, 0xec, 0xbd, 0x2c9, 0x44, 0x2b4, 0x1ef, 0xe0, 0xa, 0x2e8, 0x235, 0x14d, 0x1, 0x119, 0x301, 0x8a, 0x353, 0x1d5, 0xd4, 0x2bb, 0x273, 0x1cb, 0x3e5, 0xed, 0x1a4, 0x1c8, 0xce, 0x1e7, 0x3a, 0x34, 0x2b1, 0x9b, 0x3fe, 0x2a8, 0x232, 0x1f, 0x59, 0x155, 0x2de, 0x165, 0x36f, 0x375, 0x1c4, 0xf2, 0x311, 0x27c, 0xa7, 0x32a, 0x26, 0x26e, 0x3a2, 0x2e4, 0x10d, 0x1b9, 0x3a4, 0x253, 0x14f, 0x6f, 0x53, 0x8c, 0x218, 0x31f, 0x37f, 0x1d, 0x34, 0x16b, 0x26c, 0x3cf, 0x2da, 0x1bf, 0x313, 0x211, 0x99, 0x398, 0x28c, 0x3db, 0x168, 0x33, 0x3ee, 0x231, 0x240, 0x78, 0x1be, 0x121, 0x20e, 0xc0, 0x2cd, 0x52, 0x2be, 0x207, 0x346, 0x22a, 0x2c3, 0x151, 0x204, 0x119, 0x20b, 0x228, 0x2ae, 0x16f, 0x2b6, 0x3b3, 0x3be, 0xe2, 0x79, 0x38c, 0x13e, 0x257, 0x195, 0x13, 0x137, 0x1d1, 0x172, 0x282, 0x2d8, 0x1d2, 0x32d, 0x2a3, 0x233, 0x22d, 0x46, 0x10c, 0x38b, 0x3bb, 0x20a, 0x1a, 0x2b1, 0x136, 0x3e3, 0x16d, 0x2db, 0x38d, 0x30c, 0x248, 0x1cc, 0x146, 0x3e9, 0xb4, 0x21d, 0x1f7, 0x31c, 0x120, 0x3c, 0xdf, 0x294, 0x107, 0x60, 0x362, 0x29, 0x15f, 0x307, 0x1a3, 0x115, 0x365, 0x6d, 0x7c, 0x2c8, 0x17d, 0x366, 0x1e6, 0x85, 0x33c, 0x3fb, 0x36b, 0x357, 0x2e9, 0xab, 0x81, 0x288, 0x20b, 0x59, 0x2aa, 0x36a, 0x33a, 0x295, 0x263, 0x1fc, 0x1ee, 0x3ed, 0xdc, 0x196, 0x91, 0x51, 0x1c2, 0x8a, 0x157, 0x16f, 0x165, 0x2d7, 0x1cf, 0x23b, 0x33b, 0x2f8, 0x21f, 0x334, 0x93, 0x8b, 0x13a, 0x113, 0x3ad, 0x3aa, 0x2a9, 0x3dd, 0x3be, 0x1c4, 0x1e4, 0x5f, 0x3c4, 0x262, 0x191, 0x192, 0x125, 0x1a1, 0x2f0, 0x177, 0xd4, 0x2fe, 0x371, 0x23c, 0x238, 0x38c, 0x27c, 0x14e, 0xb3, 0x130, 0x2a1, 0xb5, 0x5e, 0x3a9, 0x21e, 0x359, 0xef, 0x243, 0x47, 0x275, 0x24b, 0x32f, 0x195, 0x26, 0xd5, 0x293, 0x30d, 0xf4, 0x345, 0xea, 0x39a, 0x1cb, 0x38f, 0x2cb, 0x1ca, 0x3e2, 0x2b7, 0x302, 0x29f, 0x1d1, 0x2e4, 0x21a, 0x2ed, 0x11f, 0x171, 0x1ba, 0x3f6, 0x1da, 0x13b, 0x17e, 0x3d1, 0x162, 0x3d4, 0xbb, 0x258, 0x141, 0x2d8, 0x3a4, 0xaf, 0xda, 0x1f0, 0x26d, 0x3fd, 0x3, 0x16e, 0x210, 0x2be, 0xe, 0x5, 0x3b2, 0x239, 0x3cb, 0x12, 0xf, 0xdf, 0x242, 0x54, 0x36, 0x11, 0x161, 0x2cf, 0xfc, 0x5a, 0x33, 0x3a3, 0x358, 0x104, 0xee, 0x55, 0xec, 0x1e1, 0x30c, 0x132, 0xff, 0x134, 0x223, 0x11d, 0x356, 0x101, 0x35c, 0x26c, 0x327, 0x1f3, 0x303, 0x1ed, 0x2bd, 0x160, 0x215, 0x10c, 0x237, 0x3ce, 0x3a0, 0x236, 0x314, 0x250, 0x5b, 0xe9, 0x253, 0x135, 0x2f9, 0xed, 0x13b, 0x2fc, 0x35f, 0x302, 0x137, 0x34d, 0x30d, 0x1e8, 0x10f, 0x359, 0x1de, 0x11e, 0x238, 0x311, 0x1e2, 0x262, 0x322, 0x241, 0x13a, 0x226, 0x2af, 0x16f, 0x2ca, 0x34e, 0x263, 0x3f8, 0x3b1, 0x357, 0x1db, 0x2ac, 0x1, 0xda, 0x1f0, 0x26d, 0x3fd, 0x3, 0x16e, 0x210, 0x2be, 0xe, 0x5, 0x3b2, 0x239, 0x3cb, 0x12, 0xf, 0xdf, 0x242, 0x54, 0x36, 0x11, 0x161, 0x2cf, 0xfc, 0x5a, 0x33, 0x3a3, 0x358, 0x1b4, 0x3c9, 0x34c, 0x3a7, 0x60, 0x326, 0x252, 0x3de, 0x3f, 0x2d, 0x33, 0x34f, 0x17b, 0x32, 0x2fb, 0x2b2, 0x37e, 0x15c, 0x2d2, 0x58, 0x30e, 0x10c, 0x67, 0x323, 0x13f, 0x328, 0x258, 0x10d, 0x1d3, 0xea, 0x273, 0x8f, 0x238, 0x22b, 0x381, 0x334, 0x24c, 0xa2, 0x20b, 0x164, 0x2fa, 0x306, 0xb7, 0x210, 0x175, 0x38, 0x28, 0x35e, 0x3b9, 0x31c, 0x112, 0x31b, 0x117, 0x76, 0x1e1, 0x211, 0xc1, 0x3f1, 0x364, 0xf9, 0x3d9, 0x3a, 0x340, 0xc5, 0x128, 0x5b, 0x1d2, 0x15e, 0x1ba, 0x3c3, 0x19f, 0x24b, 0xa7, 0x166, 0x192, 0x9d, 0x226, 0x157, 0x1b5, 0x27d, 0x85, 0xeb, 0x3c7, 0x346, 0x174, 0x18c, 0x3e1, 0x12, 0x1e, 0x37c, 0x234, 0x149, 0x2c9, 0x49, 0x1cc, 0x222, 0x38e, 0x28a, 0x356, 0x202, 0x16b, 0x344, 0x21c, 0x217, 0x170, 0x355, 0xde, 0x139, 0x299, 0x2fc, 0x2b7, 0x13, 0x1aa, 0xb5, 0x178, 0x2ee, 0x2a9, 0x36f, 0x39e, 0x1fc, 0x368, 0x33f, 0x256, 0x20e, 0x1b, 0x22, 0x31a, 0x146, 0x2e7, 0x145, 0x356, 0xd, 0x1a5, 0x216, 0x188, 0x270, 0xaf, 0x1ba, 0x38f, 0x275, 0x27c, 0x262, 0x93, 0x51, 0x20b, 0x2c8, 0x3fa, 0x6, 0x362, 0x290, 0x1ef, 0x3f, 0x5a, 0xcc, 0x24e, 0x39d, 0x249, 0x397, 0x3e6, 0x2e, 0x1d7, 0x6f, 0x139, 0x13b, 0x3e2, 0x195, 0x130, 0x125, 0x113, 0x157, 0x36a, 0x1e6, 0x21, 0x2ab, 0xe, 0x14, 0x35e, 0x37b, 0x6b, 0x82, 0x1dc, 0x2a8, 0x1bf, 0x15c, 0x1ad, 0x160, 0x46, 0xe4, 0xfb, 0x162, 0x29f, 0x293, 0x5e, 0x177, 0x2a9, 0x2d7, 0x263, 0x3fb, 0x36e, 0x5d, 0xc6, 0x3e1, 0x24, 0x78, 0x3d6, 0x308, 0x17a, 0x30c, 0xc1, 0x3eb, 0x18b, 0x3c1, 0x1e7, 0x349, 0x194, 0x258, 0x21a, 0x345, 0x359, 0x371, 0x1c4, 0x33b, 0x3ed, 0x2e9, 0x151, 0x8, 0x376, 0x1ce, 0x294, 0x54, 0xd8, 0x110, 0xe6, 0x222, 0x315, 0x23a, 0x286, 0x68, 0x133, 0x94, 0x2d9, 0xe7, 0x294, 0xa8, 0x360, 0x92, 0x27b, 0xd9, 0xf9, 0x37f, 0x3a0, 0x194, 0xb9, 0x7a, 0x21e, 0x1f5, 0x2e3, 0x1fc, 0x2df, 0x22a, 0xc6, 0x3cb, 0x90, 0x3c0, 0x117, 0x1d8, 0x22f, 0x169, 0xb0, 0x46, 0x1c8, 0x3ec, 0x302, 0x1aa, 0x2d4, 0x3ad, 0x2de, 0xf3, 0x21, 0x15f, 0x38, 0xa0, 0x185, 0x3a3, 0x2f6, 0x190, 0x3cf, 0x3e6, 0x5c, 0x355, 0x378, 0x3b4, 0x321, 0x14e, 0x322, 0x22c, 0x20b, 0x199, 0x3f3, 0x30, 0x245, 0x2b4, 0x32e, 0x3bf, 0x2a6, 0x356, 0x1a, 0x29d, 0x94, 0xb6, 0x28b, 0x39a, 0x8f, 0xf2, 0x2f8, 0x1b8, 0x2ac, 0x8, 0x2e5, 0x331, 0x8d, 0x149, 0x336, 0x99, 0x3fc, 0x2c1, 0x3c1, 0x3ce, 0x13f, 0xbb, 0x1c1, 0x3d0, 0xd4, 0x3b3, 0x335, 0x3fb, 0x2d5, 0x174, 0x239, 0x267, 0x89, 0x23f, 0xaa, 0x2db, 0x15c, 0x35a, 0x189, 0x230, 0x25b, 0x35f, 0x26, 0x14b, 0x28d, 0x157, 0x2dd, 0x391, 0x108, 0x2ea, 0x1c0, 0x109, 0x1bb, 0x39c, 0x8d, 0x292, 0xc3, 0xc1, 0x3b7, 0x86, 0x19c, 0xb1, 0x137, 0xb5, 0x3d2, 0x2de, 0x1e6, 0x84, 0x2ea, 0x380, 0x2d, 0x198, 0x254, 0x35c, 0x281, 0x188, 0x1d2, 0x2e2, 0x243, 0xf2, 0x1f9, 0x2e9, 0x14d, 0x80, 0xf, 0x1eb, 0x219, 0x3c2, 0x158, 0x58, 0x46, 0x390, 0x3ab, 0x26, 0x296, 0x226, 0x2aa, 0x183, 0x2dc, 0x290, 0x3b5, 0x3f0, 0x2ad, 0x1ab, 0x1a, 0x133, 0x250, 0x1b9, 0xea, 0x3bc, 0x388, 0x1ee, 0x147, 0x235, 0x3e1, 0x90, 0x389, 0x55, 0x2db, 0x2b8, 0x173, 0x53, 0x348, 0x3e2, 0x25d, 0x324, 0x1c2, 0x164, 0x3fd, 0x30, 0x83, 0x2c2, 0x146, 0x38e, 0x7d, 0x1d, 0x11b, 0x96, 0x21a, 0x10f, 0x1f5, 0x1cf, 0x3f9, 0x2d5, 0x2e8, 0xf6, 0x31c, 0x82, 0x379, 0x2da, 0x303, 0x2ef, 0xde, 0x1da, 0x321, 0x29c, 0x93, 0x144, 0xf8, 0x34c, 0x107, 0x36, 0x110, 0x398, 0x268, 0xf9, 0x2f7, 0x29b, 0xbb, 0x382, 0x35b, 0x2a9, 0x376, 0x26b, 0x61, 0x17a, 0x56, 0x2c, 0x46, 0x329, 0x2b7, 0x130, 0x13a, 0x59, 0x3fa, 0x30, 0x106, 0x31a, 0x222, 0x9e, 0x3bb, 0x349, 0xbb, 0x30d, 0x177, 0x165, 0x85, 0x2ab, 0x70, 0x109, 0xcc, 0x254, 0x2b1, 0x216, 0x5b, 0x11f, 0xef, 0x1c4, 0x1ee, 0x28e, 0xc6, 0x337, 0x112, 0x1dc, 0x16d, 0x303, 0x1d7, 0x378, 0x2cb, 0x27c, 0x334, 0x81, 0x368, 0x1ce, 0x8d, 0x12d, 0x30c, 0x201, 0x30e, 0xe4, 0x3d1, 0x26, 0x125, 0x8a, 0x17d, 0x6, 0x326, 0x161, 0x146, 0x315, 0x1f4, 0xe8, 0x194, 0x2e4, 0x3a9, 0x2a9, 0x295, 0x1d6, 0xe, 0xa0, 0x21d, 0x24e, 0xd7, 0x344, 0x188, 0x3a4, 0x39a, 0x23c, 0x33b, 0x357, 0x31e, 0x3e1, 0x120, 0x23f, 0x2a8, 0x1e3, 0x3bd, 0x6f, 0x1da, 0x24b, 0x262, 0x91, 0x6d, 0x33f, 0x294, 0x2a0, 0x265, 0xc1, 0x367, 0x218, 0xfb, 0x302, 0x2a1, 0x113, 0x2aa, 0x306, 0x362, 0xad, 0x32e, 0x2e7, 0x23a, 0x1d, 0x2e5, 0x1be, 0x308, 0x38d, 0x2d2, 0x312, 0x348, 0x393, 0x191, 0xa2, 0x1f0, 0x256, 0xa8, 0x336, 0xc1, 0x2c7, 0x72, 0x3d1, 0x4c, 0x9d, 0x59, 0x3fd, 0xc0, 0x22, 0x1cc, 0xd9, 0x3c1, 0x24f, 0x34b, 0xb5, 0x353, 0x1b3, 0x16e, 0x129, 0x197, 0x2e7, 0x7d, 0x74, 0x194, 0x1c1, 0x2bf, 0x165, 0x10a, 0x2be, 0x380, 0xb4, 0x1b6, 0xd, 0x266, 0x2a4, 0x345, 0x1f5, 0x335, 0x3e7, 0x5, 0x163, 0x34f, 0x333, 0x1a2, 0x188, 0x341, 0x273, 0x1c4, 0x3dc, 0x22a, 0x239, 0x31c, 0x208, 0x3f5, 0x3c5, 0x1c9, 0x1ba, 0x8e, 0x17c, 0x2e9, 0x13d, 0x12, 0x3c0, 0xaa, 0x2f5, 0x3bd, 0xde, 0x361, 0x27c, 0x261, 0x204, 0x376, 0xdf, 0x184, 0x3c2, 0x169, 0x189, 0x1a4, 0x3cd, 0x2cc, 0x51, 0xf8, 0x12b, 0x54, 0x19b, 0x264, 0x367, 0x39, 0x3ec, 0x26, 0x24a, 0x228, 0x3fa, 0x60, 0x11, 0xe6, 0x268, 0x3e4, 0x323, 0x3a1, 0x25e, 0x3ad, 0x2dd, 0xb7, 0x290, 0x1c3, 0x2f1, 0x76, 0xae, 0x2e6, 0x139, 0x321, 0xcd, 0x81, 0x1bb, 0xdf, 0x308, 0x313, 0x35a, 0xa6, 0xe5, 0x29c, 0x91, 0x1b4, 0x39c, 0x61, 0x1e1, 0x169, 0x312, 0x299, 0x257, 0x93, 0x232, 0x277, 0x8d, 0xbd, 0xac, 0x160, 0xd2, 0x3cd, 0x191, 0x144, 0x3c9, 0x294, 0x292, 0x211, 0x2c, 0x118, 0x2fc, 0xb3, 0x22c, 0xf8, 0x256, 0x150, 0xc3, 0x201, 0x23, 0x25b, 0x195, 0x241, 0x1f, 0x34c, 0x2a, 0x19b, 0xc1, 0x187, 0x1c8, 0x2b7, 0xc9, 0x384, 0x26d, 0x107, 0x1b0, 0x99, 0x3b7, 0x39, 0x3d1, 0x98, 0x274, 0x2c8, 0x3a7, 0x36, 0x92, 0x3f1, 0x86, 0xfb, 0x13, 0x24a, 0x59, 0x3f3, 0x300, 0x110, 0xff, 0x316, 0x19c, 0x181, 0x14b, 0x8a, 0x1fd, 0x60, 0x22, 0x398, 0x364, 0x237, 0xb1, 0x1aa, 0x113, 0x2ba, 0xc, 0x106, 0x73, 0x268, 0x3c1, 0x97, 0x137, 0x1a1, 0x155, 0x205, 0x326, 0x18d, 0x4d, 0xf9, 0x395, 0x3a1, 0xb5, 0x386, 0x3d6, 0x3b0, 0x2f2, 0x6f, 0x2cb, 0x3c4, 0xab, 0x40, 0x78, 0x55, 0x1e3, 0x1d7, 0x3f6, 0x38c, 0xdc, 0x29a, 0x24, 0x23f, 0x16d, 0x2e, 0x135, 0x47, 0x2f8, 0x365, 0x3e1, 0x112, 0x2fb, 0x3e6, 0x392, 0x1cb, 0x1e4, 0x357, 0xc6, 0x18e, 0x19, 0x397, 0x4e, 0x171, 0x23c, 0x1ee, 0x5d, 0x1ec, 0x358, 0x249, 0x31, 0x3a4, 0xef, 0x23b, 0x36e, 0x36d, 0x3ee, 0x39d, 0x344, 0x5b, 0xea, 0x3be, 0x3fb, 0x206, 0x2c6, 0x24e, 0x2b1, 0x94, 0x2ed, 0x2fe, 0x263, 0x307, 0xa0, 0xcc, 0x284, 0x133, 0x141, 0x21e, 0x2d7, 0x1d6, 0x70, 0x5a, 0x36c, 0x68, 0x4b, 0xf4, 0x2a9, 0x85, 0x175, 0x3f, 0x2ad, 0x286, 0x236, 0x2e4, 0x177, 0x33a, 0x108, 0x1ef, 0x3db, 0x23a, 0xe8, 0xbb, 0x5e, 0x16f, 0x32b, 0x290, 0x32e, 0x315, 0x3bb, 0x27e, 0x293, 0x3ad, 0x366, 0x362, 0x161, 0x222, 0xf9, 0x323, 0x29f, 0x1a1, 0x2aa, 0x6, 0x106, 0xe6, 0x1b2, 0x305, 0x343, 0x1bf, 0x373, 0x1fb, 0x38c, 0x1b8, 0x27a, 0x120, 0x3b8, 0x1f3, 0x392, 0x396, 0x399, 0x28e, 0x7b, 0x1ac, 0x249, 0x62, 0x28b, 0x371, 0x3f8, 0x103, 0x2c6, 0x95, 0x2d6, 0xa9, 0x283, 0x36f, 0x1d6, 0xe0, 0x168, 0x356, 0x289, 0x172, 0x177, 0x27d, 0x29, 0x363, 0x1c7, 0x3d9, 0x27e, 0x12f, 0x2af, 0x306, 0x245, 0x73, 0x1b2, 0x67, 0x181, 0x125, 0xb2, 0x3a7, 0xd8, 0x132, 0x187, 0x329, 0x32a, 0x22c, 0x3e0, 0x121, 0xbd, 0x2b0, 0x22d, 0xe5, 0x262, 0x102, 0x1c3, 0x3d6, 0x369, 0x3da, 0x378, 0xe3, 0x6e, 0x29a, 0x48, 0xee, 0x37a, 0x2e0, 0x2e1, 0x1e4, 0x2a7, 0x318, 0x6b, 0x190, 0x21c, 0x3a4, 0x1de, 0xfe, 0x346, 0x2b5, 0x127, 0x2b1, 0x128, 0x3a6, 0x3dd, 0x271, 0x38, 0x5a, 0x2d1, 0x1a0, 0x258, 0x35b, 0x19d, 0x108, 0x3de, 0x377, 0x1f4, 0x29b, 0x34d, 0x3ad, 0x2c5, 0x193, 0x31a, 0x268, 0x31f, 0x162, 0x14b, 0x228, 0x3ef, 0x203, 0x117, 0x1e3, 0x355, 0x317, 0x2f8, 0x18f, 0x267, 0x19, 0x247, 0xe9, 0xef, 0xfe, 0x285, 0x2c6, 0x12a, 0x34a, 0x141, 0x6a, 0x123, 0x175, 0xfc, 0x28a, 0xe8, 0x2ec, 0x1e9, 0x366, 0x193, 0x23d, 0x1b2, 0xce, 0x20d, 0x13a, 0x332, 0x15, 0x265, 0x16, 0x69, 0x32f, 0x24c, 0x2d9, 0x37c, 0x1d8, 0x1ed, 0x378, 0x1c6, 0x1b8, 0xfd, 0x89, 0x1ff, 0x30f, 0x2bc, 0x71, 0x36b, 0x3b2, 0x3d5, 0xd7, 0x4a, 0x1d3, 0x3dd, 0xeb, 0xe0, 0x2d0, 0x143, 0x65, 0x30d, 0x2b3, 0x25f, 0xad, 0x111, 0x1f2, 0x12e, 0x354, 0x114, 0x3ef, 0x6c, 0x132, 0x30e, 0xbf, 0x166, 0x288, 0xe7, 0xc2, 0x22f, 0x1c5, 0x3b4, 0x3c4, 0x2ac, 0x9, 0x23f, 0x1bd, 0x2e0, 0x1cb, 0x399, 0x115, 0x1ec, 0x17b, 0xd1, 0x5b, 0x3a8, 0x39e, 0x307, 0x280, 0xdb, 0x68, 0x12c, 0x35b, 0x33a, 0x29, 0x2cf, 0x315, 0x2f7, 0x3a1, 0x1a1, 0x2ba, 0x60, 0x110, 0x3f1, 0x39, 0x2b7, 0xf, 0x55, 0x303, 0x135, 0x238, 0x357, 0x239, 0x358, 0x26c, 0x5b, 0x359, 0x263, 0xe, 0x5a, 0x356, 0x236, 0x30d, 0x16f, 0x16e, 0x161, 0x134, 0x237, 0x302, 0x13a, 0x26d, 0x54, 0x30c, 0x160, 0x13b, 0x262, 0x1, 0xf, 0x55, 0x303, 0x135, 0x238, 0x357, 0x239, 0x358, 0x26c, 0x5b, 0x359, 0x263, 0xe, 0x5a, 0x356, 0x236, 0x30d, 0x16f, 0x16e, 0x161, 0x134, 0x237, 0x302, 0x13a, 0x26d, 0x54, 0x30c, 0x160, 0x13b, 0x262, 0x1, 0xf, 0x55, 0x303, 0x135, 0x238, 0x357, 0x239, 0x358, 0x26c, 0x5b, 0x359, 0x263, 0xe, 0x5a, 0x356, 0x236, 0x30d, 0x16f, 0x16e, 0x161, 0x134, 0x237, 0x302, 0x13a, 0x26d, 0x54, 0x30c, 0x160, 0x13b, 0x262, 0x1, 0xf, 0x55, 0x303, 0x135, 0x238, 0x357, 0x239, 0x358, 0x26c, 0x5b, 0x359, 0x263, 0xe, 0x5a, 0x356, 0x236, 0x30d, 0x16f, 0x16e, 0x161, 0x134, 0x237, 0x302, 0x13a, 0x26d, 0x54, 0x30c, 0x1e, 0x154, 0x2e, 0x374, 0x399, 0x5d, 0x2ff, 0x26f, 0x94, 0x283, 0x34e, 0x175, 0x3f0, 0xfa, 0x27e, 0x16a, 0x2ba, 0x180, 0x124, 0x187, 0x17e, 0x322, 0x1b4, 0x37c, 0x369, 0x2ef, 0x38f, 0x1f9, 0x63, 0x6b, 0x9b, 0x229, 0x359, 0xcf, 0x38, 0x2d0, 0x105, 0x259, 0x2f0, 0x2c5, 0x83, 0x339, 0x86, 0x35f, 0x8b, 0x3c9, 0x234, 0x22f, 0x31d, 0x33e, 0xdc, 0x1fa, 0x41, 0x397, 0xe9, 0x3bc, 0x3fb, 0x28, 0x330, 0x68, 0xb9, 0x1d5, 0x32b, 0x15a, 0x9a, 0x237, 0x20d, 0xe1, 0x34c, 0x149, 0x158, 0xa6, 0x9f, 0x251, 0x200, 0x77, 0x1f3, 0xaf, 0x71, 0x1b7, 0x35e, 0x95, 0x29d, 0x21a, 0x15b, 0x84, 0x363, 0x223, 0x395, 0xd5, 0x114, 0x3a7, 0x2c9, 0xb, 0xd2, 0x14e, 0x102, 0x203, 0x55, 0x20f, 0xdd, 0x1e4, 0x115, 0x3b9, 0x39d, 0x25, 0x3a6, 0x2d7, 0x15f, 0xfc, 0x23a, 0x29b, 0x25e, 0x2aa, 0x60, 0x49, 0x367, 0x25b, 0x2cc, 0x6d, 0x3c, 0x159, 0x170, 0x325, 0x3dc, 0x36d, 0x127, 0x34a, 0x21a, 0x2b6, 0x210, 0x32e, 0x278, 0x25c, 0x125, 0x332, 0xa8, 0x56, 0x53, 0x9f, 0xab, 0x12, 0x3b8, 0x30f, 0x1cd, 0x7f, 0x206, 0x66, 0x1a, 0x258, 0x1d5, 0x25f, 0x161, 0xd9, 0x338, 0x130, 0x3e, 0x121, 0x3c2, 0x1c5, 0x19f, 0xdc, 0x3f4, 0x104, 0x87, 0x28b, 0x375, 0x307, 0x2d, 0x2a5, 0x194, 0x178, 0x2c5, 0x106, 0xff, 0x39, 0x195, 0x144, 0x39c, 0x76, 0x3da, 0x3e5, 0x2f8, 0x63, 0xd6, 0x26c, 0x16c, 0x1f5, 0x1d6, 0x21b, 0x28a, 0x349, 0x25e, 0x15d, 0x180, 0x248, 0x215, 0x3e2, 0x24c, 0x2e5, 0x28f, 0x385, 0x26a, 0x1e4, 0x22a, 0x2ff, 0xd7, 0x250, 0x35, 0x85, 0x2f3, 0x1c7, 0x1e7, 0x26e, 0x114, 0x347, 0x336, 0x58, 0x13b, 0x19a, 0x10, 0x3c0, 0x1bd, 0x32d, 0x23c, 0x1b7, 0x2b5, 0x254, 0xc5, 0x1e8, 0x33a, 0x148, 0x28c, 0x3c1, 0x181, 0x274, 0x34c, 0x292, 0x169, 0x139, 0x78, 0x16d, 0x392, 0x23c, 0x36e, 0x2c6, 0x284, 0x4b, 0x177, 0x32b, 0x161, 0x1b2, 0xfb, 0x192, 0x3e0, 0x61, 0x15c, 0x378, 0x5f, 0x31e, 0x6b, 0x26c, 0x2d8, 0x3dd, 0x2ab, 0x1f8, 0x1f4, 0x3d4, 0x113, 0x3ef, 0x2c9, 0x2c, 0x13b, 0x334, 0x40, 0x23f, 0x3e6, 0x171, 0x23b, 0x206, 0xcc, 0x68, 0x2e4, 0x16f, 0x362, 0xe6, 0x43, 0x2b7, 0x51, 0x1ce, 0x76, 0x3bd, 0x38f, 0x3ed, 0x239, 0x2f6, 0x216, 0x345, 0x295, 0x3ba, 0x2e7, 0x1e7, 0xd5, 0x59, 0x20e, 0x30c, 0x312, 0x24b, 0xab, 0x24, 0x2fb, 0x4e, 0xef, 0x3fb, 0xa0, 0x36c, 0x236, 0x5e, 0x366, 0x106, 0x1fe, 0xe4, 0xb3, 0x6d, 0x37c, 0x1bf, 0x2a3, 0x238, 0x28e, 0x37b, 0xd7, 0xa9, 0xd4, 0x21, 0x363, 0x9e, 0x12e, 0x125, 0x26d, 0x2a0, 0x2b0, 0x139, 0x3c4, 0x29a, 0x112, 0x397, 0x3a4, 0x3be, 0x307, 0x5a, 0x286, 0xbb, 0x3ad, 0x6, 0x110, 0x367, 0x17e, 0x93, 0x376, 0x28f, 0xf0, 0x1bd, 0xaf, 0x388, 0x103, 0xcc, 0xd0, 0x382, 0x36a, 0x245, 0xff, 0xe4, 0x166, 0x1b4, 0x3d6, 0x3c6, 0xdd, 0x33b, 0x1d9, 0x127, 0x133, 0x1e8, 0xf3, 0xad, 0x268, 0x279, 0x192, 0x3c9, 0x184, 0x2f2, 0x3e5, 0x3f2, 0x239, 0x1e5, 0x4a, 0x21e, 0x10a, 0x3b5, 0x9e, 0x25c, 0x9d, 0x34c, 0x25a, 0x2bd, 0x2cb, 0x1b8, 0x39f, 0xc8, 0x310, 0x17f, 0x1d6, 0x7e, 0xfa, 0x3d4, 0x226, 0x3a7, 0x265, 0x2c0, 0x321, 0xab, 0x48, 0x3fe, 0x270, 0x2eb, 0x387, 0x5a, 0x105, 0x2ec, 0x157, 0x60, 0x248, 0x46, 0x257, 0x204, 0x78, 0x2da, 0x253, 0x1c4, 0x285, 0x66, 0x68, 0x1c1, 0x1b5, 0x326, 0x27b, 0x72, 0xb3, 0xda, 0x1eb, 0x1e3, 0x26a, 0x399, 0x2e8, 0x297, 0x29d, 0xf4, 0x27d, 0x252, 0x134, 0x338, 0xc9, 0x3e0, 0xc2, 0x179, 0x3f6, 0x1f9, 0x318, 0x2f6, 0x25, 0x10f, 0x85, 0x3de, 0x4f, 0x12e, 0x24a, 0x1a6, 0x12d, 0x35a, 0x361, 0xdc, 0x1e0, 0x2fd, 0x171, 0xfe, 0x28, 0x36c, 0xca, 0x1e9, 0x6, 0x49, 0x215, 0x32f, 0x204, 0xf0, 0x37a, 0x2bc, 0x7f, 0x14, 0x1b6, 0x65, 0x2f0, 0x3, 0x220, 0x30e, 0x393, 0x102, 0x78, 0x1bd, 0x15e, 0x23b, 0xa, 0xdb, 0x236, 0x178, 0x205, 0x110, 0x187, 0x3cd, 0x81, 0x3c, 0x2da, 0xaf, 0x319, 0x5, 0x269, 0x11b, 0xbc, 0x306, 0x88, 0x2c7, 0x3e2, 0x244, 0x1e, 0x16d, 0x253, 0x388, 0x206, 0x330, 0x289, 0x5e, 0x183, 0x44, 0x367, 0x1f1, 0x122, 0xf, 0x2b2, 0x32d, 0x1c4, 0x103, 0x198, 0x340, 0x2f, 0x2c5, 0x22, 0x3b7, 0x2fc, 0x91, 0x203, 0x159, 0x392, 0xe2, 0x285, 0xcc, 0x1a0, 0x213, 0x366, 0x11, 0x3df, 0x17e, 0x24c, 0x305, 0x2a8, 0x1c9, 0x71, 0x346, 0x66, 0xd0, 0x30d, 0x1b3, 0x20c, 0x3eb, 0xbf, 0x126, 0x386, 0x154, 0x2e0, 0x23c, 0x1a3, 0x33, 0x68, 0x382, 0x2dd, 0x106, 0x3f1, 0x25b, 0x93, 0x1c3, 0xaa, 0x170, 0x3c0, 0x3e6, 0x39a, 0x3fb, 0x109, 0x286, 0x1d1, 0x2aa, 0x1b, 0x201, 0x13b, 0x196, 0x24, 0x3f5, 0x3a4, 0x1cf, 0x70, 0x145, 0x27e, 0x113, 0x347, 0x30c, 0xa6, 0x3c4, 0xfd, 0x19, 0x188, 0x2fe, 0x2ab, 0x3db, 0x1e7, 0x2a1, 0x26d, 0x12d, 0x173, 0x275, 0x365, 0x6b, 0x344, 0x345, 0x85, 0x363, 0xf9, 0x302, 0x20b, 0x8d, 0x15c, 0x3f6, 0x3ed, 0x1ec, 0xd7, 0x141, 0x165, 0x290, 0x134, 0xfb, 0x8b, 0x1ce, 0x3b0, 0x2a3, 0x1e4, 0x2e8, 0x24e, 0x18a, 0x177, 0x16e, 0xe6, 0x218, 0xb3, 0x368, 0x28f, 0x2e, 0x243, 0x36e, 0x21d, 0x68, 0x30d, 0x366, 0x22, 0x367, 0x3e2, 0x81, 0x78, 0x37a, 0x171, 0x1fc, 0xa0, 0x356, 0xbb, 0x157, 0x180, 0xc1, 0x1a4, 0x334, 0x200, 0x2fb, 0x270, 0x3be, 0xe, 0x2ad, 0x349, 0x1a1, 0x3ef, 0x265, 0x312, 0x27c, 0x29a, 0x82, 0x31, 0x359, 0x1d6, 0x1f8, 0x3bb, 0xd5, 0x2c8, 0x2a0, 0x1ad, 0x2cb, 0x2e9, 0x18e, 0x389, 0x383, 0xef, 0x3c7, 0x168, 0xe8, 0x16a, 0x3f3, 0x265, 0x22d, 0x1e2, 0xfd, 0x32, 0x229, 0x3dd, 0x2ea, 0x38e, 0x12e, 0x274, 0x14a, 0x22f, 0x2f9, 0x3f2, 0x1ec, 0x1ae, 0x10d, 0x33a, 0x15a, 0x2c1, 0x2b7, 0x119, 0x1eb, 0x303, 0x396, 0x1b7, 0x21d, 0xd0, 0x2f, 0x306, 0x220, 0x23, 0x14e, 0x10, 0xee, 0x4e, 0x2eb, 0x7, 0x2ad, 0x29b, 0x28d, 0x347, 0x211, 0x298, 0x21f, 0x3cb, 0x320, 0x2d8, 0x1a7, 0x2f3, 0x9e, 0x2c4, 0x301, 0x8d, 0x2b8, 0x3c3, 0x357, 0x2ff, 0x2d6, 0xf4, 0x3cc, 0x18d, 0x43, 0x32a, 0x1b4, 0x28f, 0x5c, 0x11e, 0x346, 0x198, 0x11b, 0x2f0, 0xc, 0x248, 0x230, 0xcd, 0x100, 0x2fb, 0xe9, 0x2e3, 0x70, 0x28a, 0x1ea, 0x8a, 0x15, 0x158, 0x1da, 0x1b8, 0xc7, 0x26c, 0x1d3, 0x246, 0x363, 0x1f2, 0x13, 0x7c, 0xc2, 0x3da, 0x47, 0x115, 0x3a3, 0x133, 0x35b, 0xb7, 0xe6, 0x39, 0x2cc, 0x376, 0xaa, 0x1c9, 0x1c4, 0x31b, 0x217, 0x371, 0x7, 0x153, 0x27e, 0x45, 0x15, 0x2b0, 0x361, 0x1db, 0x6b, 0x10b, 0x35, 0x108, 0x111, 0x338, 0x8b, 0x331, 0x37e, 0x1ba, 0x3b1, 0x185, 0x68, 0x2f, 0x205, 0x92, 0x118, 0xcd, 0x200, 0x3fe, 0x341, 0x263, 0x21b, 0x3e8, 0xd5, 0x332, 0x25a, 0x38a, 0x22b, 0x18c, 0x39d, 0x2a4, 0x2ca, 0xad, 0x2c1, 0x167, 0x6d, 0x343, 0x5c, 0x23c, 0x103, 0xdb, 0x194, 0x2af, 0x300, 0x201, 0xe5, 0x156, 0x112, 0x21c, 0x2bb, 0x2ab, 0x377, 0x24f, 0x13a, 0x14a, 0x57, 0x3f6, 0x3af, 0x2ff, 0x1a5, 0x3d0, 0x25f, 0xe6, 0x72, 0x322, 0x386, 0x2b2, 0x15e, 0x1fc, 0x280, 0x105, 0x293, 0x1fd, 0x19b, 0x312, 0x1e2, 0x1fa, 0xc8, 0x16c, 0x1a7, 0x1ef, 0x278, 0x20d, 0x7c, 0x184, 0x373, 0x238, 0x174, 0x95, 0x4b, 0x2b3, 0x245, 0x3eb, 0x1f1, 0x102, 0x3c0, 0x383, 0x1de, 0x307, 0x352, 0x29b, 0x113, 0x107, 0xac, 0x1da, 0x370, 0x31c, 0x344, 0x23f, 0x4e, 0x3be, 0x70, 0x23a, 0x29f, 0x2c8, 0x12d, 0x38a, 0x5f, 0x239, 0xd7, 0x21a, 0x1e6, 0x31a, 0x218, 0x191, 0x386, 0x16d, 0x171, 0x3fb, 0x5a, 0xe8, 0x1a1, 0x347, 0x56, 0x1da, 0x2e9, 0x6b, 0x216, 0xd4, 0x52, 0x134, 0x3d1, 0x288, 0x3d6, 0x2e, 0x23c, 0x206, 0x36c, 0xbb, 0x2aa, 0xd8, 0x160, 0x27c, 0xfd, 0xc8, 0x2d8, 0x295, 0x363, 0x3c1, 0x130, 0x33f, 0x3b0, 0x135, 0x1ee, 0x2c6, 0x68, 0x5e, 0x6, 0x99, 0x1a4, 0x196, 0x120, 0x87, 0x359, 0x2ab, 0x2e7, 0x12e, 0x1c2, 0x8d, 0x2f2, 0x47, 0x5d, 0x24e, 0x4b, 0x16f, 0x106, 0x367, 0x32f, 0x8, 0x1dc, 0x270, 0x1cf, 0x380, 0x1f4, 0xd5, 0x26d, 0x17a, 0x6f, 0x2f8, 0x1ec, 0x2b1, 0xf4, 0x32b, 0xe6, 0xe4, 0x93, 0xf, 0x37a, 0x39a, 0x3e7, 0x2d0, 0x349, 0x113, 0x20e, 0x2b0, 0x2cb, 0x365, 0x358, 0x94, 0x2a9, 0x290, 0x1b2, 0x2b7, 0x6d, 0x28f, 0x170, 0x1c4, 0x14, 0x77, 0x138, 0x1cf, 0x309, 0x3d9, 0x2a1, 0x291, 0x313, 0x3f6, 0x2a7, 0x3a3, 0x18a, 0x35d, 0x83, 0x367, 0x257, 0x20, 0x2fb, 0x341, 0x19e, 0x1f8, 0x3ce, 0x9d, 0x294, 0x2b8, 0x227, 0x5d, 0x95, 0x12c, 0x36a, 0x44, 0x23, 0x262, 0x9, 0x3cf, 0xea, 0x3ac, 0x377, 0x12e, 0x384, 0x234, 0x3bd, 0x79, 0x3b2, 0x284, 0x1c1, 0x183, 0x92, 0x69, 0xcb, 0x120, 0x10e, 0x17f, 0x175, 0x223, 0x181, 0x7c, 0x219, 0x355, 0x33b, 0x2b5, 0x34, 0x5e, 0xc, 0x264, 0x13b, 0x156, 0x41, 0x188, 0x3b3, 0x2f3, 0xf9, 0x4c, 0x39b, 0x3b0, 0x26a, 0x3b1, 0x21d, 0x289, 0x3d2, 0x180, 0xb, 0x321, 0x29a, 0x32, 0x16c, 0x295, 0x2cf, 0x31f, 0x192, 0x39c, 0x2f5, 0x1cb, 0x2d5, 0x330, 0x194, 0x2ae, 0x6c, 0x160, 0xf1, 0x3f4, 0x249, 0x1d3, 0x214, 0x146, 0x338, 0x22c, 0x37c, 0x20f, 0x11e, 0x206, 0x2d1, 0x2ec, 0x17d, 0x19b, 0x53, 0x21f, 0x267, 0x1a2, 0x21e, 0xee, 0xe9, 0x263, 0xfc, 0x3ce, 0x13a, 0x242, 0x1ed, 0x238, 0x3b2, 0x101, 0x30d, 0x3, 0x132, 0x13b, 0x2ac, 0x104, 0x5b, 0x34e, 0x2cf, 0x237, 0x241, 0xdf, 0x303, 0x11e, 0x5, 0x356, 0x34d, 0x3fd, 0x30c, 0xed, 0x1db, 0x358, 0x250, 0x2ca, 0x161, 0x10c, 0x322, 0xf, 0x1f3, 0x1de, 0xe, 0x11d, 0x137, 0x26d, 0x1e1, 0x2f9, 0x357, 0x3a3, 0x314, 0x16f, 0x11, 0x215, 0x262, 0x12, 0x327, 0x359, 0x2be, 0x223, 0x302, 0x1f0, 0xec, 0x135, 0x3b1, 0x33, 0x236, 0x2af, 0x36, 0x160, 0x1e2, 0x3cb, 0x26c, 0x10f, 0x210, 0x134, 0x35f, 0xda, 0x55, 0x253, 0x3f8, 0x5a, 0x3a0, 0x226, 0x54, 0x2bd, 0x311, 0x239, 0x35c, 0x1e8, 0x16e, 0xff, 0x2fc, 0x1, 0xee, 0xe9, 0x263, 0xfc, 0x3ce, 0x13a, 0x242, 0x1ed, 0x238, 0x3b2, 0x101, 0x30d, 0x3, 0x132, 0x13b, 0x2ac, 0x104, 0x5b, 0x34e, 0x2cf, 0x237, 0x241, 0xdf, 0x303, 0x11e, 0x5, 0x356, 0x1dc, 0x3a4, 0x33c, 0x3db, 0x12e, 0x20b, 0x308, 0x2a3, 0x1ee, 0x21d, 0x236, 0x157, 0xd8, 0x312, 0x21f, 0x18e, 0x216, 0x2a9, 0xad, 0x43, 0x191, 0xf, 0x3e6, 0x371, 0x70, 0x1f4, 0x2a1, 0x256, 0x15c, 0x47, 0x2e8, 0x284, 0x30d, 0x6, 0xc1, 0x1ca, 0x29a, 0xc8, 0x2ed, 0x21, 0x222, 0x3d1, 0x6d, 0x55, 0xaf, 0x3fb, 0x2d0, 0x27e, 0x59, 0x12d, 0x6f, 0x3ed, 0x3ee, 0x18a, 0x16f, 0x22, 0x46, 0x334, 0x120, 0x31, 0x3dd, 0x1ef, 0x3c1, 0x192, 0x26b, 0x303, 0x23c, 0x14, 0x286, 0xb5, 0x347, 0x2b0, 0x275, 0xc6, 0xd7, 0xf4, 0x16e, 0x1fe, 0x3e2, 0x8, 0x2fb, 0x11f, 0x1d6, 0x2e7, 0x162, 0x7c, 0x76, 0x135, 0x36b, 0xcc, 0x194, 0x2aa, 0x2c9, 0xa6, 0xdc, 0x6b, 0x94, 0x165, 0x161, 0x218, 0x93, 0x78, 0x30f, 0x3be, 0x380, 0x3bb, 0x125, 0x294, 0x2f2, 0x238, 0x36d, 0xd, 0x5e, 0x30, 0x201, 0x24b, 0xfd, 0x249, 0x345, 0x108, 0x3b8, 0x28b, 0x1d6, 0x1c7, 0x181, 0x3e0, 0x369, 0x2e1, 0x346, 0x2d1, 0x34d, 0x3ef, 0xac, 0x33e, 0xc6, 0x1ae, 0x3d0, 0x362, 0x3df, 0xa7, 0x200, 0x327, 0x17f, 0x3ba, 0x1f2, 0xc9, 0x26b, 0x20f, 0xe2, 0xa0, 0x3a, 0x28d, 0x54, 0x2e6, 0x17c, 0x37b, 0x266, 0x2b3, 0x22, 0x8c, 0xcb, 0x112, 0x310, 0x34e, 0x32e, 0x338, 0x144, 0x28f, 0x32d, 0x3f9, 0x2d0, 0xf5, 0x164, 0x17a, 0x2f9, 0x147, 0x24e, 0xb9, 0x183, 0x99, 0x276, 0x14d, 0xc8, 0x1d3, 0x84, 0x134, 0x167, 0x1bb, 0x16d, 0x33d, 0x7, 0x23a, 0x1aa, 0x12b, 0x15c, 0x8e, 0x3b2, 0xd, 0xbc, 0xc0, 0x2c, 0xf1, 0x39f, 0x344, 0x1a8, 0x252, 0x43, 0x322, 0x3c, 0x30f, 0x375, 0x21b, 0x1e7, 0x274, 0x234, 0x1d7, 0x27f, 0x30a, 0x236, 0x2ae, 0x360, 0xa6, 0x1b8, 0x1ac, 0xa9, 0x27d, 0x73, 0x329, 0x102, 0xee, 0x3a4, 0x271, 0x377, 0x162, 0xf8, 0x1d8, 0x1ba, 0x2d5, 0x1b6, 0x1d1, 0x379, 0x23e, 0x2ab, 0x4f, 0x4c, 0x1ce, 0x385, 0x71, 0xa0, 0x74, 0x226, 0x2a0, 0x233, 0x3d3, 0x34f, 0x12c, 0x2c5, 0x99, 0xe5, 0x13d, 0x249, 0x10f, 0xa4, 0x18b, 0x2cc, 0x1e, 0x30f, 0x2e3, 0x7e, 0x323, 0x301, 0x219, 0x135, 0x1b7, 0xdb, 0x1d1, 0x3f3, 0xac, 0x275, 0x318, 0x16b, 0x177, 0x83, 0x215, 0x334, 0x89, 0x310, 0x295, 0xa3, 0x1f6, 0x6d, 0x154, 0x2e2, 0x307, 0x11d, 0x1aa, 0x256, 0x179, 0x79, 0x35e, 0x1a0, 0x353, 0xd8, 0x53, 0x1b8, 0x358, 0x2a4, 0x3cc, 0x339, 0x1f1, 0x10, 0x3f5, 0x3a8, 0x2ea, 0xf9, 0xc9, 0xdf, 0x2e, 0x319, 0x212, 0x349, 0x228, 0x25a, 0x378, 0x147, 0x95, 0x2e4, 0x3, 0x182, 0x24b, 0x3f4, 0xd1, 0xd4, 0x252, 0x86, 0x93, 0x1e0, 0x9c, 0x263, 0x3e9, 0x25c, 0x7c, 0x1d8, 0x374, 0x346, 0x1ab, 0x12f, 0x347, 0x2d2, 0x311, 0x1ec, 0x29d, 0x35d, 0x22, 0x118, 0x32c, 0x82, 0x16c, 0x10a, 0x222, 0x2fb, 0xea, 0x175, 0xf9, 0x192, 0x37c, 0x170, 0x1fc, 0x2d0, 0x3d4, 0x26d, 0x22f, 0x47, 0x36d, 0x68, 0x3ad, 0xd8, 0xa6, 0x2e9, 0x2f6, 0x21a, 0x16e, 0x3eb, 0x14e, 0x24, 0x31, 0x2d7, 0x32e, 0xfb, 0x6d, 0x2a8, 0x39a, 0xe, 0x1f4, 0x125, 0x8d, 0x1d7, 0x1ee, 0xcc, 0xbb, 0x3fa, 0x56, 0x275, 0x239, 0x1a5, 0x3aa, 0x22, 0x230, 0xab, 0x19, 0x2ed, 0x108, 0x1b2, 0xb3, 0xf, 0x30f, 0x1cf, 0x1f8, 0x12e, 0x7c, 0x3b0, 0x1cb, 0x206, 0x286, 0x1a1, 0x54, 0x38a, 0x3ed, 0x34f, 0x258, 0x306, 0xc1, 0x24b, 0x3e1, 0x344, 0x2a9, 0x161, 0xe4, 0x81, 0x1dc, 0x11f, 0x2ab, 0x9e, 0x130, 0x26b, 0x2e, 0x23b, 0x5a, 0x27e, 0x2c8, 0x3c2, 0x38f, 0x2e8, 0xd, 0x2f0, 0x1b, 0x312, 0xdc, 0x358, 0x141, 0x32b, 0x1fe, 0x32f, 0x200, 0x87, 0x3dd, 0x363, 0x19c, 0x288, 0x55, 0x171, 0x307, 0x23a, 0x2a1, 0x294, 0x3bd, 0x33b, 0x21d, 0x194, 0x17d, 0x1ff, 0x3a8, 0x3ba, 0x38b, 0x22c, 0x28f, 0x15e, 0x387, 0x23a, 0x14b, 0x242, 0x1d7, 0x3dc, 0x330, 0x1d1, 0x3d7, 0x2d2, 0x5f, 0x2ff, 0x221, 0x366, 0x132, 0x321, 0x3e1, 0x281, 0x2b6, 0x31a, 0x25b, 0x4, 0x3f5, 0x2bb, 0x2f3, 0x237, 0xa2, 0x22e, 0x171, 0x207, 0xfa, 0x125, 0x11a, 0x355, 0x36b, 0xdb, 0x34d, 0x347, 0x35a, 0x17c, 0x3ee, 0x96, 0x183, 0xc1, 0x9f, 0x39f, 0x216, 0x2ca, 0x73, 0x17e, 0x10, 0x3cf, 0x2fe, 0x3de, 0xce, 0x288, 0xaa, 0x1cd, 0xe, 0x3e8, 0x9d, 0x61, 0x14f, 0x1b7, 0x36c, 0x12f, 0x107, 0x173, 0x1f9, 0x3a3, 0x258, 0x205, 0x304, 0x27c, 0x267, 0x4a, 0x33a, 0x1cc, 0x1f1, 0x40, 0x327, 0x3ea, 0x363, 0x338, 0x232, 0x2a8, 0x33d, 0x38, 0x3bb, 0x274, 0x184, 0x135, 0x2d5, 0x1ab, 0xb5, 0x15, 0x1c5, 0x3ed, 0x297, 0x172, 0x6, 0xb, 0x1e2, 0x18e, 0x128, 0xf3, 0x339, 0x3cd, 0x100, 0x87, 0x3b3, 0x197, 0xfb, 0x3fe, 0x2bb, 0x1ef, 0xce, 0x119, 0x2a8, 0x273, 0xe0, 0x1e7, 0x301, 0xec, 0x1cb, 0xa, 0x3a, 0x8a, 0xbd, 0x3e5, 0x2e8, 0x34, 0x353, 0x2c9, 0xed, 0x235, 0x2b1, 0x1d5, 0x44, 0x1a4, 0x14d, 0x9b, 0xd4, 0x2b4, 0x1c8, 0x1, 0x3fe, 0x2bb, 0x1ef, 0xce, 0x119, 0x2a8, 0x273, 0xe0, 0x1e7, 0x301, 0xec, 0x1cb, 0xa, 0x3a, 0x8a, 0xbd, 0x3e5, 0x2e8, 0x34, 0x353, 0x2c9, 0xed, 0x235, 0x2b1, 0x1d5, 0x44, 0x1a4, 0x14d, 0x9b, 0xd4, 0x2b4, 0x1c8, 0x1, 0x3fe, 0x2bb, 0x1ef, 0xce, 0x119, 0x2a8, 0x273, 0xe0, 0x1e7, 0x301, 0xec, 0x1cb, 0xa, 0x3a, 0x8a, 0xbd, 0x3e5, 0x2e8, 0x34, 0x353, 0x2c9, 0xed, 0x235, 0x2b1, 0x1d5, 0x44, 0x1a4, 0x14d, 0x9b, 0xd4, 0x2b4, 0x1c8, 0x1, 0x3fe, 0x2bb, 0x1ef, 0xce, 0x119, 0x2a8, 0x273, 0xe0, 0x1e7, 0x301, 0xec, 0x1cb, 0xa, 0x3a, 0x8a, 0xbd, 0x3e5, 0x2e8, 0x34, 0x353, 0x2c9, 0x3f5, 0x2fe, 0x363, 0xfb, 0x368, 0x37a, 0x3be, 0x1f8, 0x162, 0x33f, 0x303, 0x23b, 0x2d0, 0x29f, 0x256, 0x3bd, 0x1ee, 0x269, 0x293, 0x20e, 0x38a, 0x357, 0x254, 0x5e, 0x1b, 0xa6, 0x365, 0xd7, 0x177, 0x22, 0x1a4, 0x29a, 0x26c, 0x2a9, 0x31a, 0x17e, 0x40, 0x87, 0x2d7, 0x146, 0x2b7, 0x386, 0x30f, 0x263, 0x2e7, 0x26, 0x26b, 0x170, 0x3fb, 0x145, 0x2a1, 0x8d, 0x2a3, 0x36e, 0x356, 0x1a1, 0x2a0, 0x378, 0x5d, 0xd, 0x3ad, 0x2c9, 0x1da, 0xc6, 0x1a5, 0x16f, 0x92, 0x1ca, 0x3e1, 0x216, 0x33a, 0x339, 0x32f, 0x24, 0x188, 0x85, 0x134, 0xb3, 0x78, 0x270, 0x1d6, 0x9e, 0x192, 0x3d6, 0xaf, 0x307, 0x1f4, 0x13a, 0x308, 0x1ba, 0x206, 0x1d, 0x8a, 0x17a, 0x38f, 0x36d, 0x340, 0x2aa, 0x30c, 0x275, 0x1ec, 0x18a, 0x366, 0xc1, 0x27c, 0x18e, 0xa9, 0x32b, 0x3eb, 0x262, 0x112, 0x2d8, 0x108, 0x18b, 0x93, 0x23f, 0x11f, 0x175, 0x3c1, 0x51, 0x3e3, 0x3ea, 0x32e, 0x3ab, 0x1c3, 0x30f, 0xcf, 0x38e, 0x130, 0x2f1, 0x253, 0x307, 0x3e8, 0xe1, 0x76, 0x396, 0x50, 0x349, 0x199, 0xae, 0x1e4, 0x33, 0x2ec, 0x347, 0x2e6, 0x3af, 0x254, 0xbc, 0x6c, 0x139, 0x235, 0x2d6, 0x16f, 0x124, 0x321, 0x337, 0x128, 0x391, 0x3eb, 0xcd, 0x41, 0x2ed, 0xa4, 0x10c, 0x81, 0x1ff, 0x17f, 0x363, 0x1f6, 0x1bb, 0x3e6, 0x39e, 0x377, 0x26, 0xdf, 0x1c9, 0x3e7, 0x7d, 0x9d, 0x308, 0x374, 0xa, 0xe8, 0xb2, 0x313, 0x238, 0x185, 0x259, 0x3ef, 0x35a, 0x3f2, 0x24e, 0x213, 0x209, 0xa6, 0x2c3, 0x35c, 0x3aa, 0x220, 0xe5, 0x3e1, 0x25, 0xf3, 0x1fe, 0x29c, 0x89, 0x2d8, 0x210, 0x225, 0x91, 0x3b8, 0x3a8, 0x1ef, 0x338, 0x1b4, 0x37a, 0x375, 0x3e9, 0x302, 0x39c, 0xb8, 0x3fb, 0x28a, 0x296, 0x61, 0x26a, 0x103, 0x1d, 0x114, 0x1e1, 0x47, 0x2b5, 0xca, 0x3fa, 0x169, 0x17c, 0x34f, 0x1c1, 0xc0, 0x312, 0x3cf, 0x3b3, 0x146, 0x2ce, 0x1e, 0x270, 0x351, 0x1f2, 0x51, 0x154, 0x1de, 0x3f, 0xb1, 0x277, 0x2e, 0x3f9, 0x28a, 0x125, 0x184, 0x374, 0x14, 0x3a0, 0x199, 0x15c, 0x399, 0x198, 0x293, 0x2a, 0xde, 0x5d, 0x34, 0x2ae, 0x30c, 0x1c6, 0x2ff, 0x258, 0x18, 0x2c0, 0x2e9, 0x26f, 0x2ee, 0x110, 0xe5, 0x3cb, 0x94, 0x391, 0x3df, 0x334, 0x208, 0x283, 0xad, 0x390, 0x10, 0x87, 0x34e, 0x4d, 0xb3, 0x1e0, 0x341, 0x175, 0x31f, 0x119, 0x16d, 0x1df, 0x3f0, 0x302, 0x331, 0x2e0, 0x3e7, 0xfa, 0x274, 0x76, 0x325, 0x140, 0x27e, 0x1a6, 0x1ed, 0x1ee, 0x1b6, 0x16a, 0x2a0, 0x1fb, 0x1d9, 0x340, 0x2ba, 0xac, 0x5f, 0x3a3, 0x1c1, 0x180, 0x53, 0x2c3, 0x2b1, 0x2b3, 0x124, 0x24b, 0xc7, 0x152, 0x16e, 0x187, 0x32c, 0xc8, 0x6a, 0x2c2, 0x17e, 0x100, 0x62, 0x85, 0xd9, 0x322, 0x23f, 0x75, 0x37d, 0x19c, 0x1b4, 0x2fd, 0x1cf, 0x377, 0x4c, 0x37c, 0x397, 0x2d7, 0x222, 0xb3, 0x3c0, 0x11f, 0x3ba, 0x19c, 0x368, 0x3e6, 0x263, 0x315, 0x192, 0x28f, 0x39a, 0x380, 0x12e, 0x33f, 0x2e, 0x3fb, 0x23a, 0x13a, 0x76, 0x243, 0x109, 0x3d4, 0x256, 0x1d7, 0x36e, 0x286, 0x8a, 0x3c2, 0x238, 0x21d, 0x1d1, 0x20e, 0x6f, 0x5d, 0x68, 0x2aa, 0x56, 0x5f, 0x34f, 0x30d, 0x1b, 0x139, 0xc6, 0x133, 0x366, 0x201, 0x21f, 0x2f6, 0x3a9, 0x22, 0x13b, 0x3e1, 0x94, 0x32b, 0x367, 0x196, 0xc8, 0xd4, 0x31a, 0x3e2, 0x24, 0x5b, 0x108, 0x43, 0x81, 0x3f5, 0x3dd, 0x146, 0x195, 0x78, 0x3a4, 0x175, 0x237, 0x6d, 0x37a, 0x1cf, 0x2e7, 0x130, 0x3d6, 0x171, 0x70, 0x323, 0x3e0, 0x303, 0x1fc, 0x145, 0x125, 0x308, 0x1cb, 0xa0, 0x27e, 0x34c, 0x3bd, 0x36b, 0x356, 0x113, 0x17a, 0x47, 0x2c6, 0xbb, 0x347, 0x38a, 0x28e, 0xd, 0x157, 0x30c, 0x38c, 0x3ee, 0x2e4, 0x180, 0xa6, 0x31e, 0x1a5, 0x36a, 0xc1, 0x3c4, 0x327, 0x34e, 0x134, 0x322, 0xee, 0x359, 0x2cf, 0x35f, 0xf, 0xe9, 0x2be, 0x237, 0xda, 0x1f3, 0x263, 0x223, 0x241, 0x55, 0x1de, 0xfc, 0x302, 0xdf, 0x253, 0xe, 0x3ce, 0x1f0, 0x303, 0x3f8, 0x11d, 0x13a, 0xec, 0x11e, 0x5a, 0x137, 0x242, 0x135, 0x5, 0x3a0, 0x26d, 0x1ed, 0x3b1, 0x356, 0x226, 0x1e1, 0x238, 0x33, 0x34d, 0x54, 0x2f9, 0x3b2, 0x236, 0x3fd, 0x2bd, 0x357, 0x101, 0x2af, 0x30c, 0x311, 0x3a3, 0x30d, 0x36, 0xed, 0x239, 0x314, 0x3, 0x160, 0x1db, 0x35c, 0x16f, 0x132, 0x1e2, 0x358, 0x1e8, 0x11, 0x13b, 0x3cb, 0x250, 0x16e, 0x215, 0x2ac, 0x26c, 0x2ca, 0xff, 0x262, 0x104, 0x10f, 0x161, 0x2fc, 0x12, 0x5b, 0x210, 0x10c, 0x1, 0x327, 0x34e, 0x134, 0x322, 0xee, 0x359, 0x2cf, 0x35f, 0xf, 0xe9, 0x2be, 0x237, 0xda, 0x1f3, 0x263, 0x223, 0x241, 0x55, 0x1de, 0xfc, 0x302, 0xdf, 0x253, 0xe, 0x3ce, 0x1f0, 0x303, 0x247, 0x123, 0x1b2, 0x24c, 0x1ff, 0x3dd, 0x111, 0x166, 0x23f, 0x3a8, 0x2cf, 0x2b7, 0x3c, 0x341, 0x3ba, 0x279, 0x2e5, 0x4e, 0x351, 0x38b, 0x6d, 0x1f3, 0xcf, 0x9e, 0x22c, 0x159, 0x3be, 0x377, 0x260, 0x28f, 0x273, 0x7e, 0x302, 0x1be, 0x15e, 0x70, 0x97, 0x277, 0x170, 0x387, 0x37f, 0x7c, 0x385, 0x3f8, 0x23a, 0xe1, 0x369, 0x1c4, 0x352, 0x14b, 0x308, 0x325, 0x212, 0x29f, 0x242, 0x26a, 0x14, 0x13f, 0x291, 0x1d7, 0x1a3, 0x3a, 0x2c8, 0x179, 0x3dc, 0x356, 0x45, 0x38d, 0x1e4, 0x330, 0x16a, 0x12d, 0x227, 0x185, 0x1d1, 0x2a, 0x2f9, 0x36d, 0xca, 0x3d7, 0x38a, 0x22a, 0xd0, 0x17d, 0x2d2, 0x3d3, 0x284, 0x2af, 0x211, 0x5f, 0x127, 0xbc, 0x2c9, 0x33e, 0x2ff, 0x2e4, 0x209, 0x272, 0x239, 0x221, 0xc, 0x312, 0x18f, 0x34a, 0x366, 0x16, 0x1b8, 0xd7, 0x2b3, 0x132, 0x3c4, 0x17b, 0x35b, 0x110, 0x321, 0x31c, 0x21a, 0x83, 0x348, 0x3e1, 0x87, 0x85, 0x18b, 0x81, 0x397, 0x295, 0x1b2, 0x91, 0x3f5, 0x2d7, 0x134, 0x93, 0x2fb, 0x3dd, 0x222, 0x191, 0x1dc, 0x2fe, 0x146, 0xb3, 0x23f, 0x359, 0x32e, 0x195, 0x3c0, 0xea, 0x363, 0x2b7, 0x78, 0x11f, 0x1ef, 0x3d1, 0xf, 0x3a4, 0x3ba, 0xfb, 0x386, 0x270, 0x175, 0x19c, 0x376, 0x4e, 0x2ab, 0x237, 0x368, 0x30f, 0x1d6, 0x3c1, 0x6d, 0x3e6, 0x33c, 0xf9, 0x288, 0x37a, 0x263, 0x9e, 0x51, 0x16d, 0x1cf, 0x315, 0x8b, 0x2a8, 0x3be, 0x2e7, 0x192, 0x55, 0x371, 0x3db, 0x130, 0x28f, 0xef, 0x1f8, 0x26, 0x3d6, 0x39a, 0x3f, 0x302, 0x37c, 0x171, 0x380, 0x162, 0x26b, 0xaf, 0x70, 0x12e, 0x1ce, 0x392, 0xe, 0x323, 0x33f, 0x170, 0x307, 0x1e7, 0x3e0, 0x2e, 0x3e7, 0x3bb, 0x7c, 0x303, 0x3fb, 0x1f4, 0x20b, 0x1e3, 0x1fc, 0x23a, 0x1c2, 0x1bf, 0x23b, 0x145, 0x13a, 0x3b0, 0x1c4, 0x2ad, 0x125, 0x76, 0x23c, 0x2d0, 0x2a1, 0x308, 0x243, 0x10e, 0x214, 0x43, 0x2, 0x21c, 0x21, 0x86, 0x4, 0x31, 0x42, 0x10c, 0x8, 0x62, 0x84, 0x218, 0x10, 0xc4, 0x108, 0x39, 0x20, 0x188, 0x210, 0x72, 0x40, 0x310, 0x29, 0xe4, 0x80, 0x229, 0x52, 0x1c8, 0x100, 0x5b, 0xa4, 0x390, 0x200, 0xb6, 0x148, 0x329, 0x9, 0x16c, 0x290, 0x25b, 0x12, 0x2d8, 0x129, 0xbf, 0x24, 0x1b9, 0x252, 0x17e, 0x48, 0x372, 0xad, 0x2fc, 0x90, 0x2ed, 0x15a, 0x1f1, 0x120, 0x1d3, 0x2b4, 0x3e2, 0x240, 0x3a6, 0x161, 0x3cd, 0x89, 0x345, 0x2c2, 0x393, 0x112, 0x283, 0x18d, 0x32f, 0x224, 0x10f, 0x31a, 0x257, 0x41, 0x21e, 0x23d, 0xa7, 0x82, 0x35, 0x73, 0x14e, 0x104, 0x6a, 0xe6, 0x29c, 0x208, 0xd4, 0x1cc, 0x131, 0x19, 0x1a8, 0x398, 0x262, 0x32, 0x350, 0x339, 0xcd, 0x64, 0x2a9, 0x27b, 0x19a, 0xc8, 0x15b, 0xff, 0x334, 0x190, 0x2b6, 0x1fe, 0x261, 0x320, 0x165, 0x3fc, 0xcb, 0x249, 0x21c, 0x42, 0x218, 0x20, 0x310, 0x52, 0x390, 0x9, 0x2d8, 0x252, 0x2fc, 0x120, 0x3a6, 0x2c2, 0x32f, 0x41, 0x35, 0xe6, 0x131, 0x32, 0x2a9, 0xff, 0x261, 0x249, 0x19d, 0x3df, 0xab, 0x1a2, 0x3cc, 0x30e, 0x14d, 0x25, 0x16e, 0x118, 0x1fa, 0xa9, 0x193, 0x348, 0x337, 0x10d, 0x20c, 0x1ca, 0x231, 0x1e8, 0x110, 0x13e, 0x2b9, 0x177, 0x248, 0x381, 0x39d, 0x2b3, 0x182, 0xdc, 0x35c, 0x2dd, 0x2c, 0x3b6, 0x34a, 0x306, 0x189, 0x235, 0x18a, 0x18, 0x14c, 0x239, 0x12c, 0x300, 0x1da, 0x3b9, 0x1c1, 0xd8, 0x33e, 0x3d5, 0x5e, 0x336, 0x311, 0x24e, 0x3d2, 0x211, 0x2f8, 0x142, 0x2ae, 0x2b0, 0x3af, 0x1a, 0x17d, 0x2bd, 0x115, 0x340, 0x3f3, 0x31d, 0x2e8, 0xca, 0x287, 0x378, 0x1af, 0x176, 0x54, 0x3c3, 0x185, 0x293, 0x292, 0x8e, 0xcc, 0x2d4, 0x2f4, 0x1e4, 0x1b6, 0x226, 0x22f, 0xf7, 0x2a5, 0x59, 0x179, 0x2df, 0x1d, 0x332, 0x373, 0x346, 0x31, 0x108, 0xe4, 0x200, 0x2d8, 0xad, 0x3e2, 0x112, 0x21e, 0xe6, 0x262, 0xc8, 0x165, 0x3eb, 0xab, 0x344, 0x32b, 0x46, 0xfd, 0xa9, 0x326, 0x13b, 0x18e, 0xf4, 0x110, 0x27c, 0x2f6, 0x3aa, 0xc1, 0xdc, 0x2b1, 0x366, 0x160, 0x31e, 0x18a, 0x30, 0x139, 0x1ec, 0x2e4, 0xd8, 0x275, 0x34f, 0x2f0, 0x30c, 0x2f8, 0x284, 0x2aa, 0x1ad, 0x28e, 0x340, 0x3ef, 0x6f, 0x36d, 0xbb, 0x54, 0x38f, 0x21d, 0xb5, 0x17a, 0x1e4, 0x36c, 0x8a, 0x15c, 0x36b, 0x1d, 0x26d, 0x1d7, 0x206, 0x27e, 0x294, 0x1ba, 0x109, 0xd5, 0x308, 0x23c, 0x2ad, 0x13a, 0x1bf, 0x1fc, 0x1f4, 0x7c, 0x2e, 0x307, 0x323, 0x1ce, 0xaf, 0x380, 0x302, 0x3d6, 0xef, 0x3db, 0x192, 0x2a8, 0x1cf, 0x9e, 0x288, 0x3e6, 0x1d6, 0x237, 0x376, 0x270, 0x3ba, 0x3d1, 0x78, 0xea, 0x32e, 0xb3, 0x1dc, 0x3dd, 0x134, 0x91, 0x397, 0x85, 0x43, 0x8, 0x188, 0x52, 0x329, 0x24, 0x2ed, 0x62, 0x29, 0x329, 0x48, 0x3a6, 0x31a, 0x29c, 0x64, 0x165, 0x3df, 0x2ac, 0x216, 0x2dc, 0xd2, 0x337, 0x3d, 0x88, 0x27c, 0x1e5, 0x2b3, 0x201, 0x1db, 0x29d, 0x6, 0x14c, 0xf6, 0x2e4, 0x1b0, 0x1c6, 0x24e, 0x353, 0x158, 0x357, 0xd0, 0x3f3, 0x6f, 0x2d3, 0x2ec, 0x2a0, 0x8e, 0x330, 0x113, 0x57, 0x3b1, 0x1d, 0xd3, 0x355, 0x14, 0x3a1, 0x234, 0x243, 0x1a9, 0x9d, 0x1bf, 0x3f8, 0x3d9, 0x3e0, 0x2e0, 0x38, 0x162, 0x2f1, 0x273, 0x3db, 0x324, 0x2b2, 0x263, 0x1f2, 0x1b4, 0x4e, 0x2ea, 0x3ec, 0x78, 0x1d4, 0xa3, 0x191, 0x1ff, 0x34e, 0x18b, 0x2, 0xc4, 0x52, 0x25b, 0x90, 0x345, 0x23d, 0x131, 0xc8, 0x2ca, 0x3b7, 0x151, 0x25, 0x1b1, 0x1a4, 0x267, 0x7a, 0x110, 0xf1, 0x3ca, 0x16f, 0xb, 0x3b6, 0x133, 0xc, 0x298, 0x1ec, 0x1c1, 0x360, 0x38c, 0x95, 0x2af, 0x2b0, 0x2a7, 0x1a0, 0x3ef, 0xde, 0x1af, 0x1d1, 0x149, 0x11c, 0x269, 0xc4, 0xa4, 0x17e, 0x89, 0x35, 0x339, 0xcb, 0xd1, 0x32b, 0x118, 0x3cb, 0x21a, 0x88, 0xf1, 0x39d, 0x1b5, 0x58, 0x31e, 0x221, 0x300, 0x2cb, 0x3a3, 0x1e9, 0x56, 0x3af, 0xd0, 0x3ef, 0x1bc, 0x2b5, 0x293, 0xbd, 0x3c8, 0x356, 0x164, 0x373, 0x206, 0x1ea, 0x11a, 0x243, 0x352, 0x274, 0x1e3, 0x3f7, 0x3ce, 0x1ce, 0x2bc, 0x7e, 0x130, 0x154, 0x39e, 0xf9, 0x1b4, 0x9c, 0x3ba, 0x35f, 0x389, 0x2fe, 0x9a, 0x122, 0x87, 0x84, 0x1c8, 0x24, 0x3a6, 0x23d, 0x262, 0x320, 0x27d, 0x30e, 0x27a, 0x152, 0x106, 0x321, 0x2b9, 0x3aa, 0x304, 0x1db, 0x133, 0x18, 0x272, 0x37b, 0x2f, 0xc3, 0x2f8, 0x202, 0x2fa, 0x38a, 0x3b2, 0x176, 0x2a0, 0x11c, 0xdb, 0x8a, 0x179, 0x2d5, 0x349, 0x14a, 0x374, 0x5a, 0x296, 0x369, 0x1fc, 0x3d9, 0x3c9, 0x392, 0x1c0, 0x20d, 0x28f, 0x1df, 0x223, 0x288, 0x383, 0x15f, 0xfb, 0x3c, 0x1d4, 0x146, 0x24d, 0x3e3, 0x85, 0x188, 0x290, 0x3e2, 0x82, 0x2a9, 0x3eb, 0x151, 0x94, 0x326, 0x1ca, 0x358, 0x3aa, 0x201, 0x365, 0x18a, 0x180, 0x2cb, 0x34f, 0x3ad, 0x2b0, 0x28e, 0x236, 0x20e, 0x38f, 0xcc, 0x113, 0x15c, 0x36e, 0x349, 0x294, 0x1cb, 0x2d0, 0x13a, 0x1e3, 0x3e7, 0x323, 0x26b, 0x39a, 0x3db, 0x8b, 0x37a, 0x1d6, 0x19c, 0xf, 0xea, 0x146, 0x93, 0x397, 0x21, 0xe4, 0x24, 0x345, 0xe6, 0x334, 0x26c, 0x32b, 0x230, 0x337, 0xf4, 0x92, 0x21f, 0x2b1, 0x306, 0xa6, 0x1ec, 0x30d, 0x265, 0x2f8, 0xd, 0x3fa, 0x6f, 0x35e, 0x293, 0x17a, 0x33b, 0x286, 0x26d, 0x2a3, 0xa0, 0xd5, 0x76, 0x23b, 0x1f4, 0x3e0, 0x392, 0x380, 0x26, 0x55, 0x1cf, 0xf9, 0x368, 0x270, 0x1ef, 0x195, 0x1dc, 0x2d7, 0x18b, 0x8, 0x5b, 0xad, 0x32f, 0x19, 0x165, 0x367, 0x29a, 0xa9, 0x106, 0x24b, 0x2f6, 0x16f, 0x2c, 0x31e, 0x4b, 0x1b, 0x275, 0x24e, 0x157, 0x1ad, 0x5d, 0x194, 0x310, 0x252, 0x32f, 0x32, 0x19d, 0x30e, 0x1fa, 0x10d, 0x110, 0x381, 0x35c, 0x306, 0x14c, 0x3b9, 0x5e, 0x211, 0x3af, 0x340, 0x287, 0x3c3, 0xcc, 0x226, 0x179, 0x346, 0xf5, 0x234, 0x23c, 0x28a, 0x3e, 0x170, 0xe0, 0x13, 0x55, 0x39e, 0x3e4, 0x376, 0x341, 0x197, 0x191, 0x3e3, 0x214, 0xe4, 0x48, 0x10f, 0x339, 0x32c, 0x10b, 0x362, 0x276, 0x1ac, 0x3aa, 0xb, 0x18f, 0x4b, 0x36, 0x1c6, 0x254, 0x15d, 0x1c5, 0x36d, 0x3a2, 0xbd, 0x33b, 0x105, 0x1a6, 0x135, 0x212, 0x296, 0x1bf, 0x3ff, 0x395, 0x26b, 0x33d, 0x377, 0x51, 0x3c5, 0x2be, 0x3d1, 0x389, 0x3ea, 0x1b2, 0x2, 0x229, 0xad, 0x257, 0x64, 0x33a, 0x215, 0x3f4, 0x21a, 0x220, 0x30b, 0x2b1, 0x205, 0x298, 0x37b, 0xbc, 0x2b, 0x357, 0x289, 0x107, 0x38f, 0x198, 0x45, 0x2f2, 0x285, 0x1ea, 0x61, 0x71, 0x11d, 0x7c, 0x2e0, 0x1c0, 0x26, 0xaa, 0x335, 0x3c1, 0x2e5, 0x28b, 0x32e, 0x229, 0x15a, 0x14e, 0x320, 0x3cc, 0x230, 0xc7, 0x35b, 0xc1, 0x3b6, 0x314, 0x1b, 0x1c6, 0xa1, 0x17d, 0x233, 0x2b5, 0xb5, 0x313, 0x2df, 0x349, 0x242, 0x8f, 0x145, 0x3e, 0x2e0, 0x380, 0x98, 0x159, 0x33c, 0xce, 0x1e, 0x359, 0x9a, 0x102, 0x188, 0x252, 0x257, 0xc8, 0xf3, 0x8c, 0x337, 0x3d0, 0x132, 0x2e9, 0xc5, 0x300, 0x275, 0x12a, 0x15d, 0x38a, 0x1af, 0x12f, 0x3c2, 0x3b1, 0x1d0, 0x294, 0x325, 0x153, 0x20b, 0xb8, 0xe0, 0x26, 0x154, 0xcf, 0x237, 0x203, 0x1d4, 0x222, 0x244, 0x62, 0x290, 0x393, 0x32, 0x33a, 0x23, 0x3cb, 0xf4, 0x248, 0x1b8, 0x133, 0xc0, 0x19f, 0x24e, 0x155, 0x2e6, 0x36d, 0x34d, 0x2f4, 0x1ee, 0x74, 0xa5, 0x1cb, 0x352, 0x384, 0x2e, 0x38, 0x20d, 0x55, 0x335, 0x38b, 0x386, 0x75, 0x28c, 0x91, 0x21c, 0xa4, 0x3e2, 0x208, 0x2ca, 0x30e, 0x3f4, 0x3d, 0x92, 0x6e, 0x34a, 0x30, 0x361, 0x297, 0x157, 0x5b, 0x161, 0x262, 0x26c, 0x16e, 0x13b, 0x358, 0x16f, 0x160, 0x239, 0x30d, 0x30c, 0x357, 0x236, 0x54, 0x238, 0x356, 0x26d, 0x135, 0x5a, 0x13a, 0x303, 0xe, 0x302, 0x55, 0x263, 0x237, 0xf, 0x359, 0x134, 0x1, 0x5b, 0x161, 0x262, 0x26c, 0x16e, 0x13b, 0x358, 0x16f, 0x160, 0x239, 0x30d, 0x30c, 0x357, 0x236, 0x54, 0x238, 0x356, 0x26d, 0x135, 0x5a, 0x13a, 0x303, 0xe, 0x302, 0x55, 0x263, 0x237, 0xf, 0x359, 0x134, 0x1, 0x5b, 0x161, 0x262, 0x26c, 0x16e, 0x13b, 0x358, 0x16f, 0x160, 0x239, 0x30d, 0x30c, 0x357, 0x236, 0x54, 0x238, 0x356, 0x26d, 0x135, 0x5a, 0x13a, 0x303, 0xe, 0x302, 0x55, 0x263, 0x237, 0xf, 0x359, 0x134, 0x1, 0x5b, 0x161, 0x262, 0x26c, 0x16e, 0x13b, 0x358, 0x16f, 0x160, 0x239, 0x30d, 0x30c, 0x357, 0x236, 0x54, 0x238, 0x356, 0x26d, 0x135, 0x5a, 0x13a, 0x303, 0xe, 0x302, 0x55, 0x263, 0x237, 0xb6, 0x18d, 0x334, 0x281, 0x193, 0x24b, 0x333, 0x183, 0x139, 0x3d5, 0x2af, 0x173, 0x2d3, 0x25e, 0x22f, 0x2d5, 0x1ea, 0x308, 0x7f, 0x2f7, 0x26b, 0x1de, 0x4f, 0x368, 0x341, 0xa3, 0x91, 0x62, 0x252, 0x14e, 0x9b, 0xb7, 0x13b, 0x2b9, 0x1b5, 0x312, 0x3d8, 0x178, 0x2b0, 0xba, 0x2ec, 0x17a, 0x3dc, 0x3a0, 0x8d, 0x71, 0xfa, 0x33f, 0x2e2, 0x377, 0x288, 0x9c, 0x3b5, 0x191, 0x327, 0x29, 0x3e2, 0x32, 0xf3, 0x230, 0x31c, 0x1d5, 0x2c, 0x18c, 0x382, 0x30c, 0x2a7, 0xca, 0x2a0, 0x3c8, 0x20a, 0x256, 0x396, 0x2a6, 0x7c, 0x32d, 0xfc, 0x8b, 0x3c5, 0x1dd, 0x195, 0x1ff, 0x214, 0x329, 0x224, 0x2b6, 0x30e, 0x3cb, 0x3d0, 0xc1, 0x2c3, 0x12c, 0x2c9, 0x1f9, 0x1a0, 0x20e, 0x8e, 0x1ab, 0x26d, 0x26a, 0x168, 0x1c2, 0x5c, 0x1c0, 0x130, 0x2da, 0x351, 0x3d1, 0x77, 0x34e, 0x218, 0x48, 0x6a, 0x3eb, 0x13d, 0x10d, 0x92, 0x1b8, 0xc5, 0x1b, 0x16c, 0x23d, 0x196, 0x4a, 0x20c, 0x3c4, 0x2d6, 0x60, 0x275, 0x142, 0x3fd, 0x3f6, 0x330, 0xb2, 0x2a3, 0x2d, 0x274, 0x2e, 0x1c0, 0x260, 0x37a, 0x2be, 0x167, 0x2fb, 0x214, 0x25b, 0x82, 0x19d, 0x8c, 0x18e, 0x1d5, 0x58, 0x239, 0x2f, 0xac, 0x5d, 0x2ec, 0x2f4, 0x36b, 0x13f, 0xc2, 0x23b, 0x2f7, 0xdf, 0x371, 0x278, 0x2e5, 0xea, 0x9a, 0x2, 0x2d8, 0x73, 0x32c, 0x94, 0x11, 0x381, 0x1a5, 0xc0, 0xe3, 0x284, 0x3f3, 0x3e5, 0x269, 0x164, 0x14f, 0x5a, 0xe1, 0x5c, 0x380, 0xc9, 0x2fd, 0x175, 0x2ce, 0x1ff, 0x21, 0xbf, 0x104, 0x33a, 0x118, 0x31c, 0x3aa, 0xb0, 0x7b, 0x5e, 0x158, 0xba, 0x1d1, 0x1e1, 0x2df, 0x27e, 0x184, 0x7f, 0x1e7, 0x1be, 0x2eb, 0xf9, 0x1c3, 0x1d4, 0x134, 0x4, 0x1b9, 0xe6, 0x251, 0x128, 0x22, 0x30b, 0x34a, 0x180, 0x1c6, 0x101, 0x3ef, 0x3c3, 0xdb, 0x2c8, 0x29e, 0xb4, 0x1c2, 0xb8, 0x309, 0x192, 0x2d8, 0xe6, 0xab, 0xa9, 0x110, 0xdc, 0x18a, 0xd8, 0x2f8, 0x340, 0x54, 0x1e4, 0x1d, 0x294, 0x23c, 0x1f4, 0x1ce, 0xef, 0x9e, 0x376, 0xea, 0x134, 0x8, 0x2ed, 0x339, 0x151, 0x141, 0x92, 0x2e9, 0x4b, 0x2c9, 0x3ed, 0x236, 0x2a0, 0x33b, 0xe8, 0x8d, 0x1c4, 0x3bb, 0x26b, 0x371, 0xf9, 0x386, 0x359, 0x1b2, 0x40, 0x345, 0x1fe, 0x29a, 0x21a, 0x99, 0x365, 0x258, 0x265, 0x357, 0x194, 0x12d, 0x1ee, 0x349, 0x61, 0x23b, 0x1e7, 0x37c, 0x3be, 0x3c1, 0xf, 0x2fe, 0x18b, 0x200, 0x21e, 0x3eb, 0xfd, 0xf4, 0xc1, 0x31e, 0x2e4, 0x30c, 0x28e, 0xbb, 0x17a, 0x36b, 0x27e, 0x308, 0x1fc, 0x323, 0x3d6, 0x1cf, 0x237, 0x78, 0x3dd, 0x43, 0x24, 0xd4, 0x367, 0x3e1, 0x3a9, 0x201, 0xc6, 0x30d, 0x56, 0x5d, 0x1d1, 0x3c2, 0x36e, 0x3d4, 0x76, 0x3fb, 0x12e, 0x28f, 0x263, 0x19c, 0x3c0, 0x2d7, 0x218, 0x120, 0x2a9, 0x30e, 0x337, 0x177, 0x2c, 0x1b9, 0x398, 0x151, 0x282, 0x248, 0x365, 0xb9, 0x186, 0x28e, 0x176, 0x1e1, 0x36e, 0x3a1, 0x1d8, 0x3e7, 0x2c4, 0x154, 0x1d6, 0x3ab, 0x379, 0x21, 0x2fc, 0x64, 0x32b, 0x276, 0x3ca, 0x306, 0x3b4, 0x12a, 0x3fa, 0x3e5, 0x1b6, 0x26d, 0x374, 0x2a6, 0x3e0, 0x2e2, 0x38e, 0x368, 0x23e, 0x9a, 0x8, 0x1d3, 0xff, 0x29a, 0x3d, 0x264, 0x31e, 0x1c1, 0x2b, 0x5d, 0x3a2, 0x313, 0x346, 0x137, 0x2db, 0x307, 0x20d, 0x2b2, 0x2ab, 0x167, 0x3fe, 0x108, 0x3cd, 0x320, 0x16e, 0x394, 0x26f, 0x6, 0x19f, 0x142, 0x3ef, 0x317, 0x1ab, 0x34c, 0x396, 0x11d, 0x33f, 0x33d, 0x4f, 0x376, 0x1d4, 0xd9, 0x40, 0x283, 0x3f1, 0xfd, 0x1e8, 0x304, 0xc6, 0x213, 0x158, 0x2e8, 0x12f, 0xae, 0x206, 0x1aa, 0x2f5, 0xe, 0x4c, 0x1bd, 0x175, 0x32a, 0x3cf, 0x52, 0x257, 0x136, 0x362, 0x9f, 0x35c, 0x30, 0xe3, 0x202, 0x347, 0x8e, 0x143, 0x256, 0x8f, 0xfa, 0x1ce, 0x372, 0x27b, 0x29a, 0x7a, 0x182, 0xc6, 0x2f, 0x169, 0x36d, 0x2d4, 0x1ed, 0xa0, 0x9d, 0x5c, 0x3f, 0x22c, 0x9c, 0x32e, 0x244, 0xb6, 0xe6, 0x2ac, 0x282, 0x99, 0x18f, 0x1c1, 0x56, 0x174, 0x12f, 0x15c, 0xa, 0x14b, 0x303, 0x1c0, 0x324, 0x30f, 0x3b5, 0x126, 0x188, 0x18d, 0x32c, 0xa9, 0x49, 0x1db, 0x258, 0x186, 0x115, 0x1d1, 0x313, 0x285, 0xd5, 0x2f5, 0x1c, 0x130, 0x1f3, 0x37d, 0x191, 0x21c, 0x15a, 0x334, 0x4a, 0x44, 0xdc, 0x221, 0x19b, 0x357, 0x259, 0x2f4, 0x36e, 0x34b, 0x369, 0x307, 0x13, 0x2da, 0x175, 0x25d, 0x327, 0x290, 0x131, 0x281, 0x106, 0x30b, 0x266, 0xd8, 0x3f2, 0x65, 0x12d, 0x3b1, 0xf5, 0x76, 0x3f7, 0x2c4, 0x2a8, 0x351, 0x167, 0x3f5, 0x29, 0x257, 0x26c, 0x193, 0xf1, 0x1a5, 0x209, 0xbe, 0x340, 0x150, 0x27f, 0x349, 0x184, 0x3f8, 0x12e, 0x22e, 0x271, 0x3d1, 0x379, 0x42, 0x3e2, 0x320, 0x2dc, 0x24b, 0x2ed, 0x1fe, 0xfd, 0x3a9, 0x2c, 0x1ec, 0x3ad, 0x38a, 0x21d, 0x59, 0x135, 0x2ad, 0x3e0, 0x39a, 0x9e, 0x386, 0x2fe, 0x43, 0x120, 0x165, 0x230, 0x358, 0x366, 0x1da, 0x254, 0x3ef, 0x47, 0x286, 0x294, 0x1c4, 0x1e7, 0x3d6, 0x263, 0xfb, 0x1dc, 0x21, 0x3e2, 0x249, 0x362, 0x27c, 0x1a5, 0x1b, 0x2f8, 0x236, 0x12d, 0x36b, 0x3d4, 0x3b0, 0x307, 0x26, 0x37a, 0x3ba, 0x191, 0x31, 0x161, 0x196, 0xa9, 0x92, 0x365, 0x2e4, 0x56, 0x2e8, 0xb5, 0x2f2, 0xa0, 0x13a, 0x170, 0x1f8, 0x288, 0x3a4, 0x222, 0x8, 0x345, 0x3eb, 0x3e1, 0x177, 0x160, 0x37b, 0x157, 0x6f, 0xcc, 0x2c8, 0x1ba, 0x145, 0x33f, 0xef, 0xf9, 0xf, 0x3dd, 0x218, 0x112, 0x33a, 0x1a4, 0x2f6, 0x306, 0x2cb, 0x284, 0x347, 0x238, 0x1d, 0x8d, 0x23b, 0x323, 0x28f, 0x33c, 0x3d1, 0x2fb, 0x108, 0x32f, 0x26c, 0x326, 0x3c4, 0x133, 0xd8, 0x3ed, 0x194, 0x17a, 0x36e, 0x29f, 0x1bf, 0x1d3, 0x3f1, 0x3e1, 0x2ee, 0x189, 0x3ee, 0x15d, 0x1fb, 0x36c, 0x291, 0x11e, 0x3bb, 0x2f1, 0x335, 0xfb, 0x3b8, 0x84, 0x32f, 0xd1, 0x83, 0x21f, 0x314, 0x336, 0x28e, 0x3a2, 0xae, 0x14, 0x24a, 0xb8, 0x1f8, 0x119, 0x28b, 0x134, 0x80, 0x6a, 0x30e, 0x31c, 0x1b5, 0x139, 0x95, 0x3f3, 0x47, 0x105, 0x242, 0x23b, 0x24f, 0x22e, 0x1d6, 0x167, 0x3cf, 0x290, 0xcd, 0x4a, 0x110, 0x1db, 0x172, 0x56, 0x1d9, 0x2d4, 0x3bd, 0x212, 0x301, 0xaf, 0x1c7, 0x1bb, 0x359, 0x316, 0x90, 0x165, 0x69, 0x17b, 0x306, 0x19f, 0x202, 0x20e, 0x3c8, 0x3a0, 0x308, 0x3ff, 0x181, 0x16d, 0x2ea, 0x2cc, 0x31, 0x2c2, 0x251, 0x141, 0x132, 0x63, 0x5e, 0x35a, 0x163, 0x8a, 0x14f, 0x352, 0x3e0, 0x33d, 0x278, 0xf, 0x3b3, 0x72, 0x82, 0x3cc, 0xe5, 0xd7, 0x60, 0x22b, 0x340, 0x149, 0x3b1, 0x3d4, 0x369, 0x7, 0x130, 0x3c5, 0x3b5, 0x91, 0xb6, 0x398, 0x29a, 0x3a6, 0x3df, 0x337, 0x2b3, 0x14c, 0x24e, 0x3f3, 0x8e, 0x1d, 0x234, 0x3f8, 0x162, 0x2b2, 0x2ea, 0x191, 0xc4, 0x23d, 0x151, 0x7a, 0xb, 0x1ec, 0x2af, 0xde, 0x269, 0x1a6, 0x8f, 0x3bb, 0x1eb, 0xcf, 0x3d1, 0x3fe, 0xa4, 0x262, 0x4a, 0x220, 0x365, 0x382, 0x169, 0x35e, 0x45, 0x14f, 0x2ad, 0x39b, 0x1de, 0x3c1, 0x1e0, 0x123, 0x17e, 0x320, 0x2cd, 0x3c4, 0xc5, 0x19b, 0x28e, 0x34d, 0x2b8, 0xa0, 0xe1, 0x32d, 0x2e7, 0x1bb, 0x2bb, 0x43, 0x89, 0x27d, 0x13b, 0x26f, 0x60, 0x5f, 0x11b, 0x25a, 0x36e, 0x26e, 0x3c6, 0x380, 0x22c, 0xe9, 0x222, 0x20, 0x35, 0x30e, 0x231, 0x2dd, 0x1da, 0x142, 0x287, 0x1e4, 0x3a0, 0x219, 0x3e7, 0x13, 0x2fd, 0x1ef, 0x24c, 0xb6, 0x339, 0x27a, 0x35b, 0x160, 0x1f7, 0x15d, 0x3f6, 0x1ab, 0xa5, 0x1c4, 0x395, 0x117, 0x1d6, 0x2ce, 0x327, 0xad, 0xcb, 0x152, 0x99, 0x63, 0xbc, 0x173, 0x30a, 0xb2, 0x1ba, 0x345, 0x367, 0x18e, 0x36a, 0x1da, 0x284, 0x20e, 0x33b, 0x27e, 0x3b0, 0xe, 0x192, 0x4e, 0x146, 0x8, 0x21e, 0x30e, 0x6b, 0x366, 0x2cb, 0xd, 0x54, 0x1ee, 0x3d4, 0x1bf, 0x70, 0x8b, 0x270, 0x222, 0x40, 0xd4, 0x46, 0x358, 0x306, 0x275, 0x68, 0x2a0, 0x36b, 0x29f, 0x1e3, 0x380, 0x51, 0x3a4, 0x134, 0x200, 0x2a9, 0x230, 0x2f6, 0x6, 0x38c, 0x340, 0x12d, 0x36e, 0xd5, 0x303, 0x3f, 0x288, 0x11f, 0x1b2, 0x24, 0x165, 0x1a4, 0x39d, 0x30, 0x5f, 0x236, 0x17a, 0x346, 0x2a1, 0x2e, 0x1f8, 0x6d, 0xea, 0x18b, 0x120, 0x33a, 0x13b, 0xd7, 0x180, 0x2f8, 0x194, 0x3c2, 0x206, 0x125, 0x170, 0x3db, 0x368, 0x359, 0x43, 0x112, 0x1e6, 0x1ca, 0x2b1, 0x1b, 0x3ed, 0xbb, 0x22f, 0x14, 0x13a, 0x392, 0x2e7, 0x376, 0x2fe, 0x218, 0x82, 0x32b, 0x24b, 0x1a5, 0xd8, 0x357, 0x1d1, 0x15c, 0xa0, 0x1c2, 0xaf, 0x315, 0x386, 0x3dd, 0xe4, 0x19, 0x283, 0x187, 0x6b, 0x2c5, 0x33e, 0x68, 0x149, 0x1b7, 0xd5, 0x20f, 0xfc, 0x6d, 0x1d4, 0x225, 0x112, 0x3cc, 0x321, 0x1a5, 0x1b0, 0x147, 0x293, 0x1ed, 0x2d, 0x7c, 0x33d, 0x3e4, 0x3c0, 0x10a, 0x393, 0x344, 0x44, 0x3b6, 0x30d, 0x35a, 0x30a, 0x2c8, 0x396, 0x3d9, 0x3d6, 0x271, 0x2ce, 0x87, 0x2c2, 0x2ac, 0xf4, 0x58, 0x1f7, 0x17d, 0x317, 0x20a, 0x61, 0x3ff, 0x13, 0x3e6, 0x2cf, 0x204, 0x345, 0x2c7, 0x231, 0x366, 0x19f, 0x34, 0x2a0, 0x2df, 0x26e, 0x303, 0x7e, 0x232, 0xea, 0x316, 0x89, 0x1e6, 0x394, 0x2d6, 0xd8, 0x2a7, 0x34d, 0x2f2, 0x212, 0x3e, 0x39a, 0x1f2, 0x1e0, 0x85, 0x3cd, 0x1a2, 0x22, 0x1db, 0x382, 0x1ad, 0x185, 0x164, 0x1cb, 0x3e8, 0x1eb, 0x33c, 0x167, 0x247, 0x161, 0x156, 0x7a, 0x2c, 0x2ff, 0x2ba, 0x38f, 0x105, 0x234, 0x3fb, 0x20d, 0x1f3, 0x363, 0x102, 0x3a6, 0x367, 0x31c, 0x1b3, 0x2cb, 0x1a, 0x150, 0x36b, 0x10f, 0x215, 0x358, 0x3, 0x311, 0x236, 0x1e1, 0x5, 0x13a, 0x253, 0x223, 0xf, 0x34e, 0x2fc, 0x26c, 0x11, 0x1db, 0x30d, 0x2bd, 0x33, 0x26d, 0x11e, 0x3ce, 0x55, 0x2be, 0x322, 0x5b, 0xff, 0x3cb, 0x16f, 0xed, 0x101, 0x54, 0x3b1, 0x137, 0x303, 0xfc, 0xda, 0x359, 0x10c, 0x104, 0x16e, 0x1e2, 0x314, 0x30c, 0x3b2, 0x226, 0x135, 0x11d, 0xdf, 0x263, 0x35f, 0x327, 0x161, 0x2ac, 0x1e8, 0x160, 0x3a3, 0x3fd, 0x238, 0x3a0, 0xec, 0xe, 0x241, 0xe9, 0x134, 0x12, 0x2ca, 0x13b, 0x35c, 0x36, 0x357, 0x34d, 0x1ed, 0x5a, 0x1f0, 0x1de, 0x237, 0xee, 0x210, 0x262, 0x250, 0x132, 0x239, 0x2af, 0x2f9, 0x356, 0x242, 0x3f8, 0x302, 0x1f3, 0x2cf, 0x1, 0x10f, 0x215, 0x358, 0x3, 0x311, 0x236, 0x1e1, 0x5, 0x13a, 0x253, 0x223, 0xf, 0x34e, 0x2fc, 0x26c, 0x11, 0x1db, 0x30d, 0x2bd, 0x33, 0x26d, 0x11e, 0x3ce, 0x55, 0x2be, 0x322, 0x5b, 0x21e, 0x46, 0x2f6, 0x30, 0x2f8, 0xbb, 0x15c, 0x109, 0x7c, 0xef, 0x237, 0x1dc, 0x52, 0x334, 0x141, 0x201, 0x37b, 0x17d, 0x47, 0xe8, 0x76, 0xe, 0x8b, 0x3a4, 0x1b2, 0x120, 0x1e6, 0x24b, 0x133, 0x265, 0x2e8, 0x113, 0x135, 0x23a, 0x37c, 0x33c, 0x195, 0x31, 0xe6, 0xfd, 0x3aa, 0x139, 0x284, 0x54, 0x36b, 0xd5, 0x2e, 0x3db, 0x376, 0x3dd, 0x329, 0x249, 0x106, 0x2e9, 0x30d, 0x173, 0xcc, 0x34c, 0x1c4, 0x12e, 0x16d, 0x1ef, 0x81, 0x345, 0x30e, 0x358, 0x6, 0x5f, 0x194, 0x22f, 0xa0, 0x20b, 0x39a, 0x3c1, 0x23f, 0x108, 0x262, 0xa9, 0xc1, 0x1ec, 0x2aa, 0x38f, 0x1d, 0x308, 0x307, 0x192, 0x270, 0x134, 0x24, 0x33a, 0x1ca, 0x1a5, 0x2c9, 0x5d, 0x1a1, 0x2a3, 0x145, 0x26b, 0x263, 0x2b7, 0x87, 0x31a, 0x29a, 0x177, 0xa6, 0x254, 0x20e, 0x1ee, 0x29f, 0x303, 0x1f8, 0x368, 0x2fe, 0xe4, 0xc8, 0x326, 0xdc, 0x2e4, 0x1ad, 0x21d, 0x35, 0x118, 0x39d, 0x300, 0x3af, 0x293, 0x373, 0x352, 0x1ce, 0x39e, 0x35f, 0x87, 0x23d, 0x27a, 0x3aa, 0x272, 0x202, 0x2a0, 0x2d5, 0x296, 0x392, 0x223, 0x3c, 0x85, 0x257, 0x4a, 0x99, 0x7b, 0x155, 0x38f, 0x3a, 0x3b, 0xe, 0x116, 0x28b, 0x18b, 0x224, 0xb7, 0x3c4, 0x96, 0x158, 0x2c6, 0x199, 0x11e, 0x323, 0x159, 0x2f3, 0x81, 0x283, 0x23, 0x2f6, 0x60, 0x3f2, 0x1d1, 0x1ed, 0x168, 0x33f, 0x375, 0x3ec, 0x397, 0x2c2, 0x14d, 0x177, 0x14c, 0x142, 0x54, 0x2df, 0x354, 0x170, 0x1c7, 0x203, 0x295, 0x3cd, 0x10b, 0x92, 0x18c, 0x2af, 0x3f6, 0x105, 0x184, 0x307, 0x324, 0x1d2, 0x1b2, 0x240, 0x391, 0x27c, 0x314, 0x2b, 0x35e, 0xb2, 0x325, 0x1e7, 0xaa, 0x1dd, 0x91, 0x1d3, 0x187, 0x358, 0xc, 0x17c, 0xbb, 0x2b8, 0x2d, 0x3e0, 0x2eb, 0x279, 0x3f5, 0x15a, 0x2ac, 0x3a9, 0x22d, 0x12a, 0x20e, 0x3dc, 0x26e, 0x2e, 0x3bf, 0x1c3, 0x2d7, 0x6a, 0x69, 0xd7, 0x6c, 0x115, 0x1a1, 0x29e, 0x7d, 0x3d6, 0x351, 0x322, 0x2d8, 0x3b7, 0xd6, 0x6, 0x17c, 0x176, 0x2f2, 0x168, 0x277, 0x1cf, 0x35f, 0x10e, 0xe6, 0x3f4, 0x2de, 0x2cb, 0x1a0, 0x2f4, 0x14, 0x301, 0x33d, 0x237, 0x379, 0x129, 0xab, 0x3d0, 0x22d, 0x254, 0x2a, 0x2df, 0x2a1, 0x1c9, 0x223, 0x78, 0x214, 0x29c, 0xa9, 0x304, 0x2ff, 0x3fa, 0xf2, 0xf5, 0x1e3, 0xfc, 0x2d9, 0x3dd, 0xbf, 0xd1, 0x110, 0x63, 0x353, 0x3f6, 0x20a, 0x219, 0xe, 0x22c, 0x23e, 0x43, 0x208, 0x2cd, 0xdc, 0x382, 0x2e6, 0x269, 0x14a, 0x3f8, 0x26, 0x27, 0x4d, 0x24, 0xf3, 0x9f, 0x18a, 0x2b, 0x2b5, 0x2c8, 0x11e, 0x24f, 0x16d, 0x3b5, 0x2, 0xd4, 0xd2, 0x1ae, 0xd8, 0x22a, 0x342, 0x135, 0xfa, 0x3a5, 0x2ab, 0x24d, 0x1b9, 0x367, 0x1ac, 0xc, 0x2f8, 0x2ec, 0x1ed, 0x2d0, 0xe7, 0x39e, 0x2b7, 0x21c, 0x1cc, 0x3e1, 0x1b5, 0x19f, 0x340, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1, 0xd4, 0x1a4, 0x2b1, 0x2c9, 0x2e8, 0x8a, 0x1cb, 0x1e7, 0x2a8, 0x1ef, 0x1a8, 0x299, 0x1a5, 0xc3, 0x1af, 0x2c8, 0x71, 0xb1, 0x3e6, 0x28c, 0x12, 0x1e6, 0xf1, 0x12c, 0x1ad, 0x198, 0x14a, 0x3fb, 0x260, 0x1d2, 0x18b, 0x104, 0x193, 0x2e9, 0xbc, 0x1bc, 0x286, 0x219, 0x38, 0x288, 0x2bb, 0x390, 0x26c, 0x220, 0x318, 0x2aa, 0x8e, 0x13f, 0x1e3, 0x3f0, 0x1c3, 0x295, 0x257, 0x250, 0x201, 0x3d5, 0x3a7, 0x1ee, 0x1aa, 0x1c9, 0x9e, 0x389, 0x29, 0x196, 0x1e8, 0x53, 0x284, 0x149, 0x103, 0x1c2, 0x33d, 0xce, 0x3f5, 0x2c2, 0x27a, 0x16f, 0x19f, 0x11b, 0x22f, 0x212, 0x39b, 0x1cf, 0x167, 0xc4, 0x1fe, 0x31c, 0x3, 0x2f8, 0x3a2, 0x2ef, 0x145, 0x2f1, 0x351, 0x93, 0x1d3, 0x23, 0x39d, 0x36, 0x22a, 0x113, 0x374, 0x2f7, 0x2a8, 0x3de, 0x4, 0x2a9, 0x276, 0x29d, 0x30c, 0x2b5, 0x332, 0x1c4, 0x2c4, 0x383, 0x222, 0x48, 0x391, 0x3c4, 0xb9, 0x2bd, 0x269, 0x121, 0x3f7, 0x192, 0x341, 0x225, 0x19, 0x245, 0x3b6, 0x2f0, 0x350, 0x276, 0x133, 0x2b, 0x185, 0x34c, 0xfe, 0x4c, 0x270, 0x2c1, 0x104, 0x326, 0x3b6, 0x1e9, 0x3f6, 0x74, 0x369, 0x3f, 0x1bb, 0x1a7, 0x32f, 0x250, 0xb, 0x34f, 0x107, 0x2df, 0x125, 0x2bc, 0x38b, 0x2fb, 0x2b4, 0x13d, 0x16f, 0x33e, 0x65, 0x15c, 0x168, 0x39c, 0x33c, 0x2cc, 0x1b9, 0x30e, 0x3ca, 0x36, 0x5d, 0x45, 0x396, 0x323, 0x1bd, 0x255, 0x200, 0xf3, 0xf1, 0x258, 0x2bd, 0xdb, 0x8d, 0x387, 0x116, 0xea, 0x72, 0x9b, 0x110, 0x318, 0x15d, 0x238, 0x1ea, 0x20f, 0x2e7, 0x3c, 0x42, 0x334, 0x7a, 0x22d, 0x284, 0x292, 0x5, 0x20b, 0x3bc, 0x1f6, 0x87, 0x398, 0x267, 0x306, 0x17c, 0x3a2, 0x1d7, 0x11d, 0x3a5, 0x175, 0x244, 0x35, 0x1a4, 0x2d6, 0xc3, 0x35e, 0x332, 0x388, 0x302, 0x27, 0x268, 0x112, 0x1b1, 0x1b8, 0x5e, 0x1bc, 0x105, 0x76, 0x1c0, 0xda, 0x3dd, 0x1f1, 0x25, 0xc1, 0x1f7, 0x3d7, 0x1ee, 0x354, 0x32d, 0xf9, 0x2a9, 0x1ca, 0x18a, 0x2b0, 0xcc, 0x294, 0x3e7, 0x8b, 0xea, 0xe4, 0x26c, 0x92, 0x1ec, 0x3fa, 0x33b, 0xd5, 0x392, 0xf9, 0x1dc, 0xad, 0x29a, 0x16f, 0x275, 0x194, 0x2f2, 0x2ad, 0x37c, 0x2ab, 0x91, 0x21e, 0x1a4, 0x1a5, 0x30c, 0x2c6, 0x34c, 0x1fc, 0x130, 0x3a4, 0x43, 0xc8, 0x22, 0xc6, 0x2aa, 0x238, 0x3d4, 0x2e, 0x315, 0x3c0, 0x52, 0xab, 0x177, 0x1da, 0x340, 0x22f, 0x5a, 0x1ce, 0x33c, 0x191, 0x2ed, 0x46, 0xd7, 0x2c9, 0x36d, 0x2c8, 0x1c4, 0x302, 0x4e, 0x1b2, 0x82, 0x326, 0x365, 0x3ad, 0x38f, 0x349, 0x1e3, 0x3db, 0xf, 0x21, 0x334, 0xf4, 0xa6, 0xd, 0x17a, 0xa0, 0x3e0, 0x1cf, 0x195, 0x5b, 0x367, 0x2f6, 0x1b, 0x5d, 0x8a, 0x243, 0x12e, 0x3e6, 0x222, 0x120, 0x16e, 0xdc, 0x5e, 0x378, 0x1d, 0x3b0, 0x3f, 0x376, 0x295, 0x14e, 0x141, 0x160, 0x254, 0x2a0, 0x206, 0x20b, 0x371, 0x3d1, 0x31, 0x1fe, 0x6b, 0x30, 0x15b, 0x321, 0x4b, 0x35a, 0x1b6, 0x61, 0x1c, 0x232, 0x3dd, 0x3cd, 0x250, 0x2c, 0x95, 0x150, 0x206, 0x1f, 0x1df, 0x2b7, 0x310, 0x3b7, 0x2f6, 0x36, 0x174, 0x59, 0x71, 0x181, 0x4e, 0x364, 0x208, 0x106, 0x235, 0x155, 0x238, 0x3a1, 0xb8, 0x9e, 0x77, 0x252, 0x29a, 0x2de, 0x1c6, 0xbb, 0x373, 0x11d, 0x28f, 0x37d, 0x4, 0x165, 0x9f, 0x12c, 0x173, 0x2d1, 0x184, 0x70, 0xda, 0x36f, 0x32f, 0x152, 0xb0, 0x254, 0x149, 0xa, 0x7c, 0x375, 0x2ce, 0x5b, 0x2c7, 0x3ca, 0xd8, 0x1d9, 0x164, 0x1c4, 0x20d, 0x138, 0x18b, 0x32, 0x11, 0xc6, 0x15d, 0xf2, 0x29f, 0x2e0, 0x278, 0x1dc, 0x15a, 0x27a, 0x36a, 0x311, 0x2ec, 0x1d7, 0x7d, 0x22e, 0x1ef, 0x10, 0x19d, 0x27c, 0xb9, 0x1c5, 0x356, 0x219, 0x1c0, 0x368, 0x1a7, 0xa7, 0x141, 0x2c0, 0x142, 0x12d, 0x28, 0x1f0, 0x1cf, 0x32a, 0x16c, 0x30e, 0x333, 0x360, 0x36d, 0x199, 0x319, 0x26, 0x2b6, 0x9f, 0x258, 0x1c5, 0x2a5, 0x76, 0x21b, 0x2e5, 0x85, 0x19a, 0x1e8, 0x139, 0x1a0, 0x57, 0x2d0, 0x1be, 0x15f, 0x81, 0x350, 0x394, 0x4b, 0x2bd, 0x2d1, 0x308, 0x1c0, 0x2d9, 0x295, 0x131, 0x3d, 0xa6, 0x34, 0x38d, 0x5a, 0x331, 0x3ac, 0x91, 0x6a, 0x276, 0x18a, 0x2d2, 0xdb, 0x61, 0x38, 0xda, 0x2d7, 0xa7, 0x282, 0x312, 0x202, 0x2f4, 0x109, 0xe7, 0x271, 0x93, 0x10f, 0x348, 0x133, 0x158, 0x198, 0x8d, 0x7, 0x119, 0x3dd, 0x393, 0x152, 0x160, 0x142, 0x25a, 0xa0, 0x39b, 0xcf, 0x191, 0x3a6, 0x69, 0x1a5, 0x2b, 0x33, 0x294, 0x387, 0xa2, 0x2fe, 0x1f1, 0x128, 0x2c, 0x12a, 0x149, 0x14, 0x1f0, 0x39e, 0xb3, 0x372, 0x8c, 0x2b1, 0x186, 0x185, 0x256, 0x3f7, 0x116, 0x359, 0xbf, 0x25, 0x201, 0x127, 0xa8, 0x206, 0x3e, 0x375, 0x195, 0x16c, 0x215, 0xd7, 0x336, 0x2b5, 0x34c, 0x3f9, 0x324, 0xea, 0x390, 0x281, 0xc1, 0x165, 0x27c, 0x2e4, 0x6f, 0x1d, 0x1bf, 0x3db, 0x78, 0x52, 0x151, 0x16f, 0x38c, 0x1d1, 0x2a3, 0x3bb, 0x16d, 0x146, 0x120, 0x362, 0x365, 0x157, 0x238, 0x29f, 0x392, 0x3c1, 0x3f5, 0xe6, 0x18e, 0x30, 0x28e, 0x8a, 0x23c, 0x302, 0x270, 0x43, 0x249, 0x92, 0x37b, 0x347, 0x36e, 0x1c2, 0x371, 0x2b7, 0x5b, 0x30e, 0xd7, 0x265, 0x2c6, 0x256, 0x3e7, 0x51, 0x2fe, 0x3e2, 0xa9, 0x160, 0x284, 0x17a, 0x109, 0x1ce, 0x1d6, 0x91, 0xd4, 0x1ca, 0x4b, 0x173, 0x356, 0x76, 0x3f, 0x386, 0x21, 0x196, 0x177, 0x2cb, 0x194, 0x3bd, 0x23a, 0x55, 0x363, 0x200, 0x32b, 0xdc, 0x2f0, 0x38f, 0x27e, 0x2e, 0x9e, 0x1dc, 0x161, 0x3e1, 0x306, 0x3ed, 0x1a1, 0x1cb, 0x12e, 0x30f, 0x1b2, 0x19, 0x22, 0x239, 0x3fa, 0x1ee, 0x125, 0x39a, 0xfb, 0x31, 0x3eb, 0x2f6, 0xd8, 0x36d, 0x26d, 0x1fc, 0x192, 0xea, 0x329, 0x216, 0x201, 0x24e, 0x2a0, 0x14, 0x3e0, 0x2ca, 0x1e2, 0x30d, 0x2f9, 0x3a0, 0x303, 0x223, 0xee, 0x161, 0x3cb, 0x3, 0x357, 0x226, 0x11e, 0x302, 0xe9, 0x10c, 0x26c, 0x132, 0x3a3, 0x54, 0x5, 0x1f0, 0x263, 0x322, 0x10f, 0x13b, 0x314, 0x2bd, 0x356, 0xec, 0xfc, 0xf, 0x210, 0x2ac, 0x16f, 0x311, 0x34d, 0x135, 0x3ce, 0x1f3, 0x134, 0x104, 0x11, 0x239, 0x3fd, 0x3b1, 0x13a, 0x1de, 0x35f, 0x5b, 0x215, 0x35c, 0x30c, 0x33, 0x242, 0xe, 0xda, 0x34e, 0x262, 0x1e8, 0xed, 0x236, 0x1ed, 0x11d, 0x55, 0x2cf, 0x12, 0x16e, 0x1db, 0x2af, 0x238, 0x137, 0x253, 0x237, 0x327, 0xff, 0x358, 0x36, 0x3b2, 0x26d, 0x3f8, 0x241, 0x359, 0x2fc, 0x250, 0x160, 0x101, 0x1e1, 0x5a, 0xdf, 0x2be, 0x1, 0x2ca, 0x1e2, 0x30d, 0x2f9, 0x3a0, 0x303, 0x223, 0xee, 0x161, 0x3cb, 0x3, 0x357, 0x226, 0x11e, 0x302, 0xe9, 0x10c, 0x26c, 0x132, 0x3a3, 0x54, 0x5, 0x1f0, 0x263, 0x322, 0x10f, 0x13b, 0x19d, 0x381, 0x5e, 0x3c3, 0xf5, 0x170, 0x3e4, 0x3e3, 0x339, 0x1ac, 0x36, 0x36d, 0x1a6, 0x3ff, 0x51, 0x3ea, 0x257, 0x21a, 0x298, 0x289, 0x2f2, 0x11d, 0xaa, 0x32e, 0x90, 0x2cd, 0x31e, 0x2ba, 0x27f, 0x125, 0x273, 0x3ab, 0x5b, 0x23, 0x16b, 0x56, 0x330, 0xc2, 0x380, 0x1c3, 0x42, 0xab, 0x2b3, 0x311, 0x293, 0xdd, 0x24f, 0x30f, 0x2c1, 0x190, 0x92, 0x1f7, 0x15, 0x206, 0x1f0, 0xcf, 0x93, 0x6a, 0x394, 0x258, 0x233, 0x3a, 0x1e3, 0x38e, 0x77, 0x161, 0x39f, 0xc, 0x28e, 0x228, 0x388, 0x130, 0x75, 0x25b, 0x94, 0xb0, 0x101, 0x3c2, 0x168, 0x2f1, 0x3ba, 0x20, 0x3cc, 0xdc, 0x3d2, 0x8e, 0x29f, 0x253, 0x67, 0x87, 0x3f1, 0x1e5, 0x2c9, 0x163, 0xa5, 0x307, 0x232, 0x1a7, 0x262, 0x3d0, 0x3b4, 0x194, 0x2ef, 0x3e8, 0x16d, 0x111, 0x224, 0x106, 0x318, 0x3fd, 0x36b, 0xe1, 0x2eb, 0x195, 0x372, 0x69, 0x133, 0x2d2, 0x2d1, 0x76, 0x33a, 0x21f, 0x2f0, 0x47, 0x29f, 0xaf, 0x19c, 0x31, 0x367, 0xd7, 0x30c, 0xcc, 0x61, 0x380, 0x386, 0x108, 0x151, 0x36a, 0x2f8, 0x1a1, 0x243, 0x302, 0x3a4, 0xe4, 0x216, 0x2c, 0x284, 0x3c2, 0x2d0, 0x3d6, 0x1ef, 0x200, 0x16e, 0x365, 0x2aa, 0x33b, 0x125, 0xef, 0x2b7, 0x2d8, 0x230, 0x133, 0x1ad, 0x356, 0x3b0, 0x3db, 0x3c0, 0xad, 0x3e1, 0x6, 0x28e, 0x59, 0x23b, 0x192, 0x359, 0x3e2, 0x141, 0xa6, 0x340, 0x2f2, 0x23a, 0x2a8, 0x146, 0x112, 0x106, 0x239, 0x3ef, 0x36e, 0x20b, 0x1cf, 0x191, 0x21e, 0x1ca, 0x258, 0x6f, 0xe8, 0x303, 0x9e, 0x2fb, 0xe6, 0x6b, 0x1b, 0x36d, 0x34c, 0x3e7, 0x288, 0x2d7, 0x262, 0x3a9, 0x2cb, 0xbb, 0x2a3, 0x1e7, 0x3e6, 0x1b2, 0xc8, 0x92, 0x3ee, 0x54, 0x14, 0x33f, 0x1d6, 0x81, 0x165, 0x3c4, 0x5e, 0x38f, 0x3d4, 0x392, 0x237, 0x87, 0x3eb, 0x39d, 0x265, 0x21d, 0x8d, 0x70, 0x376, 0x21, 0xab, 0x27d, 0x6e, 0x3ad, 0x79, 0x354, 0x39a, 0x3ab, 0x16c, 0x230, 0x266, 0x2bd, 0x286, 0x37e, 0x38e, 0x1dc, 0x23d, 0x231, 0x1b, 0x2d3, 0x12b, 0x307, 0xda, 0x246, 0x196, 0x35d, 0x22b, 0xb5, 0x396, 0x181, 0x3a4, 0x1c8, 0x4a, 0x160, 0x1a, 0xae, 0x145, 0xaa, 0xa3, 0x112, 0x20c, 0xf6, 0x347, 0x285, 0x1f0, 0x33c, 0x122, 0x2b6, 0x3c4, 0xbc, 0x227, 0x29f, 0x15e, 0x279, 0x188, 0x215, 0x2d6, 0x2b0, 0x2d1, 0x1d8, 0x3db, 0x389, 0x2b4, 0x337, 0x60, 0x174, 0x26d, 0x3ff, 0x144, 0x2d7, 0xcd, 0x2bf, 0x275, 0x3a2, 0xdd, 0x12e, 0x9c, 0x10c, 0x344, 0xb, 0x142, 0x3c2, 0x1a9, 0x343, 0x363, 0x48, 0x193, 0xc6, 0x3fd, 0x1b7, 0x20b, 0x39e, 0x24d, 0xd4, 0x9f, 0x382, 0x3f6, 0xf5, 0x1c9, 0x237, 0x10e, 0x3b7, 0xd7, 0x211, 0x330, 0x308, 0x7e, 0x3c, 0x290, 0x1fa, 0x3, 0x28e, 0xb2, 0xfe, 0x8b, 0x1f5, 0xa7, 0xf4, 0x3b4, 0x259, 0x2a3, 0xf3, 0x1b8, 0x157, 0x399, 0x24a, 0x371, 0x25d, 0x283, 0x1ca, 0x172, 0x2f9, 0x27e, 0x1c9, 0x67, 0x31, 0x187, 0x16b, 0x2b0, 0x1ab, 0x369, 0x2e7, 0xee, 0x23d, 0x6b, 0x6c, 0x2b5, 0x294, 0x38, 0x2e5, 0x108, 0x14d, 0x2c5, 0x357, 0x228, 0x7f, 0x8b, 0x3ea, 0x29c, 0x3a9, 0x33e, 0x3a2, 0x1ba, 0xb1, 0xe9, 0xe4, 0x4a, 0x2c0, 0x68, 0x179, 0x7d, 0x16d, 0x9a, 0x32, 0x92, 0x3a3, 0x149, 0x109, 0x1be, 0x37d, 0x200, 0x1b1, 0x235, 0x3fa, 0x1b7, 0x1f, 0x263, 0x24c, 0x15b, 0x3c4, 0x178, 0x8e, 0xd5, 0x1cd, 0x3ab, 0x2d8, 0xd2, 0x314, 0x38a, 0x74, 0x20f, 0xf9, 0x3cf, 0x3fc, 0x39d, 0x186, 0x198, 0x308, 0xfc, 0xf0, 0xad, 0x39f, 0x60, 0x2e8, 0x1a6, 0x3c7, 0x6d, 0x246, 0x32c, 0x16f, 0x17c, 0x342, 0x23c, 0x98, 0x1d4, 0x3e2, 0x10d, 0x272, 0x194, 0x355, 0x3ce, 0x30f, 0x225, 0xd1, 0x201, 0x142, 0x38d, 0x2ad, 0x22e, 0x255, 0x112, 0x1e6, 0x2e9, 0x2aa, 0x1ee, 0x1c2, 0x1cf, 0x93, 0x2a9, 0x3c4, 0x2f0, 0x238, 0x2a1, 0xef, 0x195, 0x345, 0x1ca, 0x2e4, 0x3f6, 0x3d4, 0xaf, 0xfb, 0x5b, 0x230, 0x18a, 0x38a, 0xe8, 0x2e, 0x3c1, 0x87, 0x367, 0x2b1, 0x2b0, 0x356, 0x1bf, 0x315, 0x2fb, 0x339, 0x2f6, 0x265, 0xcc, 0x308, 0x1f8, 0x3c0, 0x161, 0x18e, 0x1b, 0x35e, 0x294, 0x70, 0x386, 0x52, 0xfd, 0x6, 0x5d, 0x26d, 0x3e7, 0x6d, 0x85, 0xab, 0x36a, 0x3ed, 0x8a, 0x23b, 0x8b, 0x3dd, 0x262, 0x177, 0x38c, 0xb5, 0x243, 0x26, 0xea, 0x3e2, 0x21a, 0x1da, 0xbb, 0x135, 0x12e, 0x270, 0xe4, 0x94, 0x312, 0x340, 0x3bd, 0x3bb, 0x3e6, 0x18b, 0x26c, 0x201, 0x284, 0x22f, 0x145, 0x2a8, 0x222, 0x19, 0x92, 0x34f, 0x12d, 0x5a, 0x3d6, 0x363, 0x120, 0x106, 0x1ec, 0x20e, 0x14, 0x1ce, 0x175, 0x40, 0x16e, 0x31e, 0x3fa, 0x36e, 0x7c, 0x33c, 0x81, 0x33a, 0xdc, 0x157, 0x33b, 0x3cc, 0x3b6, 0x17d, 0x2df, 0x3e, 0x33c, 0x102, 0xf3, 0x2e9, 0x15d, 0x3b1, 0x20b, 0xcf, 0x244, 0x33a, 0x1b8, 0x155, 0x1ee, 0x384, 0x335, 0x91, 0x2ca, 0x6e, 0x157, 0x27f, 0xe1, 0x1cf, 0x126, 0x2b6, 0x21f, 0x353, 0x399, 0x13a, 0x375, 0x24d, 0x2a9, 0x381, 0x3d2, 0x1e4, 0x24a, 0x1df, 0x191, 0x1a8, 0x1e2, 0x2f0, 0x79, 0x296, 0x371, 0x166, 0x6a, 0x27c, 0xbc, 0x11c, 0x2a1, 0x1de, 0x25d, 0x21e, 0x9f, 0x2f, 0x47, 0x1aa, 0x273, 0x195, 0x283, 0x321, 0x30d, 0x317, 0x26e, 0x39a, 0x167, 0x3a6, 0x1ca, 0x1c1, 0x3c3, 0x29f, 0x2e2, 0x35f, 0x2ed, 0x276, 0x172, 0x3f6, 0x3a1, 0x2bc, 0x3d1, 0x1b9, 0x299, 0x258, 0x2f9, 0x1ea, 0xaf, 0x1f6, 0x16c, 0x1a4, 0x96, 0x1bc, 0x27e, 0x32d, 0x279, 0x5b, 0x69, 0x221, 0x6f, 0x29b, 0x1c9, 0x19c, 0x310, 0x118, 0x18a, 0x31d, 0x3a0, 0x170, 0x67, 0xc4, 0x46, 0x266, 0x1c5, 0xe8, 0x5c, 0x31f, 0x31, 0x391, 0x2c3, 0x3fa, 0x1a3, 0x3c9, 0x2ab, 0x20, 0x2dc, 0xc6, 0x3a7, 0x5, 0x1ce, 0x1dd, 0x9, 0x326, 0xf6, 0x15, 0xa0, 0x1be, 0x3de, 0x120, 0x11, 0x2ff, 0x2a0, 0x2d, 0x3a5, 0x32e, 0x41, 0x220, 0x34f, 0xbd, 0x1a9, 0x55, 0x111, 0x32, 0x99, 0x12a, 0x38d, 0x145, 0x2b2, 0x268, 0x249, 0x304, 0x101, 0x15c, 0xfa, 0x2fd, 0x18b, 0x1a2, 0x58, 0x68, 0x3da, 0x37f, 0x30f, 0x10c, 0x25, 0x312, 0x11b, 0x3ae, 0x323, 0x138, 0x1c8, 0xa9, 0x298, 0x328, 0x135, 0xb1, 0x341, 0x17e, 0x10d, 0x3b4, 0x1d1, 0x2e1, 0x20d, 0xea, 0x393, 0x1e8, 0x275, 0x25e, 0x8f, 0x130, 0x17f, 0x29c, 0x177, 0x22b, 0x342, 0x1c4, 0x241, 0x3b3, 0x334, 0x2b3, 0x1f9, 0x8a, 0xfe, 0xa2, 0x295, 0x251, 0x2dd, 0x357, 0x164, 0x3ff, 0x6d, 0x214, 0x2a2, 0x306, 0x22a, 0xd3, 0x307, 0x1bb, 0x210, 0xfd, 0x18, 0x1d9, 0x256, 0x38, 0x305, 0x290, 0x39f, 0x300, 0x35e, 0x32b, 0x31e, 0x3ef, 0x206, 0x1ce, 0x3ba, 0x24, 0x106, 0x37b, 0x2a0, 0x5a, 0x28f, 0x146, 0x19, 0x99, 0x254, 0x22f, 0x23a, 0x37a, 0x18b, 0x344, 0x160, 0x340, 0x1d7, 0x323, 0x270, 0x329, 0x141, 0x1da, 0x1d1, 0x1cb, 0x26, 0x359, 0x14e, 0x177, 0x5f, 0x113, 0x23b, 0x51, 0x295, 0xab, 0x366, 0x28e, 0x26d, 0x307, 0x376, 0x52, 0x3e1, 0x180, 0x35e, 0x8d, 0x3f, 0x3c0, 0x31a, 0x358, 0x265, 0x269, 0x3b0, 0x315, 0x3f5, 0x3eb, 0x2b1, 0x1ad, 0x1d, 0x2e, 0x237, 0x188, 0x230, 0x4b, 0x378, 0x3d4, 0x171, 0x2b7, 0x345, 0x24b, 0x5e, 0x238, 0x125, 0x3be, 0x93, 0x165, 0xdc, 0x2aa, 0x36b, 0x7c, 0x1d6, 0x8, 0x16e, 0xc6, 0x347, 0x14, 0x26b, 0x1ef, 0x120, 0x22, 0x3ee, 0x12d, 0x2d0, 0x55, 0x222, 0xc8, 0xc1, 0x284, 0x15c, 0x1f4, 0x3e6, 0x43, 0x216, 0x312, 0x236, 0x2a3, 0x12e, 0x3a4, 0x17e, 0x21a, 0x2cb, 0x293, 0x243, 0x130, 0x2fe, 0x25f, 0x63, 0x347, 0x28, 0x1be, 0x363, 0x224, 0x49, 0x24e, 0x38d, 0x11d, 0x37a, 0x316, 0x10b, 0x312, 0x65, 0x29e, 0x162, 0x23e, 0x393, 0x3a9, 0x311, 0x28d, 0x23b, 0xa2, 0x246, 0x151, 0x205, 0x174, 0x256, 0xe0, 0x3c, 0x161, 0xd6, 0x336, 0x269, 0x369, 0x4f, 0x397, 0x2c7, 0x29d, 0x38a, 0x29b, 0x253, 0x3d1, 0x1d3, 0x321, 0x5e, 0x79, 0x9d, 0x1cf, 0x122, 0xf3, 0x365, 0x3fd, 0x103, 0x1ce, 0x37d, 0x90, 0x22, 0x3d5, 0xbd, 0x2ad, 0x159, 0xd9, 0x26c, 0x58, 0x1a0, 0x1d7, 0x24f, 0x1d2, 0x17e, 0x3d, 0x33e, 0xb5, 0x71, 0x241, 0x2d7, 0x32c, 0x1b3, 0x28e, 0xd3, 0x7, 0x386, 0x129, 0xc7, 0xd8, 0x33, 0x3b, 0x2e7, 0x1ff, 0x3f1, 0x2b1, 0x35a, 0x74, 0x170, 0x338, 0x16c, 0x13b, 0x1c1, 0x227, 0x2a1, 0x2eb, 0x24d, 0x165, 0x1b8, 0x2ba, 0x36e, 0x3c9, 0x2be, 0x200, 0x245, 0x3b9, 0x2a0, 0xb4, 0x22e, 0x222, 0x190, 0x304, 0xd, 0xb7, 0x18c, 0x20e, 0x280, 0x3a5, 0x146, 0x64, 0x182, 0xd, 0x3da, 0x3ce, 0x270, 0xbf, 0x3d, 0x275, 0x2d4, 0x388, 0x51, 0x246, 0x2a2, 0x6, 0x3b2, 0x121, 0x3f, 0x31b, 0x1cc, 0x39d, 0x158, 0x105, 0x2e, 0xce, 0xb6, 0x13b, 0x382, 0x8e, 0x125, 0x2e3, 0x122, 0x1e6, 0x18f, 0x3d7, 0x14, 0x1be, 0x2cf, 0x82, 0x248, 0xa1, 0x15c, 0x3d9, 0x217, 0xe4, 0x2a4, 0x3b4, 0x293, 0x11e, 0x324, 0x2d7, 0x251, 0x2c5, 0x5d, 0x12b, 0xe0, 0x78, 0x18d, 0x2b9, 0x30c, 0x1ab, 0x3c6, 0x3c1, 0xc4, 0x69, 0x258, 0x3c3, 0x1aa, 0x371, 0x24d, 0x2ca, 0x2e9, 0x1fd, 0x285, 0x1ce, 0x2f3, 0x240, 0x110, 0x127, 0x38d, 0x23a, 0x1f3, 0x86, 0x94, 0x298, 0x176, 0x1cb, 0x98, 0x1f5, 0x334, 0x1b5, 0x2a7, 0x26d, 0x7, 0x305, 0xad, 0x231, 0x19b, 0x269, 0x2db, 0x13c, 0x87, 0x23, 0x314, 0x378, 0x34b, 0x33d, 0xb3, 0x350, 0x37, 0x2aa, 0x1b7, 0x3c9, 0x175, 0x16e, 0x239, 0x54, 0x5a, 0x55, 0x134, 0x26c, 0x160, 0x236, 0x135, 0x302, 0x359, 0x262, 0x16f, 0x357, 0x26d, 0xe, 0xf, 0x161, 0x358, 0x30c, 0x356, 0x303, 0x237, 0x5b, 0x13b, 0x30d, 0x238, 0x13a, 0x263, 0x1, 0x16e, 0x239, 0x54, 0x5a, 0x55, 0x134, 0x26c, 0x160, 0x236, 0x135, 0x302, 0x359, 0x262, 0x16f, 0x357, 0x26d, 0xe, 0xf, 0x161, 0x358, 0x30c, 0x356, 0x303, 0x237, 0x5b, 0x13b, 0x30d, 0x238, 0x13a, 0x263, 0x1, 0x16e, 0x239, 0x54, 0x5a, 0x55, 0x134, 0x26c, 0x160, 0x236, 0x135, 0x302, 0x359, 0x262, 0x16f, 0x357, 0x26d, 0xe, 0xf, 0x161, 0x358, 0x30c, 0x356, 0x303, 0x237, 0x5b, 0x13b, 0x30d, 0x238, 0x13a, 0x263, 0x1, 0x16e, 0x239, 0x54, 0x5a, 0x55, 0x134, 0x26c, 0x160, 0x236, 0x135, 0x302, 0x359, 0x262, 0x16f, 0x357, 0x26d, 0xe, 0xf, 0x161, 0x358, 0x30c, 0x356, 0x303, 0x237, 0x5b, 0x13b, 0x30d, 0x2dc, 0xf6, 0x2a0, 0x1a9, 0x2b2, 0x18b, 0x25, 0x298, 0x1d1, 0x8f, 0x241, 0x295, 0x2a2, 0x18, 0x35e, 0xc2, 0x377, 0x3f5, 0x2c7, 0xc5, 0x378, 0x137, 0x3bc, 0x93, 0x27d, 0x18f, 0x347, 0x140, 0x343, 0x222, 0x9b, 0xb0, 0x236, 0x26a, 0x13, 0x2fe, 0x261, 0x1b3, 0x5d, 0xa5, 0x21b, 0x23f, 0x27b, 0x35c, 0x173, 0x29b, 0x2bc, 0x195, 0x1a8, 0x6e, 0x17d, 0x285, 0x331, 0x363, 0x104, 0x264, 0xd, 0x373, 0x97, 0x11f, 0x257, 0x1d5, 0x3ed, 0x199, 0x7, 0xf, 0x2c2, 0x17b, 0x56, 0x105, 0xb8, 0xfb, 0x1d3, 0x13e, 0x3ad, 0x3dc, 0x1f0, 0x175, 0x48, 0x88, 0x24e, 0x57, 0x3d9, 0x4e, 0x25b, 0x7a, 0x38c, 0x226, 0x3f9, 0x368, 0xa4, 0xc7, 0x2c9, 0xdb, 0x2f5, 0x3c1, 0x310, 0x299, 0x30d, 0x79, 0xe1, 0x33c, 0x10, 0x193, 0x37b, 0x25a, 0x2a6, 0x37a, 0x86, 0x250, 0x1da, 0x12f, 0xe2, 0x51, 0x10a, 0x27a, 0x180, 0x185, 0x3b, 0x315, 0x1b1, 0x3d8, 0x12d, 0x2a6, 0x2fd, 0x218, 0x2a4, 0x19f, 0x1a1, 0xfe, 0xda, 0x52, 0xc7, 0x19b, 0x36c, 0x385, 0x67, 0x2d8, 0x321, 0x1e9, 0x1ee, 0x1f0, 0x2ea, 0x120, 0x49, 0xa1, 0x2f2, 0x395, 0x341, 0x32f, 0x1d5, 0x3d3, 0x26d, 0x38, 0xf0, 0xe6, 0x26f, 0x35a, 0x349, 0x2bc, 0x32a, 0x2a9, 0x370, 0x3fd, 0x14, 0x1eb, 0x28c, 0x249, 0xb0, 0x65, 0x1ba, 0x98, 0x3b3, 0xab, 0x3, 0x2d3, 0x61, 0x377, 0x3e3, 0x30e, 0x221, 0x3e5, 0x2a1, 0x2e3, 0x102, 0x16e, 0xf6, 0x149, 0x2ad, 0x1bd, 0x86, 0xa9, 0x361, 0x16a, 0x23b, 0x232, 0x210, 0x337, 0x360, 0xdb, 0x1e3, 0x31f, 0xb6, 0x1ca, 0x178, 0x27f, 0x7c, 0x2be, 0x48, 0x110, 0x12a, 0x2b8, 0x1e7, 0x1d2, 0x3cd, 0x177, 0x3f2, 0x199, 0xe, 0x3c, 0x23d, 0x39d, 0x2d2, 0x1d0, 0xaf, 0x2ce, 0x1a8, 0xdc, 0x1fd, 0x5, 0x37c, 0xa3, 0x190, 0x2c, 0x11b, 0x26a, 0x26, 0x3ea, 0x32c, 0x306, 0x362, 0x37b, 0x17a, 0x23a, 0x30f, 0x329, 0xf4, 0x5f, 0x59, 0x307, 0xf, 0x31a, 0x39d, 0x1ad, 0x349, 0x171, 0xb3, 0x165, 0x365, 0x347, 0x109, 0x55, 0x1b2, 0x216, 0x139, 0x293, 0x1c4, 0x288, 0x108, 0x337, 0x2c9, 0x36c, 0x303, 0x19c, 0x2ed, 0x27c, 0x157, 0x36e, 0x1ce, 0x363, 0x19, 0x201, 0x340, 0x135, 0x26, 0x3dd, 0xab, 0x6, 0x35e, 0x308, 0x315, 0x87, 0x230, 0x2e4, 0x238, 0x1c2, 0x1d6, 0x200, 0x22, 0x24e, 0x15c, 0x1e7, 0x3a4, 0x32f, 0x3aa, 0x357, 0x34c, 0x380, 0x23f, 0x1fe, 0x1a5, 0x6f, 0x29f, 0x371, 0x91, 0x32b, 0x239, 0x2a0, 0x2ad, 0x37a, 0x218, 0x141, 0x275, 0x113, 0x3fb, 0x376, 0xad, 0x358, 0x56, 0x1d, 0x392, 0x2b7, 0xd4, 0xdc, 0x3fa, 0x14, 0x3d6, 0x222, 0x26c, 0x312, 0xbb, 0x243, 0x8b, 0x85, 0xfd, 0x1b, 0xcc, 0x1bf, 0x3c1, 0x5b, 0x1ca, 0x2f0, 0x1ee, 0x3e0, 0x3ba, 0x112, 0x99, 0xd, 0x1d7, 0x162, 0x2cd, 0x1f7, 0x3c2, 0x3e8, 0x138, 0x3e2, 0x2ee, 0x3af, 0x34c, 0x309, 0xee, 0x3eb, 0x266, 0x1fb, 0x2a1, 0x39e, 0x4, 0x326, 0x3d5, 0x313, 0x3bb, 0xe9, 0x393, 0x3aa, 0x2a7, 0x12b, 0x3f, 0x3b8, 0x3b7, 0x18a, 0x3e5, 0x296, 0x263, 0x10, 0x83, 0x34f, 0x57, 0x2f7, 0x3a4, 0x257, 0x2b3, 0x28e, 0xa5, 0xfc, 0x2fb, 0x2c7, 0x221, 0x38f, 0x24a, 0x19e, 0x40, 0x20c, 0x127, 0x15c, 0x3ce, 0x28b, 0x14e, 0x2de, 0x22a, 0x294, 0x3f0, 0x3fe, 0x30e, 0x96, 0x227, 0x13a, 0x271, 0x100, 0x22, 0x95, 0x179, 0x323, 0x23e, 0x131, 0x36a, 0xba, 0x242, 0x3db, 0x3e3, 0x23, 0x258, 0x8e, 0xe1, 0x1d6, 0x9, 0x88, 0x254, 0x1ed, 0x97, 0xea, 0xcd, 0x1b3, 0x2e8, 0x11a, 0x377, 0x397, 0x8c, 0x172, 0x238, 0x384, 0x351, 0x24, 0x220, 0x142, 0x3bd, 0x25c, 0x3a8, 0x334, 0x2c5, 0x3b2, 0x61, 0x1c7, 0x247, 0x230, 0x1c1, 0xf2, 0x20b, 0x15f, 0x90, 0x92, 0x193, 0x3d5, 0x22f, 0x2f7, 0x341, 0x14e, 0x1b5, 0xba, 0x8d, 0x377, 0x327, 0x230, 0x382, 0x3c8, 0x7c, 0x1dd, 0x224, 0xc1, 0x1a0, 0x26a, 0x130, 0x34e, 0x13d, 0x1b, 0x330, 0x3c6, 0x19c, 0x3a6, 0x381, 0x17d, 0xa, 0x3a5, 0x134, 0x10b, 0x272, 0xb5, 0xfe, 0x2d9, 0xad, 0x17b, 0x169, 0x349, 0x1cd, 0x322, 0x1e6, 0x318, 0x149, 0x145, 0x383, 0x25b, 0x3a9, 0x3f2, 0xd3, 0x380, 0xee, 0x3df, 0x18a, 0x3c3, 0x24a, 0x33c, 0x100, 0x44, 0x254, 0x3da, 0x25c, 0x359, 0xcb, 0x205, 0x35e, 0x3b, 0x13c, 0x188, 0xe5, 0x1e9, 0x36b, 0xe7, 0x2cf, 0xc8, 0xb0, 0x328, 0x243, 0x22c, 0x42, 0x337, 0x336, 0x2a5, 0x170, 0x35f, 0x1a8, 0x2e9, 0x3a7, 0x212, 0x2a8, 0x225, 0x152, 0x275, 0x45, 0x3c7, 0xf, 0x73, 0x1ae, 0x38a, 0x34b, 0x2eb, 0x81, 0x1b1, 0x2ff, 0x3c2, 0x3d9, 0xe9, 0x32f, 0x2b3, 0x115, 0x294, 0x3e9, 0x3e3, 0x46, 0x172, 0x79, 0x20b, 0x326, 0x34f, 0x15c, 0x323, 0xea, 0x334, 0x306, 0x35e, 0x76, 0xf9, 0x5b, 0x24b, 0x157, 0x346, 0x37c, 0x222, 0x344, 0x139, 0xb5, 0x1fc, 0x376, 0x161, 0x39d, 0x173, 0x3d4, 0x371, 0x81, 0x362, 0x3ee, 0x22f, 0x1e7, 0x11f, 0x262, 0x366, 0x36d, 0x308, 0x9e, 0x188, 0x1ca, 0x3ad, 0x36e, 0x26b, 0x146, 0x26c, 0xa6, 0x293, 0x23b, 0x368, 0xad, 0x2f6, 0x1ad, 0x27e, 0xef, 0x91, 0x16e, 0x37b, 0x3c2, 0x3bb, 0x3a4, 0x14e, 0x36a, 0x2e8, 0x61, 0x315, 0x31, 0x13b, 0x2f0, 0x36b, 0x1ce, 0x32e, 0x249, 0x312, 0x1d1, 0x1c4, 0x6d, 0x290, 0x358, 0x2b0, 0x349, 0x39a, 0x93, 0x32b, 0x1ec, 0x17a, 0x1f4, 0x270, 0x32f, 0x16f, 0x5d, 0x8d, 0x2e7, 0x87, 0x1a4, 0x5e, 0x1ee, 0x33f, 0x363, 0xc8, 0x160, 0xbb, 0x23c, 0x288, 0x52, 0x6b, 0x56, 0xe8, 0x171, 0x191, 0x1e6, 0x239, 0x12d, 0x23a, 0x4e, 0x3e2, 0x3aa, 0x28e, 0x294, 0x3db, 0x397, 0x230, 0x245, 0x127, 0x2f2, 0x25c, 0x17f, 0xab, 0x60, 0x66, 0x1e3, 0x338, 0x10f, 0xdc, 0x3d7, 0x2d, 0x16d, 0x39, 0x7a, 0x2f8, 0xd3, 0x21b, 0x2fb, 0x215, 0x172, 0x1e4, 0xf8, 0x2f3, 0x19, 0x58, 0x259, 0x23c, 0x119, 0x148, 0x358, 0x169, 0x13f, 0xef, 0x122, 0x1b1, 0x3ee, 0x57, 0x395, 0xea, 0x261, 0x3, 0x2c6, 0x369, 0x31f, 0x2ed, 0x381, 0x1fd, 0xa0, 0xaa, 0x225, 0x141, 0x311, 0x164, 0x70, 0x77, 0x3b7, 0x4b, 0x8e, 0x301, 0x175, 0x224, 0x304, 0x236, 0x396, 0x22c, 0x108, 0x31c, 0x2b, 0xe8, 0x2e2, 0x24d, 0x32b, 0x3d8, 0x1e1, 0x3bb, 0x341, 0x131, 0x366, 0x2d3, 0x3b, 0xf9, 0xb6, 0x13e, 0x2aa, 0x5, 0x343, 0x1b2, 0x128, 0x33e, 0x8a, 0x207, 0x1e0, 0x1fe, 0x266, 0x3c3, 0x13a, 0x3ac, 0x90, 0x99, 0xd0, 0xdd, 0x192, 0x10a, 0x39f, 0x265, 0x105, 0x253, 0xb3, 0x27d, 0x318, 0x12d, 0x7d, 0x138, 0x32f, 0x2de, 0x174, 0x61, 0x83, 0x95, 0x3bd, 0x181, 0x3b3, 0x29a, 0x6c, 0x2d1, 0x170, 0x2ce, 0x2ca, 0xc6, 0x292, 0x7d, 0x270, 0xa7, 0x2dd, 0x36d, 0x3b, 0x1f2, 0x2d8, 0x1e2, 0x2fa, 0xa0, 0x154, 0x86, 0x21a, 0x17c, 0xd3, 0x3f, 0x3fe, 0x8c, 0x30d, 0xf7, 0x277, 0x32e, 0x136, 0x14c, 0xb5, 0x3f9, 0x305, 0xe6, 0x2d6, 0x2f9, 0x125, 0xeb, 0x48, 0x99, 0x1a0, 0x374, 0x8b, 0x84, 0x31c, 0x56, 0x3a0, 0x33d, 0x91, 0x1b1, 0x3d5, 0x15c, 0x97, 0x2bb, 0xab, 0xc0, 0x198, 0x303, 0x3ec, 0x1a8, 0x365, 0x2a, 0x153, 0x30f, 0x1f1, 0x35d, 0x5d, 0x234, 0x223, 0x188, 0x321, 0x2ae, 0x206, 0x343, 0x364, 0xa9, 0x1c6, 0xb2, 0x70, 0xee, 0x2c7, 0x258, 0xf2, 0xf8, 0x1ef, 0x64, 0x2c0, 0x1d1, 0x319, 0x2d9, 0x161, 0x26f, 0x31d, 0xd5, 0x335, 0x80, 0x110, 0x202, 0x14f, 0x130, 0x246, 0x3cb, 0x265, 0x20a, 0x15e, 0x191, 0x391, 0x3d8, 0x3c2, 0x2f7, 0x23e, 0x334, 0x106, 0x254, 0x1d7, 0x26, 0x295, 0x3e1, 0x265, 0x1d, 0x171, 0x93, 0x16e, 0x3ee, 0x15c, 0x12e, 0x2fe, 0x151, 0x1b, 0x36c, 0x170, 0x195, 0x33a, 0x239, 0x17a, 0x3bb, 0x11f, 0x334, 0x6, 0x21d, 0x1e3, 0xfb, 0xd4, 0x365, 0x54, 0x145, 0x4e, 0x32f, 0x36a, 0x36d, 0x76, 0x3c1, 0x2ed, 0x21f, 0x3ef, 0x5a, 0x37a, 0x329, 0x177, 0x28e, 0x8d, 0x315, 0x188, 0x24b, 0x2aa, 0x14, 0x55, 0x43, 0x21a, 0x2f8, 0x34c, 0x1f8, 0x397, 0x1a4, 0x2f0, 0x36e, 0x37c, 0x134, 0x94, 0x275, 0x59, 0x70, 0x1dc, 0x30e, 0x2e4, 0x33b, 0x33f, 0x32e, 0x26c, 0x139, 0x1a1, 0x3e7, 0x78, 0x1fe, 0x18a, 0x47, 0x20b, 0x3ba, 0x19, 0x160, 0x1d1, 0x23b, 0x376, 0x31a, 0x2b1, 0x378, 0x125, 0x1d6, 0x120, 0xc1, 0x236, 0x243, 0x288, 0x290, 0x2f6, 0x173, 0x29f, 0x1cf, 0x40, 0x110, 0xd, 0x135, 0x192, 0x21, 0x18e, 0x56, 0x349, 0xef, 0x81, 0x326, 0x24e, 0x3bd, 0x20c, 0x142, 0x2a3, 0x260, 0x214, 0x18e, 0xac, 0x13f, 0x371, 0x2, 0x11, 0x284, 0x14f, 0xc9, 0x21, 0x31c, 0x158, 0x27e, 0x2eb, 0x4, 0x22, 0x101, 0x29e, 0x192, 0x42, 0x231, 0x2b0, 0xf5, 0x1df, 0x8, 0x44, 0x202, 0x135, 0x324, 0x84, 0x6b, 0x169, 0x1ea, 0x3be, 0x10, 0x88, 0xd, 0x26a, 0x241, 0x108, 0xd6, 0x2d2, 0x3d4, 0x375, 0x20, 0x110, 0x1a, 0xdd, 0x8b, 0x210, 0x1ac, 0x1ad, 0x3a1, 0x2e3, 0x40, 0x220, 0x34, 0x1ba, 0x116, 0x29, 0x358, 0x35a, 0x34b, 0x1cf, 0x80, 0x49, 0x68, 0x374, 0x22c, 0x52, 0x2b9, 0x2bd, 0x29f, 0x39e, 0x100, 0x92, 0xd0, 0x2e1, 0x51, 0xa4, 0x17b, 0x173, 0x137, 0x335, 0x200, 0x124, 0x1a0, 0x1cb, 0xa2, 0x148, 0x2f6, 0x2e6, 0x26e, 0x263, 0x9, 0x248, 0x340, 0x396, 0x144, 0x290, 0x1e5, 0x1c5, 0xd5, 0xcf, 0x12, 0x99, 0x289, 0x325, 0x288, 0x129, 0x3ca, 0x38a, 0x1aa, 0x19e, 0x24, 0x11, 0x101, 0x135, 0x241, 0x210, 0x358, 0x2bd, 0x137, 0x263, 0x12, 0x132, 0x236, 0x11e, 0xda, 0x161, 0x35c, 0x2f9, 0x13a, 0x2be, 0x104, 0x160, 0x34d, 0x3f8, 0xf, 0xff, 0x314, 0x238, 0x1f0, 0x2cf, 0x26c, 0xed, 0x226, 0xe, 0xee, 0x215, 0x30d, 0x3b1, 0xdf, 0x134, 0x250, 0x311, 0x26d, 0xfc, 0x327, 0x13b, 0x2af, 0x5, 0x55, 0x10c, 0x1e8, 0x357, 0x242, 0x223, 0x5b, 0x1e2, 0x3fd, 0x5a, 0x1f3, 0x2fc, 0x16f, 0x3b2, 0xec, 0x237, 0x10f, 0x1db, 0x54, 0x11d, 0xe9, 0x262, 0x3, 0x33, 0x303, 0x35f, 0x2ca, 0x239, 0x1e1, 0x3ce, 0x359, 0x2ac, 0x36, 0x356, 0x253, 0x322, 0x16e, 0x3a3, 0x1ed, 0x302, 0x34e, 0x3cb, 0x30c, 0x3a0, 0x1de, 0x1, 0x11, 0x101, 0x135, 0x241, 0x210, 0x358, 0x2bd, 0x137, 0x263, 0x12, 0x132, 0x236, 0x11e, 0xda, 0x161, 0x35c, 0x2f9, 0x13a, 0x2be, 0x104, 0x160, 0x34d, 0x3f8, 0xf, 0xff, 0x314, 0x238, 0x22, 0xd, 0x1ba, 0x51, 0x290, 0x39d, 0x6f, 0x125, 0x2ab, 0x82, 0x160, 0x293, 0x3fb, 0x78, 0x3eb, 0x258, 0x33b, 0x1ce, 0x222, 0x94, 0x38c, 0x26d, 0x1f8, 0x87, 0x1ca, 0x2aa, 0xa0, 0x16d, 0x329, 0x3aa, 0x2e8, 0x76, 0x237, 0x21e, 0x365, 0x2a0, 0x1f4, 0x11f, 0x196, 0x180, 0x36c, 0x392, 0x191, 0x16e, 0x34f, 0x3bd, 0x26, 0x85, 0x18e, 0x2b0, 0x3d4, 0x1cf, 0x200, 0x99, 0x236, 0x23c, 0x368, 0x31a, 0x1a5, 0x38f, 0x20b, 0x1ef, 0x249, 0x139, 0x113, 0xe, 0x1dc, 0x46, 0x5e, 0x36e, 0x3d6, 0x18b, 0x21a, 0x3ed, 0x294, 0x315, 0x5b, 0x3c4, 0x3ef, 0x2d0, 0x30f, 0x32f, 0x366, 0x2c6, 0x1e3, 0x3d1, 0x165, 0x239, 0x3c2, 0x323, 0x2fe, 0x29a, 0x2c9, 0x1d, 0x39a, 0x81, 0x106, 0x284, 0x135, 0x8b, 0x52, 0x2f6, 0x38a, 0x2a1, 0x1d6, 0x112, 0x2c, 0x1d1, 0x1fc, 0xf, 0x1fe, 0x4b, 0x1e4, 0x33f, 0x146, 0x216, 0x275, 0x2c8, 0x3f, 0x397, 0x44, 0x34, 0x1cb, 0x119, 0x2b4, 0x2b1, 0x3e5, 0x301, 0x1ef, 0x9b, 0xed, 0x8a, 0xe0, 0x3fe, 0x1a4, 0x353, 0xa, 0x2a8, 0x1c8, 0x1d5, 0x2e8, 0xec, 0xce, 0xd4, 0x235, 0xbd, 0x1e7, 0x2bb, 0x14d, 0x2c9, 0x3a, 0x273, 0x1, 0x44, 0x34, 0x1cb, 0x119, 0x2b4, 0x2b1, 0x3e5, 0x301, 0x1ef, 0x9b, 0xed, 0x8a, 0xe0, 0x3fe, 0x1a4, 0x353, 0xa, 0x2a8, 0x1c8, 0x1d5, 0x2e8, 0xec, 0xce, 0xd4, 0x235, 0xbd, 0x1e7, 0x2bb, 0x14d, 0x2c9, 0x3a, 0x273, 0x1, 0x44, 0x34, 0x1cb, 0x119, 0x2b4, 0x2b1, 0x3e5, 0x301, 0x1ef, 0x9b, 0xed, 0x8a, 0xe0, 0x3fe, 0x1a4, 0x353, 0xa, 0x2a8, 0x1c8, 0x1d5, 0x2e8, 0xec, 0xce, 0xd4, 0x235, 0xbd, 0x1e7, 0x2bb, 0x14d, 0x2c9, 0x3a, 0x273, 0x1, 0x44, 0x34, 0x1cb, 0x119, 0x2b4, 0x2b1, 0x3e5, 0x301, 0x1ef, 0x9b, 0xed, 0x8a, 0xe0, 0x3fe, 0x1a4, 0x353, 0xa, 0x2a8, 0x1c8, 0x1d5, 0x2e8, 0x88, 0xd0, 0x243, 0x1b4, 0x23d, 0x133, 0x11c, 0x3c9, 0x146, 0x4a, 0x311, 0x34c, 0x377, 0x310, 0x3c4, 0x3a7, 0x153, 0x270, 0x19a, 0x60, 0x36c, 0x253, 0x126, 0x326, 0x142, 0x26a, 0x51, 0x252, 0x1ae, 0x3f6, 0x301, 0x3de, 0x26c, 0x361, 0xb2, 0x3f, 0x247, 0x394, 0x17d, 0x2d, 0x3c5, 0x32f, 0x183, 0x33, 0x2e, 0x25d, 0x25f, 0x34f, 0x2ef, 0x260, 0x108, 0x17b, 0x31d, 0x125, 0x2be, 0x32, 0xa6, 0x28d, 0x1c, 0x2fb, 0xd2, 0x353, 0x14, 0x2b2, 0x25b, 0x16f, 0x1af, 0x37e, 0x3d1, 0x19d, 0x3d8, 0x15c, 0x181, 0x123, 0x18e, 0x2d2, 0x137, 0x33c, 0x89, 0x58, 0x293, 0x3f7, 0x389, 0x30e, 0x2f, 0x2d5, 0x28f, 0x10c, 0x35b, 0x5d, 0x3b, 0x67, 0xd4, 0x63, 0x2f4, 0x323, 0x3ea, 0x1fa, 0x30c, 0x13f, 0x375, 0x200, 0x264, 0x328, 0x23b, 0x203, 0x3fc, 0x258, 0xf7, 0xdf, 0x1b2, 0x10d, 0x3d3, 0x8d, 0x278, 0x1d3, 0x2e9, 0x150, 0x3e8, 0xea, 0x110, 0x340, 0x23c, 0x376, 0x339, 0x4b, 0x33b, 0x26b, 0x1b2, 0x21a, 0x357, 0x61, 0x3c1, 0x21e, 0x31e, 0x17a, 0x323, 0x3dd, 0x3e1, 0x56, 0x3d4, 0x263, 0x120, 0x2c, 0x293, 0x3e7, 0x23f, 0x46, 0x2f0, 0x206, 0x2a8, 0x329, 0x16f, 0x35e, 0x1e3, 0x2b7, 0x1e6, 0x3ee, 0x3bd, 0x130, 0x108, 0x2f6, 0x6f, 0x13a, 0x3ba, 0x249, 0x1da, 0x59, 0x3f, 0x87, 0x24b, 0x3fa, 0x2d0, 0x4e, 0x262, 0x30, 0x36c, 0xaf, 0x91, 0x106, 0xd, 0x1cb, 0x6d, 0x31a, 0x133, 0x238, 0x33f, 0x222, 0xa9, 0x2f8, 0x294, 0x9e, 0x2ed, 0x2e9, 0x2a0, 0x3bb, 0x359, 0x29a, 0x265, 0x349, 0x3be, 0x200, 0xc1, 0xbb, 0x1fc, 0x78, 0x367, 0x30d, 0x36e, 0x28f, 0x218, 0x177, 0x2e8, 0x3b0, 0xfb, 0x165, 0x1ec, 0x15c, 0x302, 0x85, 0x6b, 0x173, 0x2a1, 0x2ab, 0x19, 0xa6, 0x113, 0x70, 0x3f5, 0x13b, 0x2aa, 0x109, 0x3e6, 0x32f, 0x306, 0xcc, 0x170, 0x191, 0x362, 0x254, 0x220, 0x11b, 0x1c4, 0x305, 0x3f1, 0x2e4, 0x2df, 0x343, 0x218, 0x2ee, 0x3b2, 0x1bf, 0x3ab, 0xf3, 0x3ee, 0x373, 0xc9, 0x52, 0x333, 0x1fb, 0x20b, 0x2cf, 0x10b, 0x38c, 0x291, 0x38e, 0x2d8, 0x1b8, 0x150, 0x3bb, 0x2bb, 0x27a, 0x30c, 0xf5, 0x335, 0x120, 0x58, 0x25e, 0x307, 0x3b8, 0xd2, 0x157, 0x140, 0x1f3, 0x32f, 0x205, 0x330, 0x392, 0x126, 0x83, 0xd, 0x396, 0x1b4, 0xe6, 0x314, 0x399, 0x26b, 0x364, 0x7a, 0x28e, 0x219, 0xce, 0x2a9, 0x7b, 0xae, 0x302, 0x10a, 0x1ac, 0x38a, 0x24a, 0x1dd, 0x249, 0x3b4, 0x164, 0x1f8, 0x62, 0x1e2, 0x347, 0x28a, 0x28b, 0xab, 0x1b0, 0x74, 0x371, 0x80, 0x264, 0xbb, 0x3f8, 0x1e0, 0x30e, 0xbc, 0x103, 0x2a8, 0x25b, 0x1b5, 0x2c6, 0x20f, 0x25d, 0x16e, 0x95, 0x29e, 0x51, 0x15a, 0x2d6, 0x47, 0x3c9, 0x111, 0xa9, 0x1f9, 0x242, 0xf9, 0x283, 0x18f, 0x17a, 0x24f, 0x36f, 0x337, 0x169, 0x26e, 0x1d6, 0x49, 0x65, 0x23b, 0x3c, 0x2c7, 0x5e, 0x103, 0x159, 0x17e, 0x1b3, 0x33, 0x170, 0x24d, 0x245, 0xd, 0x325, 0x2d9, 0x339, 0x12c, 0x3dc, 0x3d6, 0x10c, 0x2ee, 0x36d, 0x2f5, 0x167, 0x32b, 0x127, 0x14f, 0x51, 0x2b4, 0x34a, 0x238, 0xe7, 0x268, 0x21a, 0x147, 0x219, 0x19c, 0x2b6, 0x3d8, 0x2f2, 0x98, 0x210, 0x39d, 0x1fb, 0x1f, 0x32e, 0x4a, 0xbe, 0x294, 0x278, 0x283, 0x31e, 0x1e1, 0x25c, 0x295, 0x231, 0x2e6, 0x125, 0x1dd, 0x9b, 0x2cb, 0x332, 0x3bf, 0x5b, 0x6e, 0xa8, 0x3bb, 0x17f, 0x1fa, 0x56, 0x34b, 0x271, 0x82, 0x53, 0x226, 0x380, 0x247, 0x9f, 0x3ef, 0x2a6, 0x341, 0xab, 0x360, 0x1d0, 0x3be, 0x12, 0xb, 0x293, 0x387, 0x3b8, 0x1a4, 0x155, 0x212, 0x30f, 0x131, 0x60, 0x356, 0x1cd, 0x2, 0x92, 0xca, 0x7f, 0x78, 0x187, 0xbc, 0x206, 0x2b2, 0x2fc, 0x366, 0x66, 0x2e0, 0x93, 0x83, 0x1a, 0x243, 0x1bb, 0x27b, 0x258, 0x92, 0x194, 0x1fc, 0x3c0, 0x46, 0x3ad, 0xa0, 0x3e6, 0x14e, 0x30, 0x356, 0x39a, 0x8, 0x99, 0xbb, 0x3fb, 0x23f, 0x230, 0x157, 0x109, 0x30f, 0x262, 0x180, 0x286, 0xef, 0x40, 0xc1, 0x1d1, 0x3e7, 0x1dc, 0x1a4, 0x2aa, 0x5a, 0x4e, 0x334, 0x1b, 0x1d, 0x371, 0x200, 0x201, 0x293, 0x307, 0x2fb, 0x13b, 0x17d, 0x2d0, 0x270, 0x196, 0xd8, 0xe8, 0x3be, 0x24, 0x2c, 0xb5, 0xe, 0x3f5, 0x1ca, 0x3fa, 0x2ad, 0x3a4, 0xab, 0x2c9, 0x349, 0x1cf, 0x120, 0x160, 0x1a1, 0x70, 0x397, 0x24b, 0x3ef, 0x145, 0x11f, 0x151, 0x265, 0x27e, 0x263, 0x112, 0x312, 0x113, 0x380, 0x87, 0x27c, 0x347, 0x23a, 0xea, 0x29a, 0x30c, 0x3d4, 0x33c, 0x82, 0xa6, 0x8a, 0x3f, 0x31, 0x3c4, 0x20e, 0x1f4, 0x359, 0xfd, 0x56, 0x29f, 0x1d6, 0x19, 0x139, 0x59, 0x1f8, 0x188, 0x21f, 0x54, 0x3bb, 0x2fe, 0x3e1, 0x2b0, 0xd5, 0x2ab, 0xc8, 0x1da, 0x2c8, 0x3db, 0x124, 0x259, 0x3fb, 0x77, 0xd2, 0x2aa, 0xb4, 0x138, 0x196, 0x1b0, 0x3a0, 0x1cf, 0x240, 0x189, 0x113, 0x309, 0x21c, 0x3c4, 0x15, 0x3d9, 0x2fe, 0x3cb, 0x2d2, 0x2a1, 0x2ea, 0x136, 0x275, 0x291, 0x4f, 0x345, 0x235, 0x313, 0x302, 0x42, 0x3ca, 0x3f6, 0xf8, 0x111, 0x141, 0x2a7, 0x3b, 0xfb, 0x27d, 0x3a3, 0x2a3, 0xa2, 0x18d, 0x18a, 0x27f, 0x1eb, 0x218, 0x35d, 0x163, 0x2e, 0x322, 0x83, 0x68, 0x71, 0x203, 0x367, 0xbc, 0xa, 0x37a, 0x257, 0x18, 0x356, 0x33d, 0x20, 0xc1, 0x3a2, 0x387, 0x2fb, 0x276, 0x1fd, 0x2ad, 0x341, 0x2ac, 0x265, 0xf5, 0x19e, 0x82, 0x14c, 0x228, 0x1f8, 0x310, 0x6e, 0x2a0, 0x3ce, 0x36f, 0x18e, 0x2e6, 0x9d, 0x1ef, 0x281, 0x22b, 0x294, 0x1f2, 0x6a, 0x239, 0x2b8, 0x98, 0x52, 0x1ae, 0x227, 0x33f, 0x268, 0x7a, 0x5d, 0x369, 0x35f, 0x32b, 0x95, 0xdd, 0x6d, 0x1cc, 0x12c, 0x36b, 0x117, 0x390, 0x36a, 0x248, 0x176, 0x3e7, 0x379, 0x276, 0x3fa, 0x2a6, 0x23e, 0x29a, 0x2b, 0x137, 0x2ab, 0x320, 0x19f, 0x34c, 0x4f, 0x283, 0xc6, 0xae, 0x4c, 0x52, 0x35c, 0x8e, 0x1ce, 0x2c1, 0x35b, 0x36d, 0x385, 0x166, 0x326, 0x34, 0x71, 0xf, 0x187, 0x1e9, 0xa0, 0x383, 0xcd, 0x1b, 0x74, 0x375, 0x120, 0x189, 0x226, 0x3f, 0xc4, 0x37, 0x2a0, 0x395, 0x1a7, 0x6b, 0x233, 0x384, 0x32e, 0x250, 0x3d3, 0x308, 0x279, 0x27d, 0x34f, 0x29e, 0x119, 0xe6, 0x12c, 0x2df, 0x55, 0xbf, 0x2c5, 0x269, 0x2bc, 0x2, 0x99, 0x2ec, 0x3c7, 0x2fb, 0xe5, 0x3fd, 0x145, 0x75, 0x13d, 0x56, 0x26e, 0x15f, 0x249, 0x33e, 0x291, 0x9e, 0x10f, 0x18c, 0x15c, 0x98, 0xa4, 0x2b1, 0x11c, 0x39c, 0x18b, 0x2bf, 0x2d3, 0x303, 0x2cc, 0x245, 0x68, 0xe2, 0x1e, 0x30e, 0x3d2, 0x140, 0x30f, 0x19a, 0x36, 0xe8, 0x2e3, 0x240, 0x312, 0x45, 0x7e, 0x188, 0x6e, 0x149, 0x323, 0x99, 0x1d1, 0x307, 0x3f5, 0x24b, 0x347, 0x1f4, 0x2fe, 0x337, 0x173, 0x13a, 0x363, 0x94, 0x3ed, 0x308, 0xfb, 0x1e6, 0x24e, 0x1ba, 0x368, 0x1fe, 0x30d, 0x206, 0x37a, 0x14e, 0x180, 0x1d, 0x3be, 0x120, 0x312, 0x8a, 0x1f8, 0x5b, 0x2e9, 0x17a, 0x162, 0x21, 0x39d, 0x38f, 0x33f, 0x1b2, 0x3a9, 0x36d, 0x303, 0x191, 0x106, 0x340, 0x23b, 0x3c0, 0x230, 0x2aa, 0x2d0, 0x3a4, 0x151, 0x30c, 0x29f, 0x2ab, 0x249, 0x275, 0x256, 0xf9, 0xd4, 0x1ec, 0x3bd, 0x8b, 0x161, 0x18a, 0x1ee, 0x28f, 0x329, 0x366, 0x269, 0x171, 0x8, 0xc1, 0x293, 0xe, 0x397, 0x27c, 0x20e, 0x3bb, 0x3dd, 0x18e, 0x38a, 0x1c2, 0x32e, 0xa9, 0x357, 0x76, 0x3d1, 0x32b, 0x254, 0x1cb, 0x376, 0x3eb, 0x5e, 0x14, 0x3e6, 0x262, 0x1b, 0xe8, 0x1cf, 0x112, 0xa6, 0x59, 0x3db, 0x2d8, 0x365, 0x3c2, 0x302, 0x108, 0xd7, 0x47, 0x1ce, 0x18b, 0x177, 0x35e, 0x2e, 0x93, 0x22, 0x132, 0x34d, 0xe, 0x327, 0x1e2, 0x54, 0x3ce, 0x34e, 0x358, 0x2f9, 0x1f0, 0x134, 0x1e8, 0x3b2, 0x303, 0x322, 0x11, 0x236, 0x3f8, 0xee, 0x13b, 0x3fd, 0x11d, 0x359, 0x3cb, 0x2bd, 0x13a, 0x2cf, 0x250, 0x357, 0xec, 0x35f, 0x16e, 0x101, 0x11e, 0xf, 0x215, 0x2af, 0x5a, 0xe9, 0x2ac, 0x30c, 0x137, 0x2be, 0x26c, 0x311, 0x242, 0x237, 0x2ca, 0x3a3, 0x135, 0xda, 0xff, 0x30d, 0x5, 0x1f3, 0x262, 0x36, 0x3a0, 0x263, 0x104, 0xed, 0x26d, 0x223, 0x10f, 0x239, 0x1ed, 0x241, 0x161, 0x314, 0x3b1, 0x55, 0x2fc, 0x3, 0x356, 0x1de, 0x12, 0x160, 0x226, 0xfc, 0x5b, 0x1db, 0x1e1, 0x302, 0x210, 0x35c, 0x238, 0xdf, 0x10c, 0x16f, 0x33, 0x253, 0x1, 0x132, 0x34d, 0xe, 0x327, 0x1e2, 0x54, 0x3ce, 0x34e, 0x358, 0x2f9, 0x1f0, 0x134, 0x1e8, 0x3b2, 0x303, 0x322, 0x11, 0x236, 0x3f8, 0xee, 0x13b, 0x3fd, 0x11d, 0x359, 0x3cb, 0x2bd, 0x13a, 0x264, 0x12f, 0x70, 0x21c, 0x37, 0x12d, 0xb1, 0x42, 0xd7, 0x11c, 0xdf, 0x218, 0x1b5, 0x198, 0x171, 0x20, 0xb, 0x1a1, 0x21b, 0x310, 0x2e9, 0x1e1, 0x20d, 0x52, 0x2d6, 0x3c8, 0x3d6, 0x390, 0x2c5, 0x36c, 0x273, 0x9, 0x160, 0x45, 0x3f0, 0x2d8, 0x18f, 0x57, 0x130, 0x252, 0x266, 0x1ee, 0x22e, 0x2fc, 0x6, 0x143, 0x2eb, 0x120, 0x53, 0xb2, 0x2e7, 0x3a6, 0x18c, 0x2f2, 0x241, 0x2c2, 0x4b, 0x1b7, 0x159, 0x32f, 0xc0, 0x3a, 0x1cf, 0x41, 0x272, 0x26d, 0x4f, 0x35, 0x1ec, 0x2ef, 0xa2, 0xe6, 0x172, 0x285, 0x37a, 0x131, 0x36, 0x349, 0x19e, 0x32, 0x2cb, 0x12b, 0x1f2, 0x2a9, 0x1f7, 0x14f, 0x6d, 0xff, 0x213, 0x14, 0x383, 0x261, 0x2c9, 0x1ea, 0x3ac, 0x249, 0x1c6, 0x121, 0x237, 0x19d, 0x297, 0x1ba, 0x1bb, 0x3df, 0x2f0, 0x280, 0x9c, 0xab, 0x186, 0x137, 0x175, 0x1a2, 0xbe, 0x61, 0x279, 0x3cc, 0x254, 0x325, 0x305, 0x30e, 0xc1, 0xb5, 0x380, 0x188, 0x2e9, 0x3c2, 0x26, 0x290, 0x133, 0x1ee, 0x55, 0x3e2, 0x30, 0x1d, 0x1cf, 0x82, 0x1da, 0x34c, 0xf9, 0x2a9, 0x3ee, 0x135, 0x368, 0x3eb, 0x2f0, 0x109, 0x270, 0x151, 0x56, 0x2a1, 0x1ef, 0x94, 0x357, 0x3b0, 0x195, 0x326, 0x340, 0x1fc, 0x1dc, 0x1ca, 0x347, 0x3bb, 0x2d7, 0x358, 0x3f6, 0x33f, 0x18b, 0x3aa, 0x21d, 0xaf, 0x8, 0x201, 0x1a1, 0x3f, 0x5b, 0x365, 0x22f, 0x130, 0xad, 0x18a, 0x36b, 0x2a8, 0x32f, 0x180, 0xe8, 0x263, 0x19, 0x2cb, 0x256, 0x3c1, 0x165, 0x34f, 0x1ba, 0x376, 0x367, 0x3ad, 0x5a, 0x3a4, 0x29a, 0x2b0, 0x125, 0x363, 0xa9, 0x28e, 0x1bf, 0xb3, 0x106, 0x236, 0x3fb, 0x2fb, 0x24b, 0x20e, 0x1e7, 0x295, 0x2f6, 0x38f, 0x1ce, 0x43, 0x16f, 0xcc, 0x171, 0x40, 0x2c, 0x113, 0x1f8, 0x2d8, 0x31e, 0x15c, 0x192, 0x161, 0x4b, 0x36e, 0x16d, 0x14e, 0x1b, 0x349, 0x33c, 0xc8, 0x275, 0x294, 0x182, 0x2d4, 0x3f, 0xb6, 0x18f, 0x15c, 0x324, 0x18d, 0x258, 0x285, 0x1f3, 0x334, 0x19b, 0x34b, 0x175, 0x281, 0x3f2, 0x76, 0x167, 0x193, 0x340, 0x3f8, 0x379, 0x24b, 0x15, 0x395, 0x85, 0x333, 0x11c, 0x37c, 0x1c8, 0x183, 0x356, 0x2eb, 0x89, 0x139, 0xd3, 0x278, 0x2a9, 0x3d5, 0xdd, 0x376, 0x2c7, 0x2af, 0x2d0, 0x23e, 0x3f4, 0x173, 0x384, 0x111, 0xf4, 0x2d3, 0xb8, 0x81, 0x132, 0x25e, 0x380, 0x310, 0x3b6, 0x22f, 0x260, 0x2b4, 0x4b, 0x2d5, 0x1bd, 0x262, 0x1b0, 0x1ea, 0x2ab, 0xd1, 0x17c, 0x308, 0x3ab, 0x1b1, 0x68, 0x7f, 0xee, 0x1ca, 0x287, 0x2f7, 0x295, 0x1e5, 0x227, 0x26b, 0x39, 0x1b3, 0x36c, 0x1de, 0x90, 0xa6, 0x199, 0x4f, 0xd4, 0x2ff, 0x29e, 0x368, 0x3df, 0x3d2, 0x5a, 0x341, 0x27a, 0x1ad, 0x274, 0xa3, 0x21a, 0x1d9, 0x17, 0x91, 0x124, 0x34d, 0x70, 0x62, 0x370, 0x3c2, 0x4c, 0x252, 0x18a, 0x2df, 0x2b2, 0x14e, 0x304, 0x342, 0x1f8, 0x372, 0x18c, 0x3bd, 0x144, 0x27b, 0x5e, 0x280, 0xe9, 0x29a, 0x2d2, 0x274, 0x146, 0x7a, 0x2d3, 0x170, 0x204, 0x182, 0x1a1, 0xfc, 0x1b9, 0xc6, 0x3da, 0xa2, 0x339, 0x2f, 0x140, 0x270, 0x14d, 0x169, 0x13a, 0xa3, 0x3d, 0x36d, 0xb8, 0x102, 0xc1, 0x2d4, 0x7e, 0x2d8, 0x63, 0x1ed, 0x51, 0x398, 0x213, 0xa0, 0x138, 0x2a2, 0x2b0, 0x9d, 0x255, 0x21a, 0x3b2, 0x5c, 0x81, 0x264, 0x16a, 0x3f, 0x16c, 0x235, 0x2f2, 0x22c, 0x1cc, 0x30d, 0x50, 0x9c, 0x151, 0x158, 0x24a, 0x32e, 0x10d, 0x1d9, 0x2e, 0x244, 0x132, 0xb5, 0x21b, 0xb6, 0x31e, 0x179, 0x116, 0xe6, 0x382, 0x28, 0x4e, 0x2ac, 0xac, 0x125, 0x197, 0x282, 0x2e8, 0x17, 0x122, 0x99, 0x25e, 0x309, 0x5b, 0x18f, 0x2b8, 0x8b, 0x73, 0x1c1, 0x14, 0x27, 0x156, 0x56, 0x296, 0x2cf, 0x141, 0x174, 0x20f, 0x91, 0x248, 0x12f, 0x380, 0x229, 0x2c3, 0x15c, 0x201, 0x113, 0x3db, 0x345, 0x1ec, 0x2a3, 0x368, 0x367, 0x157, 0x2ad, 0x359, 0x18e, 0x378, 0x33f, 0x43, 0x36a, 0x36c, 0x371, 0x112, 0x1da, 0x256, 0x237, 0x1e6, 0x284, 0x1c4, 0x23f, 0x1ca, 0x20e, 0x323, 0x21, 0x2b1, 0x33b, 0x55, 0x32f, 0x1b, 0x27e, 0x2ab, 0x344, 0x3ed, 0x3b0, 0xb3, 0x22, 0xbb, 0xe, 0x31, 0x2e9, 0x22f, 0x192, 0x31a, 0x2e4, 0x14, 0x4e, 0x151, 0x2b0, 0x13a, 0x146, 0xf4, 0x35e, 0x392, 0x8, 0x2c, 0x8a, 0x2e7, 0x21e, 0x37b, 0x135, 0x376, 0x30e, 0x2aa, 0x145, 0x2fe, 0x6b, 0x3f6, 0x1ce, 0x218, 0x366, 0x356, 0x3be, 0x82, 0x2cb, 0x294, 0x19c, 0x32b, 0xd, 0x23b, 0x1dc, 0x24b, 0x54, 0x12e, 0x108, 0x1a5, 0x1ee, 0x2a8, 0x14e, 0xd8, 0x3d4, 0x175, 0x216, 0x357, 0x1bf, 0x191, 0x110, 0x1d1, 0x70, 0x188, 0x365, 0x15c, 0x8b, 0xe6, 0x30d, 0xa0, 0x270, 0x29a, 0x1ad, 0x1c2, 0x222, 0x3a9, 0x2c6, 0xaf, 0x40, 0xb, 0x45, 0x2e7, 0x35, 0x1f7, 0x1ba, 0x305, 0x118, 0x3fa, 0x3e8, 0x34e, 0x39d, 0x79, 0x343, 0x3e2, 0x300, 0x13f, 0x2ab, 0x281, 0x3af, 0x1bf, 0x322, 0x49, 0x293, 0x309, 0x16c, 0xc6, 0x373, 0x232, 0x3eb, 0x353, 0x352, 0x359, 0x31c, 0x1fb, 0x1ce, 0x39, 0x183, 0x286, 0x39e, 0x64, 0x38c, 0xc2, 0x35f, 0x326, 0x65, 0x387, 0x87, 0x1b8, 0x313, 0x192, 0x23d, 0x382, 0xa0, 0xe9, 0x27a, 0x173, 0x1f, 0xd9, 0x3aa, 0x198, 0x273, 0x120, 0x272, 0x12b, 0x237, 0x3cc, 0x202, 0x23b, 0x3b8, 0x13e, 0x2a0, 0x2c4, 0x148, 0x18a, 0x2d5, 0x1f3, 0x196, 0x211, 0x296, 0x32e, 0x3d, 0x1af, 0x392, 0x10, 0xb0, 0x59, 0x223, 0x350, 0x34f, 0x396, 0x3c, 0x1a4, 0x3d7, 0x2f7, 0x85, 0x1ae, 0x399, 0x55, 0x257, 0x6c, 0x3d4, 0x2ea, 0x4a, 0x28e, 0x3c6, 0x24c, 0x99, 0x16a, 0xfc, 0x2ed, 0x7b, 0x355, 0x368, 0x2c7, 0x155, 0x145, 0x1f5, 0x1ac, 0x38f, 0x16, 0x114, 0x315, 0x350, 0x297, 0x243, 0x1e0, 0x276, 0x20e, 0x97, 0x210, 0x133, 0x1b7, 0x2fd, 0x196, 0x2b, 0x24a, 0x146, 0x3d0, 0x185, 0x171, 0x12, 0x14c, 0x34c, 0x31f, 0x3cc, 0xd, 0xfe, 0x1ff, 0x3c4, 0xbd, 0x4c, 0x161, 0x172, 0x28, 0x270, 0x27a, 0x2e6, 0x7c, 0x2c1, 0x2de, 0x36c, 0x1df, 0x104, 0x275, 0x234, 0x3ab, 0x326, 0xca, 0x207, 0x31, 0x3b6, 0x2b8, 0x51, 0xff, 0x1e9, 0x2d0, 0x3a8, 0x31c, 0x3f6, 0x331, 0x1c8, 0x6, 0x74, 0x271, 0x26c, 0x3f2, 0x369, 0x191, 0x49, 0x12f, 0x3f, 0x372, 0x7b, 0x2a3, 0x1bb, 0x215, 0x17d, 0xfa, 0x1a7, 0x39d, 0xf2, 0x117, 0x32f, 0x6c, 0x3a1, 0x3ba, 0x250, 0xba, 0x2e, 0x204, 0xb, 0x8a, 0x38e, 0x1a8, 0x34f, 0x325, 0xf0, 0x13b, 0x107, 0x24f, 0x108, 0x29d, 0x2df, 0x37a, 0xcb, 0x211, 0x125, 0xa3, 0x1e8, 0x2c6, 0x2bc, 0x9, 0xa6, 0x1a6, 0x38b, 0x1e6, 0x202, 0x7f, 0x2fb, 0x2c, 0x59, 0x9e, 0x165, 0x254, 0x1c4, 0x1dc, 0x27c, 0x12d, 0x26, 0x161, 0x2e4, 0xa0, 0x3a4, 0x3e1, 0x6f, 0x33f, 0x218, 0x306, 0x1d, 0x33c, 0x26c, 0x3ed, 0x1bf, 0x93, 0x99, 0x1a1, 0x3db, 0x21e, 0x3ee, 0x1cb, 0x78, 0x13b, 0x20e, 0x12e, 0x52, 0x18a, 0x346, 0x30f, 0x151, 0x1ad, 0x20b, 0x1b2, 0x16f, 0x36c, 0x3be, 0x19, 0x38c, 0x308, 0x195, 0x22, 0x1d1, 0x380, 0x2d8, 0x239, 0x2a3, 0x376, 0x46, 0x3fa, 0x3bb, 0x85, 0x2b1, 0x1ee, 0x16d, 0x334, 0x30c, 0x125, 0x146, 0x3a9, 0x21d, 0x39a, 0x120, 0x1da, 0x294, 0xfb, 0x362, 0x236, 0x307, 0x31, 0x365, 0x2f2, 0x288, 0x3eb, 0x157, 0x145, 0x3dd, 0x2f6, 0x238, 0x28f, 0x32f, 0xd8, 0x29f, 0x1ef, 0x141, 0x36d, 0x392, 0x40, 0x312, 0x26d, 0x3c1, 0x1e6, 0xd, 0x1fc, 0x3f5, 0x21f, 0x3c2, 0x192, 0xe6, 0x5e, 0x5a, 0xea, 0x18e, 0x3f6, 0x26b, 0x329, 0x30, 0x349, 0x2ab, 0x216, 0x28e, 0x58, 0x164, 0xf9, 0x27d, 0x202, 0x1fc, 0x3e3, 0x6e, 0x22f, 0x116, 0xff, 0x3ad, 0x153, 0x3ea, 0x2f6, 0x79, 0x22e, 0x14e, 0x19b, 0x354, 0x32e, 0x1e8, 0x30a, 0x39a, 0x240, 0x361, 0x8d, 0x3ab, 0x83, 0xbb, 0xe0, 0x16c, 0x239, 0x14f, 0x1c3, 0x230, 0x3d7, 0x395, 0x108, 0x266, 0x1a3, 0x30f, 0x2a2, 0x2bd, 0x7c, 0x316, 0x1b3, 0x286, 0xcf, 0x136, 0x3ed, 0x37e, 0x24c, 0xc1, 0x226, 0x38e, 0x2a9, 0x95, 0xe2, 0x1dc, 0xf1, 0xbd, 0x130, 0x23d, 0x2f, 0x5a, 0x1d4, 0x231, 0x38f, 0x2f1, 0x1f1, 0x1b, 0x3a1, 0x2f3, 0x141, 0x2d3, 0x253, 0x200, 0x14c, 0x12b, 0x19c, 0x2dc, 0x11b, 0x307, 0x62, 0x18f, 0x3bd, 0xda, 0x187, 0x17d, 0x3e8, 0x246, 0x2b1, 0x3dc, 0x1bd, 0x196, 0xac, 0xe1, 0x134, 0x35d, 0x1b6, 0x3be, 0x32, 0x22b, 0x76, 0x166, 0x49, 0xb5, 0x3f0, 0x10f, 0x3ee, 0x396, 0x1e0, 0x1ca, 0xa8, 0x181, 0xad, 0xb9, 0x50, 0x3a4, 0xb0, 0x199, 0x3c1, 0x391, 0xd0, 0x3e7, 0x21c, 0x2c3, 0x3bd, 0x1b4, 0x215, 0x3fa, 0x2f7, 0x42, 0x133, 0x1a3, 0x217, 0x29a, 0x1c5, 0x3c9, 0x218, 0x3, 0x1d0, 0x2ab, 0x4a, 0xba, 0x170, 0x20, 0x22d, 0x34c, 0xce, 0x2dc, 0x236, 0x7, 0x310, 0xc6, 0x355, 0x2e5, 0x230, 0x3a7, 0x24f, 0x52, 0x221, 0x5, 0x270, 0x3f4, 0xde, 0x1ce, 0x390, 0x60, 0x27e, 0x1dd, 0x152, 0x36d, 0x253, 0x9, 0x139, 0x14a, 0x1f6, 0x326, 0x259, 0xe0, 0x2d8, 0xf6, 0x26a, 0xf, 0x299, 0x15, 0x162, 0x252, 0xb9, 0xa0, 0x28b, 0x267, 0x3f6, 0x1be, 0x2fc, 0x1b, 0x34b, 0x3de, 0x21a, 0x163, 0x2e2, 0x120, 0x361, 0x11a, 0x2b7, 0x11, 0x3a2, 0x3f, 0x3a6, 0x2ff, 0x1cb, 0x1e0, 0x394, 0x2a0, 0x13, 0x2c2, 0x30d, 0x2d, 0x1d4, 0x6b, 0x227, 0x3a5, 0x32f, 0x360, 0x1aa, 0x32e, 0x3d0, 0x33, 0xef, 0x41, 0xe3, 0x308, 0x25d, 0x220, 0xb5, 0x3e9, 0x35, 0x34f, 0x160, 0x26d, 0x237, 0x16e, 0x236, 0xe, 0x5b, 0x239, 0x135, 0xf, 0x13b, 0x54, 0x302, 0x161, 0x30d, 0x5a, 0x359, 0x358, 0x238, 0x55, 0x262, 0x30c, 0x13a, 0x134, 0x16f, 0x356, 0x263, 0x26c, 0x357, 0x303, 0x1, 0x160, 0x26d, 0x237, 0x16e, 0x236, 0xe, 0x5b, 0x239, 0x135, 0xf, 0x13b, 0x54, 0x302, 0x161, 0x30d, 0x5a, 0x359, 0x358, 0x238, 0x55, 0x262, 0x30c, 0x13a, 0x134, 0x16f, 0x356, 0x263, 0x26c, 0x357, 0x303, 0x1, 0x160, 0x26d, 0x237, 0x16e, 0x236, 0xe, 0x5b, 0x239, 0x135, 0xf, 0x13b, 0x54, 0x302, 0x161, 0x30d, 0x5a, 0x359, 0x358, 0x238, 0x55, 0x262, 0x30c, 0x13a, 0x134, 0x16f, 0x356, 0x263, 0x26c, 0x357, 0x303, 0x1, 0x160, 0x26d, 0x237, 0x16e, 0x236, 0xe, 0x5b, 0x239, 0x135, 0xf, 0x13b, 0x54, 0x302, 0x161, 0x30d, 0x5a, 0x359, 0x358, 0x238, 0x55, 0x262, 0x30c, 0x13a, 0x134, 0x16f, 0x356, 0x263, 0x2c0, 0x1a6, 0x19c, 0x2cd, 0x259, 0x380, 0x1d3, 0x1f7, 0x243, 0x77, 0x1e2, 0x3c2, 0x116, 0x3f1, 0x2aa, 0x3e8, 0x214, 0x133, 0x285, 0x138, 0x3e1, 0x2f9, 0x1be, 0x3e2, 0x1b0, 0x354, 0x146, 0x2ee, 0x1b6, 0x1cf, 0x9b, 0x3af, 0x303, 0x2, 0x189, 0x34c, 0x338, 0x193, 0xbb, 0x309, 0x3a6, 0x3ee, 0x8f, 0xee, 0x3c4, 0x38d, 0x22c, 0x3eb, 0x15d, 0x3d9, 0x21, 0x266, 0x103, 0x270, 0x3cb, 0x1fb, 0x37c, 0x3cd, 0x360, 0x2a1, 0x28c, 0x1d5, 0x36c, 0x39e, 0x136, 0x357, 0x20f, 0x4, 0x312, 0x291, 0x279, 0x326, 0x176, 0x21b, 0x345, 0x3d5, 0x11e, 0x1dc, 0x381, 0x313, 0x51, 0x3df, 0x2ba, 0x3bb, 0x42, 0xc5, 0x206, 0xe9, 0x39f, 0x3f6, 0x2f1, 0x393, 0x2c9, 0x14b, 0x111, 0x3aa, 0x2d1, 0x335, 0x26c, 0x2a7, 0x17, 0x8, 0x22d, 0x12b, 0xfb, 0x245, 0x2ec, 0x3f, 0x283, 0x3a3, 0x23c, 0x3b8, 0x30b, 0x22f, 0xa2, 0x3b7, 0x17d, 0x37f, 0x84, 0x18a, 0x189, 0x291, 0xfb, 0x83, 0x3a2, 0x1f8, 0x6a, 0x95, 0x23b, 0x3cf, 0x1db, 0x3bd, 0x1bb, 0x69, 0x20e, 0x181, 0x2c2, 0x5e, 0x352, 0x3b3, 0xd7, 0x3b1, 0x3c5, 0x29a, 0x233, 0x39c, 0x17e, 0x6c, 0x1aa, 0x146, 0x1d5, 0x2d1, 0x263, 0x1a2, 0x115, 0x170, 0x100, 0x272, 0x8d, 0x2ce, 0x220, 0x1a1, 0x38e, 0x2ca, 0xd, 0x3f7, 0x62, 0xc6, 0x29e, 0x1e, 0x1ca, 0x292, 0x260, 0x339, 0x2af, 0x7d, 0x85, 0x29d, 0x285, 0x270, 0x39f, 0x3e5, 0x3d6, 0xa7, 0xc3, 0x13a, 0xd9, 0x2dd, 0x1d, 0x351, 0x128, 0x36d, 0x2bc, 0x240, 0x275, 0x3b, 0x322, 0xc1, 0x228, 0x1f2, 0x32b, 0x11b, 0x1c, 0x2d8, 0x3b9, 0x396, 0x23f, 0x1e2, 0x38d, 0x51, 0x3b7, 0x2fa, 0x1e7, 0x29, 0x96, 0xa0, 0x75, 0xd6, 0x238, 0x154, 0x261, 0x2b0, 0x3e, 0x86, 0x6, 0x13f, 0x37d, 0x21a, 0x30a, 0x1de, 0x19, 0x17c, 0x37e, 0x81, 0xb0, 0xd3, 0x19c, 0x193, 0x176, 0x3f, 0x312, 0x256, 0x3d1, 0x22, 0xb5, 0x2e7, 0x165, 0xd, 0x3e7, 0x188, 0x239, 0x1ba, 0x3c0, 0x27c, 0x3c2, 0x51, 0x367, 0x3fa, 0x323, 0x290, 0x2e4, 0x5a, 0x2fe, 0x39d, 0x1ee, 0x3e6, 0x29a, 0x6f, 0x26b, 0x3e2, 0x2c9, 0x125, 0x134, 0x36a, 0x1d, 0x2ab, 0xa9, 0x35e, 0x39a, 0x82, 0x5f, 0x1bf, 0x81, 0x160, 0x34c, 0xfb, 0x106, 0x293, 0x3db, 0x2a9, 0x284, 0x3fb, 0x31, 0xc6, 0x135, 0x78, 0x24b, 0x17a, 0x8b, 0x3eb, 0x17d, 0x1e7, 0x52, 0x258, 0x109, 0x359, 0x2f6, 0x33b, 0x37a, 0x151, 0x38a, 0x1ce, 0x17e, 0xd8, 0x2a1, 0x222, 0x16f, 0x286, 0x1d6, 0x94, 0x36d, 0x171, 0x112, 0x38c, 0x3b0, 0x91, 0x2c, 0x26d, 0x19c, 0x326, 0x1d1, 0x1f8, 0xd4, 0x254, 0x1fc, 0x87, 0x31e, 0x2a3, 0xf, 0x1ca, 0x12d, 0x192, 0x1fe, 0x2aa, 0x3bb, 0x108, 0x4b, 0xa0, 0xea, 0x358, 0x1e4, 0x16d, 0xab, 0x173, 0x33f, 0x329, 0x1b, 0xd5, 0x146, 0x3aa, 0x22d, 0x14a, 0x2b7, 0x220, 0x28d, 0x9e, 0x3cc, 0x11b, 0x70, 0x1d3, 0x3a3, 0x1c4, 0x3e3, 0x3b6, 0x1d7, 0x305, 0xe5, 0x12d, 0x324, 0x3f1, 0x17d, 0x3ce, 0x148, 0x2e4, 0xb4, 0x3ea, 0xd7, 0x2df, 0x27, 0x3e1, 0x3e5, 0x343, 0x262, 0xac, 0x3e, 0x218, 0x60, 0x34b, 0x32e, 0x2ee, 0x1ab, 0x33c, 0x25, 0x3b2, 0x171, 0x224, 0x22b, 0x1bf, 0x102, 0x189, 0x256, 0x3ab, 0x88, 0x1a1, 0x223, 0xf3, 0x340, 0x1c, 0x372, 0x3ee, 0x71, 0x3fe, 0x2e9, 0x373, 0x1c3, 0x13b, 0x149, 0xc9, 0x1fe, 0x15d, 0x2f7, 0x52, 0xb9, 0x2d, 0x2fe, 0x333, 0x3b1, 0x30f, 0x1fa, 0x1fb, 0x3d6, 0x29c, 0x2b, 0x20b, 0x86, 0x18, 0x3d4, 0x2cf, 0x2bf, 0x36c, 0xcf, 0x10b, 0x2e8, 0x15e, 0x89, 0x38c, 0x369, 0x244, 0x160, 0x291, 0x3ec, 0x22, 0x16a, 0x38e, 0x33a, 0xd0, 0x7, 0x2d8, 0x2ff, 0x11e, 0x2fb, 0x1b8, 0x3da, 0x376, 0x348, 0x150, 0x130, 0x27b, 0x155, 0x3bb, 0x53, 0x121, 0x195, 0x248, 0x114, 0x3c1, 0x1b1, 0x176, 0x1f8, 0x350, 0x101, 0x3e7, 0x229, 0x3d8, 0x243, 0x379, 0x1b8, 0x3bd, 0x1c3, 0x276, 0x12d, 0x241, 0x3df, 0x3fa, 0x97, 0x15a, 0x5e, 0x2a6, 0x123, 0x133, 0xa, 0x23e, 0x358, 0x399, 0x2fd, 0x29a, 0x1bc, 0x2f1, 0x14e, 0x2b, 0x1f, 0x218, 0xc0, 0x137, 0x146, 0x2b3, 0x105, 0x2ab, 0x2a4, 0x185, 0x371, 0x320, 0x2a7, 0x170, 0x12, 0x19f, 0x76, 0x24c, 0x58, 0x34c, 0x3ec, 0x44, 0x1a1, 0x4f, 0x3cc, 0x236, 0x1c0, 0x283, 0x24e, 0xfe, 0x10e, 0xc6, 0xdd, 0x389, 0x3c4, 0xae, 0xda, 0x230, 0x2a, 0x4c, 0x339, 0x155, 0x37f, 0x52, 0x172, 0xb4, 0x3dd, 0x35c, 0x2d5, 0x270, 0xc7, 0x8e, 0x2a8, 0x251, 0x2e6, 0x1ce, 0x1f1, 0x19b, 0x13a, 0x2c1, 0x205, 0x27e, 0x3b5, 0x35b, 0x36c, 0x19e, 0x25, 0x36d, 0x1cd, 0x104, 0x2f8, 0x385, 0x10, 0x139, 0x234, 0x166, 0xc1, 0x164, 0x67, 0x326, 0xa6, 0x8d, 0xb3, 0xc1, 0x2c8, 0x19c, 0x106, 0xb5, 0x315, 0x1e6, 0x236, 0x380, 0x21e, 0x254, 0x3fb, 0x188, 0x1ec, 0x243, 0x2fb, 0x2e9, 0x1d7, 0xf, 0x24b, 0x3c2, 0x288, 0x46, 0x20e, 0x26, 0x339, 0x2aa, 0x1e7, 0x290, 0x30d, 0x2ad, 0x295, 0x133, 0x14, 0xea, 0x2f6, 0x1ee, 0x30f, 0x3e1, 0x38f, 0x55, 0x196, 0x173, 0x1ce, 0x3e2, 0x265, 0x1c2, 0x43, 0x30, 0x29f, 0x146, 0x16f, 0x1d, 0x175, 0x21a, 0xcc, 0x1cf, 0x344, 0x2e8, 0x171, 0x82, 0x2f8, 0x303, 0x40, 0x1da, 0x308, 0x93, 0x2c, 0x34c, 0x3d1, 0x110, 0x113, 0xf9, 0x16e, 0xbb, 0x1f8, 0x2a9, 0xd, 0x307, 0x2d8, 0x3ee, 0x1c4, 0x397, 0x31e, 0x135, 0x3c0, 0x3c4, 0x15c, 0x368, 0x1a4, 0x2a0, 0x192, 0x3eb, 0x3fa, 0x12e, 0x161, 0x2f0, 0x23a, 0x21, 0x4b, 0x109, 0x2fe, 0xd7, 0x36e, 0x270, 0x18e, 0x238, 0x16d, 0x151, 0x6f, 0x37c, 0x14e, 0x56, 0x7c, 0xe4, 0x1b, 0x2a1, 0x14c, 0x234, 0x191, 0xb, 0x1a6, 0x3d1, 0x220, 0x45, 0x3c1, 0x2cd, 0x34d, 0x2e7, 0x27d, 0x11b, 0x380, 0x35, 0x142, 0x3e7, 0xb6, 0x1f7, 0x1c4, 0x327, 0x63, 0x1ba, 0x77, 0x6e, 0x3bd, 0x305, 0x321, 0x3c2, 0x119, 0x118, 0x54, 0x260, 0x3f1, 0x3fa, 0x25c, 0x18d, 0x3ad, 0x3e8, 0x29, 0x2e4, 0x1a9, 0x34e, 0x133, 0x28, 0x3a8, 0x39d, 0x2df, 0x138, 0x18e, 0x79, 0x1bd, 0x29a, 0x2f9, 0x343, 0x334, 0x35a, 0xe7, 0x3e2, 0xc3, 0x301, 0x218, 0x300, 0x354, 0x134, 0x2c5, 0x13f, 0x363, 0x2ee, 0x143, 0x2ab, 0x282, 0x66, 0x1cf, 0x281, 0x3b2, 0x39a, 0x32, 0x3af, 0x170, 0x48, 0x1c6, 0x1bf, 0x2, 0x298, 0x61, 0x322, 0x16, 0x34c, 0x3ab, 0x49, 0x8a, 0x38b, 0x193, 0x293, 0x1c7, 0xf3, 0x236, 0x309, 0x6a, 0x284, 0x3c7, 0x16c, 0x3ee, 0x388, 0x247, 0xc6, 0x374, 0xee, 0xdc, 0x373, 0x203, 0x24b, 0x38d, 0x232, 0x230, 0xa8, 0xc9, 0x3eb, 0x298, 0xc2, 0x93, 0xb0, 0xa5, 0x195, 0x264, 0x199, 0xfb, 0x88, 0x226, 0x3c1, 0x193, 0x12f, 0x315, 0x391, 0x328, 0x1f8, 0x2b6, 0xd0, 0x70, 0x10f, 0xa1, 0x3e7, 0x16c, 0x3d5, 0x23b, 0x21c, 0x7b, 0x243, 0x3fe, 0x2c3, 0x135, 0x31b, 0x37, 0x3bd, 0x203, 0x9f, 0x22f, 0x1b4, 0x348, 0x12d, 0x22c, 0x215, 0x20e, 0x98, 0x3fc, 0x3fa, 0xb1, 0x23d, 0x157, 0x2f7, 0x129, 0x5e, 0x11d, 0x42, 0x258, 0x168, 0x1a7, 0x133, 0x50, 0x2bb, 0xd7, 0x1a3, 0x341, 0x358, 0xf7, 0x217, 0x337, 0x11c, 0x2da, 0x29a, 0x1fb, 0x117, 0x196, 0x1c5, 0xdf, 0x14e, 0x158, 0x3c9, 0x17e, 0x336, 0x384, 0x218, 0x209, 0x14b, 0x1b2, 0x3, 0x3a1, 0x146, 0x1b5, 0x1d0, 0x1ef, 0x2bf, 0x2a5, 0x2ab, 0x10d, 0x198, 0x263, 0x4a, 0x2b5, 0x371, 0x136, 0xba, 0x171, 0x208, 0x3d3, 0x170, 0x90, 0x311, 0x1e3, 0x20, 0x3b4, 0x76, 0x244, 0x22d, 0x8d, 0x2cc, 0xb, 0x34c, 0x139, 0x308, 0x91, 0x312, 0x8d, 0x191, 0x2c, 0x256, 0x195, 0xc1, 0x26d, 0x3d1, 0x92, 0x59, 0x19c, 0x22, 0x113, 0x3c1, 0x326, 0xb5, 0x9e, 0x16e, 0x1d1, 0x2e7, 0x1e6, 0x194, 0x1f8, 0x165, 0x340, 0x380, 0xd4, 0xd, 0xe, 0x345, 0x254, 0x3e7, 0x2d8, 0x34f, 0x1fc, 0x188, 0x37b, 0x1c4, 0x87, 0x239, 0x243, 0x3f5, 0x31e, 0x1ba, 0x1dc, 0x2e9, 0x2a3, 0x3c0, 0x21f, 0x3bd, 0xf, 0x27c, 0x15c, 0x376, 0x1ca, 0x3c2, 0x6d, 0x1a4, 0x12d, 0x51, 0x46, 0x54, 0x192, 0x367, 0x347, 0x26, 0x1fe, 0x3fa, 0x162, 0xe6, 0x2aa, 0x323, 0x161, 0x3ad, 0x3bb, 0x290, 0x5e, 0x23a, 0x108, 0x2e4, 0x2ad, 0x85, 0x4b, 0x5a, 0x2d7, 0x133, 0xa0, 0x2fe, 0x2b1, 0x206, 0xea, 0x39d, 0x36e, 0x3a4, 0x358, 0x1ee, 0x4e, 0x18e, 0x1e4, 0x3e6, 0x3e1, 0x47, 0x16d, 0x29a, 0x3f6, 0x55, 0xab, 0x6f, 0x3d6, 0x334, 0x173, 0x26b, 0x14e, 0x2b0, 0x33f, 0x3e2, 0x272, 0x3b, 0x81, 0x14c, 0x184, 0x91, 0x22d, 0x234, 0x93, 0x2c0, 0x242, 0x191, 0x58, 0x14a, 0xb3, 0xb, 0x12b, 0x195, 0x182, 0x1a6, 0x2b7, 0x132, 0x332, 0x3d1, 0x124, 0x164, 0xfb, 0x220, 0x228, 0x19c, 0x44, 0x45, 0x237, 0x20c, 0x28d, 0x3c1, 0x245, 0x2d4, 0xf9, 0x2cd, 0x25e, 0x9e, 0x2dc, 0x34d, 0x315, 0x25f, 0x2ec, 0x2e7, 0x3cc, 0x259, 0x3db, 0x27d, 0xca, 0x1f8, 0x2ca, 0x11b, 0x3f, 0x15b, 0x1a0, 0x380, 0x1a8, 0x34, 0x70, 0x35, 0x202, 0xe, 0x283, 0x142, 0x307, 0x1d3, 0x12a, 0x3e7, 0x1b9, 0x127, 0x3fb, 0xb6, 0x3a3, 0x1fc, 0x310, 0x1f7, 0x23b, 0x62, 0x3b9, 0x1c4, 0x10e, 0xf6, 0x23c, 0x327, 0x318, 0x243, 0x3e3, 0x63, 0x1cb, 0x1ff, 0x18f, 0x1ba, 0x3b8, 0x3b6, 0x135, 0x77, 0x370, 0x2a3, 0x389, 0x6e, 0x1d7, 0xf0, 0x30b, 0x3bd, 0x1e, 0x1e2, 0x2f2, 0x305, 0x13e, 0x15c, 0x2e5, 0x321, 0x22f, 0x2d9, 0xe5, 0x3c2, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0xed, 0xec, 0x1, 0x1da, 0x3b0, 0x8, 0x2cb, 0x1bf, 0x40, 0x275, 0x1e3, 0x200, 0x38c, 0x303, 0x24, 0x5f, 0x2e, 0x120, 0x2f8, 0x170, 0x112, 0x3ed, 0x392, 0x82, 0x357, 0xaf, 0x19, 0x28e, 0x171, 0xc8, 0x5d, 0x39a, 0x249, 0x2e8, 0xef, 0x26c, 0x36d, 0x371, 0x344, 0x35e, 0x3be, 0x216, 0x2c6, 0x1cf, 0x94, 0x21d, 0x263, 0xa9, 0xcc, 0x33c, 0x141, 0x269, 0x1d6, 0x21a, 0x36c, 0x2ab, 0xf4, 0x356, 0x175, 0x3a9, 0x286, 0x3ba, 0x177, 0x1d, 0x1ef, 0x3aa, 0xe8, 0x363, 0x16f, 0x349, 0x32e, 0x36a, 0x27e, 0x146, 0x366, 0x3d4, 0x222, 0x306, 0x29f, 0x134, 0x6, 0xd5, 0x1b2, 0x30, 0x2a1, 0x18b, 0x180, 0x125, 0x43, 0x1b, 0x13a, 0x218, 0xd8, 0x1c2, 0xe4, 0x2c9, 0x20b, 0x329, 0x265, 0x7c, 0x17e, 0x30c, 0x3e0, 0x3e2, 0x56, 0x33f, 0x32f, 0x2b0, 0x1ce, 0x14e, 0x1ad, 0x26b, 0x262, 0x173, 0x37c, 0x334, 0x38a, 0x3d6, 0x196, 0x6f, 0x28f, 0xab, 0x378, 0x3b4, 0x2db, 0x40, 0xe3, 0x385, 0x24, 0xbe, 0xb8, 0x112, 0x3d3, 0x253, 0x19, 0x115, 0x1cd, 0x249, 0x1d9, 0x3bc, 0x344, 0x2b5, 0x2e3, 0x94, 0x33, 0x19e, 0x141, 0xdb, 0x351, 0xf4, 0x2a5, 0x1dd, 0x177, 0x3a, 0x3b5, 0x16f, 0x29b, 0xa3, 0x366, 0x3a1, 0x9a, 0x6, 0x1aa, 0x2c1, 0x180, 0x24a, 0x10c, 0xd8, 0x384, 0x390, 0x265, 0xf8, 0x1f1, 0x56, 0x277, 0xa7, 0x1ad, 0xdf, 0x19a, 0x38a, 0x3a5, 0x251, 0x378, 0xaa, 0x14d, 0x38f, 0x2da, 0x3f4, 0x238, 0x3c5, 0xc7, 0x33b, 0x9c, 0x1ac, 0x36b, 0x341, 0x3ca, 0x346, 0x1d4, 0x35c, 0x14, 0x1f5, 0x29d, 0x109, 0x1a7, 0x221, 0x2d0, 0x10a, 0x172, 0x145, 0x210, 0x2f, 0x1f4, 0x129, 0x3d2, 0x1e7, 0x2c2, 0x155, 0x12e, 0x1cc, 0x1fd, 0x302, 0x3fc, 0x3a7, 0x130, 0x2c7, 0x2a, 0x8b, 0x8c, 0x292, 0x288, 0x348, 0x1e1, 0x368, 0x394, 0xae, 0x386, 0xf1, 0x3da, 0x78, 0x37, 0x355, 0x23f, 0x361, 0x37e, 0x200, 0x22b, 0x5c, 0x112, 0x3af, 0x15e, 0xc8, 0x174, 0x1de, 0x344, 0x163, 0x39e, 0xa9, 0x330, 0x3ac, 0xf4, 0x143, 0x37d, 0x3aa, 0x3a0, 0x255, 0x366, 0x34b, 0x268, 0x30, 0x296, 0x86, 0xd8, 0x301, 0x25b, 0x30c, 0x39b, 0x257, 0x1ad, 0x1be, 0x261, 0x6f, 0x22e, 0x2a2, 0x38f, 0x1bd, 0x3cb, 0x1e4, 0x27, 0xd6, 0x36b, 0x28b, 0x333, 0x206, 0x17f, 0x34a, 0x109, 0x34e, 0x96, 0x2ad, 0x84, 0x213, 0x1f4, 0x252, 0x353, 0x323, 0x73, 0x2fa, 0x302, 0x3f1, 0x287, 0x192, 0x23, 0x149, 0x288, 0x299, 0x38d, 0x376, 0x13e, 0x1ed, 0x78, 0x6e, 0x14f, 0x1dc, 0x18f, 0x396, 0x397, 0xf6, 0x388, 0x188, 0x3a3, 0x3ff, 0x2ed, 0x142, 0x1c, 0xd4, 0x1a0, 0x7e, 0x33a, 0x259, 0x1c7, 0x16e, 0x25e, 0x1f2, 0x106, 0x45, 0x338, 0x92, 0x332, 0x167, 0x201, 0x14a, 0x322, 0x312, 0x184, 0x102, 0x1da, 0x2db, 0x80, 0x38c, 0x17, 0x240, 0x3ed, 0x2cb, 0x1e3, 0x24, 0x2f8, 0x392, 0x19, 0x5d, 0xef, 0x344, 0x2c6, 0x263, 0x141, 0x36c, 0x175, 0x177, 0xe8, 0x32e, 0x366, 0x29f, 0x1b2, 0x180, 0x13a, 0xe4, 0x265, 0x3e0, 0x32f, 0x1ad, 0x37c, 0x196, 0x378, 0x2a8, 0xfd, 0x238, 0x30f, 0x6b, 0x36b, 0x11f, 0xd7, 0x14, 0x3dd, 0x18a, 0x2d0, 0x21, 0x30d, 0x1f4, 0xad, 0x157, 0x12e, 0x339, 0x3ef, 0x130, 0x30e, 0x2a0, 0x288, 0x13b, 0x22f, 0x386, 0x3c4, 0x1d7, 0x23f, 0x365, 0x1cb, 0x397, 0x1ec, 0x23b, 0x5b, 0x24e, 0x307, 0x21e, 0x68, 0x3f, 0x33a, 0xbb, 0x315, 0x362, 0x1a1, 0x237, 0x110, 0x2c8, 0x2b7, 0x201, 0x294, 0x93, 0xa6, 0x76, 0x8, 0x275, 0x303, 0x120, 0x3ed, 0xaf, 0xc8, 0x2e8, 0x371, 0x216, 0x21d, 0x33c, 0x21a, 0x356, 0x3ba, 0x3aa, 0x349, 0x146, 0x306, 0xd5, 0x18b, 0x1b, 0x1c2, 0x329, 0x30c, 0x33f, 0x14e, 0x173, 0x3d6, 0xab, 0x3f6, 0x16d, 0x3e1, 0x1e4, 0x4e, 0x19f, 0x385, 0x120, 0x3d3, 0x2bc, 0x249, 0x2d3, 0x2e3, 0xa9, 0xdb, 0x2be, 0x177, 0x1d0, 0xa3, 0x306, 0x1aa, 0x225, 0xd8, 0x1f, 0x1f1, 0x2b0, 0xdf, 0xcb, 0x378, 0x159, 0x3f4, 0x1e4, 0x9c, 0x17b, 0x346, 0x2bb, 0x29d, 0x5a, 0x10a, 0x382, 0x1f4, 0x15a, 0x155, 0x162, 0x3fc, 0x107, 0x8b, 0x69, 0x1e1, 0x376, 0xf1, 0x2ef, 0x23f, 0x2c3, 0x325, 0x87, 0x2ff, 0x3f9, 0x2ed, 0x101, 0x1c0, 0x165, 0x328, 0x38e, 0x362, 0x342, 0xce, 0x92, 0xd3, 0x25d, 0x160, 0xc2, 0x204, 0x2cb, 0x3c6, 0x90, 0x3ed, 0x15e, 0x320, 0x36d, 0x375, 0x250, 0x269, 0x15f, 0x2bf, 0xe8, 0x255, 0x183, 0xd5, 0x316, 0x6c, 0x20b, 0x2fc, 0x158, 0x26b, 0x261, 0x1bc, 0x2a8, 0x1fa, 0xf2, 0x4e, 0x2b9, 0x1a3, 0x359, 0x34a, 0x2d, 0x85, 0x1c1, 0xfa, 0xad, 0x2ae, 0xb1, 0x1fe, 0x287, 0x241, 0x230, 0x2f4, 0x1bb, 0x27c, 0x373, 0x31b, 0x365, 0x396, 0x247, 0x37b, 0x33e, 0x20f, 0x112, 0x147, 0x33d, 0x344, 0x30a, 0x271, 0xf4, 0x20a, 0x2cf, 0x366, 0x26e, 0x316, 0xd8, 0x3e, 0x3cd, 0x1ad, 0x1eb, 0x156, 0x38f, 0x1f3, 0x31c, 0x36b, 0x75, 0x16b, 0x109, 0x246, 0x1c1, 0x1f4, 0x2b4, 0x15d, 0x302, 0x3b7, 0xa8, 0x288, 0xe5, 0x2b8, 0x78, 0x370, 0x374, 0x397, 0x3b9, 0x3f8, 0x2ed, 0x202, 0x309, 0x33a, 0x2ec, 0x13c, 0x106, 0x228, 0x3ab, 0x201, 0x242, 0x122, 0x1da, 0x2f5, 0x48, 0x3ed, 0x2bc, 0x9b, 0x35e, 0x335, 0x282, 0x356, 0x2f3, 0x2de, 0x3d4, 0xd9, 0x300, 0x1c2, 0xbf, 0xac, 0x26b, 0xcb, 0x2f9, 0x16d, 0x39f, 0x27f, 0x3a4, 0x26f, 0x28, 0x2d7, 0x12c, 0x28a, 0x290, 0x2af, 0x25c, 0x1fe, 0x107, 0x116, 0x1a4, 0x313, 0x305, 0x21f, 0x29e, 0x1ff, 0x239, 0x319, 0xb6, 0x254, 0x38, 0x15b, 0x194, 0x38e, 0x2cd, 0x113, 0x279, 0x132, 0x256, 0x24d, 0x14c, 0x3b0, 0x100, 0xbe, 0x392, 0x64, 0x1d9, 0x3be, 0x275, 0x2e, 0x82, 0x5d, 0x371, 0x94, 0x269, 0x175, 0x3aa, 0x27e, 0x134, 0x180, 0x1c2, 0x17e, 0x2b0, 0x37c, 0xab, 0x38f, 0x3e6, 0x6b, 0x36e, 0x359, 0x133, 0x2d0, 0x108, 0x2f0, 0x323, 0x339, 0x347, 0x8b, 0x1a4, 0x22f, 0xf, 0xdc, 0x1ba, 0x397, 0x37b, 0x3fb, 0x345, 0x68, 0x1f8, 0x32b, 0xb5, 0x237, 0x92, 0x34c, 0x191, 0xa6, 0x3b0, 0x200, 0x2f8, 0xaf, 0x249, 0x35e, 0x263, 0x21a, 0x286, 0x363, 0x366, 0xd5, 0x43, 0x2c9, 0x3e0, 0x14e, 0x38a, 0x55, 0xfd, 0x1e4, 0x270, 0x39d, 0x14, 0x2d7, 0x258, 0x23a, 0xad, 0x2aa, 0x302, 0x367, 0x2a0, 0x6d, 0x24b, 0x3bd, 0x23f, 0x31e, 0x23c, 0x188, 0x24e, 0xe, 0x2a9, 0x194, 0x315, 0x326, 0x8a, 0x3d1, 0x201, 0x8d, 0x81, 0x2cb, 0x303, 0x112, 0x28e, 0xef, 0x216, 0xcc, 0x2ab, 0x177, 0x349, 0x222, 0x30, 0x13a, 0x329, 0x56, 0x26b, 0x196, 0x3f6, 0x37a, 0x18e, 0x36b, 0xea, 0x1a5, 0xe3, 0xb8, 0x19, 0x1d9, 0x2e3, 0x141, 0x2a5, 0x3b5, 0x366, 0x1aa, 0x10c, 0x265, 0x277, 0x19a, 0x378, 0x2da, 0xc7, 0x36b, 0x1d4, 0x29d, 0x2d0, 0x210, 0x3d2, 0x12e, 0x3fc, 0x2a, 0x288, 0x394, 0x3da, 0x23f, 0x235, 0xe2, 0x5b, 0xa1, 0x1c0, 0x33a, 0x3a2, 0x3e4, 0x110, 0xd3, 0x2cc, 0xa6, 0x369, 0x12, 0x3ed, 0x2e2, 0x1a2, 0x21d, 0x3ac, 0x2bf, 0x349, 0x4d, 0xc0, 0x1c2, 0x2fc, 0x2d2, 0x3d6, 0x2a2, 0x11c, 0x4e, 0x1e5, 0xa, 0x2d7, 0xb9, 0xfa, 0x161, 0x2fa, 0x98, 0x46, 0x2f4, 0x1c3, 0x21f, 0x26a, 0x3cf, 0x37b, 0x3ff, 0x10f, 0x340, 0x3bf, 0x1b1, 0x113, 0x1f6, 0x304, 0x8d, 0x102, 0x33e, 0x2e, 0x104, 0x174, 0x3be, 0x152, 0x1ab, 0x1ef, 0x2dd, 0x26e, 0x43, 0x19b, 0x39b, 0x262, 0xde, 0x2b2, 0x337, 0x3dc, 0x75, 0x1a5, 0xb4, 0x84, 0x2f0, 0x24f, 0xff, 0x20e, 0xa2, 0xe5, 0x2f2, 0x389, 0x18f, 0x23c, 0x310, 0x12a, 0x70, 0x1c6, 0x2e0, 0xc8, 0x1af, 0xcf, 0xf4, 0x74, 0x28c, 0x30, 0xe1, 0x2fc, 0x1ad, 0x343, 0x13d, 0x1e4, 0x1d2, 0x1ae, 0x109, 0x214, 0xbc, 0x323, 0xff, 0x15, 0x288, 0x321, 0x373, 0x1dc, 0x318, 0x7f, 0x2ed, 0x34, 0x3f0, 0x16e, 0x28d, 0x1f6, 0x201, 0x234, 0x2, 0x38c, 0x1c9, 0x190, 0x35e, 0x19e, 0x1e8, 0xe8, 0x111, 0x60, 0x1c2, 0x1f1, 0x35a, 0x28f, 0x27a, 0x3c8, 0x3a4, 0x35c, 0x212, 0x21, 0x178, 0x24f, 0x1fe, 0x2a, 0x119, 0x24b, 0x2ef, 0x3b8, 0x239, 0xfe, 0x1d3, 0x68, 0x3e9, 0x2dc, 0x113, 0x3ec, 0xb, 0x61, 0x4, 0x311, 0x392, 0x320, 0x2b5, 0x33c, 0x3d0, 0x1d0, 0x222, 0xc0, 0x384, 0x3e2, 0x2bd, 0x117, 0xfd, 0x399, 0x341, 0x2b1, 0x2d, 0x42, 0x2f0, 0x97, 0x3fc, 0x54, 0x232, 0x9f, 0x1d7, 0x379, 0x7b, 0x1fc, 0x3a6, 0xd0, 0x3db, 0x1b1, 0x226, 0x3d1, 0x16, 0xc2, 0x8, 0x22b, 0x32d, 0x249, 0x163, 0x271, 0x3a9, 0x38c, 0x392, 0x249, 0x2c6, 0x1d6, 0x177, 0x27e, 0x1b2, 0xd8, 0x3e0, 0x262, 0x378, 0x37a, 0x6b, 0x346, 0x3dd, 0x258, 0x1f4, 0x31a, 0x3ef, 0x8b, 0x13b, 0x2f2, 0x23f, 0xc6, 0x23b, 0x2ed, 0x68, 0x3db, 0x362, 0x8a, 0x2b7, 0x160, 0x76, 0x200, 0x3ed, 0x39a, 0x216, 0x269, 0x3ba, 0x36a, 0xd5, 0x218, 0x30c, 0x26b, 0xab, 0x47, 0x4e, 0x39d, 0xa0, 0x85, 0x5e, 0x323, 0x1fe, 0x54, 0x6d, 0x27c, 0x2a3, 0x3f5, 0x37b, 0x3e7, 0xd4, 0x194, 0x9e, 0x22, 0x26d, 0x191, 0x139, 0x1e3, 0x112, 0x5d, 0x3be, 0x141, 0x286, 0x32e, 0x6, 0x13a, 0x17e, 0x1ad, 0x28f, 0xfd, 0x33b, 0x11f, 0x1a5, 0x2d0, 0x52, 0x157, 0x302, 0x30e, 0x17a, 0x386, 0xdc, 0x1cb, 0x31, 0x24e, 0x70, 0x33a, 0x293, 0x237, 0x99, 0x294, 0x81, 0x275, 0x170, 0xc8, 0x35e, 0x33c, 0x3a9, 0x349, 0x134, 0x1b, 0x7c, 0x14e, 0x6f, 0x16d, 0x18e, 0x36e, 0x2fe, 0x4b, 0x23a, 0x311, 0x253, 0x26c, 0x33, 0x2be, 0x16f, 0x137, 0x10c, 0x30c, 0xdf, 0x2ac, 0x238, 0xe9, 0x35c, 0x5a, 0x210, 0x2af, 0x302, 0x215, 0x1e1, 0xf, 0x1db, 0x11e, 0x5b, 0x101, 0xfc, 0x16e, 0x226, 0x35f, 0x160, 0xec, 0x12, 0x357, 0x1de, 0x250, 0x356, 0x2cf, 0x3, 0x13a, 0x2fc, 0x2bd, 0x55, 0x3cb, 0x3b1, 0x359, 0x314, 0x11d, 0x161, 0x3fd, 0x241, 0x13b, 0x1ed, 0xee, 0x239, 0x3f8, 0x10f, 0x236, 0x223, 0x11, 0x26d, 0x322, 0xed, 0x303, 0x104, 0x3b2, 0x263, 0x1e8, 0x3a0, 0x134, 0x36, 0x1f0, 0x262, 0x2f9, 0x1f3, 0x358, 0x5, 0x34e, 0x30d, 0x3ce, 0xff, 0x54, 0xda, 0x1e2, 0x135, 0x327, 0x3a3, 0xe, 0x2ca, 0x34d, 0x237, 0x132, 0x242, 0x1, 0x311, 0x253, 0x26c, 0x33, 0x2be, 0x16f, 0x137, 0x10c, 0x30c, 0xdf, 0x2ac, 0x238, 0xe9, 0x35c, 0x5a, 0x210, 0x2af, 0x302, 0x215, 0x1e1, 0xf, 0x1db, 0x11e, 0x5b, 0x101, 0xfc, 0x16e, 0x22b, 0x15e, 0x344, 0x330, 0x37d, 0x366, 0x296, 0x25b, 0x1ad, 0x22e, 0x3cb, 0x36b, 0x17f, 0x96, 0x1f4, 0x73, 0x287, 0x288, 0x13e, 0x14f, 0x397, 0x3a3, 0x1c, 0x33a, 0x25e, 0x338, 0x201, 0x184, 0x80, 0x3ed, 0x273, 0x128, 0x356, 0x197, 0xc, 0x1c2, 0x393, 0x31d, 0x16d, 0x231, 0x285, 0x2d7, 0x382, 0x3ce, 0x1fe, 0x150, 0x2d9, 0x21f, 0x2e1, 0x62, 0x254, 0x21b, 0x25f, 0x113, 0x35f, 0x2c0, 0x3b0, 0x90, 0x115, 0x3be, 0x10d, 0x3a, 0x222, 0x209, 0xf8, 0x262, 0x1fb, 0x3c5, 0x2f6, 0x50, 0x10a, 0x2f0, 0xb1, 0x2c7, 0x17a, 0x203, 0x1db, 0x23c, 0x16c, 0x1a, 0x3db, 0x193, 0xb2, 0xb3, 0x298, 0x3c6, 0x82, 0x3b2, 0xcf, 0x3a9, 0x13f, 0x364, 0x2c9, 0xe7, 0x32c, 0x47, 0x138, 0x1ae, 0x5a, 0x29, 0x2ae, 0x26, 0x118, 0x57, 0x3c0, 0x63, 0x7f, 0x345, 0x11b, 0x223, 0x22, 0x1a6, 0x126, 0x2cb, 0xb8, 0x190, 0x2c6, 0x351, 0x35d, 0x29f, 0x5f, 0x171, 0x216, 0x36c, 0x363, 0x6, 0x1c2, 0x32f, 0x6f, 0x37a, 0x358, 0x14, 0x85, 0x2f0, 0x162, 0x30e, 0x3c2, 0x78, 0x31e, 0x23b, 0x345, 0x236, 0x9e, 0x110, 0x256, 0x81, 0x38c, 0xaf, 0x344, 0x269, 0x1ef, 0x306, 0x13a, 0x3e2, 0x38a, 0x16d, 0x6b, 0x206, 0x295, 0x5e, 0x12e, 0x367, 0x17a, 0xf, 0x365, 0x1c4, 0x2ed, 0x340, 0x315, 0x22, 0x34c, 0x91, 0x275, 0x392, 0x26c, 0xcc, 0x3ba, 0x366, 0x125, 0x17e, 0x173, 0x2a8, 0x18e, 0x346, 0x2d7, 0x30d, 0x323, 0x3eb, 0x12d, 0x386, 0x2e9, 0x23c, 0x2d8, 0x68, 0x2e7, 0x106, 0x26d, 0x93, 0x2cb, 0x170, 0x249, 0x21d, 0x175, 0x36a, 0x2a1, 0x329, 0x1ad, 0x55, 0x337, 0x36e, 0x3dd, 0x2e4, 0x1e7, 0x1fe, 0x2a0, 0x376, 0xdc, 0x243, 0x5b, 0xd, 0x3db, 0x326, 0x2c8, 0x191, 0x1da, 0x2e, 0xc8, 0x2c6, 0x2ab, 0x16f, 0xd5, 0xe4, 0x2b0, 0x28f, 0x3e1, 0x36b, 0x2fe, 0x258, 0x3bb, 0x339, 0xbe, 0x1cd, 0x94, 0x2a5, 0xa3, 0x180, 0xf8, 0x19a, 0x38f, 0x9c, 0x35c, 0x2d0, 0x129, 0x1fd, 0x8b, 0x394, 0x355, 0x397, 0x297, 0x1c0, 0x32b, 0x226, 0x2ce, 0xa6, 0x3c6, 0x208, 0x35e, 0x3ac, 0x2b3, 0xd5, 0x1c8, 0x2d2, 0x55, 0x267, 0x1a3, 0x2d7, 0x213, 0x97, 0x367, 0x2f4, 0x3c, 0x31e, 0x7f, 0x10f, 0x194, 0x1f2, 0x248, 0x8d, 0x10, 0x3f2, 0xef, 0x152, 0x20a, 0x222, 0x36, 0x39b, 0x196, 0x8e, 0x1d2, 0x1a5, 0x153, 0x2b4, 0x3ef, 0xa2, 0x13e, 0x135, 0x10e, 0x12a, 0x3f, 0x2dc, 0x228, 0xb3, 0x272, 0x17, 0xc8, 0x185, 0x2be, 0x36a, 0x14b, 0xbf, 0x173, 0x159, 0x231, 0x206, 0x123, 0x178, 0x162, 0x215, 0x313, 0x3c0, 0x18c, 0x3f9, 0xd4, 0x176, 0x31f, 0xc1, 0xc2, 0x100, 0x357, 0x2eb, 0x10d, 0xe8, 0x268, 0x360, 0x1ce, 0x156, 0xf2, 0x11f, 0x266, 0x11d, 0x31a, 0x287, 0x232, 0x3c4, 0x374, 0xc4, 0x284, 0x3f0, 0x193, 0x2c8, 0x17c, 0x33d, 0xa9, 0x20a, 0x4d, 0xd8, 0xe7, 0x156, 0x1e4, 0x75, 0x314, 0x1f4, 0x398, 0xa8, 0x376, 0x370, 0x71, 0x2ed, 0x11b, 0x13c, 0x92, 0x242, 0x10, 0x3ed, 0x3bc, 0x282, 0xe8, 0xd9, 0x19b, 0x26b, 0x14d, 0x27f, 0x359, 0x12c, 0x37f, 0x1fe, 0x292, 0x305, 0x365, 0x319, 0x283, 0x194, 0x3e4, 0x132, 0x61, 0x100, 0x2a7, 0x3be, 0x7a, 0x29b, 0x18b, 0x186, 0x2f1, 0xfd, 0x3b1, 0x1f5, 0x2e4, 0x395, 0x3df, 0x17a, 0x3c, 0x235, 0x1fc, 0x6a, 0x176, 0x237, 0x304, 0x219, 0x24, 0x22a, 0x39e, 0x3a9, 0x1ea, 0x86, 0x56, 0x343, 0x3cb, 0x36e, 0x36f, 0x213, 0x12e, 0x187, 0x38d, 0x3c0, 0x318, 0x3ff, 0x2a9, 0x34d, 0x338, 0x2c, 0x1d8, 0x240, 0x2e8, 0x19e, 0x2ee, 0x29f, 0x72, 0x169, 0x55, 0xc7, 0x285, 0x295, 0x178, 0x2c4, 0x46, 0xae, 0x77, 0x1ec, 0x387, 0x2ca, 0xb5, 0x3ec, 0x2c0, 0x1bf, 0x41, 0x2d3, 0x1d6, 0x2b3, 0x1aa, 0x329, 0x2f8, 0xef, 0x141, 0xe8, 0x1b2, 0x265, 0x37c, 0xfd, 0x36b, 0x3dd, 0x30d, 0x12e, 0x30e, 0x22f, 0x23f, 0x1ec, 0x307, 0x33a, 0x1a1, 0x2b7, 0xa6, 0x303, 0xc8, 0x21d, 0x3ba, 0x306, 0x1c2, 0x14e, 0x3f6, 0x4e, 0x2b1, 0x2ad, 0x161, 0x347, 0x6d, 0x21f, 0x243, 0x2d8, 0x340, 0x9e, 0x92, 0x8d, 0x40, 0x357, 0x3be, 0xf4, 0x27e, 0x43, 0x56, 0x28f, 0x337, 0x346, 0x295, 0x2f0, 0x302, 0x230, 0x2f2, 0x2fb, 0x3ee, 0x70, 0x32b, 0x8a, 0xb3, 0x1da, 0x170, 0x26c, 0x269, 0x363, 0x30, 0x7c, 0x334, 0x47, 0x3a4, 0x133, 0x23a, 0xe6, 0x54, 0x376, 0x2e9, 0x1c4, 0x345, 0x194, 0x3c1, 0xc1, 0x308, 0x24, 0x5d, 0x263, 0x177, 0x29f, 0xe4, 0x1ad, 0x2a8, 0x6b, 0x14, 0x21, 0x157, 0x130, 0x13b, 0x1d7, 0x397, 0x24e, 0x3f, 0x362, 0x2c8, 0x93, 0x275, 0xaf, 0x216, 0x356, 0x146, 0x1b, 0x33f, 0xab, 0x1e4, 0xea, 0x4b, 0x3bb, 0x1fe, 0x12d, 0x1f9, 0x3bc, 0x21a, 0x29b, 0x225, 0x56, 0x117, 0xc7, 0x206, 0x10a, 0x2af, 0x130, 0x276, 0x355, 0x87, 0xa1, 0x3e9, 0x106, 0x291, 0x204, 0x2f8, 0x1de, 0x10d, 0x349, 0x316, 0x2b, 0x28f, 0x267, 0x103, 0x85, 0x353, 0x98, 0x13b, 0x3ae, 0x247, 0x254, 0x3f0, 0x83, 0x34c, 0x102, 0x17c, 0xef, 0x282, 0x3a0, 0x18b, 0x211, 0x343, 0x337, 0x285, 0x246, 0x3ad, 0x4c, 0x299, 0x1d7, 0x327, 0x12a, 0x1f8, 0x245, 0x1a6, 0x81, 0xbe, 0x273, 0x141, 0x1d0, 0x2c1, 0x30c, 0x3a5, 0x39f, 0x346, 0x123, 0x3d2, 0x26, 0x348, 0x2ef, 0x397, 0x95, 0xfc, 0x326, 0xd3, 0x244, 0x5f, 0x33d, 0x2a4, 0xe8, 0x364, 0x186, 0x3d6, 0x3cb, 0x1a3, 0x295, 0x1e9, 0x13, 0x1a4, 0x373, 0x3cf, 0x24e, 0x7e, 0x193, 0x26d, 0x122, 0x22b, 0x39a, 0x152, 0x74, 0x1b2, 0xc3, 0x1eb, 0x3e1, 0x2d5, 0x34e, 0x2f0, 0x20d, 0xd2, 0x3bd, 0x3e3, 0x127, 0x3f, 0x2cd, 0x332, 0x91, 0x3f2, 0x2eb, 0xf4, 0x1ea, 0x39, 0x1ad, 0x2b2, 0x2b9, 0x109, 0x148, 0x3fd, 0x288, 0x30b, 0x8f, 0x2ed, 0xca, 0x38b, 0x201, 0x1d8, 0x224, 0x35e, 0x2be, 0x2c5, 0x1c2, 0x131, 0x317, 0x3a4, 0xc5, 0x3e8, 0x1fe, 0xbd, 0xf0, 0x239, 0x387, 0x27d, 0x113, 0x25d, 0x3b4, 0x392, 0x10b, 0x2a5, 0x222, 0x360, 0xdf, 0xfd, 0x1b7, 0x1a7, 0x2f0, 0x13, 0x348, 0x1d7, 0x247, 0xa1, 0x3db, 0x11, 0xa5, 0x8, 0x3af, 0x375, 0x3a9, 0x34b, 0x1c8, 0x173, 0x1bd, 0x1e5, 0x5a, 0x252, 0x3d7, 0x6d, 0x6e, 0x71, 0x345, 0x259, 0x67, 0x2c, 0x2db, 0x104, 0x2c6, 0x1dd, 0x205, 0x20b, 0x19a, 0x8e, 0x11f, 0x221, 0x37f, 0x3eb, 0x1e1, 0x389, 0x1ec, 0x7, 0x3cc, 0x8a, 0x2cc, 0x19f, 0xaf, 0x4a, 0x105, 0x134, 0x336, 0x2f1, 0x3e1, 0x1a3, 0x123, 0x3ad, 0x98, 0x276, 0x2a3, 0x21c, 0x101, 0x2e7, 0x88, 0x121, 0x40, 0x147, 0x39e, 0x177, 0x26e, 0x25b, 0x38a, 0x3ed, 0x3be, 0x3a9, 0x29f, 0x329, 0x38a, 0x3e6, 0xd7, 0x2ad, 0x31a, 0x54, 0x386, 0x31e, 0x3fb, 0x165, 0x1a1, 0x195, 0x1da, 0x392, 0x216, 0x286, 0x134, 0x265, 0x3d6, 0x337, 0x206, 0x21, 0x2aa, 0x8b, 0x27c, 0x1cb, 0x2d8, 0x236, 0x3c1, 0x201, 0x3b0, 0x82, 0x2c6, 0x3ba, 0x6, 0x7c, 0x196, 0x1e4, 0x359, 0x2e4, 0x12e, 0x46, 0x2f2, 0x3f5, 0x24e, 0x1f8, 0x106, 0x256, 0x8, 0x357, 0x1cf, 0x177, 0xd5, 0x17e, 0x6f, 0x30f, 0x2b1, 0x145, 0xe6, 0x2a0, 0xf, 0xc6, 0x3e7, 0x33a, 0x113, 0xb3, 0x2cb, 0xaf, 0x94, 0x1d, 0x1b2, 0x30c, 0x28f, 0x18e, 0x14, 0x108, 0x17d, 0x51, 0x3c4, 0x243, 0x2ed, 0x194, 0x237, 0x2c, 0x1bf, 0x19, 0x21d, 0x1ef, 0x30, 0x3e0, 0xab, 0x33b, 0x2fe, 0x30d, 0x162, 0x230, 0x3bd, 0x397, 0x254, 0x3db, 0x22, 0x294, 0x40, 0x28e, 0x263, 0x3aa, 0x2a1, 0x3e2, 0x378, 0x4e, 0x1a5, 0x23a, 0x339, 0x12d, 0x78, 0x3d3, 0x2e3, 0x177, 0x1aa, 0x1f1, 0x378, 0x9c, 0x29d, 0x1f4, 0x3fc, 0x1e1, 0x23f, 0x2ff, 0x1c0, 0x362, 0xd3, 0x204, 0x3ed, 0x375, 0x2bf, 0xd5, 0x2fc, 0x1bc, 0x4e, 0x34a, 0xfa, 0x1fe, 0x2f4, 0x31b, 0x37b, 0xe0, 0x1b1, 0x26d, 0x102, 0x3f2, 0x3be, 0x35b, 0x26e, 0x17e, 0xde, 0x27, 0x1a5, 0x7d, 0xff, 0x17a, 0x389, 0x3b9, 0x70, 0x2dc, 0x332, 0x81, 0x1f9, 0x1df, 0x3a9, 0x137, 0xbf, 0x6f, 0x217, 0x2d6, 0x23a, 0x27b, 0xbd, 0x3c0, 0x3d8, 0x38, 0x16e, 0x199, 0x244, 0x2f8, 0x2eb, 0x3d0, 0x29f, 0x25b, 0x233, 0x30f, 0x16b, 0x11d, 0x339, 0x25a, 0x1e0, 0x1ec, 0x1c, 0xb7, 0x2c8, 0x122, 0x17c, 0x371, 0x1e8, 0x34b, 0x329, 0x31d, 0x383, 0x2b1, 0x28a, 0x398, 0x12d, 0xf0, 0xf6, 0xe, 0x25f, 0x164, 0x91, 0xbe, 0x3bc, 0xf4, 0x3a1, 0x390, 0x38a, 0x3c5, 0x35c, 0x145, 0x1cc, 0x292, 0x78, 0x7b, 0x7, 0x32b, 0xb2, 0x24c, 0x5f, 0x3af, 0x39e, 0x3aa, 0x296, 0x257, 0x38f, 0x28b, 0x96, 0x323, 0x23, 0x1ed, 0x397, 0x142, 0x1c7, 0x92, 0x184, 0x240, 0x35e, 0x1dd, 0xc, 0x3e0, 0x2ac, 0x3dc, 0x2d7, 0x3d2, 0x260, 0x24b, 0x2e1, 0x1b9, 0x194, 0xce, 0x2c0, 0x303, 0x136, 0x2d1, 0x222, 0x336, 0x3a5, 0x18e, 0x50, 0xa4, 0x3ef, 0x1b4, 0x1db, 0x1fc, 0x2b6, 0x342, 0xb3, 0x33e, 0x2e2, 0x141, 0x13f, 0x39, 0x173, 0x1f3, 0x1ae, 0x145, 0x398, 0x25a, 0x3c0, 0x3b9, 0xe0, 0x362, 0x1a6, 0x2, 0x357, 0x335, 0x35d, 0x125, 0xa7, 0x317, 0x11f, 0x12c, 0x24f, 0x46, 0x3da, 0x327, 0x284, 0x38e, 0x124, 0x308, 0x89, 0x2b5, 0x3ba, 0x18, 0x3c9, 0x151, 0x3b1, 0x1a7, 0x3ad, 0xc9, 0x9f, 0x1cb, 0x372, 0x328, 0x19c, 0x189, 0x20f, 0x26c, 0x1ab, 0x4d, 0x265, 0x343, 0x31c, 0xa0, 0x148, 0x3d7, 0x368, 0x3b6, 0x3f8, 0x165, 0x28d, 0x166, 0x275, 0x1cd, 0x282, 0x27e, 0x72, 0x2e6, 0x3e6, 0x357, 0x263, 0x16f, 0x13a, 0x262, 0x238, 0x359, 0x30d, 0x302, 0x13b, 0x135, 0x5b, 0x236, 0x237, 0x160, 0x303, 0x26c, 0x356, 0x134, 0x30c, 0x55, 0x358, 0x5a, 0x161, 0x54, 0xf, 0x239, 0xe, 0x16e, 0x26d, 0x1, 0x357, 0x263, 0x16f, 0x13a, 0x262, 0x238, 0x359, 0x30d, 0x302, 0x13b, 0x135, 0x5b, 0x236, 0x237, 0x160, 0x303, 0x26c, 0x356, 0x134, 0x30c, 0x55, 0x358, 0x5a, 0x161, 0x54, 0xf, 0x239, 0xe, 0x16e, 0x26d, 0x1, 0x357, 0x263, 0x16f, 0x13a, 0x262, 0x238, 0x359, 0x30d, 0x302, 0x13b, 0x135, 0x5b, 0x236, 0x237, 0x160, 0x303, 0x26c, 0x356, 0x134, 0x30c, 0x55, 0x358, 0x5a, 0x161, 0x54, 0xf, 0x239, 0xe, 0x16e, 0x26d, 0x1, 0x357, 0x263, 0x16f, 0x13a, 0x262, 0x238, 0x359, 0x30d, 0x302, 0x13b, 0x135, 0x5b, 0x236, 0x237, 0x160, 0x303, 0x26c, 0x356, 0x134, 0x30c, 0x55, 0x358, 0x5a, 0x161, 0x54, 0xf, 0x239, 0x2a7, 0x19e, 0x36a, 0x384, 0xcb, 0x33b, 0x3b3, 0x3d2, 0x192, 0xf1, 0x11e, 0x21e, 0x12f, 0x2ce, 0x2cb, 0x2e2, 0x10d, 0x3d4, 0x25b, 0x1bc, 0x270, 0x314, 0x395, 0x46, 0x373, 0x21c, 0x68, 0x1f2, 0x16, 0x1e3, 0x9b, 0x1ab, 0x134, 0x211, 0x154, 0x2f6, 0x1a9, 0x73, 0x12d, 0x389, 0x1f7, 0x3f, 0x20c, 0x242, 0x24, 0x2d3, 0x1dd, 0x30, 0x277, 0x27a, 0x346, 0x42, 0x1fd, 0x6d, 0x1db, 0x3f9, 0x33a, 0x114, 0x24c, 0x2f8, 0x375, 0x1d5, 0x125, 0x29c, 0x11c, 0x359, 0x213, 0x13, 0x1ca, 0x374, 0x372, 0xbb, 0x1f6, 0x298, 0x392, 0x128, 0x3a0, 0x218, 0x2e6, 0x383, 0x1a5, 0x3e8, 0x3b7, 0x15c, 0x3e3, 0x142, 0x315, 0x132, 0x1d8, 0x19, 0x198, 0xa3, 0x2c9, 0x3a5, 0x231, 0x109, 0x15a, 0x2a, 0xf, 0x7b, 0x38, 0x362, 0x291, 0x20, 0x5d, 0x3ac, 0x183, 0x7c, 0x156, 0x3b1, 0x295, 0x2ae, 0x22c, 0x21f, 0x388, 0x350, 0x1a1, 0x166, 0x1c6, 0xef, 0x147, 0x271, 0x366, 0x3e, 0x156, 0x36b, 0x246, 0x15d, 0x288, 0x370, 0x3f8, 0x33a, 0x228, 0x122, 0x3ed, 0x335, 0x2de, 0x1c2, 0xcb, 0x27f, 0x2d7, 0x2af, 0x116, 0x21f, 0x319, 0x15b, 0x113, 0x24d, 0xbe, 0x3be, 0x1d5, 0x24a, 0x262, 0xf2, 0x1f5, 0x2f0, 0xc9, 0xf1, 0x23c, 0x6a, 0x16a, 0xb3, 0x1c6, 0x1de, 0x3a9, 0x354, 0x257, 0x47, 0x3a8, 0x213, 0x26, 0x321, 0x396, 0x345, 0x34d, 0x167, 0x2cb, 0x1cd, 0x3d, 0x29f, 0x1f1, 0x3e5, 0x11f, 0x172, 0x2c4, 0x13b, 0xdd, 0x1b9, 0xbb, 0x3ec, 0x272, 0xaf, 0x2a4, 0xf5, 0x329, 0x1bc, 0xe9, 0x4b, 0x97, 0x69, 0x2a3, 0x229, 0x65, 0x19c, 0x53, 0x2e0, 0x94, 0x3a0, 0x39, 0x38a, 0x27, 0x266, 0x1e7, 0x23, 0x373, 0x31, 0x1a0, 0x38b, 0x160, 0x17, 0x281, 0x1d, 0x225, 0x35a, 0x3e6, 0x2d6, 0x3e8, 0x367, 0x179, 0x327, 0xd, 0x278, 0xb, 0x1e3, 0x136, 0x2a5, 0x1b2, 0x158, 0x2da, 0xd7, 0x28e, 0x1d6, 0x306, 0x3e0, 0x29a, 0x346, 0x108, 0x3ef, 0x376, 0xc6, 0xe, 0x362, 0x256, 0x200, 0x36d, 0x3ba, 0x180, 0x26b, 0x337, 0xa0, 0xad, 0x54, 0x78, 0x37b, 0x3f, 0x22, 0x61, 0x112, 0x21d, 0x32e, 0x2c9, 0x28f, 0x358, 0x2d0, 0xe6, 0x17a, 0x1dc, 0x24e, 0x2e7, 0x99, 0x3b0, 0xc8, 0x36c, 0x134, 0x56, 0x16d, 0xd7, 0x23a, 0x3eb, 0x15c, 0x397, 0xd, 0xf9, 0x2c, 0x303, 0x344, 0x1d, 0x43, 0x173, 0x30f, 0x133, 0x1e7, 0x46, 0x1d7, 0x188, 0x236, 0x19c, 0xa6, 0x392, 0xa9, 0x27e, 0x329, 0x378, 0x3a4, 0x258, 0x162, 0x13b, 0x1ba, 0x2ed, 0x1d1, 0x2b7, 0x2cb, 0x39a, 0xf4, 0xd5, 0x32f, 0x47, 0x359, 0x5e, 0x130, 0x27c, 0x23c, 0xd4, 0x1a1, 0x191, 0x5f, 0x3be, 0x3aa, 0x13a, 0x334, 0x33b, 0x2d7, 0x157, 0x51, 0xdc, 0x1fc, 0x33a, 0x59, 0x81, 0x357, 0x33c, 0x366, 0x7c, 0x151, 0x36e, 0x21, 0x3fa, 0x368, 0x31e, 0x307, 0x115, 0x351, 0x6, 0x277, 0x3f4, 0x14, 0x129, 0x2a, 0x78, 0x2ff, 0xfc, 0x110, 0x219, 0x208, 0x269, 0x4d, 0x2b, 0x16d, 0x1ae, 0xfa, 0x367, 0x1ed, 0x21c, 0x340, 0x67, 0x53, 0x392, 0x152, 0x1ea, 0x17e, 0x3e5, 0x75, 0x30d, 0x4c, 0x13e, 0x23c, 0x1a8, 0x28d, 0x93, 0x1f9, 0x335, 0x36a, 0x1f, 0x2ac, 0x36e, 0x42, 0x3f3, 0x376, 0x18c, 0x38, 0x326, 0x121, 0x90, 0x2c6, 0x2cf, 0x360, 0x28f, 0x2b9, 0x352, 0x339, 0x38d, 0x3fe, 0x284, 0x13c, 0x16, 0x303, 0x281, 0x74, 0x218, 0x31d, 0x138, 0x4b, 0x25c, 0x299, 0x1ba, 0x1d3, 0x34d, 0x195, 0xe3, 0x3bc, 0x177, 0x24a, 0x19a, 0x33b, 0x1a7, 0x155, 0x288, 0x1db, 0x3f7, 0x32b, 0xd3, 0x20, 0x2e8, 0x2ea, 0xc0, 0x26b, 0x267, 0x280, 0x161, 0x149, 0x31b, 0x34f, 0x3bf, 0x248, 0x3b0, 0x190, 0x1ab, 0x1b2, 0x169, 0x1f3, 0x1a5, 0x37f, 0x23, 0x1d7, 0x310, 0xca, 0xfb, 0x272, 0x2bc, 0x21a, 0x22a, 0x15f, 0x30, 0x331, 0x267, 0x109, 0x18d, 0x25a, 0x1dc, 0x12a, 0x223, 0x201, 0x385, 0x281, 0xe8, 0x72, 0xde, 0x3a4, 0x172, 0x20d, 0x24b, 0x11e, 0x1a8, 0x113, 0x24c, 0x3d3, 0x33c, 0x183, 0x3c9, 0xfd, 0xa, 0x129, 0x54, 0x1e0, 0x3d5, 0x3db, 0x248, 0x369, 0x249, 0x143, 0x316, 0x173, 0x27, 0x314, 0x12e, 0x299, 0x374, 0x345, 0x25e, 0x166, 0x5f, 0x2e3, 0x2de, 0x20b, 0x2ac, 0x2d5, 0x108, 0x3a7, 0x305, 0x1ec, 0x21b, 0x44, 0x308, 0x208, 0xdb, 0x134, 0x158, 0x2fd, 0x1a5, 0x2f7, 0x8c, 0x2a3, 0x16c, 0x176, 0x2b7, 0x33e, 0x1de, 0x177, 0x9d, 0x261, 0x1ee, 0x246, 0x2fa, 0x368, 0x63, 0x1c, 0x326, 0x242, 0x240, 0x21d, 0xa3, 0xc3, 0x2a8, 0x26f, 0x7d, 0x367, 0x3da, 0x62, 0x236, 0x279, 0x272, 0x171, 0x7a, 0x1aa, 0x14e, 0xf2, 0x3b3, 0x157, 0x144, 0x1db, 0x3e7, 0xb7, 0x291, 0x200, 0x1af, 0x3de, 0xd8, 0x343, 0x2b9, 0x2ad, 0x5d, 0x175, 0x180, 0x37c, 0x6b, 0x2d0, 0x339, 0x22f, 0x397, 0x68, 0x237, 0xa6, 0xaf, 0x21a, 0xd5, 0x14e, 0x1e4, 0x2d7, 0x2aa, 0x6d, 0x31e, 0xe, 0x326, 0x8d, 0x112, 0xcc, 0x222, 0x56, 0x37a, 0x1a5, 0x1e7, 0x230, 0x135, 0x2ed, 0x293, 0xb3, 0x5f, 0x1cf, 0x36a, 0x7c, 0x29a, 0x206, 0x290, 0x54, 0x3c0, 0x34f, 0x2e7, 0xc1, 0x1e3, 0x344, 0xe8, 0xe4, 0x378, 0x11f, 0x30d, 0x130, 0x3c4, 0x23b, 0x33a, 0x2c8, 0x8, 0x2e8, 0x3ba, 0x1b, 0x3d6, 0x358, 0x2ad, 0x1fe, 0x15c, 0x87, 0x340, 0x19c, 0x139, 0x171, 0xf4, 0x2a1, 0x262, 0x33b, 0x295, 0x17d, 0x368, 0xc6, 0x70, 0x106, 0x61, 0x82, 0x269, 0x134, 0x2b0, 0x3e6, 0x133, 0x323, 0x1a4, 0x1ba, 0x345, 0xb5, 0x191, 0x2f8, 0x263, 0x366, 0x3e0, 0xfd, 0x14, 0xad, 0x2a0, 0x23f, 0x24e, 0x315, 0x201, 0x303, 0x216, 0x349, 0x329, 0x3f6, 0xea, 0x5e, 0x192, 0x21f, 0x1fc, 0x1e6, 0xba, 0x1dd, 0x1b, 0x3a5, 0x17b, 0x145, 0x3df, 0x3da, 0x188, 0x328, 0x35f, 0x275, 0x2eb, 0x2b3, 0x20b, 0x2a2, 0x103, 0x290, 0xa8, 0x31b, 0x24e, 0x223, 0x16, 0x2e, 0x128, 0x1ea, 0x3e2, 0x8e, 0x3ea, 0x157, 0x119, 0x18f, 0xe, 0x245, 0x234, 0x82, 0xdb, 0xd9, 0x1ad, 0x217, 0x221, 0x162, 0x394, 0x11e, 0x2a9, 0x114, 0x204, 0x5d, 0x2ea, 0x209, 0x3d6, 0x2b9, 0x2a6, 0x3eb, 0x1ed, 0xc4, 0x194, 0x3ab, 0x33e, 0x371, 0x35d, 0x301, 0x151, 0x285, 0x148, 0x54, 0x389, 0x127, 0x315, 0xb, 0x17, 0x94, 0xf5, 0x1f1, 0x47, 0x1f5, 0x2af, 0x288, 0x2c3, 0x7, 0x326, 0x11a, 0x41, 0x269, 0x268, 0x2d2, 0x30f, 0x314, 0xb1, 0x1ca, 0x8f, 0x350, 0x8a, 0x102, 0x22a, 0x175, 0x300, 0x1eb, 0x358, 0x153, 0x3f1, 0x2f2, 0x62, 0xca, 0x3d1, 0x19f, 0x3bc, 0x3aa, 0x384, 0x2ac, 0x346, 0xa4, 0x2a, 0x3c0, 0x297, 0x38e, 0x201, 0x20f, 0x4a, 0x27e, 0x174, 0x37d, 0xd8, 0x22e, 0x333, 0x1f4, 0x23, 0x14f, 0x2ed, 0x25e, 0x322, 0x3ed, 0xeb, 0xc, 0x26b, 0x231, 0x1a9, 0x1fe, 0x179, 0x62, 0x194, 0x35f, 0xe3, 0x3be, 0x1b5, 0xf8, 0xfd, 0x50, 0x2c2, 0x17a, 0x3fe, 0x1a, 0x237, 0x298, 0x2e2, 0x3a9, 0x9d, 0x32c, 0x36e, 0x29, 0x15, 0x3c0, 0x127, 0x223, 0x2c, 0xb8, 0x152, 0x29f, 0xa7, 0x3c8, 0x295, 0x1fd, 0x2e5, 0x1ec, 0xfc, 0x124, 0x1bf, 0x1a2, 0x1d0, 0x329, 0x3c3, 0x2bb, 0x3ad, 0x144, 0x2c3, 0xe, 0x83, 0xc2, 0x19, 0x1ab, 0x316, 0x38a, 0x1d2, 0x1c1, 0x130, 0x30b, 0x3f8, 0x32b, 0x12b, 0x48, 0x21d, 0x111, 0xac, 0x3e6, 0xc5, 0x25c, 0x1ca, 0x11e, 0x15b, 0x59, 0x4, 0x1d9, 0x1ef, 0x360, 0xaa, 0xd7, 0x3d9, 0x8c, 0x135, 0x3a6, 0x16a, 0x93, 0x3af, 0x3ac, 0x30, 0x1be, 0xd6, 0x2ad, 0x3f1, 0x1ed, 0x188, 0x259, 0x167, 0x38c, 0x2e3, 0x2dd, 0x3e0, 0x3f4, 0x140, 0x31a, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1, 0x2e8, 0x1ef, 0x2c9, 0x2a8, 0x2b1, 0x1e7, 0x1a4, 0x1cb, 0xd4, 0x8a, 0x1d9, 0x3b5, 0x265, 0x2da, 0x29d, 0x12e, 0x394, 0xe2, 0x33a, 0xd3, 0x12, 0x21d, 0x4d, 0x2d2, 0x4e, 0xb9, 0x98, 0x21f, 0x3ff, 0x1b1, 0x8d, 0x104, 0x1ab, 0x43, 0xde, 0x75, 0x2f0, 0xa2, 0x18f, 0x70, 0x44, 0x1d8, 0x26c, 0x1d0, 0xbf, 0x47, 0x3b3, 0x2ba, 0x376, 0x3d8, 0x3e9, 0xc1, 0x20f, 0x250, 0x29f, 0x29c, 0xf7, 0x21, 0x287, 0x1e0, 0x24e, 0x13c, 0x189, 0xaf, 0x1e8, 0x9d, 0xab, 0x285, 0x252, 0x12d, 0x1ff, 0x34, 0x19c, 0x3b4, 0x3bc, 0x16f, 0xf8, 0x3f4, 0x109, 0x1cc, 0xae, 0x31, 0x328, 0x2ce, 0x5f, 0xcf, 0x3, 0x26b, 0xd6, 0x2a6, 0x367, 0x3ae, 0x372, 0xb5, 0x126, 0x147, 0x175, 0x36, 0x22e, 0xd7, 0x37f, 0xd2, 0x1cb, 0x1a8, 0x228, 0x8, 0x2d3, 0x197, 0x30c, 0x2fd, 0xc5, 0x162, 0x9f, 0x319, 0x1e6, 0x291, 0x90, 0xcc, 0x268, 0x2bd, 0x270, 0x1c1, 0xc9, 0xdc, 0x3c7, 0x193, 0x61, 0x32, 0x143, 0x218, 0x3b2, 0x2cf, 0x30c, 0x1f3, 0x314, 0x302, 0x1e2, 0x3f8, 0x16e, 0x242, 0x104, 0x356, 0x10c, 0x2f9, 0x359, 0x2af, 0xda, 0x239, 0xfc, 0x132, 0x303, 0x250, 0x137, 0x262, 0x3b1, 0x210, 0x54, 0xee, 0x101, 0x237, 0xed, 0x1de, 0x16f, 0x1f0, 0x3cb, 0x5a, 0xff, 0x1ed, 0x5b, 0x34d, 0x322, 0x357, 0x2be, 0x36, 0x55, 0x35c, 0x3ce, 0x13b, 0x11e, 0x2ca, 0x26d, 0x12, 0x33, 0x134, 0x2bd, 0xe9, 0x30d, 0x241, 0x1db, 0xe, 0x11, 0xec, 0x26c, 0x3a0, 0x2fc, 0x238, 0x34e, 0x3fd, 0xf, 0x3a3, 0x223, 0x160, 0x253, 0x1e8, 0x13a, 0x2ac, 0x5, 0x161, 0x1e1, 0x327, 0x236, 0x35f, 0x311, 0x263, 0x3, 0xdf, 0x358, 0x11d, 0x215, 0x135, 0x10f, 0x226, 0x1, 0x3b2, 0x2cf, 0x30c, 0x1f3, 0x314, 0x302, 0x1e2, 0x3f8, 0x16e, 0x242, 0x104, 0x356, 0x10c, 0x2f9, 0x359, 0x2af, 0xda, 0x239, 0xfc, 0x132, 0x303, 0x250, 0x137, 0x262, 0x3b1, 0x210, 0x54, 0x36d, 0x32e, 0x56, 0x30f, 0x258, 0x130, 0xdc, 0x307, 0x106, 0x76, 0x26c, 0x349, 0x3e2, 0x1e4, 0x85, 0x347, 0x3c0, 0x254, 0x3c1, 0x139, 0xef, 0x16f, 0x3e0, 0x337, 0x2d0, 0x3eb, 0x1d7, 0x2ed, 0x1a1, 0x81, 0x2e8, 0x363, 0x30c, 0x3e6, 0x4b, 0x26, 0x21f, 0x3e7, 0x326, 0x308, 0x249, 0xe8, 0x17e, 0x238, 0x295, 0x3ef, 0x78, 0x24e, 0xf9, 0xa6, 0x39a, 0x3aa, 0x7c, 0x3e1, 0x5a, 0x1fe, 0x3bd, 0x2d8, 0xb5, 0x91, 0x5d, 0x1ef, 0x265, 0x37a, 0x18a, 0x302, 0x3c4, 0x3fb, 0x362, 0x61, 0xc8, 0x1d, 0x329, 0x47, 0x2d7, 0x3fa, 0xf, 0x34f, 0x9e, 0x312, 0x171, 0x177, 0x20b, 0xfd, 0x109, 0x339, 0x2f2, 0x5b, 0x293, 0x93, 0x28e, 0x3ba, 0x2c9, 0x16d, 0x133, 0x162, 0x27c, 0x1fc, 0x16e, 0x8d, 0x19, 0x286, 0xe4, 0x38f, 0x3dd, 0x17d, 0x386, 0x3ee, 0x315, 0x160, 0xaf, 0x3a9, 0x1c2, 0x29a, 0xa0, 0xe6, 0x15c, 0x188, 0x1d1, 0x191, 0x2d3, 0xa3, 0x2b0, 0x9c, 0x382, 0x8b, 0x2c3, 0x1c0, 0x92, 0x3c6, 0x250, 0xd5, 0x261, 0x1a3, 0xad, 0x2f4, 0x247, 0x194, 0x32a, 0x3f2, 0x2ab, 0x36, 0x154, 0x1a5, 0x25c, 0x13e, 0x1fc, 0x2dc, 0x234, 0xc8, 0x3a, 0xbf, 0x238, 0x123, 0x3a7, 0x3c0, 0xa1, 0x31f, 0x1da, 0x2eb, 0x1b3, 0x1ce, 0xd6, 0x11d, 0x46, 0x374, 0x350, 0x2c8, 0x9, 0x66, 0x1b2, 0x31d, 0x75, 0x3ad, 0xda, 0xf6, 0x3db, 0xb, 0x1c9, 0xf4, 0x274, 0x14d, 0xa0, 0x1cc, 0x179, 0x5b, 0x12f, 0x24c, 0x5d, 0x3de, 0x186, 0x3e6, 0x96, 0x98, 0xdc, 0x207, 0x11, 0x3b0, 0x281, 0x1ea, 0x14e, 0x3dc, 0x29, 0x2a0, 0x1ff, 0x1a0, 0x3d1, 0x311, 0x19e, 0x30, 0x3a5, 0x26f, 0x1e7, 0x276, 0xe2, 0x1e6, 0xa5, 0x41, 0x356, 0x39, 0x3c3, 0x3dd, 0x2fa, 0x203, 0x34f, 0x13c, 0x53, 0x39a, 0x35d, 0x1f0, 0x337, 0x1a9, 0x3b7, 0x2a3, 0x283, 0x45, 0x8, 0x2b5, 0x111, 0x1ad, 0x1af, 0x28c, 0x1ad, 0x1d2, 0xbc, 0x288, 0x318, 0x3f0, 0x201, 0x1c9, 0x1e8, 0x1c2, 0x27a, 0x212, 0x1fe, 0x2ef, 0x1d3, 0x113, 0x4, 0x2b5, 0x222, 0x2bd, 0x341, 0x2f0, 0x232, 0x7b, 0x3db, 0x16, 0x32d, 0x3a9, 0x301, 0x1fa, 0x5a, 0x3f1, 0x3ae, 0x345, 0x45, 0x10, 0x2c6, 0x9a, 0x2e6, 0x11f, 0x3d2, 0xda, 0x1ec, 0x377, 0x58, 0xaf, 0x2bf, 0x1f, 0x3e1, 0x168, 0x3df, 0x2a3, 0x10f, 0x114, 0x40, 0x30a, 0x268, 0x38a, 0x75, 0x353, 0x368, 0x3b9, 0x1c7, 0x160, 0x2bc, 0x2ee, 0x7c, 0x39f, 0x1a9, 0x367, 0x29e, 0x35, 0x59, 0x100, 0x33, 0x1b2, 0x233, 0x1d4, 0x157, 0x1bb, 0x2ff, 0x315, 0x189, 0x2e2, 0x3aa, 0x1f0, 0x267, 0x2ad, 0x187, 0x26a, 0xd4, 0x164, 0x9, 0xcc, 0x2c1, 0xde, 0x359, 0x155, 0x2e5, 0x3ee, 0x4f, 0x22d, 0x39a, 0x2b3, 0x3c9, 0x18e, 0x2a6, 0x215, 0x1ba, 0x350, 0x199, 0x24, 0x330, 0x316, 0x378, 0x17f, 0x15d, 0x386, 0x35e, 0x222, 0x173, 0x11f, 0x3ad, 0x368, 0x37b, 0x315, 0x312, 0x39a, 0x16f, 0x33f, 0x6b, 0x23a, 0x230, 0x243, 0x33a, 0x256, 0x82, 0x286, 0x329, 0x238, 0x85, 0x20e, 0x1dc, 0x68, 0x3d1, 0x5f, 0x1d6, 0x1b, 0x2a8, 0x133, 0x302, 0x21f, 0x307, 0x22, 0x1bf, 0x94, 0xd5, 0x196, 0x206, 0x31a, 0x15c, 0x5b, 0xb5, 0x81, 0x36d, 0x146, 0x1ad, 0x3a4, 0x2f0, 0x6d, 0x1ec, 0x2e7, 0x160, 0x171, 0x3aa, 0x3e0, 0x18e, 0x145, 0x46, 0x1cb, 0x165, 0x34c, 0x112, 0x356, 0xe4, 0x47, 0x295, 0x347, 0x23f, 0xd, 0xfb, 0x38c, 0x33c, 0x180, 0x55, 0x1a5, 0x162, 0x3c4, 0x3e7, 0x106, 0x3b0, 0x216, 0x29f, 0x334, 0x346, 0x161, 0x22f, 0x188, 0x293, 0x91, 0x2e8, 0x32e, 0x2b0, 0x270, 0x5e, 0x288, 0x239, 0x3db, 0x2c, 0xaf, 0x177, 0x7c, 0x337, 0x2ad, 0x30e, 0x1ba, 0x2a9, 0x26d, 0x120, 0x36c, 0x218, 0x38f, 0x2d7, 0x3ef, 0x3c0, 0x284, 0x19c, 0x275, 0x2b5, 0x9a, 0x38a, 0x1d4, 0x155, 0x386, 0x297, 0x3e4, 0x1da, 0x375, 0x3, 0x3d6, 0x1ae, 0x97, 0x27c, 0x3ff, 0x83, 0x3b0, 0x25, 0x26e, 0x196, 0x5, 0x73, 0x2f2, 0x1b9, 0x28d, 0x8, 0x185, 0xd9, 0x6f, 0x2bb, 0x2ba, 0xf, 0x95, 0x31f, 0x2cb, 0x39e, 0x18, 0x28f, 0x16b, 0xb1, 0x3c4, 0x3c7, 0x11, 0x1bf, 0x128, 0x354, 0xab, 0x28, 0x398, 0x3bd, 0x1d3, 0x45, 0x40, 0x33, 0x2c1, 0x378, 0x1f5, 0x1fd, 0x78, 0xa1, 0xce, 0x275, 0xcf, 0xc0, 0x55, 0x34a, 0x181, 0x21f, 0x207, 0x88, 0x1e3, 0x152, 0x296, 0x151, 0x140, 0xff, 0x1d7, 0x283, 0x228, 0x200, 0x198, 0x225, 0x3f6, 0x3b3, 0x3f3, 0x3c0, 0x101, 0x279, 0x38c, 0x271, 0x209, 0x2a8, 0x266, 0x13, 0xdc, 0x1c, 0x49, 0x303, 0x282, 0x9d, 0x29a, 0x212, 0x3f1, 0x2a3, 0x35, 0x164, 0x24, 0xdb, 0x10c, 0x38f, 0x1a7, 0x3a7, 0x23f, 0x1a, 0x3ec, 0x5f, 0x3ac, 0x6c, 0x16d, 0x163, 0x268, 0x6f, 0x17f, 0x2fa, 0x78, 0x142, 0x338, 0x38c, 0xeb, 0x36, 0x16d, 0x221, 0x260, 0x365, 0x21b, 0x182, 0x392, 0x2bf, 0xf8, 0x18e, 0x11d, 0x69, 0x23c, 0x391, 0x11a, 0x249, 0x13f, 0x29c, 0x36e, 0x2b4, 0x57, 0x5b, 0x2d4, 0x2, 0x2c6, 0xd9, 0xde, 0x2fe, 0x1fd, 0xf0, 0x284, 0x279, 0x311, 0x1d6, 0x6c, 0x2da, 0x4b, 0xc9, 0x2c3, 0x3f, 0x304, 0x32d, 0x177, 0x1f0, 0x31c, 0x23a, 0xd2, 0x71, 0x32b, 0x234, 0x9b, 0x27e, 0x131, 0x2d5, 0x161, 0xae, 0xb6, 0x1a1, 0x4, 0x185, 0x1b2, 0x1bc, 0x1f5, 0x3fa, 0x1e0, 0x101, 0xfb, 0x22b, 0x3ac, 0xd8, 0x1bd, 0x96, 0x192, 0x18f, 0x7e, 0x201, 0x253, 0x2ee, 0x3e0, 0x231, 0x7d, 0x1a4, 0xe2, 0x25f, 0x61, 0x136, 0xf5, 0x262, 0x1a3, 0x2c2, 0x15c, 0x16c, 0x342, 0x8, 0x30a, 0x364, 0x378, 0x3ea, 0x3fd, 0x3c0, 0x202, 0x1f6, 0x5f, 0x351, 0x1b0, 0x37a, 0x12c, 0x324, 0x31e, 0x2c6, 0x1b2, 0x378, 0x3dd, 0x3ef, 0x23f, 0x68, 0x2b7, 0x3ed, 0x3ba, 0x30c, 0x4e, 0x5e, 0x6d, 0x37b, 0x9e, 0x139, 0x3be, 0x6, 0x28f, 0x1a5, 0x302, 0xdc, 0x70, 0x99, 0x170, 0x3a9, 0x7c, 0x18e, 0x23a, 0x1a4, 0x1c4, 0x16e, 0x308, 0x344, 0x29f, 0x196, 0x14, 0x339, 0x1d7, 0x21e, 0x2c8, 0x120, 0x356, 0x329, 0x1e4, 0x108, 0x12d, 0x87, 0x1d1, 0x91, 0x36d, 0x222, 0x38a, 0x359, 0x17d, 0x78, 0x284, 0xfb, 0x5f, 0x2ab, 0x2c9, 0x3e6, 0x2e4, 0x51, 0x239, 0x2e7, 0x312, 0xef, 0x366, 0x37c, 0xd7, 0x12e, 0x3c4, 0x307, 0x110, 0x303, 0x21a, 0x1c2, 0x3e1, 0x2ad, 0x46, 0x243, 0x1e6, 0x8d, 0x249, 0x27e, 0x262, 0x346, 0x31a, 0x2f2, 0x2ed, 0x8a, 0x200, 0x269, 0x218, 0x47, 0x85, 0x54, 0x3f5, 0x194, 0x191, 0x5d, 0x32e, 0x1ad, 0x11f, 0x157, 0x386, 0x24e, 0x237, 0x275, 0x33c, 0x1b, 0x16d, 0x4b, 0x192, 0x31e, 0x1f8, 0x2c, 0x171, 0x185, 0x2c1, 0x3f6, 0x1a7, 0x107, 0x2fb, 0x65, 0x2cc, 0x5d, 0x255, 0x2bd, 0xea, 0x15d, 0x3c, 0x284, 0x1f6, 0x17c, 0x175, 0xc3, 0x27, 0x5e, 0xda, 0x1f7, 0xf9, 0x3b4, 0x335, 0x180, 0x159, 0x221, 0x192, 0x235, 0x3e9, 0x160, 0x33d, 0x1b3, 0x37c, 0x1ae, 0xb1, 0x21f, 0x1c, 0x248, 0x170, 0x35b, 0x1f0, 0x6b, 0x3e8, 0xe5, 0x1fc, 0x245, 0x2db, 0xa9, 0x24a, 0x27a, 0x2d0, 0x215, 0x325, 0x1e6, 0x11a, 0x136, 0x3d4, 0x261, 0xa, 0x339, 0x3ae, 0x6a, 0x26d, 0x224, 0x20a, 0x3e2, 0x3dc, 0x252, 0x22f, 0xb6, 0x28d, 0x40, 0x198, 0x10c, 0x47, 0x10a, 0x150, 0x397, 0x176, 0x24c, 0x36d, 0x4d, 0x233, 0x2fe, 0x3fd, 0x31b, 0x68, 0x167, 0x3af, 0x1ef, 0xac, 0x1d2, 0x3ad, 0x2e5, 0x127, 0x237, 0xe3, 0xeb, 0xd8, 0x2fd, 0x172, 0x51, 0x7b, 0x38e, 0xa6, 0x2eb, 0x3, 0x28f, 0x34a, 0x13, 0x2e9, 0x309, 0x304, 0xaf, 0x35d, 0xe7, 0x2f6, 0x30a, 0x316, 0x38f, 0x246, 0xa8, 0x397, 0x2ec, 0x122, 0x35e, 0xd9, 0x2f9, 0x2d7, 0x107, 0x1ff, 0x194, 0x24d, 0x1d9, 0x222, 0x233, 0x1f5, 0x3ef, 0xee, 0x289, 0xb3, 0x22a, 0x255, 0x173, 0x3a8, 0x2fa, 0x3c0, 0x34, 0x167, 0x357, 0x3b5, 0x169, 0x11f, 0x155, 0x1e, 0x284, 0x3ec, 0x1f9, 0x3ba, 0x2b, 0xe9, 0x3ad, 0x1c3, 0x95, 0x19c, 0x22b, 0x15f, 0x265, 0x27, 0xbc, 0x368, 0x3a3, 0x38b, 0x275, 0xeb, 0x1b0, 0x3e6, 0x382, 0x119, 0x37b, 0x278, 0x3b4, 0x263, 0x209, 0x2da, 0x258, 0x22c, 0x7b, 0x315, 0x298, 0x375, 0x30, 0x154, 0x314, 0x192, 0x63, 0x3bf, 0x312, 0x3bc, 0x205, 0x28f, 0x29d, 0x4c, 0x365, 0xfc, 0x58, 0x39a, 0x1b3, 0x2f1, 0x2b1, 0x181, 0x1b8, 0x380, 0x304, 0x15e, 0x16f, 0x331, 0x333, 0x12e, 0x30b, 0x1c, 0x99, 0x1c9, 0x2ee, 0x33f, 0x17b, 0x3ce, 0x27c, 0x387, 0x220, 0x2e, 0x3d0, 0xf8, 0x6b, 0x3d9, 0x394, 0x3fb, 0x21d, 0x43, 0x47, 0x21, 0x12d, 0x31, 0xb5, 0x8, 0xcc, 0x218, 0x238, 0x108, 0x17a, 0x188, 0x1a1, 0x40, 0x269, 0xe4, 0x1e4, 0x52, 0x3c2, 0x5b, 0x113, 0x200, 0x36c, 0x329, 0x33b, 0x290, 0x22f, 0x2d8, 0x8a, 0x24, 0x356, 0x17e, 0x1ee, 0xad, 0x15c, 0x2ed, 0x59, 0x120, 0x286, 0x3e2, 0x36b, 0x161, 0x2f2, 0x345, 0x2c8, 0x112, 0x1d, 0x32f, 0x36e, 0x31a, 0x3bd, 0x21e, 0x26d, 0x82, 0xe8, 0x14e, 0x346, 0xe6, 0x1d7, 0xd4, 0x34c, 0x19, 0x349, 0x262, 0x206, 0x339, 0x2a3, 0x2a9, 0x256, 0xc8, 0x27e, 0x334, 0x14, 0x1fe, 0x135, 0x165, 0x294, 0x249, 0x3d4, 0x196, 0xa0, 0x3eb, 0x1ba, 0x33a, 0x8d, 0x26c, 0x29f, 0xab, 0x109, 0x367, 0x1cb, 0x1e6, 0x61, 0x344, 0xd5, 0x151, 0x5a, 0x30e, 0x243, 0x32b, 0x308, 0x216, 0x2a1, 0x29a, 0x2d0, 0x46, 0x23c, 0x16e, 0x76, 0x94, 0x125, 0xfd, 0x2ad, 0x230, 0x1c4, 0x362, 0x3b0, 0xa9, 0x33, 0x10c, 0x238, 0x210, 0x1e1, 0x5b, 0x226, 0x12, 0x356, 0x2fc, 0x3b1, 0x161, 0x1ed, 0x10f, 0x26d, 0x104, 0x3a0, 0x262, 0x5, 0xff, 0x135, 0x2ca, 0x242, 0x26c, 0x137, 0x2ac, 0x5a, 0x215, 0x11e, 0x16e, 0xec, 0x250, 0x13a, 0x3cb, 0x11d, 0x13b, 0x3f8, 0x11, 0x303, 0x1e8, 0x1f0, 0x358, 0x3ce, 0x1e2, 0xe, 0x132, 0x253, 0x16f, 0xdf, 0x35c, 0x302, 0x1db, 0xfc, 0x160, 0x1de, 0x3, 0x55, 0x314, 0x241, 0x239, 0x223, 0xed, 0x263, 0x36, 0x1f3, 0x30d, 0xda, 0x3a3, 0x237, 0x311, 0x2be, 0x30c, 0xe9, 0x2af, 0xf, 0x101, 0x35f, 0x357, 0x2cf, 0x2bd, 0x359, 0x3fd, 0xee, 0x236, 0x322, 0x3b2, 0x134, 0x2f9, 0x34e, 0x54, 0x327, 0x34d, 0x1, 0x33, 0x10c, 0x238, 0x210, 0x1e1, 0x5b, 0x226, 0x12, 0x356, 0x2fc, 0x3b1, 0x161, 0x1ed, 0x10f, 0x26d, 0x104, 0x3a0, 0x262, 0x5, 0xff, 0x135, 0x2ca, 0x242, 0x26c, 0x137, 0x2ac, 0x5a, 0x66, 0x39, 0x1e4, 0x148, 0x57, 0x2ed, 0x164, 0x224, 0xe8, 0x131, 0x5, 0x1fe, 0xdd, 0x27d, 0x61, 0x10b, 0x14b, 0xfd, 0x2a6, 0x348, 0x1fc, 0x11, 0x20f, 0x3a9, 0x39b, 0x1e5, 0x12e, 0x6e, 0x309, 0x2c, 0x273, 0x205, 0x55, 0x221, 0x116, 0x1ec, 0x278, 0x19f, 0x1d6, 0x336, 0x9c, 0x3ad, 0x203, 0x101, 0x2b7, 0x147, 0x255, 0x38a, 0x3ea, 0x287, 0x3f5, 0x2ec, 0x102, 0x21d, 0x10c, 0x79, 0x52, 0x313, 0x1b9, 0x59, 0x89, 0x3a, 0x14e, 0x103, 0x27b, 0x135, 0x19d, 0x11a, 0x344, 0x354, 0x13d, 0x2ad, 0xd2, 0x7f, 0x106, 0x385, 0x1e8, 0x3e0, 0x17b, 0x24f, 0x21f, 0x1c0, 0xb, 0x39a, 0x183, 0x117, 0x18a, 0x241, 0x7b, 0x9e, 0x361, 0x271, 0x2c9, 0x27, 0x1e9, 0x386, 0x142, 0x3ab, 0x357, 0x197, 0x2e6, 0x2fe, 0x3a7, 0x1ff, 0xbb, 0x244, 0x185, 0x43, 0x11c, 0x210, 0x3c2, 0x16c, 0x114, 0x120, 0x20a, 0x257, 0x346, 0x398, 0x14f, 0x165, 0xcc, 0xe4, 0x33b, 0xad, 0x2f2, 0x21e, 0x34c, 0xc8, 0x3d4, 0xab, 0x5a, 0x46, 0x1c4, 0x326, 0x1e3, 0xf4, 0x3e0, 0x2f6, 0x12e, 0xdc, 0x3f, 0x160, 0x371, 0x30, 0x16d, 0x2e4, 0x6d, 0x34f, 0x19c, 0x2f8, 0x1ef, 0x1ad, 0x359, 0x3ef, 0x2fb, 0xbb, 0x81, 0x21d, 0x218, 0x1e4, 0x290, 0x15c, 0x345, 0x26d, 0x19, 0x27e, 0x196, 0x109, 0x30e, 0x23c, 0x362, 0x1bf, 0x21a, 0x7c, 0x358, 0x323, 0x21f, 0x380, 0x2c, 0xef, 0x6, 0x2a8, 0x258, 0x288, 0x3ee, 0x237, 0x5f, 0x3ba, 0x2b0, 0xea, 0x3fa, 0x1dc, 0x194, 0x91, 0x2c6, 0x43, 0x238, 0x52, 0x22f, 0x2ed, 0x2c8, 0x82, 0x349, 0x334, 0xa0, 0x367, 0x243, 0x16e, 0x3b0, 0x141, 0x20b, 0x6b, 0x1e7, 0x3c4, 0x70, 0x201, 0x39a, 0x306, 0x55, 0x4b, 0x51, 0x37b, 0x3c1, 0x38c, 0x175, 0x56, 0x11f, 0x17d, 0x23f, 0x236, 0x93, 0x35e, 0x18b, 0x47, 0x108, 0x3c2, 0x2d8, 0x59, 0x112, 0xe8, 0x198, 0x390, 0x1ee, 0x2c2, 0x2ef, 0x2a9, 0x121, 0x1a2, 0x2a1, 0x1fa, 0x11d, 0x1ca, 0x3c7, 0x248, 0xaf, 0x2dd, 0x343, 0x18a, 0x116, 0x3b9, 0x3c1, 0x311, 0x1dd, 0x2b0, 0x1d4, 0x3f3, 0x2fb, 0x176, 0x204, 0xcc, 0x1c8, 0xf7, 0x161, 0x373, 0x350, 0x294, 0xd1, 0x354, 0xfd, 0x28a, 0xe5, 0x3e7, 0x124, 0x253, 0x36a, 0x3a5, 0xc5, 0x8b, 0x3d8, 0x3e4, 0x38c, 0x2ea, 0x158, 0xea, 0x3fd, 0x379, 0xbb, 0x102, 0x66, 0xe4, 0x27f, 0x2b4, 0x3bd, 0x1a8, 0x14a, 0x26c, 0x1aa, 0x27a, 0x145, 0x276, 0x3f7, 0x92, 0x32d, 0x1b5, 0x3d6, 0x266, 0x241, 0x1ec, 0x1f2, 0x1c6, 0x175, 0xac, 0x75, 0x3fa, 0x3b8, 0x259, 0x81, 0x33, 0x72, 0x33b, 0x15a, 0x3da, 0xd4, 0xa5, 0x136, 0xd5, 0x13d, 0x2a6, 0x13b, 0x3ff, 0x49, 0x392, 0x2de, 0x1eb, 0x133, 0x324, 0xf6, 0xf9, 0xe3, 0x2be, 0x56, 0x23e, 0x1fd, 0x1dc, 0x328, 0x244, 0x21d, 0x39, 0x399, 0xad, 0x330, 0x25b, 0x36b, 0x73, 0x14f, 0x33a, 0x184, 0x128, 0x1c2, 0x231, 0x3ce, 0x21f, 0x21b, 0x2c0, 0x3be, 0x209, 0x3c5, 0x2f0, 0x203, 0x1a, 0xb3, 0x3b2, 0x364, 0x47, 0x29, 0x57, 0x345, 0x1a6, 0x190, 0x29f, 0x14d, 0x153, 0x13b, 0x3f7, 0x124, 0xaf, 0x1b3, 0x117, 0x4b, 0x144, 0x3d5, 0x19c, 0x3f2, 0x2cf, 0x38a, 0x36f, 0xa8, 0x31, 0x28d, 0x48, 0x1d, 0x131, 0x28, 0x367, 0x11e, 0x2cd, 0x1e3, 0x3d0, 0x277, 0xd7, 0x13, 0x235, 0x315, 0x361, 0x3ac, 0x30c, 0x28b, 0x2fa, 0x1dc, 0x259, 0x102, 0xcc, 0x390, 0x3dc, 0x31a, 0x355, 0x2ca, 0x61, 0x4a, 0x274, 0x18e, 0x2f7, 0x381, 0x380, 0xb0, 0x2eb, 0x180, 0x1f3, 0xbc, 0x386, 0x202, 0x32a, 0x2e8, 0xd9, 0x317, 0x108, 0x313, 0x1d3, 0x26d, 0x64, 0x3a1, 0x151, 0x352, 0x348, 0x3fb, 0x49, 0x32d, 0x36a, 0x343, 0x314, 0x51, 0x1f7, 0x67, 0x2f8, 0x3b5, 0x2e6, 0x3dd, 0x2a, 0x10e, 0x1a1, 0x269, 0x17e, 0x36e, 0x339, 0x1ba, 0x32b, 0x3b0, 0x21a, 0x3e0, 0x39d, 0x302, 0x31e, 0x315, 0x2cb, 0x2ab, 0x56, 0xea, 0x3ef, 0x3f5, 0x293, 0x40, 0x356, 0x32f, 0x206, 0x3eb, 0x243, 0x362, 0x1e3, 0x3a9, 0x1ce, 0x2b1, 0x130, 0x239, 0xf9, 0x38c, 0x3ba, 0x1ad, 0x2fe, 0x20e, 0x87, 0x1a1, 0x24, 0x1d, 0x262, 0xa0, 0x30e, 0x1c4, 0x106, 0x2e, 0x3aa, 0x37c, 0x133, 0x8b, 0x37b, 0x237, 0x2f8, 0x363, 0x38a, 0x2d7, 0x2a0, 0x188, 0x8a, 0x112, 0x349, 0x196, 0x5a, 0x230, 0x1fc, 0x110, 0x392, 0x36a, 0x28f, 0x4b, 0x288, 0x34f, 0xfb, 0x357, 0x146, 0x378, 0x85, 0x17a, 0x2d8, 0x2c8, 0x19, 0x3d4, 0x151, 0x2ad, 0x13b, 0x3e7, 0x99, 0x171, 0x306, 0x2a8, 0x2e4, 0x368, 0x254, 0x2b7, 0x5d, 0x134, 0x38f, 0x108, 0x22f, 0x345, 0x34c, 0x249, 0xd5, 0xfd, 0x23a, 0x24b, 0xe, 0x201, 0xef, 0x30, 0x37a, 0x5e, 0x386, 0xd, 0xb3, 0x36d, 0x18b, 0xdb, 0x1f1, 0x346, 0x3fc, 0x325, 0x362, 0x3c6, 0x2bf, 0x26b, 0x34a, 0x241, 0x37b, 0x67, 0x3f2, 0x32e, 0xde, 0x246, 0x17a, 0x1b9, 0x332, 0xc8, 0x137, 0x27a, 0x23a, 0x9f, 0x38, 0x2c, 0x2eb, 0x209, 0x30f, 0x353, 0x1e0, 0x236, 0x122, 0x66, 0x329, 0x2df, 0x398, 0x1ba, 0x25f, 0x2db, 0xf4, 0x277, 0x35c, 0x130, 0x7b, 0x3e4, 0x5f, 0x3de, 0x1c5, 0x2d7, 0x149, 0x229, 0x59, 0x104, 0x1ea, 0x151, 0x153, 0xe5, 0x307, 0x182, 0x273, 0x30, 0x2fd, 0x178, 0xf, 0xd0, 0x24d, 0x2c6, 0x39, 0xf7, 0x31a, 0x14f, 0xf3, 0x76, 0x282, 0x1f0, 0x39d, 0x20d, 0x63, 0x9e, 0xe3, 0x1dd, 0x1ad, 0x1f5, 0x2a, 0x31, 0x226, 0x89, 0x349, 0x32c, 0x168, 0x1a4, 0x3ff, 0x248, 0x171, 0x205, 0x2b2, 0x30d, 0x2e5, 0x202, 0xb3, 0x2d3, 0x225, 0x1e4, 0x15a, 0x2ef, 0x165, 0xc2, 0x250, 0x20b, 0x2b9, 0xb1, 0x365, 0x1c7, 0x361, 0x2ab, 0xac, 0x3a8, 0x347, 0x1b6, 0x3cd, 0x206, 0x3b7, 0x71, 0x106, 0xb8, 0x2de, 0x28f, 0x12c, 0xda, 0x254, 0x2ce, 0x1d9, 0x18b, 0xf2, 0x15a, 0x1d7, 0x19d, 0x219, 0x141, 0x1f0, 0x333, 0x26, 0x318, 0x1f2, 0x5f, 0x3b5, 0x31d, 0x295, 0xbd, 0x1b9, 0x26d, 0x320, 0x1aa, 0x3e1, 0x3d9, 0x381, 0x3f, 0x53, 0xcf, 0x265, 0x28b, 0x3fd, 0x3f5, 0x25e, 0x9, 0x1d, 0x19a, 0x212, 0x230, 0x3f9, 0x124, 0x171, 0x3, 0x2da, 0x5e, 0x203, 0xd0, 0x93, 0x30a, 0x1c8, 0x36b, 0x398, 0x374, 0x16e, 0x2f5, 0x35b, 0x26b, 0x29d, 0x116, 0x3ee, 0x279, 0x2a7, 0x222, 0x3c3, 0x210, 0x15c, 0x6a, 0x121, 0x216, 0xe1, 0xd6, 0x12e, 0x3b6, 0x1c7, 0x2cb, 0x2be, 0x169, 0x2fe, 0x2a, 0x62, 0x8a, 0x41, 0xf5, 0x151, 0x2a6, 0x394, 0xe, 0x16, 0x2eb, 0x1b, 0x27, 0x2ae, 0x23f, 0x259, 0x2, 0x36c, 0x393, 0x5, 0x367, 0xe2, 0x20c, 0x170, 0x1b5, 0x117, 0x258, 0x1b4, 0xa1, 0x195, 0x36c, 0x32f, 0x14, 0x30e, 0x23b, 0x110, 0xaf, 0x306, 0x16d, 0x5e, 0xf, 0x340, 0x91, 0xcc, 0x17e, 0x346, 0x3eb, 0x23c, 0x106, 0x170, 0x36a, 0x55, 0x2e4, 0x376, 0xd, 0x191, 0x2c6, 0xe4, 0x36b, 0x339, 0x1cb, 0x362, 0x303, 0x3aa, 0x3d6, 0x4b, 0x6d, 0x254, 0x195, 0x36d, 0x43, 0x33b, 0x31a, 0x135, 0x32b, 0x1bf, 0x3a9, 0x26b, 0x133, 0x51, 0x34f, 0x3d1, 0x5d, 0x1b2, 0x238, 0xad, 0x1d7, 0x33a, 0x76, 0x21a, 0x33f, 0x2b1, 0x192, 0x37b, 0x19c, 0x357, 0x222, 0x38f, 0x52, 0x2f2, 0x2a9, 0x61, 0xa9, 0x7c, 0x39d, 0x26, 0x239, 0x3c1, 0x2f8, 0x32e, 0x378, 0x21, 0x22f, 0x21e, 0x294, 0x216, 0x1c2, 0x358, 0x162, 0x31e, 0x9e, 0x38c, 0x1ef, 0x38a, 0x295, 0x17a, 0x2ed, 0x34c, 0x26c, 0x125, 0x18e, 0x323, 0x2e9, 0x2e7, 0x2cb, 0x175, 0x1ad, 0x3dd, 0x2a0, 0x5b, 0x2c8, 0xc8, 0xd5, 0x3e1, 0x3bb, 0x21f, 0x1f8, 0x139, 0x1d6, 0x56, 0x2d1, 0xa7, 0xa0, 0x8c, 0x3f9, 0x99, 0x33d, 0xc0, 0x30f, 0x2ae, 0xee, 0x1d1, 0x80, 0x20a, 0x334, 0xb4, 0x299, 0x307, 0xb, 0x1df, 0xd8, 0xe9, 0x1fd, 0x3f5, 0x16a, 0x90, 0x349, 0x156, 0x2a6, 0x24b, 0xe0, 0x189, 0x263, 0xc3, 0x75, 0x347, 0x10e, 0x45, 0x82, 0x3a1, 0x27a, 0x1f4, 0x381, 0xfc, 0x139, 0x3ac, 0x158, 0x2fe, 0xa8, 0x229, 0x2c8, 0x190, 0x354, 0x337, 0x3ce, 0x370, 0x2e7, 0x19f, 0x1dd, 0x173, 0x1a7, 0xbd, 0x2ed, 0x291, 0x1a2, 0x13a, 0xd6, 0xb1, 0x31e, 0x13c, 0x22b, 0x363, 0xde, 0x214, 0x22f, 0x35, 0x242, 0x94, 0x1f, 0x3ca, 0x26, 0x7b, 0x31f, 0x3ed, 0x28c, 0x3c3, 0x52, 0x1ed, 0x2b6, 0x308, 0x282, 0x39b, 0x2b1, 0x324, 0x1f7, 0xfb, 0x115, 0xd9, 0x238, 0x15a, 0x355, 0x1e6, 0x369, 0x3d0, 0x26b, 0x266, 0x144, 0x24e, 0x167, 0x3b2, 0x43, 0x27f, 0x73, 0x1ba, 0x2dc, 0x385, 0x3aa, 0x3a5, 0x12c, 0x368, 0x1ab, 0x29c, 0x109, 0xd2, 0x3c7, 0x201, 0x1df, 0x1b0, 0x3a4, 0x3f3, 0x327, 0x113, 0x41, 0x3a1, 0xfd, 0x3d9, 0x37, 0x3db, 0x361, 0x2ea, 0x173, 0x34e, 0x2f4, 0x345, 0x14a, 0x25, 0x20b, 0x3ca, 0x4c, 0x1ec, 0xce, 0x2a7, 0x134, 0x11c, 0x15a, 0x2a3, 0x391, 0x37e, 0x177, 0x1eb, 0x96, 0x368, 0x202, 0x322, 0x21d, 0xbf, 0x285, 0x367, 0x319, 0x220, 0x171, 0x18, 0x3c5, 0x157, 0xee, 0x3a2, 0x200, 0x74, 0x32c, 0x2ad, 0x321, 0xe0, 0x312, 0x19e, 0x211, 0x359, 0x2a, 0x310, 0x2c8, 0x320, 0x14b, 0x18e, 0x97, 0x2c3, 0x9e, 0x22b, 0x2cf, 0x378, 0x84, 0x2b8, 0x2a9, 0x184, 0x282, 0x33f, 0x2d6, 0x116, 0x34f, 0x35f, 0x1d9, 0x43, 0xf7, 0x1cc, 0x1cb, 0x193, 0x5c, 0x36a, 0x154, 0x213, 0xf, 0x11b, 0x102, 0x36c, 0xa7, 0x140, 0x230, 0x3f7, 0x182, 0x371, 0x6c, 0xe9, 0x3fa, 0x3cf, 0x342, 0x112, 0x1ea, 0x13d, 0x1f4, 0x30b, 0x3f0, 0x1da, 0x356, 0x262, 0x5a, 0x13b, 0xe, 0x160, 0x263, 0x30c, 0x359, 0x54, 0x5b, 0x26d, 0x26c, 0x13a, 0x358, 0x302, 0x239, 0x237, 0x357, 0x134, 0x238, 0x161, 0x135, 0x16e, 0x303, 0x16f, 0x55, 0x30d, 0xf, 0x236, 0x1, 0x356, 0x262, 0x5a, 0x13b, 0xe, 0x160, 0x263, 0x30c, 0x359, 0x54, 0x5b, 0x26d, 0x26c, 0x13a, 0x358, 0x302, 0x239, 0x237, 0x357, 0x134, 0x238, 0x161, 0x135, 0x16e, 0x303, 0x16f, 0x55, 0x30d, 0xf, 0x236, 0x1, 0x356, 0x262, 0x5a, 0x13b, 0xe, 0x160, 0x263, 0x30c, 0x359, 0x54, 0x5b, 0x26d, 0x26c, 0x13a, 0x358, 0x302, 0x239, 0x237, 0x357, 0x134, 0x238, 0x161, 0x135, 0x16e, 0x303, 0x16f, 0x55, 0x30d, 0xf, 0x236, 0x1, 0x356, 0x262, 0x5a, 0x13b, 0xe, 0x160, 0x263, 0x30c, 0x359, 0x54, 0x5b, 0x26d, 0x26c, 0x13a, 0x358, 0x302, 0x239, 0x237, 0x357, 0x134, 0x238, 0x161, 0x135, 0x16e, 0x303, 0x16f, 0x55, 0x2a5, 0x19a, 0x2d0, 0x394, 0x1c0, 0xa6, 0x3ac, 0x2d2, 0x2d7, 0x2f4, 0x10f, 0x8d, 0x152, 0x39b, 0x1a5, 0xa2, 0x12a, 0xb3, 0x185, 0xbf, 0x206, 0x215, 0x3f9, 0xc1, 0x2eb, 0x360, 0x11f, 0x287, 0xc4, 0x2c8, 0x9b, 0x9d, 0x358, 0x20d, 0xf6, 0x19c, 0x115, 0x2c1, 0x33b, 0x1cc, 0x325, 0x106, 0x32d, 0x3, 0x3e6, 0x2ae, 0x379, 0xb5, 0x240, 0x1ea, 0xfd, 0x37f, 0x370, 0x315, 0x311, 0x197, 0x3f6, 0xa4, 0x2ef, 0x1e6, 0x37e, 0x1d5, 0x28f, 0x1c1, 0x203, 0x236, 0x2, 0x143, 0x334, 0x1a9, 0x321, 0x380, 0x14c, 0x351, 0x1ad, 0x1a7, 0x1e1, 0x21e, 0x11a, 0x2a4, 0x33f, 0x34a, 0x144, 0x254, 0x166, 0x30a, 0x17e, 0x5, 0x23, 0x3fb, 0x182, 0x1df, 0x2c9, 0x23e, 0x107, 0x188, 0x199, 0x136, 0x13a, 0x2b9, 0x13, 0x1ec, 0x338, 0x22a, 0x18b, 0x27f, 0x398, 0x243, 0x20c, 0x253, 0x6, 0x3c5, 0x155, 0x2fb, 0x16a, 0x89, 0x3d4, 0x1fa, 0x2f7, 0x2e9, 0x143, 0x261, 0x2ad, 0x13e, 0x7e, 0x1da, 0x1dd, 0x31d, 0x21, 0x179, 0x2ca, 0x3b0, 0x2bf, 0x3a5, 0x2e4, 0x203, 0x65, 0x8, 0x20a, 0x32c, 0x145, 0x1e2, 0x3f0, 0x2cb, 0x2f3, 0xde, 0x108, 0x3da, 0x27d, 0x1bf, 0x1d5, 0x117, 0x30d, 0x3c, 0x328, 0x40, 0x74, 0x156, 0x23a, 0x30b, 0x3bf, 0x275, 0x3b5, 0x2f9, 0x52, 0x2ef, 0x3cc, 0x1e3, 0x2b3, 0xaa, 0x5e, 0x1e0, 0x176, 0x200, 0x3a0, 0x2a2, 0x1f4, 0x6e, 0x1c7, 0x38c, 0x197, 0x3e5, 0x290, 0x355, 0x25f, 0x303, 0x1b5, 0x159, 0x2f0, 0x31b, 0x3a2, 0x24, 0x13f, 0x13d, 0x3bb, 0x370, 0x223, 0x5f, 0xa3, 0x317, 0xad, 0x29e, 0x2dc, 0x2e, 0x1b3, 0x2da, 0x3ad, 0xee, 0x12f, 0x120, 0x1ea, 0x1fa, 0x1e7, 0x3b6, 0x13c, 0x2f8, 0x111, 0x8e, 0x161, 0xdd, 0x2cd, 0x170, 0x183, 0x2fd, 0x157, 0x379, 0x16a, 0x112, 0x34b, 0x3cb, 0x323, 0x18f, 0x1f2, 0x3ed, 0x9a, 0x79, 0x31a, 0x2e1, 0x245, 0x392, 0x286, 0x196, 0x145, 0x3c4, 0x3db, 0x275, 0x363, 0x3f6, 0x290, 0x2a3, 0x16e, 0x2e, 0x366, 0x37a, 0x157, 0x2fb, 0x1a1, 0x82, 0xd5, 0x18e, 0x162, 0x239, 0x19c, 0x5d, 0x43, 0x36b, 0x3eb, 0x23b, 0x99, 0x371, 0x2c9, 0xea, 0x54, 0x2d8, 0x256, 0x94, 0x3e0, 0x1a5, 0x288, 0x284, 0x93, 0x269, 0x14e, 0x5a, 0x1ca, 0x380, 0x139, 0x175, 0x38a, 0x21, 0x2f2, 0x33a, 0x1bf, 0x3aa, 0x55, 0x5e, 0x3c0, 0x1d1, 0x24, 0x27e, 0xfd, 0x1e7, 0x365, 0xf9, 0x3ed, 0x134, 0x1e4, 0xe6, 0x243, 0x22, 0x171, 0x180, 0x270, 0x3ef, 0x31, 0x2c8, 0x26c, 0x1c2, 0x39d, 0x192, 0x34f, 0x195, 0x2c6, 0x17e, 0x14, 0x230, 0x307, 0x160, 0x33c, 0x2b0, 0x2d7, 0x3c2, 0xd4, 0x308, 0xf4, 0x37c, 0x258, 0x386, 0x236, 0x8, 0x1d, 0xab, 0x23a, 0x21f, 0x2e7, 0x38c, 0x32e, 0x38f, 0xad, 0x135, 0x362, 0x170, 0x306, 0x3e6, 0x2aa, 0x3f5, 0x113, 0x19, 0x2a1, 0x6b, 0x105, 0x251, 0x23a, 0x37, 0x38e, 0x5f, 0x28c, 0x11c, 0x31a, 0x396, 0x11, 0x171, 0x300, 0x1d2, 0x347, 0x310, 0x1a6, 0x216, 0xf8, 0x2d6, 0x288, 0x101, 0x24c, 0x36c, 0xcd, 0x352, 0x27c, 0x3f0, 0x33e, 0x363, 0x3e5, 0x252, 0x135, 0x2cd, 0x1c9, 0x6, 0x217, 0x1fd, 0x87, 0xb2, 0x136, 0x1c2, 0x333, 0x241, 0x24e, 0x166, 0x66, 0x32f, 0x212, 0xe5, 0x380, 0x272, 0x1dd, 0x6f, 0x210, 0x2ef, 0x32b, 0x20f, 0x1b3, 0x37a, 0x2ae, 0x3fe, 0x113, 0x32, 0x296, 0x358, 0x4c, 0x1f7, 0x2b7, 0x2b5, 0xbf, 0x14, 0x69, 0x7, 0x312, 0x3ac, 0x2bd, 0x85, 0x2b8, 0x19d, 0x1bf, 0x35d, 0x154, 0x2f0, 0x77, 0x25e, 0x112, 0x137, 0xc7, 0x162, 0x7b, 0x279, 0x2e8, 0x39, 0x1a3, 0x30e, 0x3ff, 0x16, 0x263, 0xac, 0x36f, 0x3c2, 0x1a8, 0x3b, 0x3a9, 0x3a5, 0x382, 0x78, 0x176, 0x12, 0x27e, 0x1fa, 0x395, 0x31e, 0x38b, 0x147, 0x18b, 0x3dc, 0x3f1, 0x23b, 0x20a, 0x156, 0x1f4, 0x370, 0x13c, 0x3ed, 0xd9, 0x27f, 0x1fe, 0x319, 0x132, 0x3be, 0x186, 0x1f5, 0x17a, 0x6a, 0x219, 0x3a9, 0x343, 0x213, 0x3c0, 0x34d, 0x240, 0x29f, 0xc7, 0x2c4, 0x1ec, 0x3ec, 0x2d3, 0x329, 0xa, 0x69, 0xe, 0x53, 0x15f, 0x38a, 0x84, 0x373, 0x32b, 0x17, 0x2c5, 0x3e6, 0x2ba, 0x327, 0x59, 0x136, 0x384, 0xd7, 0x22c, 0xa1, 0x93, 0x1b6, 0xcd, 0x2ad, 0x1e2, 0x3bf, 0x38c, 0xa3, 0x8e, 0x31a, 0x325, 0x44, 0x39a, 0x6c, 0x23e, 0x54, 0x372, 0x121, 0x141, 0x331, 0x96, 0x386, 0xca, 0x80, 0x349, 0x27a, 0x3ce, 0x31e, 0x31f, 0x115, 0x43, 0x1b7, 0x2c7, 0x3fb, 0x16, 0xcf, 0x2b0, 0x34e, 0x57, 0x165, 0x2db, 0x35d, 0x2a8, 0x3d2, 0x3b8, 0x1a1, 0x208, 0x14b, 0x358, 0x98, 0x3d5, 0x195, 0x30a, 0x3cd, 0x109, 0xe5, 0x309, 0x1da, 0x2f3, 0x2f9, 0x290, 0x29e, 0x2cd, 0x392, 0x18, 0x9c, 0x3ef, 0xc4, 0xd3, 0x216, 0x1d, 0x151, 0x3bb, 0x365, 0x3c1, 0x28e, 0x43, 0x36e, 0x30e, 0x3e7, 0x160, 0x1d6, 0x173, 0x21, 0x3bd, 0x32b, 0x2e, 0x306, 0x30f, 0x3fa, 0x31, 0x26d, 0x216, 0x3e0, 0x133, 0x368, 0x340, 0x8, 0xe8, 0x29a, 0x1e7, 0x31e, 0x237, 0x5d, 0x218, 0x346, 0x46, 0x307, 0x312, 0x2ab, 0x38a, 0x108, 0x1d7, 0x16e, 0x170, 0x6, 0x4e, 0x3ef, 0x188, 0x34c, 0x94, 0x33f, 0x18a, 0x376, 0x236, 0x40, 0x349, 0xfd, 0x323, 0xc6, 0x19c, 0x2e8, 0xe4, 0x206, 0x230, 0xe, 0xa6, 0x175, 0x6f, 0x52, 0x2a3, 0x362, 0x392, 0x30, 0x270, 0x347, 0x5b, 0x256, 0xa9, 0x1ce, 0x4b, 0x386, 0x194, 0x200, 0x27e, 0x3e1, 0x12e, 0x239, 0xfb, 0x36d, 0x329, 0x14, 0x1a4, 0x70, 0x139, 0x3ba, 0x378, 0x290, 0x135, 0x326, 0xaf, 0x180, 0x3a4, 0x20e, 0x2d8, 0x294, 0x141, 0x26b, 0x258, 0xf, 0xbb, 0x24, 0x3d4, 0x337, 0x162, 0x1ec, 0x3d1, 0x35e, 0x17e, 0xa0, 0x3a, 0x14d, 0x1e7, 0x235, 0xce, 0x2e8, 0x1c8, 0xa, 0x1a4, 0xe0, 0xed, 0x1ef, 0x3e5, 0x2b4, 0x1cb, 0x44, 0x273, 0x2c9, 0x2bb, 0xbd, 0xd4, 0xec, 0x1d5, 0x2a8, 0x353, 0x3fe, 0x8a, 0x9b, 0x301, 0x2b1, 0x119, 0x34, 0x1, 0x3a, 0x14d, 0x1e7, 0x235, 0xce, 0x2e8, 0x1c8, 0xa, 0x1a4, 0xe0, 0xed, 0x1ef, 0x3e5, 0x2b4, 0x1cb, 0x44, 0x273, 0x2c9, 0x2bb, 0xbd, 0xd4, 0xec, 0x1d5, 0x2a8, 0x353, 0x3fe, 0x8a, 0x9b, 0x301, 0x2b1, 0x119, 0x34, 0x1, 0x3a, 0x14d, 0x1e7, 0x235, 0xce, 0x2e8, 0x1c8, 0xa, 0x1a4, 0xe0, 0xed, 0x1ef, 0x3e5, 0x2b4, 0x1cb, 0x44, 0x273, 0x2c9, 0x2bb, 0xbd, 0xd4, 0xec, 0x1d5, 0x2a8, 0x353, 0x3fe, 0x8a, 0x9b, 0x301, 0x2b1, 0x119, 0x34, 0x1, 0x3a, 0x14d, 0x1e7, 0x235, 0xce, 0x2e8, 0x1c8, 0xa, 0x1a4, 0xe0, 0xed, 0x1ef, 0x3e5, 0x2b4, 0x1cb, 0x44, 0x273, 0x2c9, 0x2bb, 0xbd, 0xd4, 0x74, 0x13d, 0x323, 0x318, 0x1f6, 0x35e, 0x1f1, 0x212, 0x24b, 0x3e9, 0x311, 0x222, 0x399, 0x3fc, 0x1fc, 0x16, 0x271, 0x173, 0x84, 0x3ae, 0x362, 0x253, 0x300, 0x11f, 0x150, 0x283, 0x308, 0x2bf, 0xaa, 0x3ad, 0x3fe, 0x114, 0x26c, 0x3e, 0x34a, 0x368, 0x11b, 0x80, 0x27e, 0x39f, 0x2c4, 0x37b, 0x2ce, 0x33, 0x14e, 0x352, 0x381, 0x315, 0x3f2, 0x364, 0x36b, 0x187, 0x3c7, 0x312, 0x2be, 0xde, 0x290, 0xdd, 0x20c, 0x39a, 0x360, 0x2bb, 0x17a, 0x350, 0x369, 0x16f, 0x1bd, 0x15d, 0x87, 0x332, 0x25, 0x33f, 0x221, 0x305, 0xbb, 0x90, 0x137, 0x6b, 0x98, 0x297, 0x191, 0x1b6, 0x261, 0x23a, 0x370, 0x1f2, 0x28e, 0x10c, 0x285, 0x230, 0x38, 0x272, 0x1ef, 0x3c3, 0x2c2, 0x243, 0x49, 0x2eb, 0x30c, 0x36f, 0x57, 0x33a, 0x385, 0x2c5, 0x30f, 0x3f3, 0x310, 0x256, 0x2a4, 0xdf, 0x2e4, 0x1e0, 0x12f, 0x82, 0x296, 0x1e5, 0x8b, 0x142, 0x122, 0x286, 0xe8, 0xfd, 0x12e, 0x1ec, 0x2b7, 0x21d, 0x14e, 0x2ad, 0x21f, 0x9e, 0x357, 0x43, 0x346, 0x230, 0x70, 0x1da, 0x363, 0x47, 0xe6, 0x1c4, 0xc1, 0x263, 0x1ad, 0x21, 0x1d7, 0x362, 0xaf, 0x1b, 0xea, 0x12d, 0xd4, 0x3b0, 0x16f, 0x37a, 0x17d, 0x31, 0x34c, 0xa9, 0x26b, 0x2e4, 0x3c0, 0xb5, 0x19, 0x13a, 0xd7, 0x288, 0x68, 0x8, 0x349, 0x3e1, 0x162, 0x37b, 0x195, 0xcc, 0x262, 0x145, 0xdc, 0xf9, 0x28e, 0x218, 0x206, 0x1a4, 0x380, 0x2cb, 0x32e, 0x238, 0x339, 0x23b, 0x201, 0x33c, 0x173, 0x108, 0x2a3, 0x326, 0x171, 0xd8, 0x359, 0x17a, 0x2a9, 0x1bf, 0x36a, 0x3e6, 0x3fa, 0x188, 0x256, 0x141, 0x37c, 0x30d, 0x23f, 0x1a1, 0xc8, 0x1c2, 0x2b1, 0x6d, 0x340, 0x40, 0x27e, 0x337, 0x302, 0x3ee, 0xb3, 0x269, 0x334, 0x23a, 0x2e9, 0x3c1, 0x5d, 0xe4, 0x14, 0x13b, 0x3f, 0x275, 0x146, 0x1e4, 0x1fe, 0x1fc, 0x2c, 0x1d6, 0x38a, 0x52, 0x1d0, 0x3f4, 0x162, 0x2ff, 0x25d, 0x269, 0x261, 0xfa, 0x365, 0x67, 0x3b2, 0x17e, 0x212, 0x13e, 0x2e7, 0x1f9, 0x2c1, 0x36e, 0x8c, 0x38, 0x1da, 0x2cf, 0x11c, 0x339, 0x7f, 0x16, 0x1d6, 0x31d, 0x148, 0x1ba, 0x44, 0x3bc, 0x30c, 0x1a7, 0x179, 0x32b, 0x2e0, 0xc0, 0x11f, 0x149, 0x6a, 0x3b0, 0x2de, 0x1f3, 0x3fa, 0x310, 0x14a, 0x21a, 0x3a5, 0x178, 0x2fb, 0x114, 0x1a2, 0x3e0, 0x314, 0x203, 0x1d1, 0x224, 0x296, 0x39d, 0xa2, 0x34, 0x8, 0x29b, 0x39f, 0x302, 0x3d5, 0x2cc, 0x36c, 0x32c, 0x3d9, 0x31e, 0x338, 0x1af, 0x3e2, 0xb4, 0x1e2, 0x315, 0x3d3, 0x225, 0x346, 0x69, 0x1c0, 0x2cb, 0x255, 0xf2, 0x1fe, 0x3f8, 0xb0, 0x2ab, 0xde, 0x252, 0x1cb, 0x220, 0x1df, 0x56, 0x123, 0x3da, 0x16e, 0x32d, 0x209, 0xea, 0x25a, 0x350, 0x1bf, 0x2dd, 0x383, 0x3ef, 0xb6, 0x242, 0xf4, 0x117, 0x3d2, 0x3f5, 0xb2, 0x10b, 0x33f, 0x96, 0x3c, 0x293, 0x3a0, 0x3cb, 0x302, 0x3a3, 0x322, 0x356, 0x2ac, 0x3ce, 0x239, 0x35f, 0x33, 0x262, 0x11d, 0x1db, 0x237, 0x3b2, 0x2fc, 0x5a, 0x1e2, 0x223, 0x357, 0x10c, 0x5, 0x13b, 0xfc, 0x311, 0x134, 0x3b1, 0x215, 0xe, 0xed, 0x2cf, 0x238, 0xff, 0x3f8, 0x160, 0x2be, 0x2f9, 0x161, 0x11e, 0x132, 0x263, 0x2bd, 0x210, 0x135, 0x11, 0x1de, 0x30c, 0x34e, 0x1ed, 0x16e, 0x253, 0x36, 0x359, 0x1e1, 0x2ca, 0x303, 0x3, 0xe9, 0x54, 0x10f, 0xec, 0x16f, 0x1f3, 0x3fd, 0x5b, 0x242, 0x1e8, 0x55, 0x2af, 0x327, 0x26d, 0x250, 0xdf, 0x30d, 0xee, 0x226, 0x26c, 0x1f0, 0x314, 0xf, 0x34d, 0x104, 0x13a, 0x35c, 0xda, 0x236, 0x12, 0x137, 0x358, 0x241, 0x101, 0x1, 0x3a0, 0x3cb, 0x302, 0x3a3, 0x322, 0x356, 0x2ac, 0x3ce, 0x239, 0x35f, 0x33, 0x262, 0x11d, 0x1db, 0x237, 0x3b2, 0x2fc, 0x5a, 0x1e2, 0x223, 0x357, 0x10c, 0x5, 0x13b, 0xfc, 0x311, 0x134, 0x349, 0x337, 0x26, 0x24e, 0x91, 0x1d, 0xfd, 0x162, 0x3ee, 0x191, 0x356, 0x151, 0x323, 0x1ec, 0x195, 0x269, 0x196, 0x3bb, 0xc6, 0x3d1, 0x21d, 0x262, 0x23a, 0x365, 0x19c, 0x35e, 0x32f, 0x2ad, 0xdc, 0x3c1, 0x2e8, 0x17e, 0x5a, 0x3c4, 0x9e, 0x28e, 0xe4, 0xa0, 0x24b, 0x2e7, 0x3ed, 0x43, 0x206, 0x13b, 0x1f8, 0x5f, 0x1b2, 0x36e, 0x230, 0x380, 0x275, 0x222, 0x1ee, 0x30e, 0xe, 0x1da, 0x32e, 0x1e4, 0x3eb, 0x3e7, 0xa6, 0x1ef, 0x47, 0x339, 0x1fc, 0x160, 0x175, 0x3f6, 0x31a, 0x1c4, 0x201, 0x1d6, 0x6f, 0xad, 0x243, 0x99, 0x263, 0x173, 0x52, 0x1ba, 0x110, 0x3be, 0x2b0, 0x21, 0x2a3, 0x106, 0xef, 0x30c, 0x295, 0x3bd, 0x362, 0x171, 0x2c9, 0x3dd, 0x15c, 0x32b, 0x392, 0x1b, 0x359, 0x3c2, 0x33a, 0x2e, 0x30, 0x11f, 0x12d, 0x2a9, 0x1e3, 0x306, 0x270, 0x54, 0x21e, 0x3b0, 0x36a, 0x30f, 0x347, 0x2ed, 0x308, 0x3aa, 0x37a, 0x3fa, 0x29b, 0xc7, 0x130, 0xa1, 0x204, 0x349, 0x267, 0x98, 0x254, 0x102, 0x3a0, 0x337, 0x4c, 0x12a, 0x81, 0x1d0, 0x39f, 0x26, 0x95, 0x244, 0xe8, 0x3cb, 0x13, 0x24e, 0x122, 0x74, 0x3e1, 0x20d, 0x127, 0x91, 0x3a, 0x3f4, 0x302, 0x297, 0x24c, 0x1d, 0x1fa, 0x181, 0x34f, 0x126, 0x20a, 0xfd, 0x2c4, 0x3a3, 0x93, 0x105, 0x27a, 0x162, 0x3d5, 0x24d, 0x286, 0x13d, 0xb1, 0x3ee, 0x322, 0x143, 0x29a, 0x25c, 0x1f7, 0x191, 0x2a5, 0x14d, 0x12e, 0x2ff, 0x2cc, 0x356, 0x2a2, 0x97, 0x37b, 0x166, 0x1ab, 0x151, 0x24f, 0x3b9, 0xb3, 0x2d1, 0x2ac, 0x323, 0x3d8, 0x25d, 0x36c, 0x156, 0x395, 0x1ec, 0x32a, 0x1b6, 0xab, 0x3ce, 0xf6, 0x195, 0xdb, 0x251, 0x1e7, 0x7b, 0x2ce, 0x269, 0x32c, 0x2f7, 0x239, 0x167, 0x330, 0x196, 0x37f, 0x318, 0x2b7, 0x198, 0xcb, 0x3bb, 0x18c, 0x35f, 0xcc, 0x261, 0x3d9, 0xc6, 0x3ab, 0x66, 0x334, 0x3e8, 0x63, 0x3d1, 0x13f, 0x31c, 0x192, 0x202, 0x10, 0x3d4, 0x1ac, 0x116, 0x68, 0x100, 0x137, 0x2f6, 0x144, 0x289, 0x24, 0x354, 0x333, 0x6d, 0xca, 0x240, 0x125, 0x35c, 0x2d9, 0xbb, 0x41, 0x274, 0x1a5, 0x1c3, 0x3a2, 0x19, 0x301, 0x266, 0xf, 0x25e, 0x190, 0x7c, 0x221, 0xf0, 0x1a1, 0x136, 0x3c9, 0x258, 0x31b, 0x226, 0x344, 0xe7, 0x1c1, 0x1dc, 0x228, 0x25, 0x26b, 0x2f, 0x1ff, 0x2c8, 0x250, 0x2f1, 0x2f0, 0x3cf, 0xd3, 0x141, 0x343, 0x353, 0x87, 0x12b, 0x3d, 0x55, 0x155, 0x62, 0x294, 0x3d0, 0x159, 0x17d, 0x229, 0x11a, 0x177, 0x1bd, 0x3fd, 0x2d8, 0x184, 0x35d, 0x3e6, 0x3a7, 0x1d3, 0x76, 0x1b5, 0x217, 0x20e, 0x10f, 0x369, 0x366, 0x138, 0xa8, 0xd4, 0x2f5, 0x205, 0x3a4, 0x292, 0x15b, 0x303, 0x18, 0x23e, 0x17a, 0x19d, 0x5c, 0x180, 0x3a8, 0x38d, 0x1e6, 0x1c9, 0x36, 0x2fe, 0xae, 0x25f, 0xaf, 0x360, 0x3b3, 0x2f2, 0x1b1, 0x2e2, 0x265, 0x27e, 0x6b, 0x8b, 0x68, 0x200, 0xd5, 0x39d, 0x6d, 0x194, 0x112, 0x13a, 0x1a5, 0x386, 0x293, 0xc8, 0x7c, 0x4b, 0x3c0, 0x113, 0x344, 0x1ce, 0x30d, 0x2fb, 0x2c8, 0xa9, 0x3d6, 0x3ad, 0x87, 0x256, 0xf4, 0x2a8, 0x17d, 0x5b, 0x61, 0x3aa, 0x3e6, 0x347, 0x345, 0x3b0, 0x366, 0x270, 0x2a0, 0x2a9, 0x303, 0x30, 0xea, 0x3c2, 0x1e6, 0x392, 0xd8, 0x3dd, 0x2f2, 0x362, 0x39a, 0x30c, 0x85, 0x2a3, 0x22, 0x3be, 0x1ad, 0x52, 0x1cb, 0x99, 0x33c, 0x6f, 0x161, 0x1c4, 0x2c, 0x175, 0x38f, 0x339, 0x3fb, 0xa6, 0x363, 0x1e4, 0x367, 0xe, 0x2cb, 0x222, 0x36b, 0x230, 0x3f, 0x5f, 0x18b, 0x206, 0x1ca, 0x2e7, 0x357, 0xe4, 0x109, 0x3c4, 0xf9, 0x2e8, 0x3e2, 0x2ad, 0x2e9, 0x19c, 0x2c6, 0x262, 0x1f4, 0xc6, 0x2b7, 0x269, 0xab, 0x323, 0x37b, 0x191, 0x286, 0xfd, 0x302, 0x24e, 0x81, 0x349, 0x18e, 0x192, 0xd, 0x40, 0x29f, 0x2f6, 0x288, 0xf5, 0x1ac, 0x51, 0x289, 0x90, 0x125, 0x16b, 0x1c3, 0x293, 0x190, 0x1f0, 0x258, 0x77, 0x228, 0x94, 0x2f1, 0x3d2, 0x87, 0xa5, 0x3d0, 0x16d, 0x3fd, 0x372, 0x76, 0x2dd, 0x138, 0x2a0, 0x15b, 0x17, 0x180, 0x2bb, 0xae, 0x16e, 0x2e2, 0x186, 0x85, 0x14f, 0x88, 0x1cf, 0x2e6, 0x252, 0x23c, 0xb, 0x2be, 0x38f, 0x27b, 0x3f7, 0x139, 0x255, 0xf7, 0x46, 0x309, 0x22b, 0x18b, 0x5, 0x321, 0x315, 0x115, 0xbf, 0x2d0, 0x1b8, 0xce, 0x2c6, 0xcd, 0x3d9, 0x239, 0x32a, 0x1ab, 0x29a, 0x2c4, 0x127, 0x81, 0x29b, 0x231, 0x8b, 0xd0, 0x12, 0x2a1, 0x1ae, 0x1bb, 0x1d1, 0x32, 0x3e, 0x4b, 0x389, 0x45, 0x216, 0xdf, 0x178, 0x397, 0x291, 0x7a, 0x2a8, 0x2fa, 0x16c, 0x308, 0x2de, 0x27, 0x54, 0x1a8, 0x385, 0x30, 0x1d4, 0x313, 0x32b, 0x15e, 0x336, 0x295, 0x3ae, 0x11, 0x3be, 0x35a, 0x148, 0x243, 0x182, 0x351, 0x3f6, 0x1cc, 0x3f9, 0xa6, 0x1ea, 0x2b9, 0x288, 0xca, 0x224, 0x1c2, 0xc5, 0xf0, 0x113, 0x10b, 0xdf, 0x2f0, 0x247, 0xa5, 0x3a9, 0x1bd, 0x3d7, 0x345, 0x2db, 0x205, 0x11f, 0x1e1, 0x3cc, 0xaf, 0x336, 0x123, 0x2a3, 0x88, 0x39e, 0x38a, 0x2b4, 0x388, 0x160, 0x2f3, 0x79, 0x367, 0x38, 0xe3, 0x1b2, 0x103, 0x394, 0x315, 0x22a, 0x2fc, 0x2ad, 0x3b6, 0x1f6, 0xcc, 0x251, 0x24f, 0x3ee, 0x24c, 0x1d0, 0x18e, 0x241, 0xd0, 0x24, 0x296, 0x16b, 0x386, 0x25e, 0x9b, 0x33f, 0x382, 0x1ff, 0x26d, 0x10d, 0xaa, 0x17d, 0x16c, 0x219, 0x36a, 0x138, 0x149, 0x165, 0xb8, 0x36, 0x3dd, 0x3da, 0x245, 0x371, 0x2d2, 0xa4, 0x243, 0x304, 0x15f, 0x38f, 0xff, 0x3c7, 0x1da, 0x111, 0x2df, 0x1a4, 0x3e9, 0x3d3, 0xe4, 0x2d, 0x37, 0x237, 0x163, 0xcd, 0x3bb, 0xf6, 0x166, 0x286, 0x3f4, 0x4c, 0x284, 0x20, 0x137, 0x39d, 0x1b4, 0x176, 0x19, 0x3e, 0x96, 0x23f, 0x228, 0x128, 0x3d6, 0x3d4, 0x2f6, 0x6d, 0xbb, 0x19, 0x7c, 0x258, 0x1dc, 0x2c8, 0x141, 0x55, 0x17d, 0x2d8, 0x76, 0x366, 0x3a4, 0x17a, 0x1e6, 0xaf, 0x265, 0x85, 0x135, 0x92, 0x33c, 0x378, 0xe6, 0x3fb, 0x139, 0x146, 0x36b, 0x1a4, 0x3db, 0x357, 0x329, 0x2d0, 0x2e9, 0xfb, 0xcc, 0xab, 0x12e, 0x34f, 0x81, 0x27e, 0x358, 0x288, 0x194, 0x82, 0x20b, 0x4b, 0x23f, 0x59, 0xa9, 0x28f, 0x2aa, 0x5b, 0x308, 0x36a, 0x270, 0x12d, 0x33a, 0x392, 0x2c9, 0x295, 0x2a3, 0x110, 0x263, 0x6f, 0x31a, 0x1fc, 0xa6, 0x32e, 0x1ee, 0x230, 0x1f8, 0x3ed, 0xe4, 0x5a, 0xdc, 0x19c, 0x21d, 0x196, 0x323, 0x3ee, 0x91, 0x349, 0x6b, 0x51, 0x236, 0x112, 0x1c2, 0x18a, 0x3c0, 0x8a, 0x94, 0x3d6, 0x157, 0x188, 0x61, 0x16f, 0x4e, 0x2a0, 0x165, 0x170, 0xd8, 0x2d7, 0x1d7, 0x22, 0x1cf, 0x38a, 0x161, 0x23b, 0x312, 0x363, 0x33b, 0x46, 0x3f, 0x2f8, 0x218, 0x109, 0x21f, 0x3a1, 0x3ca, 0x368, 0x3a2, 0x320, 0x33f, 0x213, 0x3cf, 0x256, 0x35b, 0x1f3, 0x20e, 0x1a8, 0x17, 0x1b, 0x3b3, 0x2ef, 0x22, 0x39e, 0x233, 0x31a, 0x3f8, 0x298, 0x146, 0x2df, 0x299, 0x2e7, 0x115, 0x1f1, 0x145, 0x235, 0x2ce, 0x356, 0x1fa, 0x98, 0xd, 0x9, 0x296, 0x1a5, 0x1e, 0x28d, 0x216, 0x2f1, 0x2af, 0x188, 0xc2, 0x1b5, 0x270, 0x25a, 0xf3, 0xaf, 0xc3, 0x214, 0x1ba, 0x132, 0x351, 0x38f, 0x3fc, 0x7, 0x275, 0x364, 0xa, 0x27c, 0x1f2, 0x1af, 0x262, 0x37f, 0x3b9, 0x93, 0x1d0, 0x231, 0x51, 0x65, 0x41, 0x20b, 0x96, 0xee, 0x2c8, 0x282, 0x154, 0x3fa, 0x1d3, 0x2db, 0x6, 0x1d4, 0xae, 0x362, 0x1de, 0x2d2, 0x290, 0x71, 0xb0, 0x1ef, 0x3c8, 0x23, 0x3f, 0x1f9, 0x72, 0x5a, 0x1b8, 0x279, 0xcc, 0x156, 0xb1, 0x24e, 0x2, 0x34b, 0x39d, 0x2d9, 0x34d, 0x249, 0x277, 0x2f, 0x397, 0xa5, 0x2bf, 0x3e6, 0x15, 0x350, 0x2e, 0x34b, 0x333, 0x376, 0x25e, 0xd1, 0x26b, 0x3d2, 0x62, 0x61, 0x1b5, 0xe9, 0x17a, 0x391, 0x2e2, 0x56, 0x29, 0x8f, 0x2c, 0x2f3, 0x3c8, 0x46, 0xfc, 0x3d3, 0x329, 0x352, 0x2c3, 0x2b7, 0x1ab, 0x1fa, 0x130, 0x34, 0x48, 0x13a, 0xc5, 0x389, 0x59, 0x2a4, 0xaa, 0x3fa, 0x3a6, 0x37e, 0x30, 0x17f, 0x1ed, 0x106, 0x2e3, 0x31d, 0x31a, 0x3f9, 0x272, 0x222, 0x1a3, 0x394, 0x9e, 0x3b2, 0x29c, 0x3bb, 0x3b9, 0x126, 0x349, 0x1ac, 0x119, 0xbb, 0x64, 0x3c9, 0x30d, 0x3cf, 0xa5, 0x177, 0x383, 0xa8, 0x165, 0x1c9, 0x19b, 0x85, 0xdd, 0x132, 0x2ab, 0x227, 0x3df, 0x70, 0x22b, 0x86, 0x109, 0x6e, 0x338, 0xcc, 0x2ac, 0x2c4, 0x254, 0x20, 0x1aa, 0x2b1, 0x203, 0x342, 0x216, 0x1eb, 0x2ae, 0x5b, 0x3b, 0x2c5, 0x11f, 0x313, 0x2dc, 0xef, 0x2d2, 0x129, 0x1c4, 0x189, 0x2cf, 0x1ee, 0xd2, 0x3bf, 0x28e, 0x1f1, 0x28a, 0xc6, 0x25d, 0x105, 0x337, 0x29f, 0xd7, 0x386, 0x1a1, 0x216, 0x3d6, 0x2aa, 0x2d8, 0x3b0, 0x6, 0x359, 0x2f2, 0x106, 0x1cf, 0x6f, 0xe6, 0x3e7, 0x2cb, 0x1b2, 0x14, 0x3c4, 0x237, 0x21d, 0xab, 0x162, 0x254, 0x40, 0x2a1, 0x1a5, 0x78, 0x8a, 0xa9, 0x55, 0x3fa, 0x345, 0x1e3, 0x180, 0x3dd, 0x1d7, 0x110, 0x33c, 0x3f6, 0x1fe, 0xe, 0x38c, 0x43, 0x109, 0xdc, 0xfb, 0x269, 0x29a, 0x26, 0xd, 0x24, 0x13a, 0x18a, 0x23f, 0x2c8, 0x21a, 0x16d, 0x347, 0xd4, 0x2e, 0xd8, 0x295, 0x135, 0x99, 0x2ab, 0x47, 0x367, 0x380, 0x2f8, 0xe4, 0x2d0, 0x365, 0x2b7, 0x356, 0x3e1, 0x192, 0x340, 0x112, 0x20b, 0x258, 0x2fb, 0x34c, 0x3a9, 0x3e6, 0x54, 0x165, 0x392, 0x265, 0x21, 0x1cb, 0x201, 0x3ba, 0x1e4, 0x46, 0x1f8, 0x357, 0x17e, 0x145, 0xc6, 0xb3, 0x1d, 0x18e, 0x51, 0x194, 0x19, 0x3e0, 0x30d, 0x397, 0x294, 0x3aa, 0x4e, 0x12d, 0x1e6, 0x171, 0x56, 0x52, 0x23c, 0x137, 0x35c, 0xf, 0x226, 0x250, 0x55, 0x3fd, 0x10f, 0x303, 0x36, 0x34e, 0x135, 0x132, 0x2be, 0x238, 0x215, 0xfc, 0x357, 0x2fc, 0x11d, 0x239, 0x322, 0x3a0, 0x358, 0xda, 0x34d, 0x26c, 0xdf, 0x2af, 0x5b, 0xec, 0x3, 0x359, 0x1ed, 0x11, 0x263, 0x2f9, 0xff, 0xe, 0x311, 0x10c, 0x5a, 0x1db, 0x35f, 0x356, 0x3cb, 0x241, 0x236, 0x104, 0x1f0, 0x30d, 0x327, 0x242, 0x16f, 0xe9, 0x1e1, 0x16e, 0x1de, 0x2bd, 0x161, 0x3f8, 0xed, 0x134, 0x5, 0x1e2, 0x237, 0x33, 0x2ac, 0x302, 0x101, 0x12, 0x13a, 0x314, 0xee, 0x26d, 0x1e8, 0x1f3, 0x54, 0x2ca, 0x253, 0x30c, 0x210, 0x11e, 0x160, 0x2cf, 0x3b1, 0x13b, 0x223, 0x3b2, 0x262, 0x3ce, 0x3a3, 0x1, 0x137, 0x35c, 0xf, 0x226, 0x250, 0x55, 0x3fd, 0x10f, 0x303, 0x36, 0x34e, 0x135, 0x132, 0x2be, 0x238, 0x215, 0xfc, 0x357, 0x2fc, 0x11d, 0x239, 0x322, 0x3a0, 0x358, 0xda, 0x34d, 0x26c, 0x26e, 0x16b, 0x78, 0x228, 0x282, 0x16d, 0x107, 0x15b, 0x392, 0x186, 0x210, 0x23c, 0x189, 0x255, 0x36e, 0x321, 0x1f2, 0x2c6, 0x251, 0x2c4, 0x284, 0x12, 0x274, 0x4b, 0x379, 0x291, 0x177, 0x27, 0x25a, 0x32b, 0x273, 0x35a, 0x161, 0x3f9, 0x3b4, 0x1b2, 0x50, 0x37, 0xfb, 0x1b6, 0x1fa, 0x192, 0x11b, 0x104, 0x3e0, 0x2f, 0x10e, 0x61, 0x1b3, 0x23e, 0x15c, 0x83, 0x39e, 0x378, 0xff, 0x1c, 0x5f, 0x72, 0x1a9, 0x31e, 0x25d, 0x3a, 0x6b, 0x232, 0x3a2, 0x26c, 0x1be, 0x2ae, 0x2d8, 0x2db, 0x60, 0x3dd, 0x355, 0x124, 0x2ab, 0x11c, 0x215, 0x1f8, 0x147, 0x3cd, 0x1f4, 0x3b9, 0x122, 0x3d4, 0x26f, 0x305, 0x113, 0x250, 0xaa, 0x3ef, 0x6a, 0x5c, 0x2c9, 0x214, 0x396, 0x2c, 0x3b5, 0x3dc, 0x13b, 0x4f, 0x2d3, 0x334, 0x97, 0x95, 0x40, 0x296, 0x266, 0x23f, 0x332, 0x1e8, 0x3e6, 0x150, 0x27d, 0x171, 0x158, 0x129, 0x23b, 0x298, 0x4d, 0x206, 0xd5, 0x1a5, 0x3c0, 0x2c8, 0xf4, 0x3e6, 0x2a0, 0x1e6, 0x39a, 0x1ad, 0x161, 0x3fb, 0x2cb, 0x18b, 0x109, 0x2e9, 0x2b7, 0x286, 0x18e, 0x288, 0x1d1, 0x26c, 0x37c, 0x2aa, 0x2ed, 0x1e3, 0x1b, 0x295, 0x1ba, 0x201, 0x1ef, 0x1ee, 0x13b, 0x9e, 0x35e, 0x196, 0x162, 0x284, 0x24, 0x1c2, 0x258, 0x3f5, 0x294, 0x16f, 0x3a4, 0x22f, 0x326, 0x1cf, 0x378, 0x1fe, 0x70, 0x2f8, 0x329, 0x145, 0x239, 0x93, 0x27e, 0x39d, 0x386, 0x113, 0xa9, 0x2a8, 0x347, 0x2a9, 0x392, 0x30c, 0x52, 0x1c4, 0xa6, 0x222, 0x206, 0x3c4, 0x19c, 0x269, 0xfd, 0x192, 0x236, 0x19, 0x33f, 0x2f0, 0x188, 0x76, 0x6, 0x2fe, 0x1d7, 0x92, 0x2ab, 0x238, 0x46, 0x3db, 0x5d, 0x14e, 0x1e7, 0x34f, 0x8, 0x2a1, 0x133, 0x23f, 0x26d, 0x3a9, 0x30f, 0x12d, 0x32b, 0xef, 0x173, 0x31a, 0x3e7, 0x275, 0x43, 0x5a, 0x365, 0x195, 0x1d, 0x6b, 0x6d, 0x293, 0x344, 0x3d6, 0x17d, 0x345, 0x1aa, 0x29d, 0x23f, 0xd3, 0x2bf, 0x4e, 0x2f4, 0x1b1, 0x3be, 0xde, 0xff, 0x70, 0x1f9, 0xbf, 0x23a, 0x3d8, 0x244, 0x29f, 0x16b, 0x1e0, 0x2c8, 0x1e8, 0x383, 0x12d, 0x25f, 0x3bc, 0x38a, 0x1cc, 0x7, 0x5f, 0x1c8, 0x2a6, 0x239, 0x126, 0x1ea, 0xd7, 0x1e, 0x228, 0x21a, 0x2fd, 0x150, 0x1e6, 0x33d, 0x2bd, 0x31a, 0x3c7, 0x1c6, 0x218, 0x1a9, 0x63, 0x191, 0x29b, 0x3ca, 0x386, 0x226, 0x2a4, 0x16d, 0x15, 0x19d, 0x171, 0x169, 0x2b4, 0x3fb, 0x19f, 0x225, 0x5a, 0x2c3, 0x25d, 0xe8, 0x2b9, 0x1bb, 0x1a1, 0x128, 0x154, 0x347, 0x15b, 0x253, 0x56, 0x129, 0xfe, 0x1da, 0x364, 0x280, 0x2e9, 0x167, 0x20a, 0x6b, 0xda, 0x25e, 0x216, 0x117, 0x3f3, 0xd4, 0x2e0, 0x186, 0x52, 0x388, 0x298, 0x134, 0x28, 0x6e, 0x3d1, 0x2a5, 0xc7, 0x288, 0x3a2, 0x1a2, 0x3d6, 0x2fa, 0x10f, 0x2e, 0x19b, 0x84, 0x23c, 0x22d, 0x111, 0x206, 0x381, 0x279, 0x36c, 0x354, 0x266, 0x1dc, 0x12b, 0x35d, 0x3a4, 0xae, 0x20c, 0x33c, 0x227, 0x215, 0x3db, 0x174, 0xcd, 0x12e, 0x142, 0x48, 0x20b, 0x382, 0x10e, 0x308, 0x3, 0x1f5, 0x2a3, 0x264, 0x37d, 0x1ee, 0xe5, 0x1f2, 0x21d, 0x14d, 0x260, 0x236, 0x64, 0x39c, 0x157, 0x372, 0x3c6, 0xd8, 0x214, 0x8f, 0x312, 0x111, 0x5, 0x21f, 0x3ec, 0x2a5, 0x18e, 0x232, 0x12f, 0x216, 0x22e, 0x3d7, 0x2a9, 0x253, 0xac, 0xad, 0x3f9, 0x19f, 0x43, 0x168, 0x235, 0x191, 0x13f, 0x333, 0xf, 0x228, 0x3d, 0x3e6, 0x292, 0x25f, 0x371, 0x233, 0x27b, 0x70, 0x3f2, 0x2fc, 0x1f4, 0x1f7, 0x2, 0x2a1, 0xc5, 0x3b8, 0x256, 0x2b3, 0x341, 0x15c, 0x11, 0x271, 0x47, 0x23, 0x3bf, 0x2e8, 0x19a, 0x25c, 0x284, 0x90, 0x1f, 0x30d, 0x21c, 0x219, 0x6, 0x3ea, 0x14f, 0xc1, 0x2f3, 0x3dc, 0x1ca, 0x3e4, 0x33, 0x29a, 0xc9, 0x65, 0xc8, 0x331, 0x2ae, 0x2ed, 0x385, 0x1b0, 0x21, 0x2a1, 0x18a, 0x2fb, 0x294, 0x36a, 0xea, 0x3bd, 0x92, 0x175, 0x33b, 0x13b, 0xf9, 0x21d, 0x29a, 0x192, 0x194, 0x249, 0x37c, 0x17d, 0x21e, 0x170, 0x30c, 0x290, 0x1fc, 0x2cb, 0x43, 0x2d0, 0xc6, 0x93, 0x3d4, 0x2b1, 0x3c0, 0x26d, 0x177, 0x270, 0x22f, 0x106, 0x33c, 0x47, 0x46, 0x2e7, 0x36d, 0x196, 0x302, 0x68, 0x82, 0x33f, 0x3ad, 0x2d8, 0x1e3, 0xd8, 0x21, 0x23c, 0xa6, 0x134, 0xa0, 0x2e9, 0x195, 0xe8, 0x2f6, 0x386, 0x8a, 0x21a, 0x3e6, 0x12d, 0x16e, 0x3be, 0x378, 0x3eb, 0x3f, 0x28e, 0x14e, 0x323, 0x254, 0x24, 0x20b, 0x30d, 0x31, 0x76, 0x30, 0x2d7, 0x1ba, 0x2c, 0x32e, 0x346, 0x3c4, 0xfb, 0x356, 0x18e, 0x6d, 0xb5, 0x94, 0x2a8, 0x20e, 0x33a, 0x39a, 0x173, 0xe6, 0xe, 0x2f8, 0x17e, 0x1f4, 0x3ee, 0x8, 0x125, 0x4b, 0x3f5, 0x8d, 0x366, 0x359, 0x1d7, 0x99, 0x3ba, 0x1ee, 0x1ca, 0x3c1, 0xcc, 0xfd, 0x8b, 0xbb, 0x14b, 0x221, 0x3f5, 0x11a, 0x183, 0x2fe, 0x14f, 0x304, 0x363, 0x2d5, 0x1e2, 0xfb, 0x2a5, 0x231, 0x368, 0x342, 0x2a4, 0x37a, 0x149, 0xb7, 0x3be, 0x2f9, 0x3b7, 0x1f8, 0xba, 0x19a, 0x162, 0x1a, 0x41, 0x33f, 0x353, 0x372, 0x303, 0x19b, 0x29, 0x23b, 0x3b4, 0x225, 0x2d0, 0x18c, 0x24c, 0x29f, 0x34a, 0xee, 0x256, 0x2de, 0x75, 0x3bd, 0x124, 0x1dd, 0x1ee, 0x394, 0x31f, 0x269, 0x3cb, 0x144, 0x293, 0x25, 0x154, 0x20e, 0x27d, 0x273, 0x38a, 0x27b, 0x1c0, 0x357, 0x257, 0x395, 0x254, 0x48, 0x3e, 0x5e, 0x310, 0x2db, 0x1b, 0x10a, 0x11e, 0xa6, 0x268, 0x280, 0x365, 0x166, 0x13f, 0xd7, 0xf0, 0x332, 0x177, 0xe9, 0xae, 0x22, 0x3ac, 0xf2, 0x1a4, 0x13c, 0x30a, 0x29a, 0x324, 0x259, 0x26c, 0x3a5, 0x3f3, 0x2a9, 0x15e, 0x2d2, 0x31a, 0x207, 0x17c, 0x17e, 0x3e8, 0x3a3, 0x40, 0x274, 0x172, 0x87, 0x219, 0x18, 0x2d7, 0x374, 0xb0, 0x146, 0x296, 0x96, 0x397, 0x184, 0xc, 0x2d7, 0x2e1, 0x2c0, 0x222, 0x50, 0x1db, 0xb3, 0x13f, 0x1ae, 0x3c0, 0x1a6, 0x35d, 0x11f, 0x3da, 0x124, 0x3ba, 0x3b1, 0x9f, 0x19c, 0x1ab, 0x31c, 0x368, 0x28d, 0x282, 0x3e6, 0xbd, 0x2cd, 0x263, 0x227, 0x8c, 0x315, 0x163, 0x2a2, 0x192, 0x259, 0xd1, 0x28f, 0x3a7, 0x2ca, 0x39a, 0x1c5, 0x27b, 0x380, 0x147, 0x29c, 0x12e, 0x202, 0x224, 0x33f, 0x2af, 0x1d3, 0x2e, 0x186, 0x129, 0x3fb, 0x1c6, 0x1c8, 0x23a, 0x1f7, 0x10, 0x13a, 0x172, 0x10e, 0x76, 0xc0, 0x123, 0x243, 0x53, 0x268, 0x109, 0x18f, 0x322, 0x3d4, 0x2d6, 0x77, 0x256, 0x1b5, 0x1d4, 0x1d7, 0x264, 0x3de, 0x36e, 0x1e2, 0x1f6, 0x286, 0x1ac, 0x2e5, 0x8a, 0x7a, 0x217, 0x3c2, 0x83, 0x271, 0x238, 0xd2, 0x13c, 0x21d, 0x27a, 0x116, 0x1d1, 0x10b, 0xaa, 0x20e, 0xf3, 0x1de, 0x6f, 0x3f1, 0x7e, 0x5d, 0x19a, 0x2c4, 0x68, 0x208, 0x39c, 0x2aa, 0x125, 0x258, 0x87, 0x76, 0x180, 0x85, 0x23c, 0x139, 0x18b, 0x2d0, 0x239, 0x81, 0x2a1, 0x4b, 0x397, 0x308, 0x30, 0x295, 0x243, 0xa6, 0x1b2, 0x5a, 0xc6, 0x91, 0xd5, 0x18a, 0x3f5, 0x61, 0x6, 0x2d7, 0x1cb, 0x312, 0x134, 0x109, 0x31e, 0x93, 0x29f, 0x133, 0x2fb, 0x8d, 0x306, 0x3dd, 0x1ba, 0x160, 0x222, 0xa0, 0x365, 0x191, 0x3d4, 0x1a5, 0x1dc, 0x294, 0x366, 0x2fe, 0x135, 0x2c, 0x146, 0x14, 0x2e9, 0xb3, 0x27e, 0x2b1, 0x23f, 0x256, 0x36a, 0x359, 0x2a3, 0x201, 0x32e, 0x206, 0xdc, 0x195, 0x349, 0xd7, 0x3c0, 0x34c, 0x16f, 0xea, 0x1d7, 0xc1, 0x363, 0x346, 0x21f, 0x2b7, 0xe8, 0x39d, 0x78, 0x26d, 0x3aa, 0x11f, 0x3bd, 0x99, 0x1ef, 0x36e, 0x3c4, 0x3d1, 0x1d, 0x2f6, 0xf, 0x2c8, 0x177, 0x3a4, 0x2f2, 0x92, 0x3ba, 0x36b, 0x27c, 0xfb, 0x286, 0x358, 0x386, 0x59, 0x3a9, 0x270, 0x15c, 0x110, 0x175, 0x1ee, 0x24b, 0x19c, 0x24a, 0x172, 0x31, 0x369, 0x6c, 0x108, 0x7f, 0x33e, 0xe4, 0x7d, 0x3a3, 0x200, 0x1f, 0x178, 0x2d8, 0x20f, 0x186, 0xad, 0x3c7, 0x17c, 0x3e2, 0x3ce, 0x142, 0x112, 0x277, 0x155, 0x21e, 0x32d, 0x2d2, 0xe6, 0xe0, 0x147, 0x262, 0x2c4, 0x1a0, 0xc8, 0x2f1, 0x3f3, 0x165, 0x33d, 0x233, 0x3eb, 0x3f0, 0x3b2, 0xab, 0x260, 0x259, 0x344, 0xaa, 0x2a, 0x32b, 0x375, 0x3c3, 0x46, 0x223, 0x30a, 0xfd, 0xa2, 0x25e, 0xa9, 0x2fd, 0xbd, 0x326, 0x271, 0xf2, 0x13b, 0x38b, 0x1b6, 0x18e, 0x2d9, 0x45, 0xf4, 0x9c, 0xae, 0x110, 0x2ea, 0x3b1, 0x27c, 0x1f6, 0x20a, 0x2f6, 0x1e, 0x332, 0x3aa, 0x23e, 0x2ef, 0xc1, 0x2cf, 0x103, 0xdc, 0x32a, 0x13f, 0x2b1, 0x77, 0x14a, 0x366, 0x1f5, 0xdd, 0x160, 0x4d, 0x280, 0x31e, 0x126, 0x26e, 0x18a, 0x3e3, 0x184, 0x30, 0x123, 0x11e, 0x139, 0x316, 0x352, 0x1ec, 0x2, 0x9d, 0x2e4, 0x62, 0x2db, 0xd8, 0x9d, 0x1c1, 0x188, 0x2f5, 0x19b, 0x290, 0x3f7, 0xbe, 0x3e2, 0x395, 0x101, 0x82, 0x331, 0x2fa, 0x2a9, 0x1cd, 0x31d, 0x3eb, 0x3e9, 0x2d3, 0x151, 0x241, 0x3a2, 0x94, 0x1bd, 0x25a, 0x326, 0xeb, 0x3c8, 0x1ca, 0xce, 0x2a5, 0x358, 0x203, 0x199, 0x3aa, 0x75, 0x3ae, 0x201, 0xa3, 0x28, 0x365, 0x24d, 0x137, 0x18a, 0x3cf, 0x219, 0x180, 0x214, 0x388, 0x2cb, 0x72, 0x7d, 0x34f, 0x12, 0xf8, 0x3ad, 0x3a6, 0x2e0, 0x2b0, 0x73, 0xe0, 0x28e, 0x19a, 0x20d, 0x236, 0x136, 0x117, 0x20e, 0x391, 0x375, 0x38f, 0x118, 0x13c, 0xcc, 0x39f, 0xda, 0x113, 0x7a, 0x9c, 0x15c, 0x49, 0x37d, 0x36e, 0x30b, 0x167, 0x349, 0x35c, 0x77, 0x294, 0x183, 0x3b3, 0x1cb, 0x53, 0x364, 0x2d0, 0xf6, 0x2, 0x13a, 0x382, 0x310, 0x1e3, 0x336, 0x129, 0x3e7, 0x17c, 0x3cd, 0x323, 0x202, 0x104, 0x26b, 0x1fd, 0x15b, 0x39a, 0x233, 0x3df, 0x3db, 0x1af, 0x2a2, 0x8b, 0x13a, 0x30d, 0x5b, 0x303, 0x30c, 0x161, 0xe, 0x357, 0x262, 0x302, 0x236, 0x26c, 0x55, 0x54, 0x16e, 0x263, 0x238, 0x13b, 0x237, 0x356, 0x358, 0xf, 0x26d, 0x16f, 0x359, 0x135, 0x160, 0x134, 0x5a, 0x239, 0x1, 0x13a, 0x30d, 0x5b, 0x303, 0x30c, 0x161, 0xe, 0x357, 0x262, 0x302, 0x236, 0x26c, 0x55, 0x54, 0x16e, 0x263, 0x238, 0x13b, 0x237, 0x356, 0x358, 0xf, 0x26d, 0x16f, 0x359, 0x135, 0x160, 0x134, 0x5a, 0x239, 0x1, 0x13a, 0x30d, 0x5b, 0x303, 0x30c, 0x161, 0xe, 0x357, 0x262, 0x302, 0x236, 0x26c, 0x55, 0x54, 0x16e, 0x263, 0x238, 0x13b, 0x237, 0x356, 0x358, 0xf, 0x26d, 0x16f, 0x359, 0x135, 0x160, 0x134, 0x5a, 0x239, 0x1, 0x13a, 0x30d, 0x5b, 0x303, 0x30c, 0x161, 0xe, 0x357, 0x262, 0x302, 0x236, 0x26c, 0x55, 0x54, 0x16e, 0x263, 0x238, 0x13b, 0x237, 0x356, 0x358, 0xf, 0x26d, 0x16f, 0x359, 0x135, 0x160, 0x274, 0x2f, 0x2d8, 0x5c, 0x158, 0xe6, 0x309, 0x174, 0xab, 0x324, 0x34d, 0xa9, 0x3c5, 0x313, 0x110, 0x37d, 0x1a3, 0xdc, 0x166, 0x34b, 0x18a, 0x327, 0x1d8, 0xd8, 0xa4, 0x3f7, 0x2f8, 0x257, 0xb1, 0x340, 0x9b, 0x22e, 0x54, 0x2dc, 0x19e, 0x1e4, 0x394, 0x279, 0x1d, 0x333, 0x31b, 0x294, 0x205, 0x34e, 0x23c, 0x3b4, 0x72, 0x1f4, 0x95, 0x89, 0x1ce, 0x2fa, 0x2b6, 0xef, 0x2f9, 0x23, 0x9e, 0x198, 0xc7, 0x376, 0xb2, 0x1d5, 0xea, 0x14f, 0xb0, 0x134, 0xb4, 0xf6, 0x8, 0x384, 0x178, 0x2ed, 0x2e0, 0x2d2, 0x339, 0x7e, 0x3b2, 0x151, 0x116, 0x25e, 0x141, 0x217, 0xae, 0x92, 0x3de, 0x103, 0x2e9, 0x322, 0x26e, 0x4b, 0x10e, 0x2db, 0x2c9, 0x129, 0x387, 0x3ed, 0x29c, 0x181, 0x236, 0xd1, 0x154, 0x2a0, 0x2cd, 0xeb, 0x33b, 0x9f, 0x3ec, 0xe8, 0x1ae, 0xee, 0x8d, 0xc, 0x246, 0x1c4, 0x19f, 0x390, 0x3bb, 0xa1, 0x41, 0x26b, 0xe1, 0xbc, 0x2ed, 0x1c9, 0x35a, 0x1fe, 0x3e9, 0x2b5, 0xfd, 0x232, 0x226, 0x3a9, 0x28b, 0x3ae, 0x2c, 0x9a, 0xb4, 0x1ec, 0x20, 0x1f, 0x3ad, 0x10f, 0x15e, 0x38a, 0x3b7, 0x1c7, 0x21d, 0x39f, 0x2d9, 0x59, 0x1d5, 0x1d4, 0x135, 0x189, 0x364, 0x2ad, 0x1f7, 0x9, 0x3e0, 0x155, 0x1a8, 0x39a, 0x1bc, 0x215, 0x9e, 0x330, 0x31c, 0x386, 0x332, 0x2de, 0x2fe, 0x2e1, 0x14c, 0x43, 0x11d, 0x297, 0x120, 0xe7, 0x2fa, 0x165, 0x3bc, 0x3e5, 0x230, 0x3e4, 0x2d1, 0x358, 0x3c, 0x291, 0x366, 0x36f, 0x8f, 0x1da, 0x72, 0x3e8, 0x254, 0x41, 0xdf, 0x3ef, 0xf3, 0x375, 0x47, 0x299, 0x67, 0x286, 0x3ca, 0x389, 0x294, 0x3, 0x123, 0x1c4, 0x33e, 0x25b, 0x1e7, 0x202, 0x32, 0x3d6, 0x107, 0x25f, 0x263, 0xf2, 0x394, 0xfb, 0x74, 0x1ae, 0x1dc, 0x234, 0x60, 0x21, 0xfe, 0x311, 0x3e2, 0x97, 0xd0, 0x249, 0x22e, 0xa8, 0x362, 0xeb, 0x27f, 0x27c, 0x1c2, 0x2f0, 0x345, 0xaf, 0x38a, 0x367, 0x315, 0xcc, 0x18e, 0x386, 0x26d, 0x36a, 0x3dd, 0x243, 0x1da, 0xe4, 0x3bb, 0x284, 0x19, 0x3d6, 0x20e, 0x16e, 0x33c, 0x33b, 0x27c, 0x2b7, 0x27e, 0x133, 0x397, 0x3b0, 0x2c9, 0xad, 0xe, 0x28e, 0x196, 0x192, 0x293, 0x141, 0x4e, 0x2f2, 0xc1, 0x146, 0x109, 0x239, 0x8, 0x20b, 0x3ad, 0x21e, 0x171, 0x6f, 0x30e, 0x9e, 0x269, 0x6b, 0xf, 0x34c, 0x366, 0x2d7, 0x23c, 0x2cb, 0x329, 0x1e7, 0xd, 0xc8, 0x28f, 0x54, 0x362, 0x1d6, 0x1ee, 0x3c4, 0x195, 0x3d4, 0x18a, 0x87, 0x1bf, 0x265, 0x161, 0x70, 0x5d, 0xab, 0x8b, 0xb5, 0x21a, 0x270, 0x3bd, 0x201, 0x222, 0x5a, 0x1ec, 0x40, 0x7c, 0x157, 0xd4, 0x39a, 0x378, 0x46, 0xf9, 0x36c, 0x358, 0x78, 0x256, 0x306, 0x295, 0x1c4, 0x275, 0x17e, 0x323, 0x68, 0x249, 0x55, 0x2a0, 0x326, 0x2ab, 0x36b, 0x21f, 0xb3, 0x29f, 0x4b, 0x31, 0x1e3, 0x384, 0x3d2, 0x21e, 0x2e2, 0x1bc, 0x46, 0x1f2, 0x1ab, 0x2f6, 0x389, 0x242, 0x30, 0x42, 0x3f9, 0x2f8, 0x29c, 0x13, 0xbb, 0x128, 0x383, 0x15c, 0x132, 0xa3, 0x109, 0x7b, 0x20, 0x7c, 0x2ae, 0x350, 0xef, 0x3e5, 0xd2, 0x237, 0x105, 0x26f, 0x1dc, 0xc2, 0x209, 0x52, 0x3c7, 0x3af, 0x334, 0x260, 0x34d, 0x141, 0x9c, 0x3da, 0x201, 0x4d, 0x168, 0x37b, 0x9, 0x39b, 0x17d, 0x2ca, 0x1df, 0x47, 0x276, 0x279, 0xe8, 0x16b, 0x3fe, 0x76, 0x1b0, 0x252, 0xe, 0x115, 0x251, 0x8b, 0x16a, 0x7a, 0x3a4, 0x3ae, 0xb0, 0x1b2, 0x153, 0x3a3, 0x120, 0x39c, 0x3f3, 0x1e6, 0x39e, 0xf2, 0x24b, 0x3ab, 0x13f, 0x133, 0x327, 0x2db, 0x265, 0x2c2, 0x1c0, 0x2e8, 0x2a2, 0x144, 0x113, 0x35b, 0x75, 0x135, 0x22d, 0x225, 0x23a, 0x95, 0x41, 0x37c, 0x287, 0xb7, 0x33c, 0x27f, 0x1e2, 0x195, 0x3a1, 0x221, 0x31, 0x3c6, 0x2b, 0xe6, 0x7e, 0x1af, 0xfd, 0x301, 0x353, 0xd4, 0x273, 0x3e5, 0x1a4, 0xce, 0x3a, 0x2b1, 0x3fe, 0xec, 0x2c9, 0x2b4, 0xe0, 0x2e8, 0x14d, 0x119, 0x8a, 0x1d5, 0x2bb, 0x1cb, 0xed, 0x1c8, 0x1e7, 0x34, 0x9b, 0x2a8, 0xbd, 0x44, 0x1ef, 0xa, 0x235, 0x1, 0x301, 0x353, 0xd4, 0x273, 0x3e5, 0x1a4, 0xce, 0x3a, 0x2b1, 0x3fe, 0xec, 0x2c9, 0x2b4, 0xe0, 0x2e8, 0x14d, 0x119, 0x8a, 0x1d5, 0x2bb, 0x1cb, 0xed, 0x1c8, 0x1e7, 0x34, 0x9b, 0x2a8, 0xbd, 0x44, 0x1ef, 0xa, 0x235, 0x1, 0x301, 0x353, 0xd4, 0x273, 0x3e5, 0x1a4, 0xce, 0x3a, 0x2b1, 0x3fe, 0xec, 0x2c9, 0x2b4, 0xe0, 0x2e8, 0x14d, 0x119, 0x8a, 0x1d5, 0x2bb, 0x1cb, 0xed, 0x1c8, 0x1e7, 0x34, 0x9b, 0x2a8, 0xbd, 0x44, 0x1ef, 0xa, 0x235, 0x1, 0x301, 0x353, 0xd4, 0x273, 0x3e5, 0x1a4, 0xce, 0x3a, 0x2b1, 0x3fe, 0xec, 0x2c9, 0x2b4, 0xe0, 0x2e8, 0x14d, 0x119, 0x8a, 0x1d5, 0x2bb, 0x1cb, 0x20b, 0x157, 0x2a9, 0x371, 0x47, 0x1ca, 0x3d1, 0x27e, 0x18a, 0x31, 0x303, 0x2b0, 0x1fe, 0x2e7, 0xcc, 0x6b, 0x78, 0x294, 0x30, 0x108, 0x3e7, 0x357, 0x196, 0x8b, 0x1a1, 0x3a9, 0xea, 0x1ba, 0x139, 0xe4, 0x1e7, 0x68, 0x26c, 0x16d, 0x3c2, 0x92, 0x32e, 0x109, 0x1ec, 0x200, 0x33f, 0x3fa, 0x1e6, 0x263, 0x33b, 0x3c4, 0xb3, 0xd5, 0x2e4, 0x2d8, 0x392, 0x38a, 0x30e, 0xf9, 0x356, 0x39d, 0x1dc, 0x308, 0xd8, 0xad, 0x70, 0x2e8, 0x29a, 0x6d, 0x59, 0x16f, 0x3dd, 0x23c, 0x275, 0x3e2, 0x162, 0x194, 0x94, 0x30f, 0x2f2, 0x201, 0x134, 0x2ad, 0x34f, 0x112, 0x37c, 0x20e, 0x362, 0x2ab, 0x36e, 0x2e9, 0x91, 0x13a, 0x2f0, 0x21e, 0x39a, 0x3f6, 0x1a4, 0x19c, 0xe8, 0x1a5, 0x397, 0x1bf, 0x30c, 0xe6, 0x1f8, 0x2c6, 0x337, 0x386, 0x34c, 0x306, 0x85, 0x1fc, 0x2f8, 0x262, 0x130, 0x293, 0x21a, 0x3a4, 0x2a3, 0x312, 0x43, 0x1f4, 0x284, 0xc8, 0x1f, 0x155, 0x165, 0x375, 0xf2, 0x27c, 0x32a, 0x26e, 0x2e4, 0x1b9, 0x253, 0x6f, 0x8c, 0x31f, 0x1d, 0x16b, 0x3cf, 0x1bf, 0x211, 0x398, 0x3db, 0x33, 0x231, 0x78, 0x121, 0xc0, 0x52, 0x207, 0x22a, 0x151, 0x119, 0x228, 0x16f, 0x3b3, 0xe2, 0x38c, 0x257, 0x13, 0x1d1, 0x282, 0x1d2, 0x2a3, 0x22d, 0x10c, 0x3bb, 0x1a, 0x136, 0x16d, 0x38d, 0x248, 0x146, 0xb4, 0x1f7, 0x120, 0xdf, 0x107, 0x362, 0x15f, 0x1a3, 0x365, 0x102, 0x301, 0x157, 0x15b, 0x1df, 0x238, 0x9f, 0x2ce, 0x29f, 0xb9, 0x16c, 0x392, 0x31d, 0x23, 0x3c1, 0x105, 0x35c, 0x3f5, 0x369, 0x186, 0xe6, 0x3f0, 0x30a, 0x18e, 0x1e, 0x14a, 0x30, 0x210, 0x387, 0x28e, 0x156, 0x144, 0x8a, 0x35d, 0x3ea, 0x23c, 0xe3, 0x393, 0x302, 0x176, 0x2a4, 0x270, 0x3ae, 0x189, 0x43, 0x3e8, 0x202, 0x249, 0x159, 0x1e1, 0x92, 0x255, 0x2d, 0x37b, 0x48, 0x331, 0x347, 0x2dc, 0x351, 0x36e, 0x3e, 0x15d, 0x33a, 0x335, 0x27f, 0x21f, 0x24d, 0x24a, 0x2f0, 0x6a, 0x1de, 0x47, 0x321, 0x167, 0x29f, 0x172, 0x1b9, 0xaf, 0x1bc, 0x69, 0x19c, 0x3a0, 0x266, 0x31, 0x17, 0x35a, 0x367, 0x278, 0x2a5, 0xd7, 0x3fe, 0x369, 0x30c, 0x398, 0x3bf, 0xcc, 0x1ac, 0x389, 0x61, 0x6c, 0x15a, 0x380, 0x1af, 0x3cb, 0x386, 0x12b, 0xc, 0x108, 0x387, 0x115, 0x151, 0x232, 0xb2, 0x36a, 0x34e, 0x7f, 0x2f8, 0x19a, 0x324, 0x1a1, 0x2bf, 0x2bb, 0x243, 0x33e, 0x3cd, 0x302, 0x2ec, 0x282, 0x3a4, 0x29e, 0x14c, 0xe4, 0x395, 0x289, 0x216, 0x383, 0x1ed, 0x2c, 0x2c1, 0x7d, 0x284, 0x320, 0x159, 0x3c2, 0x248, 0x28c, 0x2d0, 0x3a3, 0x224, 0x3d6, 0x150, 0x20c, 0x1ef, 0x50, 0x7b, 0x200, 0xe7, 0x3d7, 0x16e, 0x351, 0x2d5, 0x365, 0x204, 0x1f, 0x2aa, 0x19d, 0x39e, 0x33b, 0x30b, 0x322, 0x125, 0x178, 0x35, 0xef, 0x227, 0x394, 0x2b7, 0x34b, 0xb9, 0x2d8, 0x7c, 0x17d, 0x1e6, 0x33c, 0x36b, 0x2e9, 0x81, 0x20b, 0x2aa, 0x33a, 0x263, 0x1ee, 0xdc, 0x91, 0x1c2, 0x157, 0x165, 0x1cf, 0x33b, 0x21f, 0x93, 0x13a, 0x3ad, 0x2a9, 0x3be, 0x1e4, 0x3c4, 0x191, 0x125, 0x2f0, 0xd4, 0x371, 0x238, 0x27c, 0xb3, 0x2a1, 0x5e, 0x21e, 0xef, 0x47, 0x24b, 0x195, 0xd5, 0x30d, 0x345, 0x39a, 0x38f, 0x1ca, 0x2b7, 0x29f, 0x2e4, 0x2ed, 0x171, 0x3f6, 0x13b, 0x3d1, 0x3d4, 0x258, 0x2d8, 0xaf, 0x378, 0x1a4, 0xfb, 0x27e, 0x4b, 0x5b, 0x392, 0x6f, 0x230, 0x19c, 0x349, 0x18a, 0x188, 0x170, 0x38a, 0x46, 0x237, 0xe8, 0x133, 0x31, 0x2e, 0x173, 0x30e, 0x3c1, 0x1d, 0x1a5, 0x87, 0x303, 0x1ad, 0x367, 0xf9, 0x286, 0x2b1, 0x397, 0x1e3, 0x2b0, 0x3eb, 0x9e, 0x356, 0xd7, 0x3f5, 0x1bf, 0x56, 0x1fe, 0x315, 0x36c, 0x39d, 0x2fb, 0x3b0, 0x30c, 0x339, 0x2e7, 0x269, 0x2f6, 0x1dc, 0x76, 0x265, 0xe6, 0x3db, 0xcc, 0xf8, 0x1fd, 0x32b, 0x3ac, 0x1a3, 0x31e, 0x10, 0x39b, 0x3ef, 0x2dc, 0x2be, 0x206, 0x18c, 0x100, 0x1ce, 0x287, 0x193, 0x3ba, 0x28, 0xf6, 0x24, 0xdf, 0x2a, 0x106, 0x3de, 0x280, 0x37b, 0x240, 0x1eb, 0x2a0, 0x44, 0x197, 0x5a, 0x3d5, 0x41, 0x28f, 0x25a, 0x49, 0x146, 0x1a9, 0x127, 0x19, 0xaa, 0x1e1, 0x99, 0x4d, 0x2a6, 0x254, 0x190, 0x2b2, 0x22f, 0x182, 0xd9, 0x23a, 0x101, 0x136, 0x37a, 0x2b8, 0x16, 0x18b, 0x3e8, 0x34, 0x344, 0x3c5, 0x3da, 0x160, 0x86, 0x2f7, 0x340, 0x25, 0x27, 0x1d7, 0x22d, 0x72, 0x323, 0x65, 0x250, 0x270, 0x14f, 0x298, 0x329, 0x25c, 0x259, 0x141, 0x341, 0xdd, 0x1da, 0x2fc, 0x181, 0x1d1, 0x3d, 0x75, 0x1cb, 0x19f, 0x393, 0x26, 0x12f, 0x3d0, 0x359, 0x8f, 0x1c6, 0x14e, 0x260, 0x2d4, 0x177, 0x1f5, 0xe2, 0x5f, 0xcd, 0x241, 0x113, 0x35d, 0x36f, 0x23b, 0x1f9, 0xcb, 0x51, 0x114, 0x1b5, 0x295, 0x1f0, 0x3fd, 0x16e, 0x2be, 0x5, 0x239, 0x12, 0xdf, 0x54, 0x11, 0x2cf, 0x5a, 0x3a3, 0x104, 0x55, 0x1e1, 0x132, 0x134, 0x11d, 0x101, 0x26c, 0x1f3, 0x1ed, 0x160, 0x10c, 0x3ce, 0x236, 0x250, 0xe9, 0x135, 0xed, 0x2fc, 0x302, 0x34d, 0x1e8, 0x359, 0x11e, 0x311, 0x262, 0x241, 0x226, 0x16f, 0x34e, 0x3f8, 0x357, 0x2ac, 0xda, 0x26d, 0x3, 0x210, 0xe, 0x3b2, 0x3cb, 0xf, 0x242, 0x36, 0x161, 0xfc, 0x33, 0x358, 0xee, 0xec, 0x30c, 0xff, 0x223, 0x356, 0x35c, 0x327, 0x303, 0x2bd, 0x215, 0x237, 0x3a0, 0x314, 0x5b, 0x253, 0x2f9, 0x13b, 0x35f, 0x137, 0x30d, 0x10f, 0x1de, 0x238, 0x1e2, 0x322, 0x13a, 0x2af, 0x2ca, 0x263, 0x3b1, 0x1db, 0x1, 0x1f0, 0x3fd, 0x16e, 0x2be, 0x5, 0x239, 0x12, 0xdf, 0x54, 0x11, 0x2cf, 0x5a, 0x3a3, 0x104, 0x55, 0x1e1, 0x132, 0x134, 0x11d, 0x101, 0x26c, 0x1f3, 0x1ed, 0x160, 0x10c, 0x3ce, 0x236, 0x3e0, 0x3ef, 0x362, 0x3ba, 0xa0, 0x37b, 0x112, 0x28f, 0x17a, 0x99, 0x134, 0x23a, 0xd, 0x344, 0x30f, 0x1d7, 0xa6, 0x329, 0x162, 0x1d1, 0xf4, 0x359, 0x23c, 0x5f, 0x334, 0x51, 0x59, 0x366, 0x21, 0x307, 0x2e8, 0x3e1, 0xf, 0x8d, 0xd8, 0x31a, 0x3db, 0x269, 0x39d, 0x3f5, 0x1e3, 0x1ad, 0x30e, 0x237, 0x349, 0x4b, 0x2d8, 0x171, 0x38f, 0x24b, 0xb3, 0x125, 0x3ad, 0x165, 0x263, 0x36b, 0x365, 0x8, 0x33f, 0x347, 0x326, 0x1ef, 0x109, 0x3ee, 0x82, 0x55, 0x3c2, 0xc1, 0x1b2, 0x1f4, 0x68, 0x216, 0x4e, 0x2a3, 0x139, 0x17e, 0x302, 0x293, 0x3a9, 0x2fe, 0x1c4, 0x2f8, 0x196, 0x288, 0x2c8, 0x306, 0x108, 0xe, 0x36d, 0x337, 0x78, 0x61, 0x2c9, 0xe6, 0x2e7, 0x36c, 0xd7, 0x397, 0x303, 0x173, 0x46, 0x19c, 0x27e, 0x258, 0x2ed, 0x39a, 0x47, 0x27c, 0x191, 0x13a, 0x157, 0x33a, 0x33c, 0x36e, 0x31e, 0x40, 0x1ce, 0x20e, 0x106, 0x363, 0x3c9, 0x3a7, 0x326, 0x3de, 0x2d, 0x34f, 0x32, 0x2b2, 0x15c, 0x58, 0x10c, 0x323, 0x328, 0x10d, 0xea, 0x8f, 0x22b, 0x334, 0xa2, 0x164, 0x306, 0x210, 0x38, 0x35e, 0x31c, 0x31b, 0x76, 0x211, 0x3f1, 0xf9, 0x3a, 0xc5, 0x5b, 0x15e, 0x3c3, 0x24b, 0x166, 0x9d, 0x157, 0x27d, 0xeb, 0x346, 0x18c, 0x12, 0x37c, 0x149, 0x49, 0x222, 0x28a, 0x202, 0x344, 0x217, 0x355, 0x139, 0x2fc, 0x13, 0xb5, 0x2ee, 0x36f, 0x1fc, 0x2a7, 0x14d, 0x376, 0xa5, 0x209, 0x161, 0x3f0, 0x330, 0x39d, 0x3e3, 0x385, 0x173, 0x8c, 0x279, 0x3d4, 0x1c1, 0x10f, 0x371, 0x3c8, 0x6e, 0x81, 0xf8, 0x3f3, 0x362, 0x37d, 0x280, 0x3ee, 0x104, 0x154, 0x22f, 0xb, 0x225, 0x1e7, 0x65, 0x2a4, 0x11f, 0x396, 0x1c6, 0x262, 0x116, 0x228, 0x366, 0x42, 0x7, 0x36d, 0x267, 0x1e0, 0x308, 0xc3, 0xff, 0x9e, 0x105, 0x29d, 0x188, 0x32d, 0x1fb, 0x1ca, 0x32a, 0x296, 0x3ad, 0x39b, 0x287, 0x106, 0x197, 0x1a9, 0x254, 0x136, 0x3c5, 0x1d7, 0x298, 0x2fc, 0x26, 0x2d4, 0x35d, 0x295, 0x3f7, 0xba, 0x3e1, 0x3c, 0xc2, 0x265, 0xff, 0x13c, 0x1d, 0xc5, 0xb6, 0x171, 0x227, 0xf1, 0x93, 0x301, 0x2fa, 0x16e, 0x1dd, 0x140, 0x3ee, 0x208, 0x159, 0x15c, 0xb0, 0x39, 0x12e, 0x2ec, 0x1e8, 0x2fe, 0x319, 0x3d3, 0x151, 0x1bb, 0xa5, 0x1b, 0x18d, 0x3bf, 0x36c, 0x35c, 0x10e, 0x170, 0x1bc, 0x276, 0x195, 0x296, 0x353, 0x33a, 0xeb, 0x285, 0x239, 0x90, 0x3a5, 0x17a, 0x264, 0x364, 0x3bb, 0x11b, 0x152, 0x11f, 0x325, 0x311, 0x334, 0x144, 0x199, 0x6, 0x148, 0x309, 0x21d, 0x17b, 0x1ff, 0x1e3, 0x2bd, 0x8c, 0xfb, 0x34b, 0x213, 0xd4, 0x2e3, 0x3dc, 0x365, 0x20, 0x39c, 0x54, 0x88, 0x28c, 0x145, 0x202, 0x281, 0x4e, 0x29e, 0x3b4, 0x32f, 0xc9, 0x226, 0x36a, 0x214, 0x207, 0x36d, 0xc7, 0x389, 0x76, 0x2b, 0x3df, 0x3c1, 0x33f, 0x20e, 0x22, 0x146, 0x145, 0xd, 0x216, 0x270, 0x1ba, 0x275, 0x262, 0x51, 0x2c8, 0x6, 0x290, 0x3f, 0xcc, 0x39d, 0x397, 0x2e, 0x6f, 0x13b, 0x195, 0x125, 0x157, 0x1e6, 0x2ab, 0x14, 0x37b, 0x82, 0x2a8, 0x15c, 0x160, 0xe4, 0x162, 0x293, 0x177, 0x2d7, 0x3fb, 0x5d, 0x3e1, 0x78, 0x308, 0x30c, 0x3eb, 0x3c1, 0x349, 0x258, 0x345, 0x371, 0x33b, 0x2e9, 0x8, 0x1ce, 0x54, 0x110, 0x222, 0x23a, 0x68, 0x94, 0x3a4, 0x1cb, 0x38c, 0x334, 0x288, 0x26d, 0x30, 0xad, 0x1f8, 0x269, 0xd7, 0x87, 0x170, 0x378, 0x1ca, 0xb3, 0x13a, 0x2aa, 0x32b, 0x175, 0xa0, 0x3ee, 0x19, 0x16d, 0x2f2, 0x312, 0x329, 0x302, 0xb5, 0x3aa, 0x295, 0x3e7, 0x2e8, 0x337, 0x3c0, 0x76, 0x56, 0x367, 0x237, 0x27e, 0x2e4, 0x21e, 0x3be, 0x1ee, 0x365, 0x40, 0x26b, 0x2a0, 0x92, 0x134, 0x1f4, 0x340, 0xa9, 0x11f, 0x243, 0x5f, 0x196, 0x6d, 0x34c, 0x180, 0x277, 0x2a, 0x110, 0x4d, 0xfa, 0x340, 0x152, 0x75, 0x23c, 0x1f9, 0x2ac, 0x376, 0x121, 0x360, 0x339, 0x13c, 0x74, 0x4b, 0x1d3, 0x3bc, 0x33b, 0x1db, 0x20, 0x26b, 0x149, 0x248, 0x1b2, 0x37f, 0xca, 0x21a, 0x2bb, 0x319, 0x357, 0x13d, 0x203, 0x61, 0xc3, 0x3f1, 0x3c1, 0x29b, 0x172, 0x21e, 0x375, 0x3b1, 0x31e, 0x9, 0x1eb, 0x17a, 0x182, 0x225, 0x323, 0x176, 0x3d0, 0x3dd, 0x3f8, 0x22a, 0x3e1, 0xf0, 0x3b, 0x56, 0x2c7, 0xce, 0x3d4, 0x213, 0x350, 0x263, 0x2d5, 0x318, 0x120, 0x117, 0x313, 0x2c, 0x39, 0xb1, 0x293, 0x2ee, 0x34e, 0x3e7, 0x1d9, 0xc7, 0x23f, 0x369, 0x2d2, 0x46, 0x1f6, 0x26e, 0x2f0, 0x2ca, 0xeb, 0x206, 0x3d8, 0x41, 0x2a8, 0x2b8, 0x189, 0x329, 0x20d, 0x2d4, 0x16f, 0x10a, 0x7, 0x35e, 0xd6, 0x379, 0x1e3, 0x2e6, 0xd2, 0x2b7, 0x14b, 0x2af, 0x1e6, 0x15f, 0x50, 0x3ee, 0x32, 0x1bd, 0x3bd, 0x14c, 0x1f1, 0x130, 0xe7, 0xa8, 0x92, 0xd9, 0x37f, 0x194, 0x7a, 0x1f5, 0x1fc, 0x22a, 0x3cb, 0x3c0, 0x1d8, 0x169, 0x46, 0x3ec, 0x1aa, 0x3ad, 0xf3, 0x15f, 0xa0, 0x3a3, 0x190, 0x3e6, 0x355, 0x3b4, 0x14e, 0x22c, 0x199, 0x30, 0x2b4, 0x3bf, 0x356, 0x29d, 0xb6, 0x39a, 0xf2, 0x1b8, 0x8, 0x331, 0x149, 0x99, 0x2c1, 0x3ce, 0xbb, 0x3d0, 0x3b3, 0x3fb, 0x174, 0x267, 0x23f, 0x2db, 0x35a, 0x230, 0x35f, 0x14b, 0x157, 0x391, 0x2ea, 0x109, 0x127, 0x9b, 0x30f, 0x29e, 0x19f, 0x262, 0x144, 0xd3, 0x180, 0x18d, 0x1c7, 0x286, 0xc5, 0x1b9, 0xef, 0x399, 0x1db, 0x40, 0x1be, 0x25a, 0xc1, 0x225, 0x24f, 0x1d1, 0x2bf, 0x1a7, 0x3e7, 0x3b2, 0x31c, 0x1dc, 0x2f5, 0x2e6, 0x1a4, 0x2ce, 0x24a, 0x2aa, 0xb7, 0x37d, 0x5a, 0x12a, 0xd1, 0x4e, 0xdd, 0xe3, 0x334, 0x232, 0x291, 0x1b, 0x73, 0x223, 0x1d, 0x221, 0x1d3, 0x371, 0xf7, 0x2c3, 0x200, 0x1eb, 0x2f4, 0x201, 0x1ce, 0x2a0, 0x99, 0x18b, 0x323, 0x1d1, 0x177, 0x295, 0x307, 0x35e, 0x358, 0x3f5, 0x2e, 0x378, 0x24b, 0x93, 0x7c, 0x347, 0x22, 0x222, 0x1f4, 0x236, 0x21a, 0x2fe, 0x1fc, 0x5d, 0x337, 0x23f, 0x1bf, 0x173, 0x1a4, 0x195, 0x13a, 0x17d, 0x362, 0x363, 0x2ad, 0xd, 0x94, 0x11f, 0x23c, 0x3ed, 0x29a, 0xf, 0x308, 0x56, 0x30e, 0xfb, 0xd5, 0x3ad, 0x1e6, 0x175, 0x109, 0x24e, 0x26c, 0x4e, 0x1ba, 0x38c, 0x196, 0x368, 0x294, 0x2c9, 0x1fe, 0x3c1, 0x27e, 0x30d, 0x2a9, 0x33c, 0x206, 0x37b, 0x19, 0x37a, 0x1d7, 0x1da, 0x14e, 0x51, 0x26d, 0x180, 0x31a, 0x315, 0x1d, 0x4b, 0x345, 0x3be, 0x36b, 0xc6, 0x120, 0x55, 0x15c, 0x312, 0x17e, 0x130, 0x8a, 0x306, 0x290, 0x1f8, 0x36c, 0x1a5, 0x5b, 0x39a, 0x1e4, 0x2e9, 0x40, 0x37c, 0x17a, 0x201, 0x218, 0x162, 0xb5, 0x16f, 0x21, 0x70, 0x21d, 0x39d, 0x87, 0x392, 0x38f, 0x3c4, 0x81, 0x33f, 0x39c, 0x292, 0xc1, 0x86, 0xb1, 0xb5, 0x2de, 0x84, 0x380, 0x198, 0x35c, 0x188, 0x2e2, 0xf2, 0x2e9, 0x80, 0x1eb, 0x3c2, 0x58, 0x390, 0x26, 0x226, 0x183, 0x290, 0x3f0, 0x1ab, 0x133, 0x1b9, 0x3bc, 0x1ee, 0x235, 0x90, 0x55, 0x2b8, 0x53, 0x3e2, 0x324, 0x164, 0x30, 0x2c2, 0x38e, 0x1d, 0x96, 0x10f, 0x1cf, 0x2d5, 0xf6, 0x82, 0x2da, 0x2ef, 0x1da, 0x29c, 0x144, 0x34c, 0x36, 0x398, 0xf9, 0x29b, 0x382, 0x2a9, 0x271, 0xa, 0x3ee, 0x190, 0x383, 0x135, 0xe3, 0xcb, 0x368, 0x121, 0x336, 0x3eb, 0x67, 0x34b, 0x2f0, 0x27d, 0x2be, 0x109, 0x95, 0x1a2, 0x270, 0x396, 0x17c, 0x151, 0x305, 0x184, 0x56, 0x215, 0x3ec, 0x2a1, 0x2ae, 0xb7, 0x1ef, 0x1a9, 0x202, 0x94, 0x23e, 0xe2, 0x357, 0x1fa, 0x1e0, 0x3b0, 0x35a, 0xd2, 0x195, 0x274, 0x1fd, 0x326, 0x255, 0x11d, 0x340, 0x282, 0x17f, 0x1fc, 0xba, 0xc7, 0x1dc, 0x3c6, 0x233, 0x1ca, 0x331, 0x25a, 0x201, 0x72, 0x20d, 0x113, 0x183, 0x129, 0x3db, 0x143, 0x314, 0x345, 0x2e3, 0x2d5, 0x1ec, 0x208, 0x2fd, 0x2a3, 0x33e, 0x261, 0x368, 0x242, 0xc3, 0x367, 0x279, 0x1aa, 0x157, 0xb7, 0x3de, 0x2ad, 0x34, 0x152, 0x359, 0xfe, 0xba, 0x18e, 0x379, 0x20f, 0x378, 0x13e, 0x122, 0x33f, 0x150, 0x132, 0x43, 0xb1, 0x16a, 0x36a, 0x29, 0x7e, 0x36c, 0x29d, 0x1b9, 0x371, 0x3b1, 0x18c, 0x112, 0x2b2, 0x373, 0x1da, 0x131, 0x119, 0x256, 0x360, 0x3fc, 0x237, 0x34b, 0x1e9, 0x1e6, 0x1dd, 0xb4, 0x284, 0x4a, 0x23e, 0x1c4, 0x147, 0x3cb, 0x23f, 0x2f5, 0x31d, 0x1ca, 0x24d, 0xf8, 0x20e, 0x49, 0x364, 0x323, 0x34d, 0x35d, 0x21, 0x1c0, 0x198, 0x2b1, 0x229, 0x33d, 0x33b, 0x18f, 0x48, 0x55, 0x179, 0x14c, 0x32f, 0x22c, 0xd3, 0x1b, 0x398, 0x1f2, 0x27e, 0x2f, 0x2ca, 0x2ab, 0x280, 0x95, 0x344, 0x1d2, 0x8f, 0x3ed, 0x27a, 0xf0, 0x3b0, 0x26b, 0x17a, 0x2c, 0x329, 0x130, 0x59, 0x30, 0x31a, 0x9e, 0x349, 0x30d, 0x165, 0x2ab, 0x109, 0x254, 0x216, 0x11f, 0x1c4, 0x28e, 0x337, 0x1dc, 0x303, 0x378, 0x27c, 0x81, 0x1ce, 0x12d, 0x201, 0xe4, 0x26, 0x8a, 0x6, 0x161, 0x315, 0xe8, 0x2e4, 0x2a9, 0x1d6, 0xa0, 0x24e, 0x344, 0x3a4, 0x23c, 0x357, 0x3e1, 0x23f, 0x1e3, 0x6f, 0x24b, 0x91, 0x33f, 0x2a0, 0xc1, 0x218, 0x302, 0x113, 0x306, 0xad, 0x2e7, 0x1d, 0x258, 0xd4, 0x33c, 0x14, 0x34f, 0x26c, 0x270, 0x243, 0x3ed, 0xfd, 0x3c0, 0x1bf, 0x38a, 0x1ca, 0x93, 0x3e0, 0x54, 0x99, 0x43, 0x162, 0x1a1, 0x366, 0x290, 0x3db, 0x286, 0x4b, 0x21e, 0x263, 0x206, 0x3ee, 0x249, 0x4e, 0x1cb, 0x2f8, 0x29a, 0x78, 0x3b0, 0x173, 0x13b, 0x191, 0x7c, 0x20e, 0x92, 0x18b, 0x12e, 0xb5, 0x36a, 0x52, 0x1f8, 0x356, 0x18a, 0x345, 0x1cf, 0x346, 0x37b, 0xc8, 0x30f, 0x1ba, 0x5f, 0x151, 0xdf, 0x1e1, 0x160, 0x2fc, 0x241, 0x26d, 0x36, 0xff, 0x237, 0x137, 0x2af, 0x16e, 0x2cf, 0x11d, 0x236, 0x1e8, 0x34e, 0xe, 0x33, 0x35c, 0x5b, 0x1de, 0x3b1, 0x239, 0x104, 0x1f3, 0x135, 0x311, 0x2ac, 0xf, 0xec, 0x2bd, 0x13b, 0x322, 0x1f0, 0x54, 0x132, 0x10c, 0x302, 0x226, 0x3, 0x161, 0x223, 0x3a0, 0x30d, 0x2ca, 0x2be, 0x5a, 0x101, 0x250, 0x359, 0x3f8, 0x3b2, 0x358, 0x327, 0x253, 0x238, 0x1db, 0x12, 0x55, 0x1ed, 0xed, 0x262, 0xda, 0x242, 0x30c, 0x215, 0x35f, 0x13a, 0x3fd, 0x11, 0x134, 0x3ce, 0x34d, 0x16f, 0x210, 0xfc, 0x356, 0x314, 0x10f, 0x263, 0x5, 0x3a3, 0x26c, 0xe9, 0x11e, 0x357, 0x3cb, 0xee, 0x303, 0x2f9, 0x1e2, 0x1, 0xdf, 0x1e1, 0x160, 0x2fc, 0x241, 0x26d, 0x36, 0xff, 0x237, 0x137, 0x2af, 0x16e, 0x2cf, 0x11d, 0x236, 0x1e8, 0x34e, 0xe, 0x33, 0x35c, 0x5b, 0x1de, 0x3b1, 0x239, 0x104, 0x1f3, 0x135, 0x1be, 0x38d, 0x312, 0x393, 0xa2, 0x256, 0x336, 0x2c7, 0x3d1, 0x9d, 0x3fd, 0x22, 0xd9, 0x24f, 0xb5, 0x1b3, 0x129, 0x2e7, 0x74, 0x1c1, 0x165, 0x2be, 0xb4, 0xd, 0x2a4, 0x1f5, 0x3e7, 0x163, 0x333, 0x188, 0x273, 0x3dc, 0x239, 0x208, 0x3c5, 0x1ba, 0x17c, 0x13d, 0x3c0, 0x2f5, 0xde, 0x27c, 0x204, 0xdf, 0x3c2, 0x189, 0x3cd, 0x51, 0x12b, 0x19b, 0x367, 0x3ec, 0x24a, 0x3fa, 0x11, 0x268, 0x323, 0x25e, 0x2dd, 0x290, 0x377, 0x3a, 0x2e4, 0x2b6, 0x15f, 0x5a, 0x202, 0x152, 0x2fe, 0x3f7, 0x2b5, 0x39d, 0xc4, 0x33d, 0x1ee, 0x318, 0x104, 0x3e6, 0xdd, 0xbe, 0x29a, 0x1e0, 0x37e, 0x6f, 0x13e, 0x102, 0x26b, 0x1e1, 0x2c0, 0x3e2, 0x22c, 0x291, 0x2c9, 0x3b7, 0x1f6, 0x125, 0x1fd, 0x20c, 0x134, 0x395, 0x12f, 0x36a, 0x148, 0x3bf, 0x1d, 0x172, 0x15b, 0x2ab, 0x2d, 0x101, 0xa9, 0x17f, 0x3ff, 0x35e, 0x3ca, 0x62, 0x39a, 0xf7, 0x18c, 0x82, 0x37c, 0x22f, 0xa6, 0x14e, 0x6d, 0x8d, 0x56, 0x230, 0xb3, 0x7c, 0x54, 0xc1, 0xe4, 0x130, 0x2c8, 0x1b, 0x1fe, 0x19c, 0x2a1, 0x17d, 0x106, 0x134, 0x323, 0xb5, 0x366, 0xad, 0x315, 0x349, 0x5e, 0x1e6, 0x1ef, 0x145, 0x236, 0x3a9, 0x85, 0x380, 0x36c, 0x18a, 0x21e, 0x33c, 0xa0, 0x254, 0x94, 0x359, 0x3fb, 0x35e, 0x39d, 0x188, 0xef, 0x36b, 0x1ec, 0xc8, 0x4e, 0x243, 0x357, 0x337, 0x2fb, 0x170, 0x47, 0x2e9, 0x24, 0x2a8, 0x1d7, 0x275, 0xab, 0xf, 0x3b0, 0x38a, 0x24b, 0x81, 0x26b, 0x3c2, 0x312, 0x32f, 0x288, 0x294, 0x30c, 0x46, 0x195, 0x20b, 0x20e, 0x99, 0x218, 0x26, 0x59, 0x180, 0x339, 0x237, 0xd5, 0x2aa, 0x326, 0x222, 0x1e7, 0x293, 0x36a, 0x290, 0x2e7, 0xe8, 0x30d, 0x33a, 0x3ba, 0x2ad, 0x340, 0xf4, 0x295, 0x70, 0x269, 0x133, 0x345, 0x263, 0x14, 0x24e, 0x216, 0xea, 0x1fc, 0x36d, 0x2f6, 0x31, 0x39a, 0x1ee, 0x2f1, 0xae, 0x139, 0xcd, 0x1bb, 0x308, 0x35a, 0xe5, 0x91, 0x39c, 0x1e1, 0x312, 0x257, 0x232, 0x8d, 0xac, 0xd2, 0x191, 0x3c9, 0x292, 0x2c, 0x2fc, 0x22c, 0x256, 0xc3, 0x23, 0x195, 0x1f, 0x2a, 0xc1, 0x1c8, 0xc9, 0x26d, 0x1b0, 0x3b7, 0x3d1, 0x274, 0x3a7, 0x92, 0x86, 0x13, 0x59, 0x300, 0xff, 0x19c, 0x14b, 0x1fd, 0x22, 0x364, 0xb1, 0x113, 0xc, 0x73, 0x3c1, 0x137, 0x155, 0x326, 0x4d, 0x395, 0xb5, 0x2c5, 0x2b4, 0x9e, 0xf5, 0x3d2, 0x16e, 0x255, 0x3d9, 0x1d1, 0x2de, 0x148, 0x2e7, 0x1d0, 0x2f, 0x1e6, 0x3de, 0x11d, 0x194, 0x2ee, 0x84, 0x1f8, 0x105, 0x172, 0x165, 0x2ea, 0x352, 0x340, 0x1e8, 0x246, 0x380, 0x2d1, 0x221, 0xd4, 0x3ac, 0x2d, 0xd, 0x282, 0x36f, 0xe, 0x198, 0x29d, 0x345, 0xcf, 0x50, 0x254, 0x128, 0x17f, 0x3e7, 0x185, 0x35c, 0x2d8, 0x375, 0x103, 0x34f, 0x281, 0x75, 0x1fc, 0x2d3, 0x3ca, 0x188, 0x1eb, 0x2b8, 0x1da, 0xcb, 0x305, 0x3b0, 0x233, 0xf1, 0x8, 0x343, 0x1ed, 0x2cb, 0x251, 0x1e, 0x1bf, 0x1bc, 0x381, 0x40, 0x22e, 0x373, 0x275, 0x2ac, 0xf0, 0x1e3, 0x1fb, 0x37, 0x200, 0x154, 0x3ae, 0x38c, 0x14d, 0x389, 0x303, 0x3c3, 0x1b8, 0x24, 0x2b2, 0x14f, 0x5f, 0x27a, 0x77, 0x2e, 0x227, 0x1db, 0x120, 0x1bd, 0x26a, 0x2f8, 0x3f4, 0x3b8, 0x170, 0x11c, 0x2c3, 0x112, 0x1f3, 0x374, 0x3ed, 0x39f, 0x1ff, 0x392, 0xf2, 0x235, 0x82, 0x383, 0x396, 0x357, 0xc7, 0x3e3, 0xaf, 0x399, 0x18c, 0x19, 0x27, 0x8f, 0x28e, 0x231, 0x327, 0x171, 0xf7, 0x7b, 0xc8, 0x138, 0x71, 0x5d, 0x1ac, 0x10e, 0x39a, 0x3b1, 0x3d8, 0x249, 0x1d2, 0x388, 0x2e8, 0x17b, 0x62, 0xef, 0x1b7, 0x2ff, 0x26c, 0x28b, 0x7f, 0x36d, 0x3ca, 0x310, 0x371, 0x1a3, 0x3d5, 0x344, 0x75, 0x3f8, 0x35e, 0x26f, 0xb6, 0x3be, 0x103, 0x297, 0x216, 0x3a8, 0x3ff, 0x2c6, 0x3d6, 0x2f2, 0x2cb, 0xab, 0x78, 0x1e3, 0x3f6, 0xdc, 0x24, 0x16d, 0x135, 0x2f8, 0x3e1, 0x2fb, 0x392, 0x1e4, 0xc6, 0x19, 0x4e, 0x23c, 0x5d, 0x358, 0x31, 0xef, 0x36e, 0x3ee, 0x344, 0xea, 0x3fb, 0x2c6, 0x2b1, 0x2ed, 0x263, 0xa0, 0x284, 0x141, 0x2d7, 0x70, 0x36c, 0x4b, 0x2a9, 0x175, 0x2ad, 0x236, 0x177, 0x108, 0x3db, 0xe8, 0x5e, 0x32b, 0x32e, 0x3bb, 0x293, 0x366, 0x161, 0xf9, 0x29f, 0x2aa, 0x106, 0x1b2, 0x162, 0x8a, 0x180, 0x1fe, 0xfb, 0x13a, 0x347, 0x99, 0xe4, 0x192, 0x34c, 0x265, 0x46, 0xb3, 0x3e0, 0x12d, 0x160, 0x32f, 0x6d, 0x61, 0x1ad, 0x1ca, 0x81, 0x37c, 0x15c, 0x1da, 0x196, 0xf, 0x1bf, 0x378, 0x21f, 0x200, 0x2a8, 0x2a3, 0x5f, 0xfd, 0x1dc, 0x170, 0x238, 0x31e, 0x82, 0x30f, 0x243, 0x28e, 0x6b, 0x87, 0x39a, 0x36b, 0x37b, 0x26c, 0x11f, 0x1fc, 0x35e, 0xd7, 0x2d8, 0x1cf, 0x14, 0x254, 0xa9, 0x3dd, 0x3a5, 0x3da, 0x275, 0x2a2, 0x31b, 0x2e, 0x8e, 0x18f, 0x82, 0x217, 0x11e, 0x5d, 0x2b9, 0xc4, 0x371, 0x285, 0x127, 0x94, 0x1f5, 0x7, 0x269, 0x314, 0x350, 0x175, 0x153, 0xca, 0x3aa, 0xa4, 0x38e, 0x27e, 0x353, 0x193, 0x134, 0x25c, 0x45, 0x180, 0x3fc, 0x3ec, 0x1c2, 0x15, 0x304, 0x17e, 0xa2, 0x242, 0x2b0, 0x276, 0x244, 0x37c, 0x2b8, 0x361, 0xab, 0xf0, 0x385, 0x38f, 0x1db, 0x89, 0x3e6, 0x396, 0x147, 0x6b, 0x10e, 0x273, 0x36e, 0x3d5, 0x10b, 0x359, 0x3c7, 0x66, 0x133, 0x35, 0x351, 0x2d0, 0x289, 0x2bf, 0x108, 0x3bf, 0x3a0, 0x2f0, 0x2dc, 0x111, 0x323, 0x342, 0x18, 0x339, 0x338, 0x9d, 0x347, 0x132, 0x390, 0x8b, 0xa5, 0x2b, 0x1a4, 0x126, 0x331, 0x22f, 0x272, 0xcb, 0xf, 0x37e, 0x1fb, 0xdc, 0x48, 0x1bd, 0x1ba, 0x3d3, 0xc7, 0x397, 0x2e2, 0x3b1, 0x37b, 0xd1, 0x75, 0x3fb, 0x185, 0x2d6, 0x345, 0x271, 0x2d, 0x68, 0x343, 0x373, 0x38c, 0x27a, 0x3b8, 0x392, 0x399, 0x7b, 0x249, 0x28b, 0x3f8, 0x2c6, 0x2d6, 0x283, 0x1d6, 0x168, 0x289, 0x177, 0x29, 0x1c7, 0x27e, 0x2af, 0x245, 0x1b2, 0x181, 0xb2, 0xd8, 0x187, 0x32a, 0x3e0, 0xbd, 0x22d, 0x262, 0x1c3, 0x369, 0x378, 0x6e, 0x48, 0x37a, 0x2e1, 0x2a7, 0x6b, 0x21c, 0x1de, 0x346, 0x127, 0x128, 0x3dd, 0x38, 0x2d1, 0x258, 0x19d, 0x3de, 0x1f4, 0x34d, 0x2c5, 0x31a, 0x31f, 0x14b, 0x3ef, 0x248, 0x1c8, 0x8b, 0x14a, 0xac, 0x13b, 0x244, 0x2f1, 0x2f2, 0x33e, 0x2a2, 0x23f, 0xb8, 0x79, 0xc6, 0x64, 0xe9, 0x23b, 0x1af, 0x1ae, 0x2ed, 0x19e, 0x212, 0x68, 0x3d0, 0x42, 0x3db, 0x3a0, 0x1e9, 0x362, 0x9a, 0x25c, 0x8a, 0x209, 0x3df, 0x2b7, 0x3e, 0x149, 0x160, 0xa7, 0x2d9, 0x76, 0x233, 0x381, 0x200, 0x2b2, 0x26a, 0x3ed, 0xc7, 0x327, 0x39a, 0x1b7, 0x3d5, 0x216, 0x17f, 0x207, 0x269, 0x221, 0x15b, 0x3ba, 0x28f, 0x1d7, 0x5f, 0x3e1, 0x3f5, 0x171, 0x36b, 0x3ee, 0x216, 0x2fe, 0xe, 0x36c, 0x258, 0x33a, 0x363, 0x3bb, 0xb5, 0x6, 0x339, 0xfb, 0x1c2, 0x54, 0x2c, 0x32f, 0x368, 0x76, 0x6f, 0x21f, 0x24, 0x37a, 0x1cb, 0x28e, 0x358, 0x188, 0x3be, 0x14, 0x284, 0x21a, 0x85, 0x1f8, 0xe8, 0x2f0, 0x362, 0x134, 0x162, 0x59, 0xd8, 0x30e, 0xb3, 0x33f, 0x3c2, 0x139, 0x196, 0x78, 0x303, 0x47, 0x31e, 0x19, 0x270, 0x23b, 0x35e, 0x2b1, 0x345, 0x1d6, 0x2d0, 0x236, 0x3aa, 0x290, 0x9e, 0x29f, 0x17d, 0x110, 0x218, 0x192, 0x256, 0x56, 0x13b, 0x81, 0x3d6, 0x3bd, 0x38c, 0xfd, 0x2fb, 0xaf, 0x1ee, 0x37b, 0x344, 0x359, 0x307, 0x269, 0x4b, 0x165, 0x1ef, 0x1f4, 0x293, 0x306, 0xe6, 0x19c, 0x13a, 0x20e, 0x201, 0x3e2, 0x6d, 0x308, 0x38a, 0x3c4, 0x200, 0x16d, 0x1ba, 0x357, 0x6b, 0x31, 0x371, 0x206, 0x254, 0x141, 0x295, 0x3f, 0x1d, 0x5e, 0x117, 0x355, 0x2f8, 0x267, 0x247, 0xef, 0x285, 0x12a, 0x141, 0x123, 0xfc, 0xe8, 0x1e9, 0x193, 0x1b2, 0x20d, 0x332, 0x265, 0x69, 0x24c, 0x37c, 0x1ed, 0x1c6, 0xfd, 0x1ff, 0x2bc, 0x36b, 0x3d5, 0x4a, 0x3dd, 0xe0, 0x143, 0x30d, 0x25f, 0x111, 0x12e, 0x114, 0x6c, 0x30e, 0x166, 0xe7, 0x22f, 0x3b4, 0x2ac, 0x23f, 0x2e0, 0x399, 0x1ec, 0xd1, 0x3a8, 0x307, 0xdb, 0x12c, 0x33a, 0x2cf, 0x2f7, 0x1a1, 0x60, 0x3f1, 0x2b7, 0xf8, 0xbd, 0xa6, 0x261, 0x3c, 0x303, 0x8e, 0x63, 0xc8, 0x341, 0x3f9, 0x21d, 0x266, 0x350, 0x3ba, 0x7d, 0x34d, 0x306, 0x1cc, 0x279, 0x1c2, 0xa8, 0xb0, 0x14e, 0x2e5, 0x2db, 0x3f6, 0x1db, 0x41, 0x4e, 0x388, 0x1af, 0x2b1, 0x283, 0x351, 0x2ad, 0x328, 0x1b5, 0x161, 0x38b, 0x296, 0x347, 0x182, 0x1f1, 0x6d, 0x219, 0x233, 0x21f, 0x48, 0x1f3, 0x243, 0xba, 0x3ca, 0x2d8, 0xcf, 0x2d, 0x340, 0x2ee, 0x148, 0x9e, 0x22e, 0x14f, 0x3ed, 0x231, 0x62, 0x3be, 0x50, 0x1a, 0x3a9, 0x29, 0x223, 0x29f, 0x1fd, 0x124, 0x329, 0x144, 0xc2, 0x38a, 0x30b, 0x48, 0x3e6, 0x11e, 0x1d9, 0xd7, 0x3a6, 0x3ac, 0x2ad, 0x259, 0x2dd, 0x31a, 0xce, 0x274, 0x54, 0xb0, 0x29c, 0x386, 0x2f5, 0x317, 0x31e, 0x64, 0x341, 0x3fb, 0x66, 0x314, 0x165, 0x3b5, 0x37f, 0x1a1, 0xc0, 0x3df, 0x195, 0x39b, 0x38d, 0x1da, 0x2ac, 0x77, 0x392, 0xf7, 0x2ff, 0x216, 0x3ea, 0xe0, 0x286, 0x2f, 0x2dc, 0x134, 0x181, 0x199, 0x265, 0xd2, 0x122, 0x3d6, 0x2ef, 0xbe, 0x337, 0x247, 0x1de, 0x206, 0x142, 0x3d, 0x21, 0x377, 0xf5, 0x2aa, 0x88, 0x39, 0x8b, 0x242, 0x35a, 0x27c, 0x100, 0x2da, 0x1cb, 0x22a, 0x1e5, 0x2d8, 0x19e, 0xb4, 0x236, 0x2b3, 0x15a, 0x3c1, 0x296, 0x287, 0x201, 0x393, 0x2d9, 0x3b0, 0x1fb, 0x1db, 0x82, 0x138, 0x7f, 0x2c6, 0x29d, 0x1a8, 0x3ba, 0xfa, 0x12f, 0x6, 0x55, 0x135, 0x357, 0x358, 0x5b, 0x263, 0x5a, 0x236, 0x16f, 0x161, 0x237, 0x13a, 0x54, 0x160, 0x262, 0xf, 0x303, 0x238, 0x239, 0x26c, 0x359, 0xe, 0x356, 0x30d, 0x16e, 0x134, 0x302, 0x26d, 0x30c, 0x13b, 0x1, 0x55, 0x135, 0x357, 0x358, 0x5b, 0x263, 0x5a, 0x236, 0x16f, 0x161, 0x237, 0x13a, 0x54, 0x160, 0x262, 0xf, 0x303, 0x238, 0x239, 0x26c, 0x359, 0xe, 0x356, 0x30d, 0x16e, 0x134, 0x302, 0x26d, 0x30c, 0x13b, 0x1, 0x55, 0x135, 0x357, 0x358, 0x5b, 0x263, 0x5a, 0x236, 0x16f, 0x161, 0x237, 0x13a, 0x54, 0x160, 0x262, 0xf, 0x303, 0x238, 0x239, 0x26c, 0x359, 0xe, 0x356, 0x30d, 0x16e, 0x134, 0x302, 0x26d, 0x30c, 0x13b, 0x1, 0x55, 0x135, 0x357, 0x358, 0x5b, 0x263, 0x5a, 0x236, 0x16f, 0x161, 0x237, 0x13a, 0x54, 0x160, 0x262, 0xf, 0x303, 0x238, 0x239, 0x26c, 0x359, 0xe, 0x356, 0x30d, 0x16e, 0x134, 0x302, 0xaa, 0xdd, 0x28e, 0x1e5, 0x372, 0x1d6, 0x153, 0x2ec, 0x306, 0x27b, 0x35f, 0x3e0, 0x38d, 0x361, 0x29a, 0x1ff, 0x1cd, 0x346, 0xa1, 0x7a, 0x108, 0x223, 0x26e, 0x3ef, 0x182, 0x393, 0x376, 0x37e, 0x227, 0xc6, 0x9b, 0x3a8, 0xe, 0x2a5, 0x2f, 0x362, 0x364, 0x98, 0x256, 0x169, 0x13e, 0x200, 0x2fd, 0x11e, 0x36d, 0x16b, 0x6a, 0x3ba, 0x3e8, 0x2d4, 0x180, 0x2c7, 0x2cc, 0x26b, 0x1ed, 0x22b, 0x337, 0x10e, 0x1df, 0xa0, 0xd0, 0x1d5, 0xad, 0x38b, 0x9d, 0x54, 0x2c0, 0x19a, 0x78, 0x5c, 0x399, 0x37b, 0x25, 0x36f, 0x3f, 0x1d0, 0x2af, 0x22, 0x39, 0x22c, 0x61, 0x31d, 0x6e, 0x112, 0x9c, 0xfe, 0x21d, 0x314, 0x19d, 0x32e, 0x24f, 0x228, 0x2c9, 0x69, 0x244, 0x28f, 0x14f, 0x3af, 0x358, 0xb6, 0x19e, 0x2d0, 0x328, 0x1b3, 0xe6, 0x1f6, 0x3e, 0x17a, 0x272, 0x2ac, 0x1dc, 0x15e, 0x1b7, 0x24e, 0x282, 0x214, 0x2e7, 0x3a1, 0x1fd, 0x99, 0x154, 0x374, 0x5d, 0x26f, 0x283, 0x175, 0xfa, 0x16a, 0x180, 0x187, 0x322, 0x37c, 0x2ef, 0x1f9, 0x6b, 0x229, 0xcf, 0x2d0, 0x259, 0x2c5, 0x339, 0x35f, 0x3c9, 0x22f, 0x33e, 0x1fa, 0x397, 0x3bc, 0x28, 0x68, 0x1d5, 0x15a, 0x237, 0xe1, 0x149, 0xa6, 0x251, 0x77, 0xaf, 0x1b7, 0x95, 0x21a, 0x84, 0x223, 0xd5, 0x3a7, 0xb, 0x14e, 0x203, 0x20f, 0x1e4, 0x3b9, 0x25, 0x2d7, 0xfc, 0x29b, 0x2aa, 0x49, 0x25b, 0x6d, 0x1d8, 0x3e5, 0x31e, 0x320, 0x1d4, 0xe, 0x143, 0xbc, 0x326, 0x225, 0x324, 0x8d, 0x1c5, 0x37, 0x112, 0x138, 0x3f8, 0xcc, 0x12c, 0x3cc, 0x222, 0x181, 0xd3, 0x56, 0x321, 0x80, 0x37a, 0x11e, 0x2d3, 0x1a5, 0x350, 0x3de, 0x1e7, 0x45, 0x1b0, 0x230, 0x244, 0x117, 0x135, 0x147, 0x1e5, 0x2ed, 0x351, 0x28a, 0x293, 0x18, 0x3df, 0xb3, 0x331, 0x1ed, 0x5f, 0xc7, 0x62, 0x1cf, 0x2d, 0x65, 0x36a, 0x73, 0x1f6, 0x7c, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x1, 0x2a8, 0x1cb, 0x2e8, 0x2b1, 0xd4, 0x1ef, 0x1e7, 0x8a, 0x2c9, 0x1a4, 0x159, 0x325, 0x36d, 0x34a, 0x2b6, 0x32e, 0x25c, 0x332, 0x56, 0x9f, 0x12, 0x30f, 0x7f, 0x66, 0x258, 0x25f, 0xd9, 0x130, 0x121, 0x1c5, 0xdc, 0x104, 0x28b, 0x307, 0x2a5, 0x178, 0x106, 0x39, 0x144, 0x76, 0x3e5, 0x63, 0x26c, 0x1f5, 0x21b, 0x349, 0x15d, 0x248, 0x3e2, 0x2e5, 0x385, 0x1e4, 0x2ff, 0x250, 0x85, 0x1c7, 0x26e, 0x347, 0x58, 0x19a, 0x3c0, 0x32d, 0x1b7, 0x254, 0x1e8, 0x148, 0x3c1, 0x274, 0x292, 0x139, 0x2a2, 0x3fe, 0xef, 0x28, 0x1a0, 0x16f, 0x23d, 0x3ec, 0x3e0, 0x57, 0x1c6, 0x337, 0x62, 0x335, 0x2d0, 0x176, 0x3, 0x3eb, 0x166, 0x1be, 0x1d7, 0x3d3, 0x17b, 0x2ed, 0x15f, 0xfa, 0x1a1, 0x36, 0x118, 0x81, 0xaa, 0x2e1, 0x2e8, 0x16b, 0x350, 0x363, 0x24f, 0x164, 0x30c, 0x394, 0x100, 0x3e6, 0x388, 0x30a, 0x4b, 0x3cc, 0x9a, 0x26, 0xa5, 0x2bd, 0x21f, 0x224, 0x1d2, 0x3e7, 0x2d1, 0x2f, 0x326, 0x86, 0x22c, 0x308, 0x2b2, 0x8f, 0x35e, 0xc5, 0x27d, 0x222, 0x13, 0xa5, 0x173, 0x6e, 0x104, 0x11f, 0x7, 0x105, 0x3ad, 0x88, 0x25b, 0x368, 0x2f5, 0x79, 0x37b, 0x250, 0x10a, 0x315, 0x354, 0x15, 0x312, 0x251, 0x3b8, 0x39a, 0xa, 0xd0, 0x16f, 0x73, 0x3ab, 0x33f, 0x179, 0xbe, 0x6b, 0x16c, 0x3ac, 0x23a, 0x2d4, 0x36, 0x230, 0x204, 0x159, 0x243, 0x1af, 0x266, 0x33a, 0x111, 0x20d, 0x256, 0x2bd, 0x37, 0x82, 0x28b, 0x207, 0x286, 0x3d2, 0x44, 0x329, 0x1b4, 0x37e, 0x238, 0x3b9, 0x128, 0x85, 0x38e, 0x1aa, 0x20e, 0x189, 0x32c, 0x1dc, 0x1cd, 0x5, 0x68, 0x2b3, 0x23d, 0x3d1, 0x39b, 0x2b8, 0x5f, 0x231, 0xb6, 0x1d6, 0x11d, 0x16a, 0x1b, 0x118, 0x102, 0x2a8, 0x325, 0x2d3, 0x133, 0x19d, 0x28c, 0x302, 0x12b, 0x35a, 0x21f, 0x41, 0x341, 0x307, 0x143, 0x1e9, 0x22, 0x390, 0xda, 0x1bf, 0x11c, 0x3d8, 0x94, 0x246, 0x1c7, 0xd5, 0x107, 0x2c0, 0x196, 0x16d, 0x23c, 0x2c6, 0x4b, 0x32b, 0x1b2, 0x192, 0x61, 0x378, 0x31e, 0x26c, 0x3dd, 0x1f8, 0x3d4, 0x3ef, 0x2c, 0x334, 0x23f, 0x171, 0x206, 0x68, 0x16f, 0xe6, 0x2b7, 0x1ce, 0x3bd, 0x3ed, 0x2f6, 0x345, 0x3ba, 0x1e7, 0x59, 0x30c, 0x24b, 0x24, 0x4e, 0x3fb, 0x36c, 0x5e, 0x106, 0xe4, 0x6d, 0x1bf, 0x238, 0x37b, 0xa9, 0x21, 0x9e, 0x125, 0x2a0, 0x139, 0x29a, 0x397, 0x3be, 0x5a, 0xbb, 0x6, 0x367, 0x93, 0x28f, 0x1ba, 0x2e8, 0x1a5, 0x165, 0x146, 0x302, 0x256, 0x173, 0xdc, 0x19, 0xea, 0x70, 0xe8, 0x2aa, 0x99, 0x32f, 0xf, 0x170, 0x36b, 0x254, 0x3a9, 0xad, 0x19c, 0x7c, 0x22f, 0x38c, 0x18e, 0x5b, 0x1d6, 0x23a, 0x1a1, 0xd8, 0x1a4, 0x8, 0x37a, 0x1c4, 0x21d, 0x258, 0x16e, 0x18b, 0x8b, 0x308, 0x3f6, 0xc6, 0x344, 0x2d7, 0x3db, 0x29f, 0x347, 0x160, 0x196, 0x1dc, 0x39a, 0x14, 0x340, 0x36a, 0x339, 0x195, 0x26b, 0x1d7, 0x2da, 0xe2, 0x21d, 0xb9, 0x1b1, 0x43, 0xa2, 0x1d8, 0x47, 0x3d8, 0x250, 0x21, 0x13c, 0x9d, 0x12d, 0x3b4, 0x3f4, 0x31, 0xcf, 0x2a6, 0xb5, 0x36, 0xd2, 0x8, 0x2fd, 0x319, 0xcc, 0x1c1, 0x193, 0x218, 0x119, 0x2db, 0x238, 0x2ff, 0x2a4, 0x108, 0x1f2, 0xe1, 0x17a, 0x19f, 0x39f, 0x188, 0x271, 0x11d, 0x1a1, 0x1b0, 0x299, 0x40, 0x3c5, 0xfe, 0x269, 0x213, 0x83, 0xe4, 0xda, 0x2f5, 0x1e4, 0x3d5, 0x10d, 0x52, 0x38b, 0x301, 0x3c2, 0xe3, 0xc7, 0x5b, 0x3ac, 0xfa, 0x113, 0x19b, 0xe5, 0x200, 0x217, 0x3f9, 0x36c, 0xbc, 0x11, 0x329, 0x2d9, 0x385, 0x33b, 0x297, 0x7a, 0x290, 0x67, 0x3e, 0x22f, 0x311, 0x231, 0x2d8, 0x15f, 0x3d9, 0x8a, 0xc3, 0x321, 0x24, 0x9c, 0x3f7, 0x356, 0x1e9, 0x88, 0x17e, 0x2e5, 0x17, 0x1ee, 0x95, 0x3d0, 0xad, 0x338, 0x1f0, 0x15c, 0xbe, 0x1ac, 0x2ed, 0x2ea, 0x2f7, 0x59, 0x211, 0x13e, 0x120, 0x1bd, 0x388, 0xcc, 0x382, 0x245, 0xe4, 0x1b4, 0x3c6, 0x33b, 0x127, 0x1e8, 0xad, 0x279, 0x3c9, 0x2f2, 0x3f2, 0x1e5, 0x21e, 0x3b5, 0x25c, 0x34c, 0x2bd, 0x1b8, 0xc8, 0x17f, 0x7e, 0x3d4, 0x3a7, 0x2c0, 0xab, 0x3fe, 0x2eb, 0x5a, 0x2ec, 0x60, 0x46, 0x204, 0x2da, 0x1c4, 0x66, 0x1c1, 0x326, 0x72, 0xda, 0x1e3, 0x399, 0x297, 0xf4, 0x252, 0x338, 0x3e0, 0x179, 0x1f9, 0x2f6, 0x10f, 0x3de, 0x12e, 0x1a6, 0x35a, 0xdc, 0x64, 0x2bb, 0x3f, 0x1ea, 0x3d7, 0x160, 0x251, 0x1ff, 0x371, 0x2d, 0x176, 0x30, 0x23, 0x102, 0x16d, 0xe2, 0x33, 0x2e4, 0x193, 0x39, 0x6d, 0x2f5, 0x3c8, 0x34f, 0x7a, 0x129, 0x19c, 0x1f0, 0x2b8, 0x2f8, 0x17b, 0x283, 0x1ef, 0x97, 0xd3, 0x1ad, 0x6e, 0x32, 0x359, 0x21b, 0xf5, 0x3ef, 0xb0, 0x32c, 0x2fb, 0x3bc, 0x212, 0xbb, 0x18, 0x215, 0x81, 0x2b2, 0x71, 0x21d, 0x172, 0x2cd, 0x218, 0x232, 0x37e, 0x1e4, 0x37a, 0x23b, 0x269, 0x5e, 0x22, 0x17e, 0x386, 0x170, 0x36e, 0xd, 0x16f, 0x339, 0xb3, 0x3d6, 0x1ba, 0x36d, 0x18a, 0x32b, 0x18b, 0x51, 0x3b0, 0x238, 0x3ee, 0x21a, 0x290, 0x19c, 0x3e0, 0x2f2, 0x3ed, 0x39d, 0xd4, 0x32e, 0x302, 0x294, 0x6f, 0x31e, 0x344, 0x295, 0x315, 0x125, 0x12d, 0x2cb, 0x337, 0x5b, 0x2ab, 0x3bb, 0x59, 0x56, 0x3c4, 0x82, 0xea, 0x380, 0x27e, 0x3ef, 0x160, 0xab, 0x3f5, 0x3be, 0x2d0, 0x293, 0x1b, 0x1a4, 0x40, 0x30f, 0x3fb, 0x356, 0x3ad, 0x92, 0x32f, 0x78, 0xaf, 0x206, 0x340, 0x366, 0x3eb, 0x93, 0x55, 0x243, 0x2c6, 0x258, 0x362, 0x218, 0x6d, 0x1e3, 0x33b, 0x24e, 0x3a9, 0x161, 0x3d1, 0x1ce, 0x1d7, 0x28e, 0x2b1, 0x165, 0x222, 0x130, 0x61, 0x3f6, 0x239, 0x94, 0x21, 0xf9, 0x1c2, 0x3c2, 0x38c, 0x6b, 0x2ed, 0x3ba, 0x323, 0x26d, 0x1ad, 0xdc, 0xc8, 0x2fe, 0x1f8, 0x29f, 0x20e, 0xa6, 0x29a, 0x87, 0x2fd, 0xfe, 0x36c, 0x1e9, 0x49, 0x32f, 0xf0, 0x2bc, 0x14, 0x65, 0x3, 0x30e, 0x102, 0x1bd, 0x23b, 0xdb, 0x178, 0x110, 0x3cd, 0x3c, 0xaf, 0x5, 0x11b, 0x306, 0x2c7, 0x244, 0x16d, 0x388, 0x330, 0x5e, 0x44, 0x1f1, 0xf, 0x32d, 0x103, 0x340, 0x2c5, 0x3b7, 0x91, 0x159, 0xe2, 0xcc, 0x213, 0x11, 0x17e, 0x305, 0x1c9, 0x346, 0xd0, 0x1b3, 0x3eb, 0x126, 0x154, 0x23c, 0x33, 0x382, 0x106, 0x25b, 0x1c3, 0x170, 0x2d5, 0x34, 0x36a, 0x3fc, 0x24d, 0x55, 0x8f, 0x30a, 0x2e4, 0x245, 0x390, 0x376, 0x5c, 0x1b7, 0xd, 0x2de, 0xff, 0x191, 0x117, 0x325, 0x2c6, 0xb9, 0x193, 0xe4, 0x2d9, 0x17, 0x36b, 0x101, 0x2b3, 0x339, 0x166, 0x343, 0x1cb, 0x2b5, 0x12c, 0x362, 0x39, 0x1b4, 0x303, 0x3dc, 0x142, 0x3aa, 0x1cc, 0x25d, 0x3d6, 0x374, 0x1af, 0x4b, 0x2dc, 0x10c, 0x6d, 0x3c6, 0xf7, 0x254, 0x2ee, 0x73, 0x195, 0x2f1, 0xdd, 0x36d, 0x1f3, 0x3f8, 0x356, 0x2af, 0x132, 0x262, 0xee, 0x1de, 0x5a, 0x34d, 0x36, 0x13b, 0x12, 0xe9, 0xe, 0x3a0, 0x3fd, 0x160, 0x2ac, 0x327, 0x263, 0x11d, 0x226, 0x30c, 0x1e2, 0x104, 0x359, 0xfc, 0x137, 0x54, 0xed, 0x3cb, 0x5b, 0x2be, 0x3ce, 0x26d, 0x2bd, 0x1db, 0x26c, 0x34e, 0x223, 0x13a, 0x1e1, 0x311, 0x358, 0x10f, 0x2cf, 0x302, 0x242, 0x2f9, 0x239, 0x250, 0x210, 0x237, 0x1f0, 0x1ed, 0x357, 0x35c, 0x2ca, 0x134, 0x241, 0xec, 0x238, 0x3a3, 0x1e8, 0x161, 0x35f, 0xdf, 0x135, 0x3b2, 0x314, 0x16e, 0x10c, 0xda, 0x303, 0x3b1, 0x101, 0x16f, 0xff, 0x322, 0x55, 0x11e, 0x33, 0x30d, 0x11, 0x2fc, 0xf, 0x253, 0x5, 0x236, 0x3, 0x215, 0x1, 0x1f3, 0x3f8, 0x356, 0x2af, 0x132, 0x262, 0xee, 0x1de, 0x5a, 0x34d, 0x36, 0x13b, 0x12, 0xe9, 0xe, 0x3a0, 0x3fd, 0x160, 0x2ac, 0x327, 0x263, 0x11d, 0x226, 0x30c, 0x1e2, 0x104, 0x359, 0x3e6, 0x3fb, 0x286, 0x2aa, 0x201, 0x196, 0x3f5, 0x1cf, 0x145, 0x113, 0x30c, 0x3c4, 0x19, 0x2fe, 0x3db, 0x2a1, 0x12d, 0x275, 0x6b, 0x345, 0x363, 0x302, 0x8d, 0x3f6, 0x1ec, 0x141, 0x290, 0xfb, 0x1ce, 0x2a3, 0x2e8, 0x18a, 0x16e, 0x218, 0x368, 0x2e, 0x36e, 0x68, 0x366, 0x367, 0x81, 0x37a, 0x1fc, 0x356, 0x157, 0xc1, 0x334, 0x2fb, 0x3be, 0x2ad, 0x1a1, 0x265, 0x27c, 0x82, 0x359, 0x1f8, 0xd5, 0x2a0, 0x2cb, 0x18e, 0x2ed, 0x1ef, 0x162, 0x294, 0x378, 0x239, 0xa9, 0x52, 0x19c, 0x33f, 0x1d7, 0x5d, 0x133, 0x32b, 0x43, 0x6d, 0x303, 0x36b, 0xd, 0x36a, 0x3eb, 0x91, 0x16d, 0x23b, 0x36c, 0x3ad, 0x99, 0x262, 0x1dc, 0x371, 0x2d0, 0xb5, 0x2c9, 0x24b, 0x112, 0xea, 0x3f, 0x29f, 0x54, 0x1da, 0x337, 0x2d8, 0x3ba, 0x12e, 0x256, 0x6f, 0xc6, 0x94, 0x108, 0x237, 0x3e0, 0x3bd, 0x28e, 0x1a5, 0x1e6, 0x18b, 0x288, 0x1e3, 0x1ee, 0x284, 0x3c5, 0x3f7, 0x1d, 0x2fa, 0xb0, 0x151, 0x10e, 0xeb, 0x3bb, 0x199, 0x2bd, 0x365, 0x281, 0x214, 0x3c1, 0xf8, 0x3da, 0x28e, 0x34a, 0x391, 0x43, 0xda, 0x17, 0x36e, 0xd0, 0x183, 0x30e, 0x2, 0x383, 0x3e7, 0x3a, 0x1fd, 0x160, 0x2a2, 0x21c, 0x1d6, 0x37f, 0x332, 0x173, 0x2c3, 0x10b, 0x21, 0x38b, 0x1f0, 0x3bd, 0x115, 0x29d, 0x32b, 0x86, 0x1b4, 0x2e, 0x2d5, 0x1a0, 0x306, 0x215, 0x4, 0x30f, 0x3c7, 0x74, 0x3fa, 0x2c0, 0x14d, 0x31, 0x3ac, 0x2f7, 0x26d, 0x2e6, 0x18f, 0x216, 0x42, 0x31f, 0x3e0, 0x373, 0x22a, 0x133, 0x25f, 0x10c, 0x368, 0x5c, 0x1a3, 0x340, 0x205, 0x23, 0x8, 0x217, 0x387, 0xe8, 0x3fd, 0x189, 0x29a, 0x62, 0x351, 0x1e7, 0xd3, 0x1c5, 0x31e, 0x25, 0x84, 0x237, 0x3c9, 0x2ef, 0x5d, 0x266, 0xb7, 0x218, 0x2d9, 0xb8, 0x346, 0x289, 0x3, 0x46, 0x10, 0x27, 0x307, 0x1d0, 0x3f3, 0x312, 0x13d, 0xc4, 0x2ab, 0x383, 0x3c7, 0xe8, 0x3f3, 0x22d, 0xfd, 0x229, 0x2ea, 0x12e, 0x14a, 0x2f9, 0x1ec, 0x10d, 0x15a, 0x2b7, 0x1eb, 0x396, 0x21d, 0x2f, 0x220, 0x14e, 0xee, 0x2eb, 0x2ad, 0x28d, 0x211, 0x21f, 0x320, 0x1a7, 0x9e, 0x301, 0x2b8, 0x357, 0x2d6, 0x3cc, 0x43, 0x1b4, 0x5c, 0x346, 0x11b, 0xc, 0x230, 0x100, 0xe9, 0x70, 0x1ea, 0x15, 0x1da, 0xc7, 0x1d3, 0x363, 0x13, 0xc2, 0x47, 0x3a3, 0x35b, 0xe6, 0x2cc, 0xaa, 0x1c4, 0x1b6, 0x353, 0xc1, 0xcb, 0x3e3, 0x263, 0xfa, 0xb2, 0x1ad, 0x3b6, 0x281, 0x21, 0x31f, 0x3c9, 0x1d7, 0x174, 0x314, 0x362, 0x390, 0x305, 0xaf, 0x50, 0x176, 0x1b, 0xe5, 0x240, 0xea, 0xfc, 0x1aa, 0x12d, 0x1c6, 0x2b9, 0xd4, 0x111, 0x324, 0x3b0, 0x399, 0xa1, 0x16f, 0x3f1, 0x122, 0x37a, 0x3f9, 0x105, 0x17d, 0xb0, 0x2a2, 0x31, 0x351, 0x3ce, 0x34c, 0x233, 0x18c, 0xa9, 0x148, 0x1f6, 0x26b, 0xdd, 0x2b5, 0x2e4, 0x30f, 0x307, 0x349, 0x347, 0x139, 0x337, 0x2ed, 0x363, 0x26, 0x308, 0x238, 0x24e, 0x3aa, 0x1fe, 0x91, 0x37a, 0x3fb, 0x1d, 0x3fa, 0x312, 0xfd, 0x5b, 0x3ba, 0x162, 0x8d, 0x38f, 0x3ee, 0x3a9, 0xe6, 0x191, 0x2a8, 0x23b, 0x356, 0x2aa, 0x2c, 0x151, 0x31, 0x2ab, 0x323, 0x256, 0x378, 0x1ec, 0x21a, 0x161, 0x195, 0x28f, 0x23c, 0x269, 0x3ad, 0xc1, 0x196, 0x397, 0x33c, 0x3bb, 0x26d, 0x38a, 0xc6, 0xa9, 0x290, 0x3d1, 0x37c, 0x1cb, 0x21d, 0x5e, 0x92, 0x262, 0x2fb, 0x1cf, 0x23a, 0x59, 0x1ad, 0x365, 0x216, 0x108, 0x19c, 0x1ce, 0x135, 0x35e, 0x2e4, 0x22, 0x32f, 0x23f, 0x371, 0x2ad, 0x113, 0x56, 0xdc, 0x26c, 0x85, 0x3c1, 0x3e0, 0x1d7, 0x2e8, 0x4b, 0x326, 0x17e, 0x78, 0x39a, 0x5a, 0xb5, 0x265, 0x3c4, 0xc8, 0x2d7, 0x9e, 0x20b, 0x2f2, 0x28e, 0x133, 0x16e, 0xe4, 0x386, 0xaf, 0xa0, 0x1d1, 0xd8, 0x24b, 0x82, 0x2fe, 0x2e7, 0x217, 0x7, 0x27e, 0x15, 0x361, 0x6b, 0x35, 0x111, 0x8b, 0x37e, 0x3b1, 0x68, 0x205, 0x118, 0x200, 0x341, 0x21b, 0xd5, 0x25a, 0x22b, 0x39d, 0x2ca, 0x2c1, 0x6d, 0x5c, 0x103, 0x194, 0x300, 0xe5, 0x112, 0x2bb, 0x377, 0x13a, 0x57, 0x3af, 0x1a5, 0x25f, 0x72, 0x386, 0x15e, 0x280, 0x293, 0x19b, 0x1e2, 0xc8, 0x1a7, 0x278, 0x7c, 0x373, 0x174, 0x4b, 0x245, 0x1f1, 0x3c0, 0x1de, 0x352, 0x113, 0xac, 0x370, 0x344, 0x42, 0xce, 0x1ce, 0x26a, 0x163, 0x30d, 0x220, 0x131, 0x2fb, 0x39e, 0xfa, 0x2c8, 0x2e6, 0x63, 0xa9, 0x129, 0x35f, 0x3d6, 0x8f, 0x330, 0x3ad, 0x182, 0x251, 0x87, 0x3ac, 0x395, 0x256, 0x2f9, 0x3b9, 0xf4, 0x23d, 0x2cc, 0x2a8, 0x7f, 0x143, 0x17d, 0x2c0, 0x27a, 0x5b, 0x37d, 0x181, 0x61, 0x8e, 0x127, 0x3aa, 0x3fc, 0x244, 0x3e6, 0x3c7, 0x3a0, 0x347, 0x272, 0xc7, 0x345, 0x255, 0xc9, 0x3b0, 0x27f, 0x202, 0x366, 0x27, 0x1c, 0x3d4, 0x150, 0xe3, 0x2f6, 0x2b6, 0x364, 0x6d, 0xb8, 0x5, 0xbb, 0x6c, 0x9f, 0x19, 0x36f, 0x13c, 0x7c, 0x2ef, 0x1d9, 0x258, 0x11, 0x257, 0x1dc, 0x2e3, 0x7d, 0x2c8, 0x1c5, 0x18c, 0x141, 0x2b4, 0x32a, 0x55, 0x319, 0x2a5, 0x17d, 0x189, 0x1fa, 0x2d8, 0x3b5, 0x4c, 0x76, 0x399, 0x101, 0x366, 0x23, 0x80, 0x3a4, 0x21b, 0x1aa, 0x17a, 0x17c, 0x1ae, 0x1e6, 0x10c, 0x2e5, 0xaf, 0x280, 0x12f, 0x265, 0x30b, 0x9b, 0x85, 0x31f, 0x277, 0x135, 0x163, 0x213, 0x92, 0x19a, 0x3e3, 0x33c, 0x2f7, 0x291, 0x378, 0x3b9, 0x1e8, 0xe6, 0x24d, 0x2da, 0x3fb, 0x74, 0x3d7, 0x139, 0xc7, 0x283, 0x146, 0x241, 0x37e, 0x36b, 0x1a0, 0xc, 0x1a4, 0x90, 0x1d4, 0x3db, 0x9d, 0x57, 0x357, 0x29d, 0x2dc, 0x329, 0x3c, 0x33d, 0x2d0, 0x28d, 0xac, 0x2e9, 0x10b, 0x210, 0xfb, 0x1be, 0x396, 0xcc, 0x3d2, 0x182, 0xab, 0x21c, 0x15f, 0x12e, 0x4e, 0x70, 0x29f, 0x12d, 0x5f, 0xd7, 0x1e6, 0x218, 0x386, 0x171, 0x5a, 0x1a1, 0x56, 0x2e9, 0x216, 0x52, 0x3d1, 0x3d6, 0x23c, 0x36c, 0x2aa, 0x160, 0xfd, 0x2d8, 0x363, 0x130, 0x3b0, 0x1ee, 0x68, 0x6, 0x1a4, 0x120, 0x359, 0x2e7, 0x1c2, 0x2f2, 0x5d, 0x4b, 0x106, 0x32f, 0x1dc, 0x1cf, 0x1f4, 0x26d, 0x6f, 0x1ec, 0xf4, 0xe6, 0x93, 0x37a, 0x3e7, 0x349, 0x20e, 0x2cb, 0x358, 0x2a9, 0x1b2, 0x6d, 0x170, 0x14, 0x1d1, 0x2c9, 0x3c4, 0x249, 0x85, 0x237, 0x1ce, 0x1ba, 0x21d, 0x2f0, 0xc1, 0xab, 0x31, 0x175, 0x162, 0x61, 0x238, 0x254, 0x36a, 0x30e, 0x40, 0x3a4, 0x3f, 0x2a1, 0x3c2, 0x3ed, 0x1a5, 0x16e, 0x329, 0x78, 0xef, 0x2ad, 0x8a, 0x1ad, 0x31e, 0xa9, 0xad, 0x195, 0x55, 0x23b, 0x286, 0x3fa, 0xa6, 0x337, 0x345, 0x146, 0x8b, 0x1e3, 0x36e, 0x236, 0x180, 0x1ca, 0x82, 0x3dd, 0x9e, 0x7c, 0x1d7, 0x36d, 0x2e4, 0x110, 0x9c, 0x1c0, 0xd5, 0x2f4, 0x3f2, 0x1a5, 0x2dc, 0xbf, 0x3c0, 0x2eb, 0x11d, 0x2c8, 0x31d, 0xf6, 0xf4, 0x1cc, 0x24c, 0x3e6, 0x207, 0x1ea, 0x2a0, 0x311, 0x26f, 0x1e6, 0x39, 0x203, 0x39a, 0x1a9, 0x45, 0x1ad, 0x235, 0x2a4, 0x161, 0x166, 0x2b2, 0x3fb, 0x1d0, 0x107, 0x2cb, 0x2b9, 0x2b6, 0x18b, 0x2d9, 0x253, 0x109, 0x16a, 0x2b, 0x2e9, 0x25, 0x148, 0x2b7, 0x117, 0x319, 0x286, 0x3fd, 0x298, 0x18e, 0x35, 0x9a, 0x288, 0x5c, 0xa, 0x1d1, 0x19b, 0x30b, 0x26c, 0x42, 0x279, 0x37c, 0x8f, 0x1b6, 0x2aa, 0x2c0, 0x3f4, 0x2ed, 0x255, 0x241, 0x1e3, 0x2d5, 0xca, 0x1b, 0x9f, 0x64, 0x295, 0x38b, 0xe7, 0x1ba, 0x33, 0x3d2, 0x201, 0x2a2, 0x229, 0x1ef, 0x4c, 0x1d8, 0x1ee, 0xd0, 0x18, 0x13b, 0x224, 0x3ea, 0x9e, 0xf8, 0x355, 0x35e, 0x213, 0x248, 0x196, 0x10e, 0x2be, 0x162, 0xc2, 0xf2, 0x284, 0x2c5, 0x118, 0x24, 0x1d4, 0x377, 0x1c2, 0x138, 0x309, 0x2a1, 0x313, 0x2a7, 0x18a, 0x83, 0x257, 0x2fb, 0x19e, 0x3ce, 0x294, 0x227, 0x95, 0x36a, 0x23, 0x9, 0xea, 0x377, 0x384, 0x3bd, 0x3b2, 0x1c1, 0x92, 0xcb, 0x10e, 0x175, 0x181, 0x219, 0x33b, 0x34, 0xc, 0x13b, 0x41, 0x3b3, 0xf9, 0x39b, 0x26a, 0x21d, 0x3d2, 0xb, 0x29a, 0x16c, 0x2cf, 0x192, 0x2f5, 0x2d5, 0x194, 0x6c, 0xf1, 0x249, 0x214, 0x338, 0x37c, 0x11e, 0x2d1, 0x17d, 0x53, 0x267, 0x21e, 0x9a, 0x119, 0x170, 0x50, 0x12f, 0x30c, 0x370, 0x25, 0x290, 0x2ce, 0xaa, 0x1fc, 0x74, 0x287, 0x2cb, 0x17b, 0x2ca, 0x43, 0x1c3, 0x2e2, 0x2d0, 0x45, 0x35a, 0xc6, 0x10d, 0x23d, 0x93, 0x1f3, 0x207, 0x3d4, 0x292, 0xbe, 0x2b1, 0xb7, 0x25b, 0x3c0, 0x1df, 0x7d, 0x26d, 0x1bc, 0x2ff, 0x177, 0x3f1, 0x2, 0x270, 0x21b, 0x14b, 0x22f, 0x147, 0x314, 0x106, 0xa7, 0x1ff, 0x33c, 0x395, 0x121, 0x47, 0x12a, 0x2dd, 0x46, 0x270, 0x3f, 0x125, 0x15c, 0x5d, 0x258, 0x110, 0x334, 0x87, 0x175, 0x302, 0x76, 0x1ee, 0x340, 0x180, 0x24b, 0xc8, 0x85, 0x19c, 0x37c, 0x23c, 0x356, 0x3fa, 0x139, 0x6b, 0x2a9, 0x18b, 0x376, 0x171, 0x2d0, 0x8a, 0x173, 0x239, 0xf4, 0x339, 0x81, 0x4e, 0x380, 0x2a1, 0x22f, 0x28e, 0x4b, 0x22, 0x262, 0x397, 0x2ab, 0x162, 0x308, 0x33b, 0x68, 0x30, 0x1ca, 0x19, 0x295, 0x237, 0x26b, 0x243, 0x36c, 0x17d, 0xa6, 0x18e, 0xd4, 0x1b2, 0x368, 0xaf, 0x5a, 0x113, 0x1ad, 0xc6, 0x21a, 0xe6, 0x91, 0x30f, 0x70, 0xd5, 0x3c2, 0x357, 0x18a, 0x106, 0x14e, 0x3f5, 0x1d6, 0x12e, 0x61, 0x1e4, 0xd, 0x6, 0x13b, 0x82, 0x2d7, 0x3c1, 0x1ce, 0x1cb, 0x269, 0x2aa, 0x312, 0x337, 0x21e, 0x134, 0x6d, 0x392, 0x109, 0x1a1, 0x2b0, 0x31e, 0x141, 0x31a, 0x93, 0x3e6, 0xe, 0x29f, 0x17a, 0x3ed, 0x133, 0x326, 0x32f, 0x2fb, 0x33c, 0x323, 0x8d, 0xe9, 0xfc, 0x13a, 0x1ed, 0x3b2, 0x30d, 0x132, 0x2ac, 0x5b, 0x2cf, 0x241, 0x303, 0x5, 0x34d, 0x30c, 0x1db, 0x250, 0x161, 0x322, 0x1f3, 0xe, 0x137, 0x1e1, 0x357, 0x314, 0x11, 0x262, 0x327, 0x2be, 0x302, 0xec, 0x3b1, 0x236, 0x36, 0x1e2, 0x26c, 0x210, 0x35f, 0x55, 0x3f8, 0x3a0, 0x54, 0x311, 0x35c, 0x16e, 0x2fc, 0xee, 0x263, 0x3ce, 0x242, 0x238, 0x101, 0x3, 0x13b, 0x104, 0x34e, 0x237, 0xdf, 0x11e, 0x356, 0x3fd, 0xed, 0x358, 0x2ca, 0x10c, 0xf, 0x1de, 0x11d, 0x26d, 0x2f9, 0x3a3, 0x16f, 0x215, 0x12, 0x359, 0x223, 0x1f0, 0x135, 0x33, 0x2af, 0x160, 0x3cb, 0x10f, 0x134, 0xda, 0x253, 0x5a, 0x226, 0x2bd, 0x239, 0x1e8, 0xff, 0x1, 0xe9, 0xfc, 0x13a, 0x1ed, 0x3b2, 0x30d, 0x132, 0x2ac, 0x5b, 0x2cf, 0x241, 0x303, 0x5, 0x34d, 0x30c, 0x1db, 0x250, 0x161, 0x322, 0x1f3, 0xe, 0x137, 0x1e1, 0x357, 0x314, 0x11, 0x262, 0x1d2, 0x3f0, 0x1c2, 0x2ef, 0x2b5, 0x2f0, 0x16, 0x1fa, 0x345, 0x9a, 0xda, 0xaf, 0x168, 0x114, 0x38a, 0x3b9, 0x2ee, 0x367, 0x100, 0x1d4, 0x315, 0x1f0, 0x26a, 0xcc, 0x155, 0x22d, 0x18e, 0x350, 0x316, 0x386, 0x273, 0x28a, 0x26d, 0x1fb, 0x297, 0x36a, 0x118, 0x240, 0x3dd, 0x3e4, 0x39c, 0x243, 0x1ab, 0x3fd, 0x1da, 0x17b, 0x27d, 0xe4, 0x1e0, 0x375, 0x3bb, 0x14a, 0x8e, 0x284, 0x3, 0x276, 0x19, 0x246, 0x338, 0x3d6, 0x319, 0x3a, 0x20e, 0x1c6, 0x1ae, 0x16e, 0x1f1, 0x3b8, 0x33c, 0x97, 0xc2, 0x33b, 0x1a0, 0x300, 0x27c, 0x136, 0x210, 0x2b7, 0x154, 0x3ff, 0x27e, 0x292, 0x1f9, 0x133, 0x83, 0x29c, 0x397, 0x2be, 0x20d, 0x3b0, 0x1b7, 0x328, 0x2c9, 0x6e, 0x25, 0xad, 0x2cc, 0x2fd, 0xe, 0x26e, 0x38d, 0x28e, 0x12c, 0x220, 0x196, 0xc4, 0x3de, 0x192, 0x385, 0x5, 0x293, 0x2b, 0x2c3, 0x141, 0x73, 0x122, 0x4e, 0x21b, 0x24a, 0x2f2, 0x3a4, 0x3db, 0x20b, 0x2a3, 0x21d, 0x157, 0x312, 0x18e, 0x2a9, 0x43, 0xf, 0x371, 0x1f4, 0x256, 0x47, 0x284, 0x6, 0x1ca, 0xc8, 0x21, 0x3d1, 0x55, 0x3fb, 0x27e, 0x12d, 0x3ed, 0x18a, 0x22, 0x334, 0x31, 0x1ef, 0x192, 0x303, 0x14, 0xb5, 0x2b0, 0xc6, 0xf4, 0x1fe, 0x8, 0x11f, 0x2e7, 0x7c, 0x135, 0xcc, 0x2aa, 0xa6, 0x6b, 0x165, 0x218, 0x78, 0x3be, 0x3bb, 0x294, 0x238, 0xd, 0x30, 0x24b, 0x249, 0x108, 0x2b7, 0x2a8, 0x3e7, 0x3d4, 0x17a, 0x357, 0x4b, 0x110, 0x196, 0x188, 0x363, 0x8b, 0x2e, 0xa0, 0x1a1, 0x1ad, 0x239, 0x3a9, 0x3eb, 0x40, 0xea, 0x315, 0x3e0, 0x1ba, 0x269, 0x17d, 0x139, 0x358, 0x33a, 0xe4, 0x3c0, 0x1cf, 0x1e7, 0x8d, 0x1e4, 0x68, 0x180, 0x27c, 0x26c, 0x52, 0x195, 0x16d, 0x307, 0x29f, 0x3c2, 0x28e, 0x258, 0x92, 0xab, 0x5b, 0x32e, 0x51, 0x170, 0x109, 0x113, 0x173, 0x1ec, 0x177, 0x367, 0x200, 0x341, 0x377, 0x7c, 0x26a, 0x330, 0x17d, 0x272, 0x17b, 0x1e6, 0x25b, 0xee, 0x33c, 0x25c, 0x3b, 0x36b, 0x328, 0x336, 0x2e9, 0x152, 0x73, 0x81, 0xe9, 0x3e9, 0x20b, 0x14f, 0x66, 0x2aa, 0x14c, 0x1ac, 0x33a, 0x1c8, 0x31b, 0x263, 0x24f, 0x184, 0x1ee, 0x65, 0x360, 0xdc, 0x128, 0x18d, 0x91, 0x9c, 0xfc, 0x1c2, 0x3ae, 0x30a, 0x157, 0x22d, 0x231, 0x165, 0x39, 0x1e0, 0x1cf, 0x3ce, 0x234, 0x33b, 0x289, 0x6c, 0x21f, 0x25, 0x2b4, 0x93, 0x217, 0x21b, 0x13a, 0x373, 0x163, 0x3ad, 0x2c0, 0xc7, 0x2a9, 0x86, 0x3c, 0x3be, 0x37f, 0x242, 0x1e4, 0xd0, 0x209, 0x3c4, 0x281, 0x252, 0x191, 0x3c5, 0x1c0, 0x125, 0x1ed, 0x1af, 0x2f0, 0x58, 0x39f, 0xd4, 0x316, 0x203, 0x371, 0x3e8, 0x14a, 0x238, 0x1a, 0xc0, 0x27c, 0xd1, 0x148, 0xb3, 0x2fd, 0x38, 0x2a1, 0x2b8, 0x3b2, 0x5e, 0xb, 0x3f4, 0x21e, 0x364, 0x1c3, 0xef, 0x7d, 0x12b, 0x47, 0x28b, 0x1c7, 0x3e0, 0x2e1, 0x2d1, 0x3ef, 0x33e, 0x1ae, 0x362, 0xa7, 0x327, 0x3ba, 0xc9, 0x20f, 0xa0, 0x28d, 0x2e6, 0x37b, 0x2b3, 0x8c, 0x112, 0x34e, 0x338, 0x28f, 0x3f9, 0xf5, 0x17a, 0x147, 0xb9, 0x99, 0x14d, 0x1d3, 0x134, 0x1bb, 0x33d, 0x23a, 0x12b, 0x8e, 0xd, 0xc0, 0xf1, 0x344, 0x252, 0x322, 0x30f, 0x21b, 0x274, 0x1d7, 0x30a, 0x2ae, 0xa6, 0x1ac, 0x27d, 0x329, 0xee, 0x271, 0x162, 0x1d8, 0x2d5, 0x1d1, 0x2b, 0x235, 0xf4, 0x3f1, 0x80, 0x359, 0x278, 0x39c, 0x23c, 0x20a, 0x15, 0x5f, 0x29d, 0x20c, 0x334, 0xc4, 0x2cf, 0x51, 0x1c9, 0xb4, 0x59, 0x1bc, 0x297, 0x366, 0x299, 0x32, 0x21, 0x35f, 0x159, 0x307, 0x26e, 0x57, 0x2e8, 0x2f, 0xb, 0x3e1, 0x6a, 0x316, 0xf, 0x1df, 0x37f, 0x8d, 0x399, 0x289, 0xd8, 0x6e, 0x128, 0x31a, 0x244, 0xe9, 0x3db, 0x3e, 0x26a, 0x269, 0x1fd, 0x3b4, 0x39d, 0xb7, 0x3cd, 0x3f5, 0x11f, 0x315, 0x33f, 0x243, 0x286, 0x20e, 0x5f, 0x133, 0x22, 0x196, 0x5b, 0x146, 0x6d, 0x171, 0x145, 0x34c, 0x47, 0xd, 0x180, 0x3c4, 0x216, 0x161, 0x91, 0x270, 0x3db, 0x7c, 0x1ba, 0x36c, 0x3ef, 0x275, 0x2b1, 0x326, 0x262, 0x31, 0x363, 0x51, 0x392, 0x2d0, 0x2c8, 0x3f6, 0x254, 0x6, 0x24b, 0x26c, 0x290, 0x191, 0x30f, 0x3f, 0x1c2, 0x2a3, 0xcc, 0x17d, 0x1da, 0x39d, 0x16e, 0x32f, 0x397, 0x3ba, 0x192, 0x2e, 0x109, 0x8a, 0x6f, 0x34f, 0x366, 0x13b, 0xc8, 0x108, 0x195, 0x37a, 0x70, 0x125, 0x3bd, 0x2c6, 0x157, 0xa6, 0x358, 0x1e6, 0x17e, 0x2fb, 0x2ab, 0x26, 0x1e3, 0x14, 0x1a1, 0x173, 0x37b, 0x16f, 0x230, 0x82, 0x85, 0x3d1, 0x2a8, 0x307, 0xd5, 0x15c, 0x36d, 0x2f0, 0x160, 0x18e, 0x165, 0xe4, 0x23f, 0x33c, 0x162, 0x3b0, 0x346, 0x293, 0x2b0, 0x239, 0x177, 0x30e, 0x120, 0x2d7, 0x19c, 0x28f, 0x3fb, 0x3d4, 0x3c2, 0x5d, 0x23e, 0x4f, 0x1ce, 0x71, 0x74, 0x2a0, 0x3d3, 0x12c, 0x99, 0x13d, 0x10f, 0x18b, 0x1e, 0x2e3, 0x323, 0x219, 0x1b7, 0x1d1, 0xac, 0x318, 0x177, 0x215, 0x89, 0x295, 0x1f6, 0x154, 0x307, 0x1aa, 0x179, 0x35e, 0x353, 0x53, 0x358, 0x3cc, 0x1f1, 0x3f5, 0x2ea, 0xc9, 0x2e, 0x212, 0x228, 0x378, 0x95, 0x3, 0x24b, 0xd1, 0x252, 0x93, 0x9c, 0x3e9, 0x7c, 0x374, 0x1ab, 0x347, 0x311, 0x29d, 0x22, 0x32c, 0x16c, 0x222, 0x2d9, 0x273, 0x1f4, 0x121, 0x399, 0x236, 0x19b, 0x3b6, 0x21a, 0x3fc, 0x100, 0x2fe, 0x38b, 0x1eb, 0x1fc, 0xf5, 0x1e1, 0x5d, 0x213, 0x16, 0x337, 0x15b, 0x72, 0x23f, 0x271, 0x181, 0x1bf, 0x5, 0x2d4, 0x173, 0x2ff, 0x1b5, 0x1a4, 0x32, 0x84, 0x195, 0x2fd, 0x1c0, 0x13a, 0x3ae, 0x66, 0x17d, 0x3b4, 0x26f, 0x362, 0x29c, 0x21c, 0x363, 0xa2, 0x253, 0x2ad, 0xd3, 0x227, 0xd, 0x300, 0x30b, 0x94, 0x23d, 0x204, 0x11f, 0x75, 0x13c, 0x26b, 0x319, 0x29b, 0x17a, 0x22a, 0x213, 0x2c, 0xc7, 0x2ca, 0x329, 0x379, 0x15f, 0x130, 0x17, 0x212, 0x59, 0x1fb, 0xa1, 0x30, 0x1e2, 0x25, 0x31a, 0x204, 0x23e, 0x9e, 0x331, 0x388, 0x349, 0xbd, 0x115, 0x30d, 0x16, 0x267, 0x165, 0x390, 0x3b8, 0x2ab, 0x98, 0x20f, 0x109, 0x228, 0x2f9, 0x254, 0x18, 0xf1, 0x216, 0x18d, 0x102, 0x11f, 0x4f, 0x39c, 0x1c4, 0x3a0, 0x25a, 0x28e, 0x382, 0xb, 0x337, 0x2b6, 0x1c8, 0x1dc, 0x351, 0x4c, 0x303, 0x280, 0x114, 0x378, 0x12a, 0xc, 0x27c, 0x10b, 0x2c2, 0x81, 0x28b, 0x223, 0x1ce, 0xe2, 0x1d0, 0x12d, 0x147, 0x1c1, 0x201, 0x39f, 0x15b, 0xe4, 0xee, 0x3ac, 0x26, 0x385, 0x140, 0x8a, 0x1bc, 0x95, 0x6, 0x13e, 0x281, 0x161, 0x244, 0x341, 0x315, 0xe7, 0x71, 0xe8, 0x292, 0x2a7, 0x2e4, 0x304, 0x3cb, 0x2a9, 0x72, 0x77, 0x1d6, 0x13, 0x3c6, 0xa0, 0x45, 0xde, 0x24e, 0xea, 0xf9, 0x37c, 0x1fc, 0x3d4, 0x22f, 0x36d, 0x3ad, 0xa6, 0x2f6, 0x16e, 0x14e, 0x31, 0x32e, 0x6d, 0x39a, 0x1f4, 0x8d, 0x1ee, 0xbb, 0x56, 0x239, 0x3aa, 0x230, 0x19, 0x108, 0xb3, 0x30f, 0x1f8, 0x7c, 0x1cb, 0x286, 0x54, 0x3ed, 0x258, 0xc1, 0x3e1, 0x2a9, 0xe4, 0x1dc, 0x2ab, 0x130, 0x2e, 0x5a, 0x2c8, 0x38f, 0xd, 0x1b, 0xdc, 0x141, 0x1fe, 0x200, 0x3dd, 0x19c, 0x55, 0x307, 0x2a1, 0x3bd, 0x21d, 0x17d, 0x2cb, 0x2b1, 0x106, 0x196, 0x2d8, 0x134, 0x386, 0x3be, 0x323, 0x76, 0x346, 0xb5, 0x173, 0x3ee, 0x366, 0x1ca, 0x26c, 0xad, 0x91, 0x3a4, 0x315, 0x1ce, 0x1c4, 0x349, 0x17a, 0x5d, 0x5e, 0x160, 0x6b, 0x1e6, 0x3e2, 0x397, 0x1ef, 0x51, 0xaf, 0x145, 0x256, 0x1e4, 0x236, 0x265, 0x31e, 0x3a9, 0x30e, 0x112, 0x85, 0x2b7, 0x37a, 0x380, 0x1c2, 0x135, 0x36c, 0x347, 0x5f, 0x18a, 0x92, 0x29a, 0x21e, 0x43, 0x3c0, 0x33c, 0x1d4, 0x3e4, 0x3d6, 0x3ff, 0x26e, 0x2f2, 0x185, 0x2ba, 0x2cb, 0x16b, 0x11, 0xab, 0x1d3, 0x2c1, 0x78, 0xcf, 0x181, 0x1e3, 0x140, 0x228, 0x3f6, 0x101, 0x209, 0xdc, 0x282, 0x3f1, 0x24, 0x1a7, 0x3ec, 0x16d, 0xe0, 0xe1, 0x135, 0x2d1, 0x107, 0x2f8, 0x96, 0x264, 0x3e1, 0x15b, 0x390, 0x2fb, 0x2ea, 0x241, 0x392, 0x153, 0x12b, 0x1e4, 0x65, 0x186, 0xc6, 0x2ee, 0x118, 0x19, 0x210, 0x2cc, 0x4e, 0x3bf, 0x39b, 0x23c, 0x1d0, 0xbd, 0x5d, 0xbc, 0x189, 0x358, 0x25f, 0xa7, 0x31, 0x255, 0x1b4, 0xef, 0x37f, 0x184, 0x36e, 0x12f, 0x2bd, 0x3ee, 0x2c5, 0x321, 0x344, 0x2c2, 0x204, 0xea, 0x1f2, 0x1eb, 0x3fb, 0x137, 0x179, 0x2c6, 0x15d, 0x361, 0x2b1, 0x20c, 0x251, 0x2ed, 0x364, 0x3c, 0x263, 0x2c4, 0x2f5, 0xa0, 0x114, 0x1fb, 0x284, 0x300, 0x6e, 0x141, 0x3fc, 0x12, 0x2d7, 0x1f6, 0x2b2, 0x70, 0x274, 0x29e, 0x36c, 0x287, 0x17c, 0x4b, 0x3a8, 0x38b, 0x28f, 0x387, 0x14b, 0x1d7, 0x330, 0x3d7, 0x5f, 0x221, 0x132, 0x3e1, 0x2b6, 0x25b, 0x3f5, 0x2f3, 0xa2, 0x171, 0xfa, 0x11a, 0x36b, 0x34d, 0x35a, 0x3ee, 0x183, 0x9f, 0x216, 0x73, 0x10, 0x2fe, 0xce, 0xaa, 0xe, 0x9d, 0x14f, 0x36c, 0x107, 0x1f9, 0x258, 0x304, 0x267, 0x33a, 0x1f1, 0x327, 0x363, 0x232, 0x33d, 0x3bb, 0x184, 0x2d5, 0xb5, 0x1c5, 0x297, 0x6, 0x1e2, 0x128, 0x339, 0x100, 0x3b3, 0xfb, 0x2b2, 0xe0, 0x1c2, 0xdd, 0x2a5, 0x54, 0x3af, 0x1c1, 0x2c, 0x231, 0x3cc, 0x32f, 0x21c, 0x255, 0x368, 0x3bc, 0x3ce, 0x76, 0x103, 0x342, 0x6f, 0x12a, 0x60, 0x21f, 0x2a4, 0x3fc, 0x24, 0x34e, 0x3ab, 0x37a, 0x21b, 0x1f, 0x1cb, 0x20a, 0x149, 0x28e, 0x2f, 0x2c0, 0x358, 0xb7, 0x29c, 0x188, 0x111, 0x2e5, 0x3be, 0x97, 0x369, 0x14, 0x45, 0x2f9, 0x284, 0x209, 0x1b8, 0x21a, 0x3b7, 0x240, 0x85, 0x2ce, 0x3c5, 0x1f8, 0x359, 0x237, 0x55, 0xe, 0x13a, 0x135, 0x356, 0x54, 0x357, 0x30d, 0x160, 0x358, 0x16e, 0x262, 0x5b, 0x134, 0xf, 0x263, 0x302, 0x303, 0x5a, 0x26d, 0x238, 0x236, 0x30c, 0x239, 0x16f, 0x13b, 0x26c, 0x161, 0x1, 0x359, 0x237, 0x55, 0xe, 0x13a, 0x135, 0x356, 0x54, 0x357, 0x30d, 0x160, 0x358, 0x16e, 0x262, 0x5b, 0x134, 0xf, 0x263, 0x302, 0x303, 0x5a, 0x26d, 0x238, 0x236, 0x30c, 0x239, 0x16f, 0x13b, 0x26c, 0x161, 0x1, 0x359, 0x237, 0x55, 0xe, 0x13a, 0x135, 0x356, 0x54, 0x357, 0x30d, 0x160, 0x358, 0x16e, 0x262, 0x5b, 0x134, 0xf, 0x263, 0x302, 0x303, 0x5a, 0x26d, 0x238, 0x236, 0x30c, 0x239, 0x16f, 0x13b, 0x26c, 0x161, 0x1, 0x359, 0x237, 0x55, 0xe, 0x13a, 0x135, 0x356, 0x54, 0x357, 0x30d, 0x160, 0x358, 0x16e, 0x262, 0x5b, 0x134, 0xf, 0x263, 0x302, 0x303, 0x5a, 0x26d, 0x238, 0x236, 0x30c, 0x239, 0x16f, 0x2bb, 0xce, 0x2a8, 0xe0, 0x301, 0x1cb, 0x3a, 0xbd, 0x2e8, 0x353, 0xed, 0x2b1, 0x44, 0x14d, 0xd4, 0x1c8, 0x3fe, 0x1ef, 0x119, 0x273, 0x1e7, 0xec, 0xa, 0x8a, 0x3e5, 0x34, 0x2c9, 0x235, 0x1d5, 0x1a4, 0x9b, 0x2b4, 0x1, 0x2bb, 0xce, 0x2a8, 0xe0, 0x301, 0x1cb, 0x3a, 0xbd, 0x2e8, 0x353, 0xed, 0x2b1, 0x44, 0x14d, 0xd4, 0x1c8, 0x3fe, 0x1ef, 0x119, 0x273, 0x1e7, 0xec, 0xa, 0x8a, 0x3e5, 0x34, 0x2c9, 0x235, 0x1d5, 0x1a4, 0x9b, 0x2b4, 0x1, 0x2bb, 0xce, 0x2a8, 0xe0, 0x301, 0x1cb, 0x3a, 0xbd, 0x2e8, 0x353, 0xed, 0x2b1, 0x44, 0x14d, 0xd4, 0x1c8, 0x3fe, 0x1ef, 0x119, 0x273, 0x1e7, 0xec, 0xa, 0x8a, 0x3e5, 0x34, 0x2c9, 0x235, 0x1d5, 0x1a4, 0x9b, 0x2b4, 0x1, 0x2bb, 0xce, 0x2a8, 0xe0, 0x301, 0x1cb, 0x3a, 0xbd, 0x2e8, 0x353, 0xed, 0x2b1, 0x44, 0x14d, 0xd4, 0x1c8, 0x3fe, 0x1ef, 0x119, 0x273, 0x1e7, 0x17f, 0x338, 0x16d, 0x21b, 0xf8, 0x23c, 0x13f, 0x57, 0x2c6, 0x1fd, 0x311, 0x4b, 0x304, 0x31c, 0x32b, 0x131, 0xb6, 0x1b2, 0x1e0, 0x3ac, 0x192, 0x253, 0x7d, 0x61, 0x1a3, 0x342, 0x378, 0x202, 0x1b0, 0x31e, 0x1d5, 0x348, 0x26c, 0x18d, 0x10, 0x3dd, 0x3ec, 0x2fd, 0x1f8, 0x39b, 0x388, 0x3d4, 0x179, 0x33, 0x3ef, 0x17c, 0xb9, 0x2c, 0x1ac, 0x2dc, 0x334, 0x372, 0x316, 0x23f, 0x2be, 0x116, 0x171, 0x3d9, 0x219, 0x206, 0x45, 0x3e5, 0x68, 0x336, 0x18c, 0x16f, 0xe5, 0x281, 0xe6, 0x100, 0x1a7, 0x2b7, 0x383, 0x3bf, 0x1ce, 0xfe, 0x137, 0x3bd, 0x330, 0x287, 0x3ed, 0x382, 0x2c0, 0x2f6, 0x193, 0x32c, 0x345, 0x10c, 0x3b8, 0x3ba, 0x144, 0x33d, 0x1e7, 0x1d8, 0x28, 0x59, 0x227, 0x289, 0x30c, 0xf6, 0x2dd, 0x24b, 0x4a, 0x27b, 0x24, 0x246, 0x32a, 0x4e, 0x38e, 0xdf, 0x3fb, 0x354, 0x3ae, 0x36c, 0x2a, 0x2a7, 0x5e, 0x53, 0x333, 0x106, 0x2fe, 0xfb, 0x37a, 0x1f8, 0x33f, 0x23b, 0x29f, 0x3bd, 0x269, 0x20e, 0x357, 0x5e, 0xa6, 0xd7, 0x22, 0x29a, 0x2a9, 0x17e, 0x87, 0x146, 0x386, 0x263, 0x26, 0x170, 0x145, 0x8d, 0x36e, 0x1a1, 0x378, 0xd, 0x2c9, 0xc6, 0x16f, 0x1ca, 0x216, 0x339, 0x24, 0x85, 0xb3, 0x270, 0x9e, 0x3d6, 0x307, 0x13a, 0x1ba, 0x1d, 0x17a, 0x36d, 0x2aa, 0x275, 0x18a, 0xc1, 0x18e, 0x32b, 0x262, 0x2d8, 0x18b, 0x23f, 0x175, 0x51, 0x39a, 0x1e7, 0x3b0, 0xa0, 0x2c8, 0x238, 0x194, 0x2b0, 0x3ee, 0x6, 0x21f, 0x21a, 0x30e, 0x19, 0x290, 0x81, 0x359, 0x19c, 0x16d, 0x3f, 0x3e0, 0x1c4, 0x3d4, 0x2f2, 0xcc, 0x347, 0x3ed, 0x30d, 0x312, 0x39d, 0x106, 0x151, 0xd4, 0x329, 0x397, 0x32e, 0x376, 0x1cf, 0x302, 0x2e, 0x2ad, 0x294, 0x36b, 0xb5, 0x6f, 0x284, 0xd8, 0x31e, 0x3aa, 0x13b, 0x344, 0xe6, 0x200, 0x295, 0x195, 0x4e, 0x315, 0x37c, 0x3e7, 0x125, 0x1f5, 0x3ec, 0x3e6, 0x3bf, 0x331, 0x3fb, 0x14b, 0x29e, 0x286, 0x25a, 0x3b2, 0x2aa, 0xe3, 0x221, 0x201, 0xd6, 0x1b1, 0x196, 0x283, 0x72, 0x3f5, 0x2cf, 0x1bb, 0x1cf, 0x20d, 0xb8, 0x145, 0x11a, 0x1a3, 0x113, 0x3e5, 0x1a0, 0x30c, 0x3d8, 0x183, 0x3c4, 0x282, 0x187, 0x19, 0x129, 0x204, 0x2fe, 0x1f6, 0x1f3, 0x3db, 0x39c, 0x3f9, 0x2a1, 0x14f, 0x143, 0x12d, 0x1d9, 0x155, 0x275, 0x314, 0x304, 0x6b, 0x2dc, 0xcb, 0x345, 0x39, 0x3fe, 0x363, 0x2d9, 0x2e3, 0x302, 0x5c, 0x2a6, 0x8d, 0x2d5, 0x28d, 0x3f6, 0xd0, 0x186, 0x1ec, 0x2c5, 0x1e2, 0x141, 0x2c7, 0x208, 0x290, 0x102, 0x17f, 0xfb, 0x2fd, 0x3e9, 0x1ce, 0x3f8, 0x354, 0x2a3, 0x2a5, 0x292, 0x2e8, 0x2ae, 0x33e, 0x18a, 0x182, 0x231, 0x16e, 0x261, 0x3a6, 0x218, 0x1ff, 0x3b5, 0x368, 0x375, 0x181, 0x2e, 0x153, 0x242, 0x36e, 0x342, 0x1fb, 0x68, 0xc3, 0xf6, 0x366, 0xf1, 0x2a4, 0x367, 0x3ea, 0x3ab, 0x30f, 0x38e, 0x2f1, 0x307, 0xe1, 0x396, 0x349, 0xae, 0x33, 0x347, 0x3af, 0xbc, 0x139, 0x2d6, 0x124, 0x337, 0x391, 0xcd, 0x2ed, 0x10c, 0x1ff, 0x363, 0x1bb, 0x39e, 0x26, 0x1c9, 0x7d, 0x308, 0xa, 0xb2, 0x238, 0x259, 0x35a, 0x24e, 0x209, 0x2c3, 0x3aa, 0xe5, 0x25, 0x1fe, 0x89, 0x210, 0x91, 0x3a8, 0x338, 0x37a, 0x3e9, 0x39c, 0x3fb, 0x296, 0x26a, 0x1d, 0x1e1, 0x2b5, 0x3fa, 0x17c, 0x1c1, 0x312, 0x26f, 0x44, 0xfd, 0x19d, 0x257, 0x5b, 0x2c1, 0x77, 0x3ba, 0x232, 0x2eb, 0x162, 0x17, 0x153, 0x8d, 0x1a3, 0x226, 0x38f, 0x11b, 0xac, 0x3ee, 0x18, 0x1b8, 0x3a9, 0xd2, 0xd1, 0xe6, 0x12, 0x10a, 0x191, 0x28b, 0x38b, 0x2a8, 0x21b, 0x3c9, 0x23b, 0x26e, 0x3ae, 0x356, 0x292, 0x1d9, 0x2aa, 0x1c6, 0x96, 0x2c, 0x17b, 0x245, 0x151, 0x350, 0x2fc, 0x31, 0x9a, 0xf0, 0x2ab, 0x22c, 0x33d, 0x323, 0x2f5, 0xb4, 0x256, 0x3dd, 0x2b7, 0x4e, 0x9e, 0x28f, 0x70, 0x7c, 0x1c4, 0x29f, 0x1d7, 0x356, 0x12d, 0x36d, 0x17d, 0x5f, 0x2e4, 0x312, 0xd7, 0x110, 0x3e1, 0x1e6, 0x262, 0x2ed, 0x218, 0x3f5, 0x32e, 0x386, 0x33c, 0x192, 0x171, 0x1e7, 0x1bf, 0x5a, 0x256, 0x36b, 0x1a1, 0x3f6, 0x340, 0x56, 0x3ee, 0x30, 0x2e9, 0x177, 0x13b, 0x216, 0x1fe, 0x112, 0x52, 0x81, 0x2fe, 0x3d1, 0x30f, 0x315, 0x3d6, 0xe, 0x20b, 0x23c, 0x3d4, 0x3bd, 0x36c, 0x2a0, 0x2e8, 0x2aa, 0x38c, 0x258, 0x160, 0x39d, 0x22, 0xfd, 0x33a, 0x14e, 0x2d8, 0x43, 0x2fb, 0x363, 0x376, 0x263, 0x130, 0xaf, 0x3bb, 0x3b0, 0x109, 0x34c, 0x1ee, 0xb5, 0x378, 0x68, 0x30c, 0x37b, 0x6, 0xdc, 0x3a9, 0x1a4, 0x344, 0x339, 0x120, 0x108, 0x91, 0x359, 0xfb, 0x3e6, 0x2e7, 0x37c, 0x307, 0x1c2, 0x243, 0x27e, 0x2f2, 0x269, 0x54, 0x5d, 0x157, 0x275, 0x4b, 0x2c, 0x2f6, 0x106, 0x29a, 0x165, 0x32f, 0x3b3, 0x2ce, 0x270, 0x1f2, 0x154, 0x3f, 0x277, 0x3f9, 0x125, 0x374, 0x3a0, 0x15c, 0x198, 0x2a, 0x5d, 0x2ae, 0x1c6, 0x258, 0x2c0, 0x26f, 0x110, 0x3cb, 0x391, 0x334, 0x283, 0x390, 0x87, 0x4d, 0x1e0, 0x175, 0x119, 0x1df, 0x302, 0x2e0, 0xfa, 0x76, 0x140, 0x1a6, 0x1ee, 0x16a, 0x1fb, 0x340, 0xac, 0x3a3, 0x180, 0x2c3, 0x2b3, 0x24b, 0x152, 0x187, 0xc8, 0x2c2, 0x100, 0x85, 0x322, 0x75, 0x19c, 0x2fd, 0x377, 0x37c, 0x207, 0x301, 0x23c, 0x3a1, 0x2ef, 0x356, 0x25a, 0x1af, 0x3fa, 0x1f9, 0x2f, 0x139, 0x34a, 0x264, 0x6b, 0x2cd, 0x2ac, 0x2a9, 0x3cd, 0x229, 0x18b, 0x3b8, 0x3b5, 0x376, 0xcf, 0xc9, 0x171, 0x3ce, 0x2f5, 0x2d0, 0x121, 0x1a3, 0x8a, 0x8e, 0x259, 0x173, 0xa1, 0x360, 0x239, 0x2c5, 0x30b, 0xf4, 0x69, 0x1a2, 0x339, 0x240, 0x29, 0x81, 0x1f5, 0x35f, 0x4e, 0x13c, 0x22e, 0x380, 0x3c9, 0xfe, 0x2a1, 0x26a, 0x74, 0x22f, 0x36f, 0x32a, 0x3a4, 0x31f, 0x2da, 0x3db, 0x1be, 0x207, 0x20b, 0xe2, 0x137, 0x2a3, 0x20a, 0x38d, 0x21d, 0x107, 0x115, 0x157, 0x1c6, 0xb9, 0x312, 0x35c, 0x124, 0x18e, 0x1b1, 0x156, 0x2a9, 0x393, 0xb6, 0x43, 0x3fe, 0x255, 0xf, 0x351, 0xa2, 0x371, 0x181, 0x2e0, 0x1f4, 0x1d8, 0x212, 0x256, 0x1b7, 0x226, 0x47, 0x259, 0x2e6, 0x284, 0x336, 0x3d8, 0x6, 0x370, 0x2ee, 0x1ca, 0x250, 0x2c7, 0xc8, 0x18d, 0x9, 0x21, 0x24c, 0x2bb, 0x3d1, 0x27, 0x13c, 0x55, 0x21b, 0x277, 0x3fb, 0x9d, 0x396, 0x27e, 0x3da, 0x2d1, 0x12d, 0x1af, 0x3fd, 0x3ed, 0x178, 0x3b4, 0x18a, 0x16, 0x1e5, 0x22, 0x3f4, 0x3cc, 0x334, 0x10f, 0x25b, 0x31, 0xd9, 0x77, 0x1ef, 0x1bb, 0xcf, 0x192, 0x1cd, 0x24f, 0x303, 0x2a6, 0xc2, 0x14, 0x332, 0x27f, 0xb5, 0x1fb, 0x289, 0x2b0, 0x127, 0x36, 0xc6, 0x1b3, 0x381, 0xf4, 0xd2, 0x281, 0x1fe, 0x41, 0x129, 0x8, 0x2d7, 0xb3, 0x11f, 0x19c, 0x3e6, 0x315, 0x28f, 0x380, 0x33f, 0x3fb, 0x13a, 0x243, 0x3d4, 0x1d7, 0x286, 0x3c2, 0x21d, 0x20e, 0x5d, 0x2aa, 0x5f, 0x30d, 0x139, 0x133, 0x201, 0x2f6, 0x22, 0x3e1, 0x32b, 0x196, 0xd4, 0x3e2, 0x5b, 0x43, 0x3f5, 0x146, 0x78, 0x175, 0x6d, 0x1cf, 0x130, 0x171, 0x323, 0x303, 0x145, 0x308, 0xa0, 0x34c, 0x36b, 0x113, 0x47, 0xbb, 0x38a, 0xd, 0x30c, 0x3ee, 0x180, 0x31e, 0x36a, 0x3c4, 0xf4, 0x1a4, 0x216, 0x3eb, 0x19, 0x161, 0x200, 0x21, 0x91, 0x2fe, 0x2b7, 0x270, 0x3c1, 0x16d, 0x3db, 0x37c, 0xe, 0x7c, 0x23b, 0x2a1, 0x1ba, 0x349, 0x2f2, 0x36c, 0x12d, 0x35e, 0x3ef, 0x357, 0x3ad, 0x275, 0x258, 0x312, 0x2b1, 0x99, 0x6b, 0x326, 0x29a, 0x33a, 0x262, 0x345, 0x329, 0x31, 0x1b2, 0x1dc, 0x363, 0x386, 0x1d6, 0x51, 0x371, 0x302, 0x392, 0x3bb, 0x1bf, 0x2d0, 0x8d, 0x206, 0x2c8, 0x33b, 0xb5, 0x3f6, 0x1a7, 0x2cc, 0xea, 0x1f6, 0x27, 0xf9, 0x159, 0x3e9, 0x37c, 0x1c, 0x1f0, 0x1fc, 0x24a, 0x325, 0x3d4, 0x3ae, 0x20a, 0x22f, 0x198, 0x150, 0x36d, 0x3fd, 0x3af, 0x3ad, 0xe3, 0x172, 0xa6, 0x34a, 0x304, 0x2f6, 0x44, 0x39f, 0x16e, 0x156, 0x2b6, 0x14e, 0x1d3, 0x390, 0x31, 0x364, 0x379, 0x32e, 0x1e, 0x2be, 0x6d, 0x39e, 0xc9, 0x39a, 0x25c, 0xb8, 0x1f4, 0x369, 0x168, 0x8d, 0x5, 0x332, 0x1ee, 0x342, 0x227, 0xbb, 0x31d, 0x34, 0x56, 0x297, 0x6c, 0x239, 0x205, 0x370, 0x3aa, 0x9f, 0x10d, 0x230, 0x281, 0x3f1, 0x19, 0x2c2, 0x12, 0x108, 0x102, 0x36f, 0xb3, 0x23e, 0x279, 0x30f, 0x13c, 0x154, 0x1f8, 0xdf, 0x7, 0x7c, 0x7f, 0x296, 0x1cb, 0xf5, 0x2ef, 0x286, 0x38d, 0x66, 0x54, 0x1d9, 0x1fd, 0x3ed, 0x1e9, 0x33e, 0x258, 0x22d, 0x2d6, 0xc1, 0x2b9, 0x11, 0x3e1, 0x25f, 0x251, 0x2a9, 0x257, 0x372, 0xe4, 0x10e, 0xd9, 0x1dc, 0x34e, 0x322, 0x359, 0x35f, 0xe9, 0x237, 0x1f3, 0x223, 0x55, 0xfc, 0xdf, 0xe, 0x1f0, 0x3f8, 0x13a, 0x11e, 0x137, 0x135, 0x3a0, 0x1ed, 0x356, 0x1e1, 0x33, 0x54, 0x3b2, 0x3fd, 0x357, 0x2af, 0x311, 0x30d, 0xed, 0x314, 0x160, 0x35c, 0x132, 0x358, 0x11, 0x3cb, 0x16e, 0x2ac, 0x2ca, 0x262, 0x10f, 0x2fc, 0x5b, 0x10c, 0x327, 0x134, 0xee, 0x2cf, 0xf, 0x2be, 0xda, 0x263, 0x241, 0x1de, 0x302, 0x253, 0x3ce, 0x303, 0x11d, 0xec, 0x5a, 0x242, 0x5, 0x26d, 0x3b1, 0x226, 0x238, 0x34d, 0x2f9, 0x236, 0x2bd, 0x101, 0x30c, 0x3a3, 0x36, 0x239, 0x3, 0x1db, 0x16f, 0x1e2, 0x1e8, 0x13b, 0x250, 0x215, 0x26c, 0xff, 0x104, 0x161, 0x12, 0x210, 0x1, 0x34e, 0x322, 0x359, 0x35f, 0xe9, 0x237, 0x1f3, 0x223, 0x55, 0xfc, 0xdf, 0xe, 0x1f0, 0x3f8, 0x13a, 0x11e, 0x137, 0x135, 0x3a0, 0x1ed, 0x356, 0x1e1, 0x33, 0x54, 0x3b2, 0x3fd, 0x357, 0x295, 0x93, 0x2fe, 0x195, 0x11f, 0xfb, 0x4e, 0x3c1, 0x37a, 0x315, 0x55, 0x1f8, 0x37c, 0x70, 0x33f, 0x3e7, 0x20b, 0x23b, 0x125, 0x243, 0x29f, 0x135, 0x349, 0x3bd, 0x286, 0x22f, 0x269, 0x12d, 0x2c6, 0x20e, 0x2e8, 0x3fa, 0x357, 0x157, 0x5f, 0x5e, 0x2cb, 0x258, 0xa6, 0x133, 0x2c, 0xd7, 0x99, 0x358, 0x22, 0x337, 0x362, 0x29a, 0x1e6, 0x196, 0x2a9, 0x14e, 0x345, 0x17e, 0x5b, 0x218, 0x87, 0x1b2, 0x2fb, 0x146, 0x3c0, 0x1ef, 0x386, 0x2ab, 0x6d, 0x263, 0x8b, 0x371, 0x26, 0x171, 0x12e, 0x170, 0x3bb, 0x1e3, 0x145, 0x76, 0x5a, 0x8d, 0x14, 0x34c, 0x36e, 0x59, 0x33b, 0x1a1, 0x47, 0x1d1, 0x378, 0x236, 0x173, 0xd, 0x56, 0x24e, 0x2c9, 0x37b, 0x180, 0xc6, 0x306, 0x2e9, 0x16f, 0x3c4, 0x3a9, 0x1ca, 0x141, 0x230, 0x216, 0x367, 0x249, 0x339, 0x82, 0x161, 0x24, 0x52, 0x8, 0x85, 0x91, 0x3dd, 0xb3, 0xea, 0x3d1, 0x270, 0x123, 0x24c, 0x3dd, 0x166, 0x3a8, 0x2b7, 0x341, 0x279, 0x4e, 0x38b, 0x1f3, 0x9e, 0x159, 0x377, 0x28f, 0x7e, 0x1be, 0x70, 0x277, 0x387, 0x7c, 0x3f8, 0xe1, 0x1c4, 0x14b, 0x325, 0x29f, 0x26a, 0x13f, 0x1d7, 0x3a, 0x179, 0x356, 0x38d, 0x330, 0x12d, 0x185, 0x2a, 0x36d, 0x3d7, 0x22a, 0x17d, 0x3d3, 0x2af, 0x5f, 0xbc, 0x33e, 0x2e4, 0x272, 0x221, 0x312, 0x34a, 0x16, 0xd7, 0x132, 0x17b, 0x110, 0x31c, 0x83, 0x3e1, 0x2dc, 0x14d, 0x1e6, 0x32c, 0x2b6, 0x262, 0x35, 0x393, 0x2ed, 0x25b, 0x229, 0x218, 0x10e, 0x2c1, 0x3f5, 0x4d, 0xee, 0x32e, 0xf0, 0x2f3, 0x386, 0x15f, 0x1b4, 0x33c, 0xa2, 0x2e3, 0x192, 0x1de, 0x13, 0x171, 0x25c, 0x1c9, 0x1e7, 0x20f, 0xfa, 0x1bf, 0x153, 0x3b, 0x5a, 0x11a, 0x50, 0x256, 0x285, 0x332, 0x36b, 0x114, 0x399, 0x1a1, 0x8e, 0x34d, 0x3f6, 0x328, 0x233, 0x340, 0x35a, 0x202, 0x56, 0x95, 0x336, 0x3ee, 0x246, 0x122, 0x2d7, 0x24d, 0x1f5, 0xb3, 0x3a8, 0x167, 0x11f, 0x3ec, 0xe9, 0x19c, 0x27, 0x38b, 0x3e6, 0x278, 0x2da, 0x315, 0x154, 0x3bf, 0x28f, 0xfc, 0x2f1, 0x380, 0x331, 0x1c, 0x33f, 0x387, 0xf8, 0x3fb, 0x301, 0x7f, 0x13a, 0xe2, 0x14b, 0x243, 0x26e, 0x374, 0x3d4, 0x29e, 0x29b, 0x1d7, 0x74, 0x1ed, 0x286, 0xae, 0x2d1, 0x3c2, 0x330, 0x25a, 0x21d, 0x150, 0x2b5, 0x20e, 0x3b2, 0x3d7, 0x5d, 0x1fd, 0x2a7, 0x2aa, 0x3f2, 0x353, 0x5f, 0x178, 0xe3, 0x30d, 0x361, 0xb9, 0x139, 0x221, 0x22d, 0x133, 0xb0, 0x16b, 0x201, 0x26f, 0x132, 0x2f6, 0x49, 0xd6, 0x22, 0xc7, 0x245, 0x3e1, 0x1b1, 0x13d, 0x32b, 0x2ac, 0x27d, 0x196, 0x2b6, 0xcd, 0xd4, 0xa7, 0x283, 0x3e2, 0x372, 0x25b, 0x5b, 0x72, 0x62, 0x43, 0x247, 0x364, 0x3f5, 0x9a, 0x3b8, 0x146, 0x31b, 0x2cf, 0x78, 0x2f3, 0x305, 0x175, 0x1bb, 0x3ac, 0x6d, 0x19e, 0xa2, 0x1cf, 0x85, 0x81, 0x295, 0x91, 0x2d7, 0x93, 0x3dd, 0x191, 0x2fe, 0xb3, 0x359, 0x195, 0xea, 0x2b7, 0x11f, 0x3d1, 0x3a4, 0xfb, 0x270, 0x19c, 0x4e, 0x237, 0x30f, 0x3c1, 0x3e6, 0xf9, 0x37a, 0x9e, 0x16d, 0x315, 0x2a8, 0x2e7, 0x55, 0x3db, 0x28f, 0x1f8, 0x3d6, 0x3f, 0x37c, 0x380, 0x26b, 0x70, 0x1ce, 0xe, 0x33f, 0x307, 0x3e0, 0x3e7, 0x7c, 0x3fb, 0x20b, 0x1fc, 0x1c2, 0x23b, 0x13a, 0x1c4, 0x125, 0x23c, 0x2a1, 0x243, 0xd5, 0x1cb, 0x29f, 0x1ba, 0x3d4, 0x135, 0x27e, 0x2a3, 0x349, 0x1d7, 0xe8, 0x3bd, 0x1d, 0x2f2, 0x286, 0x15c, 0x356, 0x22f, 0x36c, 0x3c2, 0x269, 0x17a, 0xcc, 0x12d, 0x21d, 0x2a0, 0x2c6, 0x54, 0x35e, 0x20e, 0x36d, 0x347, 0x2e8, 0x3ef, 0x5d, 0x3fa, 0x28e, 0x17d, 0x357, 0x2aa, 0x3ed, 0x157, 0x2f8, 0x3ad, 0x5f, 0x2f0, 0x38c, 0x5e, 0x275, 0x30d, 0x2cb, 0x2e4, 0x1da, 0x258, 0x139, 0x4b, 0xa6, 0x18a, 0x312, 0x133, 0x10a, 0x204, 0x85, 0x102, 0x246, 0x81, 0x123, 0x244, 0x295, 0x122, 0x34e, 0x91, 0x1a7, 0x24c, 0x2d7, 0x126, 0x36f, 0x93, 0x3b3, 0x24d, 0x3dd, 0x322, 0x3ea, 0x191, 0x1f5, 0x2cc, 0x2fe, 0x166, 0x17f, 0xb3, 0x2bb, 0x25d, 0x359, 0x32a, 0x3a8, 0x195, 0x1d4, 0x2ce, 0xea, 0x167, 0x75, 0x2b7, 0x23e, 0x35f, 0x11f, 0x3ab, 0x28b, 0x3d1, 0x341, 0x3ec, 0x3a4, 0x1f6, 0x1d2, 0xfb, 0xe9, 0x279, 0x270, 0x338, 0x138, 0x19c, 0x9c, 0xce, 0x4e, 0x67, 0x27, 0x237, 0x217, 0x31f, 0x30f, 0x38b, 0x383, 0x3c1, 0x3c5, 0x3e4, 0x3e6, 0x1f2, 0x1f3, 0xf9, 0x2fd, 0x278, 0x37a, 0x13c, 0x1bd, 0x9e, 0x2da, 0x4f, 0x16d, 0x223, 0x2b2, 0x315, 0x159, 0x38e, 0x2a8, 0x1c7, 0x154, 0x2e7, 0xaa, 0x377, 0x55, 0x3bf, 0x22e, 0x3db, 0x117, 0x3e9, 0x28f, 0x3f0, 0x343, 0x1f8, 0x3a5, 0xfc, 0x3d6, 0x7e, 0x1eb, 0x3f, 0x2f1, 0x21b, 0x37c, 0x309, 0x1be, 0x380, 0x214, 0x2, 0x21, 0x4, 0x42, 0x8, 0x84, 0x10, 0x108, 0x20, 0x210, 0x40, 0x29, 0x80, 0x52, 0x100, 0xa4, 0x200, 0x148, 0x9, 0x290, 0x12, 0x129, 0x24, 0x252, 0x48, 0xad, 0x90, 0x15a, 0x120, 0x2b4, 0x240, 0x161, 0x89, 0x2c2, 0x112, 0x18d, 0x224, 0x31a, 0x41, 0x23d, 0x82, 0x73, 0x104, 0xe6, 0x208, 0x1cc, 0x19, 0x398, 0x32, 0x339, 0x64, 0x27b, 0xc8, 0xff, 0x190, 0x1fe, 0x320, 0x3fc, 0x249, 0x3f1, 0x9b, 0x3eb, 0x136, 0x3df, 0x26c, 0x3b7, 0xd1, 0x367, 0x1a2, 0x2c7, 0x344, 0x187, 0x281, 0x30e, 0x10b, 0x215, 0x216, 0x23, 0x25, 0x46, 0x4a, 0x8c, 0x94, 0x118, 0x128, 0x230, 0x250, 0x69, 0xa9, 0xd2, 0x152, 0x1a4, 0x2a4, 0x348, 0x141, 0x299, 0x282, 0x13b, 0x10d, 0x276, 0x21a, 0xe5, 0x3d, 0x1ca, 0x7a, 0x394, 0xf4, 0x321, 0x1e8, 0x24b, 0x3d0, 0x9f, 0x3a9, 0x13e, 0x35b, 0x27c, 0x2bf, 0xf1, 0x177, 0x21, 0x8, 0x108, 0x40, 0x52, 0x200, 0x290, 0x24, 0xad, 0x120, 0x161, 0x112, 0x31a, 0x82, 0xe6, 0x19, 0x339, 0xc8, 0x1fe, 0x249, 0x3eb, 0x26c, 0x367, 0x344, 0x30e, 0x216, 0x46, 0x94, 0x230, 0xa9, 0x1a4, 0x141, 0x13b, 0x21a, 0x1ca, 0xf4, 0x24b, 0x3a9, 0x27c, 0x177, 0x3c4, 0x3aa, 0x21f, 0x16f, 0xdc, 0x36a, 0x2e9, 0x366, 0x365, 0x306, 0x31e, 0x6, 0xc6, 0x30, 0x239, 0x180, 0x1ec, 0x1b, 0x37b, 0xd8, 0x3ee, 0x2c9, 0x34f, 0x265, 0x24e, 0x30c, 0x254, 0x56, 0x284, 0x2b0, 0xd, 0x1ad, 0x68, 0x173, 0x340, 0x38a, 0x236, 0x6f, 0x194, 0x378, 0xbb, 0x3f6, 0x1d1, 0x38f, 0x293, 0x47, 0xb5, 0x238, 0x1a1, 0x1e4, 0x113, 0x33b, 0x8a, 0x1ee, 0x59, 0x36b, 0x2c8, 0x36e, 0x26d, 0x346, 0x34c, 0x206, 0x256, 0x14, 0x294, 0xa0, 0x8d, 0x109, 0x61, 0x5a, 0x308, 0x2d0, 0x76, 0x2ad, 0x3b0, 0x145, 0x1bf, 0x23a, 0x1e3, 0x1f4, 0x42, 0x20, 0x52, 0x9, 0x252, 0x120, 0x2c2, 0x41, 0xe6, 0x32, 0xff, 0x249, 0x3df, 0x1a2, 0x30e, 0x25, 0x118, 0xa9, 0x348, 0x10d, 0x1ca, 0x1e8, 0x13e, 0x177, 0x381, 0x2b3, 0xdc, 0x2dd, 0x3b6, 0x306, 0x235, 0x18, 0x239, 0x300, 0x3b9, 0xd8, 0x3d5, 0x336, 0x24e, 0x211, 0x142, 0x2b0, 0x1a, 0x2bd, 0x340, 0x31d, 0xca, 0x378, 0x176, 0x3c3, 0x293, 0x8e, 0x2d4, 0x1e4, 0x226, 0xf7, 0x59, 0x2df, 0x332, 0x346, 0x291, 0xa, 0x294, 0x140, 0x234, 0x5a, 0x219, 0x352, 0x3b0, 0x28a, 0x2f5, 0x1f4, 0x20f, 0x2f7, 0x170, 0x24f, 0x253, 0x162, 0x2e2, 0x13, 0xef, 0x260, 0x1df, 0x8b, 0x39e, 0x144, 0x33c, 0xda, 0x351, 0x376, 0x2ea, 0x203, 0x1ef, 0xf0, 0x197, 0x23f, 0x28c, 0x379, 0x134, 0x3e3, 0x2c1, 0x87, 0x86, 0xc4, 0xe4, 0xb6, 0xbf, 0x2ed, 0x3cd, 0x10f, 0x14e, 0x1a8, 0x19a, 0x165, 0x32c, 0xf3, 0x151, 0x25f, 0x27a, 0x362, 0x84, 0x80, 0x290, 0x90, 0x2c2, 0x82, 0x398, 0x190, 0x3eb, 0x1a2, 0x215, 0x94, 0xd2, 0x282, 0x1ca, 0x3d0, 0xf1, 0x3aa, 0x6e, 0x2dd, 0x365, 0x3, 0x18c, 0x180, 0x3b9, 0x1b0, 0x34f, 0x186, 0xa1, 0x2b0, 0x34, 0x2e6, 0x236, 0x1bc, 0x176, 0x38f, 0x25e, 0x79, 0x113, 0xf7, 0xb2, 0x36e, 0x1a6, 0x5, 0x294, 0x280, 0xc2, 0x2d0, 0x1d8, 0x28a, 0x1e3, 0x3d9, 0x5c, 0x323, 0x253, 0x2c4, 0x39a, 0x98, 0x2eb, 0x8b, 0x335, 0x119, 0x1d6, 0x1bb, 0x2ea, 0xf, 0x3b5, 0x389, 0x146, 0x379, 0x268, 0x397, 0x225, 0x62, 0xe4, 0x16c, 0x2fc, 0x345, 0xa7, 0x1a8, 0x334, 0x19d, 0x156, 0x32b, 0x27a, 0x2cd, 0x337, 0x11, 0xd6, 0x92, 0x3ca, 0x182, 0x2b1, 0xb0, 0x266, 0xa6, 0x12c, 0x3b4, 0x30d, 0x1c6, 0x1e9, 0x2f8, 0x155, 0x2a7, 0x3fa, 0x174, 0x287, 0x35e, 0x150, 0x33, 0x17a, 0x1b6, 0x57, 0x286, 0x3da, 0x1d0, 0x2a3, 0x1ea, 0x374, 0xd5, 0x108, 0x200, 0xad, 0x112, 0xe6, 0xc8, 0x3eb, 0x344, 0x46, 0xa9, 0x13b, 0xf4, 0x27c, 0x3aa, 0xdc, 0x366, 0x31e, 0x30, 0x1ec, 0xd8, 0x34f, 0x30c, 0x284, 0x1ad, 0x340, 0x6f, 0xbb, 0x38f, 0xb5, 0x1e4, 0x8a, 0x36b, 0x26d, 0x206, 0x294, 0x109, 0x308, 0x2ad, 0x1bf, 0x1f4, 0x2e, 0x323, 0xaf, 0x302, 0xef, 0x192, 0x1cf, 0x288, 0x1d6, 0x376, 0x3ba, 0x78, 0x32e, 0x1dc, 0x134, 0x397, 0x43, 0x188, 0x329, 0x2ed, 0x32f, 0xd4, 0x334, 0x33a, 0x151, 0x16e, 0x3e1, 0x106, 0x6b, 0x92, 0x39d, 0x201, 0x1a5, 0x312, 0x4b, 0x1da, 0x30d, 0x38c, 0x3ad, 0x3ed, 0x17d, 0x5d, 0x347, 0x35e, 0x2a0, 0xcc, 0x3c2, 0x356, 0x2f2, 0xe8, 0x2a3, 0x3d4, 0x1cb, 0x2a1, 0x1c4, 0x1c2, 0x3fb, 0x3e0, 0xe, 0x26b, 0x3f, 0x28f, 0x2e7, 0x16d, 0xf9, 0x30f, 0x19c, 0x3a4, 0x2b7, 0x359, 0x191, 0x2d7, 0x81, 0x21, 0x40, 0x290, 0x120, 0x31a, 0x19, 0x1fe, 0x210, 0x12, 0x161, 0x104, 0xff, 0x26c, 0x215, 0x250, 0x13b, 0x1e8, 0x1e2, 0x16f, 0x1db, 0x3, 0x239, 0x36, 0x3a3, 0x30c, 0x101, 0x2bd, 0x236, 0x2f9, 0x34d, 0x238, 0x226, 0x3b1, 0x26d, 0x5, 0x242, 0x5a, 0xec, 0x11d, 0x303, 0x3ce, 0x253, 0x302, 0x1de, 0x241, 0x263, 0xda, 0x2be, 0xf, 0x2cf, 0xee, 0x134, 0x327, 0x10c, 0x5b, 0x2fc, 0x10f, 0x262, 0x2ca, 0x2ac, 0x16e, 0x3cb, 0x11, 0x358, 0x132, 0x35c, 0x160, 0x314, 0xed, 0x30d, 0x311, 0x2af, 0x357, 0x3fd, 0x3b2, 0x54, 0x33, 0x1e1, 0x356, 0x1ed, 0x3a0, 0x135, 0x137, 0x11e, 0x13a, 0x3f8, 0x1f0, 0xe, 0xdf, 0xfc, 0x55, 0x223, 0x1f3, 0x237, 0xe9, 0x35f, 0x359, 0x322, 0x34e, 0x1, 0x210, 0x12, 0x161, 0x104, 0xff, 0x26c, 0x215, 0x250, 0x13b, 0x1e8, 0x1e2, 0x16f, 0x1db, 0x3, 0x239, 0x36, 0x3a3, 0x30c, 0x101, 0x2bd, 0x236, 0x2f9, 0x34d, 0x238, 0x226, 0x3b1, 0x26d, 0x29, 0x48, 0x31a, 0x64, 0x3df, 0x216, 0xd2, 0x3d, 0x27c, 0x2b3, 0x1db, 0x6, 0xf6, 0x1b0, 0x24e, 0x158, 0xd0, 0x6f, 0x2ec, 0x8e, 0x113, 0x3b1, 0xd3, 0x14, 0x234, 0x1a9, 0x1bf, 0x3d9, 0x2e0, 0x162, 0x273, 0x324, 0x263, 0x1b4, 0x2ea, 0x78, 0xa3, 0x1ff, 0x18b, 0xc4, 0x25b, 0x345, 0x131, 0x2ca, 0x151, 0x1b1, 0x267, 0x110, 0x3ca, 0xb, 0x133, 0x298, 0x1c1, 0x38c, 0x2af, 0x2a7, 0x3ef, 0x1af, 0x149, 0x269, 0xae, 0x3a, 0x2a3, 0x34b, 0x8f, 0x13a, 0x3f9, 0x3c9, 0x70, 0x1eb, 0x3bf, 0x16d, 0x3e4, 0x9c, 0x3d1, 0x3a8, 0x322, 0x295, 0x4, 0xa4, 0x120, 0x73, 0x190, 0x367, 0x4a, 0x348, 0xf4, 0x1e2, 0x2de, 0x365, 0x18, 0x3d8, 0x2c9, 0x12a, 0x169, 0x340, 0x1bc, 0x3a2, 0x238, 0x45, 0x2df, 0x34c, 0x50, 0xc2, 0x2ad, 0x2f5, 0x37f, 0x392, 0x181, 0x1de, 0x8b, 0x19e, 0x2d9, 0x3ba, 0x1e0, 0x28c, 0x3f5, 0x225, 0x310, 0x17e, 0x52, 0x120, 0xe6, 0x249, 0x30e, 0xa9, 0x1ca, 0x177, 0xdc, 0x306, 0x239, 0xd8, 0x24e, 0x2b0, 0x340, 0x378, 0x293, 0x1e4, 0x59, 0x346, 0x294, 0x5a, 0x3b0, 0x1f4, 0x170, 0x162, 0xef, 0x8b, 0x33c, 0x376, 0x1ef, 0x23f, 0x134, 0x87, 0xe4, 0x2ed, 0x14e, 0x165, 0x151, 0x362, 0x18e, 0x92, 0xd7, 0x160, 0x4b, 0x2cb, 0x2f0, 0x3ed, 0x3fa, 0x36d, 0x2a0, 0x269, 0x15c, 0xe8, 0x135, 0xd5, 0x1c4, 0x20b, 0x307, 0x26b, 0x1f8, 0x2a8, 0xf9, 0x4e, 0x3d1, 0x359, 0x93, 0x85, 0x40, 0xad, 0x82, 0x1fe, 0x344, 0x230, 0x21a, 0x27c, 0x16f, 0x365, 0x30, 0x37b, 0x265, 0x284, 0x173, 0x194, 0x38f, 0x1a1, 0x1ee, 0x26d, 0x14, 0x61, 0x2ad, 0x1e3, 0x1e7, 0xaf, 0x26, 0x3be, 0x288, 0x2ab, 0xf, 0x32e, 0x2fb, 0x18b, 0x188, 0x17e, 0x21e, 0x334, 0x1e6, 0xfd, 0x106, 0x358, 0xc1, 0x1a5, 0xa6, 0x2e4, 0x38c, 0x157, 0x28e, 0x347, 0x2c6, 0x17a, 0xa4, 0x89, 0x339, 0xd1, 0x118, 0x21a, 0xf1, 0x1b5, 0x31e, 0x300, 0x3a3, 0x56, 0xd0, 0x1bc, 0x293, 0x3c8, 0x164, 0x206, 0x11a, 0x352, 0x1e3, 0x3ce, 0x2bc, 0x130, 0x39e, 0x1b4, 0x3ba, 0x389, 0x9a, 0x87, 0x1c8, 0x3a6, 0x262, 0x27d, 0x27a, 0x106, 0x2b9, 0x304, 0x133, 0x272, 0x2f, 0x2f8, 0x2fa, 0x3b2, 0x2a0, 0xdb, 0x179, 0x349, 0x374, 0x296, 0x1fc, 0x3c9, 0x1c0, 0x28f, 0x223, 0x383, 0xfb, 0x1d4, 0x24d, 0x85, 0x80, 0x2b4, 0x19, 0x3df, 0x4a, 0x13b, 0x35b, 0x6e, 0x306, 0x7b, 0x360, 0x254, 0x35a, 0xca, 0x38f, 0x342, 0x3b1, 0x34c, 0x140, 0x3b, 0x23a, 0x5c, 0xb1, 0xef, 0x116, 0xeb, 0x386, 0x2cf, 0x379, 0x18b, 0x310, 0x1f1, 0xd4, 0x32c, 0xb7, 0x337, 0x220, 0x26f, 0x160, 0x96, 0x33e, 0x3ad, 0x2a7, 0x3a7, 0x2c6, 0x2f4, 0x143, 0x1d7, 0x3a1, 0x11e, 0x1c2, 0x3c7, 0x331, 0x1f8, 0x159, 0x3e4, 0x270, 0x167, 0x3ea, 0x81, 0x148, 0x224, 0x1fe, 0x10b, 0x348, 0x3a9, 0x6e, 0x205, 0x1ec, 0x336, 0x101, 0x38a, 0x2ec, 0x79, 0x59, 0x103, 0x11a, 0x2ad, 0x385, 0x24f, 0x39a, 0x241, 0x271, 0x386, 0x197, 0x1ff, 0x43, 0x16c, 0x257, 0x165, 0x14d, 0x245, 0x358, 0x304, 0x266, 0x1da, 0x178, 0x3d3, 0x3ef, 0x163, 0x2f4, 0x286, 0x355, 0x137, 0x1c4, 0x3e, 0x1c, 0x3d6, 0x38e, 0x3c5, 0xfb, 0x3a8, 0x126, 0x21, 0x12, 0x23d, 0x249, 0x23, 0x282, 0x27c, 0x1b5, 0x235, 0x1b, 0x127, 0x169, 0x236, 0x3c3, 0x342, 0x36b, 0x12b, 0x212, 0x3b0, 0x3d9, 0x32d, 0x26, 0x2e3, 0xda, 0x3ba, 0x31b, 0x268, 0x31, 0xbf, 0x35, 0x196, 0xb7, 0x267, 0x92, 0x35c, 0x22d, 0x2e4, 0x22b, 0x15d, 0x2e8, 0x150, 0xdb, 0x2f2, 0x13f, 0x396, 0x13a, 0x3f7, 0x39c, 0x1f8, 0x2b2, 0x38b, 0x3a4, 0x25d, 0x1a7, 0x8, 0x252, 0x104, 0x3eb, 0x4a, 0x276, 0x177, 0x370, 0xc, 0x37b, 0x186, 0x1a, 0x6f, 0x290, 0x82, 0x3eb, 0x94, 0x1ca, 0x3aa, 0x365, 0x180, 0x34f, 0x2b0, 0x236, 0x38f, 0x113, 0x36e, 0x294, 0x2d0, 0x1e3, 0x323, 0x39a, 0x8b, 0x1d6, 0xf, 0x146, 0x397, 0xe4, 0x345, 0x334, 0x32b, 0x337, 0x92, 0x2b1, 0xa6, 0x30d, 0x2f8, 0x3fa, 0x35e, 0x17a, 0x286, 0x2a3, 0xd5, 0x23b, 0x3e0, 0x380, 0x55, 0xf9, 0x270, 0x195, 0x2d7, 0x8, 0xad, 0x19, 0x367, 0xa9, 0x24b, 0x16f, 0x31e, 0x1b, 0x24e, 0x1ad, 0x194, 0x47, 0x8a, 0x346, 0x8d, 0x2ad, 0x303, 0x12e, 0xef, 0x51, 0x2ab, 0x78, 0x222, 0x87, 0x329, 0x21e, 0x196, 0x16e, 0x18e, 0x99, 0x1a5, 0x139, 0x5e, 0x3ed, 0x3ef, 0x2c6, 0x3c2, 0x1d, 0x135, 0x2a1, 0x1fc, 0x33f, 0x3f, 0x2a8, 0x3c1, 0x3a4, 0xb3, 0x295, 0x40, 0x161, 0xc8, 0x30e, 0x141, 0x27c, 0x36a, 0xc6, 0xd8, 0x254, 0x173, 0xbb, 0x238, 0x59, 0x206, 0x61, 0x145, 0x2e, 0x162, 0x371, 0x288, 0x175, 0x3c0, 0x129, 0x208, 0x367, 0x152, 0x13e, 0x36a, 0x18c, 0x360, 0x284, 0x31d, 0x34d, 0x33b, 0xd3, 0x280, 0x3b0, 0x37f, 0x2bc, 0x192, 0x271, 0x203, 0x146, 0x327, 0x390, 0x21e, 0x32c, 0x1b1, 0x6b, 0x182, 0xc5, 0x2cb, 0x353, 0x22a, 0x54, 0xdb, 0x3da, 0x3d4, 0x71, 0x3e, 0x70, 0x117, 0x278, 0x270, 0x32a, 0x34e, 0x40, 0x2c2, 0x320, 0x46, 0x3d, 0x30b, 0x306, 0x3d8, 0x186, 0x68, 0x2f9, 0x2d4, 0x36b, 0xa5, 0x168, 0x1e3, 0x24f, 0x273, 0x51, 0x15f, 0x1e0, 0x134, 0x62, 0x1f1, 0x2a9, 0x2a2, 0x83, 0x2f6, 0x58, 0x12c, 0x38c, 0x15d, 0x3b2, 0x12d, 0x2a5, 0x355, 0xd5, 0x7f, 0x39b, 0x3f, 0x159, 0x31f, 0x11f, 0x322, 0x214, 0x24, 0x1cc, 0x1a2, 0x1a4, 0x35b, 0x370, 0x30, 0x3d5, 0x158, 0x236, 0x317, 0x45, 0x346, 0x11a, 0x2a6, 0x2e, 0x2c4, 0x1df, 0x6d, 0x37d, 0xee, 0x18b, 0xb6, 0xa7, 0x33a, 0x1fa, 0x88, 0xd7, 0x22d, 0x382, 0x2f8, 0x252, 0x32, 0x30e, 0x10d, 0x381, 0x306, 0x3b9, 0x211, 0x340, 0x3c3, 0x226, 0x346, 0x234, 0x28a, 0x170, 0x13, 0x39e, 0x376, 0x197, 0x3e3, 0xe4, 0x10f, 0x32c, 0x362, 0x1ac, 0xb, 0x4b, 0x1c6, 0x15d, 0x36d, 0xbd, 0x105, 0x135, 0x296, 0x3ff, 0x26b, 0x377, 0x3c5, 0x3d1, 0x3ea, 0x2, 0xad, 0x64, 0x215, 0x21a, 0x30b, 0x205, 0x37b, 0x2b, 0x289, 0x38f, 0x45, 0x285, 0x61, 0x11d, 0x2e0, 0x26, 0x335, 0x2e5, 0x32e, 0x3cf, 0x1c8, 0x21e, 0x251, 0x2cd, 0x358, 0x16, 0x96, 0x38c, 0x2ba, 0x2d3, 0x17a, 0x20a, 0x26a, 0x125, 0x3f7, 0xdf, 0x2e7, 0x383, 0x3ab, 0x3dd, 0x4, 0x15a, 0xc8, 0x23, 0x3d, 0x21f, 0x3, 0x2ff, 0x56, 0x11b, 0x317, 0x8a, 0x103, 0xc2, 0x23a, 0x1c9, 0x4c, 0x263, 0x1c3, 0x255, 0x397, 0x390, 0x35, 0xab, 0x193, 0x2b9, 0x2c, 0x12c, 0x311, 0x17d, 0x1af, 0x2f4, 0x1d, 0xdd, 0x24a, 0x3e7, 0x1be, 0x1c7, 0x30f, 0xad, 0xc8, 0x46, 0xf4, 0xdc, 0x30, 0x34f, 0x1ad, 0xbb, 0x1e4, 0x26d, 0x109, 0x1bf, 0x323, 0xef, 0x288, 0x3ba, 0x1dc, 0x43, 0x2ed, 0x334, 0x16e, 0x6b, 0x201, 0x4b, 0x38c, 0x17d, 0x35e, 0x3c2, 0xe8, 0x1cb, 0x1c2, 0xe, 0x28f, 0xf9, 0x3a4, 0x191, 0x21, 0x120, 0x1fe, 0x94, 0x24b, 0x36a, 0x239, 0x265, 0x68, 0x3f6, 0x113, 0x346, 0x61, 0x23a, 0x392, 0x130, 0x33c, 0xf, 0x222, 0x31, 0x3e2, 0x165, 0xfd, 0x110, 0x2b1, 0x139, 0x2f0, 0x28e, 0x54, 0x36c, 0x1d7, 0xd5, 0x1fc, 0x1ce, 0x3db, 0x3e6, 0x3d1, 0x3dd, 0x8, 0x161, 0x249, 0x230, 0x3a9, 0x2e9, 0x180, 0x24e, 0x173, 0x1d1, 0x33b, 0x34c, 0x5a, 0x1e3, 0x12e, 0x371, 0x6d, 0x1ef, 0x2fb, 0x218, 0x345, 0x196, 0x362, 0x358, 0x2c, 0x258, 0x5f, 0x3fa, 0x2c6, 0x22f, 0x349, 0x243, 0x20b, 0x70, 0x55, 0x3c1, 0x11f, 0x93, 0x108, 0x112, 0x3eb, 0xa9, 0x27c, 0x366, 0x1ec, 0x15a, 0x320, 0x230, 0x35b, 0x3b6, 0x1b, 0xa1, 0x233, 0xb5, 0x2df, 0x242, 0x145, 0x2e0, 0x98, 0x33c, 0x1e, 0x9a, 0x188, 0x257, 0xf3, 0x337, 0x132, 0xc5, 0x275, 0x15d, 0x1af, 0x3c2, 0x1d0, 0x325, 0x20b, 0xe0, 0x154, 0x237, 0x1d4, 0x244, 0x290, 0x32, 0x23, 0xf4, 0x1b8, 0xc0, 0x24e, 0x2e6, 0x34d, 0x1ee, 0xa5, 0x352, 0x2e, 0x20d, 0x335, 0x386, 0x28c, 0x21c, 0x3e2, 0x2ca, 0x3f4, 0x92, 0x34a, 0x361, 0x157, 0x1d9, 0xbd, 0x1d, 0x374, 0xe1, 0xe, 0x117, 0x3e4, 0x11f, 0x126, 0x29, 0x82, 0x2c7, 0x10d, 0x21f, 0xc, 0x3a3, 0x1ad, 0x176, 0x399, 0x34c, 0xb4, 0x385, 0x162, 0x375, 0x1bb, 0x32e, 0x327, 0xbf, 0x2a9, 0x13d, 0x88, 0x2b1, 0x272, 0x3d2, 0x5d, 0x149, 0x143, 0x135, 0x24a, 0x387, 0x3d6, 0x13c, 0x1d2, 0x191, 0x42, 0x89, 0x3eb, 0x152, 0x1e2, 0x306, 0x2ff, 0x158, 0x194, 0x79, 0x332, 0x109, 0x37e, 0x97, 0x371, 0x2b4, 0x9b, 0x1a4, 0x1d5, 0x235, 0x2c9, 0x34, 0x3e5, 0x8a, 0xa, 0xec, 0x1e7, 0x273, 0x119, 0x1ef, 0x3fe, 0x1c8, 0xd4, 0x14d, 0x44, 0x2b1, 0xed, 0x353, 0x2e8, 0xbd, 0x3a, 0x1cb, 0x301, 0xe0, 0x2a8, 0xce, 0x2bb, 0x1, 0x2b4, 0x9b, 0x1a4, 0x1d5, 0x235, 0x2c9, 0x34, 0x3e5, 0x8a, 0xa, 0xec, 0x1e7, 0x273, 0x119, 0x1ef, 0x3fe, 0x1c8, 0xd4, 0x14d, 0x44, 0x2b1, 0xed, 0x353, 0x2e8, 0xbd, 0x3a, 0x1cb, 0x301, 0xe0, 0x2a8, 0xce, 0x2bb, 0x1, 0x2b4, 0x9b, 0x1a4, 0x1d5, 0x235, 0x2c9, 0x34, 0x3e5, 0x8a, 0xa, 0xec, 0x1e7, 0x273, 0x119, 0x1ef, 0x3fe, 0x1c8, 0xd4, 0x14d, 0x44, 0x2b1, 0xed, 0x353, 0x2e8, 0xbd, 0x3a, 0x1cb, 0x301, 0xe0, 0x2a8, 0xce, 0x2bb, 0x1, 0x2b4, 0x9b, 0x1a4, 0x1d5, 0x235, 0x2c9, 0x34, 0x3e5, 0x8a, 0xa, 0xec, 0x1e7, 0x273, 0x119, 0x1ef, 0x3fe, 0x1c8, 0xd4, 0x14d, 0x44, 0x2b1, 0x161, 0x26c, 0x13b, 0x16f, 0x239, 0x30c, 0x236, 0x238, 0x26d, 0x5a, 0x303, 0x302, 0x263, 0xf, 0x134, 0x5b, 0x262, 0x16e, 0x358, 0x160, 0x30d, 0x357, 0x54, 0x356, 0x135, 0x13a, 0xe, 0x55, 0x237, 0x359, 0x1, 0x161, 0x26c, 0x13b, 0x16f, 0x239, 0x30c, 0x236, 0x238, 0x26d, 0x5a, 0x303, 0x302, 0x263, 0xf, 0x134, 0x5b, 0x262, 0x16e, 0x358, 0x160, 0x30d, 0x357, 0x54, 0x356, 0x135, 0x13a, 0xe, 0x55, 0x237, 0x359, 0x1, 0x161, 0x26c, 0x13b, 0x16f, 0x239, 0x30c, 0x236, 0x238, 0x26d, 0x5a, 0x303, 0x302, 0x263, 0xf, 0x134, 0x5b, 0x262, 0x16e, 0x358, 0x160, 0x30d, 0x357, 0x54, 0x356, 0x135, 0x13a, 0xe, 0x55, 0x237, 0x359, 0x1, 0x161, 0x26c, 0x13b, 0x16f, 0x239, 0x30c, 0x236, 0x238, 0x26d, 0x5a, 0x303, 0x302, 0x263, 0xf, 0x134, 0x5b, 0x262, 0x16e, 0x358, 0x160, 0x30d, 0x357, 0x54, 0x356, 0x135, 0x13a, 0xe, 0x2c2, 0x1a2, 0x1ca, 0x2dd, 0x3b9, 0x2b0, 0x176, 0xf7, 0x294, 0x28a, 0x253, 0x8b, 0x2ea, 0x379, 0xe4, 0x1a8, 0x27a, 0x92, 0x266, 0x1c6, 0x3fa, 0x33, 0x3da, 0xd5, 0x3ff, 0x1eb, 0xf9, 0x23e, 0x244, 0xad, 0x9b, 0x299, 0x16f, 0x7b, 0x2b, 0x194, 0x3c8, 0x12b, 0x2ad, 0x2e0, 0xc9, 0x2ab, 0x77, 0x10c, 0x21e, 0x2a2, 0x88, 0x1a5, 0x19f, 0x2ba, 0x2c6, 0x2b8, 0x34b, 0x1fc, 0xdf, 0x4f, 0x3a4, 0x126, 0x148, 0xc8, 0x69, 0x1d5, 0xc6, 0xc3, 0x11b, 0x238, 0xd3, 0x168, 0x2e, 0x4c, 0xeb, 0x3c0, 0x316, 0x3a6, 0xab, 0x20c, 0x35c, 0x1da, 0x2ae, 0x1af, 0x22f, 0xf5, 0x319, 0x1ce, 0x1c7, 0x138, 0x191, 0x210, 0x208, 0x46, 0x35b, 0x18f, 0x2c9, 0xd0, 0x227, 0x2c8, 0x212, 0x385, 0x302, 0xcf, 0x3c, 0x1b2, 0x1b9, 0xcb, 0x326, 0x333, 0x298, 0x3ad, 0x1d9, 0x1e1, 0x349, 0x71, 0x39b, 0x3db, 0x217, 0x25d, 0x21, 0x224, 0x187, 0xf4, 0x18d, 0x281, 0x24b, 0x183, 0x3d5, 0x173, 0x25e, 0x2d5, 0x308, 0x2f7, 0x1de, 0x368, 0xa3, 0x62, 0x14e, 0xb7, 0x2b9, 0x312, 0x178, 0xba, 0x17a, 0x3a0, 0x71, 0x33f, 0x377, 0x9c, 0x191, 0x29, 0x32, 0x230, 0x1d5, 0x18c, 0x30c, 0xca, 0x3c8, 0x256, 0x2a6, 0x32d, 0x8b, 0x1dd, 0x1ff, 0x329, 0x2b6, 0x3cb, 0xc1, 0x12c, 0x1f9, 0x20e, 0x1ab, 0x26a, 0x1c2, 0x1c0, 0x2da, 0x3d1, 0x34e, 0x48, 0x3eb, 0x10d, 0x1b8, 0x1b, 0x202, 0x3e5, 0x59, 0x280, 0x3c6, 0x302, 0x19e, 0xf0, 0x18b, 0x3a6, 0x156, 0x22, 0x2d6, 0x19f, 0x17d, 0x30a, 0x1ed, 0xd5, 0x3f7, 0x3a5, 0x3c1, 0x3a8, 0x2, 0x31a, 0x10b, 0x9f, 0x306, 0x3a3, 0x2e6, 0xb5, 0x1a3, 0x219, 0x1e7, 0x3bc, 0x2d9, 0x146, 0xc4, 0x29c, 0x16e, 0x17b, 0x22d, 0x2f0, 0x174, 0x2f4, 0x349, 0xe2, 0x277, 0x2e7, 0x138, 0x322, 0x52, 0x64, 0x69, 0x3aa, 0x318, 0x211, 0x194, 0x399, 0xa5, 0x145, 0x31a, 0x216, 0x27c, 0x6, 0x24e, 0x6f, 0x113, 0x14, 0x1bf, 0x162, 0x263, 0x78, 0x18b, 0x345, 0x151, 0x110, 0x133, 0x38c, 0x3ef, 0x269, 0x2a3, 0x13a, 0x70, 0x16d, 0x3d1, 0x295, 0x120, 0x367, 0xf4, 0x365, 0x2c9, 0x340, 0x238, 0x34c, 0x2ad, 0x392, 0x8b, 0x3ba, 0x3f5, 0x17e, 0x33a, 0x18e, 0x2c, 0x30d, 0x28e, 0x12d, 0xe8, 0x23c, 0x33f, 0x2e7, 0x270, 0x93, 0x290, 0x249, 0x13b, 0x36a, 0x37b, 0x1ad, 0x293, 0x36e, 0x308, 0x1e7, 0x371, 0x376, 0x222, 0x5b, 0x334, 0x326, 0xd7, 0x1da, 0x2aa, 0x2c6, 0x2f2, 0xd5, 0x3e7, 0x28f, 0x237, 0x2fe, 0x40, 0x339, 0xa9, 0x21f, 0x180, 0x284, 0x3f6, 0x59, 0x109, 0x303, 0x26, 0x1d6, 0x23f, 0x218, 0xd4, 0xfd, 0x99, 0x4b, 0x2f8, 0x20e, 0x356, 0x1ba, 0x20b, 0x3f, 0x3e6, 0x195, 0x21, 0x82, 0x46, 0x177, 0xc6, 0x30c, 0x194, 0x33b, 0x294, 0x23a, 0x171, 0x288, 0x363, 0x87, 0x32f, 0x32b, 0x23d, 0x4a, 0x3c4, 0x60, 0x142, 0x3f6, 0xb2, 0x2d, 0x2e, 0x260, 0x2be, 0x2fb, 0x25b, 0x19d, 0x18e, 0x58, 0x2f, 0x5d, 0x2f4, 0x13f, 0x23b, 0xdf, 0x278, 0xea, 0x2, 0x73, 0x94, 0x381, 0xc0, 0x284, 0x3e5, 0x164, 0x5a, 0x5c, 0xc9, 0x175, 0x1ff, 0xbf, 0x33a, 0x31c, 0xb0, 0x5e, 0xba, 0x1e1, 0x27e, 0x7f, 0x1be, 0xf9, 0x1d4, 0x4, 0xe6, 0x128, 0x30b, 0x180, 0x101, 0x3c3, 0x2c8, 0xb4, 0xb8, 0x192, 0x2ea, 0x3fe, 0x17e, 0x27d, 0x231, 0x160, 0xbc, 0x174, 0x3c2, 0xf5, 0xfe, 0x37c, 0x1f2, 0x3a8, 0x8, 0x1cc, 0x250, 0x21f, 0x300, 0x202, 0x38f, 0x199, 0x168, 0x170, 0x324, 0x1dd, 0x3f5, 0x2fc, 0xf3, 0x6b, 0x2c0, 0x178, 0x2e8, 0x38d, 0x1ea, 0x1fc, 0x2f1, 0x3e4, 0x359, 0x10, 0x398, 0xa9, 0x37, 0x209, 0xd, 0x317, 0x332, 0x2d0, 0x2e0, 0x241, 0x3ba, 0x3e3, 0x1f1, 0x1e6, 0xd6, 0x189, 0x2f0, 0x1d9, 0x313, 0x3d4, 0x73, 0x128, 0x21f, 0x209, 0x1a, 0x47, 0x1a6, 0x153, 0xaf, 0x144, 0x2cf, 0x31, 0x131, 0x2cd, 0xd7, 0x361, 0x2fa, 0xcc, 0x355, 0x274, 0x380, 0x1f3, 0x32a, 0x108, 0x64, 0x348, 0x36a, 0x1f7, 0x2e6, 0x1a1, 0xa, 0x37e, 0x302, 0xeb, 0x77, 0xe4, 0x2b6, 0x267, 0x2c, 0x2f, 0xba, 0x3c2, 0x1ea, 0x3f8, 0x3d6, 0x31f, 0x1f5, 0x200, 0x3f1, 0x3d, 0x365, 0x336, 0x65, 0x33b, 0x242, 0x3e8, 0xef, 0x1bb, 0x4d, 0x2d8, 0x251, 0x44, 0x133, 0x22b, 0x287, 0x356, 0x2e1, 0xf8, 0x3db, 0x138, 0x126, 0xad, 0x1a2, 0x9f, 0x6, 0x12a, 0x2f9, 0x59, 0x2d, 0x5c, 0x192, 0x1dd, 0x3e3, 0x3e2, 0x391, 0x2b9, 0xa6, 0x2af, 0x2b5, 0x2f2, 0x354, 0x207, 0x2a8, 0x3ec, 0x123, 0x112, 0x23, 0x2ee, 0x239, 0x158, 0x3a2, 0x36e, 0x3b, 0x24f, 0x1cf, 0x3c, 0x316, 0x21e, 0x27a, 0x132, 0x258, 0x3af, 0x149, 0xe8, 0xe2, 0x39c, 0x9e, 0x75, 0x2, 0xe6, 0xe6, 0xa9, 0xdc, 0xd8, 0x340, 0x1e4, 0x294, 0x1f4, 0xef, 0x376, 0x134, 0x2ed, 0x151, 0x92, 0x4b, 0x3ed, 0x2a0, 0xe8, 0x1c4, 0x26b, 0xf9, 0x359, 0x40, 0x1fe, 0x21a, 0x365, 0x265, 0x194, 0x1ee, 0x61, 0x1e7, 0x3be, 0xf, 0x18b, 0x21e, 0xfd, 0xc1, 0x2e4, 0x28e, 0x17a, 0x27e, 0x1fc, 0x3d6, 0x237, 0x3dd, 0x24, 0x367, 0x3a9, 0xc6, 0x56, 0x1d1, 0x36e, 0x76, 0x12e, 0x263, 0x3c0, 0x218, 0x2a9, 0x337, 0x2c, 0x5e, 0x2e8, 0x22f, 0x29f, 0x3e7, 0x55, 0xfb, 0x295, 0x112, 0x46, 0x3aa, 0x1ec, 0x1ad, 0xb5, 0x206, 0x1bf, 0x302, 0x1d6, 0x1dc, 0x329, 0x33a, 0x6b, 0x312, 0x3ad, 0x35e, 0x2f2, 0x2a1, 0xe, 0x16d, 0x2b7, 0x21, 0x19, 0x1a4, 0x36a, 0x3ee, 0x38a, 0x113, 0xa0, 0x303, 0x130, 0x175, 0x3f5, 0x3e2, 0x32b, 0x2f6, 0x139, 0x2aa, 0x21d, 0x1d7, 0x13a, 0x380, 0x3e6, 0xb3, 0x52, 0x249, 0x1ca, 0x306, 0x24e, 0x378, 0x59, 0x1cc, 0x2a4, 0x2e9, 0x19b, 0xca, 0x1ee, 0xc2, 0x395, 0x1cf, 0xf0, 0x10c, 0x2a9, 0x267, 0xb0, 0x2f0, 0x2d3, 0x179, 0x2a1, 0x1c, 0x1bd, 0x195, 0x210, 0x320, 0x1ca, 0x205, 0x12a, 0x3f6, 0x199, 0x352, 0xaf, 0x119, 0xa3, 0x5b, 0x32c, 0x88, 0x18a, 0x1f9, 0x150, 0xe8, 0x388, 0x1be, 0x3c1, 0x1f5, 0x12, 0x367, 0x35b, 0x318, 0x2b0, 0x12f, 0x103, 0x1bf, 0x20d, 0x351, 0x2fb, 0x2fc, 0x391, 0x2f6, 0x272, 0x2ba, 0xcc, 0x14f, 0x301, 0x1f8, 0x9c, 0x24c, 0x161, 0x25, 0x30b, 0x1b, 0xd0, 0xf2, 0x294, 0x3e8, 0x3bc, 0x386, 0x364, 0x10f, 0xfd, 0x182, 0x382, 0x5d, 0x38d, 0x34b, 0x3e7, 0xaa, 0x3ec, 0x85, 0x104, 0xd2, 0x36a, 0x3d5, 0x233, 0x8a, 0x212, 0xb8, 0x8b, 0x3de, 0x21c, 0x262, 0x245, 0x2d6, 0x38c, 0x287, 0x143, 0x243, 0x277, 0x4f, 0xea, 0x10, 0xff, 0x21a, 0x2c3, 0x186, 0xbb, 0x2df, 0x3b, 0x12e, 0xcf, 0x31b, 0xe4, 0x398, 0x282, 0x365, 0x186, 0x176, 0x36e, 0x1d8, 0x2c4, 0x1d6, 0x379, 0x2fc, 0x32b, 0x3ca, 0x3b4, 0x3fa, 0x1b6, 0x374, 0x3e0, 0x38e, 0x23e, 0x8, 0xff, 0x3d, 0x31e, 0x2b, 0x3a2, 0x346, 0x2db, 0x20d, 0x2ab, 0x3fe, 0x3cd, 0x16e, 0x26f, 0x19f, 0x3ef, 0x1ab, 0x396, 0x33f, 0x4f, 0x1d4, 0x40, 0x3f1, 0x1e8, 0xc6, 0x158, 0x12f, 0x206, 0x2f5, 0x4c, 0x175, 0x3cf, 0x257, 0x362, 0x35c, 0xe3, 0x347, 0x143, 0x8f, 0x1ce, 0x278, 0x2bb, 0x200, 0x3b7, 0x35b, 0x239, 0x2d2, 0x16a, 0x14, 0x385, 0x260, 0x3ba, 0x247, 0x29c, 0x326, 0x2d6, 0x311, 0x20e, 0x20a, 0x71, 0x26b, 0x3e4, 0x1f5, 0x24, 0x187, 0x2ee, 0x1ec, 0x2bd, 0x342, 0xa0, 0x17, 0x324, 0x1ef, 0x21c, 0xcd, 0x106, 0x29d, 0xbe, 0x54, 0x74, 0x388, 0x37c, 0x31f, 0x3b3, 0x120, 0x23, 0x35d, 0x37b, 0x1c5, 0x226, 0x109, 0xb8, 0x116, 0x363, 0xc4, 0x261, 0x22, 0xc5, 0x1f9, 0x2a0, 0x339, 0x21a, 0x31e, 0x56, 0x293, 0x206, 0x1e3, 0x130, 0x3ba, 0x87, 0x262, 0x106, 0x133, 0x2f8, 0x2a0, 0x349, 0x1fc, 0x28f, 0xfb, 0x85, 0x19, 0x13b, 0x306, 0x254, 0x38f, 0x34c, 0x23a, 0xef, 0x386, 0x18b, 0xd4, 0x337, 0x160, 0x3ad, 0x2c6, 0x1d7, 0x1c2, 0x1f8, 0x270, 0x81, 0xe6, 0x141, 0x365, 0x30c, 0x1d1, 0x346, 0x1bf, 0x26, 0x175, 0x397, 0x14e, 0x326, 0x1a5, 0x5f, 0x54, 0xe8, 0x23b, 0x3d6, 0x19c, 0x295, 0x82, 0x1a4, 0x366, 0x24e, 0x3f6, 0x26d, 0x145, 0x39a, 0x376, 0x1b2, 0x21e, 0x3e1, 0x2c, 0x2f0, 0x35e, 0x3bd, 0x13a, 0x3f, 0x4e, 0x91, 0x31a, 0xa9, 0x2e9, 0x265, 0xbb, 0x36e, 0x3b0, 0x302, 0x2ab, 0x3f5, 0x32f, 0x362, 0x2b1, 0x38c, 0x20e, 0x1d, 0x1c4, 0x37c, 0x237, 0x2d7, 0x112, 0x230, 0x36a, 0x34f, 0x378, 0x2c8, 0x2ad, 0x171, 0x368, 0x134, 0x345, 0xfd, 0x201, 0x5e, 0x36d, 0x2f2, 0x125, 0x380, 0x30f, 0x93, 0x27b, 0x7a, 0xc6, 0x169, 0x2d4, 0xa0, 0x5c, 0x22c, 0x32e, 0xb6, 0x2ac, 0x99, 0x1c1, 0x174, 0x15c, 0x14b, 0x1c0, 0x30f, 0x126, 0x18d, 0xa9, 0x1db, 0x186, 0x1d1, 0x285, 0x2f5, 0x130, 0x37d, 0x21c, 0x334, 0x44, 0x221, 0x357, 0x2f4, 0x34b, 0x307, 0x2da, 0x25d, 0x290, 0x281, 0x30b, 0xd8, 0x65, 0x3b1, 0x76, 0x2c4, 0x351, 0x3f5, 0x257, 0x193, 0x1a5, 0xbe, 0x150, 0x349, 0x3f8, 0x22e, 0x3d1, 0x42, 0x320, 0x24b, 0x60, 0x34, 0x1e4, 0x11a, 0x395, 0x263, 0x77, 0xbf, 0x32b, 0x333, 0x33e, 0x347, 0x105, 0xe2, 0x37c, 0x67, 0x34e, 0x82, 0x348, 0x183, 0x254, 0x317, 0x12b, 0x1f4, 0x2eb, 0x3c, 0x218, 0x2ca, 0x1ac, 0x139, 0x2fa, 0x1b6, 0x1cb, 0x277, 0x278, 0x2fe, 0x48, 0x23, 0x16f, 0x3d5, 0x1bc, 0x2c8, 0x153, 0x1cd, 0x376, 0x364, 0x6a, 0x337, 0x2c0, 0x2af, 0x21d, 0x14f, 0x3e, 0x2e7, 0x23e, 0x20, 0x3eb, 0x35b, 0xf6, 0x173, 0xff, 0x1e8, 0x239, 0x2bd, 0x226, 0x5a, 0x253, 0xda, 0x134, 0x10f, 0x3cb, 0x160, 0x2af, 0x33, 0x135, 0x1f0, 0x223, 0x359, 0x12, 0x215, 0x16f, 0x3a3, 0x2f9, 0x26d, 0x11d, 0x1de, 0xf, 0x10c, 0x2ca, 0x358, 0xed, 0x3fd, 0x356, 0x11e, 0xdf, 0x237, 0x34e, 0x104, 0x13b, 0x3, 0x101, 0x238, 0x242, 0x3ce, 0x263, 0xee, 0x2fc, 0x16e, 0x35c, 0x311, 0x54, 0x3a0, 0x3f8, 0x55, 0x35f, 0x210, 0x26c, 0x1e2, 0x36, 0x236, 0x3b1, 0xec, 0x302, 0x2be, 0x327, 0x262, 0x11, 0x314, 0x357, 0x1e1, 0x137, 0xe, 0x1f3, 0x322, 0x161, 0x250, 0x1db, 0x30c, 0x34d, 0x5, 0x303, 0x241, 0x2cf, 0x5b, 0x2ac, 0x132, 0x30d, 0x3b2, 0x1ed, 0x13a, 0xfc, 0xe9, 0x1, 0xff, 0x1e8, 0x239, 0x2bd, 0x226, 0x5a, 0x253, 0xda, 0x134, 0x10f, 0x3cb, 0x160, 0x2af, 0x33, 0x135, 0x1f0, 0x223, 0x359, 0x12, 0x215, 0x16f, 0x3a3, 0x2f9, 0x26d, 0x11d, 0x1de, 0xf, 0x1fe, 0x3a9, 0x1ec, 0x38a, 0x59, 0x2ad, 0x39a, 0x386, 0x43, 0x165, 0x358, 0x1da, 0x3ef, 0x286, 0x1c4, 0x3d6, 0xfb, 0x21, 0x249, 0x27c, 0x1b, 0x236, 0x36b, 0x3b0, 0x26, 0x3ba, 0x31, 0x196, 0x92, 0x2e4, 0x2e8, 0x2f2, 0x13a, 0x1f8, 0x3a4, 0x8, 0x3eb, 0x177, 0x37b, 0x6f, 0x2c8, 0x145, 0xef, 0xf, 0x218, 0x33a, 0x2f6, 0x2cb, 0x347, 0x1d, 0x23b, 0x28f, 0x3d1, 0x108, 0x26c, 0x3c4, 0xd8, 0x194, 0x36e, 0x1bf, 0x130, 0x1ef, 0x188, 0xab, 0x99, 0x30d, 0x36d, 0x3bd, 0x1c2, 0x3db, 0x11f, 0x40, 0x367, 0x3aa, 0x3ee, 0x378, 0x26d, 0x23a, 0x371, 0x78, 0xe4, 0x1e6, 0x39d, 0x275, 0x20e, 0xe8, 0x1fc, 0x55, 0x2b7, 0x52, 0x344, 0x21f, 0x2c9, 0xbb, 0x346, 0x1e3, 0x192, 0x363, 0x5b, 0x151, 0xc1, 0x5e, 0x35e, 0x1d7, 0x20b, 0x2e7, 0xea, 0x200, 0x30e, 0x16f, 0x34f, 0x3f6, 0x34c, 0x1f4, 0x3be, 0x3c0, 0x329, 0x32b, 0xd7, 0x38c, 0x3fc, 0x2bf, 0x37b, 0xde, 0x332, 0x23a, 0x2eb, 0x1e0, 0x329, 0x25f, 0x35c, 0x5f, 0x149, 0x1ea, 0x307, 0x2fd, 0x24d, 0x31a, 0x282, 0x63, 0x1ad, 0x226, 0x168, 0x171, 0x2e5, 0x225, 0x165, 0x2b9, 0x361, 0x347, 0x3a, 0xfe, 0x55, 0x167, 0x148, 0x216, 0x1b8, 0x186, 0x293, 0x28, 0xb8, 0x288, 0x4d, 0x10f, 0x337, 0x22d, 0x2ba, 0x36c, 0x8f, 0x1be, 0x19c, 0x10a, 0x320, 0x27c, 0x36, 0xca, 0x36e, 0x37e, 0xc9, 0x363, 0xb6, 0x14d, 0x201, 0x1e9, 0x30a, 0x135, 0x3c9, 0x278, 0x3dd, 0x224, 0x299, 0x6, 0x1a, 0x399, 0x308, 0x2c4, 0x2be, 0x87, 0x261, 0x49, 0x2e4, 0x1d9, 0x3da, 0x1c2, 0x3bf, 0x75, 0x200, 0x215, 0x1b5, 0x24e, 0x317, 0x14a, 0x1e7, 0xcf, 0x379, 0x32f, 0x245, 0xc5, 0x357, 0x38d, 0x354, 0x380, 0x9c, 0x204, 0x1fe, 0x35b, 0x3b9, 0x6f, 0x199, 0x11d, 0x371, 0xf0, 0x390, 0x32b, 0x1ae, 0x22b, 0x2a0, 0xf5, 0x387, 0x37a, 0x3f1, 0x2ee, 0x3ee, 0x1fb, 0x291, 0x3bb, 0x335, 0x3b8, 0x32f, 0x83, 0x314, 0x28e, 0xae, 0x24a, 0x1f8, 0x28b, 0x80, 0x30e, 0x1b5, 0x95, 0x47, 0x242, 0x24f, 0x1d6, 0x3cf, 0xcd, 0x110, 0x172, 0x1d9, 0x3bd, 0x301, 0x1c7, 0x359, 0x90, 0x69, 0x306, 0x202, 0x3c8, 0x308, 0x181, 0x2ea, 0x31, 0x251, 0x132, 0x5e, 0x163, 0x14f, 0x3e0, 0x278, 0x3b3, 0x82, 0xe5, 0x60, 0x340, 0x3b1, 0x369, 0x130, 0x3b5, 0xb6, 0x29a, 0x16, 0x353, 0xcc, 0x2e1, 0x39c, 0x237, 0x246, 0x190, 0x27c, 0x6c, 0x328, 0x346, 0x385, 0x116, 0x146, 0x3a6, 0x3cb, 0x312, 0x2ba, 0x2d1, 0x23c, 0x1eb, 0x1f6, 0x108, 0x1a2, 0x37, 0x265, 0x34d, 0x28, 0x170, 0x232, 0x268, 0xd4, 0x231, 0x272, 0x3ef, 0x20a, 0x7f, 0x55, 0x2ce, 0x129, 0x94, 0x3b6, 0xac, 0x1a1, 0x2d, 0x15e, 0x376, 0x225, 0x2ca, 0x2f6, 0x33e, 0x15, 0x349, 0x3f7, 0x2da, 0x191, 0x18d, 0x282, 0xc6, 0x3eb, 0x3aa, 0x34f, 0x38f, 0x294, 0x323, 0x1d6, 0x397, 0x334, 0x92, 0x30d, 0x35e, 0x2a3, 0x3e0, 0xf9, 0x2d7, 0x19, 0x24b, 0x1b, 0x194, 0x346, 0x303, 0x51, 0x222, 0x21e, 0x18e, 0x139, 0x3ef, 0x1d, 0x1fc, 0x2a8, 0xb3, 0x161, 0x141, 0xc6, 0x173, 0x59, 0x145, 0x371, 0x3c0, 0x17e, 0x362, 0x133, 0x357, 0x22f, 0x125, 0x1f8, 0x11f, 0x200, 0x46, 0x366, 0x284, 0x1e4, 0x308, 0x302, 0x3ba, 0x188, 0x151, 0x201, 0x3ad, 0xcc, 0x1cb, 0x26b, 0x19c, 0x21, 0x26c, 0x21f, 0x265, 0x293, 0xa0, 0x392, 0x368, 0x18b, 0x165, 0x2f6, 0x275, 0x54, 0x27e, 0x307, 0x3e6, 0x91, 0x339, 0x3a9, 0x37b, 0x378, 0x34c, 0x3bb, 0x263, 0x2fb, 0x14e, 0x22, 0x258, 0x2e8, 0x3bd, 0x20b, 0x315, 0x2fe, 0x112, 0x13b, 0x30, 0x340, 0x36b, 0x1bf, 0x192, 0x32e, 0x2ed, 0x3e1, 0x312, 0x17d, 0x356, 0x1c4, 0x28f, 0x2b7, 0x290, 0x94, 0x365, 0x2b0, 0x113, 0x2d0, 0x39a, 0x3df, 0x2b3, 0x24e, 0x8e, 0x234, 0x162, 0x2ea, 0xc4, 0x151, 0xb, 0x2af, 0x269, 0x8f, 0x1eb, 0x3d1, 0xa4, 0x4a, 0x365, 0x169, 0x45, 0x2ad, 0x1de, 0x1e0, 0x17e, 0x2cd, 0xc5, 0x28e, 0x2b8, 0xe1, 0x2e7, 0x2bb, 0x89, 0x13b, 0x60, 0x11b, 0x36e, 0x3c6, 0x22c, 0x222, 0x35, 0x231, 0x1da, 0x287, 0x3a0, 0x3e7, 0x2fd, 0x24c, 0x339, 0x35b, 0x1f7, 0x3f6, 0xa5, 0x395, 0x1d6, 0x327, 0xcb, 0x99, 0xbc, 0x30a, 0x1ba, 0x39c, 0xce, 0x21, 0xd1, 0x6e, 0x30c, 0x16a, 0x2d, 0x171, 0x305, 0x72, 0x32b, 0x16b, 0x3f2, 0x3c2, 0x14b, 0xfc, 0x11f, 0x9, 0x118, 0x306, 0x1a, 0xf7, 0x3b0, 0x260, 0x197, 0x2ed, 0x3cb, 0x53, 0x3fa, 0x105, 0xfe, 0x2a8, 0x166, 0x18d, 0x21a, 0x7b, 0x233, 0x26d, 0x3e8, 0x335, 0x2fb, 0x29c, 0x88, 0x2e4, 0x2d3, 0x355, 0x3e0, 0x1f2, 0x34e, 0xc8, 0xf1, 0x360, 0x1d1, 0x28, 0x1c9, 0x368, 0x316, 0x19d, 0x39d, 0x3b7, 0x2de, 0x254, 0xf2, 0x219, 0x26, 0x3b5, 0x1b9, 0x3e1, 0x53, 0x3fd, 0x1d, 0x3f9, 0x2da, 0x93, 0x398, 0x35b, 0x3ee, 0x3c3, 0x121, 0x12e, 0x2be, 0x62, 0x151, 0x16, 0x2ae, 0x36c, 0xe2, 0x117, 0x195, 0x2b4, 0x282, 0x239, 0x233, 0xd3, 0x3bb, 0x19e, 0x3e3, 0x334, 0x248, 0xbc, 0x21d, 0x2e1, 0xdf, 0xfb, 0x29, 0x25, 0x365, 0x2d2, 0x114, 0x145, 0x1df, 0x77, 0x32f, 0x11, 0xb9, 0x36d, 0x355, 0x3c9, 0x3c1, 0x246, 0x9b, 0x21f, 0x186, 0x16a, 0x5a, 0x1cd, 0x1e, 0x329, 0x1b1, 0x266, 0x28e, 0x179, 0x384, 0x315, 0x3ea, 0x104, 0x24b, 0x6c, 0x176, 0x14, 0x1c9, 0x2d9, 0x43, 0xf3, 0x1ae, 0x2f8, 0x1e1, 0x14b, 0x1f8, 0x75, 0x48, 0x1a4, 0x18, 0x289, 0x36e, 0x385, 0xa2, 0x134, 0x350, 0x2b9, 0x275, 0x150, 0x3a1, 0x70, 0x138, 0x10, 0x30e, 0x1b3, 0x101, 0x33b, 0x1d8, 0x260, 0x32e, 0x3a6, 0x267, 0x139, 0x3a7, 0x1d0, 0x3e7, 0x367, 0x36a, 0x284, 0x33b, 0x3b0, 0x192, 0x146, 0x21e, 0x6b, 0x2cb, 0x54, 0x3d4, 0x70, 0x270, 0x40, 0x46, 0x306, 0x68, 0x36b, 0x1e3, 0x51, 0x134, 0x2a9, 0x2f6, 0x38c, 0x12d, 0xd5, 0x3f, 0x11f, 0x24, 0x1a4, 0x30, 0x236, 0x346, 0x2e, 0x6d, 0x18b, 0x33a, 0xd7, 0x2f8, 0x3c2, 0x125, 0x3db, 0x359, 0x112, 0x1ca, 0x1b, 0xbb, 0x14, 0x392, 0x376, 0x218, 0x32b, 0x1a5, 0x357, 0x15c, 0x1c2, 0x315, 0x3dd, 0x19, 0x27c, 0x2c9, 0x293, 0x109, 0x171, 0xf, 0x329, 0x362, 0x18a, 0x5d, 0x3bd, 0x7c, 0xf9, 0x295, 0x249, 0x21f, 0x30c, 0x1a1, 0x2d0, 0xef, 0x3c0, 0x3e2, 0x106, 0x258, 0x36d, 0x2a3, 0x33f, 0x237, 0x21, 0x344, 0x2e9, 0x2b0, 0x8a, 0x145, 0x3be, 0x1dc, 0x14e, 0x110, 0x30d, 0x2c6, 0x1ba, 0x26b, 0xfb, 0x52, 0x94, 0x31e, 0x173, 0x2c8, 0x1f4, 0x263, 0x3f5, 0x334, 0x99, 0x2f0, 0xcc, 0x243, 0x3d6, 0x2b7, 0xad, 0x141, 0x2c7, 0x1b3, 0xd, 0x3dc, 0x2f5, 0x51, 0x268, 0x2b6, 0x39d, 0xbe, 0x1e1, 0x125, 0x3bf, 0x17f, 0x82, 0x9f, 0x360, 0x293, 0x212, 0x1cd, 0x78, 0x2fc, 0x83, 0x258, 0x2d3, 0x29e, 0x1ce, 0x338, 0x29, 0x94, 0x235, 0x1c5, 0x26d, 0x37f, 0xeb, 0x87, 0x156, 0x16, 0x2aa, 0x2a5, 0xfe, 0x16d, 0x126, 0xff, 0x3aa, 0x95, 0xf2, 0x76, 0x260, 0xa3, 0x21e, 0xd6, 0x33e, 0x2a0, 0x137, 0x21b, 0x11f, 0x48, 0x299, 0x180, 0x328, 0xa, 0x392, 0x2e5, 0x72, 0x16e, 0x266, 0x22a, 0x3bd, 0xf8, 0x3e4, 0x85, 0xd1, 0x370, 0x2b0, 0x114, 0x11d, 0x1cf, 0x1ff, 0x19a, 0x99, 0x1e9, 0x330, 0x23c, 0x117, 0x25d, 0x31a, 0x1e8, 0x1f7, 0x38f, 0x11a, 0x181, 0x1ef, 0x1b9, 0x39f, 0x139, 0x287, 0x13f, 0xe, 0x9c, 0x20, 0x46, 0x205, 0x1a0, 0x36e, 0x20f, 0x232, 0x18b, 0x27d, 0x35c, 0x3ed, 0x57, 0xe1, 0x315, 0x3b3, 0x64, 0x3c4, 0xc3, 0x2d4, 0x2d0, 0x187, 0x2c5, 0x68, 0x1b7, 0x20f, 0x6d, 0x225, 0x3cc, 0x1a5, 0x147, 0x1ed, 0x7c, 0x3e4, 0x10a, 0x344, 0x3b6, 0x35a, 0x2c8, 0x3d9, 0x271, 0x87, 0x2ac, 0x58, 0x17d, 0x20a, 0x3ff, 0x3e6, 0x204, 0x2c7, 0x366, 0x34, 0x2df, 0x303, 0x232, 0x316, 0x1e6, 0x2d6, 0x2a7, 0x2f2, 0x3e, 0x1f2, 0x85, 0x1a2, 0x1db, 0x1ad, 0x164, 0x3e8, 0x33c, 0x247, 0x156, 0x2c, 0x2ba, 0x105, 0x3fb, 0x1f3, 0x102, 0x367, 0x1b3, 0x1a, 0x36b, 0x385, 0x119, 0x18b, 0xf3, 0x16b, 0x357, 0x179, 0x1f, 0xf9, 0x246, 0xd1, 0x2e9, 0x2d2, 0xb2, 0x1f4, 0x19e, 0x327, 0xab, 0x16, 0x15d, 0x286, 0x3f9, 0x2fd, 0x81, 0x3b7, 0x2dd, 0xd, 0x3b1, 0x3c6, 0x288, 0x2c1, 0x27d, 0x2b1, 0x3af, 0x2b8, 0x20b, 0x278, 0x123, 0x26c, 0x370, 0x169, 0x59, 0xfa, 0xcf, 0x397, 0x251, 0xb, 0x2aa, 0x143, 0x3f8, 0x37a, 0x244, 0x3df, 0x36a, 0x202, 0x3dc, 0x1e3, 0x144, 0x364, 0x33a, 0x30e, 0x306, 0x340, 0x346, 0x170, 0x376, 0xe4, 0x362, 0x4b, 0x36d, 0x135, 0x26b, 0x3d1, 0xad, 0x21a, 0x37b, 0x38f, 0x61, 0x26, 0x32e, 0x21e, 0x358, 0x38c, 0x17a, 0x125, 0x2e7, 0x3dd, 0xc8, 0x21f, 0x56, 0x8a, 0x23a, 0x263, 0x397, 0xab, 0x2c, 0x17d, 0x1d, 0x3e7, 0x30f, 0x8, 0x46, 0x6, 0x236, 0x206, 0x392, 0x386, 0x329, 0x326, 0x258, 0x35e, 0x1ba, 0x37c, 0x2b7, 0x161, 0xf4, 0x3ee, 0x47, 0x308, 0x130, 0x146, 0xd4, 0x2f6, 0x5f, 0x3c2, 0x13a, 0x315, 0x2d7, 0x249, 0xdc, 0x2b0, 0x59, 0x1f4, 0x33c, 0x87, 0x151, 0x160, 0x3fa, 0xe8, 0x307, 0x4e, 0x40, 0x230, 0x30, 0x194, 0x14, 0xaf, 0xf, 0x17e, 0x106, 0x2e4, 0x2c6, 0x1cb, 0x3d6, 0x195, 0x31a, 0x3a9, 0x34f, 0x238, 0x76, 0x192, 0x222, 0x2a9, 0x39d, 0x2f8, 0x22f, 0x1c2, 0x9e, 0x295, 0x26c, 0x2e9, 0x1ad, 0x2c8, 0x3bb, 0x1d6, 0x31, 0x29a, 0x312, 0x3ef, 0x349, 0x215, 0x3, 0x236, 0x5, 0x253, 0xf, 0x2fc, 0x11, 0x30d, 0x33, 0x11e, 0x55, 0x322, 0xff, 0x16f, 0x101, 0x3b1, 0x303, 0xda, 0x10c, 0x16e, 0x314, 0x3b2, 0x135, 0xdf, 0x35f, 0x161, 0x1e8, 0x3a3, 0x238, 0xec, 0x241, 0x134, 0x2ca, 0x35c, 0x357, 0x1ed, 0x1f0, 0x237, 0x210, 0x250, 0x239, 0x2f9, 0x242, 0x302, 0x2cf, 0x10f, 0x358, 0x311, 0x1e1, 0x13a, 0x223, 0x34e, 0x26c, 0x1db, 0x2bd, 0x26d, 0x3ce, 0x2be, 0x5b, 0x3cb, 0xed, 0x54, 0x137, 0xfc, 0x359, 0x104, 0x1e2, 0x30c, 0x226, 0x11d, 0x263, 0x327, 0x2ac, 0x160, 0x3fd, 0x3a0, 0xe, 0xe9, 0x12, 0x13b, 0x36, 0x34d, 0x5a, 0x1de, 0xee, 0x262, 0x132, 0x2af, 0x356, 0x3f8, 0x1f3, 0x1, 0x215, 0x3, 0x236, 0x5, 0x253, 0xf, 0x2fc, 0x11, 0x30d, 0x33, 0x11e, 0x55, 0x322, 0xff, 0x16f, 0x101, 0x3b1, 0x303, 0xda, 0x10c, 0x16e, 0x314, 0x3b2, 0x135, 0xdf, 0x35f, 0x161, 0x23, 0xc, 0x194, 0x50, 0x2e2, 0x3c0, 0xa7, 0x124, 0x3ad, 0x1ab, 0x3f8, 0x3e6, 0x4, 0x8c, 0x30, 0x259, 0x140, 0x39a, 0x31b, 0x29c, 0x99, 0x2af, 0x2a5, 0x3fb, 0x383, 0x10, 0x230, 0xc0, 0x176, 0x109, 0x273, 0x77, 0x262, 0x264, 0x2ae, 0x286, 0x3f7, 0x217, 0x40, 0xd2, 0x300, 0x1d1, 0x2d, 0x1de, 0x1dc, 0x19a, 0x182, 0x2aa, 0x20a, 0x3c7, 0x4e, 0x100, 0x348, 0x1b, 0x34d, 0xb4, 0x371, 0x379, 0x261, 0x201, 0x2ba, 0x3a, 0x307, 0x138, 0x9, 0x13b, 0x6c, 0x12f, 0x2d0, 0x1df, 0x1ff, 0x196, 0x16, 0x2fa, 0xe8, 0x7, 0xe9, 0x24, 0xe5, 0x1b0, 0xb5, 0x352, 0x375, 0x3f5, 0x251, 0x58, 0x3fa, 0x3a0, 0x1c, 0x3a4, 0x90, 0x394, 0x2c9, 0x2d4, 0x153, 0x1cf, 0x3cf, 0x156, 0x160, 0x3f3, 0x29b, 0x70, 0x28b, 0x240, 0x24b, 0x336, 0x342, 0x145, 0x335, 0x327, 0x151, 0x189, 0x3d7, 0x27e, 0x1c0, 0x23e, 0x112, 0x13e, 0xc3, 0x113, 0x46, 0x30, 0xbb, 0x109, 0xef, 0x1dc, 0x334, 0x201, 0x17d, 0xe8, 0xe, 0x3a4, 0x120, 0x24b, 0x265, 0x113, 0x23a, 0x33c, 0x31, 0xfd, 0x139, 0x54, 0xd5, 0x3db, 0x3dd, 0x249, 0x2e9, 0x173, 0x34c, 0x12e, 0x1ef, 0x345, 0x358, 0x5f, 0x22f, 0x20b, 0x3c1, 0x108, 0xa9, 0x1ec, 0x38f, 0x308, 0x192, 0x134, 0x33a, 0x1a5, 0x5d, 0x2a3, 0x26b, 0x2b7, 0x31a, 0x177, 0x254, 0x1ee, 0x303, 0x368, 0xe4, 0x326, 0x2e4, 0x21d, 0x23c, 0x2a8, 0x91, 0x367, 0x306, 0x236, 0x14, 0x171, 0x3c0, 0x14e, 0x99, 0x157, 0x286, 0x3e7, 0x4e, 0x200, 0x13b, 0xd8, 0xb5, 0x2ad, 0x1cf, 0x397, 0x151, 0x312, 0x347, 0x3d4, 0x3f, 0x359, 0x19, 0x21f, 0x2b0, 0x2c8, 0x1e7, 0x175, 0x2d8, 0x18e, 0x275, 0x17a, 0x13a, 0x9e, 0x85, 0x216, 0xc6, 0x378, 0x8d, 0x26, 0x146, 0x2a9, 0xd7, 0x357, 0x3bd, 0x33f, 0xfb, 0xad, 0xf4, 0x34f, 0x1e4, 0x1bf, 0x288, 0x43, 0x8c, 0xc0, 0x1d1, 0xb4, 0x1df, 0x3f5, 0x156, 0x189, 0x347, 0x3a1, 0xfc, 0x2fe, 0x190, 0x370, 0x173, 0x291, 0xb1, 0x363, 0x35, 0x3ca, 0x3ed, 0x1ed, 0x39b, 0xfb, 0x15a, 0x3d0, 0x24e, 0x27f, 0x385, 0x368, 0x1c8, 0x83, 0x30d, 0x198, 0x319, 0x37a, 0x2, 0x118, 0x180, 0x3a2, 0x168, 0x3be, 0x3e3, 0x2ac, 0x312, 0x287, 0x34b, 0x1f8, 0x1f5, 0x320, 0x2e9, 0x2e6, 0x12b, 0x162, 0x2cf, 0x6a, 0x39d, 0x3d3, 0x3da, 0x33f, 0x1f6, 0x2b4, 0x3a9, 0x95, 0xf7, 0x303, 0x2d9, 0x390, 0x106, 0x213, 0x330, 0x23b, 0x2fd, 0x4, 0x230, 0x300, 0x34d, 0x2d0, 0x375, 0x3cf, 0x151, 0x22d, 0x107, 0x29f, 0x3f0, 0x3ea, 0x249, 0x1db, 0x1c5, 0x256, 0x2c4, 0x197, 0xd4, 0x333, 0x3af, 0x3bd, 0x277, 0x3ec, 0x161, 0x35b, 0x12a, 0x1ee, 0x20f, 0x1bb, 0x329, 0x20c, 0x2f, 0x269, 0x7f, 0x1f3, 0x8, 0x69, 0x209, 0x293, 0x1a9, 0x2e3, 0x397, 0x2a2, 0x53, 0x20e, 0x118, 0x300, 0x293, 0x352, 0x39e, 0x87, 0x27a, 0x272, 0x2a0, 0x296, 0x223, 0x85, 0x4a, 0x7b, 0x38f, 0x3b, 0x116, 0x18b, 0xb7, 0x96, 0x2c6, 0x11e, 0x159, 0x81, 0x23, 0x60, 0x1d1, 0x168, 0x375, 0x397, 0x14d, 0x14c, 0x54, 0x354, 0x1c7, 0x295, 0x10b, 0x18c, 0x3f6, 0x184, 0x324, 0x1b2, 0x391, 0x314, 0x35e, 0x325, 0xaa, 0x91, 0x187, 0xc, 0xbb, 0x2d, 0x2eb, 0x3f5, 0x2ac, 0x22d, 0x20e, 0x26e, 0x3bf, 0x2d7, 0x1a2, 0x235, 0x378, 0x234, 0x260, 0x134, 0xf3, 0x266, 0x36d, 0x2e1, 0x117, 0x93, 0x3b7, 0x205, 0x194, 0x280, 0x1de, 0x2fb, 0x251, 0x2c0, 0x347, 0x34b, 0x3f0, 0x3dd, 0x136, 0x2c3, 0x6f, 0x242, 0x4c, 0x222, 0x19d, 0x34a, 0x2e8, 0xdd, 0x3a5, 0x191, 0x3f1, 0x2c5, 0x236, 0x50, 0x33d, 0x1dc, 0xcb, 0x58, 0x3ef, 0x1ea, 0x7e, 0x2fe, 0x320, 0x1db, 0x38a, 0x14a, 0x20d, 0x146, 0x2b6, 0x16b, 0x5d, 0x29e, 0x2f1, 0xb3, 0x230, 0x1b, 0xb5, 0x145, 0x33c, 0x188, 0x337, 0x275, 0x3c2, 0x20b, 0x237, 0x290, 0xf4, 0x24e, 0x1ee, 0x2e, 0x386, 0x3e2, 0x92, 0x157, 0x1d, 0xe, 0x11f, 0x82, 0x21f, 0x1ad, 0x34c, 0x162, 0x32e, 0x2a9, 0x2b1, 0x5d, 0x135, 0x3d6, 0x191, 0x3eb, 0x306, 0x194, 0x109, 0x371, 0x3f5, 0x151, 0xa6, 0x54, 0x2a1, 0x315, 0x85, 0x94, 0x1ec, 0x47, 0x3b0, 0x288, 0x218, 0x326, 0x30d, 0x269, 0x1fc, 0x30f, 0x200, 0x1ca, 0x265, 0x8a, 0x3bb, 0x175, 0x2ed, 0x358, 0x2f8, 0x2f2, 0x33f, 0x3d1, 0x31a, 0x3aa, 0xd, 0x346, 0xaf, 0x3c0, 0x262, 0x201, 0x3fa, 0x27e, 0x3f, 0x2fe, 0x249, 0x365, 0x6f, 0x8d, 0x130, 0x134, 0x1e6, 0x18a, 0x35e, 0x243, 0x2a8, 0x81, 0x46, 0x180, 0x293, 0x2ad, 0x263, 0x31, 0x3e1, 0x2cb, 0x17a, 0x1c2, 0x3c1, 0x52, 0x21a, 0x34f, 0x33b, 0x303, 0x376, 0x17e, 0x110, 0x3ad, 0x286, 0x307, 0x3a4, 0x112, 0x3c4, 0x2b0, 0x69, 0x6c, 0x1a1, 0x7d, 0x351, 0x2d8, 0xd6, 0x17c, 0x2f2, 0x277, 0x35f, 0xe6, 0x2de, 0x1a0, 0x14, 0x33d, 0x379, 0xab, 0x22d, 0x2a, 0x2a1, 0x223, 0x214, 0xa9, 0x2ff, 0xf2, 0x1e3, 0x2d9, 0xbf, 0x110, 0x353, 0x20a, 0xe, 0x23e, 0x208, 0xdc, 0x2e6, 0x14a, 0x26, 0x4d, 0xf3, 0x18a, 0x2b5, 0x11e, 0x16d, 0x2, 0xd2, 0xd8, 0x342, 0xfa, 0x2ab, 0x1b9, 0x1ac, 0x2f8, 0x1ed, 0xe7, 0x2b7, 0x1cc, 0x1b5, 0x340, 0x28, 0x273, 0x2fb, 0x156, 0x53, 0x54, 0x14b, 0x4f, 0x21, 0x152, 0x1f7, 0x1e4, 0x3c6, 0x1bb, 0x17e, 0x220, 0x2af, 0x1d, 0x1c, 0x75, 0x19, 0x1b8, 0x1c5, 0x294, 0x4c, 0x9a, 0x1e6, 0x314, 0x163, 0x23c, 0x2da, 0x4, 0x1a4, 0x1b0, 0x28d, 0x1f4, 0x15f, 0x372, 0x358, 0x1f9, 0x3da, 0x1ce, 0x167, 0x398, 0x36a, 0x289, 0x50, 0xef, 0x1ff, 0x2ac, 0xa6, 0xa8, 0x296, 0x9e, 0x42, 0x2a4, 0x3ee, 0x3c8, 0x385, 0x376, 0xd2, 0x1b0, 0x113, 0x3d9, 0x2ea, 0x345, 0x3ca, 0x2a7, 0x2a3, 0x1eb, 0x322, 0x367, 0x18, 0x3a2, 0x2ad, 0x19e, 0x310, 0x18e, 0x22b, 0x2b8, 0x33f, 0x35f, 0x1cc, 0x36a, 0x11b, 0x140, 0x371, 0x3cf, 0x13d, 0x1da, 0xbd, 0x384, 0x237, 0x252, 0x35b, 0x284, 0x1a3, 0x15e, 0x23f, 0xcb, 0x2c0, 0x20e, 0x354, 0x223, 0x21, 0x2a4, 0x3d5, 0x33b, 0x17, 0x305, 0x32f, 0x264, 0x2fa, 0x27e, 0xfc, 0x3b3, 0x344, 0x318, 0x317, 0x3b0, 0x232, 0x1c8, 0x22, 0x3d2, 0x105, 0xe, 0x75, 0x32, 0x2e9, 0x233, 0x11a, 0x192, 0x2c1, 0x2dc, 0x2e4, 0x330, 0x3f8, 0x4e, 0x90, 0xf1, 0x2b0, 0x1a6, 0x2c4, 0x146, 0x19d, 0x266, 0x35e, 0x11e, 0x2da, 0x8, 0x299, 0x19b, 0x8a, 0x2f7, 0x37d, 0x21e, 0x26f, 0x115, 0x135, 0x343, 0x126, 0x30e, 0xc0, 0x12f, 0x145, 0xeb, 0xb6, 0x6b, 0x17c, 0x1ed, 0x1ce, 0x2ce, 0x27b, 0x366, 0xca, 0x212, 0x3be, 0x247, 0x1fa, 0x2cb, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x1, 0x1a4, 0x2c9, 0x8a, 0x1e7, 0x1ef, 0xd4, 0x2b1, 0x2e8, 0x1cb, 0x2a8, 0x348, 0x336, 0x59, 0x24f, 0x197, 0x165, 0x266, 0x163, 0x1c4, 0x3c5, 0x12, 0x27c, 0x169, 0x12b, 0x26, 0x268, 0xb7, 0x2e4, 0xdb, 0x3f7, 0x3a4, 0x104, 0x370, 0x6f, 0xc2, 0x22c, 0x218, 0x20c, 0x3d2, 0x1d, 0xe0, 0x17f, 0x26c, 0x18c, 0x227, 0x1bf, 0x2d9, 0x1f1, 0x99, 0x2fa, 0x1ea, 0x3db, 0x123, 0x250, 0x3ee, 0x27f, 0xb8, 0x78, 0xcd, 0xb0, 0x20e, 0x14b, 0x278, 0x52, 0x1e8, 0x142, 0x346, 0x2e2, 0x379, 0x151, 0x272, 0xbd, 0x20b, 0x338, 0x18d, 0x16f, 0x289, 0x280, 0x3be, 0x10e, 0x39f, 0x38c, 0x2b8, 0xe7, 0x195, 0x3fc, 0x3, 0x1d1, 0x153, 0xeb, 0x2d8, 0x2b9, 0x3af, 0x2a3, 0x3a5, 0x24c, 0x46, 0x36, 0x28d, 0x3bb, 0x37d, 0x6a, 0x2b1, 0x1d9, 0x325, 0x16d, 0x10, 0xe5, 0x30c, 0x199, 0xb1, 0x146, 0x27d, 0x221, 0x21d, 0x7f, 0x27, 0x120, 0x381, 0x2bd, 0x294, 0x260, 0x2c1, 0x362, 0x213, 0x1ab, 0x307, 0x23e, 0x64, 0x365, 0x299, 0xc3, 0x2c8, 0xb1, 0x28c, 0x1e6, 0x12c, 0x198, 0x3fb, 0x1d2, 0x104, 0x2e9, 0x1bc, 0x219, 0x288, 0x390, 0x220, 0x2aa, 0x13f, 0x3f0, 0x295, 0x250, 0x3d5, 0x1ee, 0x1c9, 0x389, 0x196, 0x53, 0x149, 0x1c2, 0xce, 0x2c2, 0x16f, 0x11b, 0x212, 0x1cf, 0xc4, 0x31c, 0x2f8, 0x2ef, 0x2f1, 0x93, 0x23, 0x36, 0x113, 0x2f7, 0x3de, 0x2a9, 0x29d, 0x2b5, 0x1c4, 0x383, 0x48, 0x3c4, 0x2bd, 0x121, 0x192, 0x225, 0x245, 0x2f0, 0x20a, 0xe0, 0x2fe, 0x1a2, 0x7b, 0x238, 0x385, 0x305, 0x14e, 0x16, 0x287, 0x2a1, 0x278, 0xa4, 0x3a9, 0x202, 0x5, 0xef, 0x3cf, 0x1fa, 0x275, 0xae, 0x277, 0x195, 0x3f1, 0xc, 0x293, 0x11d, 0x15f, 0x345, 0x26f, 0xba, 0x1cb, 0x2b2, 0x10, 0x1ca, 0x2b, 0xd3, 0x302, 0x9a, 0x25f, 0x2e4, 0x1b6, 0x3c7, 0x11f, 0x64, 0x2c3, 0x3f6, 0x1d8, 0xda, 0x17e, 0x248, 0x2fa, 0x3d4, 0x377, 0x10a, 0x141, 0x127, 0x2df, 0xaf, 0x13b, 0x30c, 0x26d, 0x302, 0x134, 0x16e, 0x30d, 0x356, 0xe, 0x359, 0x26c, 0x239, 0x238, 0x303, 0xf, 0x262, 0x160, 0x54, 0x13a, 0x237, 0x161, 0x16f, 0x236, 0x5a, 0x263, 0x5b, 0x358, 0x357, 0x135, 0x55, 0x1, 0x13b, 0x30c, 0x26d, 0x302, 0x134, 0x16e, 0x30d, 0x356, 0xe, 0x359, 0x26c, 0x239, 0x238, 0x303, 0xf, 0x262, 0x160, 0x54, 0x13a, 0x237, 0x161, 0x16f, 0x236, 0x5a, 0x263, 0x5b, 0x358, 0x357, 0x135, 0x55, 0x1, 0x13b, 0x30c, 0x26d, 0x302, 0x134, 0x16e, 0x30d, 0x356, 0xe, 0x359, 0x26c, 0x239, 0x238, 0x303, 0xf, 0x262, 0x160, 0x54, 0x13a, 0x237, 0x161, 0x16f, 0x236, 0x5a, 0x263, 0x5b, 0x358, 0x357, 0x135, 0x55, 0x1, 0x13b, 0x30c, 0x26d, 0x302, 0x134, 0x16e, 0x30d, 0x356, 0xe, 0x359, 0x26c, 0x239, 0x238, 0x303, 0xf, 0x262, 0x160, 0x54, 0x13a, 0x237, 0x161, 0x16f, 0x236, 0x5a, 0x263, 0x5b, 0x358, 0x276, 0x2b, 0x34c, 0x4c, 0x2c1, 0x326, 0x1e9, 0x74, 0x3f, 0x1a7, 0x250, 0x34f, 0x2df, 0x2bc, 0x2fb, 0x13d, 0x33e, 0x15c, 0x39c, 0x2cc, 0x30e, 0x36, 0x45, 0x323, 0x255, 0xf3, 0x258, 0xdb, 0x387, 0xea, 0x9b, 0x318, 0x238, 0x20f, 0x3c, 0x334, 0x22d, 0x292, 0x20b, 0x1f6, 0x398, 0x306, 0x3a2, 0x11d, 0x175, 0x35, 0x2d6, 0x35e, 0x388, 0x27, 0x112, 0x1b8, 0x1bc, 0x76, 0xda, 0x1f1, 0xc1, 0x3d7, 0x354, 0xf9, 0x129, 0x1d5, 0x340, 0x212, 0x335, 0x5b, 0x2b9, 0x147, 0x1ba, 0x159, 0x20, 0x24b, 0x169, 0x14a, 0x192, 0x86, 0x11, 0x157, 0x29b, 0x3e9, 0x85, 0x282, 0x12a, 0x346, 0x33d, 0x3cf, 0x3e1, 0x311, 0x3da, 0x37c, 0x126, 0x118, 0x2c9, 0xb2, 0xb1, 0x222, 0x25f, 0x382, 0x356, 0x1c, 0x17f, 0x344, 0x3d8, 0x399, 0x170, 0x389, 0x251, 0x139, 0x2f4, 0x1f0, 0x2b7, 0x3fc, 0x18, 0xb5, 0x3e8, 0x2f3, 0x2a9, 0x266, 0x30a, 0x1fc, 0xe5, 0xac, 0x256, 0xc9, 0x86, 0x22, 0x155, 0xf5, 0x2e7, 0x84, 0x1e8, 0xd, 0x50, 0x375, 0x188, 0x1ac, 0x2a7, 0x1ba, 0x2b2, 0x80, 0x27c, 0x2bd, 0x11a, 0x51, 0x390, 0x124, 0x3fa, 0x26e, 0x13c, 0x290, 0x1d5, 0x289, 0x5a, 0x19e, 0x1b9, 0x39d, 0x174, 0x8f, 0x3e6, 0x90, 0x37, 0x6f, 0x3b, 0xda, 0x3e2, 0x304, 0x287, 0x125, 0x31f, 0x2c2, 0x36a, 0x259, 0x153, 0x2ab, 0x10f, 0x16b, 0x35e, 0x319, 0x9c, 0x82, 0x3b6, 0x3e5, 0x1bf, 0x1c3, 0x29c, 0x160, 0x150, 0x384, 0xfb, 0x398, 0x205, 0x293, 0xfa, 0x37d, 0x2a9, 0xc5, 0x33, 0x3fb, 0x28b, 0x190, 0xc6, 0x11c, 0x20f, 0x78, 0xcb, 0x14c, 0x17a, 0x1f0, 0x167, 0x3eb, 0xc0, 0x342, 0x1e7, 0x197, 0x27d, 0x258, 0x1b6, 0x207, 0x359, 0x1a2, 0x3d8, 0x33b, 0x1c9, 0x77, 0x151, 0x361, 0x57, 0x1ce, 0x2cc, 0x215, 0xd8, 0x228, 0x25c, 0x222, 0xb7, 0x213, 0x286, 0x1c0, 0x3b3, 0x94, 0x1ca, 0x2b0, 0x294, 0x8b, 0xe4, 0x92, 0x3fa, 0xd5, 0xf9, 0xad, 0x16f, 0x194, 0x2ad, 0x2ab, 0x21e, 0x1a5, 0x2c6, 0x1fc, 0x3a4, 0xc8, 0xc6, 0x238, 0x2e, 0x3c0, 0xab, 0x1da, 0x22f, 0x1ce, 0x191, 0x46, 0x2c9, 0x2c8, 0x302, 0x1b2, 0x326, 0x3ad, 0x349, 0x3db, 0x21, 0xf4, 0xd, 0xa0, 0x1cf, 0x5b, 0x2f6, 0x5d, 0x243, 0x3e6, 0x120, 0xdc, 0x378, 0x3b0, 0x376, 0x14e, 0x160, 0x2a0, 0x20b, 0x3d1, 0x1fe, 0x30, 0x1a1, 0x1e7, 0x32e, 0x1e6, 0x2e4, 0x356, 0x70, 0x3dd, 0x94, 0x34f, 0x36e, 0x39a, 0x397, 0x337, 0x2f8, 0x2a3, 0x55, 0x8, 0x24b, 0x1ad, 0x8d, 0x51, 0x329, 0x99, 0x3ef, 0x2a1, 0x3c1, 0x161, 0x36a, 0xbb, 0x145, 0x175, 0xd4, 0x133, 0x21d, 0x3fb, 0x11f, 0x249, 0x239, 0x1e4, 0x170, 0x23f, 0x151, 0x2cb, 0x15c, 0x26b, 0x93, 0x230, 0x265, 0x26d, 0x26, 0x18b, 0x106, 0x157, 0x27e, 0x2e7, 0x108, 0x3a9, 0x68, 0x109, 0x394, 0x2d2, 0x8d, 0xa2, 0xbf, 0xc1, 0x287, 0x9d, 0x19c, 0x1cc, 0x3, 0xb5, 0x37f, 0x197, 0x1e6, 0x1c1, 0x143, 0x380, 0x1a7, 0x2a4, 0x254, 0x5, 0x1df, 0x188, 0x2b9, 0x22a, 0x243, 0x3c5, 0x89, 0x2e9, 0x3e5, 0x2f5, 0xf, 0x261, 0x298, 0x3c2, 0x277, 0x2cc, 0x46, 0x19b, 0x332, 0x26, 0x316, 0x11, 0x2aa, 0x3a1, 0x4f, 0x290, 0x35d, 0xca, 0x2ad, 0x15f, 0x6a, 0x133, 0x33, 0x3f7, 0xea, 0xd1, 0x3b9, 0x1ee, 0x15e, 0x3fe, 0x3e1, 0xbe, 0x355, 0x55, 0x10, 0x13e, 0x173, 0xc2, 0x232, 0x3e2, 0xb, 0x2a, 0x1c2, 0x1f6, 0xff, 0x30, 0x342, 0x395, 0x146, 0x25f, 0x2f, 0x1d, 0x7e, 0x246, 0x21a, 0x101, 0x50, 0x1cf, 0xb6, 0x3ca, 0x2e8, 0x71, 0x27, 0x82, 0x2c3, 0x227, 0x303, 0xf0, 0x251, 0x1da, 0x57, 0x331, 0x93, 0x69, 0x186, 0x34c, 0x260, 0x10c, 0x110, 0x2fa, 0x26e, 0xf9, 0x15a, 0x1b5, 0xbb, 0x28a, 0x1dd, 0x2a9, 0x321, 0x35a, 0x61, 0x232, 0x3cd, 0x2c, 0x150, 0x1f, 0x2b7, 0x3b7, 0x36, 0x59, 0x181, 0x364, 0x106, 0x155, 0x3a1, 0x9e, 0x252, 0x2de, 0xbb, 0x11d, 0x37d, 0x165, 0x12c, 0x2d1, 0x70, 0x36f, 0x152, 0x254, 0xa, 0x375, 0x5b, 0x3ca, 0x1d9, 0x1c4, 0x138, 0x32, 0xc6, 0xf2, 0x2e0, 0x1dc, 0x27a, 0x311, 0x1d7, 0x22e, 0x10, 0x27c, 0x1c5, 0x219, 0x368, 0xa7, 0x2c0, 0x12d, 0x1f0, 0x32a, 0x30e, 0x360, 0x199, 0x26, 0x225, 0x44, 0x17d, 0x26e, 0x1f2, 0x161, 0x1b3, 0x3a2, 0x1f4, 0x3b5, 0x27d, 0x2e4, 0x143, 0x309, 0x295, 0x10d, 0x101, 0xa0, 0x335, 0x1b9, 0xd7, 0x1af, 0x7f, 0x3a4, 0x320, 0x7b, 0x33b, 0x253, 0x1ff, 0x3e1, 0x17c, 0x14f, 0x2a8, 0x100, 0x381, 0x6f, 0x1d8, 0x2e5, 0x262, 0x53, 0x2f4, 0x33f, 0x2cc, 0x8c, 0x265, 0x1a6, 0x260, 0x218, 0x49, 0x3fd, 0x2a1, 0x31f, 0x23d, 0x306, 0x25e, 0x37f, 0x32e, 0x391, 0x213, 0x1d, 0x24b, 0x173, 0x308, 0x368, 0x14e, 0x312, 0x17a, 0x33f, 0x191, 0x230, 0x30c, 0x256, 0x8b, 0x329, 0xc1, 0x20e, 0x1c2, 0x3d1, 0x3eb, 0x1b, 0x59, 0x302, 0x18b, 0x22, 0x17d, 0xd5, 0x3c1, 0x31a, 0x306, 0xb5, 0x1e7, 0x146, 0x16e, 0x2f0, 0x349, 0x2e7, 0x52, 0x3aa, 0x194, 0x145, 0x3ba, 0x165, 0x258, 0x356, 0x380, 0x295, 0x21a, 0xd, 0x109, 0x33c, 0x345, 0x1a5, 0x21d, 0x3e7, 0x359, 0x216, 0x34f, 0x346, 0x371, 0x188, 0x2f6, 0x2e8, 0x1c4, 0x270, 0xc8, 0x239, 0x33b, 0xaf, 0x3f5, 0x337, 0x3ed, 0x1ba, 0x37a, 0x120, 0x2e9, 0x38f, 0x303, 0x3c0, 0x151, 0x275, 0x3bd, 0x28f, 0x8, 0x27c, 0x38a, 0x76, 0x376, 0x262, 0xa6, 0x3c2, 0x1ce, 0x93, 0x1a4, 0x56, 0x294, 0x51, 0x17e, 0x201, 0x54, 0x20b, 0x2b7, 0x367, 0xd8, 0x2c8, 0x26, 0x43, 0x110, 0x3fa, 0x2a1, 0x237, 0xe6, 0x6, 0x1a1, 0x323, 0x222, 0x362, 0x3ad, 0x27e, 0x315, 0x290, 0x9f, 0x1c5, 0x76, 0x2e5, 0x19a, 0x139, 0x57, 0x1be, 0x81, 0x394, 0x2bd, 0x308, 0x2d9, 0x131, 0xa6, 0x38d, 0x331, 0x91, 0x276, 0x2d2, 0x61, 0xda, 0xa7, 0x312, 0x2f4, 0xe7, 0x93, 0x348, 0x158, 0x8d, 0x119, 0x393, 0x160, 0x25a, 0x39b, 0x191, 0x69, 0x2b, 0x294, 0xa2, 0x1f1, 0x2c, 0x149, 0x1f0, 0xb3, 0x8c, 0x186, 0x256, 0x116, 0xbf, 0x201, 0xa8, 0x3e, 0x195, 0x215, 0x336, 0x34c, 0x324, 0x390, 0xc1, 0x15, 0x301, 0x2b7, 0x2c7, 0x360, 0x26d, 0x260, 0x72, 0x99, 0x287, 0xe1, 0x3d1, 0x3df, 0x6c, 0x2c8, 0x4c, 0x10c, 0x92, 0x3d7, 0x9d, 0xfb, 0x3fc, 0x209, 0x59, 0x20d, 0x225, 0x110, 0x3fd, 0x296, 0x19c, 0x27b, 0xc0, 0x8a, 0x2c4, 0x2c1, 0x22, 0x2fa, 0x354, 0x237, 0x1cc, 0x18, 0x113, 0x25c, 0xd9, 0x106, 0x15d, 0x26e, 0x3c1, 0x23d, 0x3, 0x1a1, 0x24f, 0x9a, 0x326, 0x2ae, 0x34b, 0xf9, 0x2c2, 0x183, 0xb5, 0x13e, 0x31d, 0x3b0, 0x203, 0x32c, 0x2cb, 0x3da, 0x117, 0x40, 0x30b, 0x2f9, 0x1e3, 0x1e0, 0x2a2, 0x38c, 0x355, 0x159, 0x24, 0x370, 0x317, 0x2e, 0xee, 0x1fa, 0x2f8, 0xdd, 0x2fd, 0x112, 0x18f, 0x79, 0x392, 0x3fe, 0x267, 0x357, 0x325, 0x217, 0x19, 0x318, 0x27f, 0x171, 0x247, 0xd6, 0x5d, 0xe2, 0xe9, 0x249, 0x3b9, 0x2df, 0xef, 0xc4, 0x1e5, 0x36d, 0xfe, 0x23e, 0x344, 0x3a3, 0x285, 0x3be, 0x16c, 0x1ae, 0x2c6, 0x3f7, 0x2bb, 0x94, 0x12a, 0x28, 0x263, 0x3a6, 0x34a, 0xcc, 0x7, 0x3b3, 0x141, 0x202, 0x212, 0x1d6, 0x6a, 0x314, 0x36c, 0x1c0, 0x123, 0xf4, 0x1a0, 0x1a9, 0x175, 0x2b6, 0xb9, 0x286, 0xfc, 0x42, 0x177, 0xca, 0x28a, 0x1ef, 0xf3, 0x213, 0xe8, 0x377, 0xa4, 0x16f, 0x2ec, 0x3e8, 0x32e, 0xb7, 0x1e9, 0x27e, 0x4f, 0x15a, 0x366, 0x25e, 0x3ce, 0x222, 0x193, 0x2ae, 0x29f, 0x3e4, 0x23d, 0x6, 0x28d, 0x25c, 0x1b2, 0x27c, 0x6f, 0x1bf, 0x78, 0x151, 0x38c, 0x2a3, 0x16d, 0x120, 0x365, 0x238, 0x392, 0x3f5, 0x18e, 0x28e, 0x23c, 0x270, 0x249, 0x37b, 0x36e, 0x371, 0x5b, 0xd7, 0x2c6, 0x3e7, 0x2fe, 0xa9, 0x284, 0x109, 0x1d6, 0xd4, 0x4b, 0x356, 0x3f, 0x21, 0x177, 0x194, 0x23a, 0x363, 0x32b, 0x2f0, 0x27e, 0x9e, 0x161, 0x306, 0x1a1, 0x12e, 0x1b2, 0x22, 0x3fa, 0x125, 0xfb, 0x3eb, 0xd8, 0x26d, 0x192, 0x329, 0x201, 0x2a0, 0x3e0, 0x191, 0x1a4, 0x2b0, 0x61, 0x368, 0x262, 0x139, 0x15c, 0x3d6, 0x8, 0x3c4, 0x378, 0x1e3, 0x3c0, 0x29a, 0x5f, 0x135, 0x37a, 0x112, 0x31e, 0x1e4, 0xaf, 0x397, 0x6b, 0x5d, 0x1c4, 0x3a4, 0x26c, 0x3ee, 0x346, 0x3be, 0x2d8, 0x2b1, 0x21d, 0x307, 0x3dd, 0x141, 0xd, 0x5a, 0x2ab, 0x2a9, 0x258, 0x286, 0x1f8, 0x108, 0x3aa, 0xbb, 0x1f4, 0x32e, 0x16e, 0x3ad, 0x3d4, 0xf9, 0x31a, 0x6, 0x113, 0x162, 0x18b, 0x110, 0x3ef, 0xf1, 0x1bc, 0x1e3, 0x389, 0x27a, 0x2f8, 0x374, 0x383, 0x19, 0x7b, 0x3b1, 0xef, 0x310, 0x26f, 0x2c6, 0x3c7, 0x3ea, 0x141, 0x1a, 0x168, 0x175, 0x2ca, 0x382, 0xe8, 0x1c7, 0x252, 0x366, 0x16a, 0x97, 0x1b2, 0x44, 0x3f3, 0x13a, 0x3ab, 0x187, 0x265, 0xa5, 0x144, 0x32f, 0x22d, 0x313, 0x37c, 0x2, 0x1e2, 0x378, 0x3c6, 0x31b, 0xfd, 0x1f9, 0x2e1, 0x30f, 0x32, 0xf6, 0x36b, 0x1de, 0x229, 0xd7, 0x185, 0x387, 0x3dd, 0x282, 0x34, 0x2d0, 0x2ea, 0x19d, 0x30d, 0x1d0, 0x38e, 0xad, 0x2c5, 0x2d4, 0x12e, 0x364, 0x88, 0x3ef, 0x274, 0x35f, 0x30e, 0xc3, 0x14a, 0x288, 0x257, 0x53, 0x22f, 0x2f1, 0x4, 0x3c4, 0x2f9, 0x385, 0x23f, 0x1fa, 0x3f2, 0x1cb, 0x217, 0x64, 0x1ec, 0x2df, 0x3bc, 0x5b, 0x1ae, 0x30a, 0x307, 0x3b3, 0x10d, 0x68, 0x1a9, 0x1dd, 0x33a, 0x213, 0x3a0, 0x315, 0x15a, 0x183, 0x1a1, 0x25c, 0x2c1, 0x110, 0x3d7, 0xe1, 0x2b7, 0x1e2, 0x2f9, 0x303, 0xee, 0x3cb, 0x357, 0x11e, 0xe9, 0x26c, 0x3a3, 0x5, 0x263, 0x10f, 0x314, 0x356, 0xfc, 0x210, 0x16f, 0x34d, 0x3ce, 0x134, 0x11, 0x3fd, 0x13a, 0x35f, 0x215, 0x30c, 0x242, 0xda, 0x262, 0xed, 0x1ed, 0x55, 0x12, 0x1db, 0x238, 0x253, 0x327, 0x358, 0x3b2, 0x3f8, 0x359, 0x250, 0x101, 0x5a, 0x2be, 0x2ca, 0x30d, 0x3a0, 0x223, 0x161, 0x3, 0x226, 0x302, 0x10c, 0x132, 0x54, 0x1f0, 0x322, 0x13b, 0x2bd, 0xec, 0xf, 0x2ac, 0x311, 0x135, 0x1f3, 0x104, 0x239, 0x3b1, 0x1de, 0x5b, 0x35c, 0x33, 0xe, 0x34e, 0x1e8, 0x236, 0x11d, 0x2cf, 0x16e, 0x2af, 0x137, 0x237, 0xff, 0x36, 0x26d, 0x241, 0x2fc, 0x160, 0x1e1, 0xdf, 0x1, 0x1e2, 0x2f9, 0x303, 0xee, 0x3cb, 0x357, 0x11e, 0xe9, 0x26c, 0x3a3, 0x5, 0x263, 0x10f, 0x314, 0x356, 0xfc, 0x210, 0x16f, 0x34d, 0x3ce, 0x134, 0x11, 0x3fd, 0x13a, 0x35f, 0x215, 0x30c, 0x3c4, 0x3f6, 0x2e, 0x2fb, 0x18e, 0x5d, 0x23b, 0xea, 0x94, 0x284, 0x5a, 0x175, 0x33a, 0x5e, 0x27e, 0xf9, 0xe6, 0x180, 0x2c8, 0x192, 0x17e, 0x160, 0x3c2, 0x37c, 0x8, 0x21f, 0x38f, 0x170, 0x3f5, 0x6b, 0x2e8, 0x1fc, 0x359, 0xa9, 0xd, 0x2d0, 0x3ba, 0x1e6, 0x2f0, 0x3d4, 0x3c1, 0x339, 0x1b, 0x26d, 0x8b, 0x3e2, 0x312, 0x22f, 0x3d6, 0x40, 0xdc, 0x47, 0x392, 0x397, 0x358, 0x36d, 0x3fb, 0x2fe, 0x141, 0x68, 0x2ad, 0x1ef, 0x32b, 0x3ad, 0x29f, 0x237, 0x1fe, 0xd8, 0x34c, 0x51, 0x32f, 0xa6, 0x15c, 0x28f, 0x200, 0x2e9, 0x238, 0xaf, 0x87, 0x2f6, 0x35e, 0x3e7, 0x3dd, 0x21a, 0x340, 0x145, 0x363, 0x16e, 0x157, 0xd5, 0x19c, 0x3eb, 0x2c9, 0x256, 0x288, 0x14e, 0x139, 0x2f2, 0x55, 0x24, 0x365, 0x1e4, 0x171, 0x31, 0x39d, 0x2c6, 0x307, 0x2d7, 0xf4, 0x236, 0x23a, 0x32e, 0x362, 0x2aa, 0x2a1, 0xfb, 0x367, 0x265, 0x294, 0x6d, 0x381, 0x3c3, 0x170, 0x3e3, 0x1ac, 0x36d, 0x3ff, 0x3ea, 0x21a, 0x289, 0x11d, 0x32e, 0x2cd, 0x2ba, 0x125, 0x3ab, 0x23, 0x56, 0xc2, 0x1c3, 0xab, 0x311, 0xdd, 0x30f, 0x190, 0x1f7, 0x206, 0xcf, 0x6a, 0x258, 0x3a, 0x38e, 0x161, 0xc, 0x228, 0x130, 0x25b, 0xb0, 0x3c2, 0x2f1, 0x20, 0xdc, 0x8e, 0x253, 0x87, 0x1e5, 0x163, 0x307, 0x1a7, 0x3d0, 0x194, 0x3e8, 0x111, 0x106, 0x3fd, 0xe1, 0x195, 0x69, 0x2d2, 0x76, 0x1e, 0x14d, 0x2f8, 0x396, 0x138, 0x26c, 0x297, 0x50, 0x1d6, 0x15b, 0x382, 0x349, 0x13c, 0x73, 0x180, 0x199, 0x241, 0x3e2, 0x22d, 0xae, 0x28f, 0x9, 0x3b6, 0x1e4, 0x2e2, 0xc4, 0xd7, 0x33, 0x38, 0x85, 0x2ee, 0x2ec, 0x1e7, 0x268, 0x88, 0x347, 0x1f, 0x2cc, 0x13b, 0x2e6, 0x2db, 0x3c0, 0x1fa, 0x3af, 0x23c, 0x341, 0x10b, 0x254, 0x212, 0x2be, 0x33a, 0xbc, 0x1ea, 0x3c1, 0x27b, 0x6c, 0x34c, 0xa2, 0xa7, 0x139, 0x30b, 0x317, 0x392, 0x247, 0x1e5, 0x2c6, 0x7, 0x123, 0x177, 0x2ec, 0x3ce, 0x1b2, 0x49, 0x15, 0x3e0, 0x24c, 0x9f, 0x378, 0x17, 0x1ff, 0x6b, 0x3b2, 0x3ff, 0x3dd, 0x7a, 0x65, 0x1f4, 0x111, 0x20c, 0x3ef, 0x301, 0x166, 0x13b, 0x1c5, 0x37e, 0x23f, 0x39f, 0x115, 0x23b, 0x3a8, 0x152, 0x68, 0x2a6, 0x2cf, 0x362, 0x2ba, 0x24a, 0x2b7, 0x118, 0x169, 0x76, 0x3c, 0x13d, 0x3ed, 0x11e, 0x341, 0x216, 0x142, 0xb4, 0x3ba, 0x391, 0x353, 0xd5, 0x279, 0x2c7, 0x30c, 0x234, 0x2e5, 0xab, 0x22b, 0x374, 0x4e, 0x136, 0x297, 0xa0, 0x351, 0x2ca, 0x5e, 0x1ea, 0x38b, 0x1fe, 0x360, 0xa5, 0x6d, 0x19a, 0x19f, 0x2a3, 0x1f3, 0x32, 0x37b, 0x103, 0xcf, 0xd4, 0x172, 0x1d0, 0x9e, 0x73, 0x300, 0x26d, 0x22c, 0x257, 0x139, 0x3da, 0x159, 0x112, 0x318, 0x2df, 0x3be, 0x3a6, 0x314, 0x286, 0x377, 0x15a, 0x6, 0x228, 0x260, 0x17e, 0x189, 0x57, 0x28f, 0x21f, 0x47, 0xaf, 0x31, 0xd7, 0xcc, 0x380, 0x108, 0x36a, 0x1a1, 0x302, 0xe4, 0x2c, 0x3c2, 0x3d6, 0x200, 0x365, 0x33b, 0xef, 0x2d8, 0x133, 0x356, 0x3db, 0xad, 0x6, 0x59, 0x192, 0x3e2, 0xa6, 0x2f2, 0x2a8, 0x112, 0x239, 0x36e, 0x1cf, 0x21e, 0x258, 0xe8, 0x9e, 0xe6, 0x1b, 0x34c, 0x288, 0x262, 0x2cb, 0x2a3, 0x3e6, 0xc8, 0x3ee, 0x14, 0x1d6, 0x165, 0x5e, 0x3d4, 0x237, 0x3eb, 0x265, 0x8d, 0x376, 0xab, 0x5f, 0x1cb, 0x270, 0x344, 0x254, 0x5a, 0x3ba, 0x32b, 0x157, 0x2a1, 0x3d1, 0x46, 0x2b0, 0x76, 0x78, 0xfd, 0x357, 0x1c4, 0xea, 0xa9, 0x68, 0x145, 0x32e, 0x326, 0x3fa, 0x1c2, 0xb3, 0x13b, 0x38a, 0x1e3, 0x1dc, 0x18e, 0x2e8, 0x3fb, 0x3dd, 0xf4, 0x194, 0x3bb, 0x134, 0x110, 0x20e, 0x3e0, 0x91, 0x27c, 0x3f6, 0x170, 0x397, 0x2f6, 0x2c6, 0xe, 0x85, 0x3aa, 0x293, 0x12e, 0x43, 0xc1, 0x12d, 0x26b, 0x8, 0xdc, 0x37, 0x11c, 0x171, 0x310, 0x2d6, 0x36c, 0x3f0, 0x252, 0x6, 0xb2, 0x241, 0x32f, 0x272, 0x2ef, 0x37a, 0x32, 0x1f7, 0x14, 0x3ac, 0x19d, 0x2f0, 0x137, 0x279, 0x30e, 0xac, 0x3b, 0x78, 0x1fa, 0x147, 0x23b, 0x2bb, 0x10d, 0x236, 0x3e8, 0x9a, 0x110, 0x15, 0x39b, 0x81, 0x381, 0x227, 0xaf, 0x62, 0x35c, 0x269, 0x7e, 0x148, 0x306, 0x114, 0xc9, 0x3e2, 0x14c, 0x3da, 0x16d, 0x104, 0x3b9, 0x206, 0x271, 0x2b6, 0x5e, 0x3a1, 0xce, 0x367, 0x211, 0x184, 0xf, 0x13d, 0x3af, 0x1c4, 0x1d4, 0x2a4, 0x340, 0x7d, 0x111, 0x22, 0x287, 0x1f0, 0x91, 0xf1, 0x3c3, 0x392, 0x10e, 0x26f, 0xcc, 0x309, 0x29, 0x366, 0x226, 0x98, 0x17e, 0x22d, 0x179, 0x2a8, 0x224, 0xf6, 0x346, 0xcf, 0x350, 0x30d, 0xf5, 0x31f, 0x3eb, 0xc3, 0x234, 0x386, 0x2a2, 0x3f2, 0x23c, 0x23e, 0x250, 0x68, 0x28a, 0xa3, 0x106, 0x3d7, 0x3e, 0x93, 0x9f, 0x1fb, 0x170, 0x6e, 0x79, 0x39a, 0x16c, 0x266, 0x286, 0x38e, 0x23d, 0x1b, 0x12b, 0xda, 0x196, 0x22b, 0x396, 0x3a4, 0x4a, 0x1a, 0x145, 0xa3, 0x20c, 0x347, 0x1f0, 0x122, 0x3c4, 0x227, 0x15e, 0x188, 0x2d6, 0x2d1, 0x3db, 0x2b4, 0x60, 0x26d, 0x144, 0xcd, 0x275, 0xdd, 0x9c, 0x344, 0x142, 0x1a9, 0x363, 0x193, 0x3fd, 0x20b, 0x24d, 0x9f, 0x3f6, 0x1c9, 0x10e, 0xd7, 0x330, 0x7e, 0x290, 0x3, 0xb2, 0x8b, 0xa7, 0x3b4, 0x2a3, 0x383, 0x9b, 0x24e, 0x2d, 0x37d, 0x16e, 0x2ba, 0x274, 0xb3, 0xe5, 0xde, 0x2e, 0x3cf, 0x1e5, 0x21d, 0x1c0, 0x210, 0x366, 0x45, 0x260, 0x3e2, 0x298, 0x373, 0x37a, 0x64, 0x3d5, 0xa0, 0x2be, 0x3cc, 0x157, 0x296, 0x167, 0x1a4, 0x1c5, 0x3c6, 0x2fb, 0x1ac, 0x2b5, 0xe, 0x214, 0x2de, 0x1a1, 0x13, 0x25b, 0x312, 0x179, 0x159, 0x82, 0x3b9, 0x5, 0x1d6, 0x19d, 0x1e9, 0xd5, 0x3ec, 0x8c, 0x1ad, 0x2db, 0x77, 0x18e, 0xdc, 0x1e4, 0xef, 0x2ed, 0x4b, 0xe8, 0xf9, 0x1fe, 0x265, 0x61, 0xf, 0xfd, 0x28e, 0x1fc, 0x3dd, 0x3a9, 0x1d1, 0x12e, 0x218, 0x2c, 0x22f, 0x55, 0x112, 0x1ec, 0x206, 0x1d6, 0x33a, 0x3ad, 0x2a1, 0x2b7, 0x1a4, 0x38a, 0x303, 0x3f5, 0x2f6, 0x21d, 0x380, 0x52, 0x306, 0x59, 0x8b, 0x14e, 0x2cb, 0x135, 0x4e, 0x344, 0x284, 0x2ad, 0x32e, 0x106, 0x347, 0x3e0, 0x81, 0x21f, 0x238, 0x39a, 0x2d8, 0x18a, 0x1d, 0x9e, 0x339, 0x2c9, 0x8d, 0x386, 0x29a, 0x357, 0x23b, 0x2fe, 0xf4, 0xbb, 0x323, 0x43, 0x201, 0x3c2, 0x28f, 0x120, 0x239, 0x346, 0x33c, 0x165, 0x2f0, 0xd5, 0x3d1, 0x230, 0x173, 0x1e3, 0x2fb, 0x358, 0x2c6, 0x70, 0x108, 0x366, 0x8a, 0x192, 0x32f, 0x1da, 0x2a3, 0x30f, 0x26c, 0x254, 0x2d0, 0x363, 0x326, 0x3ef, 0x7c, 0x91, 0x3c4, 0x47, 0x171, 0x5b, 0x133, 0x286, 0x315, 0xe6, 0xd8, 0x294, 0x376, 0x151, 0x3ed, 0x1c4, 0x1b8, 0x399, 0x371, 0x283, 0x172, 0x27e, 0x67, 0x187, 0x2b0, 0x369, 0xee, 0x6b, 0x2b5, 0x38, 0x108, 0x2c5, 0x228, 0x8b, 0x29c, 0x33e, 0x1ba, 0xe9, 0x4a, 0x68, 0x7d, 0x9a, 0x92, 0x149, 0x1be, 0x200, 0x235, 0x1b7, 0x263, 0x15b, 0x178, 0xd5, 0x3ab, 0xd2, 0x38a, 0x20f, 0x3cf, 0x39d, 0x198, 0xfc, 0xad, 0x60, 0x1a6, 0x6d, 0x32c, 0x17c, 0x23c, 0x1d4, 0x10d, 0x194, 0x3ce, 0x225, 0x201, 0x38d, 0x22e, 0x112, 0x3d8, 0xa, 0x2ab, 0x3cc, 0x155, 0x13a, 0x166, 0x321, 0x3f6, 0x32d, 0xc4, 0x1a5, 0x2a5, 0x38e, 0xe6, 0x1b0, 0x242, 0x386, 0x13d, 0x147, 0x1fc, 0x3b3, 0x2bf, 0x293, 0x2c4, 0x390, 0x312, 0x1ed, 0x1bd, 0xc8, 0x297, 0x2d, 0x1ef, 0x2cd, 0x3f3, 0x7c, 0x122, 0x30b, 0x238, 0x33d, 0x372, 0x4b, 0x1d0, 0x3e4, 0x3eb, 0x211, 0x3b, 0x3c0, 0x267, 0x3b2, 0x307, 0x10a, 0x1b5, 0x113, 0x260, 0x393, 0x1da, 0x14f, 0x27, 0x344, 0x370, 0x27f, 0x3be, 0x6a, 0x213, 0x29f, 0x3ec, 0x69, 0x38a, 0x17, 0x327, 0xd7, 0x1b6, 0x3bf, 0x31a, 0x6c, 0x121, 0x386, 0x27a, 0x115, 0x3fb, 0x34e, 0x35d, 0x1a1, 0x98, 0x3cd, 0x1da, 0x29e, 0x9c, 0x216, 0x34, 0x7d, 0x134, 0x248, 0x25a, 0x3d6, 0x90, 0x7b, 0x206, 0x351, 0x3cc, 0x2aa, 0xe1, 0x322, 0x27c, 0x227, 0x2e2, 0x2d8, 0x221, 0x1d0, 0x3c1, 0x3b7, 0xac, 0x3b0, 0xee, 0xd6, 0x2c6, 0x1c0, 0xa4, 0x6, 0x332, 0x119, 0x196, 0x17c, 0x71, 0x359, 0x7a, 0x176, 0x12e, 0x72, 0x2c0, 0x2f2, 0x1bd, 0x190, 0x24e, 0x168, 0x2cf, 0x106, 0x107, 0x277, 0x8, 0x3b6, 0x3dc, 0x1cf, 0x350, 0xbc, 0xd5, 0x35f, 0x348, 0x6f, 0xb8, 0x10e, 0x2b1, 0x1ab, 0x1c7, 0xe6, 0x360, 0x11a, 0xf, 0x3f4, 0xba, 0x3e7, 0x246, 0x2de, 0x113, 0xc9, 0x257, 0x2cb, 0xdd, 0xe9, 0x94, 0x1a0, 0x3e8, 0x1b2, 0x264, 0x2f4, 0x28f, 0x89, 0x3d8, 0x14, 0x2e9, 0x1ee, 0x1cf, 0x2a9, 0x2f0, 0x2a1, 0x195, 0x1ca, 0x3f6, 0xaf, 0x5b, 0x18a, 0xe8, 0x3c1, 0x367, 0x2b0, 0x1bf, 0x2fb, 0x2f6, 0xcc, 0x1f8, 0x161, 0x1b, 0x294, 0x386, 0xfd, 0x5d, 0x3e7, 0x85, 0x36a, 0x8a, 0x8b, 0x262, 0x38c, 0x243, 0xea, 0x21a, 0xbb, 0x12e, 0xe4, 0x312, 0x3bd, 0x3e6, 0x26c, 0x284, 0x145, 0x222, 0x92, 0x12d, 0x3d6, 0x120, 0x1ec, 0x14, 0x175, 0x16e, 0x3fa, 0x7c, 0x81, 0xdc, 0x33b, 0x3be, 0xd4, 0x5e, 0xd5, 0x2b7, 0x13b, 0x378, 0x392, 0x188, 0x133, 0x1d, 0xf9, 0x3eb, 0x56, 0x3b0, 0x1dc, 0x358, 0x21d, 0x3f, 0xad, 0x180, 0x256, 0x376, 0x29a, 0x28e, 0x3fb, 0x295, 0x16f, 0x113, 0x192, 0x14e, 0x275, 0x1cb, 0x11f, 0x141, 0x194, 0x323, 0x218, 0x160, 0x2f2, 0x37a, 0x249, 0x254, 0x2ad, 0x146, 0x110, 0x2a0, 0x37c, 0x24, 0x239, 0x206, 0x2ab, 0x32b, 0x17d, 0x20b, 0x91, 0x21f, 0x1e4, 0x371, 0x21e, 0x1db, 0x3b1, 0x263, 0x2ca, 0x2af, 0x13a, 0x322, 0x1e2, 0x238, 0x1de, 0x10f, 0x30d, 0x137, 0x35f, 0x13b, 0x2f9, 0x253, 0x5b, 0x314, 0x3a0, 0x237, 0x215, 0x2bd, 0x303, 0x327, 0x35c, 0x356, 0x223, 0xff, 0x30c, 0xec, 0xee, 0x358, 0x33, 0xfc, 0x161, 0x36, 0x242, 0xf, 0x3cb, 0x3b2, 0xe, 0x210, 0x3, 0x26d, 0xda, 0x2ac, 0x357, 0x3f8, 0x34e, 0x16f, 0x226, 0x241, 0x262, 0x311, 0x11e, 0x359, 0x1e8, 0x34d, 0x302, 0x2fc, 0xed, 0x135, 0xe9, 0x250, 0x236, 0x3ce, 0x10c, 0x160, 0x1ed, 0x1f3, 0x26c, 0x101, 0x11d, 0x134, 0x132, 0x1e1, 0x55, 0x104, 0x3a3, 0x5a, 0x2cf, 0x11, 0x54, 0xdf, 0x12, 0x239, 0x5, 0x2be, 0x16e, 0x3fd, 0x1f0, 0x1, 0x1db, 0x3b1, 0x263, 0x2ca, 0x2af, 0x13a, 0x322, 0x1e2, 0x238, 0x1de, 0x10f, 0x30d, 0x137, 0x35f, 0x13b, 0x2f9, 0x253, 0x5b, 0x314, 0x3a0, 0x237, 0x215, 0x2bd, 0x303, 0x327, 0x35c, 0x356, 0x3b6, 0x2df, 0x33c, 0xf3, 0x15d, 0x20b, 0x244, 0x1b8, 0x1ee, 0x335, 0x2ca, 0x157, 0xe1, 0x126, 0x21f, 0x399, 0x375, 0x2a9, 0x3d2, 0x24a, 0x191, 0x1e2, 0x79, 0x371, 0x6a, 0xbc, 0x2a1, 0x25d, 0x9f, 0x47, 0x273, 0x283, 0x30d, 0x26e, 0x167, 0x1ca, 0x3c3, 0x2e2, 0x2ed, 0x172, 0x3a1, 0x3d1, 0x299, 0x2f9, 0xaf, 0x16c, 0x96, 0x27e, 0x279, 0x69, 0x6f, 0x1c9, 0x310, 0x18a, 0x3a0, 0x67, 0x46, 0x1c5, 0x5c, 0x31, 0x29d, 0x3a, 0x3c1, 0x187, 0x35a, 0x303, 0x247, 0x16b, 0x286, 0x278, 0x3df, 0x2b0, 0x2f5, 0x3e3, 0xd7, 0x1ab, 0x223, 0x1fe, 0x2b, 0x369, 0x2fb, 0x3ca, 0xdb, 0x2e7, 0x398, 0xc3, 0x76, 0xee, 0x2b9, 0xcc, 0x3e9, 0x23d, 0x2c9, 0x184, 0x389, 0x6b, 0x30a, 0x7e, 0x161, 0x6c, 0x11a, 0x78, 0xc7, 0x2b5, 0x380, 0x252, 0x300, 0x294, 0x203, 0x3cb, 0x36d, 0x38, 0xa4, 0x30, 0x12b, 0x2e5, 0xfd, 0x174, 0x207, 0x108, 0x365, 0x36e, 0x1d6, 0x32b, 0x3fa, 0x3e0, 0x8, 0x31e, 0x346, 0x2ab, 0x16e, 0x3ef, 0x33f, 0x40, 0xc6, 0x206, 0x175, 0x362, 0x347, 0x1ce, 0x200, 0x239, 0x14, 0x3ba, 0x326, 0x20e, 0x26b, 0x24, 0x1ec, 0xa0, 0x1ef, 0x106, 0x54, 0x37c, 0x120, 0x37b, 0x109, 0x363, 0x22, 0x2a0, 0x3d6, 0x112, 0x3ee, 0x5a, 0x32e, 0x110, 0x12d, 0x28f, 0x82, 0x34f, 0x2d0, 0x146, 0x92, 0x17a, 0x55, 0x19, 0x24e, 0x2ad, 0x222, 0x99, 0x3c2, 0x2a8, 0xc8, 0x254, 0x145, 0x134, 0xc1, 0x22f, 0x16d, 0x249, 0x284, 0x23a, 0x1b2, 0x201, 0x15c, 0x37a, 0x26c, 0xd, 0x1f4, 0x18b, 0x2c, 0x2f2, 0x3e6, 0x344, 0x68, 0x3bb, 0x43, 0x160, 0x3bd, 0x30f, 0x216, 0x340, 0x1e7, 0x218, 0x312, 0x1d7, 0x4e, 0x94, 0x236, 0x323, 0xe4, 0xa6, 0x2a3, 0x270, 0xa9, 0x194, 0x12e, 0x329, 0x139, 0x135, 0x3a4, 0x141, 0xbb, 0x162, 0x17e, 0x1da, 0x1ba, 0x11f, 0x21a, 0x1d1, 0x2c3, 0x1a3, 0x2ab, 0x2dc, 0x3a7, 0x1ce, 0x9, 0xf6, 0xa0, 0x3de, 0x11, 0x2a0, 0x3a5, 0x41, 0x34f, 0x1a9, 0x111, 0x99, 0x38d, 0x2b2, 0x249, 0x101, 0xfa, 0x18b, 0x58, 0x3da, 0x30f, 0x25, 0x11b, 0x323, 0x1c8, 0x298, 0x135, 0x341, 0x10d, 0x1d1, 0x20d, 0x393, 0x275, 0x8f, 0x17f, 0x177, 0x342, 0x241, 0x334, 0x1f9, 0xfe, 0x295, 0x2dd, 0x164, 0x6d, 0x2a2, 0x22a, 0x307, 0x210, 0x18, 0x256, 0x305, 0x39f, 0x35e, 0x309, 0x2b4, 0xd8, 0xc2, 0x31b, 0x358, 0x198, 0x377, 0x339, 0x211, 0x2db, 0x3f5, 0x1ae, 0x143, 0xf9, 0x2c7, 0x2bd, 0x2e, 0x62, 0xc5, 0x349, 0x338, 0xd2, 0x378, 0x15e, 0x372, 0x2e4, 0x137, 0x2ce, 0x24b, 0x8e, 0x3bc, 0xd4, 0x1e9, 0x9d, 0x93, 0x37, 0xf7, 0x263, 0x27d, 0x2ba, 0x7c, 0x2, 0x18f, 0x346, 0x15f, 0x1b1, 0x347, 0x39c, 0x12, 0x1ec, 0x140, 0x3b5, 0x22, 0x149, 0x343, 0x82, 0x297, 0x352, 0x222, 0x18f, 0x285, 0x175, 0x193, 0x15, 0x37c, 0x89, 0x3d5, 0x2d0, 0x111, 0x132, 0x22f, 0x1bd, 0xd1, 0x68, 0x2f7, 0x39, 0xa6, 0x29e, 0x341, 0x21a, 0x34d, 0x4c, 0x14e, 0x22b, 0x388, 0x2d7, 0x1b5, 0xb2, 0x6d, 0x14d, 0xba, 0xe, 0x148, 0x300, 0x8d, 0x1e0, 0xd6, 0xcc, 0x377, 0x27b, 0x56, 0x2f5, 0x327, 0x1a5, 0x74, 0x67, 0x230, 0x1bc, 0x15e, 0x2ed, 0x382, 0x1aa, 0xb3, 0x1e2, 0x3c8, 0x1cf, 0x19d, 0x15d, 0x7c, 0x4, 0x235, 0x206, 0x1dd, 0x245, 0x54, 0x1eb, 0x224, 0x34f, 0x352, 0x4d, 0xc1, 0xae, 0x2fd, 0x344, 0x1a0, 0x3ce, 0xe4, 0x298, 0x26a, 0x11f, 0x7a, 0x12f, 0x130, 0x131, 0xbe, 0x23b, 0x34e, 0x2dd, 0x2c8, 0x1b4, 0x13d, 0x2e8, 0x38, 0x129, 0x1b, 0x234, 0x389, 0x358, 0x330, 0x1c7, 0x1fe, 0x158, 0x3c6, 0x87, 0x29d, 0x1d0, 0x19c, 0xd2, 0x2f9, 0x171, 0x3a6, 0x213, 0x2a1, 0x2cc, 0x381, 0x33b, 0x335, 0x27d, 0x17d, 0x31e, 0x206, 0x3ba, 0x106, 0x2a0, 0x28f, 0x19, 0x254, 0x23a, 0x18b, 0x160, 0x1d7, 0x270, 0x141, 0x1d1, 0x26, 0x14e, 0x5f, 0x23b, 0x295, 0x366, 0x26d, 0x376, 0x3e1, 0x35e, 0x3f, 0x31a, 0x265, 0x3b0, 0x3f5, 0x2b1, 0x1d, 0x237, 0x230, 0x378, 0x171, 0x345, 0x5e, 0x125, 0x93, 0xdc, 0x36b, 0x1d6, 0x16e, 0x347, 0x26b, 0x120, 0x3ee, 0x2d0, 0x222, 0xc1, 0x15c, 0x3e6, 0x216, 0x236, 0x12e, 0x17e, 0x2cb, 0x243, 0x2fe, 0x3aa, 0x8a, 0x288, 0x151, 0x5d, 0xe, 0x290, 0x1b, 0x61, 0x23f, 0x2f6, 0x36c, 0x9e, 0x367, 0x173, 0x170, 0x5b, 0x258, 0x29f, 0x195, 0x27c, 0x1e4, 0x1cf, 0x33a, 0x17d, 0x3e0, 0x40, 0x239, 0xa0, 0x363, 0x110, 0x17a, 0x2a8, 0x249, 0xd, 0x3bb, 0x218, 0xa6, 0x135, 0x11f, 0xf4, 0xb5, 0x192, 0x334, 0x3ed, 0x3fb, 0x21, 0x6, 0x256, 0xf, 0x18e, 0x21d, 0x3db, 0x339, 0x56, 0x1e3, 0x87, 0x133, 0x349, 0xfb, 0x235, 0xa, 0x1ef, 0x44, 0xbd, 0x2a8, 0x9b, 0x34, 0x1e7, 0x1c8, 0xed, 0x1cb, 0x2bb, 0x1d5, 0x8a, 0x119, 0x14d, 0x2e8, 0xe0, 0x2b4, 0x2c9, 0xec, 0x3fe, 0x2b1, 0x3a, 0xce, 0x1a4, 0x3e5, 0x273, 0xd4, 0x353, 0x301, 0x1, 0x235, 0xa, 0x1ef, 0x44, 0xbd, 0x2a8, 0x9b, 0x34, 0x1e7, 0x1c8, 0xed, 0x1cb, 0x2bb, 0x1d5, 0x8a, 0x119, 0x14d, 0x2e8, 0xe0, 0x2b4, 0x2c9, 0xec, 0x3fe, 0x2b1, 0x3a, 0xce, 0x1a4, 0x3e5, 0x273, 0xd4, 0x353, 0x301, 0x1, 0x235, 0xa, 0x1ef, 0x44, 0xbd, 0x2a8, 0x9b, 0x34, 0x1e7, 0x1c8, 0xed, 0x1cb, 0x2bb, 0x1d5, 0x8a, 0x119, 0x14d, 0x2e8, 0xe0, 0x2b4, 0x2c9, 0xec, 0x3fe, 0x2b1, 0x3a, 0xce, 0x1a4, 0x3e5, 0x273, 0xd4, 0x353, 0x301, 0x1, 0x235, 0xa, 0x1ef, 0x44, 0xbd, 0x2a8, 0x9b, 0x34, 0x1e7, 0x1c8, 0xed, 0x1cb, 0x2bb, 0x1d5, 0x8a, 0x119, 0x14d, 0x2e8, 0xe0, 0x2b4, 0x2c9, 0x63, 0x28, 0x363, 0x49, 0x38d, 0x37a, 0x10b, 0x65, 0x162, 0x393, 0x311, 0x23b, 0x246, 0x205, 0x256, 0x3c, 0xd6, 0x269, 0x4f, 0x2c7, 0x38a, 0x253, 0x1d3, 0x5e, 0x9d, 0x122, 0x365, 0x103, 0x37d, 0x22, 0xbd, 0x159, 0x26c, 0x1a0, 0x24f, 0x17e, 0x33e, 0x71, 0x2d7, 0x1b3, 0xd3, 0x386, 0xc7, 0x33, 0x2e7, 0x3f1, 0x35a, 0x170, 0x16c, 0x1c1, 0x2a1, 0x24d, 0x1b8, 0x36e, 0x2be, 0x245, 0x2a0, 0x22e, 0x190, 0xd, 0x2f7, 0x1c8, 0x1da, 0x325, 0x1f5, 0x16f, 0x164, 0x2d9, 0x3e1, 0x163, 0x3f0, 0x339, 0x158, 0x20f, 0x188, 0x12c, 0x137, 0xb3, 0x30b, 0x3dc, 0x1d6, 0x1b1, 0x15, 0x3d6, 0x208, 0xa1, 0x1f4, 0x10c, 0x14c, 0x1ba, 0x3a8, 0x2ee, 0x8a, 0x232, 0x13d, 0x36d, 0x21b, 0x23d, 0x30c, 0x2f5, 0x10e, 0x18a, 0x1ea, 0x167, 0x27c, 0x399, 0xcf, 0x32b, 0x3a7, 0xdf, 0x112, 0x127, 0x28a, 0x18b, 0x189, 0x14f, 0x11f, 0x3d0, 0x342, 0x51, 0xc6, 0xa0, 0x32e, 0x99, 0x15c, 0x30f, 0xa9, 0x1d1, 0x130, 0x334, 0x357, 0x307, 0x290, 0xd8, 0x76, 0x3f5, 0x1a5, 0x349, 0x3d1, 0x24b, 0x1e4, 0x263, 0x32b, 0x347, 0x37c, 0x82, 0x254, 0x1f4, 0x218, 0x139, 0x1cb, 0x2fe, 0x16f, 0x2c8, 0x376, 0x337, 0x21d, 0x2e7, 0x3eb, 0x173, 0x392, 0x2ed, 0x5e, 0x13a, 0x81, 0x31e, 0x14, 0x363, 0x92, 0x22f, 0x3e6, 0x94, 0xbb, 0x26, 0x262, 0x3ed, 0x3e7, 0x52, 0x1b, 0x308, 0x2fb, 0x2b1, 0xe8, 0xfb, 0x1ca, 0x238, 0x1cf, 0x1e6, 0x3ef, 0x26b, 0x112, 0x24e, 0x23a, 0x43, 0xa6, 0x1ba, 0x359, 0x3aa, 0x59, 0x368, 0x3e1, 0x2c6, 0x3db, 0x1fe, 0x1ad, 0x170, 0x2d8, 0x30d, 0x125, 0x91, 0x365, 0x206, 0x1ef, 0x110, 0x3c2, 0x37a, 0x216, 0x194, 0x302, 0x14e, 0x2f8, 0x3fb, 0x108, 0x180, 0x61, 0x1dc, 0xd7, 0x1d, 0x19c, 0x13b, 0x47, 0x3be, 0x33a, 0x3fa, 0x1ce, 0x120, 0x34f, 0x145, 0x18b, 0x312, 0x18c, 0x280, 0x146, 0x182, 0x3da, 0x270, 0x3d, 0x2d4, 0x51, 0x2a2, 0x3b2, 0x3f, 0x1cc, 0x158, 0x2e, 0xb6, 0x382, 0x125, 0x122, 0x18f, 0x14, 0x2cf, 0x248, 0x15c, 0x217, 0x2a4, 0x293, 0x324, 0x251, 0x5d, 0xe0, 0x18d, 0x30c, 0x3c6, 0xc4, 0x258, 0x1aa, 0x24d, 0x2e9, 0x285, 0x2f3, 0x110, 0x38d, 0x1f3, 0x94, 0x176, 0x98, 0x334, 0x2a7, 0x7, 0xad, 0x19b, 0x2db, 0x87, 0x314, 0x34b, 0xb3, 0x37, 0x1b7, 0x175, 0x20c, 0xbd, 0x16d, 0x281, 0xca, 0x302, 0x29c, 0x3f2, 0x3e7, 0xa4, 0x6c, 0x76, 0x3e3, 0x29d, 0x27e, 0x167, 0x1e2, 0x1ee, 0x3ac, 0x193, 0x2a0, 0xaa, 0x136, 0x340, 0x25c, 0x393, 0x5f, 0x3f8, 0x84, 0x180, 0xc2, 0x379, 0x2b1, 0x1d0, 0x3ec, 0x24b, 0x3c8, 0x19e, 0x16e, 0x15, 0x343, 0xc8, 0x1a, 0x395, 0x17e, 0xe3, 0x319, 0x85, 0xc, 0x242, 0x23f, 0x333, 0x20a, 0x19c, 0x276, 0x11c, 0x1cf, 0x3cc, 0x3a7, 0x37c, 0x318, 0x212, 0x222, 0x16, 0x3ae, 0x11f, 0x2bf, 0x114, 0x368, 0x39f, 0x33, 0x315, 0x187, 0xde, 0x39a, 0x350, 0x15d, 0x33f, 0x90, 0x297, 0x23a, 0x10c, 0x272, 0x243, 0x36f, 0x2c5, 0x256, 0x1e0, 0x1e5, 0x286, 0xce, 0x276, 0x238, 0x335, 0x25f, 0x20e, 0x343, 0x190, 0x68, 0x97, 0x3cd, 0x5f, 0x3f9, 0x210, 0x1b, 0x3b, 0x3e3, 0x133, 0x1ea, 0x32a, 0x21f, 0x1b7, 0x2ea, 0x22, 0x1e1, 0x2fd, 0x94, 0x2ec, 0x260, 0x196, 0x22a, 0xe0, 0x31a, 0x2b, 0x20f, 0x5b, 0x382, 0x24a, 0x81, 0x63, 0x140, 0x146, 0x304, 0x373, 0x3a4, 0x3d0, 0x226, 0x6d, 0x3f4, 0x185, 0x2e7, 0x3b7, 0x31d, 0x171, 0x6a, 0x2ae, 0x3e0, 0x12, 0x3d5, 0x145, 0x225, 0x14c, 0x1cb, 0x3ea, 0x2dd, 0x34c, 0x3c, 0x2b9, 0x356, 0x31f, 0x348, 0x47, 0x2e3, 0x3cc, 0x347, 0x1eb, 0x32, 0xd, 0x395, 0x2fc, 0x38c, 0xfe, 0x42, 0x180, 0x184, 0x1ff, 0x1a5, 0x13f, 0x167, 0x3c4, 0x239, 0x5a, 0x134, 0x160, 0x135, 0x359, 0x16f, 0x26d, 0xf, 0x358, 0x356, 0x237, 0x13b, 0x238, 0x263, 0x16e, 0x54, 0x55, 0x26c, 0x236, 0x302, 0x262, 0x357, 0xe, 0x161, 0x30c, 0x303, 0x5b, 0x30d, 0x13a, 0x1, 0x239, 0x5a, 0x134, 0x160, 0x135, 0x359, 0x16f, 0x26d, 0xf, 0x358, 0x356, 0x237, 0x13b, 0x238, 0x263, 0x16e, 0x54, 0x55, 0x26c, 0x236, 0x302, 0x262, 0x357, 0xe, 0x161, 0x30c, 0x303, 0x5b, 0x30d, 0x13a, 0x1, 0x239, 0x5a, 0x134, 0x160, 0x135, 0x359, 0x16f, 0x26d, 0xf, 0x358, 0x356, 0x237, 0x13b, 0x238, 0x263, 0x16e, 0x54, 0x55, 0x26c, 0x236, 0x302, 0x262, 0x357, 0xe, 0x161, 0x30c, 0x303, 0x5b, 0x30d, 0x13a, 0x1, 0x239, 0x5a, 0x134, 0x160, 0x135, 0x359, 0x16f, 0x26d, 0xf, 0x358, 0x356, 0x237, 0x13b, 0x238, 0x263, 0x16e, 0x54, 0x55, 0x26c, 0x236, 0x302, 0x262, 0x357, 0xe, 0x161, 0x30c, 0x303, 0x7b, 0x168, 0x1b2, 0x22d, 0x2e1, 0x3dd, 0x2c5, 0x14a, 0x23f, 0x1ae, 0x3a0, 0x2b7, 0x381, 0x1b7, 0x3ba, 0x220, 0xae, 0x4e, 0x3d, 0x28d, 0x6d, 0x3cb, 0x66, 0x9e, 0x8c, 0x3c3, 0x3be, 0x3cc, 0x107, 0x28f, 0x9b, 0x11b, 0x302, 0xcd, 0x147, 0x70, 0x23d, 0x158, 0x170, 0x1d3, 0x3d2, 0x7c, 0x9, 0x3a3, 0x23a, 0x39, 0x361, 0x1c4, 0x10a, 0xc0, 0x308, 0x3e3, 0xc5, 0x29f, 0x322, 0x3b6, 0x14, 0x255, 0x304, 0x1d7, 0x23e, 0x1d5, 0x2c8, 0x305, 0x1ac, 0x356, 0x67, 0xe5, 0x1e4, 0x271, 0x193, 0x12d, 0x2da, 0x4a, 0x1d1, 0x324, 0x2ac, 0x36d, 0x3f0, 0x3f1, 0x38a, 0x2e2, 0x350, 0x17d, 0x39c, 0x41, 0x284, 0x3ce, 0x1f1, 0x5f, 0x3ff, 0x148, 0x2c9, 0x37e, 0xc4, 0x2e4, 0x24a, 0x204, 0x239, 0xb4, 0xd9, 0x312, 0x374, 0x3ea, 0x366, 0xa5, 0x31b, 0xd7, 0x1d0, 0x35f, 0x3c4, 0x2df, 0x1dd, 0x110, 0x57, 0x27, 0x21a, 0x342, 0x232, 0x3e1, 0xf6, 0x1a9, 0x18b, 0x298, 0x8f, 0x295, 0x18, 0xc2, 0x3f5, 0xc5, 0x137, 0x93, 0x18f, 0x140, 0x222, 0xb0, 0x26a, 0x2fe, 0x1b3, 0xa5, 0x23f, 0x35c, 0x29b, 0x195, 0x6e, 0x285, 0x363, 0x264, 0x373, 0x11f, 0x1d5, 0x199, 0xf, 0x17b, 0x105, 0xfb, 0x13e, 0x3dc, 0x175, 0x88, 0x57, 0x4e, 0x7a, 0x226, 0x368, 0xc7, 0xdb, 0x3c1, 0x299, 0x79, 0x33c, 0x193, 0x25a, 0x37a, 0x250, 0x12f, 0x51, 0x27a, 0x185, 0x315, 0x23, 0x3e5, 0x3be, 0x391, 0x15, 0x55, 0x1a2, 0x328, 0x130, 0x251, 0x1d9, 0x1f8, 0x3f1, 0x31d, 0x39a, 0x2b6, 0x3fd, 0x37c, 0x64, 0xd0, 0x162, 0x131, 0x2a7, 0x70, 0x73, 0x169, 0x392, 0x10f, 0x2ae, 0x33f, 0x89, 0xa1, 0x1e7, 0x1f1, 0xbe, 0x3e7, 0x252, 0xc3, 0x303, 0x16c, 0xbc, 0x20b, 0x100, 0x3d5, 0x23a, 0x72, 0x19f, 0x23b, 0x84, 0x36, 0x3b0, 0x21c, 0xb9, 0x125, 0x204, 0x7b, 0x2d0, 0x2c1, 0x14c, 0x243, 0x1ec, 0x2ad, 0x43, 0x1da, 0x1c4, 0x21, 0x1b, 0x3b0, 0x31, 0x2e4, 0x13a, 0x8, 0x37b, 0x145, 0x218, 0x2cb, 0x23b, 0x108, 0xd8, 0x1bf, 0x188, 0x30d, 0x1c2, 0x40, 0x3ee, 0x23a, 0xe4, 0x275, 0x1fc, 0x52, 0x2c9, 0x1e3, 0x5b, 0x5e, 0x20b, 0x200, 0x34f, 0x1f4, 0x329, 0x38c, 0x3fb, 0x290, 0x265, 0x303, 0x2d8, 0x2f0, 0x7c, 0x24, 0x24e, 0x3bb, 0x17e, 0x5f, 0x3e7, 0xad, 0x30c, 0x2e, 0x2ed, 0x3ad, 0x3e0, 0x120, 0x254, 0x1e7, 0x3e2, 0x2f8, 0x307, 0x161, 0x56, 0x170, 0x345, 0x157, 0x33f, 0x112, 0x284, 0x323, 0x32f, 0x3ed, 0xe, 0x31a, 0x2b0, 0x392, 0x21e, 0x2aa, 0x1ce, 0x82, 0xd, 0x12e, 0x14e, 0x357, 0x70, 0xe6, 0x1ad, 0xaf, 0xd4, 0x17d, 0x26b, 0x19, 0x68, 0x162, 0x262, 0x28e, 0x380, 0x339, 0x173, 0x171, 0x2a9, 0x3fa, 0x37c, 0xc8, 0x340, 0x302, 0x334, 0x5d, 0x3f, 0x1fe, 0x38a, 0x39a, 0x165, 0x3ef, 0x3d6, 0x249, 0x3d8, 0x2a6, 0x218, 0x19f, 0xfe, 0x52, 0x19b, 0x385, 0x2d8, 0x1e9, 0x1f0, 0x120, 0xa1, 0x395, 0x32f, 0x3d3, 0x38, 0xe6, 0x35a, 0x2bc, 0x2a9, 0x3fd, 0x1eb, 0x249, 0x65, 0x98, 0xab, 0x2d3, 0x377, 0x30e, 0x3e5, 0x2e3, 0x16e, 0x149, 0x1bd, 0xa9, 0x16a, 0x232, 0x337, 0xdb, 0x31f, 0x1ca, 0x27f, 0x2be, 0x110, 0x2b8, 0x1d2, 0x177, 0x199, 0x3c, 0x39d, 0x1d0, 0x2ce, 0xdc, 0x5, 0xa3, 0x2c, 0x26a, 0x3ea, 0x306, 0x11a, 0x3fe, 0x18a, 0x1aa, 0x244, 0x239, 0x1a9, 0x225, 0x1da, 0x388, 0x84, 0xd8, 0x37e, 0x229, 0x5e, 0x1f, 0x12, 0x24e, 0x37f, 0x1f1, 0x2f8, 0x207, 0x18d, 0x2b0, 0x32d, 0x6a, 0x17d, 0xdf, 0x64, 0x340, 0x20d, 0xcb, 0x2e8, 0x3f0, 0x3b7, 0x378, 0x2eb, 0x391, 0x54, 0x159, 0x4a, 0x293, 0xa2, 0x3f4, 0xcc, 0x1f2, 0x299, 0x1e4, 0x3ac, 0x11, 0x22f, 0x9c, 0x3d0, 0x59, 0x305, 0x17b, 0x1d, 0x3ab, 0x30b, 0x346, 0x3b9, 0x28a, 0xe4, 0x1c6, 0x3ff, 0xad, 0x2b, 0x2e0, 0x21e, 0x2ba, 0xdf, 0xc8, 0x11b, 0x4c, 0xab, 0x1af, 0x1c7, 0x46, 0x227, 0xcf, 0x326, 0x1e1, 0x217, 0xf4, 0x228, 0x305, 0x2f6, 0x74, 0x167, 0xdc, 0xa, 0x28c, 0x160, 0x2e1, 0x1a7, 0x30, 0x3b, 0x10e, 0x2e4, 0xe1, 0x80, 0x34f, 0x3d9, 0x2fc, 0x2f8, 0x7, 0x23d, 0x1ad, 0x2bc, 0x15b, 0x3ef, 0x343, 0xd1, 0xbb, 0x241, 0x13d, 0x21d, 0x278, 0x348, 0x1e4, 0x351, 0x44, 0x15c, 0x1d2, 0x2ee, 0x26d, 0x1e0, 0x1ae, 0x27e, 0x2cc, 0x2c3, 0x109, 0xd9, 0x14c, 0x23c, 0x214, 0x36, 0x1bf, 0x229, 0xbc, 0x7c, 0x90, 0xa1, 0x323, 0xa7, 0x2a7, 0x380, 0xff, 0x31d, 0xef, 0xf3, 0x15, 0x2a8, 0x4a, 0x12f, 0x288, 0x39f, 0xdb, 0x237, 0x321, 0x3dc, 0x3ba, 0x248, 0x373, 0xea, 0x1b5, 0xa5, 0x1dc, 0x29d, 0x137, 0x91, 0x318, 0x1a9, 0x43, 0x361, 0x7f, 0x52, 0x336, 0x20f, 0x2ed, 0x37b, 0x23a, 0x329, 0x5f, 0x307, 0x31a, 0x1ad, 0x171, 0x165, 0x347, 0x55, 0x216, 0x293, 0x288, 0x337, 0x36c, 0x19c, 0x27c, 0x36e, 0x363, 0x201, 0x135, 0x3dd, 0x6, 0x308, 0x87, 0x2e4, 0x1c2, 0x200, 0x24e, 0x1e7, 0x32f, 0x357, 0x380, 0x1fe, 0x6f, 0x371, 0x32b, 0x2a0, 0x37a, 0x141, 0x113, 0x376, 0x358, 0x1d, 0x2b7, 0xdc, 0x14, 0x222, 0x312, 0x243, 0x85, 0x1b, 0x1bf, 0x5b, 0x2f0, 0x3e0, 0x112, 0xd, 0x162, 0x334, 0x2e8, 0x3db, 0x30e, 0x38f, 0x263, 0x326, 0x3c2, 0x4e, 0x3a9, 0x2c8, 0x78, 0xd7, 0x27e, 0x191, 0x31e, 0x5a, 0x18b, 0x1da, 0x23b, 0x52, 0x265, 0x2e, 0x345, 0x2aa, 0x26b, 0xc8, 0x236, 0x130, 0x151, 0x2c6, 0x9e, 0x1a4, 0x1e4, 0x2ab, 0x110, 0x2f2, 0x11f, 0x16f, 0x256, 0x1dc, 0x133, 0xd5, 0x81, 0x1ec, 0x145, 0xe4, 0x38c, 0x3e7, 0x161, 0x2b0, 0xaf, 0x2a9, 0x3ef, 0x28f, 0x344, 0x1d1, 0x51, 0x3e1, 0x269, 0x2ff, 0xfa, 0x17e, 0x1f9, 0x38, 0x339, 0x31d, 0x3bc, 0x32b, 0x149, 0x1f3, 0x21a, 0x114, 0x203, 0x39d, 0x29b, 0x2cc, 0x31e, 0xb4, 0x225, 0x2cb, 0x3f8, 0x252, 0x56, 0x32d, 0x350, 0x3ef, 0x117, 0x10b, 0x293, 0x119, 0xc7, 0x356, 0x1f6, 0x30b, 0x206, 0x28c, 0x189, 0x243, 0x10a, 0x6c, 0x1e3, 0x1b9, 0x2af, 0x1ce, 0x32, 0x11b, 0x130, 0x2a2, 0x30a, 0xf9, 0x276, 0xf7, 0x3ba, 0x132, 0x355, 0x2fe, 0x205, 0x184, 0x87, 0x1c1, 0x301, 0x24, 0xa1, 0x97, 0x262, 0xba, 0x3e9, 0x30e, 0x317, 0x19e, 0x106, 0x57, 0x1d2, 0x3aa, 0x291, 0xee, 0x133, 0x1aa, 0x204, 0x37b, 0x7d, 0xbf, 0x2f8, 0x1c, 0x398, 0x38a, 0x1de, 0x391, 0x2a0, 0x2fd, 0x10d, 0x8a, 0x305, 0x3ca, 0x349, 0x166, 0x18f, 0x5a, 0x316, 0x361, 0x1fc, 0x129, 0x2b, 0x392, 0x1a8, 0x3f3, 0x28f, 0x281, 0x34d, 0x288, 0x267, 0x1ab, 0xfb, 0x381, 0x103, 0x146, 0x2c0, 0x325, 0x85, 0x1f7, 0x3e8, 0x3e2, 0x3af, 0x309, 0x3eb, 0x1fb, 0x39e, 0x326, 0x313, 0xe9, 0x3aa, 0x12b, 0x3b8, 0x18a, 0x296, 0x10, 0x34f, 0x2f7, 0x257, 0x28e, 0xfc, 0x2c7, 0x38f, 0x19e, 0x20c, 0x15c, 0x28b, 0x2de, 0x294, 0x3fe, 0x96, 0x13a, 0x100, 0x95, 0x323, 0x131, 0xba, 0x3db, 0x23, 0x8e, 0x1d6, 0x88, 0x1ed, 0xea, 0x1b3, 0x11a, 0x397, 0x172, 0x384, 0x24, 0x142, 0x25c, 0x334, 0x3b2, 0x1c7, 0x230, 0xf2, 0x15f, 0x92, 0x2ef, 0x2bb, 0x306, 0x184, 0x10e, 0x30d, 0x3e, 0x240, 0xd, 0x181, 0x32c, 0x35e, 0x4f, 0x348, 0x33b, 0x1dd, 0x132, 0x2a3, 0x3ea, 0xc, 0x76, 0xc4, 0xbc, 0x3e0, 0x41, 0xd0, 0x26, 0x2ac, 0x185, 0xf9, 0xe5, 0x3dc, 0x1ef, 0x304, 0x26a, 0x2d7, 0xc0, 0x369, 0x5b, 0x3d2, 0x277, 0x19, 0x11b, 0x260, 0x29a, 0x66, 0x38b, 0x24b, 0x1b7, 0x2cf, 0x2c, 0x2e1, 0x123, 0x1b, 0x2f5, 0x1b9, 0x157, 0x331, 0x190, 0x194, 0x3ee, 0x3bb, 0x32f, 0x28e, 0x1f8, 0x30e, 0x47, 0x1d6, 0x110, 0x3bd, 0x359, 0x306, 0x308, 0x31, 0x5e, 0x3e0, 0x82, 0x340, 0x130, 0x29a, 0xcc, 0x237, 0x27c, 0x346, 0x146, 0x312, 0x23c, 0x108, 0x265, 0x170, 0xd4, 0x3ef, 0x55, 0x94, 0x1a1, 0x376, 0x2f6, 0x349, 0x191, 0xc6, 0x2ad, 0xe4, 0x5f, 0xe, 0x339, 0x6f, 0x3be, 0x362, 0x3c2, 0x270, 0x3aa, 0x256, 0x2fb, 0x4b, 0x13a, 0x200, 0x254, 0x12e, 0x334, 0x36d, 0x315, 0x1a4, 0x33b, 0x3ba, 0xc1, 0x135, 0x2d7, 0x180, 0x1bf, 0x2d8, 0x157, 0x26b, 0x249, 0xbb, 0x51, 0x337, 0x356, 0x3d1, 0xdc, 0xa0, 0x1b2, 0x1da, 0x1fc, 0xad, 0x2b0, 0x171, 0x33a, 0x54, 0x37a, 0x21a, 0x59, 0x78, 0x2b1, 0x29f, 0x81, 0x37b, 0x1f4, 0x3e2, 0x357, 0x3f, 0x367, 0x38f, 0x33c, 0x22, 0x2f2, 0xea, 0x366, 0x61, 0x87, 0x30d, 0x7c, 0x112, 0x68, 0x26, 0x151, 0x21d, 0x3c1, 0x24b, 0x36e, 0x32e, 0x3d5, 0x2f7, 0x14e, 0xba, 0x377, 0x230, 0x3c8, 0x1dd, 0xc1, 0x26a, 0x34e, 0x1b, 0x3c6, 0x3a6, 0x17d, 0x3a5, 0x10b, 0xb5, 0x2d9, 0x17b, 0x349, 0x322, 0x318, 0x145, 0x25b, 0x3f2, 0x380, 0x3df, 0x3c3, 0x33c, 0x44, 0x3da, 0x359, 0x205, 0x3b, 0x188, 0x1e9, 0xe7, 0xc8, 0x328, 0x22c, 0x337, 0x2a5, 0x35f, 0x2e9, 0x212, 0x225, 0x275, 0x3c7, 0x73, 0x38a, 0x2eb, 0x1b1, 0x3c2, 0xe9, 0x2b3, 0x294, 0x3e3, 0x172, 0x20b, 0x240, 0x34, 0x26, 0x2a2, 0x66, 0x237, 0xf1, 0x103, 0x222, 0x14c, 0x319, 0x290, 0xac, 0x2bc, 0x33a, 0xa8, 0x1f3, 0xf4, 0x199, 0x31b, 0x133, 0x14b, 0x20, 0x24e, 0x24f, 0x19a, 0x36d, 0x223, 0x299, 0x1ee, 0x3de, 0x16, 0x1cb, 0x10a, 0x360, 0x2e, 0x35, 0x3f3, 0x55, 0x128, 0x28d, 0x386, 0x333, 0x1ea, 0x91, 0x3d8, 0xfa, 0x3e2, 0x2a7, 0xfc, 0x30e, 0x8e, 0x351, 0x92, 0x3ae, 0x3ea, 0x30, 0x369, 0x16c, 0x157, 0x3a3, 0x3ce, 0x262, 0x3b2, 0x223, 0x13b, 0x3b1, 0x2cf, 0x160, 0x11e, 0x210, 0x30c, 0x253, 0x2ca, 0x54, 0x1f3, 0x1e8, 0x26d, 0xee, 0x314, 0x13a, 0x12, 0x101, 0x302, 0x2ac, 0x33, 0x237, 0x1e2, 0x5, 0x134, 0xed, 0x3f8, 0x161, 0x2bd, 0x1de, 0x16e, 0x1e1, 0xe9, 0x16f, 0x242, 0x327, 0x30d, 0x1f0, 0x104, 0x236, 0x241, 0x3cb, 0x356, 0x35f, 0x1db, 0x5a, 0x10c, 0x311, 0xe, 0xff, 0x2f9, 0x263, 0x11, 0x1ed, 0x359, 0x3, 0xec, 0x5b, 0x2af, 0xdf, 0x26c, 0x34d, 0xda, 0x358, 0x3a0, 0x322, 0x239, 0x11d, 0x2fc, 0x357, 0xfc, 0x215, 0x238, 0x2be, 0x132, 0x135, 0x34e, 0x36, 0x303, 0x10f, 0x3fd, 0x55, 0x250, 0x226, 0xf, 0x35c, 0x137, 0x1, 0x3a3, 0x3ce, 0x262, 0x3b2, 0x223, 0x13b, 0x3b1, 0x2cf, 0x160, 0x11e, 0x210, 0x30c, 0x253, 0x2ca, 0x54, 0x1f3, 0x1e8, 0x26d, 0xee, 0x314, 0x13a, 0x12, 0x101, 0x302, 0x2ac, 0x33, 0x237, 0x34f, 0x323, 0x334, 0x35e, 0xf9, 0x24b, 0x346, 0x222, 0x139, 0x1fc, 0x161, 0x173, 0x371, 0x362, 0x22f, 0x11f, 0x366, 0x308, 0x188, 0x3ad, 0x26b, 0x26c, 0x293, 0x368, 0x2f6, 0x27e, 0x91, 0x37b, 0x3bb, 0x14e, 0x2e8, 0x315, 0x13b, 0x36b, 0x32e, 0x312, 0x1c4, 0x290, 0x2b0, 0x39a, 0x32b, 0x17a, 0x270, 0x16f, 0x8d, 0x87, 0x5e, 0x33f, 0xc8, 0xbb, 0x288, 0x6b, 0xe8, 0x191, 0x239, 0x23a, 0x3e2, 0x28e, 0x3db, 0x230, 0x33b, 0x1ef, 0x2c, 0x243, 0x108, 0x30c, 0xaf, 0x33a, 0x2a0, 0x30f, 0x177, 0x256, 0x3f5, 0x2e4, 0x7c, 0x82, 0x236, 0x8b, 0x337, 0x286, 0x195, 0x31e, 0x2ad, 0x329, 0x3ed, 0x3f, 0x30e, 0x238, 0x175, 0xc1, 0x1ba, 0x85, 0x2c9, 0x170, 0x2a9, 0x20e, 0x37a, 0xf4, 0x26d, 0x1dc, 0x4b, 0x1c2, 0x120, 0x68, 0x130, 0xfd, 0x36c, 0x3d1, 0x2e9, 0x5a, 0x218, 0x5f, 0x70, 0x3eb, 0x38f, 0x1d6, 0x92, 0x2a3, 0x2d7, 0x1b, 0x297, 0x97, 0x196, 0x185, 0x31f, 0x3c4, 0x28, 0x2c1, 0x275, 0x207, 0xff, 0x3f6, 0x271, 0x49, 0x2a3, 0x1a7, 0x6c, 0x2e, 0x1a8, 0x107, 0x37a, 0x1e8, 0x1a6, 0x2fb, 0xb9, 0x3e, 0x82, 0x65, 0x22c, 0x18e, 0x3a, 0x2cc, 0x239, 0x7d, 0x393, 0x5d, 0x1c7, 0x299, 0x36b, 0x255, 0x53, 0x23b, 0x15a, 0x2bd, 0x371, 0x2cd, 0xae, 0xea, 0x205, 0x1d8, 0x2d8, 0x15d, 0x343, 0x94, 0x226, 0x3c, 0x1a5, 0x14b, 0x100, 0x284, 0x20d, 0x14d, 0x269, 0x1f6, 0x370, 0x5a, 0x39, 0x17c, 0x380, 0x2c7, 0x11c, 0x175, 0x182, 0x2e1, 0x21, 0xc3, 0x253, 0x33a, 0x149, 0x27, 0x3aa, 0x121, 0x247, 0x5e, 0x277, 0x320, 0x1d1, 0xda, 0x17b, 0x27e, 0x122, 0x1f7, 0x1e7, 0xcd, 0x1af, 0xf9, 0x9f, 0x103, 0x134, 0x3b4, 0x3f7, 0xe6, 0xde, 0x335, 0x22, 0x373, 0x3ea, 0x180, 0x3c6, 0x10f, 0x3ef, 0x159, 0x10d, 0x2c8, 0x77, 0x221, 0x1c2, 0x240, 0x1a0, 0x192, 0x127, 0x25c, 0xab, 0x66, 0x338, 0xdc, 0x2d, 0x39, 0x2f8, 0x21b, 0x215, 0x1e4, 0x2f3, 0x58, 0x23c, 0x148, 0x169, 0xef, 0x1b1, 0x57, 0xea, 0x3, 0x369, 0x2ed, 0x1fd, 0xaa, 0x141, 0x164, 0x77, 0x4b, 0x301, 0x224, 0x236, 0x22c, 0x31c, 0xe8, 0x24d, 0x3d8, 0x3bb, 0x131, 0x2d3, 0xf9, 0x13e, 0x5, 0x1b2, 0x33e, 0x207, 0x1fe, 0x3c3, 0x3ac, 0x99, 0xdd, 0x10a, 0x265, 0x253, 0x27d, 0x12d, 0x138, 0x2de, 0x61, 0xc4, 0x353, 0x37c, 0x10b, 0x342, 0xf, 0x2d6, 0x14b, 0x200, 0x202, 0x4c, 0xfd, 0x1ab, 0x167, 0x31e, 0x2a6, 0x2fc, 0x28e, 0x377, 0x348, 0x36b, 0xa3, 0x14c, 0x1fc, 0x18d, 0x31d, 0x1cf, 0x11, 0x373, 0x3dd, 0x209, 0x20f, 0xd4, 0x107, 0x2fd, 0x3a9, 0x12b, 0x3e3, 0x30d, 0x39b, 0x190, 0x1d1, 0x1b4, 0x1e5, 0x3d4, 0x204, 0x297, 0x12e, 0x251, 0x33, 0x19c, 0x6e, 0x212, 0x218, 0x17c, 0x309, 0x30e, 0xf2, 0x37d, 0x2c, 0x24e, 0x162, 0x151, 0x269, 0x3d1, 0x365, 0x2ad, 0x17e, 0x28e, 0x2e7, 0x13b, 0x36e, 0x222, 0x1da, 0x3e7, 0x339, 0x3f6, 0x1d6, 0x99, 0x1ba, 0x21, 0x30c, 0x171, 0x32b, 0x3c2, 0x11f, 0x306, 0x3b0, 0x2ed, 0x3fa, 0x2a8, 0x21a, 0x26d, 0x2fb, 0x2e4, 0x3e0, 0xc8, 0x1d1, 0x368, 0x39d, 0x29f, 0x8, 0x254, 0x302, 0x29a, 0x36c, 0x2b7, 0x31e, 0x145, 0x3e2, 0x5d, 0x315, 0x1ca, 0x346, 0x134, 0x2cb, 0x307, 0x1fe, 0x38f, 0x2ab, 0xc1, 0x1cb, 0x108, 0x56, 0x39a, 0x16e, 0x22f, 0xea, 0x6, 0x1bf, 0x345, 0x3ef, 0x16d, 0xf4, 0x34c, 0x3f5, 0x30d, 0x33f, 0x249, 0x293, 0x376, 0xd7, 0xd5, 0x40, 0x284, 0x26, 0xfd, 0x356, 0x195, 0xc6, 0x23a, 0x32f, 0x2e8, 0x9e, 0x24b, 0x206, 0x1b2, 0x275, 0xe, 0x3eb, 0x47, 0x175, 0x201, 0x243, 0x52, 0x2b0, 0xef, 0x362, 0x15c, 0x359, 0x30, 0x1e3, 0x21e, 0x347, 0x37a, 0x3a9, 0x256, 0x397, 0x5e, 0x1ce, 0x95, 0x181, 0x29a, 0x2d1, 0x2ce, 0xc6, 0x7d, 0xa7, 0x36d, 0x1f2, 0x1e2, 0xa0, 0x86, 0x17c, 0x3f, 0x8c, 0xf7, 0x32e, 0x14c, 0x3f9, 0xe6, 0x2f9, 0xeb, 0x99, 0x374, 0x84, 0x56, 0x33d, 0x1b1, 0x15c, 0x2bb, 0xc0, 0x303, 0x1a8, 0x2a, 0x30f, 0x35d, 0x234, 0x188, 0x2ae, 0x343, 0xa9, 0xb2, 0xee, 0x258, 0xf8, 0x64, 0x1d1, 0x2d9, 0x26f, 0xd5, 0x80, 0x202, 0x130, 0x3cb, 0x20a, 0x191, 0x3d8, 0x2f7, 0x334, 0x185, 0xce, 0xdc, 0xb4, 0x390, 0x357, 0x3bf, 0x299, 0x36e, 0x4d, 0x361, 0x307, 0x3fc, 0x227, 0x175, 0xb, 0x11e, 0x290, 0x35a, 0x1df, 0x106, 0x373, 0x36f, 0xd8, 0x2e0, 0x19d, 0x12d, 0xe9, 0x1b3, 0x76, 0x1b9, 0x1fd, 0x2a8, 0x3d, 0x1a6, 0x3f5, 0x213, 0xe7, 0x26c, 0x16a, 0x203, 0x1a5, 0x24a, 0x90, 0x340, 0x116, 0x231, 0x349, 0x122, 0x3a3, 0x12e, 0x156, 0x330, 0x3d1, 0x2c3, 0x2a6, 0x3e2, 0xba, 0x4f, 0x24b, 0x12a, 0x20d, 0xfd, 0x143, 0x166, 0x1ec, 0x2f7, 0x261, 0x21d, 0x279, 0x1db, 0x2ad, 0x1f1, 0xba, 0x9e, 0x13e, 0x28, 0x43, 0x17c, 0x7e, 0x230, 0x3b1, 0x28c, 0x1da, 0x387, 0x3fc, 0x47, 0x1dd, 0x58, 0x1c4, 0x2b4, 0x31d, 0x263, 0x49, 0x26a, 0x21, 0x2b, 0x33d, 0x362, 0x179, 0x1f5, 0x1b, 0xb8, 0x2ca, 0x12d, 0x1d2, 0x2c5, 0x3b0, 0x3a6, 0x3d7, 0x37a, 0x2bf, 0x121, 0x31, 0x2af, 0x3a5, 0xa9, 0x164, 0x3b8, 0x2e4, 0x39b, 0x9b, 0xb5, 0x203, 0x34a, 0x13a, 0x89, 0x65, 0x288, 0x17b, 0x3a1, 0x8, 0x142, 0x4c, 0x3e1, 0x20a, 0x322, 0x37b, 0x395, 0x32c, 0xcc, 0x3ec, 0x2c3, 0x145, 0x393, 0x1d9, 0xf9, 0x1e2, 0x140, 0x218, 0x3f2, 0x3f0, 0x1a4, 0x1b7, 0x4d, 0x2cb, 0x7, 0x3df, 0x238, 0x2f3, 0x2c0, 0x23b, 0x18d, 0xde, 0x33c, 0x248, 0x374, 0x108, 0x158, 0x1de, 0x326, 0x3da, 0x3b3, 0xd8, 0x1c9, 0x27d, 0x17a, 0x28b, 0x205, 0x1bf, 0x254, 0x26, 0x3e1, 0x1d, 0x93, 0x3ee, 0x12e, 0x151, 0x36c, 0x195, 0x239, 0x3bb, 0x334, 0x21d, 0xfb, 0x365, 0x145, 0x32f, 0x36d, 0x3c1, 0x21f, 0x5a, 0x329, 0x28e, 0x315, 0x24b, 0x14, 0x43, 0x2f8, 0x1f8, 0x1a4, 0x36e, 0x134, 0x275, 0x70, 0x30e, 0x33b, 0x32e, 0x139, 0x3e7, 0x1fe, 0x47, 0x3ba, 0x160, 0x23b, 0x31a, 0x378, 0x1d6, 0xc1, 0x243, 0x290, 0x173, 0x1cf, 0x110, 0x135, 0x21, 0x56, 0xef, 0x326, 0x3bd, 0x2d7, 0x2c9, 0xaf, 0x32b, 0x22f, 0x359, 0x180, 0x2e, 0x165, 0x12d, 0x3a4, 0x306, 0x1bf, 0x21e, 0x20e, 0x30f, 0x16f, 0x308, 0x2d8, 0x3fa, 0x16d, 0x3a9, 0x294, 0x31, 0x157, 0x28f, 0x141, 0x26d, 0x3f5, 0x5e, 0x26b, 0x216, 0x8a, 0x23f, 0x258, 0x3e0, 0x249, 0xb5, 0xf, 0x133, 0x1c2, 0x82, 0xbb, 0x368, 0xd7, 0x2a1, 0x24, 0x340, 0x51, 0x358, 0x3d4, 0x8, 0x284, 0x130, 0x337, 0xe8, 0x91, 0x34f, 0x162, 0x29a, 0xa1, 0x98, 0x337, 0x1d0, 0x244, 0x24e, 0x20d, 0x3f4, 0x1d, 0x126, 0x3a3, 0x162, 0x13d, 0x143, 0x191, 0x2ff, 0x97, 0x151, 0x2d1, 0x25d, 0x1ec, 0x3ce, 0x251, 0x269, 0x167, 0x318, 0x3bb, 0x261, 0x66, 0x3d1, 0x235, 0xfa, 0x262, 0x185, 0x279, 0x365, 0x28a, 0xa7, 0x35e, 0x67, 0x370, 0x2ad, 0x3cd, 0x3b2, 0x3c1, 0x37, 0x168, 0x17e, 0xba, 0x278, 0x3c4, 0x212, 0x390, 0x28e, 0x223, 0x13e, 0xa0, 0x39, 0x3af, 0x2e7, 0x394, 0xa, 0x43, 0x1f9, 0x3e9, 0x13b, 0x285, 0x2c1, 0x5f, 0x7e, 0xd2, 0x36e, 0x268, 0x1c6, 0x380, 0x8c, 0x3b1, 0x222, 0x19f, 0x38, 0x30e, 0x27f, 0xa3, 0x1da, 0x207, 0x3b7, 0x1e4, 0x2cf, 0x298, 0x3e7, 0x3fc, 0x11c, 0x1ef, 0x22d, 0x3f9, 0x339, 0x317, 0x1dd, 0x160, 0x7f, 0x73, 0x3f6, 0x15f, 0x16, 0x1c4, 0x2c2, 0x1bc, 0x1d6, 0x182, 0x11e, 0xad, 0x31d, 0x19e, 0x99, 0x396, 0x148, 0x173, 0x39e, 0x49, 0x1ba, 0x142, 0x260, 0x18e, 0x13f, 0x2, 0x284, 0xc9, 0x31c, 0x27e, 0x4, 0x101, 0x192, 0x231, 0xf5, 0x8, 0x202, 0x324, 0x6b, 0x1ea, 0x10, 0xd, 0x241, 0xd6, 0x3d4, 0x20, 0x1a, 0x8b, 0x1ac, 0x3a1, 0x40, 0x34, 0x116, 0x358, 0x34b, 0x80, 0x68, 0x22c, 0x2b9, 0x29f, 0x100, 0xd0, 0x51, 0x17b, 0x137, 0x200, 0x1a0, 0xa2, 0x2f6, 0x26e, 0x9, 0x340, 0x144, 0x1e5, 0xd5, 0x12, 0x289, 0x288, 0x3ca, 0x1aa, 0x24, 0x11b, 0x119, 0x39d, 0x354, 0x48, 0x236, 0x232, 0x333, 0x2a1, 0x90, 0x65, 0x6d, 0x26f, 0x14b, 0x120, 0xca, 0xda, 0xd7, 0x296, 0x240, 0x194, 0x1b4, 0x1ae, 0x125, 0x89, 0x328, 0x368, 0x35c, 0x24a, 0x112, 0x259, 0x2d9, 0x2b1, 0x9d, 0x224, 0xbb, 0x1bb, 0x16b, 0x13a, 0x41, 0x176, 0x376, 0x2d6, 0x274, 0x82, 0x2ec, 0x2e5, 0x1a5, 0xe1, 0x104, 0x1d1, 0x1c3, 0x34a, 0x1c2, 0x208, 0x3a2, 0x386, 0x29d, 0x384, 0x19, 0x284, 0x192, 0x6b, 0x3d4, 0x40, 0x68, 0x51, 0x2f6, 0xd5, 0x24, 0x236, 0x6d, 0xd7, 0x125, 0x112, 0xbb, 0x376, 0x1a5, 0x1c2, 0x19, 0x293, 0xf, 0x18a, 0x7c, 0x249, 0x1a1, 0x3c0, 0x258, 0x33f, 0x344, 0x8a, 0x1dc, 0x30d, 0x26b, 0x94, 0x2c8, 0x3f5, 0x2f0, 0x3d6, 0x141, 0x34c, 0x87, 0x157, 0x55, 0xf4, 0x294, 0x188, 0x17d, 0x16d, 0x177, 0x61, 0x2d8, 0x3ef, 0x3e6, 0x16f, 0x76, 0x345, 0x20e, 0x4e, 0x366, 0x1bf, 0xd4, 0x2a0, 0x3a4, 0x6, 0x303, 0x165, 0x17a, 0xea, 0x180, 0x170, 0x1e6, 0x22f, 0x2fe, 0xd8, 0xaf, 0x16e, 0x2f2, 0x2d7, 0x265, 0x39a, 0x326, 0x1d7, 0x85, 0x56, 0x371, 0x22, 0x135, 0x108, 0x1ad, 0x1cf, 0x92, 0x1cb, 0x290, 0x38a, 0x33c, 0xc1, 0x23c, 0x161, 0x378, 0x2ab, 0x2c, 0x23b, 0xe6, 0x38f, 0x3ba, 0x312, 0x3fb, 0x1fe, 0x238, 0x363, 0x139, 0x307, 0x367, 0x33b, 0x146, 0x2cb, 0x70, 0x46, 0x36b, 0x101, 0x241, 0x358, 0x137, 0x12, 0x236, 0xda, 0x35c, 0x13a, 0x104, 0x34d, 0xf, 0x314, 0x1f0, 0x26c, 0x226, 0xee, 0x30d, 0xdf, 0x250, 0x26d, 0x327, 0x2af, 0x55, 0x1e8, 0x242, 0x5b, 0x3fd, 0x1f3, 0x16f, 0xec, 0x10f, 0x54, 0xe9, 0x3, 0x303, 0x2ca, 0x1e1, 0x359, 0x36, 0x253, 0x16e, 0x1ed, 0x34e, 0x30c, 0x1de, 0x11, 0x135, 0x210, 0x2bd, 0x263, 0x132, 0x11e, 0x161, 0x2f9, 0x2be, 0x160, 0x3f8, 0xff, 0x238, 0x2cf, 0xed, 0xe, 0x215, 0x3b1, 0x134, 0x311, 0xfc, 0x13b, 0x5, 0x10c, 0x357, 0x223, 0x1e2, 0x5a, 0x2fc, 0x3b2, 0x237, 0x1db, 0x11d, 0x262, 0x33, 0x35f, 0x239, 0x3ce, 0x2ac, 0x356, 0x322, 0x3a3, 0x302, 0x3cb, 0x3a0, 0x1, 0x101, 0x241, 0x358, 0x137, 0x12, 0x236, 0xda, 0x35c, 0x13a, 0x104, 0x34d, 0xf, 0x314, 0x1f0, 0x26c, 0x226, 0xee, 0x30d, 0xdf, 0x250, 0x26d, 0x327, 0x2af, 0x55, 0x1e8, 0x242, 0x5b, 0x202, 0x116, 0x2f6, 0x354, 0x240, 0xbb, 0x1c3, 0x266, 0x7c, 0x136, 0x226, 0x1dc, 0x2f, 0x2f1, 0x141, 0x12b, 0x62, 0x17d, 0x1bd, 0x35d, 0x76, 0x10f, 0xa8, 0x3a4, 0x18, 0x5c, 0x1e6, 0xae, 0x3b3, 0x265, 0x273, 0x20c, 0x135, 0x29, 0x2e6, 0x33c, 0x304, 0x388, 0xe6, 0x227, 0x3de, 0x139, 0x7, 0x215, 0x36b, 0xd9, 0xbe, 0x3db, 0x321, 0x140, 0x329, 0x174, 0x38b, 0x2e9, 0x11d, 0xcd, 0xcc, 0x2ce, 0x3d8, 0x12e, 0x27a, 0x3a, 0x81, 0x142, 0x324, 0x358, 0x26e, 0x48, 0x194, 0x1bb, 0x34a, 0x20b, 0x320, 0x342, 0x23f, 0x382, 0xdf, 0xa9, 0x1a6, 0x10e, 0x2aa, 0x2b2, 0x2ee, 0x308, 0x3a6, 0x15, 0x270, 0x3, 0x20f, 0x33a, 0x313, 0x1f5, 0x2c9, 0x1cd, 0x245, 0x2a3, 0x84, 0x35a, 0x263, 0x264, 0x71, 0x31a, 0x3c3, 0x37d, 0xa6, 0x387, 0x2c7, 0x1ee, 0x9a, 0x311, 0x1f8, 0xe5, 0x28, 0xe4, 0x22a, 0x1f2, 0xdc, 0x2a6, 0x29c, 0x21d, 0xd, 0x51, 0x39d, 0x125, 0x82, 0x293, 0x78, 0x258, 0x1ce, 0x94, 0x26d, 0x87, 0x2aa, 0x16d, 0x3aa, 0x76, 0x21e, 0x2a0, 0x11f, 0x180, 0x392, 0x16e, 0x3bd, 0x85, 0x2b0, 0x1cf, 0x99, 0x23c, 0x31a, 0x38f, 0x1ef, 0x139, 0xe, 0x46, 0x36e, 0x18b, 0x3ed, 0x315, 0x3c4, 0x2d0, 0x32f, 0x2c6, 0x3d1, 0x239, 0x323, 0x29a, 0x1d, 0x81, 0x284, 0x8b, 0x2f6, 0x2a1, 0x112, 0x1d1, 0xf, 0x4b, 0x33f, 0x216, 0x2c8, 0x397, 0x157, 0x2a8, 0x177, 0x308, 0x345, 0x54, 0x3a4, 0x30, 0x170, 0x32b, 0x2f2, 0x295, 0x56, 0x3be, 0x92, 0x243, 0x161, 0x3f6, 0x3ba, 0xa6, 0x307, 0x30e, 0x36b, 0x1b2, 0x2f8, 0x2e7, 0x27c, 0x5a, 0x3e2, 0x35e, 0xfb, 0xc6, 0x1e7, 0x151, 0x286, 0x91, 0x254, 0x192, 0x358, 0xd5, 0x120, 0xbb, 0x386, 0x18a, 0x3e0, 0x344, 0x59, 0x3f5, 0x3ad, 0x55, 0x3a9, 0x61, 0x2ed, 0x20e, 0x270, 0x6, 0x2e, 0x1e6, 0x15c, 0x2d7, 0x1a, 0x144, 0xd7, 0x274, 0x64, 0x1a1, 0x77, 0x2f, 0x3d6, 0x3d, 0x242, 0x2d8, 0x287, 0x138, 0x6, 0x5c, 0x391, 0x2f2, 0x123, 0x158, 0x1cf, 0x132, 0xe2, 0xe6, 0x8e, 0x197, 0x2cb, 0x309, 0x299, 0x14, 0x1c8, 0x174, 0x237, 0x2c3, 0x3d9, 0xab, 0x2a5, 0x24c, 0x254, 0x324, 0x17b, 0x2a1, 0x224, 0x34d, 0x78, 0xb9, 0x331, 0xa9, 0x291, 0xc4, 0x3fa, 0x3c5, 0x1b3, 0x1e3, 0x2ca, 0x313, 0x3dd, 0xc3, 0x3bc, 0x110, 0x396, 0x2b4, 0x3f6, 0x37d, 0x298, 0xe, 0x8c, 0x1a3, 0x43, 0x2a7, 0x278, 0xdc, 0x28a, 0x19a, 0x269, 0x166, 0x3a3, 0x26, 0x31c, 0x34b, 0x24, 0x328, 0x1c3, 0x18a, 0x3c9, 0x10b, 0x2c8, 0x327, 0x155, 0x16d, 0x35d, 0x1d8, 0xd4, 0x25a, 0x3a8, 0xd8, 0x2e2, 0x83, 0x135, 0xa4, 0x233, 0x2ab, 0x2c0, 0x3f7, 0x367, 0x3dc, 0xd9, 0x2f8, 0x1c7, 0x1e2, 0x2d0, 0x257, 0x30a, 0x2b7, 0x3d8, 0xb1, 0x3e1, 0x29b, 0x20, 0x340, 0x34, 0x119, 0x2b1, 0x301, 0x9b, 0x8a, 0x3fe, 0x353, 0x2a8, 0x1d5, 0xec, 0xd4, 0xbd, 0x2bb, 0x2c9, 0x273, 0x44, 0x1cb, 0x2b4, 0x3e5, 0x1ef, 0xed, 0xe0, 0x1a4, 0xa, 0x1c8, 0x2e8, 0xce, 0x235, 0x1e7, 0x14d, 0x3a, 0x1, 0x34, 0x119, 0x2b1, 0x301, 0x9b, 0x8a, 0x3fe, 0x353, 0x2a8, 0x1d5, 0xec, 0xd4, 0xbd, 0x2bb, 0x2c9, 0x273, 0x44, 0x1cb, 0x2b4, 0x3e5, 0x1ef, 0xed, 0xe0, 0x1a4, 0xa, 0x1c8, 0x2e8, 0xce, 0x235, 0x1e7, 0x14d, 0x3a, 0x1, 0x34, 0x119, 0x2b1, 0x301, 0x9b, 0x8a, 0x3fe, 0x353, 0x2a8, 0x1d5, 0xec, 0xd4, 0xbd, 0x2bb, 0x2c9, 0x273, 0x44, 0x1cb, 0x2b4, 0x3e5, 0x1ef, 0xed, 0xe0, 0x1a4, 0xa, 0x1c8, 0x2e8, 0xce, 0x235, 0x1e7, 0x14d, 0x3a, 0x1, 0x34, 0x119, 0x2b1, 0x301, 0x9b, 0x8a, 0x3fe, 0x353, 0x2a8, 0x1d5, 0xec, 0xd4, 0xbd, 0x2bb, 0x2c9, 0x273, 0x44, 0x1cb, 0x2b4, 0x3e5, 0x1ef, 0x68, 0x6d, 0x1a5, 0x7c, 0x344, 0x2c8, 0x87, 0x17d, 0x3e6, 0x366, 0x303, 0x1e6, 0x2f2, 0x85, 0x1ad, 0x33c, 0x2c, 0x3fb, 0x367, 0x36b, 0x18b, 0x357, 0xf9, 0x2e9, 0x1f4, 0xab, 0x286, 0x81, 0xd, 0x288, 0x2b1, 0x20b, 0x26c, 0x59, 0x397, 0x2aa, 0x37a, 0x36a, 0x1e3, 0x33a, 0x15c, 0x295, 0x2b0, 0x263, 0x201, 0x1fc, 0x3eb, 0x1ee, 0x1b2, 0x3ed, 0x9e, 0xdc, 0x23a, 0x196, 0x356, 0x91, 0x284, 0x51, 0xd7, 0x1c2, 0x249, 0x8a, 0x3f5, 0x157, 0x16d, 0x16f, 0x1bf, 0x165, 0x22f, 0x2d7, 0x56, 0x1cf, 0xc1, 0x23b, 0x1fe, 0x33b, 0x134, 0x2f8, 0x315, 0x21f, 0x145, 0x334, 0x36c, 0x93, 0x254, 0x8b, 0x39d, 0x13a, 0xc8, 0x113, 0x2fb, 0x3ad, 0x2a8, 0x3aa, 0x3b0, 0x2a9, 0x3c2, 0x3dd, 0x30c, 0x3be, 0x99, 0x1c4, 0x339, 0x1e4, 0x222, 0x5f, 0x2e7, 0x3c4, 0x2ad, 0x262, 0x269, 0x191, 0x24e, 0x192, 0x2f6, 0x125, 0x19, 0x1a1, 0x1dc, 0x2f0, 0xd0, 0x1b4, 0x133, 0x3c9, 0x4a, 0x34c, 0x310, 0x3a7, 0x270, 0x60, 0x253, 0x326, 0x26a, 0x252, 0x3f6, 0x3de, 0x361, 0x3f, 0x394, 0x2d, 0x32f, 0x33, 0x25d, 0x34f, 0x260, 0x17b, 0x125, 0x32, 0x28d, 0x2fb, 0x353, 0x2b2, 0x16f, 0x37e, 0x19d, 0x15c, 0x123, 0x2d2, 0x33c, 0x58, 0x3f7, 0x30e, 0x2d5, 0x10c, 0x5d, 0x67, 0x63, 0x323, 0x1fa, 0x13f, 0x200, 0x328, 0x203, 0x258, 0xdf, 0x10d, 0x8d, 0x1d3, 0x150, 0xea, 0x1b0, 0x273, 0x110, 0x8f, 0x73, 0x238, 0x28c, 0x22b, 0x2e7, 0x381, 0x2a6, 0x334, 0x2d1, 0x24c, 0x284, 0xa2, 0x35c, 0x20b, 0xd1, 0x164, 0x87, 0x2fa, 0x383, 0x306, 0x5c, 0xb7, 0x1d7, 0x210, 0x233, 0x175, 0x14c, 0x38, 0x1a4, 0x28, 0xbf, 0x35e, 0x3ab, 0x3b9, 0x302, 0x31c, 0x26e, 0x112, 0x12f, 0x31b, 0x5e, 0x117, 0x2bf, 0x76, 0x1a8, 0x1e1, 0x3dd, 0x211, 0x2e3, 0xc1, 0x7f, 0x3f1, 0x1ee, 0x364, 0x3af, 0xf9, 0x1a0, 0x2d9, 0x18a, 0xe7, 0x152, 0x294, 0x372, 0xa8, 0xea, 0x360, 0x1de, 0x92, 0xe2, 0x27b, 0x33b, 0xd9, 0x3d3, 0xf9, 0x3b6, 0x37f, 0x29a, 0x3a0, 0x80, 0x194, 0x203, 0xb9, 0x37c, 0x7a, 0xc2, 0x21e, 0xbd, 0x1f5, 0x30c, 0x2e3, 0x182, 0x1fc, 0x3b7, 0x2df, 0x43, 0x22a, 0x67, 0xc6, 0x97, 0x3cb, 0x3d4, 0x90, 0x3a2, 0x3c0, 0x2f, 0x117, 0x177, 0x1d8, 0x15b, 0x22f, 0x34e, 0x169, 0x33c, 0xb0, 0x3c7, 0x46, 0x103, 0x1c8, 0x36d, 0x3ec, 0x3d8, 0x302, 0x231, 0x1aa, 0x82, 0x2d4, 0x3b8, 0x3ad, 0x2b2, 0x2de, 0x1e3, 0xf3, 0x1ed, 0x21, 0x1c5, 0x15f, 0xa6, 0x38, 0x348, 0xa0, 0x1f1, 0x185, 0x195, 0x3a3, 0x260, 0x2f6, 0x9d, 0x190, 0x8a, 0x3cf, 0x15d, 0x3e6, 0x183, 0x5c, 0x16e, 0x355, 0xa4, 0x378, 0x2f3, 0x3b4, 0x3f, 0x321, 0xb4, 0x14e, 0x330, 0x322, 0x254, 0x22c, 0x1ae, 0x20b, 0x1a2, 0x199, 0x31, 0x3f3, 0x9c, 0x30, 0x340, 0x376, 0x4b, 0x26b, 0x21a, 0x61, 0x21e, 0x17a, 0x3dd, 0x56, 0x263, 0x2c, 0x3e7, 0x46, 0x206, 0x329, 0x35e, 0x2b7, 0x3ee, 0x130, 0x2f6, 0x13a, 0x249, 0x59, 0x87, 0x3fa, 0x4e, 0x30, 0xaf, 0x106, 0x1cb, 0x31a, 0x238, 0x222, 0x2f8, 0x9e, 0x2e9, 0x3bb, 0x29a, 0x349, 0x200, 0xbb, 0x78, 0x30d, 0x28f, 0x177, 0x3b0, 0x165, 0x15c, 0x85, 0x173, 0x2ab, 0xa6, 0x70, 0x13b, 0x109, 0x32f, 0xcc, 0x191, 0x254, 0x51, 0x2b1, 0x7c, 0x216, 0x34c, 0x5b, 0x20e, 0x11f, 0xd8, 0xef, 0x92, 0x1c4, 0x1fe, 0x1ee, 0x18b, 0x28e, 0x237, 0xc6, 0x12e, 0x337, 0x29f, 0x112, 0xb5, 0x1dc, 0x3ad, 0x16d, 0x36a, 0x303, 0x32b, 0x1d7, 0x52, 0x378, 0x1ef, 0x2cb, 0x1f8, 0x27c, 0x2ad, 0x334, 0x356, 0x81, 0x68, 0x368, 0x18a, 0x1ce, 0x141, 0x8d, 0x345, 0x12d, 0x2fe, 0x30c, 0x1cf, 0x201, 0x3fb, 0x30e, 0x346, 0xe4, 0x36d, 0x3d1, 0x37b, 0x26, 0x289, 0x1c3, 0x258, 0x2f1, 0x3d0, 0x76, 0x15b, 0xae, 0x85, 0x2e6, 0x2be, 0x139, 0x309, 0x321, 0x2d0, 0xcd, 0x1ab, 0x81, 0xd0, 0x1bb, 0x4b, 0xdf, 0x7a, 0x308, 0x1a8, 0x313, 0x295, 0x35a, 0x351, 0xa6, 0xe0, 0xe5, 0x5a, 0x29c, 0x1b6, 0x91, 0x1a, 0x1b4, 0x18a, 0x39c, 0x10d, 0x61, 0x35, 0x1e1, 0x2d7, 0x169, 0xeb, 0x312, 0x1c, 0x299, 0x109, 0x257, 0x330, 0x93, 0x101, 0x232, 0x133, 0x277, 0x2a4, 0x8d, 0x283, 0xbd, 0x3dd, 0xac, 0x19e, 0x160, 0x207, 0xd2, 0xa0, 0x3cd, 0x66, 0x191, 0xa1, 0x144, 0x1a5, 0x3c9, 0x250, 0x294, 0x1d3, 0x292, 0x2fe, 0x211, 0x335, 0x2c, 0x3c7, 0x118, 0x14, 0x2fc, 0x30a, 0xb3, 0x95, 0x22c, 0x2b1, 0xf8, 0x4a, 0x256, 0x1b9, 0x150, 0x359, 0xc3, 0x2e3, 0x201, 0x3ff, 0x23, 0x206, 0x25b, 0x163, 0x195, 0x297, 0x241, 0xd7, 0x1f, 0x10b, 0x34c, 0xb6, 0x2a, 0xea, 0x19b, 0x1df, 0xc1, 0x11b, 0x305, 0x2e4, 0x343, 0x2ee, 0x1bf, 0xf3, 0x373, 0x52, 0x1fb, 0x2cf, 0x38c, 0x38e, 0x1b8, 0x3bb, 0x27a, 0xf5, 0x120, 0x25e, 0x3b8, 0x157, 0x1f3, 0x205, 0x392, 0x83, 0x396, 0xe6, 0x399, 0x364, 0x28e, 0xce, 0x7b, 0x302, 0x1ac, 0x24a, 0x249, 0x164, 0x62, 0x347, 0x28b, 0x1b0, 0x371, 0x264, 0x3f8, 0x30e, 0x103, 0x25b, 0x2c6, 0x25d, 0x95, 0x51, 0x2d6, 0x3c9, 0xa9, 0x242, 0x283, 0x17a, 0x36f, 0x169, 0x1d6, 0x53, 0xe0, 0x1ca, 0x168, 0xcd, 0x356, 0x204, 0x289, 0x386, 0x172, 0x3a5, 0x177, 0x2db, 0x27d, 0x3bd, 0x29, 0x2f9, 0x363, 0x1c6, 0x1c7, 0xdc, 0x3d9, 0x13d, 0x27e, 0x90, 0x12f, 0x1dc, 0x2af, 0x2fd, 0x306, 0x1c9, 0x245, 0x1cb, 0x73, 0x3c8, 0x1b2, 0x147, 0x67, 0x239, 0x181, 0xd6, 0x125, 0x320, 0xb2, 0x31, 0x3a7, 0x341, 0xd8, 0x3bc, 0x132, 0x1fc, 0x187, 0x285, 0x329, 0x163, 0x32a, 0x24e, 0x22c, 0x16b, 0x3e0, 0x236, 0xf, 0x30d, 0x55, 0x16f, 0x303, 0x16e, 0x135, 0x161, 0x238, 0x134, 0x357, 0x237, 0x239, 0x302, 0x358, 0x13a, 0x26c, 0x26d, 0x5b, 0x54, 0x359, 0x30c, 0x263, 0x160, 0xe, 0x13b, 0x5a, 0x262, 0x356, 0x1, 0x236, 0xf, 0x30d, 0x55, 0x16f, 0x303, 0x16e, 0x135, 0x161, 0x238, 0x134, 0x357, 0x237, 0x239, 0x302, 0x358, 0x13a, 0x26c, 0x26d, 0x5b, 0x54, 0x359, 0x30c, 0x263, 0x160, 0xe, 0x13b, 0x5a, 0x262, 0x356, 0x1, 0x236, 0xf, 0x30d, 0x55, 0x16f, 0x303, 0x16e, 0x135, 0x161, 0x238, 0x134, 0x357, 0x237, 0x239, 0x302, 0x358, 0x13a, 0x26c, 0x26d, 0x5b, 0x54, 0x359, 0x30c, 0x263, 0x160, 0xe, 0x13b, 0x5a, 0x262, 0x356, 0x1, 0x236, 0xf, 0x30d, 0x55, 0x16f, 0x303, 0x16e, 0x135, 0x161, 0x238, 0x134, 0x357, 0x237, 0x239, 0x302, 0x358, 0x13a, 0x26c, 0x26d, 0x5b, 0x54, 0x359, 0x30c, 0x263, 0x160, 0xe, 0x13b, 0x65, 0x3c, 0x5e, 0x159, 0x1b3, 0x170, 0x245, 0x325, 0x339, 0x3dc, 0x10c, 0x36d, 0x167, 0x127, 0x51, 0x34a, 0xe7, 0x21a, 0x219, 0x2b6, 0x2f2, 0x210, 0x1fb, 0x32e, 0xbe, 0x278, 0x31e, 0x25c, 0x231, 0x125, 0x9b, 0x332, 0x5b, 0xa8, 0x17f, 0x56, 0x271, 0x53, 0x380, 0x9f, 0x2a6, 0xab, 0x1d0, 0x12, 0x293, 0x3b8, 0x155, 0x30f, 0x60, 0x1cd, 0x92, 0x7f, 0x187, 0x206, 0x2fc, 0x66, 0x93, 0x1a, 0x1bb, 0x258, 0x3a5, 0x1d5, 0x1e3, 0x25f, 0x29e, 0x161, 0x79, 0xd9, 0x28e, 0x338, 0x3b9, 0x130, 0x333, 0x3e, 0x94, 0x121, 0x10f, 0x3c2, 0x123, 0x1c5, 0x3ba, 0x19f, 0x377, 0xdc, 0x37f, 0x3f4, 0x29f, 0x104, 0x45, 0x87, 0x3d7, 0x28b, 0x2c9, 0x375, 0x16, 0x307, 0x348, 0x2d, 0x262, 0x2a5, 0x4, 0x194, 0xf0, 0x178, 0x16d, 0x2c5, 0x1c9, 0x106, 0x8f, 0xff, 0x36b, 0x39, 0x1af, 0x195, 0x95, 0x144, 0x133, 0x39c, 0x7a, 0x76, 0xca, 0xf0, 0x2f0, 0x1bd, 0x205, 0xaf, 0x88, 0x388, 0x367, 0x103, 0x2fc, 0xcc, 0x24c, 0xd0, 0x386, 0x382, 0xaa, 0x36a, 0xb8, 0x245, 0x243, 0xff, 0x2df, 0xe4, 0x163, 0x166, 0x284, 0x1b4, 0x96, 0x3d6, 0x1d5, 0x3c6, 0x16e, 0xdd, 0x23d, 0x33b, 0x225, 0x1d9, 0x2b7, 0x127, 0xa2, 0x133, 0x331, 0x1e8, 0x3b0, 0xf3, 0x3ae, 0xad, 0x11c, 0x268, 0x28e, 0x279, 0x2ff, 0x192, 0x35c, 0x3c9, 0x141, 0x184, 0x15b, 0x2f2, 0x29, 0x3e5, 0x146, 0x3f2, 0x38b, 0x239, 0x13, 0x1e5, 0x20b, 0x4a, 0x121, 0x21e, 0x313, 0x10a, 0x6f, 0x3b5, 0x311, 0x9e, 0x18f, 0x25c, 0x6b, 0x9d, 0xd1, 0x34c, 0x372, 0x25a, 0x2d7, 0x2bd, 0x2ea, 0x2cb, 0x377, 0x1b8, 0x1e7, 0x39f, 0x1aa, 0xc8, 0x164, 0x310, 0x54, 0x17f, 0xac, 0x1d6, 0x298, 0x7e, 0x3c4, 0xfa, 0x13d, 0x3d4, 0x41, 0x226, 0x87, 0x3a7, 0x23e, 0x265, 0x335, 0x2c0, 0x70, 0x321, 0x153, 0xab, 0x194, 0x3c0, 0x3ad, 0x3e6, 0x30, 0x39a, 0x99, 0x3fb, 0x230, 0x109, 0x262, 0x286, 0x40, 0x1d1, 0x1dc, 0x2aa, 0x4e, 0x1b, 0x371, 0x201, 0x307, 0x13b, 0x2d0, 0x196, 0xe8, 0x24, 0xb5, 0x3f5, 0x3fa, 0x3a4, 0x2c9, 0x1cf, 0x160, 0x70, 0x24b, 0x145, 0x151, 0x27e, 0x112, 0x113, 0x87, 0x347, 0xea, 0x30c, 0x33c, 0xa6, 0x3f, 0x3c4, 0x1f4, 0xfd, 0x29f, 0x19, 0x59, 0x188, 0x54, 0x2fe, 0x2b0, 0x2ab, 0x1da, 0x3db, 0xdc, 0x1e7, 0x337, 0x2a1, 0x249, 0x26d, 0x2d8, 0x12d, 0x2d7, 0x173, 0x3ba, 0x275, 0x315, 0x365, 0x12e, 0x6b, 0x13a, 0x344, 0x256, 0x345, 0x3c2, 0x85, 0x6f, 0x363, 0x5f, 0xf9, 0xc6, 0x302, 0x2f6, 0x20b, 0x94, 0x8d, 0xd4, 0x15c, 0x108, 0x3f6, 0x146, 0x3ed, 0x237, 0x1ec, 0x130, 0xd7, 0x3e0, 0x141, 0x308, 0x165, 0x3bd, 0x290, 0x47, 0x134, 0x28e, 0xfb, 0x3ee, 0x8b, 0x1a5, 0x1ce, 0xf4, 0x3b0, 0x1e6, 0x2a3, 0x328, 0x31b, 0x157, 0x217, 0x209, 0x371, 0xb, 0x7, 0x1ca, 0x153, 0x2ac, 0x27e, 0x224, 0x45, 0x31, 0x15, 0x17f, 0x2b0, 0x15f, 0x361, 0x2e7, 0x1db, 0x97, 0x6b, 0x274, 0x10b, 0x294, 0x35, 0xae, 0x108, 0x3e5, 0x111, 0x357, 0x338, 0x1f7, 0x8b, 0x34a, 0x331, 0x3a9, 0x37e, 0xb7, 0x1ba, 0x1cc, 0x3b1, 0xe4, 0x185, 0x24d, 0x68, 0x305, 0x2f, 0x16d, 0x205, 0x2bc, 0x92, 0x3f8, 0x118, 0x109, 0xcd, 0x20a, 0x200, 0x12f, 0x3fe, 0x3fa, 0x341, 0x336, 0x263, 0x22d, 0x21b, 0x3c4, 0x3e8, 0x3f4, 0xd5, 0x190, 0x332, 0x2d8, 0x25a, 0x34e, 0x38a, 0x3de, 0x22b, 0xf9, 0x18c, 0x13, 0x39d, 0xf8, 0x2a4, 0x308, 0x2ca, 0x2ef, 0xad, 0x79, 0x2c1, 0x2e8, 0x167, 0x12a, 0x6d, 0x96, 0x343, 0x16f, 0x5c, 0x83, 0x23c, 0x3df, 0x103, 0x3e2, 0xdb, 0x204, 0x194, 0x389, 0x2af, 0x30f, 0x300, 0x3bc, 0x201, 0x207, 0xe5, 0x2ad, 0x156, 0x13f, 0x112, 0x259, 0x77, 0x2aa, 0x138, 0x1b0, 0x1cf, 0x189, 0x309, 0x3c4, 0x3d9, 0x3cb, 0x2a1, 0x136, 0x291, 0x345, 0x313, 0x42, 0x3f6, 0x111, 0x2a7, 0xfb, 0x3a3, 0xa2, 0x18a, 0x1eb, 0x35d, 0x2e, 0x83, 0x71, 0x367, 0xa, 0x257, 0x356, 0x20, 0x3a2, 0x2fb, 0x1fd, 0x341, 0x265, 0x19e, 0x14c, 0x1f8, 0x6e, 0x3ce, 0x18e, 0x9d, 0x281, 0x294, 0x6a, 0x2b8, 0x52, 0x227, 0x268, 0x5d, 0x35f, 0x95, 0x6d, 0x12c, 0x117, 0x36a, 0x1c9, 0x44, 0x23b, 0x23, 0x140, 0x262, 0x20a, 0x9, 0xb5, 0x3cf, 0x3d7, 0xea, 0x2b, 0x3ac, 0x1da, 0x377, 0x1db, 0x12e, 0x1ac, 0x384, 0x94, 0x234, 0x15b, 0x3bd, 0x252, 0x79, 0x18b, 0x3b2, 0x32a, 0x284, 0x1bb, 0x1c1, 0x2a8, 0x183, 0x15e, 0x92, 0x3f9, 0x69, 0x5a, 0xcb, 0x1d0, 0x120, 0x28d, 0x10e, 0x20e, 0x17f, 0x169, 0x175, 0x33e, 0x223, 0x31e, 0x181, 0x1e5, 0x7c, 0x2a4, 0x219, 0x33a, 0x355, 0x2c2, 0x33b, 0xbb, 0x1dc, 0x17d, 0x3a4, 0x265, 0x33c, 0x139, 0x3db, 0x2e9, 0x12e, 0x358, 0x20b, 0xa9, 0x308, 0x33a, 0x2a3, 0x31a, 0x1ee, 0xe4, 0x21d, 0x91, 0x236, 0x3c0, 0x157, 0x4e, 0xd8, 0x1cf, 0x312, 0x3f, 0x21f, 0x1e7, 0x18e, 0x13a, 0x216, 0x8d, 0x2a9, 0x3bd, 0xad, 0x1e4, 0x43, 0x35e, 0x191, 0x68, 0xf, 0x2f0, 0x3e6, 0x180, 0x371, 0x2c, 0x70, 0x27c, 0x1f4, 0x3e1, 0x2a1, 0x26c, 0x256, 0x21e, 0x15c, 0x52, 0x47, 0x1b2, 0x2e8, 0x195, 0x284, 0x376, 0x30d, 0x16d, 0x6, 0x39a, 0xc1, 0x307, 0x1ca, 0x145, 0x29a, 0x29f, 0xc8, 0x26d, 0x2ed, 0x3c2, 0x21, 0x3f6, 0x222, 0x28e, 0x3d1, 0x24e, 0x6d, 0x258, 0x55, 0x366, 0xaf, 0x92, 0x3fb, 0x1a4, 0x2d0, 0xab, 0x27e, 0x82, 0x59, 0x5b, 0x12d, 0x295, 0x6f, 0x32e, 0x3ed, 0x19c, 0x3ee, 0x51, 0x18a, 0x3d6, 0x16f, 0x170, 0x22, 0x23b, 0x46, 0x109, 0x334, 0xe8, 0x120, 0x113, 0x31, 0x176, 0x379, 0x3fa, 0x23e, 0x2b, 0x2ab, 0x19f, 0x4f, 0xc6, 0x4c, 0x35c, 0x1ce, 0x35b, 0x385, 0x326, 0x71, 0x187, 0xa0, 0xcd, 0x74, 0x120, 0x226, 0xc4, 0x2a0, 0x1a7, 0x233, 0x32e, 0x3d3, 0x279, 0x34f, 0x119, 0x12c, 0x55, 0x2c5, 0x2bc, 0x99, 0x3c7, 0xe5, 0x145, 0x13d, 0x26e, 0x249, 0x291, 0x10f, 0x15c, 0xa4, 0x11c, 0x18b, 0x2d3, 0x2cc, 0x68, 0x1e, 0x3d2, 0x30f, 0x36, 0x2e3, 0x312, 0x7e, 0x6e, 0x323, 0xd6, 0x301, 0xa9, 0x219, 0xf3, 0x135, 0x1cc, 0x1b7, 0x17e, 0xdb, 0x4, 0x1d1, 0x1ff, 0x3f3, 0xea, 0xac, 0x2be, 0x275, 0x13c, 0x318, 0x130, 0x16b, 0x331, 0x177, 0x20f, 0x83, 0x1c4, 0x215, 0x280, 0x334, 0x1d0, 0x89, 0x8a, 0x310, 0x292, 0x295, 0xde, 0xa3, 0x357, 0x1f6, 0x127, 0x6d, 0xb9, 0x154, 0x306, 0x2e2, 0x264, 0x307, 0x394, 0x11d, 0xfd, 0x1aa, 0x136, 0x256, 0x35, 0x179, 0x290, 0x79, 0x225, 0x35e, 0x2ec, 0x1ff, 0x3ef, 0x3a8, 0x169, 0x3ba, 0x22b, 0x38b, 0x37b, 0x22c, 0x314, 0x28f, 0x1b3, 0x15e, 0x99, 0x387, 0x394, 0x23a, 0x3f4, 0x14b, 0x344, 0x242, 0x15b, 0x1d7, 0x18d, 0x3dc, 0x329, 0x330, 0x2, 0x1d1, 0x3fe, 0x3d7, 0x359, 0x2d2, 0x37d, 0x5f, 0x31f, 0x2ff, 0x51, 0x221, 0x117, 0x366, 0x2bc, 0x132, 0x307, 0x321, 0x7d, 0x3e1, 0x296, 0x281, 0x8d, 0x2b6, 0x3ae, 0x31a, 0x3b1, 0x25b, 0x269, 0x4, 0x3a2, 0x3f5, 0x3a7, 0x2bb, 0x1ad, 0x2f3, 0xbe, 0x237, 0x1f7, 0xa2, 0x4b, 0x22e, 0x2c5, 0x171, 0x264, 0x207, 0x24b, 0xfa, 0x3cb, 0x125, 0x10b, 0x11a, 0x165, 0x355, 0x23d, 0x36b, 0xbf, 0xdb, 0x8, 0x34d, 0x3e3, 0x347, 0x17f, 0x35a, 0x1ef, 0x17c, 0x67, 0x3ee, 0x144, 0x96, 0x55, 0x183, 0x2e2, 0xc1, 0x7, 0x9f, 0x1f4, 0x39f, 0x24a, 0x216, 0x234, 0x2ca, 0x2a3, 0x73, 0x2df, 0x17e, 0x1b6, 0x10, 0x293, 0x3cf, 0x287, 0x2fe, 0x1d1, 0x3f5, 0x347, 0x2fe, 0x173, 0x363, 0x3ed, 0xfb, 0x24e, 0x368, 0x30d, 0x37a, 0x180, 0x3be, 0x312, 0x1f8, 0x2e9, 0x162, 0x39d, 0x33f, 0x3a9, 0x303, 0x106, 0x23b, 0x230, 0x2d0, 0x151, 0x29f, 0x249, 0x256, 0xd4, 0x3bd, 0x161, 0x1ee, 0x329, 0x269, 0x8, 0x293, 0x397, 0x20e, 0x3dd, 0x38a, 0x32e, 0x357, 0x3d1, 0x254, 0x376, 0x5e, 0x3e6, 0x1b, 0x1cf, 0xa6, 0x3db, 0x365, 0x302, 0xd7, 0x1ce, 0x177, 0x2e, 0x22, 0x1fc, 0x1a4, 0x2ad, 0x29a, 0xd5, 0x26c, 0x294, 0x2a9, 0x1d7, 0x31a, 0x36b, 0x17e, 0x36c, 0x40, 0xb5, 0x87, 0x54, 0x2d7, 0x6f, 0x146, 0x28e, 0x2b7, 0x284, 0x386, 0x2f0, 0x30f, 0xd8, 0x263, 0x139, 0x2e7, 0x31e, 0x26, 0x2b1, 0x26b, 0x3aa, 0x170, 0x110, 0x3fb, 0x13b, 0x145, 0xfd, 0x2a1, 0x344, 0x8d, 0x165, 0x2a3, 0xe6, 0x36e, 0x3e2, 0x356, 0x200, 0x1a1, 0x31, 0x2a0, 0x295, 0x378, 0x222, 0x5d, 0x195, 0xd, 0x3a2, 0x3cf, 0x20e, 0x3b3, 0x233, 0x146, 0x115, 0x2ce, 0xd, 0x1e, 0x2af, 0x270, 0xc3, 0x351, 0x275, 0x1f2, 0x3b9, 0x51, 0x96, 0x154, 0x6, 0x1de, 0xb0, 0x3f, 0x1b8, 0xb1, 0x39d, 0x277, 0x2bf, 0x2e, 0x44, 0x3f9, 0x13b, 0x28a, 0x3f4, 0x125, 0x25, 0x184, 0x1e6, 0x374, 0x3f1, 0x14, 0xcd, 0x3a0, 0x82, 0x199, 0x3a6, 0x15c, 0x129, 0x399, 0xe4, 0x198, 0x4, 0x293, 0x327, 0x2a, 0x2d7, 0xde, 0x111, 0x5d, 0x32a, 0x34, 0x78, 0x2ae, 0x1d2, 0x30c, 0x15f, 0x1c6, 0x3c1, 0x2ff, 0x144, 0x258, 0x159, 0x18, 0x371, 0x2c0, 0xfc, 0x2e9, 0x2c4, 0x26f, 0x1ce, 0x2ee, 0xb8, 0x110, 0x3ff, 0xe5, 0x23a, 0x3cb, 0x9d, 0x94, 0x219, 0x391, 0x1cb, 0x3df, 0x50, 0x334, 0x29b, 0x208, 0x26d, 0x283, 0x179, 0xad, 0x27f, 0x390, 0x269, 0x10, 0x25e, 0x87, 0xa8, 0x34e, 0x378, 0x4d, 0x174, 0xb3, 0xd0, 0x1e0, 0x2aa, 0x341, 0x2b, 0x175, 0x34d, 0x327, 0x54, 0x34e, 0x2f9, 0x134, 0x3b2, 0x322, 0x236, 0xee, 0x3fd, 0x359, 0x2bd, 0x2cf, 0x357, 0x35f, 0x101, 0xf, 0x2af, 0xe9, 0x30c, 0x2be, 0x311, 0x237, 0x3a3, 0xda, 0x30d, 0x1f3, 0x36, 0x263, 0xed, 0x223, 0x239, 0x241, 0x314, 0x55, 0x3, 0x1de, 0x160, 0xfc, 0x1db, 0x302, 0x35c, 0xdf, 0x16f, 0x253, 0x132, 0xe, 0x1e2, 0x3ce, 0x358, 0x1f0, 0x1e8, 0x303, 0x11, 0x3f8, 0x13b, 0x11d, 0x3cb, 0x13a, 0x250, 0xec, 0x16e, 0x11e, 0x215, 0x5a, 0x2ac, 0x137, 0x26c, 0x242, 0x2ca, 0x135, 0xff, 0x5, 0x262, 0x3a0, 0x104, 0x26d, 0x10f, 0x1ed, 0x161, 0x3b1, 0x2fc, 0x356, 0x12, 0x226, 0x5b, 0x1e1, 0x210, 0x238, 0x10c, 0x33, 0x1, 0x34d, 0x327, 0x54, 0x34e, 0x2f9, 0x134, 0x3b2, 0x322, 0x236, 0xee, 0x3fd, 0x359, 0x2bd, 0x2cf, 0x357, 0x35f, 0x101, 0xf, 0x2af, 0xe9, 0x30c, 0x2be, 0x311, 0x237, 0x3a3, 0xda, 0x30d, 0x293, 0x87, 0x2a0, 0x85, 0x38f, 0x18b, 0x2c6, 0x81, 0x1d1, 0x397, 0x54, 0x295, 0x3f6, 0x1b2, 0x35e, 0x91, 0xbb, 0x3f5, 0x20e, 0x2d7, 0x378, 0x134, 0x36d, 0x93, 0x194, 0x2fb, 0x347, 0x3dd, 0x6f, 0x222, 0x2e8, 0x191, 0x236, 0x1dc, 0x3ef, 0x2fe, 0x38a, 0x146, 0x5d, 0xb3, 0x340, 0x23f, 0x3fa, 0x359, 0x173, 0x32e, 0x28e, 0x195, 0x68, 0x3c0, 0x17d, 0xea, 0x1ad, 0x363, 0x357, 0x2b7, 0xd, 0x78, 0x2aa, 0x11f, 0x2b0, 0x1ef, 0x3ed, 0x3d1, 0x284, 0xf, 0x157, 0x3a4, 0x56, 0x3ba, 0x2f8, 0xfb, 0x254, 0x386, 0x3ad, 0x270, 0x30c, 0x175, 0x5f, 0x19c, 0x24e, 0x376, 0x2f0, 0x4e, 0x265, 0x2ab, 0x38c, 0x237, 0x34f, 0x368, 0x5e, 0x30f, 0x2c9, 0x1d6, 0x275, 0x3c1, 0x3ee, 0x6d, 0x30d, 0x3e6, 0xd8, 0x33c, 0x2cb, 0xf9, 0x37b, 0x288, 0x2e4, 0x37a, 0x1b, 0x263, 0x1da, 0x9e, 0x1ec, 0x51, 0x258, 0x16d, 0x180, 0x1cf, 0x139, 0x315, 0x12f, 0x21c, 0x12d, 0x42, 0x11c, 0x218, 0x198, 0x20, 0x1a1, 0x310, 0x1e1, 0x52, 0x3c8, 0x390, 0x36c, 0x9, 0x45, 0x2d8, 0x57, 0x252, 0x1ee, 0x2fc, 0x143, 0x120, 0xb2, 0x3a6, 0x2f2, 0x2c2, 0x1b7, 0x32f, 0x3a, 0x41, 0x26d, 0x35, 0x2ef, 0xe6, 0x285, 0x131, 0x349, 0x32, 0x12b, 0x2a9, 0x14f, 0xff, 0x14, 0x261, 0x1ea, 0x249, 0x121, 0x19d, 0x1ba, 0x3df, 0x280, 0xab, 0x137, 0x1a2, 0x61, 0x3cc, 0x325, 0x30e, 0xb4, 0x14d, 0x2a1, 0x25, 0x3b, 0x16e, 0x71, 0x118, 0x2ad, 0x1fa, 0x9d, 0xa9, 0x369, 0x193, 0x23b, 0x348, 0x11d, 0x337, 0x384, 0x10d, 0x1e3, 0x20c, 0x3f9, 0x1ca, 0x3e8, 0x231, 0x7c, 0x1e8, 0x17, 0x110, 0x3c7, 0x13e, 0x1e7, 0x2b9, 0x39b, 0x177, 0x2e0, 0x248, 0xe, 0x381, 0x97, 0x39d, 0x39c, 0x2b3, 0xaf, 0x182, 0x1c0, 0xdc, 0x2c4, 0x35c, 0x37c, 0x2dd, 0x1cd, 0x2c, 0x7e, 0x3b6, 0x26, 0x34a, 0x343, 0x306, 0x25e, 0x62, 0x17a, 0x29, 0x3c8, 0x329, 0x1ab, 0x48, 0x59, 0x3a6, 0x1ed, 0x31a, 0x1a3, 0x29c, 0x349, 0x64, 0xa5, 0x165, 0xdd, 0x3df, 0x109, 0x2ac, 0x1aa, 0x216, 0x3b, 0x2dc, 0x1c4, 0xd2, 0x28a, 0x337, 0x301, 0x3d, 0x303, 0x88, 0x3c7, 0x27c, 0x395, 0x1e5, 0x1ce, 0x2b3, 0x15e, 0x201, 0x21b, 0x1db, 0x26, 0x29d, 0x117, 0x6, 0x1df, 0x14c, 0x315, 0xf6, 0xa2, 0x2e4, 0x1f3, 0x1b0, 0x1d6, 0x1c6, 0x67, 0x24e, 0x1c3, 0x353, 0x3a4, 0x158, 0x3de, 0x357, 0x2ce, 0xd0, 0x23f, 0x3f3, 0x1f5, 0x6f, 0x9a, 0x2d3, 0x91, 0x2ec, 0x327, 0x2a0, 0x214, 0x8e, 0x218, 0x330, 0x80, 0x113, 0x16c, 0x57, 0xad, 0x3b1, 0x3cd, 0x1d, 0x41, 0xd3, 0xd4, 0x355, 0x27b, 0x14, 0xcb, 0x3a1, 0x26c, 0x234, 0x3cc, 0x243, 0x23, 0x1a9, 0xfd, 0x9d, 0x152, 0x1bf, 0x83, 0x3f8, 0x1ca, 0x3d9, 0xd6, 0x3e0, 0x2bf, 0x2e0, 0x99, 0x38, 0x37, 0x162, 0xb5, 0x188, 0x3c2, 0x290, 0x1ee, 0x3e2, 0x1d, 0x82, 0x34c, 0x2a9, 0x135, 0x3eb, 0x109, 0x151, 0x2a1, 0x94, 0x3b0, 0x326, 0x1fc, 0x1ca, 0x3bb, 0x358, 0x33f, 0x3aa, 0xaf, 0x201, 0x3f, 0x365, 0x130, 0x18a, 0x2a8, 0x180, 0x263, 0x2cb, 0x3c1, 0x34f, 0x376, 0x3ad, 0x3a4, 0x2b0, 0x363, 0x28e, 0xb3, 0x236, 0x2fb, 0x20e, 0x295, 0x38f, 0x43, 0xcc, 0x40, 0x113, 0x2d8, 0x15c, 0x161, 0x36e, 0x14e, 0x349, 0xc8, 0x294, 0x33a, 0x1cb, 0x30e, 0x2d0, 0xfd, 0x13a, 0x141, 0x1e3, 0x22, 0x3e7, 0x27c, 0x323, 0x39d, 0x26b, 0x36a, 0x39a, 0x160, 0x3db, 0xc6, 0x8b, 0x258, 0x37a, 0xd8, 0x1d6, 0x38c, 0x19c, 0x254, 0xf, 0x2aa, 0xea, 0x173, 0x146, 0x2e8, 0x93, 0xbb, 0x397, 0x2a0, 0x21, 0x238, 0xe4, 0x36c, 0x24, 0x59, 0x345, 0x3bd, 0xe6, 0x206, 0x334, 0x3d4, 0x26c, 0x61, 0x32b, 0x23c, 0x230, 0x145, 0x337, 0x20b, 0xf4, 0x2e, 0x92, 0x16a, 0x229, 0x22f, 0x15a, 0x1b7, 0x14e, 0x29b, 0x320, 0x8d, 0x3cc, 0x11e, 0x230, 0x28a, 0xc7, 0x7c, 0x35b, 0x1c9, 0xc1, 0x309, 0x3b6, 0x130, 0x314, 0x2b2, 0x1b, 0x271, 0x1c6, 0x19c, 0xa1, 0x3c, 0x17d, 0x2bb, 0x233, 0x134, 0x2b5, 0x204, 0xb5, 0x310, 0x313, 0xad, 0x2df, 0xa7, 0x349, 0x190, 0x242, 0x1e6, 0x8f, 0x118, 0x145, 0x267, 0x3e, 0x3a9, 0x2e0, 0x264, 0x380, 0x1db, 0x98, 0x18a, 0x159, 0x209, 0x33c, 0xe3, 0xce, 0x254, 0x1e, 0x2ba, 0x359, 0x31d, 0x9a, 0x35e, 0x102, 0x25e, 0x188, 0x38d, 0x252, 0x36b, 0x257, 0x3a0, 0xc8, 0x121, 0xf3, 0x243, 0x8c, 0x2a6, 0x337, 0x1f, 0x3d0, 0x170, 0x132, 0x1c0, 0x2e9, 0x4c, 0xc5, 0x2a8, 0x300, 0x19e, 0x275, 0x67, 0x12a, 0xf, 0x15d, 0x3a8, 0x38a, 0x4d, 0x1af, 0x81, 0x12f, 0xc4, 0x3c2, 0x129, 0x3b1, 0x32f, 0x1d0, 0x64, 0x294, 0x27d, 0x325, 0x46, 0x153, 0x39f, 0x20b, 0x2d4, 0xb6, 0x15c, 0x18d, 0x285, 0x334, 0x34b, 0x281, 0x76, 0x193, 0x3f8, 0x24b, 0x395, 0x333, 0x37c, 0x183, 0x2eb, 0x139, 0x278, 0x3d5, 0x376, 0x2af, 0x23e, 0x173, 0x111, 0x2d3, 0x81, 0x25e, 0x310, 0x22f, 0x2b4, 0x2d5, 0x262, 0x1ea, 0xd1, 0x308, 0x1b1, 0x7f, 0x1ca, 0x2f7, 0x1e5, 0x26b, 0x1b3, 0x1de, 0xa6, 0x4f, 0x2ff, 0x368, 0x3d2, 0x341, 0x1ad, 0xa3, 0x1d9, 0x91, 0x34d, 0x62, 0x3c2, 0x252, 0x2df, 0x14e, 0x13f, 0x9b, 0x61, 0xb7, 0x388, 0x13b, 0x3d9, 0x2b9, 0x1ce, 0x1b5, 0x33d, 0x312, 0x38e, 0x3d8, 0x6d, 0x178, 0xe9, 0x2b0, 0x197, 0xba, 0x93, 0x2ec, 0x10e, 0x17a, 0x148, 0x3dc, 0x32f, 0x3a0, 0x190, 0x8d, 0x391, 0x71, 0x1a4, 0xfa, 0xd6, 0x33f, 0x2b3, 0x2e2, 0x160, 0x377, 0x7b, 0x288, 0x2f, 0x9c, 0x56, 0x3b5, 0x115, 0x191, 0x259, 0x327, 0x12d, 0x29, 0x27f, 0x3e2, 0x74, 0x32, 0x294, 0xf3, 0x8f, 0x230, 0x1a1, 0x2d8, 0x2f2, 0xe6, 0x14, 0xab, 0x2a1, 0xa9, 0x1e3, 0x110, 0xe, 0xdc, 0x26, 0x18a, 0x16d, 0xd8, 0x2ab, 0x2f8, 0x2b7, 0x340, 0x2fb, 0x54, 0x21, 0x1e4, 0x17e, 0x1d, 0x19, 0x294, 0x1e6, 0x23c, 0x1a4, 0x1f4, 0x358, 0x1ce, 0x36a, 0xef, 0xa6, 0x9e, 0x3ee, 0x376, 0x157, 0xea, 0x38a, 0x134, 0x2c6, 0x8, 0x113, 0x2ed, 0x3bd, 0x339, 0xa0, 0x151, 0x125, 0x141, 0x303, 0x92, 0x70, 0x2e9, 0x130, 0x4b, 0x37a, 0x2c9, 0x175, 0x3ed, 0x195, 0x236, 0x3f5, 0x2a0, 0x108, 0x33b, 0x3e2, 0xe8, 0xc8, 0x8d, 0x32b, 0x1c4, 0x13b, 0x3bb, 0x2f6, 0x26b, 0x366, 0x371, 0x139, 0xf9, 0x34f, 0x386, 0x2aa, 0x359, 0x6f, 0x1b2, 0x21d, 0x40, 0x8a, 0x345, 0x1d7, 0x1fe, 0x109, 0x29a, 0x13a, 0x21a, 0x2e, 0x99, 0x380, 0x365, 0x192, 0x258, 0x3e6, 0x265, 0x3ba, 0x357, 0xb3, 0x194, 0x397, 0x12d, 0x52, 0x1ee, 0x32f, 0x349, 0x249, 0x61, 0x342, 0x372, 0x3bd, 0x27b, 0x280, 0x29a, 0x274, 0x7a, 0x170, 0x182, 0xfc, 0xc6, 0xa2, 0x2f, 0x270, 0x169, 0xa3, 0x36d, 0x102, 0x2d4, 0x2d8, 0x1ed, 0x398, 0xa0, 0x2a2, 0x9d, 0x21a, 0x5c, 0x264, 0x3f, 0x235, 0x22c, 0x30d, 0x9c, 0x158, 0x32e, 0x1d9, 0x244, 0xb5, 0xb6, 0x179, 0xe6, 0x28, 0x2ac, 0x125, 0x282, 0x17, 0x99, 0x309, 0x18f, 0x8b, 0x1c1, 0x27, 0x56, 0x2cf, 0x174, 0x91, 0x12f, 0x229, 0x15c, 0x23d, 0xa, 0xab, 0x14b, 0x2a4, 0x303, 0x124, 0x1c0, 0x365, 0x324, 0x172, 0x30f, 0x211, 0x3b5, 0x5d, 0x126, 0x34d, 0x188, 0x57, 0x18d, 0x206, 0x32c, 0x354, 0xa9, 0x3c6, 0x49, 0x70, 0x1db, 0xc9, 0x258, 0x3c5, 0x186, 0x1ef, 0x115, 0x24d, 0x1d1, 0x62, 0x313, 0x161, 0x285, 0xcb, 0xd5, 0x128, 0x2f5, 0x110, 0x1c, 0x370, 0x130, 0x96, 0x1f3, 0x265, 0x37d, 0x147, 0x191, 0x176, 0x21c, 0x3c2, 0x15a, 0x1a3, 0x334, 0x28d, 0x1d3, 0x1d7, 0x3f1, 0xb4, 0x3e1, 0x3e, 0x2ee, 0x171, 0x189, 0x223, 0x3ee, 0x1c3, 0x15d, 0x2fe, 0x1fb, 0x86, 0x36c, 0x89, 0x291, 0x33a, 0x11e, 0x348, 0x3bb, 0x3ca, 0x2f1, 0x6, 0x335, 0xe3, 0xfb, 0x34, 0x3b8, 0x54, 0x84, 0x27f, 0x32f, 0x13f, 0xd1, 0x76, 0x83, 0x3c7, 0x21f, 0x13, 0x314, 0x37a, 0x336, 0x37d, 0x28e, 0x24d, 0x3a2, 0x188, 0xae, 0x23d, 0x14, 0x2ac, 0x24a, 0x21a, 0xb8, 0x182, 0x1f8, 0x318, 0x119, 0x2f0, 0x28b, 0x2e6, 0x134, 0x30a, 0x80, 0x59, 0x6a, 0x26a, 0x30e, 0x2a6, 0x31c, 0x33f, 0x1b5, 0x1de, 0x139, 0x3e4, 0x95, 0x78, 0x3f3, 0x1a7, 0x47, 0x390, 0x105, 0x19, 0x242, 0x25f, 0x23b, 0x321, 0x24f, 0x2b1, 0x22e, 0x300, 0x1d6, 0x17c, 0x167, 0x236, 0x3cf, 0x25a, 0x290, 0x1b7, 0xcd, 0x29f, 0x4a, 0x37e, 0x110, 0x38, 0x1db, 0x192, 0x172, 0x217, 0x56, 0x197, 0x1d9, 0x81, 0x2d4, 0x1b9, 0x3bd, 0x113, 0x345, 0x2a3, 0x367, 0x2ad, 0x18e, 0x33f, 0x36a, 0x371, 0x1da, 0x237, 0x284, 0x23f, 0x20e, 0x21, 0x33b, 0x32f, 0x27e, 0x344, 0x3b0, 0x22, 0xe, 0x2e9, 0x192, 0x2e4, 0x4e, 0x2b0, 0x146, 0x35e, 0x8, 0x8a, 0x21e, 0x135, 0x30e, 0x145, 0x6b, 0x1ce, 0x366, 0x3be, 0x2cb, 0x19c, 0xd, 0x1dc, 0x54, 0x108, 0x1ee, 0x14e, 0x3d4, 0x216, 0x1bf, 0x110, 0x70, 0x365, 0x8b, 0x30d, 0x270, 0x1ad, 0x222, 0x2c6, 0x40, 0x59, 0xd4, 0x1ba, 0x46, 0x23a, 0x358, 0x26b, 0x306, 0x1cf, 0x275, 0xfb, 0x68, 0x2fb, 0x2a0, 0x52, 0x36b, 0x262, 0x29f, 0x94, 0x1e3, 0x92, 0x380, 0x31e, 0x51, 0x5e, 0x3a4, 0x173, 0x134, 0x21d, 0x200, 0x2c8, 0x2a9, 0x1cb, 0x230, 0x1f4, 0x2f6, 0x37c, 0x6, 0x263, 0x38c, 0x3d1, 0x340, 0x3f5, 0x12d, 0x290, 0x36e, 0x334, 0xd5, 0xa9, 0x303, 0x99, 0x3f, 0xc6, 0x288, 0x2f0, 0x11f, 0x38a, 0x1b2, 0xcc, 0x24, 0x226, 0x10f, 0x135, 0x215, 0x11d, 0x358, 0xdf, 0x3, 0x263, 0x311, 0x35f, 0x236, 0x327, 0x1e1, 0x161, 0x5, 0x2ac, 0x13a, 0x1e8, 0x253, 0x160, 0x223, 0x3a3, 0xf, 0x3fd, 0x34e, 0x238, 0x2fc, 0x3a0, 0x26c, 0xec, 0x11, 0xe, 0x1db, 0x241, 0x30d, 0xe9, 0x2bd, 0x134, 0x33, 0x12, 0x26d, 0x2ca, 0x11e, 0x13b, 0x3ce, 0x35c, 0x55, 0x36, 0x2be, 0x357, 0x322, 0x34d, 0x5b, 0x1ed, 0xff, 0x5a, 0x3cb, 0x1f0, 0x16f, 0x1de, 0xed, 0x237, 0x101, 0xee, 0x54, 0x210, 0x3b1, 0x262, 0x137, 0x250, 0x303, 0x132, 0xfc, 0x239, 0xda, 0x2af, 0x359, 0x2f9, 0x10c, 0x356, 0x104, 0x242, 0x16e, 0x3f8, 0x1e2, 0x302, 0x314, 0x1f3, 0x30c, 0x2cf, 0x3b2, 0x1, 0x226, 0x10f, 0x135, 0x215, 0x11d, 0x358, 0xdf, 0x3, 0x263, 0x311, 0x35f, 0x236, 0x327, 0x1e1, 0x161, 0x5, 0x2ac, 0x13a, 0x1e8, 0x253, 0x160, 0x223, 0x3a3, 0xf, 0x3fd, 0x34e, 0x238, 0x45, 0x35, 0x1ba, 0x118, 0x3e8, 0x39d, 0x343, 0x300, 0x2ab, 0x3af, 0x322, 0x293, 0x16c, 0x373, 0x3eb, 0x352, 0x31c, 0x1ce, 0x183, 0x39e, 0x38c, 0x35f, 0x65, 0x87, 0x313, 0x23d, 0xa0, 0x27a, 0x1f, 0x3aa, 0x273, 0x272, 0x237, 0x202, 0x3b8, 0x2a0, 0x148, 0x2d5, 0x196, 0x296, 0x3d, 0x392, 0xb0, 0x223, 0x34f, 0x3c, 0x3d7, 0x85, 0x399, 0x257, 0x3d4, 0x4a, 0x3c6, 0x99, 0xfc, 0x7b, 0x368, 0x155, 0x1f5, 0x38f, 0x390, 0x3a, 0x249, 0x3b, 0x20c, 0xe, 0x3b6, 0x116, 0x5e, 0x28b, 0x31d, 0x18b, 0x1b6, 0x224, 0x294, 0xb7, 0x3f8, 0x3c4, 0x13, 0x96, 0x30f, 0x158, 0x28c, 0x2c6, 0x100, 0x199, 0x165, 0x11e, 0x276, 0x323, 0x2d6, 0x159, 0x2c9, 0x2f3, 0xba, 0x81, 0x28d, 0x283, 0x135, 0x23, 0x7d, 0x2f6, 0x1eb, 0x60, 0x1d6, 0x3f2, 0x166, 0x1d1, 0x229, 0x1ed, 0x1fe, 0x168, 0x267, 0x33f, 0x1b3, 0x375, 0x275, 0x3ec, 0x289, 0x397, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x1, 0x8a, 0xd4, 0x1cb, 0x1a4, 0x1e7, 0x2b1, 0x2a8, 0x2c9, 0x1ef, 0x2e8, 0x114, 0x350, 0x243, 0x276, 0x97, 0x133, 0x2fd, 0x2b, 0x146, 0x185, 0x12, 0x34c, 0x3cc, 0xfe, 0x3c4, 0x4c, 0x172, 0x270, 0x2e6, 0x2c1, 0x36c, 0x104, 0x234, 0x326, 0x207, 0x3b6, 0x51, 0x1e9, 0x3a8, 0x3f6, 0x1c8, 0x74, 0x26c, 0x369, 0x49, 0x3f, 0x7b, 0x1bb, 0x17d, 0x1a7, 0xf2, 0x32f, 0x3a1, 0x250, 0x2e, 0xb, 0x38e, 0x34f, 0xf0, 0x107, 0x108, 0x2df, 0xcb, 0x125, 0x1e8, 0x2bc, 0xa6, 0x38b, 0x202, 0x2fb, 0x25a, 0x2b4, 0x14, 0x13d, 0x3e, 0x16f, 0x2eb, 0x33e, 0x3d1, 0x65, 0x21c, 0x15c, 0x27b, 0x168, 0x18e, 0x39c, 0x3, 0x33c, 0x1f9, 0x2cc, 0x293, 0x1b9, 0x355, 0x30e, 0x7d, 0x3ca, 0x28f, 0x36, 0x1dd, 0x5d, 0x102, 0x45, 0xd4, 0x396, 0x299, 0x323, 0x34a, 0x1bd, 0x30c, 0x255, 0x163, 0x200, 0xd3, 0xf3, 0x23b, 0xf1, 0x13, 0x258, 0x9c, 0x2bd, 0x1b2, 0xdb, 0x41, 0x8d, 0x2cd, 0x387, 0x2e9, 0x116, 0x178, 0xea, 0x228, 0x15b, 0x23c, 0x321, 0x2c4, 0x4b, 0x27, 0x35a, 0x1b2, 0x1b6, 0x104, 0x61, 0x83, 0x1c, 0x31e, 0x232, 0x2ae, 0x3dd, 0x11c, 0x3cd, 0x3d4, 0x250, 0x5c, 0x2c, 0x4f, 0x95, 0x23f, 0x150, 0x129, 0x206, 0x14d, 0x1f, 0x16f, 0x1df, 0xe3, 0x2b7, 0x259, 0x310, 0x3bd, 0x3b7, 0x28a, 0x2f6, 0x343, 0x36, 0x3ba, 0x174, 0x2, 0x59, 0x2b6, 0x71, 0x24b, 0x181, 0x96, 0x4e, 0x2bd, 0x364, 0x36c, 0x208, 0xc2, 0x106, 0x38, 0x235, 0x6d, 0x155, 0x3b3, 0x238, 0x393, 0x3a1, 0xa9, 0xb8, 0x58, 0x9e, 0x12a, 0x77, 0x2a0, 0x252, 0x5, 0x29a, 0x3e, 0x2de, 0x3be, 0x1c6, 0x167, 0xbb, 0x229, 0x373, 0x367, 0x11d, 0x1e5, 0x28f, 0x6c, 0x37d, 0x2e8, 0x4, 0xb2, 0x165, 0xe2, 0x9f, 0x302, 0x12c, 0x9c, 0x173, 0x2c1, 0x2d1, 0x19, 0x184, 0x20c, 0x70, 0x63, 0xda, 0x2aa, 0x36f, 0x79, 0x32f, 0x34b, 0x152, 0x170, 0xb0, 0x13c, 0x254, 0x59, 0x165, 0x1c4, 0x27c, 0x26, 0x2e4, 0x3a4, 0x6f, 0x218, 0x1d, 0x26c, 0x1bf, 0x99, 0x3db, 0x3ee, 0x78, 0x20e, 0x52, 0x346, 0x151, 0x20b, 0x16f, 0x3be, 0x38c, 0x195, 0x1d1, 0x2d8, 0x2a3, 0x46, 0x3bb, 0x2b1, 0x16d, 0x30c, 0x146, 0x21d, 0x120, 0x294, 0x362, 0x307, 0x365, 0x288, 0x157, 0x3dd, 0x238, 0x32f, 0x29f, 0x141, 0x392, 0x312, 0x3c1, 0xd, 0x3f5, 0x3c2, 0xe6, 0x5a, 0x18e, 0x26b, 0x30, 0x2ab, 0x28e, 0x81, 0x8a, 0x2a9, 0x23c, 0x24b, 0x302, 0x258, 0x270, 0x38a, 0x43, 0x286, 0x249, 0x3b0, 0x92, 0x1f8, 0x37b, 0xf, 0x347, 0x108, 0x36e, 0xab, 0x1c2, 0x3aa, 0x371, 0x275, 0x2b7, 0xbb, 0x5b, 0x1d7, 0x30e, 0x1f4, 0xd7, 0x2a8, 0x265, 0x32e, 0x2c6, 0x24, 0x256, 0x16e, 0x3e7, 0x2e9, 0x51, 0x3ad, 0x2fe, 0x47, 0x3e2, 0x3d4, 0xa9, 0x170, 0x160, 0xf9, 0x284, 0x2fb, 0x17a, 0x31a, 0x109, 0x337, 0x1ce, 0x6, 0x1d6, 0xb2, 0x19d, 0x23b, 0x381, 0xc9, 0x5e, 0x1d4, 0x3c3, 0x17e, 0xf5, 0x250, 0x170, 0x2c0, 0x3e4, 0xd, 0x3e3, 0x313, 0x339, 0x1a9, 0x1ac, 0x3d6, 0x36, 0x2f3, 0x36d, 0x80, 0x1a6, 0x32b, 0x3ff, 0x370, 0x51, 0x353, 0x3ea, 0x238, 0x257, 0x26e, 0x21a, 0x15e, 0x298, 0x19c, 0x289, 0x21c, 0x2f2, 0x3df, 0x11d, 0x39d, 0xaa, 0x336, 0x32e, 0x185, 0x90, 0x294, 0x2cd, 0x7, 0x31e, 0xda, 0x2ba, 0x295, 0x27f, 0x19a, 0x125, 0x35b, 0x273, 0x2cb, 0x3ab, 0x259, 0x5b, 0x3ae, 0x23, 0x3bb, 0x16b, 0x1bd, 0x56, 0x4d, 0x330, 0x82, 0xc2, 0x11, 0x380, 0x7b, 0x1c3, 0x3ef, 0x42, 0x1b7, 0xab, 0x384, 0x2b3, 0x3be, 0x311, 0x25d, 0x293, 0x1d3, 0xdd, 0x1a4, 0x24f, 0xc5, 0x30f, 0x35a, 0x2c1, 0x356, 0x190, 0x1d8, 0x92, 0x3f0, 0x1f7, 0x78, 0x15, 0x148, 0x206, 0x13d, 0x1f0, 0x366, 0xcf, 0x3f2, 0x93, 0x342, 0x6a, 0x243, 0x394, 0x181, 0x258, 0x164, 0x27d, 0x1fc, 0x6e, 0x116, 0x3ad, 0x3ea, 0x79, 0x14e, 0x354, 0x1e8, 0x39a, 0x361, 0x3ab, 0xbb, 0x16c, 0x14f, 0x230, 0x395, 0x266, 0x30f, 0x2bd, 0x316, 0x286, 0x136, 0x37e, 0xc1, 0x38e, 0x95, 0x1dc, 0xbd, 0x23d, 0x5a, 0x231, 0x2f1, 0x1b, 0x2f3, 0x2d3, 0x200, 0x12b, 0x2dc, 0x307, 0x18f, 0xda, 0x17d, 0x246, 0x3dc, 0x196, 0xe1, 0x35d, 0x3be, 0x22b, 0x166, 0xb5, 0x10f, 0x396, 0x1ca, 0x181, 0xb9, 0x3a4, 0x1bc, 0x1c8, 0x349, 0x4a, 0x5c, 0x160, 0x3e4, 0x1a, 0x397, 0xae, 0x3fc, 0x145, 0x3ca, 0xaa, 0x265, 0xa3, 0x33, 0x112, 0x234, 0x20c, 0x380, 0xf6, 0x305, 0x347, 0x29, 0x285, 0x29a, 0x1f0, 0x2c5, 0x33c, 0x3af, 0x122, 0x8a, 0x2b6, 0x388, 0x3c4, 0xc9, 0xbc, 0x359, 0x227, 0x3cd, 0x29f, 0x10d, 0x15e, 0x139, 0x279, 0x65, 0x188, 0x2ef, 0x215, 0x3bb, 0x2d6, 0x2fd, 0x2b0, 0xd9, 0x2d1, 0xc8, 0x1d8, 0x124, 0x3db, 0x2c8, 0x1e6, 0x3fb, 0x2e9, 0x288, 0x2aa, 0x295, 0x1ee, 0x196, 0x1c2, 0x16f, 0x1cf, 0x2f8, 0x93, 0x113, 0x2a9, 0x1c4, 0x3c4, 0x192, 0x2f0, 0x2fe, 0x238, 0x14e, 0x2a1, 0x3a9, 0xef, 0x275, 0x195, 0x293, 0x345, 0x1cb, 0x1ca, 0x302, 0x2e4, 0x11f, 0x3f6, 0x17e, 0x3d4, 0x141, 0xaf, 0x139, 0xfb, 0x194, 0x5b, 0x2a3, 0x230, 0x323, 0x18a, 0x4e, 0x38a, 0x218, 0xe8, 0x216, 0x2e, 0x160, 0x3c1, 0x68, 0x87, 0x2f2, 0x367, 0x1f4, 0x2b1, 0x37a, 0x2b0, 0x1b2, 0x356, 0x249, 0x1bf, 0xc1, 0x315, 0x254, 0x2fb, 0x3c2, 0x339, 0x2ad, 0x2f6, 0x55, 0x265, 0x146, 0xcc, 0x82, 0x308, 0x110, 0x1f8, 0x3ee, 0x3c0, 0x2a0, 0x161, 0x109, 0x18e, 0x37c, 0x1b, 0x1ef, 0x35e, 0x24, 0x294, 0x326, 0x70, 0x239, 0x386, 0x347, 0x52, 0x206, 0xfd, 0x33f, 0x6, 0x2ab, 0x5d, 0x8, 0x26d, 0x32b, 0x3e7, 0x365, 0x6d, 0x17d, 0x85, 0x36b, 0xab, 0x20b, 0x36a, 0x199, 0x391, 0x3e7, 0x2c3, 0x1b4, 0x3fa, 0x42, 0x1a3, 0x29a, 0x3c9, 0x3, 0x2ab, 0xba, 0x20, 0x34c, 0x2dc, 0x7, 0xc6, 0x2e5, 0x3a7, 0x52, 0x5, 0x3f4, 0x1ce, 0x60, 0x1dd, 0x36d, 0x9, 0x14a, 0x326, 0xe0, 0xf6, 0xf, 0x15, 0x252, 0xa0, 0x267, 0x1be, 0x1b, 0x3de, 0x163, 0x120, 0x11a, 0x11, 0x3f, 0x2ff, 0x1e0, 0x2a0, 0x2c2, 0x2d, 0x6b, 0x3a5, 0x360, 0x32e, 0x33, 0x41, 0x308, 0x220, 0x3e9, 0x34f, 0x77, 0xbd, 0xe6, 0x1a9, 0x17b, 0x55, 0xc3, 0x111, 0x269, 0x32, 0x1d8, 0x99, 0x1c7, 0x12a, 0x2fb, 0x38d, 0xff, 0x145, 0x333, 0x2b2, 0x56, 0x268, 0x1ab, 0x249, 0x37e, 0x304, 0x9e, 0x101, 0x3cf, 0x15c, 0x3df, 0xfa, 0x2b1, 0x2fd, 0x2d2, 0x18b, 0x105, 0x1a2, 0x303, 0x58, 0x3e4, 0x68, 0x10e, 0x3da, 0x30e, 0x37f, 0x29d, 0x30f, 0x2e6, 0x10c, 0xe8, 0x25, 0xb8, 0x312, 0x67, 0x11b, 0x188, 0x3ae, 0x118, 0x323, 0x332, 0x25f, 0x307, 0x63, 0x2e5, 0x347, 0x148, 0x28, 0x337, 0x1be, 0x36, 0x363, 0x30a, 0x224, 0x308, 0x49, 0x3bf, 0x24e, 0x379, 0x38d, 0x1fe, 0x11d, 0x1ae, 0x37a, 0x2d2, 0x316, 0x1d, 0x10b, 0x5c, 0x312, 0xce, 0x65, 0x5b, 0x29e, 0x348, 0x162, 0x172, 0x23e, 0x38f, 0x393, 0x1aa, 0x3a9, 0x3bc, 0x311, 0x191, 0x28d, 0x15b, 0x23b, 0x6e, 0xa2, 0x2aa, 0x246, 0x2df, 0x151, 0x1f0, 0x205, 0x2ab, 0x174, 0x80, 0x256, 0x193, 0xe0, 0x1ec, 0x3c, 0xa8, 0x161, 0x2d, 0xd6, 0x28f, 0x336, 0x28c, 0x269, 0x64, 0x369, 0xc1, 0x4f, 0x101, 0x397, 0x179, 0x2c7, 0x3bb, 0x29d, 0x217, 0x38a, 0x72, 0x29b, 0xa9, 0x253, 0x272, 0x3d1, 0x2ec, 0x1d3, 0x1cb, 0x321, 0x4c, 0x5e, 0x17f, 0x79, 0x262, 0x9d, 0x35d, 0x1cf, 0x3f2, 0x122, 0x59, 0xf3, 0x3ff, 0x365, 0x1b4, 0x3fd, 0x108, 0x103, 0x1fa, 0x1ce, 0xc0, 0x37d, 0x35e, 0x90, 0x11a, 0x22, 0x26d, 0x16e, 0xe, 0x239, 0xf, 0x54, 0x161, 0x5a, 0x358, 0x55, 0x30c, 0x134, 0x356, 0x26c, 0x303, 0x160, 0x237, 0x236, 0x5b, 0x135, 0x13b, 0x302, 0x30d, 0x359, 0x238, 0x262, 0x13a, 0x16f, 0x263, 0x357, 0x1, 0x26d, 0x16e, 0xe, 0x239, 0xf, 0x54, 0x161, 0x5a, 0x358, 0x55, 0x30c, 0x134, 0x356, 0x26c, 0x303, 0x160, 0x237, 0x236, 0x5b, 0x135, 0x13b, 0x302, 0x30d, 0x359, 0x238, 0x262, 0x13a, 0x16f, 0x263, 0x357, 0x1, 0x26d, 0x16e, 0xe, 0x239, 0xf, 0x54, 0x161, 0x5a, 0x358, 0x55, 0x30c, 0x134, 0x356, 0x26c, 0x303, 0x160, 0x237, 0x236, 0x5b, 0x135, 0x13b, 0x302, 0x30d, 0x359, 0x238, 0x262, 0x13a, 0x16f, 0x263, 0x357, 0x1, 0x26d, 0x16e, 0xe, 0x239, 0xf, 0x54, 0x161, 0x5a, 0x358, 0x55, 0x30c, 0x134, 0x356, 0x26c, 0x303, 0x160, 0x237, 0x236, 0x5b, 0x135, 0x13b, 0x302, 0x30d, 0x359, 0x238, 0x262, 0x13a, 0xd3, 0x1b1, 0x70, 0x3d8, 0x1e0, 0x12d, 0x1cc, 0x2a6, 0xd7, 0x2fd, 0x2bd, 0x218, 0x29b, 0x2a4, 0x171, 0x19f, 0x25d, 0x1a1, 0x15b, 0xfe, 0x2e9, 0xda, 0x3f3, 0x52, 0x28, 0xc7, 0x3d6, 0x19b, 0x111, 0x36c, 0x9b, 0x385, 0x160, 0x67, 0xca, 0x2d8, 0x374, 0x321, 0x130, 0x1e9, 0x36f, 0x1ee, 0x156, 0x1f0, 0x6, 0x2ea, 0x1af, 0x120, 0xc2, 0x49, 0x2e7, 0xa1, 0x3cf, 0x2f2, 0x215, 0x395, 0x4b, 0x341, 0x3c3, 0x32f, 0x14b, 0x1d5, 0x1cf, 0x3d3, 0x204, 0x26d, 0x2dc, 0x38, 0x1ec, 0xf0, 0x292, 0xe6, 0x153, 0x26f, 0x37a, 0x35a, 0x10c, 0x349, 0x152, 0x2bc, 0x2cb, 0x32a, 0x2d4, 0x2a9, 0x7f, 0x370, 0x6d, 0x3fd, 0x29, 0x14, 0x267, 0x1eb, 0x2c9, 0x28c, 0x1b6, 0x249, 0x3c6, 0xb0, 0x237, 0x65, 0x16c, 0x1ba, 0x394, 0x98, 0x2f0, 0x3b3, 0xf7, 0xab, 0xf8, 0x3, 0x175, 0x2d3, 0x90, 0x61, 0x220, 0x377, 0x254, 0x3e3, 0x179, 0x30e, 0x1a6, 0x2cd, 0x380, 0x1f7, 0x77, 0x3c2, 0x3f1, 0x3e8, 0x133, 0x138, 0x2f9, 0x3e2, 0x354, 0x2ee, 0x1cf, 0x3af, 0x2, 0x34c, 0x193, 0x309, 0x3ee, 0xee, 0x38d, 0x3eb, 0x3d9, 0x266, 0x270, 0x1fb, 0x3cd, 0x2a1, 0x1d5, 0x39e, 0x357, 0x4, 0x291, 0x326, 0x21b, 0x3d5, 0x1dc, 0x313, 0x3df, 0x3bb, 0xc5, 0xe9, 0x3f6, 0x393, 0x14b, 0x3aa, 0x335, 0x2a7, 0x8, 0x12b, 0x245, 0x3f, 0x3a3, 0x3b8, 0x22f, 0x3b7, 0x37f, 0x18a, 0x1d2, 0x3e5, 0x32f, 0x296, 0x35d, 0x263, 0x147, 0x10, 0x256, 0x83, 0x7e, 0x34f, 0x379, 0x57, 0x367, 0x2f7, 0x314, 0x3a4, 0x3c3, 0x257, 0x125, 0x2b3, 0xcf, 0x28e, 0x20, 0xa5, 0x106, 0xfc, 0x297, 0x2fb, 0xae, 0x2c7, 0x1e7, 0x221, 0x341, 0x38f, 0xa7, 0x24a, 0x16f, 0x19e, 0x115, 0x40, 0x14a, 0x20c, 0x1f8, 0x127, 0x1ff, 0x15c, 0x187, 0x3ce, 0x4b, 0x28b, 0x317, 0x14e, 0x9d, 0x2de, 0x33c, 0x22a, 0x80, 0x294, 0x34c, 0x326, 0x3f, 0x34f, 0x2fb, 0x15c, 0x30e, 0x323, 0x258, 0xea, 0x238, 0x334, 0x20b, 0x306, 0x175, 0x35e, 0x112, 0x76, 0xc1, 0xf9, 0x340, 0x5b, 0x1ba, 0x24b, 0x192, 0x157, 0x85, 0x346, 0x3e1, 0x37c, 0x2c9, 0x222, 0x356, 0x344, 0x170, 0x139, 0x2b7, 0xb5, 0x2a9, 0x1fc, 0x365, 0x376, 0x20e, 0x161, 0x2d0, 0x39d, 0x37a, 0x173, 0xe4, 0x3d4, 0xf4, 0x371, 0x2f8, 0x81, 0x26d, 0x362, 0x380, 0x3ee, 0x1dc, 0x22f, 0x367, 0x1e7, 0x4b, 0x11f, 0x47, 0x262, 0x1c2, 0x366, 0x2ab, 0x36d, 0x120, 0x308, 0x99, 0x9e, 0x68, 0x188, 0x135, 0x1ca, 0x130, 0x3ad, 0x295, 0x36e, 0xfd, 0x26b, 0xd8, 0x146, 0x36c, 0x26c, 0x2e, 0xa6, 0x3d1, 0x293, 0xd4, 0x23b, 0x2e9, 0x368, 0x347, 0xad, 0x5a, 0x2f6, 0x16d, 0x1ad, 0x218, 0x27e, 0x21a, 0xef, 0x5f, 0x91, 0x2c8, 0x16e, 0x70, 0x37b, 0x23f, 0x3c2, 0x3eb, 0x3bb, 0x18a, 0x3a4, 0x38f, 0x14e, 0x291, 0x83, 0x1f8, 0x95, 0x3cf, 0x3bd, 0x69, 0x181, 0x5e, 0x3b3, 0x3b1, 0x29a, 0x39c, 0x6c, 0x146, 0x2d1, 0x1a2, 0x170, 0x272, 0x2ce, 0x1a1, 0x2ca, 0x3f7, 0xc6, 0x1e, 0x292, 0x339, 0x7d, 0x29d, 0x270, 0x3e5, 0xa7, 0x13a, 0x2dd, 0x351, 0x36d, 0x240, 0x3b, 0xc1, 0x1f2, 0x11b, 0x2d8, 0x396, 0x1e2, 0x51, 0x2fa, 0x29, 0xa0, 0xd6, 0x154, 0x2b0, 0x86, 0x13f, 0x21a, 0x1de, 0x17c, 0x81, 0xd3, 0x193, 0x3f, 0x297, 0x3fe, 0x2f2, 0x8c, 0xb1, 0x30d, 0x1f5, 0xf7, 0x151, 0x277, 0x209, 0x32e, 0xdb, 0x136, 0x2e, 0x14c, 0x35f, 0xb5, 0x15b, 0x3f9, 0x31e, 0x305, 0x150, 0xe6, 0x28a, 0x2d6, 0x4e, 0x2f9, 0x393, 0x125, 0x2de, 0xeb, 0x2e8, 0x48, 0x184, 0x99, 0x13c, 0x1a0, 0x5b, 0x374, 0x13e, 0x8b, 0x15d, 0x84, 0x14, 0x31c, 0x22e, 0x56, 0x316, 0x3a0, 0x141, 0x33d, 0x22b, 0x91, 0x199, 0x1b1, 0x380, 0x3d5, 0x379, 0x15c, 0x12b, 0x20c, 0x3db, 0x142, 0x10e, 0x2a3, 0xe5, 0x260, 0x157, 0x214, 0x5, 0x18e, 0x22e, 0xac, 0x43, 0x13f, 0x3d, 0x371, 0x3f2, 0x2, 0x256, 0x11, 0x3bf, 0x284, 0x21c, 0x14f, 0x1ca, 0xc9, 0x2ae, 0x21, 0xa, 0x31c, 0x55, 0x158, 0x86, 0x27e, 0x7a, 0x2eb, 0x3ed, 0x4, 0xa5, 0x22, 0x377, 0x101, 0x31, 0x29e, 0x394, 0x192, 0x155, 0x42, 0x14, 0x231, 0xaa, 0x2b0, 0x10c, 0xf5, 0xf4, 0x1df, 0x3d3, 0x8, 0x14a, 0x44, 0x2e7, 0x202, 0x62, 0x135, 0x321, 0x324, 0x2aa, 0x84, 0x28, 0x6b, 0x154, 0x169, 0x218, 0x1ea, 0x1e8, 0x3be, 0x3af, 0x10, 0x294, 0x88, 0x1c7, 0xd, 0xc4, 0x26a, 0x24b, 0x241, 0x15d, 0x108, 0x50, 0xd6, 0x2a8, 0x2d2, 0x39, 0x3d4, 0x3d0, 0x375, 0x357, 0x20, 0x121, 0x110, 0x38e, 0x1a, 0x188, 0xdd, 0x9f, 0x8b, 0x2ba, 0x210, 0xa0, 0x1ac, 0x159, 0x1ad, 0x72, 0x3a1, 0x3a9, 0x2e3, 0x2a7, 0x40, 0x256, 0x22, 0x2e7, 0xd, 0x188, 0x1ba, 0x27c, 0x51, 0x3fa, 0x290, 0x5a, 0x39d, 0x3e6, 0x6f, 0x3e2, 0x125, 0x36a, 0x2ab, 0x35e, 0x82, 0x1bf, 0x160, 0xfb, 0x293, 0x2a9, 0x3fb, 0xc6, 0x78, 0x17a, 0x3eb, 0x1e7, 0x258, 0x359, 0x33b, 0x151, 0x1ce, 0xd8, 0x222, 0x286, 0x94, 0x171, 0x38c, 0x91, 0x26d, 0x326, 0x1f8, 0x254, 0x87, 0x2a3, 0x1ca, 0x192, 0x2aa, 0x108, 0xa0, 0x358, 0x16d, 0x173, 0x329, 0xd5, 0x3aa, 0x33c, 0x2e8, 0x120, 0x76, 0x201, 0x237, 0xbb, 0x21e, 0x23b, 0x365, 0x386, 0x2a0, 0x339, 0x1f4, 0x18a, 0x11f, 0x238, 0x196, 0x3e0, 0x180, 0x32e, 0x36c, 0x344, 0x392, 0x2cb, 0x191, 0x59, 0x16e, 0x380, 0x34f, 0x3f5, 0x3bd, 0x1a4, 0x26, 0x3ad, 0x85, 0x206, 0x18e, 0x55, 0x2b0, 0x218, 0x3d4, 0x3a9, 0x1cf, 0x28e, 0x200, 0x61, 0x99, 0xf9, 0x236, 0x2ed, 0x23c, 0xdc, 0x368, 0x20e, 0x31a, 0x145, 0x1a5, 0x270, 0x38f, 0xa5, 0x88, 0x315, 0xd0, 0x16c, 0x243, 0x37, 0x1b4, 0x20e, 0x23d, 0x11d, 0x133, 0x341, 0x11c, 0x196, 0x3c9, 0x209, 0x146, 0x2a5, 0x4a, 0x171, 0x311, 0x244, 0x34c, 0x20c, 0x377, 0xd, 0x310, 0x2e1, 0x3c4, 0x119, 0x3a7, 0x161, 0x153, 0x2d6, 0x270, 0x317, 0x19a, 0x7c, 0x60, 0x197, 0x36c, 0x281, 0x253, 0x275, 0x126, 0x332, 0x326, 0x3f0, 0x142, 0x31, 0x26a, 0x13e, 0x51, 0x3fd, 0x252, 0x2d0, 0x1ae, 0x27, 0x3f6, 0x29c, 0x301, 0x6, 0x3de, 0x330, 0x26c, 0x2e0, 0x361, 0x191, 0xb2, 0x1b1, 0x3f, 0x95, 0x247, 0x2a3, 0x394, 0x241, 0x17d, 0xa4, 0x2d, 0x39d, 0x3c5, 0x1bc, 0x32f, 0x274, 0x183, 0x3ba, 0x33, 0x320, 0x2e, 0x272, 0x25d, 0x8a, 0x25f, 0x1c0, 0x34f, 0x3e3, 0x2ef, 0x13b, 0x260, 0x155, 0x108, 0x140, 0x17b, 0x37a, 0x31d, 0x1f1, 0x125, 0x2dd, 0x2be, 0x2c6, 0x32, 0x385, 0xa6, 0x167, 0x28d, 0x1e6, 0x1c, 0x1f7, 0x2fb, 0x14a, 0x220, 0x9e, 0x11b, 0x1d3, 0x1c4, 0x3b6, 0x305, 0x12d, 0x3f1, 0x3ce, 0x2e4, 0x3ea, 0x2df, 0x3e1, 0x343, 0xac, 0x218, 0x34b, 0x2ee, 0x33c, 0x3b2, 0x224, 0x1bf, 0x189, 0x3ab, 0x1a1, 0xf3, 0x1c, 0x3ee, 0x3fe, 0x373, 0x13b, 0xc9, 0x15d, 0x52, 0x2d, 0x333, 0x30f, 0x1fb, 0x29c, 0x20b, 0x18, 0x2cf, 0x36c, 0x10b, 0x15e, 0x38c, 0x244, 0x291, 0x22, 0x38e, 0xd0, 0x2d8, 0x11e, 0x1b8, 0x376, 0x150, 0x27b, 0x3bb, 0x12c, 0x2bb, 0x1ee, 0x27a, 0x2f1, 0x30c, 0x225, 0xf5, 0x3a9, 0x335, 0xba, 0x120, 0x1d8, 0x58, 0xfb, 0x25e, 0x2ca, 0x307, 0x3b9, 0x3b8, 0x2f2, 0xd2, 0x4c, 0x157, 0x84, 0x140, 0x2f6, 0x1f3, 0xde, 0x32f, 0xe1, 0x205, 0x1ef, 0x330, 0xd1, 0x392, 0x33e, 0x126, 0x26d, 0x83, 0x3bf, 0xd, 0x229, 0x396, 0x21f, 0x1b4, 0x15, 0xe6, 0xfa, 0x314, 0xea, 0x399, 0x2a2, 0x26b, 0x336, 0x364, 0x349, 0x7a, 0x375, 0x28e, 0x294, 0x92, 0xf9, 0x194, 0x21e, 0x1fc, 0xc6, 0x3c0, 0x22f, 0x46, 0x302, 0x3ad, 0x21, 0xa0, 0x2f6, 0x3e6, 0x378, 0x14e, 0x20b, 0x30, 0x32e, 0x356, 0x94, 0x39a, 0x2f8, 0x8, 0x8d, 0x99, 0x3c1, 0xbb, 0xd4, 0x3fb, 0x239, 0x23f, 0x15c, 0x230, 0x26, 0x157, 0x108, 0x109, 0x39d, 0x30f, 0x3f6, 0x262, 0x7c, 0x180, 0x146, 0x286, 0xa9, 0xef, 0x3ed, 0x40, 0x61, 0xc1, 0x237, 0x1d1, 0x2a9, 0x3e7, 0x1ec, 0x1dc, 0x2f2, 0x1a4, 0x130, 0x2aa, 0x52, 0x5a, 0xd7, 0x4e, 0x38f, 0x334, 0x3e0, 0x1b, 0x222, 0x1d, 0x141, 0x371, 0x357, 0x200, 0x308, 0x201, 0x19c, 0x293, 0x165, 0x307, 0x37b, 0x2fb, 0x3bd, 0x13b, 0x192, 0x17d, 0x290, 0x2d0, 0x2b1, 0x270, 0x47, 0x196, 0x33f, 0xd8, 0x134, 0xe8, 0x21a, 0x3be, 0x28e, 0x24, 0x76, 0x2c, 0xfb, 0xb5, 0x33a, 0xe, 0x3ee, 0x3f5, 0x1d7, 0x1ca, 0x8b, 0x3fa, 0xad, 0x2ad, 0x1a5, 0x3a4, 0x121, 0x248, 0x3c1, 0x176, 0x350, 0x3e7, 0x3d8, 0x379, 0x3bd, 0x276, 0x241, 0x3fa, 0x15a, 0x2a6, 0x133, 0x23e, 0x399, 0x29a, 0x2f1, 0x2b, 0x218, 0x137, 0x2b3, 0x2ab, 0x185, 0x320, 0x170, 0x19f, 0x24c, 0x34c, 0x44, 0x4f, 0x236, 0x283, 0xfe, 0xc6, 0x389, 0xae, 0x230, 0x4c, 0x155, 0x52, 0xb4, 0x35c, 0x270, 0x8e, 0x251, 0x1ce, 0x19b, 0x2c1, 0x27e, 0x35b, 0x19e, 0x36d, 0x104, 0x385, 0x139, 0x166, 0x164, 0x326, 0x3bf, 0x34, 0x2d8, 0x71, 0x3b6, 0xf, 0x2f4, 0x187, 0x162, 0x1e9, 0x214, 0xa0, 0x1e5, 0x383, 0x3f6, 0xcd, 0x1f0, 0x1b, 0x4d, 0x74, 0x21a, 0x375, 0x22a, 0x120, 0x369, 0x189, 0x2b7, 0x226, 0xb7, 0x3f, 0xa1, 0xc4, 0x1cb, 0x37, 0x1bb, 0x2a0, 0x3fc, 0x395, 0x30d, 0x1a7, 0x103, 0x6b, 0x2da, 0x233, 0x32f, 0x384, 0x18, 0x32e, 0x2a5, 0x250, 0xef, 0x3d3, 0x100, 0x308, 0xb, 0x279, 0xb5, 0x27d, 0x38, 0x34f, 0x242, 0x132, 0x237, 0x34d, 0x2ca, 0xe, 0x3a3, 0x327, 0x135, 0x1e2, 0xda, 0x54, 0xff, 0x3ce, 0x30d, 0x34e, 0x5, 0x358, 0x1f3, 0x2f9, 0x262, 0x1f0, 0x36, 0x134, 0x3a0, 0x1e8, 0x263, 0x3b2, 0x104, 0x303, 0xed, 0x322, 0x26d, 0x11, 0x223, 0x236, 0x10f, 0x3f8, 0x239, 0xee, 0x1ed, 0x13b, 0x241, 0x3fd, 0x161, 0x11d, 0x314, 0x359, 0x3b1, 0x3cb, 0x55, 0x2bd, 0x2fc, 0x13a, 0x3, 0x2cf, 0x356, 0x250, 0x1de, 0x357, 0x12, 0xec, 0x160, 0x35f, 0x226, 0x16e, 0xfc, 0x101, 0x5b, 0x11e, 0x1db, 0xf, 0x1e1, 0x215, 0x302, 0x2af, 0x210, 0x5a, 0x35c, 0xe9, 0x238, 0x2ac, 0xdf, 0x30c, 0x10c, 0x137, 0x16f, 0x2be, 0x33, 0x26c, 0x253, 0x311, 0x1, 0x242, 0x132, 0x237, 0x34d, 0x2ca, 0xe, 0x3a3, 0x327, 0x135, 0x1e2, 0xda, 0x54, 0xff, 0x3ce, 0x30d, 0x34e, 0x5, 0x358, 0x1f3, 0x2f9, 0x262, 0x1f0, 0x36, 0x134, 0x3a0, 0x1e8, 0x263, 0x8d, 0xc1, 0x19c, 0xb5, 0x1e6, 0x380, 0x254, 0x188, 0x243, 0x2e9, 0xf, 0x3c2, 0x46, 0x26, 0x2aa, 0x290, 0x2ad, 0x133, 0xea, 0x1ee, 0x3e1, 0x55, 0x173, 0x3e2, 0x1c2, 0x30, 0x146, 0x1d, 0x21a, 0x1cf, 0x2e8, 0x82, 0x303, 0x1da, 0x93, 0x34c, 0x110, 0xf9, 0xbb, 0x2a9, 0x307, 0x3ee, 0x397, 0x135, 0x3c4, 0x368, 0x2a0, 0x3eb, 0x12e, 0x2f0, 0x21, 0x109, 0xd7, 0x270, 0x238, 0x151, 0x37c, 0x56, 0xe4, 0x2a1, 0x366, 0x1ef, 0x36c, 0x94, 0xef, 0x357, 0x24, 0x3b0, 0x312, 0x195, 0x59, 0x326, 0x2e7, 0x340, 0x345, 0x1fc, 0x239, 0x1dc, 0x3bd, 0x1ca, 0x51, 0x347, 0xe6, 0x3bb, 0x2e4, 0x2d7, 0x206, 0x358, 0x3e6, 0x3f6, 0x334, 0x33f, 0x2c9, 0x18b, 0x3d4, 0x3aa, 0x2ab, 0x21d, 0x26c, 0xaf, 0x5f, 0x8, 0x61, 0x201, 0xfb, 0x1a1, 0x32b, 0x3f, 0x284, 0x5b, 0x23c, 0x365, 0x78, 0x22f, 0x230, 0x130, 0x17d, 0xad, 0x145, 0x18a, 0x11a, 0x304, 0xfb, 0x342, 0xb7, 0x1f8, 0x1a, 0x372, 0x23b, 0x18c, 0xee, 0x3bd, 0x394, 0x144, 0x20e, 0x27b, 0x395, 0x5e, 0x10a, 0x280, 0xd7, 0xe9, 0xf2, 0x29a, 0x3a5, 0x2d2, 0x17e, 0x274, 0x18, 0x146, 0x3a, 0x7a, 0x263, 0x2d3, 0x64, 0x170, 0xe3, 0x204, 0x8d, 0x182, 0x279, 0x1a1, 0x25f, 0xfc, 0xd, 0x1b9, 0x319, 0xc6, 0x77, 0x3da, 0x1ca, 0xa2, 0x107, 0x339, 0x3ce, 0x2f, 0x85, 0x140, 0x26f, 0x270, 0x79, 0x14d, 0x3d6, 0x169, 0xbf, 0x13a, 0xc, 0xa3, 0x1d, 0x3d, 0x335, 0x36d, 0x32, 0xb8, 0x275, 0x102, 0x242, 0xc1, 0x338, 0x2d4, 0x32b, 0x7e, 0x202, 0x2d8, 0x388, 0x63, 0x23f, 0x1ed, 0xe5, 0x51, 0x287, 0x398, 0x1e7, 0x213, 0x246, 0xa0, 0x333, 0x138, 0x238, 0x2a2, 0x1eb, 0x2b0, 0x25b, 0x9d, 0x6, 0x255, 0x20a, 0x21a, 0x39e, 0x3b2, 0x19, 0x5c, 0x33e, 0x81, 0x121, 0x264, 0x19c, 0x16a, 0x391, 0x3f, 0x234, 0xb, 0x3d1, 0x45, 0x2cd, 0x2e7, 0x11b, 0x35, 0x3e7, 0x1f7, 0x327, 0x1ba, 0x6e, 0x305, 0x3c2, 0x118, 0x260, 0x3fa, 0x18d, 0x3e8, 0x2e4, 0x34e, 0x28, 0x39d, 0x138, 0x79, 0x29a, 0x343, 0x35a, 0x3e2, 0x301, 0x300, 0x134, 0x13f, 0x2ee, 0x2ab, 0x66, 0x281, 0x39a, 0x3af, 0x48, 0x1bf, 0x298, 0x322, 0x34c, 0x49, 0x38b, 0x293, 0xf3, 0x309, 0x284, 0x16c, 0x388, 0xc6, 0xee, 0x373, 0x24b, 0x232, 0xa8, 0x3eb, 0xb1, 0x353, 0x52, 0x352, 0x266, 0x359, 0x1b7, 0x31c, 0x37a, 0x1fb, 0x261, 0x1ce, 0x186, 0x39, 0x2a1, 0x183, 0x2cf, 0x286, 0x10d, 0x39e, 0x36d, 0x64, 0x2e0, 0x38c, 0x4, 0xc2, 0x2c, 0x35f, 0x114, 0x326, 0x38e, 0x65, 0xd4, 0x387, 0x3d5, 0x87, 0x2e1, 0x1b8, 0xf, 0x313, 0x69, 0x192, 0x3f3, 0x23d, 0x3bb, 0x382, 0x123, 0xa0, 0x26f, 0xe9, 0x1e4, 0x27a, 0x117, 0x173, 0x393, 0x1f, 0x1b, 0xd9, 0xf5, 0x3aa, 0x61, 0x2c, 0x2b7, 0x59, 0x106, 0x9e, 0xbb, 0x165, 0x70, 0x254, 0x5b, 0x1c4, 0xc6, 0x1dc, 0x1d7, 0x27c, 0x368, 0x12d, 0x30e, 0x26, 0x17d, 0x161, 0x1f4, 0x2e4, 0x295, 0xa0, 0xd7, 0x3a4, 0x33b, 0x3e1, 0x2a8, 0x6f, 0x262, 0x33f, 0x265, 0x218, 0x2a1, 0x306, 0x32e, 0x1d, 0xf4, 0x33c, 0x2c6, 0x26c, 0x171, 0x3ed, 0x24, 0x1bf, 0x139, 0x93, 0x256, 0x99, 0x19c, 0x1a1, 0x16e, 0x3db, 0x340, 0x21e, 0x3e7, 0x3ee, 0x87, 0x1cb, 0x2e9, 0x78, 0x15c, 0x13b, 0x51, 0x20e, 0x1fe, 0x12e, 0x3ad, 0x52, 0x2ad, 0x18a, 0x2fe, 0x346, 0x358, 0x30f, 0x47, 0x151, 0x3d6, 0x1ad, 0x3e2, 0x20b, 0x1b, 0x1b2, 0x3d4, 0x16f, 0x3ba, 0x36c, 0xa9, 0x3be, 0x2e8, 0x19, 0x170, 0x38c, 0x8, 0x308, 0x160, 0x195, 0x2c8, 0x22, 0xf9, 0x1d1, 0x33a, 0x380, 0x284, 0x2d8, 0x23b, 0x239, 0x2fb, 0x2a3, 0x3c4, 0x376, 0x17a, 0x46, 0x130, 0x3fa, 0x31a, 0x3bb, 0xc2, 0xb0, 0x195, 0x199, 0x88, 0x3c1, 0x12f, 0x391, 0x1f8, 0xd0, 0x10f, 0x3e7, 0x3d5, 0x21c, 0x243, 0x2c3, 0x31b, 0x3bd, 0x9f, 0x1b4, 0x12d, 0x215, 0x98, 0x3fa, 0x23d, 0x2f7, 0x5e, 0x42, 0x168, 0x133, 0x2bb, 0x1a3, 0x358, 0x217, 0x11c, 0x29a, 0x117, 0x1c5, 0x14e, 0x3c9, 0x336, 0x218, 0x14b, 0x3, 0x146, 0x1d0, 0x2bf, 0x2ab, 0x198, 0x4a, 0x371, 0xba, 0x208, 0x170, 0x311, 0x20, 0x76, 0x22d, 0x2cc, 0x34c, 0x124, 0xce, 0x1a1, 0x2dc, 0x377, 0x236, 0x1a8, 0x7, 0x24e, 0x310, 0xe2, 0xc6, 0x3b8, 0x355, 0x3c4, 0x2e5, 0x1e1, 0x230, 0x324, 0x3a7, 0x339, 0x24f, 0x3d2, 0x52, 0x153, 0x221, 0x3dd, 0x5, 0x3ca, 0x270, 0x3c8, 0x3f4, 0x2a8, 0xde, 0x19a, 0x1ce, 0x211, 0x390, 0x13a, 0x60, 0x9a, 0x27e, 0x35d, 0x1dd, 0x36c, 0x152, 0x2e3, 0x36d, 0x190, 0x253, 0x2f8, 0x9, 0x2db, 0x139, 0x126, 0x14a, 0xc1, 0x1f6, 0x45, 0x326, 0x184, 0x2c0, 0xb3, 0x1a6, 0x124, 0x19c, 0x28d, 0x2cd, 0x315, 0x259, 0x2ca, 0x380, 0x202, 0x1d3, 0x3fb, 0x1f7, 0x10e, 0x243, 0x18f, 0x77, 0x1d7, 0x1e2, 0x2e5, 0x3c2, 0xd2, 0x116, 0x20e, 0x3f1, 0x2c4, 0x2aa, 0x2b4, 0x3e8, 0x30d, 0x214, 0xb4, 0x133, 0x17f, 0x285, 0x2f6, 0x138, 0x3c8, 0x3e1, 0x2b2, 0x2f9, 0x196, 0x1be, 0x169, 0x3e2, 0x3e, 0x1b0, 0x43, 0x354, 0x205, 0x146, 0x3a0, 0x2ee, 0x175, 0x1b6, 0x152, 0x1cf, 0x1af, 0x9b, 0x171, 0x3af, 0x240, 0x303, 0x33e, 0x2, 0x308, 0x189, 0x166, 0x34c, 0x248, 0x338, 0x113, 0x193, 0x223, 0xbb, 0x19d, 0x309, 0xd, 0x3a6, 0x3ff, 0x3ee, 0x21c, 0x8f, 0x31e, 0xee, 0x3ae, 0x3c4, 0x1c3, 0x38d, 0x1a4, 0x22c, 0x15, 0x3eb, 0x181, 0x15d, 0x161, 0x3d9, 0x213, 0x21, 0x168, 0x266, 0x2fe, 0x103, 0x1e5, 0x270, 0x399, 0x3cb, 0x16d, 0x1fb, 0x32c, 0x37c, 0x2d2, 0x3cd, 0x7c, 0x360, 0x86, 0x2a1, 0x308, 0x312, 0x191, 0x256, 0xc1, 0x3d1, 0x59, 0x22, 0x3c1, 0xb5, 0x16e, 0x2e7, 0x194, 0x165, 0x380, 0xd, 0x345, 0x3e7, 0x34f, 0x188, 0x1c4, 0x239, 0x3f5, 0x1ba, 0x2e9, 0x3c0, 0x3bd, 0x27c, 0x376, 0x3c2, 0x1a4, 0x51, 0x54, 0x367, 0x26, 0x3fa, 0xe6, 0x323, 0x3ad, 0x290, 0x23a, 0x2e4, 0x85, 0x5a, 0x133, 0x2fe, 0x206, 0x39d, 0x3a4, 0x1ee, 0x18e, 0x3e6, 0x47, 0x29a, 0x55, 0x6f, 0x334, 0x26b, 0x2b0, 0x3e2, 0x7c, 0x2c9, 0x218, 0x125, 0x30, 0x134, 0x3d4, 0x36a, 0x363, 0x1d, 0x3a9, 0x2ab, 0x269, 0xa9, 0x1cf, 0x35e, 0x26c, 0x39a, 0x28e, 0x82, 0x170, 0x5f, 0x200, 0x1bf, 0x1da, 0x81, 0x61, 0x160, 0xb3, 0x34c, 0x99, 0xfb, 0x8a, 0x106, 0xf9, 0x293, 0x32b, 0x3db, 0x236, 0x2a9, 0x70, 0x284, 0x2ed, 0x3fb, 0x3ee, 0x31, 0x23c, 0xc6, 0x2fb, 0x135, 0xdc, 0x78, 0x2f2, 0x24b, 0x368, 0x17a, 0x230, 0x8b, 0x20e, 0x3eb, 0x219, 0x53, 0x93, 0x121, 0x16, 0x195, 0xd3, 0x248, 0xfb, 0x114, 0x11, 0x3c1, 0x16a, 0x1b1, 0x315, 0x176, 0xf3, 0x1f8, 0x289, 0x350, 0x70, 0x101, 0x3a6, 0x3e7, 0x297, 0x229, 0x23b, 0x3d8, 0x247, 0x243, 0x235, 0x379, 0x135, 0x1b8, 0x1e0, 0x3bd, 0xf1, 0x1c3, 0x22f, 0x276, 0x232, 0x12d, 0x8c, 0x241, 0x20e, 0x3df, 0x13, 0x3fa, 0x1cc, 0x97, 0x157, 0x15a, 0x3d9, 0x5e, 0x210, 0x2a6, 0x258, 0x123, 0x2d, 0x133, 0x1f5, 0xa, 0xd7, 0x23e, 0x1b7, 0x358, 0x9c, 0x399, 0x337, 0x2fd, 0x227, 0x29a, 0xaa, 0x1bc, 0x196, 0x2f1, 0x2bd, 0x14e, 0x277, 0x2b, 0x17e, 0x1f, 0x360, 0x218, 0x24a, 0xc0, 0x1b2, 0x137, 0x183, 0x146, 0x29b, 0x2b3, 0x1ef, 0x105, 0x3d0, 0x2ab, 0xdb, 0x2a4, 0x263, 0x185, 0x10b, 0x371, 0x1d9, 0x320, 0x171, 0x2a7, 0x41, 0x170, 0xbe, 0x12, 0x1e3, 0x19f, 0x4, 0x76, 0x14c, 0x24c, 0x8d, 0x58, 0x25d, 0x34c, 0x3b, 0x14c, 0x91, 0x234, 0x2c0, 0x191, 0x14a, 0xb, 0x195, 0x1a6, 0x132, 0x3d1, 0x164, 0x220, 0x19c, 0x45, 0x20c, 0x3c1, 0x2d4, 0x2cd, 0x9e, 0x34d, 0x25f, 0x2e7, 0x259, 0x27d, 0x1f8, 0x11b, 0x15b, 0x380, 0x34, 0x35, 0xe, 0x142, 0x1d3, 0x3e7, 0x127, 0xb6, 0x1fc, 0x1f7, 0x62, 0x1c4, 0xf6, 0x327, 0x243, 0x63, 0x1ff, 0x1ba, 0x3b6, 0x77, 0x2a3, 0x6e, 0xf0, 0x3bd, 0x1e2, 0x305, 0x15c, 0x321, 0x2d9, 0x3c2, 0x299, 0x119, 0x12d, 0x118, 0x116, 0x54, 0x187, 0x260, 0x347, 0x3f1, 0x20d, 0x3fa, 0x398, 0x25c, 0x2aa, 0x18d, 0x3ce, 0x3ad, 0x252, 0x3e8, 0x5e, 0x29, 0x28a, 0x2e4, 0x214, 0x1a9, 0x4b, 0x34e, 0x212, 0x133, 0x3ea, 0x28, 0x2b1, 0x3a8, 0x285, 0x39d, 0x28b, 0x2df, 0x358, 0x138, 0x27f, 0x18e, 0x383, 0x79, 0x3e1, 0x1bd, 0x317, 0x29a, 0x154, 0x2f9, 0xab, 0x343, 0x31d, 0x334, 0x1be, 0x35a, 0x14e, 0xe7, 0xac, 0x3e2, 0x76, 0x139, 0x81, 0x308, 0xa6, 0x91, 0x61, 0x312, 0x93, 0x8d, 0x160, 0x191, 0x294, 0x2c, 0xb3, 0x256, 0x201, 0x195, 0x34c, 0xc1, 0x2b7, 0x26d, 0x99, 0x3d1, 0x2c8, 0x92, 0xfb, 0x59, 0x110, 0x19c, 0x8a, 0x22, 0x237, 0x113, 0x106, 0x3c1, 0x1a1, 0x326, 0xf9, 0xb5, 0x362, 0x9e, 0x293, 0x16e, 0x315, 0x1d1, 0x32b, 0x2e7, 0xbb, 0x1e6, 0x3db, 0x194, 0x33a, 0x1f8, 0x236, 0x165, 0x3f, 0x340, 0x2a9, 0x380, 0x68, 0xd4, 0x70, 0xd, 0x21e, 0xe, 0x284, 0x345, 0x307, 0x254, 0x2ed, 0x3e7, 0x24e, 0x2d8, 0x3fb, 0x34f, 0x5b, 0x1fc, 0x3ee, 0x188, 0x23b, 0x37b, 0x31, 0x1c4, 0x1ec, 0x87, 0x23c, 0x239, 0x397, 0x243, 0xc6, 0x3f5, 0x1cb, 0x31e, 0x2fb, 0x1ba, 0x365, 0x1dc, 0x135, 0x2e9, 0x23f, 0x2a3, 0xdc, 0x3c0, 0x1d7, 0x21f, 0x78, 0x3bd, 0x3c4, 0xf, 0x2f2, 0x27c, 0x386, 0x15c, 0x24b, 0x376, 0x22f, 0x1ca, 0x368, 0x3c2, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0xec, 0xed, 0x1, 0x1d8, 0x3b4, 0x8, 0x2db, 0x19f, 0x40, 0x2f5, 0xe3, 0x200, 0x385, 0x311, 0x24, 0x17, 0xbe, 0x120, 0xb8, 0x1f9, 0x112, 0x1c9, 0x3d3, 0x82, 0x253, 0x2a7, 0x19, 0x2bc, 0x115, 0xc8, 0x1cd, 0xba, 0x249, 0x273, 0x1d9, 0x26c, 0x3bc, 0x2d3, 0x344, 0x1df, 0x2b5, 0x216, 0x2e3, 0x185, 0x94, 0x335, 0x33, 0xa9, 0x19e, 0x198, 0x141, 0xeb, 0xdb, 0x21a, 0x351, 0x2d1, 0xf4, 0x2be, 0x2a5, 0x3a9, 0x1dd, 0x105, 0x177, 0x2f3, 0x3a, 0x3aa, 0x3b5, 0x1d0, 0x16f, 0x197, 0x29b, 0x36a, 0xa3, 0xf5, 0x366, 0x111, 0x3a1, 0x306, 0x9a, 0x137, 0x6, 0xd9, 0x1aa, 0x30, 0x2c1, 0x14b, 0x180, 0x225, 0x24a, 0x1b, 0x10c, 0x274, 0xd8, 0x72, 0x384, 0x2c9, 0x390, 0x1f, 0x265, 0xbf, 0xf8, 0x30c, 0x1f1, 0x3c9, 0x56, 0x393, 0x277, 0x2b0, 0xa7, 0x39c, 0x1ad, 0x131, 0xdf, 0x173, 0x19a, 0x2f1, 0x38a, 0xcb, 0x3a5, 0x6f, 0x251, 0x117, 0x378, 0x3b0, 0x2cb, 0x40, 0x1e3, 0x38c, 0x24, 0x2e, 0x2f8, 0x112, 0x392, 0x357, 0x19, 0x171, 0x5d, 0x249, 0xef, 0x36d, 0x344, 0x3be, 0x2c6, 0x94, 0x263, 0xcc, 0x141, 0x1d6, 0x36c, 0xf4, 0x175, 0x286, 0x177, 0x1ef, 0xe8, 0x16f, 0x32e, 0x27e, 0x366, 0x222, 0x29f, 0x6, 0x1b2, 0x2a1, 0x180, 0x43, 0x13a, 0xd8, 0xe4, 0x20b, 0x265, 0x17e, 0x3e0, 0x56, 0x32f, 0x1ce, 0x1ad, 0x262, 0x37c, 0x38a, 0x196, 0x28f, 0x378, 0x151, 0x2a8, 0x38f, 0xfd, 0x37a, 0x238, 0x337, 0x30f, 0x33b, 0x6b, 0x270, 0x36b, 0x2f6, 0x11f, 0x346, 0xd7, 0x359, 0x14, 0x1a5, 0x3dd, 0x109, 0x18a, 0x295, 0x2d0, 0x258, 0x21, 0x145, 0x30d, 0x52, 0x1f4, 0x2f0, 0xad, 0x1e7, 0x157, 0x31a, 0x12e, 0x17d, 0x339, 0x302, 0x3ef, 0x3eb, 0x130, 0x20e, 0x30e, 0x8b, 0x2a0, 0x230, 0x288, 0x17a, 0x13b, 0x368, 0x22f, 0x24b, 0x386, 0x2f2, 0x3c4, 0x78, 0x1d7, 0xdc, 0x23f, 0x369, 0x33e, 0x200, 0x20f, 0x17c, 0x112, 0x32d, 0x147, 0xc8, 0x33d, 0x3b2, 0x344, 0x375, 0x30a, 0xa9, 0x271, 0x1b6, 0xf4, 0x2ea, 0x20a, 0x3aa, 0x2cf, 0x13f, 0x366, 0x4d, 0x26e, 0x30, 0x316, 0x9d, 0xd8, 0x1c8, 0x3e, 0x30c, 0x3cd, 0xe7, 0x1ad, 0xcd, 0x1eb, 0x6f, 0x156, 0x154, 0x38f, 0x1fa, 0x1f3, 0x1e4, 0x31c, 0x138, 0x36b, 0x1e5, 0x75, 0x206, 0x16b, 0x3ea, 0x109, 0x314, 0x246, 0x2ad, 0x1c1, 0x29, 0x1f4, 0x1e9, 0x2b4, 0x323, 0x15d, 0x398, 0x302, 0x3d7, 0x3b7, 0x192, 0xa8, 0x118, 0x288, 0x2f4, 0xe5, 0x376, 0x2b8, 0x1e2, 0x78, 0x3ae, 0x370, 0x1dc, 0x374, 0x63, 0x397, 0x71, 0x3b9, 0x188, 0x3f8, 0x127, 0x2ed, 0x207, 0x202, 0xd4, 0x309, 0x11b, 0x33a, 0x3bf, 0x2ec, 0x16e, 0x13c, 0x2d4, 0x106, 0x67, 0x228, 0x92, 0x3ab, 0x1a6, 0x201, 0x166, 0x242, 0x312, 0x122, 0x3b, 0x1da, 0x10, 0x2f5, 0x38c, 0x48, 0xb8, 0x3ed, 0x2db, 0xe3, 0x24, 0xb8, 0x3d3, 0x19, 0x1cd, 0x1d9, 0x344, 0x2e3, 0x33, 0x141, 0x351, 0x2a5, 0x177, 0x3b5, 0x29b, 0x366, 0x9a, 0x1aa, 0x180, 0x10c, 0x384, 0x265, 0x1f1, 0x277, 0x1ad, 0x19a, 0x3a5, 0x378, 0x14d, 0x2da, 0x238, 0xc7, 0x9c, 0x36b, 0x3ca, 0x1d4, 0x14, 0x29d, 0x1a7, 0x2d0, 0x172, 0x210, 0x1f4, 0x3d2, 0x2c2, 0x12e, 0x1fd, 0x3fc, 0x130, 0x2a, 0x8c, 0x288, 0x1e1, 0x394, 0x386, 0x3da, 0x37, 0x23f, 0xdd, 0x235, 0x397, 0xe2, 0x2ff, 0x5b, 0x3f7, 0xa1, 0x21e, 0x1c0, 0x289, 0x33a, 0x377, 0x3a2, 0x362, 0x3e4, 0x226, 0x110, 0x3ec, 0xd3, 0x201, 0x2cc, 0x11a, 0xa6, 0x204, 0x369, 0x275, 0x12, 0x5c, 0x3ed, 0x208, 0x2e2, 0x2e8, 0x1a2, 0x375, 0x21d, 0x2a4, 0x3ac, 0x356, 0x2bf, 0x3de, 0x349, 0x1b3, 0x4d, 0xd5, 0xc0, 0x86, 0x1c2, 0x336, 0x2fc, 0x33f, 0x2d2, 0xcd, 0x3d6, 0x1bc, 0x2a2, 0x16d, 0x11c, 0x267, 0x4e, 0x1bf, 0x38c, 0x120, 0x392, 0x28e, 0x249, 0x371, 0x2c6, 0xa9, 0x1d6, 0x356, 0x177, 0x363, 0x27e, 0x306, 0x1b2, 0x125, 0xd8, 0x329, 0x3e0, 0x2b0, 0x262, 0x3d6, 0x378, 0x29a, 0x37a, 0x1e4, 0x6b, 0x3a4, 0x346, 0x2b1, 0x3dd, 0x5a, 0x258, 0x108, 0x1f4, 0x3ad, 0x31a, 0x162, 0x3ef, 0x367, 0x8b, 0x12d, 0x13b, 0x376, 0x2f2, 0x21f, 0x23f, 0x1ba, 0xc6, 0x87, 0x23b, 0x34f, 0x2ed, 0xe, 0x68, 0x165, 0x3db, 0x1d1, 0x362, 0x3c1, 0x8a, 0x92, 0x2b7, 0x256, 0x160, 0x91, 0x76, 0x2cb, 0x200, 0x2e, 0x3ed, 0x19, 0x39a, 0x36d, 0x216, 0x263, 0x269, 0xf4, 0x3ba, 0xe8, 0x36a, 0x222, 0xd5, 0x180, 0x218, 0x20b, 0x30c, 0x32f, 0x26b, 0x38a, 0xab, 0x2a8, 0x47, 0x337, 0x4e, 0x36b, 0x39d, 0x359, 0xa0, 0x18a, 0x85, 0x145, 0x5e, 0xad, 0x323, 0x17d, 0x1fe, 0x130, 0x54, 0x230, 0x6d, 0x22f, 0x27c, 0x78, 0x2a3, 0x365, 0x3f5, 0x23c, 0x37b, 0x37e, 0x22b, 0x112, 0x15e, 0x174, 0x344, 0x39e, 0x330, 0xf4, 0x37d, 0x3a0, 0x366, 0x268, 0x296, 0xd8, 0x25b, 0x39b, 0x1ad, 0x261, 0x22e, 0x38f, 0x3cb, 0x27, 0x36b, 0x333, 0x17f, 0x109, 0x96, 0x84, 0x1f4, 0x353, 0x73, 0x302, 0x287, 0x23, 0x288, 0x38d, 0x13e, 0x78, 0x14f, 0x18f, 0x397, 0x388, 0x3a3, 0x2ed, 0x1c, 0x1a0, 0x33a, 0x1c7, 0x25e, 0x106, 0x338, 0x332, 0x201, 0x322, 0x184, 0x1da, 0x80, 0x17, 0x3ed, 0x32, 0x273, 0x35e, 0x128, 0xeb, 0x356, 0x2ee, 0x197, 0x3d4, 0xc, 0x225, 0x1c2, 0xc3, 0x393, 0x26b, 0x31d, 0x2ac, 0x16d, 0x79, 0x231, 0x3a4, 0x285, 0x2d6, 0x2d7, 0x1a9, 0x382, 0x290, 0x3ce, 0x2ba, 0x1fe, 0x260, 0x150, 0x1a4, 0x2d9, 0x179, 0x21f, 0x77, 0x2e1, 0x239, 0x62, 0x3f9, 0x254, 0x35, 0x21b, 0x194, 0x25f, 0x278, 0x113, 0x220, 0x35f, 0x256, 0x2c0, 0x244, 0x3b0, 0xe3, 0x90, 0x392, 0x115, 0x136, 0x3be, 0x2f5, 0xbe, 0x82, 0x1cd, 0x2d3, 0x94, 0xeb, 0x2a5, 0x3aa, 0xa3, 0x137, 0x180, 0x72, 0xf8, 0x2b0, 0x19a, 0x117, 0x38f, 0x39f, 0x9c, 0x36e, 0x35c, 0x3b3, 0x2d0, 0x382, 0x129, 0x323, 0x1fd, 0x3df, 0x8b, 0xbd, 0x394, 0xf, 0x355, 0x2c3, 0x397, 0x319, 0x297, 0x345, 0x1c0, 0x65, 0x32b, 0x278, 0x226, 0x92, 0x2ce, 0x121, 0xa6, 0x4, 0x3c6, 0x2f8, 0x208, 0x33d, 0x35e, 0x250, 0x3ac, 0x286, 0x2b3, 0x28c, 0xd5, 0x209, 0x1c8, 0x3e0, 0x2d2, 0x261, 0x55, 0x227, 0x267, 0x270, 0x1a3, 0x16b, 0x2d7, 0x352, 0x213, 0xad, 0x97, 0x3fd, 0x367, 0x22c, 0x2f4, 0x24b, 0x3c, 0x14f, 0x31e, 0x247, 0x7f, 0x24e, 0x10f, 0x309, 0x194, 0xb7, 0x1f2, 0x8a, 0x248, 0x32a, 0x8d, 0x298, 0x10, 0x303, 0x3f2, 0x32, 0xef, 0x163, 0x152, 0x2ab, 0x20a, 0x2de, 0x222, 0x354, 0x36, 0x329, 0x39b, 0x35a, 0x196, 0x154, 0x8e, 0x18e, 0x1d2, 0x285, 0x1a5, 0x1e3, 0x2f8, 0x19, 0xef, 0x2c6, 0x141, 0x175, 0xe8, 0x366, 0x1b2, 0x13a, 0x265, 0x32f, 0x37c, 0x378, 0xfd, 0x30f, 0x36b, 0xd7, 0x3dd, 0x2d0, 0x30d, 0xad, 0x12e, 0x3ef, 0x30e, 0x288, 0x22f, 0x3c4, 0x23f, 0x1cb, 0x1ec, 0x5b, 0x307, 0x68, 0x33a, 0x315, 0x1a1, 0x110, 0x2b7, 0x294, 0xa6, 0x8, 0x303, 0x3ed, 0xc8, 0x371, 0x21d, 0x21a, 0x3ba, 0x349, 0x306, 0x18b, 0x1c2, 0x30c, 0x14e, 0x3d6, 0x3f6, 0x3e1, 0x4e, 0x36e, 0x2b1, 0x2d7, 0x2ad, 0x5e, 0x161, 0x162, 0x347, 0x46, 0x6d, 0x15c, 0x21f, 0x1dc, 0x243, 0x37b, 0x2d8, 0xe, 0x340, 0x1e6, 0x9e, 0x113, 0x92, 0x195, 0x8d, 0x139, 0x40, 0x2e, 0x357, 0x249, 0x3be, 0xcc, 0xf4, 0x1ef, 0x27e, 0x6, 0x43, 0x20b, 0x56, 0x262, 0x28f, 0x38f, 0x337, 0x270, 0x346, 0x1a5, 0x295, 0x145, 0x2f0, 0x31a, 0x302, 0x20e, 0x230, 0x368, 0x2f2, 0xdc, 0x2fb, 0x23c, 0x3ee, 0x2ed, 0x70, 0x3c6, 0x3f2, 0xc8, 0x2eb, 0x66, 0xf4, 0x3de, 0x1ea, 0x30, 0x39, 0x1f0, 0x1ad, 0x32c, 0x2b2, 0x1e4, 0x2b9, 0x3a8, 0x109, 0xb9, 0x148, 0x323, 0x3fd, 0x187, 0x288, 0x57, 0x30b, 0x1dc, 0x8f, 0x1f7, 0x2ed, 0xe0, 0xca, 0x16e, 0x38b, 0x164, 0x201, 0x126, 0x1d8, 0x38c, 0x224, 0x1cd, 0x35e, 0x152, 0x2be, 0xe8, 0x2c5, 0x2c1, 0x1c2, 0x211, 0x131, 0x28f, 0x317, 0xc7, 0x3a4, 0x5, 0xc5, 0x21, 0x3e8, 0x155, 0x1fe, 0x324, 0xbd, 0x24b, 0xf0, 0xdd, 0x239, 0x310, 0x387, 0x68, 0x27d, 0x4f, 0x113, 0x124, 0x25d, 0x61, 0x3b4, 0x12, 0x392, 0xba, 0x10b, 0x33c, 0x2a5, 0x2b3, 0x222, 0x14b, 0x360, 0x3e2, 0xdf, 0x1bc, 0xfd, 0x217, 0x1b7, 0x2b1, 0x1a7, 0x2a6, 0x2f0, 0x23d, 0x13, 0x54, 0x348, 0x1c3, 0x1d7, 0x2c3, 0x247, 0x1fc, 0xa1, 0x350, 0x3db, 0x12f, 0x11, 0x3d1, 0xa5, 0x53, 0x8, 0x20f, 0x3af, 0x249, 0x375, 0x330, 0x3a9, 0x385, 0x3d3, 0x249, 0x2e3, 0xdb, 0x177, 0xa3, 0x1aa, 0xd8, 0x1f1, 0xdf, 0x378, 0x3f4, 0x9c, 0x346, 0x29d, 0x10a, 0x1f4, 0x155, 0x3fc, 0x8b, 0x1e1, 0xf1, 0x23f, 0x325, 0x2ff, 0x2ed, 0x1c0, 0x328, 0x362, 0xce, 0xd3, 0x160, 0x204, 0x3c6, 0x3ed, 0x320, 0x375, 0x269, 0x2bf, 0x255, 0xd5, 0x6c, 0x2fc, 0x26b, 0x1bc, 0x1fa, 0x4e, 0x1a3, 0x34a, 0x85, 0xfa, 0x2ae, 0x1fe, 0x241, 0x2f4, 0x27c, 0x31b, 0x396, 0x37b, 0x372, 0xe0, 0x194, 0x1b1, 0x67, 0x26d, 0xb0, 0x102, 0x1e3, 0x3f2, 0x190, 0x3be, 0x330, 0x35b, 0x32e, 0x26e, 0x36, 0x17e, 0x331, 0xde, 0xfd, 0x27, 0x2d5, 0x1a5, 0x246, 0x7d, 0x157, 0xff, 0x324, 0x17a, 0x13e, 0x389, 0x1cb, 0x3b9, 0x1b9, 0x70, 0xca, 0x2dc, 0x237, 0x332, 0x58, 0x81, 0x2f5, 0x1f9, 0xc8, 0x1df, 0x198, 0x3a9, 0x197, 0x137, 0x1b, 0xbf, 0x39c, 0x6f, 0x27a, 0x217, 0x36e, 0x2d6, 0x123, 0x23a, 0x303, 0x357, 0x26c, 0x263, 0x356, 0x16f, 0x134, 0x13a, 0x30c, 0x262, 0x55, 0x238, 0x358, 0x359, 0x5a, 0x30d, 0x161, 0x302, 0x54, 0x13b, 0xf, 0x135, 0x239, 0x5b, 0xe, 0x236, 0x16e, 0x237, 0x26d, 0x160, 0x1, 0x303, 0x357, 0x26c, 0x263, 0x356, 0x16f, 0x134, 0x13a, 0x30c, 0x262, 0x55, 0x238, 0x358, 0x359, 0x5a, 0x30d, 0x161, 0x302, 0x54, 0x13b, 0xf, 0x135, 0x239, 0x5b, 0xe, 0x236, 0x16e, 0x237, 0x26d, 0x160, 0x1, 0x303, 0x357, 0x26c, 0x263, 0x356, 0x16f, 0x134, 0x13a, 0x30c, 0x262, 0x55, 0x238, 0x358, 0x359, 0x5a, 0x30d, 0x161, 0x302, 0x54, 0x13b, 0xf, 0x135, 0x239, 0x5b, 0xe, 0x236, 0x16e, 0x237, 0x26d, 0x160, 0x1, 0x303, 0x357, 0x26c, 0x263, 0x356, 0x16f, 0x134, 0x13a, 0x30c, 0x262, 0x55, 0x238, 0x358, 0x359, 0x5a, 0x30d, 0x161, 0x302, 0x54, 0x13b, 0xf, 0x135, 0x239, 0x5b, 0xe, 0x236, 0x16e, 0x20f, 0x147, 0x344, 0x271, 0x20a, 0x366, 0x316, 0x3e, 0x1ad, 0x156, 0x1f3, 0x36b, 0x16b, 0x246, 0x1f4, 0x15d, 0x3b7, 0x288, 0x2b8, 0x370, 0x397, 0x3f8, 0x202, 0x33a, 0x13c, 0x228, 0x201, 0x122, 0x2f5, 0x3ed, 0x9b, 0x335, 0x356, 0x2de, 0xd9, 0x1c2, 0xac, 0xcb, 0x16d, 0x27f, 0x26f, 0x2d7, 0x28a, 0x2af, 0x1fe, 0x116, 0x313, 0x21f, 0x1ff, 0x319, 0x254, 0x15b, 0x38e, 0x113, 0x132, 0x24d, 0x3b0, 0xbe, 0x64, 0x3be, 0xdb, 0x1d5, 0x222, 0x24a, 0x186, 0x262, 0xaa, 0xf2, 0x2f6, 0x1f5, 0x352, 0x2f0, 0x1cc, 0xc9, 0x17a, 0xf1, 0xee, 0x23c, 0x297, 0x6a, 0x3db, 0x16a, 0x49, 0xb3, 0x219, 0x1c6, 0x82, 0x1de, 0x66, 0x3a9, 0x255, 0x354, 0x2c9, 0x257, 0x343, 0x47, 0xd6, 0x3a8, 0x5a, 0x213, 0x18d, 0x26, 0x149, 0x321, 0x3c0, 0x396, 0x1f7, 0x345, 0x7e, 0x34d, 0x22, 0x167, 0x234, 0x2cb, 0x240, 0x1cd, 0x2c6, 0x3d, 0x3b5, 0x29f, 0x17, 0x115, 0x216, 0x351, 0x1d0, 0x6, 0x72, 0x277, 0x6f, 0x3f4, 0xe9, 0x14, 0x12c, 0x129, 0x162, 0x2a, 0x276, 0x78, 0x2e1, 0x2ff, 0x345, 0xfc, 0x12f, 0x110, 0x25d, 0x219, 0x38c, 0x208, 0x2eb, 0x269, 0x1d5, 0x4d, 0x13a, 0x2b, 0x261, 0x16d, 0xf7, 0x1ae, 0x295, 0xfa, 0x15d, 0x367, 0x232, 0x1ed, 0x365, 0x21c, 0x3c7, 0x340, 0xb7, 0x67, 0x34c, 0x53, 0x80, 0x392, 0x3b2, 0x152, 0x3ba, 0x1ea, 0x300, 0x17e, 0x1be, 0x3e5, 0x18e, 0x75, 0x212, 0x30d, 0x18d, 0x4c, 0x12d, 0x13e, 0x77, 0x23c, 0x127, 0x1a8, 0x2e7, 0x28d, 0x132, 0x93, 0x2db, 0x1f9, 0x249, 0x335, 0x2a5, 0x36a, 0x2c1, 0x1f, 0x1ad, 0x2ac, 0x3c5, 0x36e, 0x29d, 0x42, 0x1e7, 0x3f3, 0x8c, 0x376, 0x355, 0x18c, 0x5b, 0x38, 0x328, 0x326, 0x3ec, 0x121, 0x1da, 0x90, 0x2e2, 0x2c6, 0x7a, 0x2cf, 0xd5, 0x360, 0x257, 0x28f, 0x11c, 0x2b9, 0x2fe, 0x352, 0x1e9, 0x339, 0x2e, 0x5d, 0x94, 0x175, 0x27e, 0x180, 0x17e, 0x37c, 0x38f, 0x6b, 0x359, 0x2d0, 0x2f0, 0x339, 0x8b, 0x22f, 0xdc, 0x397, 0x3fb, 0x68, 0x32b, 0x237, 0x34c, 0xa6, 0x200, 0xaf, 0x35e, 0x21a, 0x363, 0xd5, 0x2c9, 0x14e, 0x55, 0x1e4, 0x39d, 0x2d7, 0x23a, 0x2aa, 0x367, 0x6d, 0x3bd, 0x31e, 0x188, 0xe, 0x194, 0x326, 0x3d1, 0x8d, 0x2cb, 0x112, 0xef, 0xcc, 0x177, 0x222, 0x13a, 0x56, 0x196, 0x37a, 0x36b, 0x1a5, 0x21, 0x1e7, 0x3ef, 0x230, 0x386, 0x135, 0x1ec, 0x2ed, 0x3f, 0x293, 0x110, 0xb3, 0x76, 0x5f, 0xc8, 0x1cf, 0x356, 0x36a, 0x18b, 0x7c, 0x173, 0x29a, 0x4e, 0x206, 0x4b, 0x290, 0x162, 0x54, 0x1ca, 0x3c0, 0x243, 0x34f, 0xd4, 0x2e7, 0x113, 0xc1, 0x91, 0x1e3, 0x357, 0x344, 0x1d6, 0xe8, 0x6, 0xe4, 0x1ce, 0x378, 0x337, 0x11f, 0x109, 0x30d, 0x31a, 0x130, 0x17a, 0x3c4, 0x2fb, 0x23b, 0x284, 0x33a, 0xf9, 0x2c8, 0x5c, 0x174, 0xa9, 0x37d, 0x34b, 0xd8, 0x257, 0x22e, 0x1e4, 0x333, 0x34e, 0x1f4, 0x2fa, 0x23, 0x376, 0x14f, 0xf6, 0x2ed, 0x7e, 0x25e, 0x92, 0x322, 0x2db, 0x3ed, 0xd1, 0xeb, 0xe8, 0xc, 0x390, 0x26b, 0x3e5, 0x231, 0x359, 0x1a9, 0x3d2, 0x1fe, 0xa2, 0x179, 0x365, 0x62, 0x7, 0x194, 0x245, 0x35f, 0x61, 0xe3, 0x208, 0x3be, 0x2d1, 0x1b5, 0x18b, 0xf8, 0x1c5, 0xfd, 0xe9, 0x50, 0x2e4, 0x2c2, 0x98, 0x17a, 0x381, 0x3fe, 0x1fc, 0x1a, 0x391, 0x237, 0x291, 0x298, 0x24, 0x2e2, 0x30a, 0x3a9, 0x28c, 0x9d, 0x56, 0x32c, 0x1f3, 0x36e, 0x266, 0x29, 0x12e, 0x15, 0xe5, 0x3c0, 0x8f, 0x127, 0x2a9, 0x223, 0x228, 0x2c, 0x2, 0xb8, 0x2e8, 0x152, 0x2f3, 0x29f, 0x1b0, 0xa7, 0x55, 0x3c8, 0x26f, 0x295, 0x3e8, 0x1fd, 0x46, 0x2e5, 0x29e, 0x1ec, 0x1d3, 0xfc, 0xb5, 0x124, 0x24d, 0x1bf, 0x3d3, 0x1a2, 0x1d6, 0x1d0, 0x18, 0x329, 0xb8, 0x1d9, 0x141, 0x3b5, 0x1aa, 0x265, 0x19a, 0x2da, 0x36b, 0x29d, 0x210, 0x12e, 0x2a, 0x394, 0x23f, 0xe2, 0xa1, 0x33a, 0x3e4, 0xd3, 0xa6, 0x12, 0x2e2, 0x21d, 0x2bf, 0x4d, 0x1c2, 0x2d2, 0x2a2, 0x4e, 0xa, 0xb9, 0x161, 0x98, 0x2f4, 0x21f, 0x3cf, 0x3ff, 0x340, 0x1b1, 0x1f6, 0x8d, 0x33e, 0x104, 0x3be, 0x1ab, 0x2dd, 0x43, 0x39b, 0xde, 0x337, 0x75, 0xb4, 0x2f0, 0xff, 0xa2, 0x2f2, 0x18f, 0x310, 0x70, 0x2ec, 0x44, 0xb3, 0x1d8, 0x1f9, 0x26c, 0xeb, 0x1d0, 0x30, 0xbf, 0x2f1, 0x47, 0x17b, 0x3b3, 0x23a, 0x2ba, 0x215, 0x376, 0x29e, 0x3d8, 0x345, 0x3e9, 0x342, 0xc1, 0x244, 0x20f, 0x5d, 0x250, 0x37d, 0x29f, 0x360, 0x29c, 0x2a8, 0xf7, 0x16b, 0x21, 0x395, 0x287, 0x13b, 0x1e0, 0x8f, 0x24e, 0x2b6, 0x13c, 0x2c8, 0x189, 0x80, 0xaf, 0x163, 0x1e8, 0x146, 0x9d, 0xac, 0xab, 0x383, 0x285, 0x4b, 0x252, 0x20d, 0x12d, 0x170, 0x36d, 0x21a, 0x32e, 0x125, 0x56, 0xab, 0x30f, 0x206, 0x258, 0x161, 0x130, 0x3c2, 0xdc, 0x87, 0x307, 0x194, 0x106, 0x195, 0x76, 0x2f8, 0x26c, 0x1d6, 0x349, 0x180, 0x3e2, 0x28f, 0x1e4, 0xd7, 0x85, 0x1e7, 0x347, 0x13b, 0x3c0, 0x23c, 0x254, 0x33a, 0x3c1, 0x34c, 0x139, 0x120, 0xef, 0x269, 0x16f, 0x18b, 0x3e0, 0x6f, 0x337, 0xea, 0x2d0, 0x3ad, 0x3eb, 0x6d, 0x1d7, 0x239, 0x2ed, 0x1f8, 0x1a1, 0xc1, 0x81, 0x2e, 0x2e8, 0x141, 0x363, 0x2a1, 0x30c, 0x196, 0x3e6, 0x346, 0x4b, 0xad, 0x26, 0x17a, 0x21f, 0x397, 0x3e7, 0x236, 0x326, 0x2b7, 0x308, 0x5f, 0x249, 0x33c, 0xe8, 0x30, 0x17e, 0x3d6, 0x238, 0x39d, 0x295, 0x3bb, 0x3ef, 0x1a4, 0x78, 0x243, 0x24e, 0x165, 0xf9, 0x26d, 0xa6, 0x24, 0x39a, 0xcc, 0x3aa, 0x1b2, 0x7c, 0x38a, 0x3e1, 0x11f, 0x5a, 0x2f0, 0x1fe, 0x288, 0x3bd, 0xc6, 0x2d8, 0x3f, 0xb5, 0x99, 0x91, 0x2e0, 0x1af, 0xf4, 0x28c, 0xe1, 0x1ad, 0x13d, 0x1d2, 0x109, 0xbc, 0xff, 0x288, 0x373, 0x318, 0x2ed, 0x3f0, 0x28d, 0x201, 0x2, 0x1c9, 0x35e, 0x1e8, 0x111, 0x1c2, 0x35a, 0x27a, 0x3a4, 0x212, 0x178, 0x1fe, 0x119, 0x2ef, 0x239, 0x1d3, 0x3e9, 0x113, 0xb, 0x4, 0x392, 0x2b5, 0x3d0, 0x222, 0x384, 0x2bd, 0xfd, 0x341, 0x2d, 0x2f0, 0x3fc, 0x232, 0x1d7, 0x7b, 0x3a6, 0x3db, 0x226, 0x16, 0x8, 0x32d, 0x163, 0x3a9, 0x4d, 0x301, 0x173, 0x1fa, 0x28b, 0x5a, 0x1e9, 0x3f1, 0x6d, 0x3ae, 0xf6, 0x345, 0x3bf, 0x45, 0x2c, 0x10, 0x253, 0x2c6, 0x35b, 0x9a, 0x20b, 0x2e6, 0x3f4, 0x11f, 0xb4, 0x3d2, 0x3eb, 0xda, 0x355, 0x1ec, 0x283, 0x377, 0x8a, 0x58, 0x20, 0xaf, 0x185, 0x2bf, 0x134, 0x1f, 0x1c5, 0x3e1, 0x23e, 0x168, 0x3ad, 0x3df, 0x1b4, 0x2a3, 0x3d8, 0x10f, 0x2e7, 0x114, 0xb0, 0x40, 0x15e, 0x30a, 0x177, 0x268, 0x3e, 0x38a, 0x1c9, 0x2b5, 0x3a9, 0x9a, 0x1f, 0x38a, 0x39f, 0x1d4, 0x2ad, 0x155, 0x215, 0x386, 0x2e1, 0x297, 0x165, 0x3e4, 0x291, 0x1da, 0x41, 0x375, 0x286, 0x3, 0x25b, 0x3d6, 0xf2, 0x1ae, 0x21, 0x97, 0xa8, 0x27c, 0x3fe, 0x3ff, 0x236, 0x83, 0x32a, 0x3b0, 0x3af, 0x25, 0x3ba, 0x26e, 0xc3, 0x196, 0x383, 0x5, 0x2e4, 0x73, 0x116, 0x2f2, 0x63, 0x1b9, 0x1f8, 0x28d, 0xb, 0x8, 0x253, 0x185, 0x177, 0xd9, 0xf8, 0x6f, 0xc7, 0x2bb, 0x145, 0x2ba, 0x8c, 0xf, 0x325, 0x95, 0x33a, 0x31f, 0xa5, 0x2cb, 0x208, 0x39e, 0x1d, 0x18, 0x2fc, 0x28f, 0x399, 0x16b, 0x108, 0xb1, 0x149, 0x3c4, 0x3cf, 0x3c7, 0x194, 0x11, 0x166, 0x1bf, 0x147, 0x128, 0x1ef, 0x354, 0x211, 0xab, 0x27, 0x28, 0x30d, 0x398, 0xa2, 0x3bd, 0x318, 0x1d3, 0x3db, 0x45, 0x58, 0x40, 0x2bc, 0x33, 0x3aa, 0x2c1, 0x3c9, 0x378, 0x231, 0x1f5, 0x23a, 0x1fd, 0x69, 0x78, 0x392, 0x2c6, 0x177, 0x1b2, 0x3e0, 0x378, 0x6b, 0x3dd, 0x1f4, 0x3ef, 0x13b, 0x23f, 0x23b, 0x68, 0x362, 0x2b7, 0x76, 0x3ed, 0x216, 0x3ba, 0xd5, 0x30c, 0xab, 0x4e, 0xa0, 0x5e, 0x1fe, 0x6d, 0x2a3, 0x37b, 0xd4, 0x9e, 0x26d, 0x139, 0x112, 0x3be, 0x286, 0x6, 0x17e, 0x28f, 0x33b, 0x1a5, 0x52, 0x302, 0x17a, 0xdc, 0x31, 0x70, 0x293, 0x99, 0x81, 0x170, 0x35e, 0x3a9, 0x134, 0x7c, 0x6f, 0x18e, 0x2fe, 0x23a, 0x3fa, 0x1a4, 0x3c0, 0x1c4, 0xd, 0x16e, 0x3d1, 0x308, 0x2f8, 0x344, 0x175, 0x29f, 0x265, 0x196, 0x30f, 0x14, 0x30d, 0x339, 0x288, 0x1d7, 0x1ec, 0x21e, 0x315, 0x2c8, 0xa6, 0x120, 0x371, 0x356, 0x306, 0x329, 0x3d6, 0x1e4, 0x2b1, 0x108, 0x162, 0x12d, 0x21f, 0x87, 0xe, 0x1d1, 0x92, 0x91, 0x2e, 0x36d, 0xf4, 0x222, 0x20b, 0x38a, 0x337, 0x359, 0x145, 0x17d, 0x230, 0x78, 0x23c, 0x284, 0x32b, 0xfb, 0x61, 0x5f, 0x32d, 0x30a, 0x3aa, 0x316, 0xe7, 0x38f, 0x1e5, 0x246, 0x323, 0xa8, 0x1e2, 0x397, 0x207, 0x2ec, 0x92, 0x122, 0xb8, 0x35e, 0x35b, 0xd9, 0x3e0, 0x2f9, 0x1ac, 0x2d7, 0x37f, 0x107, 0x24b, 0x1ff, 0x3f7, 0x194, 0x44, 0x24d, 0x303, 0x1d9, 0x7a, 0x222, 0x1f, 0x233, 0x18e, 0x1f5, 0xfa, 0x3ef, 0x276, 0xee, 0x1fc, 0x289, 0x83, 0xb3, 0x37e, 0x22a, 0x141, 0x255, 0xe1, 0x173, 0x3cb, 0x3a8, 0x145, 0x2fa, 0xd2, 0x3c0, 0x388, 0x34, 0x362, 0x167, 0x1d8, 0x357, 0x128, 0x3b5, 0x125, 0x169, 0x27a, 0x11f, 0x1a9, 0x155, 0x46, 0x1e, 0x11e, 0x284, 0x25f, 0x3ec, 0x308, 0x1f9, 0x10b, 0x3ba, 0x1aa, 0x2b, 0x151, 0xe9, 0x2d, 0x3ad, 0x2c7, 0x1c3, 0x1cb, 0x95, 0xf3, 0x19c, 0x11a, 0x22b, 0x26c, 0x15f, 0x34b, 0x265, 0x32c, 0x27, 0xa0, 0xbc, 0x3f1, 0x368, 0x26a, 0x3a3, 0x165, 0x38b, 0x14a, 0x275, 0x190, 0xeb, 0x27e, 0x1b0, 0x19a, 0x3e6, 0x253, 0x33, 0x16f, 0x10c, 0xdf, 0x238, 0x35c, 0x210, 0x302, 0x1e1, 0x1db, 0x5b, 0xfc, 0x226, 0x160, 0x12, 0x1de, 0x356, 0x3, 0x2fc, 0x55, 0x3b1, 0x314, 0x161, 0x241, 0x1ed, 0x239, 0x10f, 0x223, 0x26d, 0xed, 0x104, 0x263, 0x3a0, 0x36, 0x262, 0x1f3, 0x5, 0x30d, 0xff, 0xda, 0x135, 0x3a3, 0x2ca, 0x237, 0x242, 0x311, 0x26c, 0x2be, 0x137, 0x30c, 0x2ac, 0xe9, 0x5a, 0x2af, 0x215, 0xf, 0x11e, 0x101, 0x16e, 0x35f, 0xec, 0x357, 0x250, 0x2cf, 0x13a, 0x2bd, 0x3cb, 0x359, 0x11d, 0x3fd, 0x13b, 0xee, 0x3f8, 0x236, 0x11, 0x322, 0x303, 0x3b2, 0x1e8, 0x134, 0x1f0, 0x2f9, 0x358, 0x34e, 0x3ce, 0x54, 0x1e2, 0x327, 0xe, 0x34d, 0x132, 0x1, 0x253, 0x33, 0x16f, 0x10c, 0xdf, 0x238, 0x35c, 0x210, 0x302, 0x1e1, 0x1db, 0x5b, 0xfc, 0x226, 0x160, 0x12, 0x1de, 0x356, 0x3, 0x2fc, 0x55, 0x3b1, 0x314, 0x161, 0x241, 0x1ed, 0x239, 0xaf, 0xcc, 0x36a, 0xe4, 0x3d6, 0x33b, 0x133, 0xad, 0x192, 0x2f2, 0x239, 0x21e, 0x9e, 0x34c, 0x2cb, 0xc8, 0x1d6, 0x3d4, 0x265, 0xab, 0x270, 0x5a, 0x157, 0x46, 0x78, 0x1c4, 0x68, 0x326, 0xb3, 0x1e3, 0x2e8, 0xf4, 0x134, 0x3e0, 0x3f6, 0x2f6, 0x85, 0x12e, 0x12d, 0xdc, 0x188, 0x3f, 0x113, 0x160, 0x24, 0x371, 0x286, 0x30, 0x32f, 0x16d, 0x346, 0x2e4, 0x339, 0x6d, 0x135, 0x34f, 0x33a, 0x19c, 0x61, 0x2f8, 0x216, 0x1ef, 0x125, 0x1ad, 0x3e1, 0x359, 0x23a, 0x3ef, 0x1ca, 0x2fb, 0x3e7, 0xbb, 0x92, 0x81, 0x392, 0x21d, 0x16f, 0x218, 0x37c, 0x1e4, 0x1a5, 0x290, 0x130, 0x15c, 0xc6, 0x345, 0x315, 0x26d, 0x1da, 0x19, 0x33c, 0x27e, 0x2c9, 0x196, 0x4e, 0x109, 0x3ad, 0x30e, 0xf, 0x23c, 0xd, 0x362, 0x195, 0x1bf, 0x5d, 0x21a, 0x222, 0x7c, 0x378, 0x358, 0x295, 0x323, 0x2a0, 0x21f, 0x31, 0x380, 0x1a1, 0x2c, 0x200, 0xef, 0x15e, 0x330, 0x366, 0x25b, 0x22e, 0x36b, 0x96, 0x73, 0x288, 0x14f, 0x3a3, 0x33a, 0x338, 0x184, 0x3ed, 0x128, 0x197, 0x1c2, 0x31d, 0x231, 0x2d7, 0x3ce, 0x150, 0x21f, 0x62, 0x21b, 0x113, 0x2c0, 0x90, 0x3be, 0x3a, 0x209, 0x262, 0x3c5, 0x50, 0x2f0, 0x2c7, 0x203, 0x23c, 0x1a, 0x193, 0xb3, 0x3c6, 0x3b2, 0x3a9, 0x364, 0xe7, 0x47, 0x1ae, 0x29, 0x26, 0x57, 0x63, 0x345, 0x223, 0x1a6, 0x2cb, 0x190, 0x351, 0x29f, 0x211, 0x14d, 0x11f, 0x153, 0x1fd, 0x13b, 0x3b8, 0x3f7, 0xbb, 0x124, 0x204, 0xaf, 0x198, 0x1b3, 0x329, 0x117, 0x3b1, 0x4b, 0x23d, 0x144, 0x2a3, 0x3d5, 0x19d, 0x19c, 0xc2, 0x3f2, 0x94, 0x2cf, 0xe1, 0x38a, 0x31c, 0x36f, 0x1e7, 0xa8, 0x30b, 0x31, 0x309, 0x28d, 0x160, 0x48, 0x1df, 0x1d, 0x300, 0x131, 0x3e6, 0x28, 0x178, 0x367, 0x305, 0x11e, 0xd, 0x2cd, 0x25d, 0x1e3, 0x1d9, 0x3d0, 0x1b2, 0x277, 0x227, 0xd7, 0x2bc, 0xdb, 0x306, 0x1f1, 0x159, 0x346, 0x382, 0x3fc, 0x376, 0x325, 0x101, 0x362, 0x25d, 0x3c6, 0x36d, 0x2bf, 0x316, 0x26b, 0xf2, 0x34a, 0xad, 0x241, 0x373, 0x37b, 0x2b6, 0x67, 0x61, 0x3f2, 0x128, 0x32e, 0x301, 0xde, 0x358, 0x246, 0x25c, 0x17a, 0x3b6, 0x1b9, 0x2e7, 0x332, 0x3b4, 0xc8, 0x351, 0x137, 0x56, 0x27a, 0x1d4, 0x23a, 0x3a7, 0x9f, 0x397, 0x38, 0x16a, 0x2c, 0x12, 0x2eb, 0x1d, 0x209, 0xcd, 0x30f, 0x280, 0x353, 0x46, 0x1e0, 0x7f, 0x236, 0x88, 0x122, 0x392, 0x66, 0x2dd, 0x329, 0x22e, 0x2df, 0x258, 0x398, 0xda, 0x1ba, 0x12a, 0x25f, 0x2b7, 0x2db, 0xba, 0xf4, 0xd9, 0x277, 0x47, 0x35c, 0xa4, 0x130, 0x179, 0x7b, 0xd4, 0x3e4, 0x121, 0x5f, 0x10b, 0x3de, 0x13a, 0x1c5, 0x31c, 0x2d7, 0x395, 0x149, 0xdc, 0x229, 0x3f0, 0x59, 0x298, 0x104, 0x33c, 0x1ea, 0xc3, 0x151, 0x28b, 0x153, 0x3fa, 0xe5, 0x1ff, 0x307, 0x171, 0x36c, 0x6, 0x32f, 0x37a, 0x14, 0x2f0, 0x30e, 0x78, 0x23b, 0x236, 0x110, 0x81, 0xaf, 0x269, 0x306, 0x3e2, 0x16d, 0x206, 0x5e, 0x367, 0xf, 0x1c4, 0x340, 0x22, 0x91, 0x392, 0xcc, 0x366, 0x17e, 0x2a8, 0x346, 0x30d, 0x3eb, 0x386, 0x23c, 0x68, 0x106, 0x93, 0x170, 0x21d, 0x36a, 0x329, 0x55, 0x36e, 0x2e4, 0x1fe, 0x376, 0x243, 0xd, 0x326, 0x191, 0x2e, 0x2c6, 0x16f, 0xe4, 0x28f, 0x36b, 0x258, 0x339, 0x368, 0x1cb, 0x284, 0x362, 0xb3, 0x303, 0x35e, 0x3aa, 0x218, 0x3d6, 0x1ee, 0x4b, 0xe6, 0x6d, 0x1ba, 0x254, 0x16e, 0x195, 0x1e3, 0x36d, 0x177, 0x43, 0x37c, 0x33b, 0x18a, 0x31a, 0x288, 0x135, 0x24e, 0x32b, 0x2b7, 0x1bf, 0x2e8, 0x3a9, 0x18b, 0x26b, 0x1e4, 0x133, 0x161, 0x51, 0x2a3, 0x34f, 0x1e6, 0x3d1, 0x3b0, 0x5d, 0xf4, 0x1b2, 0x1ce, 0x238, 0x1a5, 0xad, 0x8b, 0x1d7, 0x3ee, 0x33a, 0xfb, 0x76, 0x28e, 0x21a, 0x2e2, 0x1ab, 0x30, 0x29c, 0x383, 0x109, 0x2ae, 0xd2, 0x1dc, 0x3c7, 0x34d, 0x201, 0x9, 0x1df, 0xe8, 0x1b0, 0x251, 0x3a4, 0x153, 0x3f3, 0x24b, 0x327, 0x1c0, 0x113, 0x22d, 0x41, 0x33c, 0x3a1, 0x2b, 0xfd, 0x2bb, 0x3d9, 0x54, 0x37, 0x229, 0x3db, 0x199, 0x361, 0x249, 0x2ea, 0x296, 0x173, 0x31c, 0x34e, 0x12e, 0x2f4, 0x18f, 0x345, 0x13c, 0x14a, 0x5f, 0x25, 0x197, 0x20b, 0x2f9, 0x3ca, 0x108, 0x4c, 0x179, 0x1ec, 0x15b, 0xce, 0x308, 0x2a7, 0x10d, 0x134, 0x277, 0x11c, 0x1a5, 0x15a, 0x22c, 0x2a3, 0x297, 0x391, 0x2b7, 0x37e, 0x3b2, 0x177, 0x86, 0x1eb, 0x1ee, 0x96, 0x398, 0x368, 0x396, 0x202, 0x326, 0x322, 0xb8, 0x21d, 0x2dd, 0xbf, 0x2a8, 0x285, 0x2f, 0x367, 0x1e, 0x319, 0x236, 0x220, 0x204, 0x171, 0x2d1, 0x18, 0x14e, 0x3c5, 0x280, 0x157, 0x69, 0xee, 0x3e7, 0x3a2, 0x304, 0x200, 0x2eb, 0x74, 0xd8, 0x32c, 0x1d2, 0x2ad, 0x1cd, 0x2a5, 0x180, 0x19a, 0x9c, 0x2d0, 0x1fd, 0x394, 0x397, 0x1c0, 0x226, 0xa6, 0x208, 0x3ac, 0xd5, 0x2d2, 0x267, 0x2d7, 0x97, 0x2f4, 0x31e, 0x10f, 0x1f2, 0x8d, 0x3f2, 0x152, 0x222, 0x39b, 0x8e, 0x1a5, 0x2b4, 0xa2, 0x135, 0x12a, 0x2dc, 0xb3, 0x17, 0x185, 0x36a, 0xbf, 0x159, 0x206, 0x178, 0x215, 0x3c0, 0x3f9, 0x176, 0xc1, 0x100, 0x2eb, 0xe8, 0x360, 0x156, 0x11f, 0x11d, 0x287, 0x3c4, 0xc4, 0x3f0, 0x2c8, 0x361, 0x9b, 0x3ba, 0x9d, 0x31d, 0x358, 0x214, 0x20d, 0x15c, 0xf6, 0x15b, 0x19c, 0x3b, 0x115, 0xf4, 0x2c1, 0xdf, 0x33b, 0x221, 0x1cc, 0x368, 0x325, 0x1a, 0x106, 0x24c, 0x32d, 0x269, 0x3, 0x257, 0x3e6, 0x280, 0x2ae, 0x1a4, 0x379, 0x207, 0xb5, 0xb0, 0x240, 0x263, 0x1ea, 0x211, 0xfd, 0x17f, 0x37f, 0x2a0, 0x370, 0x1b9, 0x315, 0x12b, 0x311, 0x216, 0x197, 0x1f, 0x3f6, 0x26f, 0xa4, 0x192, 0x2ef, 0x3d5, 0x1e6, 0x39a, 0x286, 0x1b, 0x196, 0x3a4, 0x145, 0x347, 0x3c4, 0x188, 0x3db, 0x26d, 0x275, 0x344, 0x363, 0x20b, 0x3f6, 0xd7, 0x290, 0x8b, 0x2a3, 0x24e, 0x16e, 0xb3, 0x2e, 0x21d, 0x366, 0x3e2, 0x37a, 0xa0, 0x157, 0x1a4, 0x2fb, 0xe, 0x1a1, 0x312, 0x82, 0x1d6, 0xd5, 0x1ad, 0x18e, 0x295, 0x162, 0x22f, 0x239, 0x2a9, 0x19c, 0x76, 0x5d, 0x3a9, 0x43, 0x3d6, 0x36b, 0x2e4, 0x3eb, 0xf, 0x23b, 0x194, 0x99, 0x40, 0x371, 0xe8, 0x2c9, 0x151, 0xea, 0x1f4, 0x54, 0xdc, 0x2d8, 0x315, 0x256, 0x5f, 0x94, 0x146, 0x3e0, 0x47, 0x1a5, 0x161, 0x288, 0x1ba, 0x284, 0x326, 0x93, 0x392, 0x269, 0x6, 0x14e, 0x30f, 0x5a, 0x17d, 0x1ca, 0x397, 0x380, 0x8a, 0x139, 0xc8, 0x175, 0x125, 0x38a, 0x358, 0x21, 0x26, 0x2f2, 0x37b, 0x33a, 0x3d1, 0x1bf, 0x36d, 0x3aa, 0xe4, 0x55, 0x346, 0x5e, 0x30e, 0x3c0, 0x3fb, 0x1d1, 0x201, 0x24, 0x1cf, 0x27e, 0x33d, 0x20a, 0xd8, 0x156, 0x75, 0x1f4, 0xa8, 0x370, 0x2ed, 0x13c, 0x242, 0x3ed, 0x282, 0xd9, 0x26b, 0x27f, 0x12c, 0x1fe, 0x305, 0x319, 0x194, 0x132, 0x100, 0x3be, 0x29b, 0x186, 0xfd, 0x1f5, 0x395, 0x17a, 0x235, 0x6a, 0x237, 0x219, 0x22a, 0x3a9, 0x86, 0x343, 0x36e, 0x213, 0x187, 0x3c0, 0x3ff, 0x34d, 0x2c, 0x240, 0x19e, 0x29f, 0x169, 0xc7, 0x295, 0x2c4, 0xae, 0x1ec, 0x2ca, 0x3ec, 0x1bf, 0x2d3, 0x2b3, 0x329, 0x159, 0xa, 0x3ad, 0x69, 0x379, 0xe, 0x342, 0x53, 0x19, 0x15f, 0x296, 0x38a, 0x2b9, 0x84, 0x130, 0x373, 0x3a3, 0x32b, 0x32a, 0x17, 0x21d, 0x2c5, 0x393, 0x3e6, 0x212, 0x2ba, 0x1ca, 0x327, 0x21b, 0x59, 0x3b4, 0x136, 0x1ef, 0x384, 0x1fb, 0xd7, 0x129, 0x22c, 0x135, 0xa1, 0x193, 0x93, 0x32d, 0x1b6, 0x30, 0xcd, 0x138, 0x2ad, 0x3d7, 0x1e2, 0x188, 0x3bf, 0x1a6, 0x38c, 0x25, 0xa3, 0x3e0, 0x8e, 0x29d, 0x31a, 0x273, 0x3a, 0x2c9, 0x14d, 0x2bb, 0x1e7, 0xbd, 0x235, 0xd4, 0xce, 0xec, 0x2e8, 0x1d5, 0x1c8, 0x2a8, 0xa, 0x353, 0x1a4, 0x3fe, 0xe0, 0x8a, 0xed, 0x9b, 0x1ef, 0x301, 0x3e5, 0x2b1, 0x2b4, 0x119, 0x1cb, 0x34, 0x44, 0x1, 0x273, 0x3a, 0x2c9, 0x14d, 0x2bb, 0x1e7, 0xbd, 0x235, 0xd4, 0xce, 0xec, 0x2e8, 0x1d5, 0x1c8, 0x2a8, 0xa, 0x353, 0x1a4, 0x3fe, 0xe0, 0x8a, 0xed, 0x9b, 0x1ef, 0x301, 0x3e5, 0x2b1, 0x2b4, 0x119, 0x1cb, 0x34, 0x44, 0x1, 0x273, 0x3a, 0x2c9, 0x14d, 0x2bb, 0x1e7, 0xbd, 0x235, 0xd4, 0xce, 0xec, 0x2e8, 0x1d5, 0x1c8, 0x2a8, 0xa, 0x353, 0x1a4, 0x3fe, 0xe0, 0x8a, 0xed, 0x9b, 0x1ef, 0x301, 0x3e5, 0x2b1, 0x2b4, 0x119, 0x1cb, 0x34, 0x44, 0x1, 0x273, 0x3a, 0x2c9, 0x14d, 0x2bb, 0x1e7, 0xbd, 0x235, 0xd4, 0xce, 0xec, 0x2e8, 0x1d5, 0x1c8, 0x2a8, 0xa, 0x353, 0x1a4, 0x3fe, 0xe0, 0x8a, 0xef, 0xe8, 0x265, 0xfd, 0x3dd, 0x12e, 0x22f, 0x1ec, 0x33a, 0x2b7, 0x303, 0x21d, 0x306, 0x14e, 0x4e, 0x2ad, 0x347, 0x21f, 0x2d8, 0x9e, 0x8d, 0x357, 0xf4, 0x43, 0x28f, 0x346, 0x2f0, 0x230, 0x2fb, 0x70, 0x8a, 0x1da, 0x26c, 0x363, 0x7c, 0x47, 0x133, 0xe6, 0x376, 0x1c4, 0x194, 0xc1, 0x24, 0x263, 0x29f, 0x1ad, 0x6b, 0x21, 0x130, 0x1d7, 0x24e, 0x362, 0x93, 0xaf, 0x356, 0x1b, 0xab, 0xea, 0x3bb, 0x12d, 0x31e, 0xd4, 0x19c, 0x3b0, 0x36d, 0x16f, 0x17e, 0x37a, 0x109, 0x17d, 0x24b, 0x31, 0x3db, 0x34c, 0x5f, 0xa9, 0x134, 0x26b, 0x1ee, 0x2e4, 0x367, 0x3c0, 0x3e7, 0xb5, 0x312, 0x19, 0x175, 0x13a, 0x378, 0xd7, 0xad, 0x288, 0x1cb, 0x68, 0x110, 0x8, 0x371, 0x349, 0x30c, 0x3e1, 0x2d7, 0x162, 0x15c, 0x37b, 0x1e6, 0x195, 0x2e, 0xcc, 0x6, 0x262, 0x270, 0x145, 0x20e, 0xdc, 0x2ed, 0xf9, 0x61, 0x28e, 0x3a9, 0x218, 0x1de, 0x3a0, 0x30c, 0x3cb, 0x34e, 0x302, 0x1ed, 0x3a3, 0x16e, 0x322, 0x253, 0x356, 0x36, 0x2ac, 0x359, 0x3ce, 0x1e1, 0x239, 0x2ca, 0x35f, 0x303, 0x33, 0x3, 0x262, 0xe9, 0x11d, 0x54, 0x1db, 0x10f, 0x237, 0xec, 0x3b2, 0x16f, 0x2fc, 0x1f3, 0x5a, 0x3fd, 0x1e2, 0x5b, 0x223, 0x242, 0x357, 0x1e8, 0x10c, 0x55, 0x5, 0x2af, 0x13b, 0x327, 0xfc, 0x26d, 0x311, 0x250, 0x134, 0xdf, 0x3b1, 0x30d, 0x215, 0xee, 0xe, 0x226, 0xed, 0x26c, 0x2cf, 0x1f0, 0x238, 0x314, 0xff, 0xf, 0x3f8, 0x34d, 0x160, 0x104, 0x2be, 0x13a, 0x2f9, 0x35c, 0x161, 0xda, 0x11e, 0x236, 0x132, 0x12, 0x263, 0x137, 0x2bd, 0x358, 0x210, 0x241, 0x135, 0x101, 0x11, 0x1, 0x1de, 0x3a0, 0x30c, 0x3cb, 0x34e, 0x302, 0x1ed, 0x3a3, 0x16e, 0x322, 0x253, 0x356, 0x36, 0x2ac, 0x359, 0x3ce, 0x1e1, 0x239, 0x2ca, 0x35f, 0x303, 0x33, 0x3, 0x262, 0xe9, 0x11d, 0x54, 0x3bc, 0x29b, 0x56, 0xc7, 0x10a, 0x130, 0x355, 0xa1, 0x106, 0x204, 0x1de, 0x349, 0x2b, 0x267, 0x85, 0x98, 0x3ae, 0x254, 0x83, 0x102, 0xef, 0x3a0, 0x211, 0x337, 0x246, 0x4c, 0x1d7, 0x12a, 0x245, 0x81, 0x273, 0x1d0, 0x30c, 0x39f, 0x123, 0x26, 0x2ef, 0x95, 0x326, 0x244, 0x33d, 0xe8, 0x186, 0x3cb, 0x295, 0x13, 0x373, 0x24e, 0x193, 0x122, 0x39a, 0x74, 0xc3, 0x3e1, 0x34e, 0x20d, 0x3bd, 0x127, 0x2cd, 0x91, 0x1cd, 0x3a, 0x265, 0x3f4, 0x1a7, 0x302, 0x3da, 0x297, 0x362, 0x24c, 0x2e2, 0x1d, 0x336, 0x1fa, 0x2d7, 0x181, 0x1ed, 0x34f, 0x1b1, 0x126, 0x171, 0x20a, 0x19b, 0xfd, 0x36f, 0x2c4, 0x2f2, 0x3a3, 0x2dc, 0x93, 0x2bc, 0x105, 0x2c9, 0x27a, 0x3b3, 0x162, 0x179, 0x3d5, 0x16e, 0x24d, 0x15e, 0x286, 0x360, 0x13d, 0x3dd, 0xb1, 0x2b8, 0x3ee, 0xb7, 0x322, 0xaf, 0x143, 0x1b0, 0x29a, 0x3ea, 0x25c, 0x15c, 0x1f7, 0x25f, 0x191, 0x371, 0x27e, 0x2b0, 0x6b, 0x108, 0x8b, 0x1ba, 0x68, 0x92, 0x200, 0x263, 0xd5, 0x38a, 0x39d, 0xad, 0x6d, 0x23c, 0x194, 0x201, 0x112, 0x2ab, 0x13a, 0x3f6, 0x1a5, 0xe6, 0x386, 0x1fc, 0x293, 0x312, 0xc8, 0x1ef, 0x7c, 0x238, 0x4b, 0x3eb, 0x3c0, 0x307, 0x113, 0x1da, 0x344, 0x146, 0x1ce, 0x1ee, 0x30d, 0x46, 0x2fb, 0x380, 0x2c8, 0x38c, 0xa9, 0x1b2, 0x3d6, 0x346, 0x3ad, 0x13b, 0x87, 0x3db, 0x256, 0x3ed, 0xf4, 0x218, 0x2a8, 0xa0, 0x17d, 0x27c, 0x5b, 0x9e, 0x61, 0x5d, 0x3aa, 0x17e, 0x3e6, 0x2d0, 0x347, 0xdc, 0x345, 0x237, 0x3b0, 0x35e, 0x366, 0x14e, 0x270, 0x23a, 0x2a0, 0x31e, 0x2a9, 0x3d1, 0x303, 0xcc, 0x30, 0x196, 0xea, 0x1e7, 0x3c2, 0x1ec, 0x1e6, 0xb3, 0x392, 0x356, 0xd8, 0x29a, 0x3dd, 0x162, 0x2f2, 0x34f, 0x362, 0x91, 0x39a, 0xe8, 0x30c, 0x337, 0x85, 0x130, 0x2a3, 0x284, 0x22, 0x8, 0x3be, 0x3d4, 0x1ad, 0x2eb, 0x1ea, 0x1ad, 0x2b9, 0x148, 0x288, 0x8f, 0xca, 0x201, 0x224, 0x2be, 0x1c2, 0x317, 0xc5, 0x1fe, 0xf0, 0x387, 0x113, 0x3b4, 0x10b, 0x222, 0xdf, 0x1b7, 0x2f0, 0x348, 0x247, 0x3db, 0xa5, 0x3af, 0x3a9, 0x1c8, 0x1bd, 0x5a, 0x3d7, 0x6e, 0x345, 0x67, 0x2db, 0x2c6, 0x205, 0x19a, 0x11f, 0x37f, 0x1e1, 0x1ec, 0x3cc, 0x2cc, 0xaf, 0x105, 0x336, 0x3e1, 0x123, 0x98, 0x2a3, 0x101, 0x88, 0x40, 0x39e, 0x26e, 0x38a, 0x333, 0x2b4, 0x368, 0x388, 0x2ec, 0x160, 0x32, 0x2f3, 0x7c, 0x79, 0x12c, 0x367, 0x77, 0x38, 0x59, 0xe3, 0x250, 0x1b2, 0x3a5, 0x103, 0x157, 0x394, 0xc4, 0x315, 0x11a, 0x22a, 0x3aa, 0x2fc, 0x383, 0x2ad, 0x15, 0x3b6, 0xd4, 0x1f6, 0x385, 0xcc, 0x60, 0x251, 0x359, 0x24f, 0xae, 0x3ee, 0x2dc, 0x24c, 0x39a, 0x1d0, 0x2b, 0x18e, 0x42, 0x241, 0x1ba, 0xd0, 0x248, 0x24, 0x271, 0x296, 0x378, 0x16b, 0x73, 0x386, 0x1df, 0x3a1, 0x173, 0x3ca, 0x15a, 0x368, 0x319, 0x3a2, 0x312, 0x320, 0x2cf, 0x33f, 0xf7, 0x213, 0x230, 0x3cf, 0x3f0, 0x256, 0x3af, 0x35b, 0x329, 0x1f3, 0x1a9, 0x20e, 0x3b6, 0x1a8, 0x3d1, 0x17, 0xdb, 0x1b, 0x14d, 0x3b3, 0x302, 0x2ef, 0xa1, 0x22, 0x20, 0x39e, 0xd5, 0x233, 0x1ae, 0x31a, 0x1c3, 0x3f8, 0xb5, 0x298, 0xd1, 0x146, 0x331, 0x2df, 0x2f0, 0x299, 0x10e, 0x2e7, 0x242, 0x115, 0x3aa, 0x1f1, 0x217, 0x145, 0x150, 0x235, 0x165, 0x2ce, 0x2e0, 0x356, 0x360, 0x1fa, 0x295, 0x98, 0x14f, 0xd, 0x49, 0x9, 0x33c, 0x296, 0x2f9, 0x1a5, 0x398, 0x1e, 0x3e7, 0x28d, 0x3b4, 0x216, 0x9a, 0x2f1, 0x346, 0x2af, 0x394, 0x188, 0x4f, 0xc2, 0x2e8, 0x1b5, 0x257, 0x270, 0xfa, 0x25a, 0x239, 0xf3, 0x166, 0xaf, 0x20a, 0xc3, 0x337, 0x214, 0x324, 0x1ba, 0x1a0, 0x132, 0x120, 0x351, 0x274, 0x38f, 0xc5, 0x3fc, 0x3c0, 0x7, 0x114, 0x275, 0x3be, 0x29f, 0x38a, 0xd7, 0x31a, 0x386, 0x3fb, 0x1a1, 0x1da, 0x216, 0x134, 0x3d6, 0x206, 0x2aa, 0x27c, 0x2d8, 0x3c1, 0x3b0, 0x2c6, 0x6, 0x196, 0x359, 0x12e, 0x2f2, 0x24e, 0x106, 0x8, 0x1cf, 0xd5, 0x6f, 0x2b1, 0xe6, 0xf, 0x3e7, 0x113, 0x2cb, 0x94, 0x1b2, 0x28f, 0x14, 0x17d, 0x3c4, 0x2ed, 0x237, 0x1bf, 0x21d, 0x30, 0xab, 0x2fe, 0x162, 0x3bd, 0x254, 0x22, 0x40, 0x263, 0x2a1, 0x378, 0x1a5, 0x339, 0x78, 0x307, 0x8a, 0x275, 0xa9, 0x18b, 0x55, 0xa0, 0x3fa, 0x21f, 0x345, 0x19c, 0x1e3, 0xcc, 0x180, 0x151, 0x3dd, 0x302, 0x1d7, 0x284, 0x110, 0x200, 0x33c, 0x125, 0x3f6, 0x133, 0x1fe, 0x3c0, 0xe, 0x59, 0x38c, 0x141, 0x43, 0x2a8, 0x109, 0x3ef, 0xdc, 0x21e, 0xfb, 0x303, 0x269, 0x1b, 0x29a, 0x2d7, 0x26, 0x2a3, 0xd, 0x92, 0x24, 0x1d6, 0x13a, 0x38f, 0x18a, 0x3eb, 0x23f, 0x70, 0x2c8, 0x5f, 0x21a, 0x218, 0x16d, 0x375, 0x26e, 0x6f, 0x16b, 0x398, 0x78, 0x207, 0x228, 0x38c, 0x282, 0x10c, 0x16d, 0xb4, 0x107, 0x365, 0x15b, 0x2ce, 0x392, 0x105, 0x186, 0x18e, 0x210, 0x144, 0x23c, 0x176, 0x189, 0x249, 0x255, 0x331, 0x36e, 0x353, 0x321, 0x5b, 0x1f2, 0x1d8, 0x2c6, 0xc, 0x251, 0x2fe, 0x2c4, 0x2ef, 0x284, 0x220, 0x12, 0x1d6, 0x274, 0x227, 0x4b, 0x2c7, 0x379, 0x3f, 0x291, 0x3af, 0x177, 0x2fc, 0x27, 0x23a, 0x25a, 0xf6, 0x32b, 0x126, 0x273, 0x27e, 0x35a, 0x3ca, 0x161, 0x2e5, 0x3f9, 0x1a1, 0x3b4, 0x4a, 0x1b2, 0x117, 0x50, 0x3fa, 0x37, 0x10f, 0xfb, 0x20f, 0x1b6, 0xd8, 0x1fa, 0x246, 0x192, 0x374, 0x11b, 0x201, 0x104, 0x2f3, 0x3e0, 0x27f, 0x2f, 0x1a4, 0x10e, 0x38e, 0x61, 0x1d9, 0x1b3, 0x262, 0x23e, 0x395, 0x15c, 0x297, 0x83, 0x8, 0x39e, 0x354, 0x378, 0x34a, 0xff, 0x3c0, 0x1c, 0x164, 0x5f, 0x3d, 0x72, 0x37a, 0x1a9, 0x2a, 0x31e, 0x2e3, 0x1aa, 0x378, 0x29d, 0x3fc, 0x23f, 0x1c0, 0xd3, 0x3ed, 0x2bf, 0x2fc, 0x4e, 0xfa, 0x2f4, 0x37b, 0x1b1, 0x102, 0x3be, 0x26e, 0xde, 0x1a5, 0xff, 0x389, 0x70, 0x332, 0x1f9, 0x3a9, 0xbf, 0x217, 0x23a, 0xbd, 0x3d8, 0x16e, 0x244, 0x2eb, 0x29f, 0x233, 0x16b, 0x339, 0x1e0, 0x1c, 0x2c8, 0x17c, 0x1e8, 0x329, 0x383, 0x28a, 0x12d, 0xf6, 0x25f, 0x91, 0x3bc, 0x3a1, 0x38a, 0x35c, 0x1cc, 0x78, 0x7, 0xb2, 0x5f, 0x7a, 0x1c8, 0x3e6, 0x2a6, 0x149, 0x239, 0x391, 0x126, 0xef, 0x1ea, 0x2e6, 0xd7, 0x73, 0x1e, 0x307, 0x228, 0x311, 0x21a, 0x72, 0x2fd, 0x2ad, 0x150, 0x18c, 0x1e6, 0x24d, 0x33d, 0x27e, 0x2bd, 0x333, 0x31a, 0x203, 0x3c7, 0x8a, 0x1c6, 0x282, 0x218, 0x1bd, 0x1a9, 0x54, 0x63, 0x27d, 0x191, 0x1cd, 0x29b, 0x1ad, 0x3ca, 0x2c2, 0x386, 0x3f7, 0x226, 0x275, 0x2a4, 0x86, 0x16d, 0x168, 0x15, 0x31e, 0x19d, 0x166, 0x171, 0x1cf, 0x2a1, 0x3f6, 0x18a, 0x367, 0x2fb, 0x1f8, 0x294, 0x5d, 0x36a, 0x262, 0xea, 0x12e, 0x3bd, 0x284, 0x92, 0x120, 0x175, 0x7c, 0x33b, 0x5e, 0x13b, 0x188, 0xf9, 0x3b0, 0x21d, 0x180, 0x29a, 0x295, 0x192, 0x1cb, 0x194, 0x160, 0x249, 0x146, 0x37c, 0x206, 0x17d, 0x21f, 0x21e, 0x3d1, 0x170, 0x286, 0x30c, 0x6b, 0x290, 0x368, 0x1fc, 0x1a1, 0x2cb, 0xa9, 0x43, 0x16d, 0x2d0, 0x54, 0xc6, 0x1e6, 0x93, 0xef, 0x3d4, 0x38a, 0x2b1, 0x339, 0x3c0, 0x70, 0x26d, 0x3ed, 0x177, 0x3e2, 0x270, 0x3bb, 0x22f, 0x34f, 0x106, 0x40, 0x33c, 0x13a, 0x47, 0x258, 0x46, 0x397, 0x2e7, 0x61, 0x36d, 0x306, 0x196, 0x2fe, 0x302, 0x2a3, 0x68, 0xc1, 0x82, 0x1ef, 0x33f, 0x36b, 0x3ad, 0x24b, 0x2d8, 0x237, 0x1e3, 0x269, 0xd8, 0x3e1, 0x21, 0x51, 0x23c, 0x1d1, 0xa6, 0x344, 0x134, 0x28f, 0xa0, 0x3ef, 0x2e9, 0x2a9, 0x195, 0xaf, 0xe8, 0x2b0, 0x2f6, 0x39e, 0x296, 0x38f, 0x96, 0x23, 0x397, 0x1c7, 0x184, 0x35e, 0xc, 0x2ac, 0x2d7, 0x260, 0x2e1, 0x194, 0x2c0, 0x136, 0x222, 0x3a5, 0x50, 0x3ef, 0x1db, 0x2b6, 0xb3, 0x2e2, 0x13f, 0x173, 0x1ae, 0x398, 0x3c0, 0xe0, 0x1a6, 0x357, 0x35d, 0xa7, 0x11f, 0x24f, 0x3da, 0x284, 0x124, 0x89, 0x3ba, 0x3c9, 0x3b1, 0x3ad, 0x9f, 0x372, 0x19c, 0x20f, 0x1ab, 0x265, 0x31c, 0x148, 0x368, 0x3f8, 0x28d, 0x275, 0x282, 0x72, 0x3e6, 0x28a, 0xbd, 0x37b, 0x2cd, 0x4, 0x263, 0x24a, 0x227, 0x258, 0x8c, 0x247, 0x315, 0x219, 0x163, 0x30, 0x2a2, 0x34e, 0x192, 0x396, 0x259, 0x312, 0xd1, 0x9a, 0x28f, 0x140, 0x3a7, 0x365, 0x2ca, 0x2cc, 0x39a, 0xf5, 0x1c5, 0x2b1, 0x27b, 0x31b, 0x380, 0x291, 0x147, 0x16f, 0x29c, 0x75, 0x12e, 0x373, 0x202, 0x99, 0x224, 0x2f3, 0x33f, 0x2df, 0x2af, 0x27c, 0x1d3, 0x279, 0x2e, 0x2a5, 0x186, 0x6b, 0x129, 0x1bb, 0x3fb, 0x335, 0x24a, 0x47, 0x172, 0x69, 0x31, 0x278, 0x369, 0xcc, 0x6c, 0x3cb, 0x108, 0x232, 0x7f, 0x1a1, 0x33e, 0x282, 0xe4, 0x383, 0x7d, 0x3c2, 0x3a3, 0x20c, 0x200, 0x351, 0x1f, 0x33b, 0x178, 0x394, 0x2d8, 0xce, 0x20f, 0x356, 0x186, 0xd6, 0xad, 0x1c3, 0x3c7, 0x59, 0x17c, 0x35b, 0x3e2, 0x1d2, 0x3ce, 0x2f2, 0x142, 0x124, 0x112, 0x2f3, 0x277, 0x36e, 0x155, 0x381, 0x21e, 0x35f, 0x32d, 0xe8, 0x2d2, 0x333, 0xe6, 0x1e0, 0xe0, 0x34c, 0x147, 0x2de, 0x262, 0x3a8, 0x2c4, 0x2a3, 0x1a0, 0xb, 0xc8, 0xa3, 0x2f1, 0x14, 0x3f3, 0x1db, 0x165, 0x2cc, 0x33d, 0x3d4, 0x233, 0x34a, 0x3eb, 0x379, 0x3f0, 0x8d, 0x3b2, 0x205, 0xab, 0x36f, 0x260, 0x1cb, 0x259, 0x22d, 0x344, 0xd9, 0xaa, 0x5a, 0x2a, 0x18c, 0x32b, 0x244, 0x375, 0x2a1, 0x3c3, 0x96, 0x46, 0x247, 0x223, 0x76, 0x30a, 0x300, 0xfd, 0x214, 0xa2, 0x1c4, 0x25e, 0x3b4, 0xa9, 0x263, 0x13a, 0x238, 0x30d, 0x13b, 0x5b, 0x237, 0x303, 0x356, 0x30c, 0x358, 0x161, 0xf, 0xe, 0x26d, 0x357, 0x16f, 0x262, 0x359, 0x302, 0x135, 0x236, 0x160, 0x26c, 0x134, 0x55, 0x5a, 0x54, 0x239, 0x16e, 0x1, 0x263, 0x13a, 0x238, 0x30d, 0x13b, 0x5b, 0x237, 0x303, 0x356, 0x30c, 0x358, 0x161, 0xf, 0xe, 0x26d, 0x357, 0x16f, 0x262, 0x359, 0x302, 0x135, 0x236, 0x160, 0x26c, 0x134, 0x55, 0x5a, 0x54, 0x239, 0x16e, 0x1, 0x263, 0x13a, 0x238, 0x30d, 0x13b, 0x5b, 0x237, 0x303, 0x356, 0x30c, 0x358, 0x161, 0xf, 0xe, 0x26d, 0x357, 0x16f, 0x262, 0x359, 0x302, 0x135, 0x236, 0x160, 0x26c, 0x134, 0x55, 0x5a, 0x54, 0x239, 0x16e, 0x1, 0x263, 0x13a, 0x238, 0x30d, 0x13b, 0x5b, 0x237, 0x303, 0x356, 0x30c, 0x358, 0x161, 0xf, 0xe, 0x26d, 0x357, 0x16f, 0x262, 0x359, 0x302, 0x135, 0x236, 0x160, 0x26c, 0x134, 0x55, 0x5a, 0xcf, 0xe1, 0x1e4, 0xbc, 0x321, 0x2ed, 0x1f6, 0x1c9, 0xe8, 0x35a, 0x35c, 0x1fe, 0x3b8, 0x3e9, 0x61, 0x2b5, 0xc0, 0xfd, 0x42, 0x232, 0x1fc, 0x226, 0x22b, 0x3a9, 0x3cd, 0x28b, 0x12e, 0x3ae, 0x1a0, 0x2c, 0x9b, 0x9a, 0x55, 0xb4, 0x150, 0x1ec, 0x2cd, 0x20, 0x1d6, 0x1f, 0xf7, 0x3ad, 0xf1, 0x10f, 0x2b7, 0x15e, 0x13f, 0x38a, 0x34a, 0x3b7, 0x3f5, 0x1c7, 0x3b, 0x21d, 0x36, 0x39f, 0x52, 0x2d9, 0x3f7, 0x59, 0x1f9, 0x1d5, 0x14e, 0x1d4, 0x181, 0x135, 0x65, 0x189, 0x344, 0x364, 0x2b2, 0x2ad, 0x25a, 0x1f7, 0x106, 0x9, 0x2be, 0x3e0, 0x2df, 0x155, 0x21f, 0x1a8, 0x25d, 0x39a, 0x3a1, 0x1bc, 0x18a, 0x215, 0x247, 0x9e, 0x369, 0x330, 0x2c9, 0x31c, 0x252, 0x386, 0x207, 0x332, 0x357, 0x2de, 0x19a, 0x2fe, 0x4c, 0x2e1, 0xbb, 0x14c, 0x4a, 0x43, 0x2fd, 0x11d, 0x3c2, 0x297, 0x88, 0x120, 0x37d, 0xe7, 0x346, 0x2fa, 0x370, 0x165, 0x19e, 0x384, 0x33b, 0x3d2, 0xf1, 0x21e, 0x2ce, 0x2e2, 0x3d4, 0x1bc, 0x314, 0x46, 0x21c, 0x1f2, 0x1e3, 0x1ab, 0x211, 0x2f6, 0x73, 0x389, 0x3f, 0x242, 0x2d3, 0x30, 0x27a, 0x42, 0x6d, 0x3f9, 0x114, 0x2f8, 0x1d5, 0x29c, 0x359, 0x13, 0x374, 0xbb, 0x298, 0x128, 0x218, 0x383, 0x3e8, 0x15c, 0x142, 0x132, 0x19, 0xa3, 0x3a5, 0x109, 0x2a, 0x7b, 0x362, 0x20, 0x3ac, 0x7c, 0x3b1, 0x2ae, 0x21f, 0x350, 0x166, 0xef, 0x26e, 0x3e5, 0x258, 0xd2, 0x310, 0x237, 0x17, 0x105, 0x2b0, 0x26f, 0x27b, 0x1dc, 0x3e9, 0xc2, 0x2c6, 0x209, 0x3cb, 0x52, 0x1bb, 0x3c7, 0x2c8, 0x3af, 0x2de, 0x334, 0x3ea, 0x260, 0x243, 0x34d, 0x3b4, 0x141, 0x390, 0x9c, 0x1e7, 0x3da, 0x1a, 0x201, 0x320, 0x4d, 0x55, 0x168, 0x149, 0x37b, 0x83, 0x9, 0x175, 0x39b, 0x2d5, 0x17d, 0x370, 0x2ca, 0x93, 0x1df, 0x14b, 0x47, 0x382, 0x276, 0x2d8, 0x279, 0x2e0, 0xe8, 0x33c, 0x20b, 0x1ee, 0x157, 0x21f, 0x2a9, 0x191, 0x371, 0x2a1, 0x47, 0x30d, 0x1ca, 0x2ed, 0x3d1, 0xaf, 0x27e, 0x6f, 0x18a, 0x46, 0x31, 0x3c1, 0x303, 0x286, 0x2b0, 0xd7, 0x1fe, 0x2fb, 0x2e7, 0x76, 0xcc, 0x2c9, 0x6b, 0x161, 0x78, 0x380, 0x294, 0x36d, 0x30, 0xfd, 0x108, 0x368, 0x3e7, 0x2c8, 0x357, 0x36a, 0x196, 0x2d7, 0x8b, 0x1c4, 0x1a1, 0x38c, 0x3a9, 0x32f, 0xea, 0x302, 0x1ba, 0xbb, 0x139, 0xa9, 0xe4, 0x4e, 0x1e7, 0x3bd, 0x68, 0x2c, 0x26c, 0x1b2, 0x16d, 0x145, 0x3c2, 0x24e, 0x92, 0x82, 0x32e, 0x3d6, 0x109, 0x54, 0x1ec, 0x326, 0x200, 0x175, 0x33f, 0x346, 0x3fa, 0x365, 0x1e6, 0x81, 0x263, 0x1c2, 0x33b, 0x3ad, 0x3c4, 0xd4, 0xb3, 0xef, 0xd5, 0x38f, 0x2e4, 0x13b, 0x2d8, 0xfb, 0x392, 0x349, 0x38a, 0x133, 0x30e, 0x87, 0xf9, 0x1e3, 0x356, 0x56, 0x39d, 0x339, 0x1dc, 0x3db, 0x308, 0x21d, 0xd8, 0x18e, 0xad, 0x271, 0x3e, 0x36b, 0x15d, 0x370, 0x33a, 0x122, 0x335, 0x1c2, 0x27f, 0x2af, 0x21f, 0x15b, 0x24d, 0x3be, 0x24a, 0xf2, 0x2f0, 0xf1, 0x6a, 0xb3, 0x1de, 0x354, 0x47, 0x213, 0x321, 0x345, 0x167, 0x1cd, 0x29f, 0x3e5, 0x172, 0x13b, 0x1b9, 0x3ec, 0xaf, 0xf5, 0x1bc, 0x4b, 0x69, 0x229, 0x19c, 0x2e0, 0x3a0, 0x38a, 0x266, 0x23, 0x31, 0x38b, 0x17, 0x1d, 0x35a, 0x2d6, 0x367, 0x327, 0x278, 0x1e3, 0x2a5, 0x158, 0xd7, 0x3fc, 0x3fe, 0x315, 0x369, 0x1b6, 0x30c, 0x1e5, 0x398, 0x1dc, 0x3bf, 0x3b, 0xcc, 0x19b, 0x1ac, 0x31a, 0x389, 0xfc, 0x61, 0x185, 0x6c, 0x18e, 0x15a, 0x3c, 0x380, 0x121, 0x1af, 0x180, 0x3cb, 0x148, 0x386, 0x1c, 0x12b, 0x2e8, 0xc, 0x27a, 0x108, 0x2d9, 0x387, 0x26d, 0x115, 0x183, 0x151, 0x10a, 0x232, 0x3fb, 0xb2, 0x3af, 0x36a, 0x32c, 0x34e, 0x51, 0x7f, 0x45, 0x2f8, 0x35d, 0x19a, 0x3dd, 0x324, 0xe2, 0x1a1, 0xeb, 0xf8, 0x36e, 0x1fd, 0x2c3, 0x32b, 0x4, 0x3ac, 0x3e0, 0x1a3, 0x3fd, 0x31e, 0xb7, 0x10, 0x2ab, 0x39b, 0x285, 0x3ef, 0x63, 0x2dc, 0x40, 0x2be, 0x277, 0x206, 0x3a7, 0x18c, 0x362, 0x100, 0x2ea, 0x1ce, 0xa, 0x287, 0x239, 0x193, 0x9, 0x3ba, 0x331, 0x28, 0x20e, 0xf6, 0x245, 0x24, 0x2f3, 0xdf, 0xa0, 0x2a, 0x3d8, 0x106, 0x90, 0x3de, 0x37c, 0x280, 0xa8, 0x37b, 0x11, 0x240, 0x363, 0x1eb, 0x212, 0x2a0, 0x1f7, 0x44, 0x112, 0x197, 0x3a5, 0x5a, 0x292, 0x3d5, 0x110, 0x41, 0x255, 0x28f, 0x168, 0x25a, 0x34f, 0x49, 0x104, 0x146, 0x22e, 0x1a9, 0x17a, 0x127, 0x124, 0x19, 0x111, 0xaa, 0x2ad, 0x1e1, 0x95, 0x99, 0x64, 0x4d, 0x2a8, 0x2a6, 0x38d, 0x254, 0x264, 0x190, 0x134, 0x2b2, 0x28a, 0x22f, 0x142, 0x182, 0x249, 0xd9, 0x2da, 0x23a, 0xae, 0x101, 0x201, 0x136, 0x364, 0x37a, 0xfa, 0x2b8, 0xd, 0x16, 0xd1, 0x18b, 0x1d6, 0x3e0, 0x346, 0x3ef, 0xc6, 0x362, 0x200, 0x3ba, 0x26b, 0xa0, 0x54, 0x37b, 0x22, 0x112, 0x32e, 0x28f, 0x2d0, 0x17a, 0x24e, 0x99, 0xc8, 0x134, 0x16d, 0x23a, 0x15c, 0xd, 0x2c, 0x344, 0x43, 0x30f, 0x1e7, 0x1d7, 0x236, 0xa6, 0xa9, 0x329, 0x3a4, 0x162, 0x1ba, 0x1d1, 0x2cb, 0xf4, 0x32f, 0x359, 0x130, 0x23c, 0x1a1, 0x5f, 0x3aa, 0x334, 0x2d7, 0x51, 0x1fc, 0x59, 0x357, 0x366, 0x151, 0x21, 0x368, 0x307, 0x34c, 0x2e8, 0x30, 0x3e1, 0x290, 0xf, 0x380, 0x8d, 0x2c6, 0xd8, 0x6b, 0x31a, 0x23f, 0x3db, 0x76, 0x269, 0x30c, 0x39d, 0x1fe, 0x3f5, 0x9e, 0x1e3, 0x286, 0x1ad, 0x1a5, 0x30e, 0x31, 0x237, 0x170, 0x349, 0x6f, 0x4b, 0x1a4, 0x2d8, 0x3d1, 0x171, 0x29f, 0x38f, 0x30d, 0x24b, 0x21e, 0xb3, 0x371, 0x125, 0x1e4, 0x3ad, 0x21f, 0x165, 0x91, 0x263, 0x20b, 0x36b, 0x17d, 0x365, 0x32b, 0x8, 0x2ab, 0x33f, 0x206, 0x347, 0x3ac, 0x39b, 0x206, 0x287, 0xf6, 0x106, 0x240, 0x197, 0x28f, 0x1a9, 0x1e1, 0x254, 0x182, 0x136, 0x18b, 0x3c5, 0x2f7, 0x1d7, 0x65, 0x298, 0x141, 0x2fc, 0x75, 0x26, 0x8f, 0x2d4, 0x5f, 0x35d, 0xcb, 0x295, 0x119, 0x3f7, 0x26d, 0xba, 0x18, 0x3e1, 0x129, 0x3c, 0x3f, 0xc2, 0x66, 0x265, 0x1e5, 0xff, 0x3f5, 0x13c, 0x385, 0x1d, 0x2e6, 0xc5, 0x230, 0xb6, 0x3ec, 0x171, 0x137, 0x227, 0x5e, 0xf1, 0x350, 0x93, 0x39e, 0x301, 0x36b, 0x2fa, 0x18f, 0x16e, 0x80, 0x1dd, 0x26b, 0x140, 0x150, 0x3ee, 0x220, 0x208, 0x222, 0x159, 0x11d, 0x15c, 0x1a, 0xb0, 0x216, 0x39, 0x138, 0x12e, 0x26a, 0x2ec, 0x2cb, 0x1e8, 0xa7, 0x2fe, 0x324, 0x319, 0x8a, 0x3d3, 0x1b3, 0x151, 0x42, 0x1bb, 0xe, 0xa5, 0x1af, 0x1b, 0x31c, 0x18d, 0x23f, 0x3bf, 0x1d8, 0x36c, 0xac, 0x35c, 0x367, 0x10e, 0x31f, 0x170, 0x29b, 0x1bc, 0x258, 0x276, 0x3a6, 0x195, 0x351, 0x277, 0x14, 0x2a, 0x2ff, 0x110, 0x208, 0x4d, 0x16d, 0xfa, 0x1ed, 0x340, 0x53, 0x152, 0x17e, 0x75, 0x4c, 0x23c, 0x28d, 0x1f9, 0x36a, 0x2ac, 0x42, 0x376, 0x38, 0x121, 0x2c6, 0x360, 0x2b9, 0x339, 0x3fe, 0x13c, 0x303, 0x74, 0x31d, 0x4b, 0x299, 0x1d3, 0x195, 0x3bc, 0x24a, 0x33b, 0x155, 0x1db, 0x32b, 0x20, 0x2ea, 0x26b, 0x280, 0x149, 0x34f, 0x248, 0x190, 0x1b2, 0x1f3, 0x37f, 0x1d7, 0xca, 0x272, 0x21a, 0x393, 0x2bb, 0x192, 0x319, 0x114, 0x357, 0x183, 0x13d, 0x52, 0x203, 0x309, 0x61, 0x66, 0xc3, 0x39d, 0x3f1, 0x327, 0x3c1, 0xb8, 0x29b, 0x378, 0x172, 0x394, 0x21e, 0x2cc, 0x375, 0x1c2, 0x3b1, 0x2fa, 0x31e, 0x1b1, 0x9, 0x1ef, 0x1eb, 0xb4, 0x17a, 0x12a, 0x182, 0x26c, 0x225, 0x217, 0x323, 0x29e, 0x176, 0x2cb, 0x3d0, 0x29c, 0x3dd, 0x22c, 0x3f8, 0x2c8, 0x22a, 0xc, 0x3e1, 0x252, 0xf0, 0x1f8, 0x3b, 0xdb, 0x56, 0x2ab, 0x1ce, 0xa0, 0x2a0, 0x34f, 0x99, 0x249, 0x18b, 0x30f, 0x323, 0x135, 0x1d1, 0x275, 0x177, 0x334, 0x295, 0x6d, 0x307, 0x256, 0x35e, 0xd8, 0x358, 0x339, 0x3f5, 0xf9, 0x2e, 0x349, 0x378, 0x2e4, 0x24b, 0xd4, 0x93, 0x263, 0x7c, 0x346, 0x347, 0x1ec, 0x22, 0x82, 0x222, 0x16d, 0x1f4, 0x3bd, 0x236, 0x139, 0x21a, 0x32f, 0x2fe, 0x8b, 0x1fc, 0x2c8, 0x5d, 0x30, 0x337, 0x161, 0x23f, 0x2e7, 0x1bf, 0x286, 0x173, 0x18a, 0x1a4, 0x2ed, 0x195, 0x371, 0x13a, 0x1ee, 0x17d, 0x31e, 0x362, 0x24, 0x363, 0x28f, 0x2ad, 0x22f, 0xd, 0x160, 0x94, 0x329, 0x11f, 0x26, 0x23c, 0x113, 0x3ed, 0x366, 0x29a, 0x52, 0xf, 0x3f, 0x308, 0x269, 0x56, 0x2b1, 0x30e, 0x188, 0xfb, 0x171, 0xd5, 0x238, 0x3ad, 0xdc, 0x1e6, 0x8, 0x175, 0x26b, 0x109, 0x12d, 0x24e, 0xc1, 0x26c, 0x43, 0x4e, 0x12e, 0x1ba, 0x293, 0x38c, 0x3aa, 0x196, 0x85, 0x368, 0x15f, 0x331, 0x109, 0x25a, 0x12a, 0x201, 0x281, 0x72, 0x3a4, 0x20d, 0x11e, 0x113, 0x3d3, 0x183, 0xfd, 0x129, 0x1e0, 0x3db, 0x369, 0x143, 0x173, 0x314, 0x299, 0x345, 0x166, 0x2e3, 0x20b, 0x2d5, 0x3a7, 0x1ec, 0x44, 0x208, 0x134, 0x2fd, 0x2f7, 0x2a3, 0x176, 0x33e, 0x177, 0x261, 0x246, 0x368, 0x1c, 0x242, 0x21d, 0xc3, 0x26f, 0x367, 0x62, 0x279, 0x171, 0x1aa, 0xf2, 0x157, 0x1db, 0xb7, 0x200, 0x3de, 0x343, 0x2ad, 0x57, 0x34, 0x312, 0x152, 0x1f1, 0x359, 0x324, 0xfe, 0x2c8, 0xba, 0xc0, 0x18e, 0x23d, 0x379, 0x9e, 0x20f, 0x3a0, 0x378, 0x1c1, 0x13e, 0x2a9, 0x122, 0xeb, 0x33f, 0x28, 0x150, 0x34f, 0x132, 0x136, 0x43, 0x9c, 0xb1, 0x1cb, 0x16a, 0x17c, 0x36a, 0x2a2, 0x29, 0xf, 0x7e, 0x3b, 0x36c, 0x169, 0x29d, 0x230, 0x1b9, 0x2ce, 0x371, 0x274, 0x3b1, 0x3fa, 0x18c, 0x83, 0x112, 0x28c, 0x2b2, 0x1f4, 0x373, 0xca, 0x1da, 0x2be, 0xdf, 0x5a, 0x1e1, 0x101, 0x160, 0x250, 0x2fc, 0x359, 0x241, 0x3f8, 0x26d, 0x3b2, 0x36, 0x358, 0xff, 0x327, 0x237, 0x253, 0x137, 0x238, 0x2af, 0x1db, 0x16e, 0x12, 0x2cf, 0x55, 0x11d, 0x1ed, 0x236, 0xed, 0x1e8, 0x262, 0x34e, 0xda, 0xe, 0x242, 0x33, 0x30c, 0x35c, 0x215, 0x5b, 0x35f, 0x1de, 0x13a, 0x3b1, 0x3fd, 0x239, 0x11, 0x104, 0x134, 0x1f3, 0x3ce, 0x135, 0x34d, 0x311, 0x16f, 0x2ac, 0x210, 0xf, 0xfc, 0xec, 0x356, 0x2bd, 0x314, 0x13b, 0x10f, 0x322, 0x263, 0x1f0, 0x5, 0x54, 0x3a3, 0x132, 0x26c, 0x10c, 0xe9, 0x302, 0x11e, 0x226, 0x357, 0x3, 0x3cb, 0x161, 0xee, 0x223, 0x303, 0x3a0, 0x2f9, 0x30d, 0x1e2, 0x2ca, 0x1, 0x2be, 0xdf, 0x5a, 0x1e1, 0x101, 0x160, 0x250, 0x2fc, 0x359, 0x241, 0x3f8, 0x26d, 0x3b2, 0x36, 0x358, 0xff, 0x327, 0x237, 0x253, 0x137, 0x238, 0x2af, 0x1db, 0x16e, 0x12, 0x2cf, 0x55, 0x175, 0x37c, 0x2d0, 0x22f, 0x68, 0xa6, 0x21a, 0x14e, 0x2d7, 0x6d, 0xe, 0x8d, 0xcc, 0x56, 0x1a5, 0x230, 0x2ed, 0xb3, 0x1cf, 0x7c, 0x206, 0x54, 0x34f, 0xc1, 0x344, 0xe4, 0x11f, 0x130, 0x23b, 0x2c8, 0x2e8, 0x1b, 0x358, 0x1fe, 0x87, 0x19c, 0x171, 0x2a1, 0x33b, 0x17d, 0xc6, 0x106, 0x82, 0x134, 0x3e6, 0x323, 0x1ba, 0xb5, 0x2f8, 0x366, 0xfd, 0xad, 0x23f, 0x315, 0x303, 0x349, 0x3f6, 0x5e, 0x21f, 0x1e6, 0x40, 0x1ef, 0x28f, 0x145, 0x2f2, 0x236, 0x1da, 0x3a9, 0x334, 0x85, 0x376, 0x380, 0x308, 0x36c, 0x1ad, 0x18a, 0x13b, 0x21e, 0x93, 0x33c, 0x33f, 0xa0, 0x12d, 0x254, 0x2c, 0x94, 0x17e, 0x359, 0x8b, 0x3fb, 0x34c, 0x35e, 0x2c9, 0x39d, 0x367, 0x188, 0x3d1, 0xef, 0x13a, 0x36b, 0x3ef, 0x1ec, 0x110, 0xc8, 0x18b, 0x4e, 0x162, 0x243, 0x113, 0x357, 0x6, 0x337, 0x31a, 0x2fb, 0xf9, 0x170, 0x3d4, 0x47, 0x3ad, 0x2e9, 0x2ea, 0x1eb, 0x2ad, 0x2b8, 0x11b, 0x1da, 0x35b, 0xcb, 0x21, 0x305, 0xfc, 0x3b0, 0x105, 0x233, 0x2e4, 0xf1, 0x19d, 0x8, 0x37d, 0x343, 0x145, 0x1ed, 0xca, 0x2cb, 0x2ee, 0x251, 0x108, 0x1e, 0x3e9, 0x1bf, 0x3a, 0x1bc, 0x30d, 0x381, 0xf3, 0x40, 0x3de, 0x22e, 0x23a, 0x373, 0x259, 0x275, 0x35d, 0x2ac, 0x52, 0xf0, 0x377, 0x1e3, 0x1d0, 0x1fb, 0x5e, 0x37, 0x391, 0x200, 0x2cf, 0x154, 0x1f4, 0x3ae, 0x2ec, 0x38c, 0x2de, 0x14d, 0x290, 0x389, 0x38e, 0x303, 0x29b, 0x3c3, 0x2f0, 0x1b8, 0xb7, 0x24, 0x255, 0x2b2, 0x3bb, 0x14f, 0x34d, 0x5f, 0x2dd, 0x27a, 0xad, 0x77, 0x4f, 0x2e, 0xf5, 0x227, 0x3ad, 0x1db, 0x1b1, 0x120, 0x28c, 0x1bd, 0x1e7, 0x26a, 0x25e, 0x2f8, 0x2c5, 0x3f4, 0x161, 0x3b8, 0x278, 0x170, 0x3a1, 0x11c, 0x157, 0x2c3, 0x193, 0x112, 0x4d, 0x1f3, 0x323, 0x374, 0x2d4, 0x3ed, 0x205, 0x39f, 0x31a, 0x1ff, 0x3e4, 0x392, 0x1dd, 0x3a5, 0x145, 0x3da, 0x328, 0x275, 0x2b3, 0x2a2, 0x290, 0x31b, 0x223, 0x2e, 0x1ea, 0x8e, 0x157, 0x18f, 0x245, 0x82, 0xd9, 0x217, 0x162, 0x11e, 0x114, 0x5d, 0x209, 0x2b9, 0x3eb, 0xc4, 0x3ab, 0x371, 0x301, 0x285, 0x54, 0x127, 0xb, 0x94, 0x1f1, 0x1f5, 0x288, 0x7, 0x11a, 0x269, 0x2d2, 0x314, 0x1ca, 0x350, 0x102, 0x175, 0x1eb, 0x153, 0x2f2, 0xca, 0x19f, 0x3aa, 0x2ac, 0xa4, 0x3c0, 0x38e, 0x20f, 0x27e, 0x227, 0x353, 0x365, 0x193, 0x224, 0x134, 0x383, 0x25c, 0x243, 0x45, 0x115, 0x180, 0x1ac, 0x3fc, 0x31, 0x3ec, 0x1de, 0x1c2, 0x1a3, 0x15, 0x34f, 0x304, 0x25, 0x17e, 0x17f, 0xa2, 0x307, 0x242, 0x198, 0x2b0, 0xc5, 0x276, 0xd4, 0x244, 0x15f, 0x37c, 0x352, 0x2b8, 0x236, 0x361, 0x2ee, 0xab, 0x29, 0xf0, 0x2e7, 0x385, 0x29b, 0x38f, 0x3d2, 0x1db, 0x362, 0x89, 0x4d, 0x3e6, 0x97, 0x396, 0x113, 0x147, 0x60, 0x6b, 0x3ba, 0x28f, 0x23a, 0x1d7, 0x1d1, 0x5f, 0x366, 0x3e1, 0x31a, 0x3f5, 0x237, 0x171, 0x125, 0x36b, 0x347, 0x3ee, 0xc1, 0x216, 0x17e, 0x2fe, 0x288, 0xe, 0x61, 0x36c, 0x173, 0x258, 0x27c, 0x33a, 0x40, 0x363, 0x2a8, 0x3bb, 0x135, 0xb5, 0x3ed, 0x6, 0x18e, 0x339, 0x87, 0xfb, 0xef, 0x1c2, 0x346, 0x54, 0x24e, 0x2c, 0xa9, 0x32f, 0x2d7, 0x368, 0x380, 0x76, 0x286, 0x6f, 0x30d, 0x21f, 0x32b, 0x24, 0x146, 0x37a, 0x323, 0x1cb, 0x113, 0x28e, 0x180, 0x358, 0x3eb, 0x188, 0x2b7, 0x3be, 0x7c, 0x14, 0x12d, 0x284, 0x312, 0x21a, 0x262, 0x85, 0x386, 0x1f8, 0x1bf, 0xe8, 0x3f6, 0x2f0, 0x2e9, 0x362, 0x112, 0x134, 0x30f, 0x162, 0x23c, 0x59, 0x2e8, 0xd8, 0x39d, 0x30e, 0x2d8, 0xb3, 0x263, 0x33f, 0x109, 0x3c2, 0x68, 0x139, 0x3a9, 0x196, 0x108, 0x78, 0x2e7, 0x303, 0x27e, 0x47, 0x157, 0x31e, 0x106, 0x19, 0x18b, 0x270, 0x26, 0x23b, 0x37d, 0x22e, 0x1f4, 0x14f, 0x25e, 0x3ed, 0xc, 0x231, 0x1fe, 0x62, 0x35f, 0x3be, 0xf8, 0x50, 0x17a, 0x1a, 0x298, 0x3a9, 0x32c, 0x29, 0x3c0, 0x223, 0xb8, 0x29f, 0x3c8, 0x1fd, 0x1ec, 0x124, 0x1a2, 0x329, 0x2bb, 0x144, 0xe, 0xc2, 0x1ab, 0x38a, 0x1c1, 0x30b, 0x32b, 0x48, 0x111, 0x3e6, 0x25c, 0x11e, 0x59, 0x1d9, 0x360, 0xd7, 0x8c, 0x3a6, 0x93, 0x3ac, 0x1be, 0x2ad, 0x1ed, 0x259, 0x38c, 0x2dd, 0x3f4, 0x31a, 0x3e3, 0xce, 0x39a, 0x274, 0x1a3, 0x54, 0x95, 0xb0, 0x141, 0x29c, 0x246, 0x386, 0x3f0, 0x2f5, 0x349, 0x317, 0x2af, 0x31e, 0x20c, 0x64, 0x43, 0x341, 0xc9, 0x3fb, 0xa5, 0x66, 0x2b0, 0x314, 0x321, 0x165, 0x10, 0x3b5, 0x2a8, 0x37f, 0xdd, 0x1a1, 0x2a7, 0xc0, 0x358, 0x3df, 0x229, 0x195, 0x39e, 0x39b, 0x109, 0x38d, 0x1a0, 0x1da, 0x2ee, 0x2ac, 0x290, 0x77, 0x278, 0x392, 0x1aa, 0xf7, 0x3ef, 0x2ff, 0x264, 0x216, 0x2f3, 0xaa, 0x3bb, 0xdd, 0x342, 0x28e, 0x209, 0x1e5, 0x30e, 0x372, 0x322, 0x1d6, 0x1be, 0x153, 0x3bd, 0x2ec, 0xbe, 0x306, 0xc7, 0x27b, 0x31, 0x35f, 0x375, 0x3e0, 0x280, 0x38d, 0x340, 0x361, 0x35d, 0x29a, 0x2b4, 0x1ff, 0x237, 0x1cd, 0x274, 0x346, 0x150, 0xa1, 0x312, 0x7a, 0x261, 0x108, 0x1e0, 0x223, 0x170, 0x26e, 0x27f, 0x3ef, 0x1f7, 0x182, 0x94, 0x393, 0x1a7, 0x376, 0xfc, 0x37e, 0x349, 0x227, 0x2ae, 0xc6, 0x88, 0x9b, 0xe4, 0x3a8, 0xa2, 0xe, 0x184, 0x2a5, 0x6f, 0x2f, 0x1b8, 0x362, 0x41, 0x364, 0x270, 0x98, 0x3f8, 0x256, 0x66, 0x169, 0x4b, 0x13e, 0x27d, 0x200, 0xa3, 0x2fd, 0x12e, 0x11e, 0xb2, 0x36d, 0x336, 0x16b, 0x1a4, 0x6a, 0x102, 0x3ba, 0x22e, 0x3e8, 0x135, 0x2d4, 0x2a7, 0x180, 0x17b, 0x2c7, 0x2d8, 0x2cc, 0x271, 0x26b, 0x352, 0x1ed, 0xbb, 0x22b, 0x2c5, 0x337, 0x398, 0x10e, 0x3d1, 0x1df, 0xf8, 0xa0, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x1, 0x1ef, 0x2a8, 0x1e7, 0x1cb, 0x8a, 0x2e8, 0x2c9, 0x2b1, 0x1a4, 0xd4, 0x3de, 0x2b2, 0x323, 0x8f, 0x164, 0x35e, 0x211, 0xc5, 0x24b, 0x27d, 0x12, 0x222, 0x217, 0x13, 0x1fc, 0xa5, 0x330, 0x173, 0x1c1, 0x6e, 0x362, 0x104, 0x225, 0x11f, 0x116, 0x7, 0x308, 0x105, 0x1fb, 0x3ad, 0x235, 0x88, 0x26c, 0x25b, 0x3ea, 0x368, 0x7e, 0x2f5, 0x27e, 0x79, 0x1fd, 0x37b, 0x182, 0x250, 0x14e, 0x10a, 0x3c, 0x315, 0x2e0, 0x354, 0x36b, 0x15, 0x12a, 0x312, 0x1e8, 0x251, 0x290, 0x3b8, 0x31f, 0x39a, 0x384, 0xa, 0x17a, 0xd0, 0x361, 0x16f, 0x1fa, 0x73, 0x87, 0x3ab, 0x2e3, 0x33f, 0xb4, 0x179, 0xbb, 0xbe, 0x3, 0x6b, 0x3df, 0x16c, 0x191, 0x3ac, 0x1eb, 0x23a, 0x14f, 0x2d4, 0x28e, 0x36, 0x26f, 0x230, 0x35, 0x204, 0x1ef, 0x159, 0x395, 0x243, 0xb2, 0x1af, 0x30c, 0x266, 0x321, 0x33a, 0x9, 0x111, 0x30f, 0x20d, 0xfe, 0x256, 0x198, 0x2bd, 0x2e4, 0x37, 0x1b1, 0x82, 0x316, 0x28b, 0x8b, 0x207, 0x184, 0x286, 0x3b5, 0x2da, 0x12e, 0xe2, 0xd3, 0x21d, 0x2d2, 0xb9, 0x21f, 0x1b1, 0x104, 0x43, 0x75, 0xa2, 0x70, 0x1d8, 0x1d0, 0x47, 0x2ba, 0x3d8, 0xc1, 0x250, 0x29c, 0x21, 0x1e0, 0x13c, 0xaf, 0x9d, 0x285, 0x12d, 0x34, 0x3b4, 0x16f, 0x3f4, 0x1cc, 0x31, 0x2ce, 0xcf, 0x26b, 0x2a6, 0x3ae, 0xb5, 0x147, 0x36, 0xd7, 0xd2, 0x1a8, 0x8, 0x197, 0x2fd, 0x162, 0x319, 0x291, 0xcc, 0x2bd, 0x1c1, 0xdc, 0x193, 0x32, 0x218, 0x3a8, 0x119, 0x380, 0x2db, 0x29b, 0x238, 0x1fd, 0x2ff, 0x201, 0x2a4, 0xcd, 0x108, 0x31b, 0x1f2, 0x171, 0xe1, 0x5, 0x17a, 0x1a0, 0x19f, 0x36a, 0x39f, 0x27b, 0x188, 0x25d, 0x271, 0x37c, 0x11d, 0x14f, 0x1a1, 0x22a, 0x1b0, 0x2b1, 0x299, 0x15b, 0x40, 0xa3, 0x3c5, 0x302, 0xfe, 0xa5, 0x269, 0x1c5, 0x213, 0x2e9, 0x83, 0x190, 0xe4, 0x17f, 0xda, 0x3f, 0x2f5, 0xf5, 0x1e4, 0x3f3, 0x3d5, 0x2c, 0x10d, 0x261, 0x52, 0x363, 0x37a, 0x162, 0x23b, 0x256, 0x269, 0x38a, 0x5e, 0x365, 0x22, 0x26c, 0x17e, 0x2d7, 0x386, 0x2e7, 0x170, 0x2a1, 0x36e, 0x2a0, 0xd, 0x1da, 0x16f, 0x3e1, 0x339, 0x188, 0xb3, 0x1d6, 0x3d6, 0x1f4, 0x1ba, 0x8a, 0x36d, 0x30c, 0x18a, 0x27c, 0x32b, 0x112, 0x18b, 0x11f, 0x51, 0x70, 0x3b0, 0x349, 0x238, 0x3fa, 0x3ee, 0x2c, 0x21a, 0x196, 0x290, 0x2fb, 0x19c, 0x371, 0x3e0, 0x5a, 0x2f2, 0x1d1, 0x3ed, 0x180, 0x39d, 0x230, 0xd4, 0x8, 0x32e, 0x3e6, 0x302, 0x1fc, 0x294, 0x36c, 0x6f, 0x2f0, 0x31e, 0x110, 0x344, 0x3e2, 0x295, 0xf, 0x315, 0x392, 0x125, 0x346, 0x12d, 0x68, 0x2cb, 0x36a, 0x337, 0x1fe, 0x5b, 0x191, 0x2ab, 0x28f, 0x3bb, 0x1cb, 0x59, 0x35e, 0x56, 0x4b, 0x3c4, 0x16e, 0x82, 0x43, 0xea, 0x288, 0x380, 0x1bf, 0x27e, 0x1e4, 0x3ef, 0x34f, 0x160, 0xf4, 0xab, 0xad, 0x3f5, 0xfb, 0x3be, 0x33f, 0x2d0, 0x3bd, 0x293, 0x2cf, 0x1f3, 0x302, 0x3f8, 0x242, 0x356, 0x2f9, 0x2af, 0x239, 0x132, 0x250, 0x262, 0x210, 0xee, 0x237, 0x1de, 0x1f0, 0x5a, 0x1ed, 0x34d, 0x357, 0x36, 0x35c, 0x13b, 0x2ca, 0x12, 0x134, 0xe9, 0x241, 0xe, 0xec, 0x3a0, 0x238, 0x3fd, 0x3a3, 0x160, 0x1e8, 0x2ac, 0x161, 0x327, 0x35f, 0x263, 0xdf, 0x11d, 0x135, 0x226, 0x3b2, 0x30c, 0x314, 0x1e2, 0x16e, 0x104, 0x10c, 0x359, 0xda, 0xfc, 0x303, 0x137, 0x3b1, 0x54, 0x101, 0xed, 0x16f, 0x3cb, 0xff, 0x5b, 0x322, 0x2be, 0x55, 0x3ce, 0x11e, 0x26d, 0x33, 0x2bd, 0x30d, 0x1db, 0x11, 0x26c, 0x2fc, 0x34e, 0xf, 0x223, 0x253, 0x13a, 0x5, 0x1e1, 0x236, 0x311, 0x3, 0x358, 0x215, 0x10f, 0x1, 0x2cf, 0x1f3, 0x302, 0x3f8, 0x242, 0x356, 0x2f9, 0x2af, 0x239, 0x132, 0x250, 0x262, 0x210, 0xee, 0x237, 0x1de, 0x1f0, 0x5a, 0x1ed, 0x34d, 0x357, 0x36, 0x35c, 0x13b, 0x2ca, 0x12, 0x134, 0x197, 0x3c5, 0x26, 0x3f7, 0xc2, 0x1d, 0x227, 0x2fa, 0x3ee, 0xb0, 0x1e8, 0x151, 0x18d, 0x10e, 0x195, 0xeb, 0x3a5, 0x3bb, 0x325, 0x199, 0x21d, 0x2bd, 0x213, 0x365, 0x88, 0x281, 0x32f, 0x214, 0x389, 0x3c1, 0x273, 0xf8, 0x5a, 0x3da, 0x12f, 0x28e, 0x360, 0x34a, 0x24b, 0x391, 0x224, 0x43, 0x3a8, 0xda, 0x1f8, 0x17, 0x1aa, 0x36e, 0x292, 0xd0, 0x275, 0x183, 0xd6, 0x30e, 0x10f, 0x2, 0x32e, 0x383, 0x4c, 0x3e7, 0x184, 0x3a, 0x47, 0x1fd, 0x3d5, 0x160, 0x3d0, 0x2a2, 0x31a, 0x21c, 0x32a, 0x1d6, 0x343, 0x37f, 0x243, 0x332, 0x33, 0x173, 0x2f, 0x2c3, 0x110, 0x10b, 0x257, 0x21, 0x31b, 0x38b, 0xef, 0x1f0, 0xb4, 0x3bd, 0x25e, 0x115, 0x2c9, 0x29d, 0x9f, 0x32b, 0x41, 0x86, 0x359, 0x1b4, 0x3f0, 0x2e, 0x354, 0x2d5, 0x12d, 0x1a0, 0xe3, 0x306, 0x1ac, 0x215, 0x21e, 0x4, 0x255, 0x30f, 0x98, 0x3c7, 0x308, 0x74, 0x8e, 0x3fa, 0x32e, 0x30f, 0x130, 0x307, 0x76, 0x349, 0x1e4, 0x347, 0x254, 0x139, 0x16f, 0x337, 0x3eb, 0x2ed, 0x81, 0x363, 0x3e6, 0x26, 0x3e7, 0x308, 0xe8, 0x238, 0x3ef, 0x24e, 0xa6, 0x3aa, 0x3e1, 0x1fe, 0x2d8, 0x91, 0x1ef, 0x37a, 0x302, 0x3fb, 0x61, 0x1d, 0x47, 0x3fa, 0x34f, 0x312, 0x177, 0xfd, 0x339, 0x5b, 0x93, 0x3ba, 0x16d, 0x162, 0x1fc, 0x8d, 0x286, 0x38f, 0x17d, 0x3ee, 0x160, 0x3a9, 0x29a, 0xe6, 0x188, 0x191, 0x175, 0x2a8, 0x12e, 0x23b, 0x294, 0x356, 0x3f6, 0x2aa, 0x37b, 0x2c, 0xf4, 0x151, 0x31a, 0x31, 0xb3, 0x2ab, 0x55, 0x323, 0x1c4, 0x256, 0x36c, 0x378, 0x157, 0x1ec, 0x201, 0x21a, 0xab, 0x161, 0x87, 0x195, 0x1d6, 0x28f, 0x1e7, 0x23c, 0x34c, 0x269, 0x6f, 0x3ad, 0x239, 0xc1, 0x141, 0x196, 0xad, 0x397, 0x2b7, 0x33c, 0x3d6, 0x3bb, 0x243, 0x26d, 0xcc, 0x38a, 0x2f0, 0xc6, 0x99, 0xa9, 0x334, 0x290, 0x3f5, 0x3d1, 0x255, 0x27, 0x192, 0x1c, 0x2db, 0x3d4, 0x3dc, 0x150, 0x68, 0xe3, 0x3, 0x2f6, 0x69, 0x2b6, 0x24, 0x364, 0x75, 0x6d, 0x3f0, 0xb8, 0x125, 0x5, 0x313, 0xbb, 0x3d3, 0x6c, 0x1a5, 0x9f, 0xb7, 0x19, 0x1c8, 0x36f, 0xf, 0x13c, 0x1cd, 0x7c, 0xb4, 0x2ef, 0x1a1, 0x1d9, 0x2b, 0x258, 0x1b8, 0x11, 0x344, 0x257, 0x84, 0x1dc, 0x338, 0x2e3, 0x26b, 0x7d, 0x2e1, 0x2c8, 0x33, 0x1c5, 0x2f0, 0x18c, 0x264, 0x141, 0x32c, 0x2b4, 0x87, 0x32a, 0x351, 0x55, 0x24f, 0x319, 0x294, 0x2a5, 0x3c3, 0x17d, 0x3d5, 0x189, 0x177, 0x1fa, 0xff, 0x2d8, 0x122, 0x3b5, 0x3e6, 0x4c, 0x387, 0x76, 0x29b, 0x399, 0x20e, 0x101, 0x361, 0x366, 0xd6, 0x23, 0xd4, 0x80, 0x9a, 0x3a4, 0xa2, 0x21b, 0x303, 0x1aa, 0x1a3, 0x17a, 0x65, 0x17c, 0x180, 0x1ae, 0xe5, 0x1e6, 0x224, 0x10c, 0x2fe, 0x2e5, 0x38e, 0xaf, 0x384, 0x280, 0x2f2, 0x12f, 0x22a, 0x265, 0xa3, 0x9c, 0x8b, 0x1c0, 0x3c6, 0xd5, 0x1a3, 0x2f4, 0x194, 0x3f2, 0x36, 0x1a5, 0x13e, 0x2dc, 0xc8, 0xbf, 0x123, 0x3c0, 0x31f, 0x2eb, 0x1ce, 0x11d, 0x374, 0x2c8, 0x66, 0x31d, 0x3ad, 0xf6, 0xb, 0xf4, 0x14d, 0x1cc, 0x5b, 0x24c, 0x3de, 0x3e6, 0x98, 0x207, 0x3b0, 0x1ea, 0x3dc, 0x2a0, 0x1a0, 0x311, 0x30, 0x26f, 0x276, 0x1e6, 0x41, 0x39, 0x3dd, 0x203, 0x13c, 0x39a, 0x1f0, 0x1a9, 0x2a3, 0x45, 0x2b5, 0x1ad, 0x2f, 0x235, 0x99, 0x2a4, 0x32c, 0x161, 0x21c, 0x166, 0x175, 0x2b2, 0x2c4, 0x3fb, 0x184, 0x1d0, 0x1e4, 0x107, 0x101, 0x2cb, 0x183, 0x2b9, 0x230, 0x2b6, 0x48, 0x18b, 0x3a8, 0x2d9, 0x2e7, 0x253, 0x384, 0x109, 0x3da, 0x16a, 0x2e8, 0x2b, 0xb9, 0x2e9, 0x88, 0x25, 0x262, 0x148, 0x3e3, 0x2b7, 0xeb, 0x117, 0x323, 0x319, 0x121, 0x286, 0x227, 0x3fd, 0x24e, 0x298, 0x2de, 0x18e, 0x187, 0x35, 0x40, 0x9a, 0x341, 0x288, 0x146, 0x270, 0x51, 0x3f, 0x2e, 0x125, 0x14, 0x15c, 0x293, 0x5d, 0x30c, 0x258, 0x2e9, 0x110, 0x94, 0x334, 0xad, 0x87, 0xb3, 0x175, 0x16d, 0x302, 0x3e7, 0x76, 0x27e, 0x1ee, 0x2a0, 0x340, 0x5f, 0x180, 0x2b1, 0x24b, 0x16e, 0xc8, 0x17e, 0x85, 0x23f, 0x19c, 0x1cf, 0x37c, 0x3bb, 0x23c, 0x256, 0x356, 0x38f, 0x3fa, 0x24e, 0x139, 0x36a, 0x6b, 0x46, 0x2a9, 0x24, 0x18b, 0x359, 0x376, 0x315, 0x171, 0x7c, 0x2d0, 0x2a3, 0x8a, 0x2c6, 0x173, 0x2f0, 0x239, 0x201, 0xf4, 0x29a, 0x339, 0x2d8, 0x81, 0x32e, 0x4e, 0x8b, 0x380, 0x303, 0x2a1, 0x206, 0x22f, 0x1d1, 0x28e, 0x265, 0x4b, 0xdc, 0x22, 0x216, 0x262, 0x290, 0x397, 0x195, 0x2ab, 0x2a8, 0x162, 0x3fb, 0x308, 0x349, 0x33b, 0x54, 0x68, 0x38c, 0x30, 0xd7, 0x1ca, 0x32b, 0x19, 0x329, 0x295, 0x3c0, 0x237, 0x3be, 0x26b, 0x1f4, 0x243, 0x34c, 0x36c, 0x3f6, 0x17d, 0x34f, 0xa6, 0x28c, 0x1d2, 0x288, 0x3f0, 0x1c9, 0x1c2, 0x212, 0x2ef, 0x113, 0x2b5, 0x2bd, 0x2f0, 0x7b, 0x16, 0x3a9, 0x1fa, 0x3f1, 0x345, 0x10, 0x9a, 0x11f, 0xda, 0x377, 0xaf, 0x1f, 0x168, 0x2a3, 0x114, 0x30a, 0x38a, 0x353, 0x3b9, 0x160, 0x2ee, 0x39f, 0x367, 0x35, 0x100, 0x1b2, 0x1d4, 0x1bb, 0x315, 0x2e2, 0x1f0, 0x2ad, 0x26a, 0x164, 0xcc, 0xde, 0x155, 0x3ee, 0x22d, 0x2b3, 0x18e, 0x215, 0x350, 0x24, 0x316, 0x17f, 0x386, 0x13c, 0x273, 0x33f, 0x28a, 0x2e1, 0x26d, 0xdb, 0x1fb, 0x17d, 0x297, 0x298, 0x36a, 0xd6, 0x118, 0x165, 0x240, 0x10c, 0x3dd, 0x1e, 0x3e4, 0x371, 0x39c, 0xfa, 0x243, 0x291, 0x1ab, 0x38f, 0x3fd, 0x12a, 0x1da, 0x2c5, 0x17b, 0x1a4, 0x27d, 0x41, 0xe4, 0x1a7, 0x1e0, 0x237, 0x375, 0x1be, 0x3bb, 0x71, 0x14a, 0x286, 0x8e, 0x3a7, 0x284, 0x19f, 0x3, 0x39d, 0x276, 0x391, 0x19, 0x25b, 0x246, 0x23f, 0x338, 0x335, 0x3d6, 0x111, 0x341, 0x6d, 0x377, 0x15e, 0x7c, 0x352, 0x26a, 0x2c8, 0x330, 0x2f9, 0x17d, 0x127, 0x272, 0x366, 0x17b, 0x348, 0x1e6, 0x208, 0x25b, 0x85, 0xee, 0x1f6, 0x33c, 0x22e, 0x25c, 0x3fb, 0x3b, 0xf5, 0x36b, 0xbd, 0x328, 0x357, 0x336, 0x96, 0x2e9, 0x49, 0x152, 0xab, 0x73, 0xb6, 0x81, 0xa3, 0xe9, 0x288, 0x3e9, 0x32d, 0x20b, 0x168, 0x14f, 0x59, 0x66, 0xde, 0x2aa, 0x3a3, 0x14c, 0x36a, 0x1ac, 0x69, 0x33a, 0x41, 0x1c8, 0x295, 0x31b, 0x338, 0x263, 0x343, 0x24f, 0x1fc, 0x184, 0x29b, 0x1ee, 0x292, 0x65, 0x3ed, 0x360, 0x314, 0xdc, 0x88, 0x128, 0x196, 0x18d, 0x310, 0x91, 0x197, 0x9c, 0x51, 0xfc, 0x2e0, 0x1c2, 0x2d, 0x3ae, 0x8a, 0x30a, 0x31d, 0x157, 0x1f7, 0x22d, 0x16f, 0x231, 0x8c, 0x165, 0x89, 0x39, 0x2d7, 0x1e0, 0x67, 0x1cf, 0x1eb, 0x3ce, 0x23b, 0x234, 0x1d0, 0x33b, 0x150, 0x289, 0x2f8, 0x6c, 0x266, 0x21f, 0x222, 0x11f, 0x368, 0x315, 0x39a, 0x33f, 0x23a, 0x243, 0x256, 0x286, 0x238, 0x20e, 0x68, 0x5f, 0x1b, 0x133, 0x21f, 0x22, 0x94, 0x196, 0x31a, 0x5b, 0x81, 0x146, 0x3a4, 0x6d, 0x2e7, 0x171, 0x3e0, 0x145, 0x1cb, 0x34c, 0x356, 0x47, 0x347, 0xd, 0x38c, 0x180, 0x1a5, 0x3c4, 0x106, 0x216, 0x334, 0x161, 0x188, 0x91, 0x32e, 0x270, 0x288, 0x3db, 0xaf, 0x7c, 0x2ad, 0x1ba, 0x26d, 0x36c, 0x38f, 0x3ef, 0x284, 0x275, 0x30, 0x2b1, 0x27c, 0x326, 0x344, 0x262, 0xad, 0x31, 0x93, 0x363, 0x4e, 0x51, 0x1f8, 0x392, 0x20b, 0x2d0, 0x135, 0x2c8, 0x269, 0x3f6, 0x3fa, 0x254, 0x2cb, 0x6, 0xd7, 0x24b, 0x362, 0x26c, 0x14e, 0x290, 0x87, 0x191, 0x1ef, 0x30f, 0x8b, 0x3f, 0x170, 0x1c2, 0x5a, 0x2a3, 0x59, 0xcc, 0x378, 0x17d, 0x24e, 0x1da, 0x306, 0x39d, 0x1ca, 0x16e, 0x249, 0x32f, 0x52, 0x397, 0xb3, 0x3ba, 0x3e6, 0x192, 0x380, 0x2e, 0x4d, 0x75, 0x376, 0x13c, 0x3bc, 0x26b, 0x37f, 0x319, 0x61, 0x29b, 0x3b1, 0x17a, 0x176, 0x22a, 0x56, 0x213, 0x318, 0x2c, 0x2ee, 0xc7, 0x46, 0x2ca, 0x41, 0x329, 0x10a, 0x379, 0x2b7, 0x15f, 0x1bd, 0x130, 0xe0, 0x17, 0x13a, 0x212, 0x355, 0x59, 0x198, 0x1fb, 0x3fa, 0xa1, 0x33e, 0x30, 0x16b, 0x1e2, 0x106, 0x25, 0xcb, 0x31a, 0xb6, 0x204, 0x222, 0x23e, 0x1bb, 0x9e, 0x1de, 0x331, 0x3bb, 0x388, 0x234, 0x349, 0x3dc, 0xbd, 0xbb, 0x115, 0x2b, 0x30d, 0x18c, 0x16, 0x177, 0x267, 0x23, 0x165, 0x224, 0x390, 0x85, 0x3b8, 0x35f, 0x2ab, 0x2da, 0x98, 0x70, 0x20f, 0x9d, 0x109, 0x3ae, 0x228, 0xcc, 0x2f9, 0x1fd, 0x254, 0x19f, 0x18, 0x2b1, 0xf1, 0x83, 0x216, 0x261, 0x18d, 0x5b, 0x102, 0x111, 0x11f, 0x2d9, 0x4f, 0xef, 0x39c, 0x3d9, 0x1c4, 0x11a, 0x3a0, 0x1ee, 0x25a, 0x259, 0x28e, 0x211, 0x382, 0xc6, 0xb, 0x2bf, 0x337, 0x9a, 0x1d4, 0x386, 0x3e4, 0x375, 0x3d6, 0x97, 0x3ff, 0x3b0, 0x26e, 0x5, 0x2f2, 0x28d, 0x185, 0x6f, 0x2ba, 0x95, 0x2cb, 0x18, 0x16b, 0x3c4, 0x11, 0x128, 0xab, 0x398, 0x1d3, 0x40, 0x2c1, 0x1f5, 0x78, 0xce, 0xcf, 0x55, 0x181, 0x207, 0x1e3, 0x296, 0x140, 0x1d7, 0x228, 0x198, 0x3f6, 0x3f3, 0x101, 0x38c, 0x209, 0x266, 0xdc, 0x49, 0x282, 0x29a, 0x3f1, 0x35, 0x24, 0x10c, 0x1a7, 0x23f, 0x3ec, 0x3ac, 0x16d, 0x98, 0xe0, 0x2e, 0xe1, 0xb4, 0x135, 0x332, 0x2d1, 0x47, 0x107, 0xd0, 0x2f8, 0x360, 0x96, 0x365, 0x264, 0x1e8, 0x3e1, 0x187, 0x15b, 0x112, 0x390, 0x10a, 0x2fb, 0x2ce, 0x2ea, 0x3e6, 0x241, 0x7e, 0x392, 0x3e, 0x153, 0x1cb, 0x12b, 0x105, 0x1e4, 0x150, 0x65, 0x357, 0x186, 0x1c1, 0xc6, 0x16, 0x2ee, 0x18e, 0x118, 0x27d, 0x19, 0x1f1, 0x210, 0x397, 0x2cc, 0x3de, 0x4e, 0x144, 0x3bf, 0x171, 0x39b, 0x7d, 0x23c, 0x134, 0x359, 0xf, 0x237, 0x263, 0x55, 0x302, 0xe, 0x303, 0x13a, 0x5a, 0x135, 0x26d, 0x356, 0x238, 0x54, 0x236, 0x357, 0x30c, 0x30d, 0x239, 0x160, 0x16f, 0x358, 0x13b, 0x16e, 0x26c, 0x262, 0x161, 0x5b, 0x1, 0x134, 0x359, 0xf, 0x237, 0x263, 0x55, 0x302, 0xe, 0x303, 0x13a, 0x5a, 0x135, 0x26d, 0x356, 0x238, 0x54, 0x236, 0x357, 0x30c, 0x30d, 0x239, 0x160, 0x16f, 0x358, 0x13b, 0x16e, 0x26c, 0x262, 0x161, 0x5b, 0x1, 0x134, 0x359, 0xf, 0x237, 0x263, 0x55, 0x302, 0xe, 0x303, 0x13a, 0x5a, 0x135, 0x26d, 0x356, 0x238, 0x54, 0x236, 0x357, 0x30c, 0x30d, 0x239, 0x160, 0x16f, 0x358, 0x13b, 0x16e, 0x26c, 0x262, 0x161, 0x5b, 0x1, 0x134, 0x359, 0xf, 0x237, 0x263, 0x55, 0x302, 0xe, 0x303, 0x13a, 0x5a, 0x135, 0x26d, 0x356, 0x238, 0x54, 0x236, 0x357, 0x30c, 0x30d, 0x239, 0x160, 0x16f, 0x358, 0x13b, 0x16e, 0x26c, 0x268, 0x17f, 0x78, 0x338, 0xeb, 0x16d, 0x260, 0x21b, 0x392, 0xf8, 0x11d, 0x23c, 0x11a, 0x13f, 0x36e, 0x57, 0x2d4, 0x2c6, 0xde, 0x1fd, 0x284, 0x311, 0x6c, 0x4b, 0x2c3, 0x304, 0x177, 0x31c, 0xd2, 0x32b, 0x9b, 0x131, 0x161, 0xb6, 0x4, 0x1b2, 0x1f5, 0x1e0, 0xfb, 0x3ac, 0x1bd, 0x192, 0x7e, 0x253, 0x3e0, 0x7d, 0xe2, 0x61, 0xf5, 0x1a3, 0x15c, 0x342, 0x30a, 0x378, 0x3fd, 0x202, 0x5f, 0x1b0, 0x12c, 0x31e, 0xb, 0x1d5, 0x6b, 0x348, 0xb7, 0x26c, 0xcd, 0x18d, 0x2d8, 0x10, 0x2c1, 0x3dd, 0x389, 0x3ec, 0x2ab, 0x2fd, 0x241, 0x1f8, 0x15e, 0x39b, 0x1f4, 0x388, 0x184, 0x3d4, 0x285, 0x179, 0x113, 0x33, 0x1fb, 0x3ef, 0x1a, 0x17c, 0x2c9, 0xb9, 0x63, 0x2c, 0x35d, 0x1ac, 0x13b, 0x2dc, 0x1a2, 0x334, 0x23d, 0x372, 0x40, 0x316, 0x36f, 0x23f, 0x3ab, 0x2be, 0x3e6, 0x116, 0x3e9, 0x171, 0x277, 0x3d9, 0x23b, 0x219, 0x34b, 0x206, 0xd9, 0x1f5, 0x3c0, 0x3ec, 0x15f, 0x3e6, 0x22c, 0x3bf, 0x39a, 0x331, 0x3ce, 0x3fb, 0x2db, 0x14b, 0x109, 0x29e, 0xd3, 0x286, 0x399, 0x25a, 0x1d1, 0x3b2, 0x2e6, 0x2aa, 0x12a, 0xe3, 0x1b, 0x221, 0x2c3, 0x201, 0x1d5, 0xd6, 0x13b, 0x1b1, 0x281, 0x196, 0x398, 0x283, 0x24, 0x72, 0x10a, 0x3f5, 0x2cc, 0x2cf, 0x3a4, 0x1bb, 0x1f2, 0x1cf, 0x22e, 0x20d, 0x70, 0xb8, 0x1f, 0x145, 0x11e, 0x11a, 0x27e, 0x1a3, 0x2b8, 0x113, 0x66, 0x3e5, 0x347, 0x1a0, 0x3d3, 0x30c, 0x2f, 0x3d8, 0xa6, 0x183, 0x1ae, 0x3c4, 0x88, 0x282, 0xfd, 0x187, 0x2ca, 0x19, 0x393, 0x129, 0x188, 0x204, 0x268, 0x2fe, 0x1e0, 0x1f6, 0x2ab, 0x1f3, 0x116, 0x3db, 0x1cd, 0x39c, 0x1e7, 0x3f9, 0x369, 0x2a1, 0x280, 0x14f, 0x26d, 0x143, 0x3c8, 0x12d, 0x2ec, 0x1d9, 0x173, 0x155, 0x95, 0x275, 0x209, 0x314, 0x365, 0x304, 0x2ee, 0x6b, 0x299, 0x2dc, 0x344, 0xcb, 0x1cc, 0x345, 0x1b2, 0x3dd, 0x23f, 0x2b7, 0x3ba, 0x4e, 0x6d, 0x9e, 0x3be, 0x28f, 0x302, 0x70, 0x170, 0x7c, 0x23a, 0x1c4, 0x308, 0x29f, 0x14, 0x1d7, 0x2c8, 0x356, 0x1e4, 0x12d, 0x1d1, 0x36d, 0x38a, 0x17d, 0x284, 0x5f, 0x2c9, 0x2e4, 0x239, 0x312, 0x366, 0xd7, 0x3c4, 0x110, 0x21a, 0x3e1, 0x46, 0x1e6, 0x249, 0x262, 0x31a, 0x2ed, 0x200, 0x218, 0x85, 0x3f5, 0x191, 0x32e, 0x11f, 0x386, 0x237, 0x33c, 0x16d, 0x192, 0x1f8, 0x171, 0x1ce, 0x1e7, 0x3fb, 0x1bf, 0x125, 0x5a, 0x1ba, 0x256, 0xe8, 0x36b, 0x22f, 0x1a1, 0x21d, 0x3f6, 0x347, 0x340, 0x357, 0x56, 0x2f0, 0x3ee, 0x1da, 0x30, 0x133, 0x2e9, 0xc1, 0x177, 0x6b, 0x13b, 0x362, 0x216, 0xab, 0x1fe, 0xd4, 0x112, 0x17e, 0x52, 0x31, 0x81, 0x134, 0x2fe, 0x3c0, 0x3d1, 0x175, 0x30f, 0x288, 0x315, 0x371, 0x3d6, 0x162, 0xe, 0x2e, 0x20b, 0x145, 0x23c, 0x61, 0x3d4, 0x206, 0x3bd, 0x59, 0x36c, 0x364, 0x36f, 0x1dc, 0x32a, 0x3b5, 0x3a4, 0x2e5, 0x31f, 0x33c, 0x2da, 0x241, 0x3db, 0x33d, 0x1be, 0x12e, 0x207, 0x17, 0x20b, 0x28a, 0xe2, 0x308, 0x137, 0x50, 0x2a3, 0xd3, 0x20a, 0x1ee, 0x38d, 0x2d4, 0x21d, 0x3e5, 0x107, 0x236, 0x115, 0x2d2, 0x157, 0x95, 0x1c6, 0xd8, 0xb9, 0x318, 0x312, 0x2c5, 0x35c, 0x21f, 0x124, 0x3d0, 0x18e, 0x348, 0x1b1, 0x216, 0x156, 0x3f1, 0x2a9, 0x104, 0x393, 0xad, 0xb6, 0x20, 0x43, 0x123, 0x3fe, 0x191, 0x255, 0x75, 0xf, 0x338, 0x351, 0x3e6, 0xa2, 0x38e, 0x371, 0x3a5, 0x181, 0x70, 0x2e0, 0x1f0, 0x1f4, 0x7f, 0x1d8, 0x2a1, 0x212, 0xdd, 0x256, 0x1d0, 0x1b7, 0x15c, 0x226, 0x330, 0x47, 0xa8, 0x259, 0x2e8, 0x2e6, 0x2ba, 0x284, 0xbe, 0x336, 0x30d, 0x3d8, 0x298, 0x6, 0x34a, 0x370, 0xc1, 0x2ee, 0x1ac, 0x1ca, 0x245, 0x250, 0x29a, 0x2c7, 0x19d, 0xc8, 0x29c, 0x18d, 0x2ed, 0x9, 0x72, 0x21, 0x2c1, 0x1a7, 0x2fb, 0x2cc, 0x255, 0xea, 0x3c, 0x1f6, 0x175, 0x27, 0xda, 0xf9, 0x335, 0x159, 0x192, 0x3e9, 0x33d, 0x37c, 0xb1, 0x1c, 0x170, 0x1f0, 0x3e8, 0x1fc, 0x2db, 0x24a, 0x2d0, 0x325, 0x11a, 0x3d4, 0xa, 0x3ae, 0x26d, 0x20a, 0x3dc, 0x22f, 0x28d, 0x198, 0x47, 0x150, 0x176, 0x36d, 0x233, 0x3fd, 0x68, 0x3af, 0xac, 0x3ad, 0x127, 0xe3, 0xd8, 0x172, 0x7b, 0xa6, 0x3, 0x34a, 0x2e9, 0x304, 0x35d, 0x2f6, 0x13e, 0x44, 0x21a, 0x39f, 0x69, 0x16e, 0x10b, 0x156, 0x3eb, 0x2b6, 0x32, 0x14e, 0x18d, 0x1d3, 0x24, 0x390, 0x210, 0x31, 0x204, 0x364, 0x2d7, 0x379, 0x166, 0x32e, 0x75, 0x1e, 0xfb, 0x2be, 0x217, 0x6d, 0x278, 0x39e, 0x2a8, 0xc9, 0x3f0, 0x39a, 0x1be, 0x25c, 0xe, 0xb8, 0xf8, 0x1f4, 0xfe, 0x369, 0x125, 0x168, 0x396, 0x8d, 0x1ea, 0x5, 0x1d7, 0x332, 0x105, 0x1ee, 0x313, 0x342, 0xcc, 0x227, 0xa8, 0xbb, 0x18b, 0x295, 0x3f5, 0x93, 0x222, 0x2fe, 0x23f, 0x195, 0x363, 0x11f, 0xf, 0xfb, 0x175, 0x4e, 0x368, 0x3c1, 0x33c, 0x37a, 0x51, 0x315, 0x3be, 0x55, 0x130, 0x1f8, 0x39a, 0x37c, 0x162, 0x70, 0x392, 0x33f, 0x1e7, 0x3e7, 0x303, 0x20b, 0x23a, 0x23b, 0x3b0, 0x125, 0x2d0, 0x243, 0x61, 0x29f, 0xa0, 0x135, 0x256, 0x349, 0x346, 0x3bd, 0x2c8, 0x286, 0x1ee, 0x22f, 0x113, 0x269, 0x238, 0x12d, 0x293, 0x2c6, 0x3f6, 0x20e, 0x194, 0x2e8, 0x38a, 0x3fa, 0x68, 0x357, 0x2b0, 0x157, 0x254, 0x5f, 0x265, 0x5e, 0x3ee, 0x2cb, 0x1b, 0x258, 0x239, 0xa6, 0x6, 0x133, 0x365, 0x2c, 0x36a, 0xd7, 0x21f, 0x99, 0x177, 0x358, 0x24b, 0x22, 0x21a, 0x337, 0x1a4, 0x362, 0x94, 0x29a, 0x30e, 0x1e6, 0x26c, 0x196, 0x1fe, 0x2a9, 0x19, 0x14e, 0x31a, 0x345, 0x120, 0x17e, 0x290, 0x5b, 0x40, 0x218, 0x21, 0x87, 0x81, 0x1b2, 0x2d7, 0x2fb, 0x191, 0x146, 0x316, 0x246, 0x397, 0x122, 0xd9, 0x2d7, 0x1ff, 0x24d, 0x222, 0x1f5, 0xee, 0xb3, 0x255, 0x3a8, 0x3c0, 0x167, 0x3b5, 0x11f, 0x1e, 0x3ec, 0x3ba, 0xe9, 0x1c3, 0x19c, 0x15f, 0x27, 0x368, 0x38b, 0xeb, 0x3e6, 0x119, 0x278, 0x263, 0x2da, 0x22c, 0x315, 0x375, 0x154, 0x192, 0x3bf, 0x3bc, 0x28f, 0x4c, 0xfc, 0x39a, 0x2f1, 0x181, 0x380, 0x15e, 0x331, 0x12e, 0x1c, 0x1c9, 0x33f, 0x3ce, 0x387, 0x2e, 0xf8, 0x3d9, 0x3fb, 0x3c6, 0x301, 0x23a, 0x7f, 0x2db, 0x13a, 0x153, 0xe2, 0x76, 0x14b, 0x168, 0x243, 0xc2, 0x26e, 0x109, 0x374, 0x242, 0x3d4, 0x28, 0x29e, 0x256, 0x29b, 0x103, 0x1d7, 0xd3, 0x74, 0x36e, 0x1ed, 0x164, 0x286, 0x3dc, 0xae, 0x8a, 0x2d1, 0x399, 0x3c2, 0x342, 0x330, 0x238, 0x25a, 0x25e, 0x21d, 0x317, 0x150, 0x1d1, 0x2b5, 0x1fb, 0x20e, 0x328, 0x3b2, 0x6f, 0x3d7, 0x11b, 0x5d, 0x2e6, 0x1fd, 0x68, 0x2a7, 0x2d2, 0x2aa, 0x225, 0x10a, 0x87, 0x204, 0x316, 0x85, 0x247, 0x102, 0x18b, 0x246, 0x327, 0x81, 0x2c1, 0x123, 0x397, 0x244, 0x364, 0x295, 0x3cf, 0x122, 0x1b2, 0x34e, 0x3e3, 0x91, 0xd9, 0x1a7, 0x3f5, 0x24c, 0x268, 0x2d7, 0x3fe, 0x126, 0x134, 0x36f, 0x1ff, 0x93, 0x9a, 0x3b3, 0x2fb, 0x24d, 0x4d, 0x3dd, 0x379, 0x322, 0x222, 0x3ea, 0x3b8, 0x191, 0x111, 0x1f5, 0x1dc, 0x2cc, 0x28c, 0x2fe, 0xee, 0x166, 0x146, 0x17f, 0x77, 0xb3, 0xa3, 0x2bb, 0x23f, 0x25d, 0x255, 0x359, 0x31b, 0x32a, 0x32e, 0x3a8, 0x389, 0x195, 0x197, 0x1d4, 0x3c0, 0x2ce, 0x2cf, 0xea, 0x1e0, 0x167, 0x363, 0x75, 0xf0, 0x2b7, 0x3b5, 0x23e, 0x78, 0x35f, 0x3de, 0x11f, 0x3c, 0x3ab, 0x1ef, 0x28b, 0x1e, 0x3d1, 0x2f3, 0x341, 0xf, 0x3ec, 0x37d, 0x3a4, 0x203, 0x1f6, 0x3ba, 0x1d2, 0x305, 0xfb, 0x1dd, 0xe9, 0x386, 0x279, 0x2ea, 0x270, 0x1c3, 0x338, 0x175, 0x138, 0x2e5, 0x19c, 0x43, 0x21, 0x31, 0x8, 0x218, 0x108, 0x188, 0x40, 0xe4, 0x52, 0x5b, 0x200, 0x329, 0x290, 0x2d8, 0x24, 0x17e, 0xad, 0x2ed, 0x120, 0x3e2, 0x161, 0x345, 0x112, 0x32f, 0x31a, 0x21e, 0x82, 0x14e, 0xe6, 0xd4, 0x19, 0x262, 0x339, 0x2a9, 0xc8, 0x334, 0x1fe, 0x165, 0x249, 0x196, 0x3eb, 0x33a, 0x26c, 0xab, 0x367, 0x1e6, 0x344, 0x151, 0x30e, 0x32b, 0x216, 0x29a, 0x46, 0x16e, 0x94, 0xfd, 0x230, 0x362, 0xa9, 0x3e1, 0x1a4, 0x326, 0x141, 0x337, 0x13b, 0x106, 0x21a, 0x18e, 0x1ca, 0x22, 0xf4, 0x6b, 0x24b, 0x110, 0x3a9, 0x358, 0x27c, 0x92, 0x177, 0x2f6, 0x3c4, 0x99, 0x3aa, 0x39d, 0x21f, 0xc1, 0x16f, 0xd7, 0xdc, 0x201, 0x36a, 0x2b1, 0x2e9, 0x2c, 0x366, 0x1a5, 0x365, 0x160, 0x306, 0x133, 0x31e, 0x312, 0x6, 0x18a, 0xc6, 0xa6, 0x30, 0x4b, 0x239, 0x139, 0x180, 0x258, 0x1ec, 0x1da, 0x1b, 0x2e4, 0x37b, 0x2cb, 0xd8, 0x86, 0x84, 0x188, 0x80, 0x390, 0x290, 0x1b9, 0x90, 0x3e2, 0x2c2, 0x10f, 0x82, 0x29c, 0x398, 0x2a9, 0x190, 0xcb, 0x3eb, 0x27d, 0x1a2, 0x151, 0x215, 0xb7, 0x94, 0x1fa, 0xd2, 0x326, 0x282, 0xc7, 0x1ca, 0x44, 0x3d0, 0x358, 0xf1, 0x248, 0x3aa, 0x333, 0x6e, 0x201, 0x2dd, 0x2d6, 0x365, 0x2c0, 0x3, 0x18a, 0x18c, 0x298, 0x180, 0xb9, 0x3b9, 0x2cb, 0x1b0, 0x2f, 0x34f, 0x311, 0x186, 0x3ad, 0xa1, 0x3f2, 0x2b0, 0x15d, 0x34, 0x28e, 0x2e6, 0x3f3, 0x236, 0x1d9, 0x1bc, 0x20e, 0x176, 0x163, 0x38f, 0x149, 0x25e, 0xcc, 0x79, 0x1e1, 0x113, 0x2d1, 0xf7, 0x15c, 0xb2, 0x20a, 0x36e, 0x373, 0x1a6, 0x349, 0x5, 0x29e, 0x294, 0x3a1, 0x280, 0x1cb, 0xc2, 0x354, 0x2d0, 0x71, 0x1d8, 0x13a, 0x28a, 0xfe, 0x1e3, 0x1f, 0x3d9, 0x3e7, 0x5c, 0x39b, 0x323, 0x1c, 0x253, 0x26b, 0x2c4, 0x21b, 0x39a, 0x3a5, 0x98, 0x3db, 0x2eb, 0x154, 0x8b, 0x10c, 0x210, 0x5b, 0x12, 0x2fc, 0x161, 0x10f, 0x104, 0x262, 0xff, 0x2ca, 0x26c, 0x2ac, 0x215, 0x16e, 0x250, 0x3cb, 0x13b, 0x11, 0x1e8, 0x358, 0x1e2, 0x132, 0x16f, 0x35c, 0x1db, 0x160, 0x3, 0x314, 0x239, 0xed, 0x36, 0x30d, 0x3a3, 0x311, 0x30c, 0x2af, 0x101, 0x357, 0x2bd, 0x3fd, 0x236, 0x3b2, 0x2f9, 0x54, 0x34d, 0x33, 0x238, 0x1e1, 0x226, 0x356, 0x3b1, 0x1ed, 0x26d, 0x3a0, 0x5, 0x135, 0x242, 0x137, 0x5a, 0x11e, 0xec, 0x13a, 0x11d, 0x3f8, 0x303, 0x1f0, 0x3ce, 0xe, 0x253, 0xdf, 0x302, 0xfc, 0x1de, 0x55, 0x241, 0x223, 0x263, 0x1f3, 0xda, 0x237, 0x2be, 0xe9, 0xf, 0x35f, 0x2cf, 0x359, 0xee, 0x322, 0x134, 0x34e, 0x327, 0x1, 0x10c, 0x210, 0x5b, 0x12, 0x2fc, 0x161, 0x10f, 0x104, 0x262, 0xff, 0x2ca, 0x26c, 0x2ac, 0x215, 0x16e, 0x250, 0x3cb, 0x13b, 0x11, 0x1e8, 0x358, 0x1e2, 0x132, 0x16f, 0x35c, 0x1db, 0x160, 0x218, 0x52, 0x2d8, 0x120, 0x32f, 0xe6, 0x2a9, 0x249, 0xab, 0x30e, 0x16e, 0xa9, 0x337, 0x1ca, 0x110, 0x177, 0x39d, 0xdc, 0x2c, 0x306, 0x18a, 0x239, 0x1da, 0xd8, 0x5e, 0x24e, 0x2f8, 0x2b0, 0x17d, 0x340, 0x2e8, 0x378, 0x54, 0x293, 0xcc, 0x1e4, 0x22f, 0x59, 0x1d, 0x346, 0x2a3, 0x294, 0x29f, 0x5a, 0x23c, 0x3b0, 0x1c2, 0x1f4, 0x3e7, 0x170, 0x1ce, 0x162, 0x3f, 0xef, 0x55, 0x8b, 0x9e, 0x33c, 0x30f, 0x376, 0xfb, 0x1ef, 0xea, 0x23f, 0x191, 0x134, 0x295, 0x87, 0x8, 0xe4, 0x290, 0x2ed, 0x112, 0x14e, 0x339, 0x165, 0x26c, 0x151, 0x46, 0x362, 0x141, 0x18e, 0x24b, 0x92, 0x3aa, 0xd7, 0x2e9, 0x160, 0x6, 0x4b, 0x1ec, 0x2cb, 0x2c9, 0x2f0, 0x254, 0x3ed, 0x1ad, 0x3fa, 0x236, 0x36d, 0x3f6, 0x2a0, 0xb5, 0x269, 0x33b, 0x15c, 0x2c8, 0xe8, 0x206, 0x135, 0x8d, 0xd5, 0x2d0, 0x1c4, 0x1bf, 0x20b, 0x3bb, 0x307, 0x392, 0x26b, 0x39, 0x148, 0x2ed, 0x224, 0x131, 0x1fe, 0x27d, 0x10b, 0xfd, 0x348, 0x11, 0x3a9, 0x1e5, 0x6e, 0x2c, 0x205, 0x221, 0x1ec, 0x19f, 0x336, 0x3ad, 0x101, 0x147, 0x38a, 0x287, 0x2ec, 0x21d, 0x79, 0x313, 0x59, 0x3a, 0x103, 0x135, 0x11a, 0x354, 0x2ad, 0x7f, 0x385, 0x3e0, 0x24f, 0x1c0, 0x39a, 0x117, 0x241, 0x9e, 0x271, 0x27, 0x386, 0x3ab, 0x197, 0x2fe, 0x1ff, 0x244, 0x43, 0x210, 0x16c, 0x120, 0x257, 0x398, 0x165, 0xd1, 0x14d, 0x230, 0x245, 0x7a, 0x358, 0x381, 0x304, 0x366, 0x266, 0x318, 0x1da, 0x1b0, 0x178, 0x254, 0x3d3, 0x2bd, 0x3ef, 0x328, 0x163, 0x47, 0x2f4, 0x45, 0x286, 0x2d5, 0x355, 0x294, 0x137, 0x168, 0x1c4, 0x37e, 0x3e, 0x1e7, 0x1c, 0x2bc, 0x3d6, 0x260, 0x38e, 0x263, 0x3c5, 0x1bb, 0xfb, 0x3de, 0x3a8, 0x1dc, 0x126, 0x2c1, 0x21, 0x310, 0x12, 0x3e2, 0x23d, 0x350, 0x249, 0x156, 0x23, 0x362, 0x282, 0x231, 0x27c, 0x72, 0x129, 0x345, 0x208, 0x261, 0x367, 0xb7, 0x152, 0x18e, 0x13e, 0x132, 0x36a, 0x29d, 0x18c, 0x1da, 0x360, 0x1e9, 0x284, 0x147, 0x31d, 0x20e, 0x34d, 0x198, 0x33b, 0x179, 0xd3, 0x27e, 0x280, 0x8f, 0x3b0, 0x301, 0x37f, 0xe, 0x2bc, 0x3a5, 0x192, 0x4f, 0x271, 0x4e, 0x203, 0x167, 0x146, 0x36f, 0x327, 0x8, 0x390, 0x15a, 0x21e, 0x64, 0x32c, 0x30e, 0x1b1, 0x282, 0x6b, 0x1e2, 0x182, 0x366, 0xc5, 0x7b, 0x2cb, 0x336, 0x353, 0xd, 0x22a, 0xde, 0x54, 0x25e, 0xdb, 0x1ee, 0x3da, 0x291, 0x3d4, 0x2d, 0x71, 0x1bf, 0x3e, 0x3ce, 0x70, 0x1cd, 0x117, 0x8b, 0x278, 0x3ac, 0x270, 0x3c, 0x32a, 0x222, 0x34e, 0x10e, 0x40, 0xbf, 0x2c2, 0xd4, 0x320, 0x156, 0x46, 0x193, 0x3d, 0x358, 0x30b, 0xb, 0x306, 0x221, 0x3d8, 0x275, 0x186, 0x2ae, 0x68, 0x174, 0x2f9, 0x2a0, 0x2d4, 0x2d1, 0x36b, 0x2ef, 0xa5, 0x29f, 0x168, 0x388, 0x1e3, 0xe4, 0xad, 0x21e, 0xc8, 0xab, 0x46, 0x326, 0xf4, 0x2f6, 0xdc, 0x160, 0x30, 0x2e4, 0x34f, 0x2f8, 0x1ad, 0x3ef, 0xbb, 0x21d, 0x1e4, 0x15c, 0x26d, 0x27e, 0x109, 0x23c, 0x1bf, 0x7c, 0x323, 0x380, 0xef, 0x2a8, 0x288, 0x237, 0x3ba, 0xea, 0x1dc, 0x91, 0x43, 0x52, 0x2ed, 0x82, 0x334, 0x367, 0x16e, 0x141, 0x6b, 0x3c4, 0x201, 0x306, 0x4b, 0x37b, 0x38c, 0x56, 0x17d, 0x236, 0x35e, 0x47, 0x3c2, 0x59, 0xe8, 0x14, 0x1cb, 0x76, 0x1c2, 0x3bb, 0xe, 0x171, 0x28f, 0x8b, 0xf9, 0x2ab, 0x3a4, 0x3c0, 0x191, 0x1b2, 0x21, 0x5b, 0x120, 0x14e, 0x1fe, 0x1e6, 0x94, 0x337, 0x24b, 0x99, 0x36a, 0x133, 0x239, 0x2cb, 0x265, 0x157, 0x68, 0x2e8, 0x3f6, 0x12d, 0x113, 0x286, 0x346, 0x135, 0x61, 0x125, 0x23a, 0x3e7, 0x392, 0x37c, 0x130, 0x315, 0x33c, 0x4e, 0xf, 0x195, 0x222, 0x295, 0x31, 0x200, 0x3e2, 0xe6, 0x165, 0x344, 0xfd, 0x1c8, 0x2b4, 0xd4, 0x9b, 0x14d, 0x1a4, 0x44, 0x1d5, 0x2b1, 0x235, 0xed, 0x2c9, 0x353, 0x34, 0x2e8, 0x3e5, 0xbd, 0x8a, 0x3a, 0xa, 0x1cb, 0xec, 0x301, 0x1e7, 0xe0, 0x273, 0x2a8, 0x119, 0xce, 0x1ef, 0x2bb, 0x3fe, 0x1, 0x1c8, 0x2b4, 0xd4, 0x9b, 0x14d, 0x1a4, 0x44, 0x1d5, 0x2b1, 0x235, 0xed, 0x2c9, 0x353, 0x34, 0x2e8, 0x3e5, 0xbd, 0x8a, 0x3a, 0xa, 0x1cb, 0xec, 0x301, 0x1e7, 0xe0, 0x273, 0x2a8, 0x119, 0xce, 0x1ef, 0x2bb, 0x3fe, 0x1, 0x1c8, 0x2b4, 0xd4, 0x9b, 0x14d, 0x1a4, 0x44, 0x1d5, 0x2b1, 0x235, 0xed, 0x2c9, 0x353, 0x34, 0x2e8, 0x3e5, 0xbd, 0x8a, 0x3a, 0xa, 0x1cb, 0xec, 0x301, 0x1e7, 0xe0, 0x273, 0x2a8, 0x119, 0xce, 0x1ef, 0x2bb, 0x3fe, 0x1, 0x1c8, 0x2b4, 0xd4, 0x9b, 0x14d, 0x1a4, 0x44, 0x1d5, 0x2b1, 0x235, 0xed, 0x2c9, 0x353, 0x34, 0x2e8, 0x3e5, 0xbd, 0x8a, 0x3a, 0xa, 0x1cb, 0x390, 0x2c2, 0x2a9, 0x1a2, 0x1fa, 0x1ca, 0x248, 0x2dd, 0x18a, 0x3b9, 0x311, 0x2b0, 0x3f3, 0x176, 0xcc, 0xf7, 0x373, 0x294, 0x354, 0x28a, 0x3e7, 0x253, 0x3a5, 0x8b, 0x3e4, 0x2ea, 0xea, 0x379, 0x102, 0xe4, 0x2b4, 0x1a8, 0x26c, 0x27a, 0x276, 0x92, 0x1b5, 0x266, 0x1ec, 0x1c6, 0xac, 0x3fa, 0x259, 0x33, 0x33b, 0x3da, 0xa5, 0xd5, 0x2a6, 0x3ff, 0x392, 0x1eb, 0x324, 0xf9, 0x2be, 0x23e, 0x1dc, 0x244, 0x39, 0xad, 0x6a, 0x9b, 0x29a, 0x299, 0x220, 0x16f, 0x29d, 0x7b, 0x275, 0x2b, 0x2fa, 0x194, 0x30a, 0x3c8, 0x2f2, 0x12b, 0x137, 0x2ad, 0x3f9, 0x2e0, 0x37c, 0xc9, 0x13c, 0x2ab, 0x28b, 0x77, 0x91, 0x10c, 0x129, 0x21e, 0x320, 0x2a2, 0x1a4, 0x88, 0x35d, 0x1a5, 0x318, 0x19f, 0x30c, 0x2ba, 0x65, 0x2c6, 0xf2, 0x2b8, 0x34c, 0x34b, 0x1a9, 0x1fc, 0xb8, 0xdf, 0x130, 0x4f, 0x3ac, 0x3a4, 0x31b, 0x126, 0x43, 0x148, 0x283, 0xc8, 0x329, 0x31a, 0x165, 0x216, 0x337, 0x27c, 0x201, 0x6, 0x2e4, 0x24e, 0x357, 0x6f, 0x2a0, 0x113, 0x1d, 0x14, 0x243, 0x1bf, 0x3e0, 0x162, 0x3db, 0x263, 0x4e, 0x78, 0x191, 0x18b, 0x52, 0x345, 0xc8, 0x151, 0x1a4, 0x110, 0x16f, 0x133, 0x1ec, 0x38c, 0x2b0, 0x3ef, 0x1d1, 0x269, 0x36b, 0x2a3, 0x61, 0x13a, 0x3bb, 0x70, 0xef, 0x16d, 0x368, 0x3d1, 0x146, 0x295, 0x188, 0x120, 0x262, 0x367, 0x362, 0xf4, 0x39d, 0x365, 0x139, 0x2c9, 0x157, 0x340, 0x35e, 0x238, 0x15c, 0x34c, 0x29f, 0x2ad, 0x3fb, 0x392, 0x3d6, 0x8b, 0x3c1, 0x3ba, 0x359, 0x3f5, 0x8, 0x17e, 0xe6, 0x33a, 0x94, 0x18e, 0x3c4, 0x2c, 0x30, 0x30d, 0x254, 0x28e, 0x378, 0x12d, 0x8a, 0xe8, 0xa0, 0x23c, 0x1e3, 0x33f, 0x302, 0x2e7, 0x33c, 0x270, 0x3c0, 0x93, 0x43, 0x290, 0x21e, 0x249, 0x29a, 0x13b, 0x92, 0x36a, 0x18a, 0x37b, 0x5f, 0x1ad, 0x347, 0x293, 0x36c, 0x36e, 0x25b, 0x73, 0x33a, 0x128, 0x231, 0x21f, 0x2c0, 0x209, 0x2f0, 0x1a, 0x3b2, 0x47, 0x57, 0x1a6, 0x29f, 0x153, 0x3f7, 0xaf, 0x117, 0x144, 0x19c, 0x2cf, 0x36f, 0x31, 0x48, 0x131, 0x367, 0x2cd, 0x3d0, 0xd7, 0x235, 0x361, 0x30c, 0x2fa, 0x259, 0xcc, 0x3dc, 0x355, 0x61, 0x274, 0x2f7, 0x380, 0x2eb, 0x1f3, 0x386, 0x32a, 0xd9, 0x108, 0x1d3, 0x64, 0x151, 0x348, 0x49, 0x36a, 0x314, 0x1f7, 0x2f8, 0x2e6, 0x2a, 0x1a1, 0x105, 0xa, 0x243, 0x37e, 0x39b, 0x302, 0x1c7, 0xeb, 0x3a4, 0x77, 0x244, 0xe4, 0x2c2, 0x2b6, 0x216, 0x267, 0x1e2, 0x2c, 0x60, 0x2f, 0x284, 0xba, 0x3c3, 0x3c2, 0x199, 0x1ea, 0x2d0, 0x3f8, 0x1c9, 0x3d6, 0x116, 0x31f, 0x1ef, 0x1f5, 0x247, 0x200, 0x257, 0x3f1, 0x16e, 0x3d, 0x3ca, 0x365, 0x272, 0x336, 0x2aa, 0x65, 0x30a, 0x33b, 0x373, 0x242, 0x125, 0x3e8, 0x38, 0xef, 0x2da, 0x1bb, 0x2b7, 0x4d, 0x214, 0x2d8, 0xbf, 0x1cc, 0x1e6, 0x2a4, 0x2b9, 0x2e9, 0x298, 0x19b, 0x2aa, 0xca, 0x33, 0x1ee, 0x355, 0xc2, 0x1c2, 0x395, 0x7e, 0x1cf, 0x27, 0xf0, 0x93, 0x10c, 0x15a, 0x2a9, 0x10b, 0x267, 0x3c4, 0xb0, 0x300, 0x2f0, 0x34, 0x2d3, 0x238, 0x179, 0xa5, 0x2a1, 0xfa, 0x1c, 0xef, 0x1bd, 0x2e5, 0x195, 0xd9, 0x210, 0x345, 0x320, 0x13d, 0x1ca, 0x264, 0x205, 0x2e4, 0x12a, 0x115, 0x3f6, 0x1e1, 0x199, 0x3d4, 0x352, 0x3ff, 0xaf, 0x22e, 0x119, 0xfb, 0xa3, 0x123, 0x5b, 0x41, 0x32c, 0x230, 0x88, 0x2de, 0x18a, 0x1f7, 0x1f9, 0x38a, 0x150, 0x226, 0xe8, 0x280, 0x388, 0x2e, 0x1be, 0x324, 0x3c1, 0x2f3, 0x1f5, 0x87, 0x12, 0x29c, 0x367, 0x193, 0x35b, 0x2b1, 0x318, 0xe3, 0x2b0, 0x3a7, 0x12f, 0x356, 0x103, 0x396, 0x1bf, 0x39b, 0x20d, 0x315, 0x351, 0x23e, 0x2fb, 0x4, 0x2fc, 0x339, 0x391, 0x282, 0x2f6, 0x3b6, 0x272, 0x265, 0x2ba, 0x328, 0xcc, 0x17e, 0x339, 0x32b, 0x21a, 0x39d, 0x31e, 0x2cb, 0x56, 0x3ef, 0x293, 0x356, 0x206, 0x243, 0x1e3, 0x1ce, 0x130, 0xf9, 0x3ba, 0x2fe, 0x87, 0x24, 0x262, 0x30e, 0x106, 0x3aa, 0x133, 0x37b, 0x2f8, 0x38a, 0x2a0, 0x8a, 0x349, 0x5a, 0x1fc, 0x392, 0x28f, 0x288, 0xfb, 0x146, 0x85, 0x2d8, 0x19, 0x151, 0x13b, 0x99, 0x306, 0x2e4, 0x254, 0x5d, 0x38f, 0x22f, 0x34c, 0xd5, 0x23a, 0xe, 0xef, 0x37a, 0x386, 0xb3, 0x18b, 0x290, 0xd4, 0x344, 0x337, 0x3c4, 0x160, 0x1b, 0x3ad, 0x340, 0x2c6, 0x33b, 0x1d7, 0x61, 0x1c2, 0x323, 0x1f8, 0x263, 0x270, 0x23f, 0x81, 0x329, 0xe6, 0x1e6, 0x141, 0x2f6, 0x365, 0x1da, 0x30c, 0x3fa, 0x1d1, 0x36c, 0x346, 0x1cb, 0x1bf, 0x33f, 0x26, 0x9e, 0x175, 0x359, 0x397, 0x200, 0x14e, 0x367, 0x326, 0x177, 0x1a5, 0x1ec, 0x5f, 0x173, 0x54, 0x113, 0xe8, 0x109, 0x23b, 0x170, 0x3d6, 0x51, 0x19c, 0x32e, 0x295, 0x2fc, 0xff, 0x16e, 0x1e8, 0x35c, 0x239, 0x311, 0x2bd, 0x54, 0x226, 0x3a0, 0x5a, 0x3f8, 0x253, 0x55, 0xda, 0x35f, 0x134, 0x210, 0x10f, 0x26c, 0x3cb, 0x1e2, 0x160, 0x36, 0x2af, 0x236, 0x33, 0x3b1, 0x135, 0xec, 0x1f0, 0x302, 0x223, 0x2be, 0x359, 0x327, 0x12, 0x262, 0x215, 0x11, 0x16f, 0x314, 0x3a3, 0x357, 0x2f9, 0x1e1, 0x26d, 0x137, 0x11d, 0xe, 0x1de, 0x1f3, 0xf, 0x322, 0x10c, 0x161, 0x2ca, 0x250, 0x358, 0x1db, 0xed, 0x30c, 0x3fd, 0x34d, 0x356, 0x5, 0x11e, 0x303, 0xdf, 0x241, 0x237, 0x2cf, 0x34e, 0x5b, 0x104, 0x2ac, 0x13b, 0x132, 0x3, 0x30d, 0x101, 0x3b2, 0x238, 0x1ed, 0x242, 0x13a, 0x3ce, 0xfc, 0x263, 0xe9, 0xee, 0x1, 0x2fc, 0xff, 0x16e, 0x1e8, 0x35c, 0x239, 0x311, 0x2bd, 0x54, 0x226, 0x3a0, 0x5a, 0x3f8, 0x253, 0x55, 0xda, 0x35f, 0x134, 0x210, 0x10f, 0x26c, 0x3cb, 0x1e2, 0x160, 0x36, 0x2af, 0x236, 0x1f1, 0x3fc, 0x362, 0x2bf, 0x34a, 0x37b, 0x3f2, 0xde, 0x17a, 0x332, 0x137, 0x23a, 0x38, 0x2eb, 0x30f, 0x1e0, 0x122, 0x329, 0x398, 0x25f, 0xf4, 0x35c, 0x7b, 0x5f, 0x1c5, 0x149, 0x59, 0x1ea, 0x153, 0x307, 0x273, 0x2fd, 0xf, 0x24d, 0x39, 0x31a, 0xf3, 0x282, 0x39d, 0x63, 0xe3, 0x1ad, 0x2a, 0x226, 0x349, 0x168, 0x3ff, 0x171, 0x2b2, 0x2e5, 0xb3, 0x225, 0x15a, 0x165, 0x250, 0x2b9, 0x365, 0x361, 0xac, 0x347, 0x2d4, 0x3a, 0x109, 0xfe, 0x32d, 0x55, 0x1b4, 0x167, 0x1b2, 0x148, 0x1a8, 0x216, 0x231, 0x1b8, 0x139, 0x186, 0x3fd, 0x293, 0x143, 0x28, 0x1c4, 0xb8, 0x3a5, 0x288, 0x3ec, 0x4d, 0x108, 0x10f, 0xd1, 0x337, 0x30b, 0x22d, 0x2c9, 0x2ba, 0x176, 0x36c, 0x103, 0x8f, 0x303, 0x1be, 0x116, 0x19c, 0xa3, 0x10a, 0x2ed, 0x320, 0x1fa, 0x27c, 0xb0, 0x36, 0x157, 0xca, 0x198, 0x36e, 0x2e1, 0x37e, 0x1ce, 0xc9, 0x38b, 0x363, 0x3e2, 0x3eb, 0x326, 0x3aa, 0x18a, 0x34f, 0x28e, 0x38f, 0x15c, 0x294, 0x13a, 0x323, 0x3db, 0x1d6, 0xea, 0x397, 0x24, 0x334, 0x230, 0x92, 0x306, 0x30d, 0xd, 0x35e, 0x33b, 0x2a3, 0x76, 0x3e0, 0x26, 0xf9, 0x1ef, 0x2d7, 0x5b, 0x19, 0x29a, 0x24b, 0x2c, 0x1b, 0x157, 0x194, 0x269, 0x346, 0x243, 0x303, 0x37c, 0x51, 0xfb, 0x222, 0x108, 0x21e, 0x344, 0x18e, 0xdc, 0x139, 0x30c, 0x3ef, 0xb5, 0x1d, 0x109, 0x1fc, 0xaf, 0x2a8, 0x376, 0xb3, 0x43, 0x161, 0x33a, 0x141, 0x39d, 0xc6, 0x38c, 0x173, 0x2a0, 0x59, 0x3d4, 0x145, 0xe, 0x371, 0x30f, 0x3c0, 0x81, 0x17e, 0x1fe, 0x362, 0x177, 0x133, 0x3ee, 0x357, 0x3f6, 0x22f, 0x256, 0x125, 0x1e7, 0x1f8, 0x33c, 0x11f, 0x3f5, 0x200, 0x262, 0x46, 0x110, 0x366, 0x2e4, 0x284, 0x36d, 0x1e4, 0x1d7, 0x308, 0x7c, 0x302, 0x9e, 0x3ba, 0x3dd, 0x188, 0x82, 0x151, 0x1ca, 0x201, 0x180, 0x3ad, 0x3cd, 0x3b7, 0x106, 0x2de, 0x12c, 0x254, 0x1d9, 0xf2, 0x1d7, 0x219, 0x1f0, 0x26, 0x1f2, 0x3b5, 0x295, 0x1b9, 0x320, 0x3e1, 0x381, 0x53, 0x265, 0x3fd, 0x25e, 0x1d, 0x212, 0x3f9, 0x171, 0x2da, 0x203, 0x93, 0x1c8, 0x398, 0x16e, 0x35b, 0x29d, 0x3ee, 0x2a7, 0x3c3, 0x15c, 0x121, 0xe1, 0x12e, 0x1c7, 0x2be, 0x2fe, 0x62, 0x41, 0x151, 0x394, 0x16, 0x1b, 0x2ae, 0x259, 0x36c, 0x5, 0xe2, 0x170, 0x117, 0x1b4, 0x195, 0x316, 0x2b4, 0x33a, 0x282, 0x26f, 0x239, 0xbe, 0x233, 0x17a, 0xd3, 0x354, 0x3bb, 0x7e, 0x19e, 0x11f, 0x3e3, 0x12, 0x334, 0x69, 0x248, 0x6, 0xbc, 0x1a0, 0x21d, 0x2df, 0x2e1, 0x1e3, 0xdf, 0x22c, 0xfb, 0x4d, 0x29, 0xd4, 0x25, 0x1ac, 0x365, 0x19f, 0x2d2, 0x54, 0x114, 0x1ea, 0x145, 0x1c, 0x1df, 0x4e, 0x77, 0x4, 0x32f, 0x2c7, 0x11, 0x36a, 0xb9, 0x142, 0x36d, 0x3c8, 0x355, 0x76, 0x3c9, 0x98, 0x3c1, 0x393, 0x2c7, 0x22, 0x1b3, 0x1c1, 0xd, 0x163, 0x3dc, 0x1ba, 0x2f5, 0xdf, 0x51, 0x3ec, 0x268, 0x290, 0x2b6, 0x152, 0x39d, 0x318, 0xbe, 0x6f, 0x1e1, 0x291, 0x125, 0x395, 0x3bf, 0x2ab, 0x17f, 0x62, 0x82, 0x14d, 0x9f, 0x160, 0x360, 0x2fa, 0x293, 0x20a, 0x212, 0x3fb, 0x1cd, 0x2fd, 0x78, 0x244, 0x2fc, 0x3eb, 0x83, 0x2de, 0x258, 0x142, 0x2d3, 0x33b, 0x29e, 0x369, 0x1ce, 0x241, 0x338, 0x222, 0x29, 0x1a8, 0x94, 0x17b, 0x235, 0x38c, 0x1c5, 0x25a, 0x26d, 0x354, 0x37f, 0x1f8, 0xeb, 0x1d4, 0x87, 0x89, 0x156, 0x1ca, 0x16, 0x36, 0x2aa, 0x2ec, 0x2a5, 0xa0, 0xfe, 0x15e, 0x16d, 0x203, 0x126, 0x329, 0xff, 0x2cd, 0x3aa, 0x221, 0x95, 0x2e8, 0xf2, 0x3ae, 0x76, 0x39b, 0x260, 0x237, 0xa3, 0x42, 0x21e, 0x10b, 0xd6, 0x365, 0x33e, 0x35a, 0x2a0, 0x164, 0x137, 0x1f4, 0x21b, 0xcf, 0x11f, 0x3cf, 0x48, 0x196, 0x299, 0x182, 0x180, 0x32f, 0x30e, 0x110, 0x306, 0x5e, 0x340, 0xcc, 0x346, 0x23c, 0x170, 0x55, 0x376, 0x191, 0xe4, 0x339, 0x362, 0x3aa, 0x4b, 0x254, 0x36d, 0x33b, 0x135, 0x1bf, 0x26b, 0x51, 0x3d1, 0x1b2, 0xad, 0x33a, 0x21a, 0x2b1, 0x37b, 0x357, 0x38f, 0x2f2, 0x61, 0x7c, 0x26, 0x3c1, 0x32e, 0x21, 0x21e, 0x216, 0x358, 0x31e, 0x38c, 0x38a, 0x17a, 0x34c, 0x125, 0x323, 0x2e7, 0x175, 0x3dd, 0x5b, 0xc8, 0x3e1, 0x21f, 0x139, 0x56, 0x20e, 0x8a, 0x3d4, 0x23a, 0x380, 0x263, 0x11f, 0x397, 0x120, 0xab, 0x1ca, 0x2c, 0xd8, 0x17d, 0x293, 0x1d, 0x5a, 0x3e7, 0xef, 0x30f, 0x23f, 0x8, 0x14e, 0x46, 0x92, 0x6, 0x2f0, 0x236, 0x269, 0x206, 0x1c4, 0x392, 0x2a8, 0x386, 0x93, 0x329, 0x1fe, 0x326, 0x16f, 0x258, 0x284, 0x35e, 0x1ee, 0x1ba, 0x1e3, 0x37c, 0x288, 0x2b7, 0x18b, 0x161, 0x1e6, 0xf4, 0x1a5, 0x3ee, 0x28e, 0x47, 0x3bd, 0x308, 0x3e0, 0x130, 0x257, 0x23, 0x92, 0xc, 0x3d2, 0x194, 0x2d1, 0x50, 0x1fc, 0x2e2, 0x1f3, 0x3c0, 0x2, 0xa7, 0x46, 0x124, 0x18, 0x3ad, 0x328, 0x1ab, 0xa0, 0x3f8, 0x1cd, 0x3e6, 0x389, 0x4, 0x14e, 0x8c, 0x248, 0x30, 0x353, 0x259, 0x356, 0x140, 0x3f9, 0x39a, 0x3c5, 0x31b, 0x8, 0x29c, 0x118, 0x99, 0x60, 0x2af, 0xbb, 0x2a5, 0x280, 0x3fb, 0x33d, 0x383, 0x23f, 0x10, 0x131, 0x230, 0x132, 0xc0, 0x157, 0x176, 0x143, 0x109, 0x3ff, 0x273, 0x30f, 0x77, 0x20, 0x262, 0x69, 0x264, 0x180, 0x2ae, 0x2ec, 0x286, 0x212, 0x3f7, 0xef, 0x217, 0xee, 0x40, 0xcd, 0xd2, 0xc1, 0x300, 0x155, 0x1d1, 0x105, 0x2d, 0x3e7, 0x1de, 0x27, 0x1dc, 0x80, 0x19a, 0x1a4, 0x182, 0x209, 0x2aa, 0x3a2, 0x20a, 0x5a, 0x3c7, 0x3bc, 0x4e, 0x3b8, 0x100, 0x334, 0x348, 0x304, 0x1b, 0x15d, 0x34d, 0x1d, 0xb4, 0x387, 0x371, 0x9c, 0x379, 0x200, 0x261, 0x299, 0x201, 0xa7, 0x8c, 0x99, 0xc0, 0x2ae, 0x1d1, 0x20a, 0xb4, 0x307, 0x1df, 0xe9, 0x3f5, 0x90, 0x156, 0x24b, 0x189, 0xc3, 0x347, 0x45, 0x3a1, 0x1f4, 0xfc, 0x3ac, 0x2fe, 0x229, 0x190, 0x337, 0x370, 0x19f, 0x173, 0xbd, 0x291, 0x13a, 0xb1, 0x13c, 0x363, 0x214, 0x35, 0x94, 0x3ca, 0x7b, 0x3ed, 0x3c3, 0x1ed, 0x308, 0x39b, 0x324, 0xfb, 0xd9, 0x15a, 0x1e6, 0x3d0, 0x266, 0x24e, 0x3b2, 0x27f, 0x1ba, 0x385, 0x3a5, 0x368, 0x2cc, 0x1c8, 0x1fe, 0x83, 0x2dd, 0x30d, 0x1a0, 0x198, 0x206, 0x319, 0x15e, 0x37a, 0x1e0, 0x2, 0x14e, 0x118, 0x132, 0x180, 0x155, 0x3a2, 0x1d, 0x168, 0x207, 0x3be, 0x1d2, 0x3e3, 0x120, 0x2ac, 0x9f, 0x312, 0x186, 0x287, 0x8a, 0x34b, 0x3e8, 0x1f8, 0x351, 0x1f5, 0x5b, 0x320, 0x267, 0x2e9, 0x33e, 0x2e6, 0x17a, 0x12b, 0x274, 0x162, 0x278, 0x2cf, 0x21, 0x6a, 0x128, 0x39d, 0xf6, 0x3d3, 0x38f, 0x3da, 0x219, 0x33f, 0x14e, 0x230, 0xc1, 0x1b, 0x17d, 0xb5, 0x349, 0x145, 0x380, 0x33c, 0x359, 0x188, 0xc8, 0x337, 0x2e9, 0x275, 0x38a, 0x3c2, 0x294, 0x20b, 0x26, 0x237, 0x222, 0x290, 0x33a, 0xf4, 0x133, 0x24e, 0x36d, 0x1ee, 0x1cb, 0x2e, 0x55, 0x386, 0x91, 0x3e2, 0x30e, 0x92, 0x30, 0x157, 0x1d1, 0x1d, 0x2d0, 0xe, 0x1cf, 0x11f, 0x87, 0x82, 0xfd, 0x21f, 0x1da, 0x1ad, 0x12d, 0x34c, 0x13a, 0x162, 0xf9, 0x32e, 0x108, 0x2a9, 0x141, 0x2b1, 0x3ee, 0x5d, 0x1e4, 0x135, 0x1e3, 0x3d6, 0x368, 0x191, 0x329, 0x3eb, 0x22, 0x306, 0x2f0, 0x194, 0x356, 0x109, 0x3e7, 0x371, 0x270, 0x3f5, 0x120, 0x151, 0x27c, 0xa6, 0x56, 0x54, 0x2c8, 0x2a1, 0x323, 0x315, 0x1ef, 0x85, 0x21e, 0x94, 0x39d, 0x1ec, 0x357, 0x47, 0x1d7, 0x3b0, 0x26b, 0x288, 0x195, 0x218, 0x339, 0x326, 0x36a, 0x30d, 0x340, 0x269, 0x14, 0x1fc, 0x39a, 0x30f, 0x1dc, 0x200, 0x196, 0x1ca, 0x29c, 0xd2, 0x201, 0x1b0, 0x3f3, 0x113, 0x3a1, 0x3d9, 0x3db, 0x2ea, 0x34e, 0x345, 0x25, 0x3ca, 0x1ec, 0x2a7, 0x11c, 0x2a3, 0x37e, 0x1eb, 0x368, 0x322, 0xbf, 0x367, 0x220, 0x18, 0x157, 0x3a2, 0x74, 0x2ad, 0xe0, 0x19e, 0x359, 0x310, 0x320, 0x18e, 0x2c3, 0x22b, 0x378, 0x2b8, 0x184, 0x33f, 0x116, 0x35f, 0x43, 0x1cc, 0x193, 0x36a, 0x213, 0x11b, 0x36c, 0x140, 0x3f7, 0x371, 0xe9, 0x3cf, 0x112, 0x13d, 0x30b, 0x1da, 0x35a, 0xbd, 0x256, 0x384, 0x13, 0x237, 0x4d, 0x252, 0x1e6, 0x35b, 0x221, 0x284, 0x185, 0x1a3, 0x1c4, 0x15e, 0x1f3, 0x23f, 0x80, 0xcb, 0x1ca, 0x2c0, 0x186, 0x20e, 0xb2, 0x354, 0x323, 0x223, 0x3b5, 0x21, 0x1a8, 0x2a4, 0x2b1, 0x3d5, 0x174, 0x33b, 0x374, 0x17, 0x55, 0x305, 0x244, 0x32f, 0x8c, 0x264, 0x1b, 0x2fa, 0x2d4, 0x27e, 0x7d, 0xfc, 0x2ab, 0x3b3, 0x372, 0x344, 0x2b9, 0x318, 0x3ed, 0x317, 0x2ef, 0x3b0, 0x131, 0x348, 0x2c, 0x336, 0x287, 0x59, 0x354, 0x24f, 0x9e, 0x197, 0x210, 0x165, 0x7a, 0x266, 0x254, 0x163, 0x2d5, 0x1c4, 0x2bc, 0x3c5, 0x1dc, 0x12, 0x156, 0x27c, 0x298, 0x169, 0x12d, 0x12b, 0x384, 0x26, 0xce, 0x268, 0x161, 0xb7, 0x35d, 0x2e4, 0x1a0, 0xdb, 0xa0, 0x3f7, 0x2eb, 0x3a4, 0x247, 0x104, 0x3e1, 0x370, 0xe3, 0x6f, 0xae, 0xc2, 0x33f, 0x22c, 0x167, 0x218, 0xff, 0x20c, 0x306, 0x3d2, 0x176, 0x1d, 0x352, 0xe0, 0x33c, 0x17f, 0xb6, 0x26c, 0x1ac, 0x18c, 0x3ed, 0x227, 0x3ae, 0x1bf, 0x1eb, 0x2d9, 0x93, 0x1f1, 0x215, 0x99, 0x209, 0x2fa, 0x1a1, 0x1ea, 0x3e8, 0x3db, 0x1dd, 0x123, 0x21e, 0x250, 0x1ae, 0x3ee, 0x174, 0x27f, 0x1cb, 0xb8, 0x159, 0x78, 0x4, 0xcd, 0x13b, 0xb0, 0xc3, 0x20e, 0x164, 0x14b, 0x12e, 0x278, 0x255, 0x52, 0x19d, 0x1e8, 0x18a, 0x142, 0x185, 0x346, 0x319, 0x2e2, 0x30f, 0x379, 0x48, 0x151, 0x262, 0x13b, 0x160, 0x30c, 0x54, 0x26d, 0x13a, 0x302, 0x237, 0x134, 0x161, 0x16e, 0x16f, 0x30d, 0x236, 0x356, 0x5a, 0xe, 0x263, 0x359, 0x5b, 0x26c, 0x358, 0x239, 0x357, 0x238, 0x135, 0x303, 0x55, 0xf, 0x1, 0x262, 0x13b, 0x160, 0x30c, 0x54, 0x26d, 0x13a, 0x302, 0x237, 0x134, 0x161, 0x16e, 0x16f, 0x30d, 0x236, 0x356, 0x5a, 0xe, 0x263, 0x359, 0x5b, 0x26c, 0x358, 0x239, 0x357, 0x238, 0x135, 0x303, 0x55, 0xf, 0x1, 0x262, 0x13b, 0x160, 0x30c, 0x54, 0x26d, 0x13a, 0x302, 0x237, 0x134, 0x161, 0x16e, 0x16f, 0x30d, 0x236, 0x356, 0x5a, 0xe, 0x263, 0x359, 0x5b, 0x26c, 0x358, 0x239, 0x357, 0x238, 0x135, 0x303, 0x55, 0xf, 0x1, 0x262, 0x13b, 0x160, 0x30c, 0x54, 0x26d, 0x13a, 0x302, 0x237, 0x134, 0x161, 0x16e, 0x16f, 0x30d, 0x236, 0x356, 0x5a, 0xe, 0x263, 0x359, 0x5b, 0x26c, 0x358, 0x239, 0x357, 0x238, 0x135, 0xcd, 0xe5, 0x312, 0xac, 0x292, 0x256, 0x1f, 0xc9, 0x3d1, 0x86, 0xff, 0x22, 0xc, 0x155, 0xb5, 0xf5, 0x3d9, 0x2e7, 0x3de, 0x84, 0x165, 0x1e8, 0x221, 0xd, 0x198, 0x50, 0x3e7, 0x375, 0x75, 0x188, 0x9b, 0x1ac, 0x239, 0x2a7, 0xf2, 0x1ba, 0x5c, 0x2b2, 0x3c0, 0x80, 0x251, 0x27c, 0x272, 0x2bd, 0x3c2, 0x11a, 0x39b, 0x51, 0x32a, 0x390, 0x367, 0x124, 0x209, 0x3fa, 0x226, 0x26e, 0x323, 0x13c, 0xa3, 0x290, 0x3cc, 0x1d5, 0x2e4, 0x289, 0x1ab, 0x5a, 0x1c, 0x19e, 0x2fe, 0x1b9, 0x10b, 0x39d, 0x2ff, 0x174, 0x1ee, 0x8f, 0x253, 0x3e6, 0x3b8, 0x90, 0x29a, 0x37, 0x33e, 0x6f, 0x2b8, 0x3b, 0x26b, 0xda, 0x24d, 0x3e2, 0x8c, 0x304, 0x2c9, 0x287, 0x164, 0x125, 0x2c4, 0x31f, 0x134, 0x2c2, 0x1b1, 0x36a, 0xbc, 0x259, 0x1d, 0x153, 0x21b, 0x2ab, 0x1a7, 0x10f, 0xa9, 0x16b, 0x127, 0x35e, 0x2d5, 0x319, 0x39a, 0x9c, 0x3cf, 0x82, 0x19a, 0x394, 0xa6, 0x2d2, 0x2f4, 0x8d, 0x39b, 0xa2, 0xb3, 0xbf, 0x215, 0xc1, 0x360, 0x287, 0x2c8, 0x9d, 0x20d, 0x19c, 0x2c1, 0x1cc, 0x106, 0x3, 0x2ae, 0xb5, 0x1ea, 0x37f, 0x315, 0x197, 0xa4, 0x1e6, 0x1d5, 0x1c1, 0x236, 0x143, 0x1a9, 0x380, 0x351, 0x1a7, 0x21e, 0x2a4, 0x34a, 0x254, 0x30a, 0x5, 0x3fb, 0x1df, 0x23e, 0x188, 0x136, 0x2b9, 0x1ec, 0x22a, 0x27f, 0x243, 0x253, 0x3c5, 0x2fb, 0x89, 0x1fa, 0x2e9, 0x22b, 0x3e5, 0x1d7, 0x2f5, 0x117, 0xf, 0x4, 0x261, 0x24b, 0x298, 0x35a, 0x3c2, 0x234, 0x277, 0x288, 0x2cc, 0x2fc, 0x46, 0x304, 0x19b, 0x20e, 0x332, 0x274, 0x26, 0x279, 0x316, 0x339, 0x11, 0xc, 0x2aa, 0x2d4, 0x3a1, 0x1e7, 0x4f, 0x255, 0x290, 0x391, 0x35d, 0x30d, 0xca, 0x105, 0x2ad, 0x21b, 0x15f, 0x295, 0x6a, 0x282, 0x133, 0x142, 0x33, 0x14, 0x3f7, 0x375, 0xea, 0x229, 0xd1, 0x2f6, 0x3b9, 0xba, 0x1ee, 0x334, 0x24b, 0x139, 0x173, 0x22f, 0x308, 0x26b, 0x368, 0x91, 0x14e, 0x13b, 0x312, 0x2b0, 0x17a, 0x8d, 0x33f, 0x288, 0x191, 0x3e2, 0x230, 0x2c, 0x30c, 0x2a0, 0x256, 0x7c, 0x8b, 0x195, 0x329, 0x30e, 0xc1, 0x2c9, 0x20e, 0x26d, 0x1c2, 0x130, 0x3d1, 0x218, 0x3eb, 0x92, 0x1b, 0x3ef, 0x59, 0x125, 0x302, 0x19c, 0x18b, 0x339, 0x22, 0x30, 0x17d, 0x113, 0xd5, 0x12e, 0x3c1, 0x134, 0x31a, 0x326, 0x306, 0x157, 0xb5, 0x3d4, 0x1e7, 0x9e, 0x146, 0xad, 0x16e, 0x36a, 0x2f0, 0x1d1, 0x349, 0x1f4, 0x2e7, 0x363, 0x52, 0x1e6, 0x3aa, 0x30d, 0x194, 0x1d, 0x145, 0x1f8, 0x3ba, 0x21, 0x165, 0x3a9, 0x258, 0x340, 0x356, 0x2d0, 0x380, 0x2ab, 0x295, 0xd4, 0x21a, 0x18a, 0xd, 0x269, 0x109, 0xe, 0x33c, 0x3dd, 0x345, 0xa9, 0x1a5, 0x254, 0x21d, 0x14, 0x3e7, 0x1cf, 0x359, 0x2d8, 0x216, 0xd7, 0x34f, 0x35e, 0x346, 0x1fc, 0x371, 0x11f, 0x188, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; + +#endif diff --git a/crypto_kem/hqc-256/avx2/api.h b/crypto_kem/hqc-256/avx2/api.h new file mode 100644 index 00000000..fe2b52ae --- /dev/null +++ b/crypto_kem/hqc-256/avx2/api.h @@ -0,0 +1,25 @@ +#ifndef PQCLEAN_HQC256_AVX2_API_H +#define PQCLEAN_HQC256_AVX2_API_H +/** + * @file api.h + * @brief NIST KEM API used by the HQC_KEM IND-CCA2 scheme + */ + +#define PQCLEAN_HQC256_AVX2_CRYPTO_ALGNAME "HQC-256" + +#define PQCLEAN_HQC256_AVX2_CRYPTO_SECRETKEYBYTES 8738 +#define PQCLEAN_HQC256_AVX2_CRYPTO_PUBLICKEYBYTES 8698 +#define PQCLEAN_HQC256_AVX2_CRYPTO_BYTES 64 +#define PQCLEAN_HQC256_AVX2_CRYPTO_CIPHERTEXTBYTES 17379 + +// As a technicality, the public key is appended to the secret key in order to respect the NIST API. +// Without this constraint, PQCLEAN_HQC256_AVX2_CRYPTO_SECRETKEYBYTES would be defined as 32 + +int PQCLEAN_HQC256_AVX2_crypto_kem_keypair(unsigned char *pk, unsigned char *sk); + +int PQCLEAN_HQC256_AVX2_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk); + +int PQCLEAN_HQC256_AVX2_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-256/avx2/bch.c b/crypto_kem/hqc-256/avx2/bch.c new file mode 100644 index 00000000..82a2dc1a --- /dev/null +++ b/crypto_kem/hqc-256/avx2/bch.c @@ -0,0 +1,367 @@ +#include "alpha_table.h" +#include "bch.h" +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include "vector.h" +#include +#include +#include +/** + * @file bch.c + * Constant time implementation of BCH codes + */ + + +static uint16_t mod(uint16_t i, uint16_t modulus); +static void compute_cyclotomic_cosets(uint16_t *cosets, uint16_t upper_bound); +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes); +static void message_from_codeword(uint64_t *message, const uint64_t *codeword); +static void compute_syndromes(__m256i *syndromes, const uint64_t *rcv); +static void compute_roots(uint64_t *error, const uint16_t *sigma); + +/** + * @brief Returns i modulo the given modulus. + * + * i must be less than 2*modulus. + * Therefore, the return value is either i or i-modulus. + * @returns i mod (modulus) + * @param[in] i The integer whose modulo is taken + * @param[in] modulus The modulus + */ +static uint16_t mod(uint16_t i, uint16_t modulus) { + uint16_t tmp = i - modulus; + + // mask = 0xffff if(i < PARAM_GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & modulus); +} + + + +/** + * @brief Computes the odd binary cyclotomic cosets modulo 2^m-1 for integers less than upper_bound. + * + * The array cosets of size 2^m-1 is filled by placing at index i the coset representative of i. + * @param[out] cosets Array receiving the coset representatives + * @param[in] upper_bound The upper bound + */ +static void compute_cyclotomic_cosets(uint16_t *cosets, uint16_t upper_bound) { + // Compute the odd cyclotomic classes + for (uint16_t i = 1 ; i < upper_bound ; i += 2) { + if (cosets[i] == 0) { // If i does not already belong to a class + uint16_t tmp = i; + size_t j = PARAM_M; + cosets[i] = i; + while (--j) { // Complete i's class + tmp = mod(2 * tmp, PARAM_GF_MUL_ORDER); + cosets[tmp] = i; + } + } + } +} + + + +/** + * @brief Computes the generator polynomial of the primitive BCH code with given parameters. + * + * Code length is 2^m-1.
+ * Parameter t is the targeted correction capacity of the code + * and receives the real correction capacity (which is at least equal to the target).
+ * exp and log are arrays giving antilog and log of GF(2^m) elements. + * @returns the degree of the generator polynomial + * @param[out] bch_poly Array of size (m*t + 1) receiving the coefficients of the generator polynomial + * @param[in,out] t Targeted correction capacity; receives the real correction capacity + * @param[in] exp Antilog table of GF(2^m) + * @param[in] log Log table of GF(2^m) + */ +size_t PQCLEAN_HQC256_AVX2_compute_bch_poly(uint16_t *bch_poly, size_t *t, const uint16_t *exp, const uint16_t *log) { + uint16_t cosets[PARAM_GF_MUL_ORDER]; + size_t deg_bch_poly = 0; + + memset(cosets, 0, 2 * PARAM_GF_MUL_ORDER); + compute_cyclotomic_cosets(cosets, 2 * *t); + + // Start with bch_poly(X) = 1 + bch_poly[0] = 1; + + for (uint16_t i = 1 ; i < PARAM_GF_MUL_ORDER ; ++i) { + if (cosets[i] == 0) { + continue; + } + + // Multiply bch_poly(X) by X-a^i + for (size_t j = deg_bch_poly ; j ; --j) { + int16_t mask = -((uint16_t) - bch_poly[j] >> 15); + bch_poly[j] = (mask & exp[mod(log[bch_poly[j]] + i, PARAM_GF_MUL_ORDER)]) ^ bch_poly[j - 1]; + } + bch_poly[0] = exp[mod(log[bch_poly[0]] + i, PARAM_GF_MUL_ORDER)]; + bch_poly[++deg_bch_poly] = 1; + } + + // Determine the real correction capacity + while (cosets[2 * *t + 1] != 0) { + ++*t; + } + + return deg_bch_poly; +} + + + +/** + * @brief Computes the values alpha^ij for decoding syndromes + * + * function to initialize a table which contains values alpha^ij for i in [0,N1[ and j in [1,2*PARAM_DELTA] + * these values are used in order to compute the syndromes of the received word v(x)=v_0+v_1x+...+v_{n1-1}x^{n1-1} + * value alpha^ij is stored in alpha_ij_table[2*PARAM_DELTA*i+j-1] + * The syndromes are equal to v(alpha^k) for k in [1,2*PARAM_DELTA] + * Size of the table is fixed to match 256 bit representation + * Useless values are filled with 0. + * + * @param[in] exp Exp look-up-table of GF + */ +void PQCLEAN_HQC256_AVX2_table_alphaij_generation(const uint16_t *exp) { + int32_t tmp_value; + int16_t *alpha_tmp; + + // pre-computation of alpha^ij for i in [0, N1[ and j in [1, 2*PARAM_DELTA] + // see comment of alpha_ij_table_init() function. + for (uint16_t i = 0; i < PARAM_N1 ; ++i) { + tmp_value = 0; + alpha_tmp = table_alpha_ij + i * (PARAM_DELTA << 1); + for (uint16_t j = 0 ; j < (PARAM_DELTA << 1) ; j++) { + tmp_value = PQCLEAN_HQC256_AVX2_gf_mod(tmp_value + i); + alpha_tmp[j] = exp[tmp_value]; + } + } +} + + + +/** + * @brief Computes the error locator polynomial (ELP) sigma + * + * This is a constant time implementation of Berlekamp's simplified algorithm (see @cite joiner1995decoding).
+ * We use the letter p for rho which is initialized at -1/2.
+ * The array X_sigma_p represents the polynomial X^(2(mu-rho))*sigma_p(X).
+ * Instead of maintaining a list of sigmas, we update in place both sigma and X_sigma_p.
+ * sigma_copy serves as a temporary save of sigma in case X_sigma_p needs to be updated.
+ * We can properly correct only if the degree of sigma does not exceed PARAM_DELTA. + * This means only the first PARAM_DELTA + 1 coefficients of sigma are of value + * and we only need to save its first PARAM_DELTA - 1 coefficients. + * + * @returns the degree of the ELP sigma + * @param[out] sigma Array of size (at least) PARAM_DELTA receiving the ELP + * @param[in] syndromes Array of size (at least) 2*PARAM_DELTA storing the syndromes + */ +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes) { + sigma[0] = 1; + size_t deg_sigma = 0; + size_t deg_sigma_p = 0; + uint16_t sigma_copy[PARAM_DELTA - 1] = {0}; + size_t deg_sigma_copy = 0; + uint16_t X_sigma_p[PARAM_DELTA + 1] = {0, 1}; + int32_t pp = -1; // 2*rho + uint16_t d_p = 1; + uint16_t d = syndromes[0]; + + for (size_t mu = 0 ; mu < PARAM_DELTA ; ++mu) { + // Save sigma in case we need it to update X_sigma_p + memcpy(sigma_copy, sigma, 2 * (PARAM_DELTA - 1)); + deg_sigma_copy = deg_sigma; + + uint16_t dd = PQCLEAN_HQC256_AVX2_gf_mul(d, PQCLEAN_HQC256_AVX2_gf_inverse(d_p)); // 0 if(d == 0) + for (size_t i = 1 ; (i <= 2 * mu + 1) && (i <= PARAM_DELTA) ; ++i) { + sigma[i] ^= PQCLEAN_HQC256_AVX2_gf_mul(dd, X_sigma_p[i]); + } + + size_t deg_X = 2 * mu - pp; // 2*(mu-rho) + size_t deg_X_sigma_p = deg_X + deg_sigma_p; + + // mask1 = 0xffff if(d != 0) and 0 otherwise + int16_t mask1 = -((uint16_t) - d >> 15); + + // mask2 = 0xffff if(deg_X_sigma_p > deg_sigma) and 0 otherwise + int16_t mask2 = -((uint16_t) (deg_sigma - deg_X_sigma_p) >> 15); + + // mask12 = 0xffff if the deg_sigma increased and 0 otherwise + int16_t mask12 = mask1 & mask2; + deg_sigma = (mask12 & deg_X_sigma_p) ^ (~mask12 & deg_sigma); + + if (mu == PARAM_DELTA - 1) { + break; + } + + // Update pp, d_p and X_sigma_p if needed + pp = (mask12 & (2 * mu)) ^ (~mask12 & pp); + d_p = (mask12 & d) ^ (~mask12 & d_p); + for (size_t i = PARAM_DELTA - 1 ; i ; --i) { + X_sigma_p[i + 1] = (mask12 & sigma_copy[i - 1]) ^ (~mask12 & X_sigma_p[i - 1]); + } + X_sigma_p[1] = 0; + X_sigma_p[0] = 0; + deg_sigma_p = (mask12 & deg_sigma_copy) ^ (~mask12 & deg_sigma_p); + + // Compute the next discrepancy + d = syndromes[2 * mu + 2]; + for (size_t i = 1 ; (i <= 2 * mu + 1) && (i <= PARAM_DELTA) ; ++i) { + d ^= PQCLEAN_HQC256_AVX2_gf_mul(sigma[i], syndromes[2 * mu + 2 - i]); + } + } + + return deg_sigma; +} + + + +/** + * @brief Retrieves the message message from the codeword codeword + * + * Since we performed a systematic encoding, the message is the last PARAM_K bits of the codeword. + * + * @param[out] message Array of size VEC_K_SIZE_BYTES receiving the message + * @param[in] codeword Array of size VEC_N1_SIZE_BYTES storing the codeword + */ +static void message_from_codeword(uint64_t *message, const uint64_t *codeword) { + int32_t val = PARAM_N1 - PARAM_K; + + uint64_t mask1 = (uint64_t) (0xffffffffffffffff << val % 64); + uint64_t mask2 = (uint64_t) (0xffffffffffffffff >> (64 - val % 64)); + size_t index = val / 64; + + for (size_t i = 0 ; i < VEC_K_SIZE_64 - 1 ; ++i) { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + uint64_t message2 = (codeword[++index] & mask2) << (64 - val % 64); + message[i] = message1 | message2; + } + + // Last byte (8-val % 8 is the number of bits given by message1) + if ((PARAM_K % 64 == 0) || (64 - val % 64 < PARAM_K % 64)) { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + uint64_t message2 = (codeword[++index] & mask2) << (64 - val % 64); + message[VEC_K_SIZE_64 - 1] = message1 | message2; + } else { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + message[VEC_K_SIZE_64 - 1] = message1; + } +} + + + +/** + * @brief Computes the 2^PARAM_DELTA syndromes from the received vector vector + * + * Syndromes are the sum of powers of alpha weighted by vector's coefficients. + * These powers have been pre-computed in table_alphaPARAM_DELTA.h + * Syndromes are 16-bits long , hence we can simultaneously compute 16 syndromes + * in a 256-bit register + * + * @param[out] syndromes Array of size 2^(PARAM_FFT_T) receiving the 2*PARAM_DELTA syndromes + * @param[in] rcv Array of size VEC_N1_SIZE_BYTES storing the received word + */ +void compute_syndromes(__m256i *syndromes, const uint64_t *rcv) { + const __m256i zero_256 = _mm256_set1_epi64x(0); + const __m256i mask_one = _mm256_set_epi64x(0x0303030303030303, 0x0202020202020202, 0x0101010101010101, 0x0); + const __m256i mask_two = _mm256_set1_epi64x(-0x7FBFDFEFF7FBFDFF); + const __m256i un_256 = _mm256_set1_epi64x(1); + + __m256i y; + __m256i S; + __m256i L; + __m256i tmp_repeat; + uint32_t *aux; + int16_t *alpha_tmp; + uint32_t i; + // static variable so that it is stored in the DATA segment + // not in the STACK segment + static uint8_t tmp_array[PARAM_N1 + 4]; // +4 to control overflow due to management of 256 bits + __m256i *z = (__m256i *) tmp_array; + // vectorized version of the separation of the coordinates of the vector v in order to put each coordinate in an unsigned char + // aux is used to consider 4 elements in v at each step of the loop + aux = (uint32_t *) rcv; + for (i = 0 ; i < ((VEC_N1_SIZE_BYTES >> 2) << 2) ; i += 4) { + // duplicate aux 8 times in y , i.e y= (aux aux aux .... aux) + y = _mm256_set1_epi32(*aux); + // shuffle the bytes of y so that if aux=(a0 a1 a2 a3) + // then y = (a0 a0 a0 a0 a0 a0 a0 a0 a1 a1 a1 a1 a1 a1 a1 a1 .... a3) + y = _mm256_shuffle_epi8(y, mask_one); + // apply a mask on each byte of y to determine if jth bit of a_k is 0 or 1 + z[i >> 2] = _mm256_and_si256(y, mask_two); + aux ++; + } + + // Evaluation of the polynomial corresponding to the vector v in alpha^i for i in {1, ..., 2 * PARAM_DELTA} + for (size_t j = 0 ; j < SYND_SIZE_256 ; ++j) { + S = zero_256; + alpha_tmp = table_alpha_ij + (j << 4); + + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + tmp_repeat = _mm256_set1_epi64x((long long)(tmp_array[i] != 0)); + L = _mm256_cmpeq_epi64(tmp_repeat, un_256); + tmp_repeat = _mm256_lddqu_si256((__m256i *)(alpha_tmp + i * (PARAM_DELTA << 1))); + L = _mm256_and_si256(L, tmp_repeat); + S = _mm256_xor_si256(L, S); + } + _mm256_storeu_si256(syndromes + j, S); + } +} + + +/** + * @brief Computes the error polynomial error from the error locator polynomial sigma + * + * See function PQCLEAN_HQC256_AVX2_fft for more details. + * + * @param[out] error Array of VEC_N1_SIZE_BYTES elements receiving the error polynomial + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + */ +static void compute_roots(uint64_t *error, const uint16_t *sigma) { + uint16_t w[1 << PARAM_M] = {0}; // w will receive the evaluation of sigma in all field elements + + PQCLEAN_HQC256_AVX2_fft(w, sigma, PARAM_DELTA + 1); + PQCLEAN_HQC256_AVX2_fft_retrieve_bch_error_poly(error, w); +} + + + +/** + * @brief Decodes the received word + * + * This function relies on four steps: + *
    + *
  1. The first step, done by additive FFT transpose, is the computation of the 2*PARAM_DELTA syndromes. + *
  2. The second step is the computation of the error-locator polynomial sigma. + *
  3. The third step, done by additive FFT, is finding the error-locator numbers by calculating the roots of the polynomial sigma and takings their inverses. + *
  4. The fourth step is the correction of the errors in the received polynomial. + *
+ * For a more complete picture on BCH decoding, see Shu. Lin and Daniel J. Costello in Error Control Coding: Fundamentals and Applications @cite lin1983error + * + * @param[out] message Array of size VEC_K_SIZE_BYTES receiving the decoded message + * @param[in] vector Array of size VEC_N1_SIZE_BYTES storing the received word + */ + +void PQCLEAN_HQC256_AVX2_bch_code_decode(uint64_t *message, uint64_t *vector) { + uint16_t sigma[1 << PARAM_FFT] = {0}; + uint64_t error[(1 << PARAM_M) / 8] = {0}; + static __m256i syndromes_256[SYND_SIZE_256]; + + // Calculate the 2*PARAM_DELTA syndromes + compute_syndromes(syndromes_256, vector); + + // Compute the error locator polynomial sigma + // Sigma's degree is at most PARAM_DELTA but the FFT requires the extra room + compute_elp(sigma, (uint16_t *)syndromes_256); + + // Compute the error polynomial error + compute_roots(error, sigma); + + // Add the error polynomial to the received polynomial + PQCLEAN_HQC256_AVX2_vect_add(vector, vector, error, VEC_N1_SIZE_64); + + // Retrieve the message from the decoded codeword + message_from_codeword(message, vector); + +} diff --git a/crypto_kem/hqc-256/avx2/bch.h b/crypto_kem/hqc-256/avx2/bch.h new file mode 100644 index 00000000..b066d437 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/bch.h @@ -0,0 +1,23 @@ +#ifndef BCH_H +#define BCH_H + + +/** + * @file bch.h + * Header file of bch.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQC256_AVX2_bch_code_decode(uint64_t *message, uint64_t *vector); + + +size_t PQCLEAN_HQC256_AVX2_compute_bch_poly(uint16_t *bch_poly, size_t *t, const uint16_t *exp, const uint16_t *log); + +void PQCLEAN_HQC256_AVX2_table_alphaij_generation(const uint16_t *exp); + + +#endif diff --git a/crypto_kem/hqc-256/avx2/code.c b/crypto_kem/hqc-256/avx2/code.c new file mode 100644 index 00000000..8bd97d71 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/code.c @@ -0,0 +1,114 @@ +#include "bch.h" +#include "code.h" +#include "gen_matrix.h" +#include "parameters.h" +#include "repetition.h" +#include +#include +#include +/** + * @file code.c + * @brief Implementation of tensor code + */ + + +static inline uint64_t mux(uint64_t a, uint64_t b, int64_t bit); + +static inline uint64_t mux(uint64_t a, uint64_t b, int64_t bit) { + uint64_t ret = a ^ b; + return (ret & (-bit >> 63)) ^ a; +} + + + +/** + * + * @brief Encoding the message m to a code word em using the tensor code + * + * We encode the message using the BCH code. For each bit obtained, + * we duplicate the bit PARAM_N2 times to apply repetition code. + * BCH encoding is done using the classical mG operation, + * columns of the matrix are stored in 256-bit registers + * + * @param[out] em Pointer to an array that is the tensor code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQC256_AVX2_code_encode(uint64_t *em, const uint64_t *m) { + uint64_t res; + uint32_t i; + static const uint64_t mask[2][3] = {{0x0UL, 0x0UL, 0x0UL}, {0xFFFFFFFFFFFFFFFFUL, 0xFFFFFFFFFFFFFFFFUL, 0x3FFFFFUL}}; + + + __m256i *colonne, y, aux0; + __m256i msg = _mm256_lddqu_si256((const __m256i *) m); + colonne = ((__m256i *) gen_matrix); + + for (i = 0 ; i < PARAM_N1 - PARAM_K ; i++) { + // y is the and operation between m and ith column of G + y = _mm256_and_si256(colonne[i], msg); + // aux0 = (y2 y3 y0 y1) + aux0 = _mm256_permute2x128_si256(y, y, 1); + // y = (y0^y2 y1^y3 y2^y0 y3^y1) + y = _mm256_xor_si256(y, aux0); + // aux0 = (y1^y3 y0^y2 y1^y3 y0^y2) + aux0 = _mm256_shuffle_epi32(y, 0x4e); + // y = (y0^y1^y2^y3 repeated 4 times) + y = _mm256_xor_si256(aux0, y); + res = _mm_popcnt_u64(_mm256_extract_epi64(y, 0)) & 1; + + + uint16_t pos_r = PARAM_N2 * i; + uint16_t idx_r = (pos_r & 0x3f); + uint64_t *p64 = em; + p64 += pos_r >> 6; + uint64_t select = mux(mask[0][0], mask[1][0], res); + *p64 ^= select << idx_r; + int64_t aux = (41 - idx_r); + uint64_t aux2 = (aux > 0); + uint64_t idx2 = aux * aux2; + select = mux(mask[0][1], mask[1][1], res); + *(p64 + 1) ^= select >> idx2; + select = mux(mask[0][2], mask[1][2], res); + *(p64 + 2) ^= select >> ((63 - idx_r)); + } + + /* now we add the message m */ + /* systematic encoding */ + for (int32_t i = 0 ; i < 4 ; i++) { + for (int32_t j = 0 ; j < 64 ; j++) { + uint8_t bit = (m[i] >> j) & 0x1; + uint32_t pos_r = PARAM_N2 * ((PARAM_N1 - PARAM_K) + ((i << 6) + j)); + uint16_t idx_r = (pos_r & 0x3f); + uint64_t *p64 = em; + + + p64 += pos_r >> 6; + uint64_t select = mux(mask[0][0], mask[1][0], bit); + *p64 ^= select << idx_r; + int64_t aux = (41 - idx_r); + uint64_t aux2 = (aux > 0); + uint64_t idx2 = aux * aux2; + select = mux(mask[0][1], mask[1][1], bit); + *(p64 + 1) ^= select >> idx2; + select = mux(mask[0][2], mask[1][2], bit); + *(p64 + 2) ^= select >> ((63 - idx_r)); + } + } + +} + + +/** + * @brief Decoding the code word em to a message m using the tensor code + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQC256_AVX2_code_decode(uint64_t *m, const uint64_t *em) { + + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQC256_AVX2_repetition_code_decode(tmp, em); + PQCLEAN_HQC256_AVX2_bch_code_decode(m, tmp); + +} diff --git a/crypto_kem/hqc-256/avx2/code.h b/crypto_kem/hqc-256/avx2/code.h new file mode 100644 index 00000000..0a34604f --- /dev/null +++ b/crypto_kem/hqc-256/avx2/code.h @@ -0,0 +1,20 @@ +#ifndef CODE_H +#define CODE_H + + +/** + * @file code.h + * Header file of code.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQC256_AVX2_code_encode(uint64_t *em, const uint64_t *message); + +void PQCLEAN_HQC256_AVX2_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-256/avx2/fft.c b/crypto_kem/hqc-256/avx2/fft.c new file mode 100644 index 00000000..4a12768c --- /dev/null +++ b/crypto_kem/hqc-256/avx2/fft.c @@ -0,0 +1,333 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include +#include +#include +/** + * @file fft.c + * Implementation of the additive FFT and its transpose. + * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + */ + + +static void compute_fft_betas(uint16_t *betas); +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size); +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f); +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); + + +/** + * @brief Computes the basis of betas (omitting 1) used in the additive FFT and its transpose + * + * @param[out] betas Array of size PARAM_M-1 + */ +static void compute_fft_betas(uint16_t *betas) { + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + betas[i] = 1 << (PARAM_M - 1 - i); + } +} + + + +/** + * @brief Computes the subset sums of the given set + * + * The array subset_sums is such that its ith element is + * the subset sum of the set elements given by the binary form of i. + * + * @param[out] subset_sums Array of size 2^set_size receiving the subset sums + * @param[in] set Array of set_size elements + * @param[in] set_size Size of the array set + */ +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size) { + subset_sums[0] = 0; + + for (size_t i = 0 ; i < set_size ; ++i) { + for (size_t j = 0 ; j < (1U << i) ; ++j) { + subset_sums[(1 << i) + j] = set[i] ^ subset_sums[j]; + } + } +} + + + +/** + * @brief Computes the radix conversion of a polynomial f in GF(2^m)[x] + * + * Computes f0 and f1 such that f(x) = f0(x^2-x) + x.f1(x^2-x) + * as proposed by Bernstein, Chou and Schwabe: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f0 Array half the size of f + * @param[out] f1 Array half the size of f + * @param[in] f Array of size a power of 2 + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f) { + switch (m_f) { + case 4: + f0[4] = f[8] ^ f[12]; + f0[6] = f[12] ^ f[14]; + f0[7] = f[14] ^ f[15]; + f1[5] = f[11] ^ f[13]; + f1[6] = f[13] ^ f[14]; + f1[7] = f[15]; + f0[5] = f[10] ^ f[12] ^ f1[5]; + f1[4] = f[9] ^ f[13] ^ f0[5]; + + f0[0] = f[0]; + f1[3] = f[7] ^ f[11] ^ f[15]; + f0[3] = f[6] ^ f[10] ^ f[14] ^ f1[3]; + f0[2] = f[4] ^ f0[4] ^ f0[3] ^ f1[3]; + f1[1] = f[3] ^ f[5] ^ f[9] ^ f[13] ^ f1[3]; + f1[2] = f[3] ^ f1[1] ^ f0[3]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 3: + f0[0] = f[0]; + f0[2] = f[4] ^ f[6]; + f0[3] = f[6] ^ f[7]; + f1[1] = f[3] ^ f[5] ^ f[7]; + f1[2] = f[5] ^ f[6]; + f1[3] = f[7]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 2: + f0[0] = f[0]; + f0[1] = f[2] ^ f[3]; + f1[0] = f[1] ^ f0[1]; + f1[1] = f[3]; + return; + + case 1: + f0[0] = f[0]; + f1[0] = f[1]; + return; + + default: + ; + size_t n = 1 << (m_f - 2); + + uint16_t Q[2 * (1 << (PARAM_FFT - 2))]; + uint16_t R[2 * (1 << (PARAM_FFT - 2))]; + + uint16_t Q0[1 << (PARAM_FFT - 2)]; + uint16_t Q1[1 << (PARAM_FFT - 2)]; + uint16_t R0[1 << (PARAM_FFT - 2)]; + uint16_t R1[1 << (PARAM_FFT - 2)]; + + memcpy(Q, f + 3 * n, 2 * n); + memcpy(Q + n, f + 3 * n, 2 * n); + memcpy(R, f, 4 * n); + + for (size_t i = 0 ; i < n ; ++i) { + Q[i] ^= f[2 * n + i]; + R[n + i] ^= Q[i]; + } + + radix(Q0, Q1, Q, m_f - 1); + radix(R0, R1, R, m_f - 1); + + memcpy(f0, R0, 2 * n); + memcpy(f0 + n, Q0, 2 * n); + memcpy(f1, R1, 2 * n); + memcpy(f1 + n, Q1, 2 * n); + } +} + + + +/** + * @brief Evaluates f at all subset sums of a given set + * + * This function is a subroutine of the function fft. + * + * @param[out] w Array + * @param[in] f Array + * @param[in] f_coeffs Number of coefficients of f + * @param[in] m Number of betas + * @param[in] m_f Number of coefficients of f (one more than its degree) + * @param[in] betas FFT constants + */ +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + uint16_t f0[1 << (PARAM_FFT - 2)]; + uint16_t f1[1 << (PARAM_FFT - 2)]; + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + size_t k = 1 << (m - 1); + uint16_t gammas_sums[1 << (PARAM_M - 2)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + uint16_t tmp[PARAM_M - (PARAM_FFT - 1)]; + for (size_t i = 0 ; i < m ; ++i) { + tmp[i] = PQCLEAN_HQC256_AVX2_gf_mul(betas[i], f[1]); + } + + w[0] = f[0]; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + w[(1 << j) + k] = w[k] ^ tmp[j]; + } + } + + return; + } + + // Step 2: compute g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQC256_AVX2_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQC256_AVX2_gf_mul(beta_m_pow, f[i]); + } + } + + // Step 3 + radix(f0, f1, f, m_f); + + // Step 4: compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQC256_AVX2_gf_mul(betas[i], PQCLEAN_HQC256_AVX2_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQC256_AVX2_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + + if (f_coeffs <= 3) { // 3-coefficient polynomial f case: f1 is constant + w[0] = u[0]; + w[k] = u[0] ^ f1[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC256_AVX2_gf_mul(gammas_sums[i], f1[0]); + w[k + i] = w[i] ^ f1[0]; + } + } else { + fft_rec(v, f1, f_coeffs / 2, m - 1, m_f - 1, deltas); + + // Step 6 + memcpy(w + k, v, 2 * k); + w[0] = u[0]; + w[k] ^= u[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC256_AVX2_gf_mul(gammas_sums[i], v[i]); + w[k + i] ^= w[i]; + } + } +} + + + +/** + * @brief Evaluates f on all fields elements using an additive FFT algorithm + * + * f_coeffs is the number of coefficients of f (one less than its degree).
+ * The FFT proceeds recursively to evaluate f at all subset sums of a basis B.
+ * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf
+ * Note that on this first call (as opposed to the recursive calls to fft_rec), gammas are equal to betas, + * meaning the first gammas subset sums are actually the subset sums of betas (except 1).
+ * Also note that f is altered during computation (twisted at each level). + * + * @param[out] w Array + * @param[in] f Array of 2^PARAM_FFT elements + * @param[in] f_coeffs Number coefficients of f (i.e. deg(f)+1) + */ +void PQCLEAN_HQC256_AVX2_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs) { + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + uint16_t f0[1 << (PARAM_FFT - 1)]; + uint16_t f1[1 << (PARAM_FFT - 1)]; + uint16_t deltas[PARAM_M - 1]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)]; + uint16_t v[1 << (PARAM_M - 1)]; + + // Follows Gao and Mateer algorithm + compute_fft_betas(betas); + + // Step 1: PARAM_FFT > 1, nothing to do + + // Compute gammas sums + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + // Step 2: beta_m = 1, nothing to do + + // Step 3 + radix(f0, f1, f, PARAM_FFT); + + // Step 4: Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQC256_AVX2_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + fft_rec(v, f1, f_coeffs / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + + // Step 6, 7 and error polynomial computation + memcpy(w + k, v, 2 * k); + + // Check if 0 is root + w[0] = u[0]; + + // Check if 1 is root + w[k] ^= u[0]; + + // Find other roots + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC256_AVX2_gf_mul(betas_sums[i], v[i]); + w[k + i] ^= w[i]; + } +} + + + +/** + * @brief Retrieves the error polynomial error from the evaluations w of the ELP (Error Locator Polynomial) on all field elements. + * + * @param[out] error Array of size VEC_N1_SIZE_BYTES + * @param[in] w Array of size 2^PARAM_M + */ +void PQCLEAN_HQC256_AVX2_fft_retrieve_bch_error_poly(uint64_t *error, const uint16_t *w) { + uint16_t gammas[PARAM_M - 1]; + uint16_t gammas_sums[1 << (PARAM_M - 1)]; + size_t k = 1 << (PARAM_M - 1); + size_t index = PARAM_GF_MUL_ORDER; + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + error[0] ^= ((uint64_t) 1) ^ ((uint16_t) - w[0] >> 15); + uint64_t bit = ((uint64_t) 1) ^ ((uint16_t) - w[k] >> 15); + error[index / 8] ^= bit << (index % 64); + + for (size_t i = 1 ; i < k ; ++i) { + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQC256_AVX2_gf_log(gammas_sums[i]); + bit = ((uint64_t) 1) ^ ((uint16_t) - w[i] >> 15); + error[index / 64] ^= bit << (index % 64); + + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQC256_AVX2_gf_log(gammas_sums[i] ^ 1); + bit = ((uint64_t) 1) ^ ((uint16_t) - w[k + i] >> 15); + error[index / 64] ^= bit << (index % 64); + } +} diff --git a/crypto_kem/hqc-256/avx2/fft.h b/crypto_kem/hqc-256/avx2/fft.h new file mode 100644 index 00000000..c43d78be --- /dev/null +++ b/crypto_kem/hqc-256/avx2/fft.h @@ -0,0 +1,20 @@ +#ifndef FFT_H +#define FFT_H + + +/** + * @file fft.h + * Header file of fft.c + */ + +#include + +#include +#include + +void PQCLEAN_HQC256_AVX2_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs); + +void PQCLEAN_HQC256_AVX2_fft_retrieve_bch_error_poly(uint64_t *error, const uint16_t *w); + + +#endif diff --git a/crypto_kem/hqc-256/avx2/gen_matrix.h b/crypto_kem/hqc-256/avx2/gen_matrix.h new file mode 100644 index 00000000..9e1978f1 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/gen_matrix.h @@ -0,0 +1,16 @@ +#ifndef GEN_MATRIX_H +#define GEN_MATRIX_H + + +/** + * @file gen_matrix.h + * Header file that contain precomputed generator matrix of the BCH code defined in the file parameters.h + */ + +#include "parameters.h" +#include "parameters.h" + + +uint64_t gen_matrix[(PARAM_N1 - PARAM_K) * 4] = {0xb559382d23cb5841UL, 0x6eb4069ac7109bfUL, 0x1e7e1471cb9ab712UL, 0x2217983e7d0d472cUL, 0xdfeb4877645de8c3UL, 0xb3dc0baf4931ac0UL, 0x22823c925cafd936UL, 0x6638a8428717c974UL, 0xbfd690eec8bbd186UL, 0x167b8175e9263581UL, 0x45047924b95fb26cUL, 0xcc7150850e2f92e8UL, 0xcaf419f0b2bcfb4dUL, 0x2a1c42827e3d62bcUL, 0x9476e638b925d3caUL, 0xbaf53934615262fcUL, 0x20b10bcc46b2aedbUL, 0x52d3c56d500bccc6UL, 0x3693d800b9d11086UL, 0x57fdea56bfa982d5UL, 0x416217988d655db6UL, 0xa5a78adaa017998cUL, 0x6d27b00173a2210cUL, 0xaffbd4ad7f5305aaUL, 0x379d171c3901e32dUL, 0x4da455dcec5e3aa7UL, 0xc43174732cdef50bUL, 0x7de0316483ab4c78UL, 0x6f3a2e387203c65aUL, 0x9b48abb9d8bc754eUL, 0x8862e8e659bdea16UL, 0xfbc062c9075698f1UL, 0xde745c70e4078cb4UL, 0x36915773b178ea9cUL, 0x10c5d1ccb37bd42dUL, 0xf780c5920ead31e3UL, 0xbce8b8e1c80f1968UL, 0x6d22aee762f1d539UL, 0x218ba39966f7a85aUL, 0xef018b241d5a63c6UL, 0x79d171c3901e32d0UL, 0xda455dcec5e3aa73UL, 0x43174732cdef50b4UL, 0xde0316483ab4c78cUL, 0x46fbdbaa03f73de1UL, 0xb261fbf427b65d59UL, 0x98509a145044167bUL, 0x9e11b4ae0864c834UL, 0x8df7b75407ee7bc2UL, 0x64c3f7e84f6cbab2UL, 0x30a13428a0882cf7UL, 0x3c23695c10c99069UL, 0xaeb656852c17afc5UL, 0xcf6cafb932a87cdaUL, 0x7f3c7c208a8aeefcUL, 0x5a514a865c9e67feUL, 0x5d6cad0a582f5f8aUL, 0x9ed95f726550f9b5UL, 0xfe78f8411515ddf9UL, 0xb4a2950cb93ccffcUL, 0xf8062399395e755UL, 0x3b59fe8d66d0fad5UL, 0xe28fe4f3e1b10ce1UL, 0x4b52b2270f74d8d5UL, 0xaa59fc5e04e096ebUL, 0x7058bd7361d0fc15UL, 0xdb61dd9608f8aed0UL, 0xb4b2fc7063e4f687UL, 0xe1eac0912a0a7597UL, 0xe65a3a8f6fd0f194UL, 0xa8bdaf5dda6beab2UL, 0x4b7260debac4aa23UL, 0x768cb90f77dfb36fUL, 0xca5f357773d0ea96UL, 0x4f054aca7f4d6277UL, 0xb4f359830884136bUL, 0x58404a33cc743e9fUL, 0x92552a874bd0dc93UL, 0x807481e5350073fdUL, 0x4bf12b386c0561faUL, 0x5d9ac4abb23257fUL, 0x224115673bd0b099UL, 0x1e9717bba19a50e9UL, 0xb5f5ce4ea50784d9UL, 0xbb3589576464afeUL, 0x44822ace77a16132UL, 0x3d2e2f774334a1d2UL, 0x6beb9c9d4a0f09b2UL, 0xa23f8907cf47cdbdUL, 0x8fef15f54333cbdbUL, 0x64224a9f4df3f4b6UL, 0xf5c0a104e9135448UL, 0xf1262a22bd44c33bUL, 0x19356b832a169e08UL, 0xd63a814f507d5e7fUL, 0xc996da37af2befbcUL, 0xe24c54457a898676UL, 0x326ad706542d3c11UL, 0xac75029ea0fabcfeUL, 0x932db46f5e57df79UL, 0x71c190a7d6d854adUL, 0x623eee65042b719cUL, 0x4694114c8a6fceeeUL, 0x44cf0e0c1a2f9dfUL, 0x56da19628e7bf11bUL, 0xc2969ca3a427ea87UL, 0x935636e8df452aceUL, 0x2a8e79fffe48b492UL, 0x18ed0ae83f3cba77UL, 0x83c6792ee43edcb1UL, 0x38d279a07510e28fUL, 0x770b6bc1819c2e09UL, 0x84832dfd5db22cafUL, 0x167b234640cb0ddUL, 0x6fdae73121bb720dUL, 0xcc014fbd7e351b3eUL, 0xbc5f63d798af011fUL, 0x424240164686804UL, 0xc1cbda1388ec5308UL, 0xba15074481677150UL, 0x78bec7af315e023eUL, 0x8484802c8d0d009UL, 0x8397b42711d8a610UL, 0x742a0e8902cee2a1UL, 0xf17d8f5e62bc047cUL, 0x1090900591a1a012UL, 0x72f684e23b14c20UL, 0xe8541d12059dc543UL, 0x57a22691e6b350b9UL, 0x27ca60628f32499aUL, 0x1020c4ed8cf82f52UL, 0xf2bfa21a7636cdaaUL, 0xaf444d23cd66a172UL, 0x4f94c0c51e649334UL, 0x204189db19f05ea4UL, 0xe57f4434ec6d9b54UL, 0x5e889a479acd42e4UL, 0x9f29818a3cc92669UL, 0x408313b633e0bd48UL, 0xcafe8869d8db36a8UL, 0x8480ca21651dd89UL, 0x38b8437dd5e3456dUL, 0x9f78331dac5bcd83UL, 0xb7ea88edccbb2a7cUL, 0x109019442ca3bb12UL, 0x717086fbabc68adaUL, 0x3ef0663b58b79b06UL, 0x6fd511db997654f9UL, 0x94790aa57a8c2e65UL, 0xe40a4d9efbfc1c0bUL, 0x639ed8077af5811eUL, 0xfdbdbb894fe1eedeUL, 0x9dab2d67d6d3048bUL, 0xceffdb545b8931a8UL, 0xd943a47f3e71b52fUL, 0xd96cef2ce2ce9a90UL, 0x3b565acfada60916UL, 0x9dffb6a8b7126351UL, 0xb28748fe7ce36a5fUL, 0xb2d9de59c59d3521UL, 0xc3f58db278874a6dUL, 0x3d142d38c255cf1dUL, 0x7b70858d325c63adUL, 0x47a4248df6372d6fUL, 0x87eb1b64f10e94daUL, 0x7a285a7184ab9e3bUL, 0xf6e10b1a64b8c75aUL, 0x8f48491bec6e5adeUL, 0xfd636c9e21d29b4UL, 0xf450b4e309573c77UL, 0xedc21634c9718eb4UL, 0x1e909237d8dcb5bdUL, 0xaaf555bee7f10b29UL, 0xee4a29afbedf7151UL, 0xc5fa38185979aa7bUL, 0x1f36bc51ccb42c57UL, 0xe0b39350ec294e13UL, 0xda7f1336d1cfeb1cUL, 0x958a64417969e3e5UL, 0x1c7ae09de4651f83UL, 0x743e1e8cfb99c467UL, 0xb21566040feedf86UL, 0x356adcf3394970d9UL, 0x1ae25905b5c7782bUL, 0xe87c3d19f73388ceUL, 0x642acc081fddbf0cUL, 0x6ad5b9e67292e1b3UL, 0x35c4b20b6b8ef056UL, 0xd0f87a33ee67119cUL, 0xc85598103fbb7e19UL, 0xd5ab73cce525c366UL, 0x6b896416d71de0acUL, 0x14a9cc4aff057b79UL, 0x96407049d307f58cUL, 0xb528f3e801d131dfUL, 0xf5055013d3368675UL, 0x9c0aa0b8ddc1aeb3UL, 0x2a6ba0fa0a7ee2a7UL, 0x742ff3a1c838d4adUL, 0xc81d3819db604bc7UL, 0x8d4c795c98480527UL, 0x523c019db88cccf0UL, 0xf621f3325beb1e48UL, 0xb22de80dcbcdd0a2UL, 0x1a98f2b930900a4eUL, 0xa478033b711999e1UL, 0xec43e664b7d63c90UL, 0x645bd01b979ba145UL, 0x3531e5726120149cUL, 0x48f00676e23333c2UL, 0xd887ccc96fac7921UL, 0xc8b7a0372f37428bUL, 0x6a63cae4c2402938UL, 0x91e00cedc4666784UL, 0xb10f9992df58f242UL, 0x916f406e5e6e8517UL, 0x619eade4a74b0a31UL, 0x252b59b224bdc6b7UL, 0x7c612754752b5397UL, 0xc918e2c1d04d03UL, 0xc33d5bc94e961462UL, 0x4a56b364497b8d6eUL, 0xf8c24ea8ea56a72eUL, 0x19231c583a09a06UL, 0x33238fbfbee77085UL, 0x924626a13e861362UL, 0xeffa89201f37f94eUL, 0x2133fbb57a4c7321UL, 0x66471f7f7dcee10aUL, 0x248c4d427d0c26c4UL, 0xdff512403e6ff29dUL, 0x4267f76af498e643UL, 0x79d706d3d8569a55UL, 0x4ff3daed56694437UL, 0xa19430f1b7455228UL, 0xa6d876eb943c8babUL, 0xf3ae0da7b0ad34aaUL, 0x9fe7b5daacd2886eUL, 0x432861e36e8aa450UL, 0x4db0edd728791757UL, 0x5205236242913115UL, 0x39242bdcf5d41962UL, 0x982ed7b7168fffb3UL, 0xb97643902dff6982UL, 0x11537ee9a6e93a6bUL, 0x74a317d047d93b7bUL, 0x2e23bb1fe6854874UL, 0x50fb1f1e26f39429UL, 0x22a6fdd34dd274d6UL, 0xe9462fa08fb276f6UL, 0x5c47763fcd0a90e8UL, 0xa1f63e3c4de72852UL, 0x454dfba69ba4e9acUL, 0xd28c5f411f64edecUL, 0xb88eec7f9a1521d1UL, 0x43ec7c789bce50a4UL, 0x3fc2cf6014828b19UL, 0xa3f3feeb92b8d267UL, 0x6f63cc8effb0f4b1UL, 0xa5cf60cf4a91e665UL, 0x7f859ec029051632UL, 0x47e7fdd72571a4ceUL, 0xdec7991dff61e963UL, 0x4b9ec19e9523cccaUL, 0x4a5205ad71c17425UL, 0x8924bbc7e6924023UL, 0xa3f1264a355965d4UL, 0xb52a1b03574adeb9UL, 0x94a40b5ae382e84aUL, 0x1249778fcd248046UL, 0x47e24c946ab2cba9UL, 0x6a543606ae95bd73UL, 0x294816b5c705d094UL, 0x2492ef1f9a49008dUL, 0x8fc49928d5659752UL, 0xd4a86c0d5d2b7ae6UL, 0xe7c91546adc0f969UL, 0x4fce9e5698e308a5UL, 0x1f72620615199b6UL, 0x8b474024c75bb2e1UL, 0xcf922a8d5b81f2d2UL, 0x9f9d3cad31c6114bUL, 0x3ee4c40c2a3336cUL, 0x168e80498eb765c2UL, 0x9f24551ab703e5a4UL, 0x3f3a795a638c2297UL, 0x7dc9881854666d9UL, 0x2d1d00931d6ecb84UL, 0x3e48aa356e07cb48UL, 0x7e74f2b4c718452fUL, 0xfb931030a8ccdb2UL, 0x5a3a01263add9708UL, 0xc9c86c47ffc4ced1UL, 0xfa02a500224183e1UL, 0x10c7677de832c76UL, 0x96639a7208b6693cUL, 0x26c9e0a2dc42c5e3UL, 0xf2ee0a69e8f20e7cUL, 0x1c66f89e769cefffUL, 0xed0acda6c619554UL, 0xf8caf9689b4ed387UL, 0xe33754ba7d951547UL, 0x26b3e54d26a368edUL, 0x3fb6c18aa5ce6d84UL, 0x44cccafc1556ff4fUL, 0xc085e91d575b2330UL, 0x5319deeb86dc66c9UL, 0x5d7a1b2b36919c24UL, 0x3cc0add50966a6dfUL, 0x87e0925302c74fdfUL, 0xb84da9a6c6227a81UL, 0x98e3ae68102e7f64UL, 0xccd86387310615ffUL, 0x92a64cfa9ff9601UL, 0x6ee5473c47de4211UL, 0x13d0c4ee5d51b9e5UL, 0x2ce9ff2341c773bfUL, 0x14bf89f6ff8e25bcUL, 0xc3b49a0944263330UL, 0x5b611e2c7ae34e6UL, 0x59d3fe46838ee77eUL, 0x297f13edff1c4b78UL, 0x87693412884c6660UL, 0xb6c23c58f5c69cdUL, 0xb3a7fc8d071dcefcUL, 0x52fe27dbfe3896f0UL, 0xed268251098ccc0UL, 0x16d8478b1eb8d39bUL, 0xd216c1372df0c5b9UL, 0xa3170fde5000245eUL, 0x3dac43beaab2e92UL, 0xfa71728407ce01aUL, 0x1174ba43782ad333UL, 0x40c55fd50c714102UL, 0x19cb9c061eccea37UL, 0x3d59b66efdf48718UL, 0x97b04cabd39efe27UL, 0x8761ffc3b4938bbbUL, 0x2de92c7df603637cUL, 0x58a4f4e386e4491cUL, 0x9a39a17a84f6a40fUL, 0x828bfeec5561ec8UL, 0x45ac4c8a279c71ebUL, 0x935e71f970c5d514UL, 0x347342f509ed481eUL, 0x10517fdd8aac3d91UL, 0x8b5899144f38e3d6UL, 0x26bce3f2e18baa28UL, 0xddbfbdc73011c87dUL, 0x2649bfd2b929729dUL, 0x8cf265955eb70beUL, 0x6f6e5fdbbe1a137dUL, 0xbb7f7b8e602390faUL, 0x4c937fa57252e53bUL, 0x119e4cb2abd6e17cUL, 0xdedcbfb77c3426faUL, 0xc3a7cf31e38c79b5UL, 0x9fcdbf2348d4c3c8UL, 0x3d428d149c3775eaUL, 0x9faee75085650ad8UL, 0x874f9e63c718f36aUL, 0x3f9b7e4691a98791UL, 0x7a851a29386eebd5UL, 0x3f5dcea10aca15b0UL, 0xbbc604eaadfabe95UL, 0x79ddbce48f22069cUL, 0xeb742023bb4760b8UL, 0x5cac057c68996c4cUL, 0xc2d531f8783e256bUL, 0xf55039a0b2350486UL, 0xc8965436bd147662UL, 0x9b4f92c6ac3f9fb5UL, 0x85aa63f0f07c4ad6UL, 0xeaa07341646a090dUL, 0x912ca86d7a28ecc5UL, 0x369f258d587f3f6bUL, 0xbe0dffccc333cdedUL, 0xd3aba6eb64a51ba4UL, 0x3c2744ab3fcb6e99UL, 0x4f29d324cdf339fbUL, 0x7c1bff9986679bdaUL, 0xa7574dd6c94a3749UL, 0x784e89567f96dd33UL, 0x9e53a6499be673f6UL, 0xf837ff330ccf37b4UL, 0x4eae9bad92946e92UL, 0xf09d12acff2dba67UL, 0x3ca74c9337cce7ecUL, 0x4536c64b3a553729UL, 0x9bb677328959d49aUL, 0xff44312835c1c3dcUL, 0x5b590118129488f5UL, 0x8a6d8c9674aa6e52UL, 0x376cee6512b3a934UL, 0xfe8862506b8387b9UL, 0xb6b20230252911ebUL, 0xa1822101ca9f84e5UL, 0x68329ca389165bd6UL, 0xe36ed0d11c9db860UL, 0x4f739c5e375f64fbUL, 0xf65d7a2eb6f4518bUL, 0xd68e792ebe5dbe12UL, 0xd8a3b5d3f2a1c7d2UL, 0xbcf0a08213b38edbUL, 0x59e3cc704e23fb57UL, 0xabf7b234d0ca759aUL, 0xaf397fd62ed938b7UL, 0x5bf6d93a5a6a5a9bUL, 0xb3c798e09c47f6aeUL, 0x57ef6469a194eb34UL, 0x5e72ffac5db2716fUL, 0xb7edb274b4d4b537UL, 0x678f31c1388fed5cUL, 0xafdec8d34329d669UL, 0xbce5ff58bb64e2deUL, 0x6fdb64e969a96a6eUL, 0xcf1e6382711fdab8UL, 0x5fbd91a68653acd2UL, 0x79cbfeb176c9c5bdUL, 0xdfb6c9d2d352d4ddUL, 0x2b65ff29c1f4ed31UL, 0xb9906324a0d6501aUL, 0xede9e91326093c68UL, 0x9d7a0b9bdba8ee96UL, 0xe392c67ea0228223UL, 0x75cb8620eddda98bUL, 0xc5adc6578788cfc3UL, 0x18e38f09ca5c9a01UL, 0x727cb4d0638e5c07UL, 0xed7c4c2877ca5aa8UL, 0x952598dec48b2894UL, 0x13d0862de9b4732fUL, 0x51a0518de4d7e04fUL, 0xdc13d83943e5bcefUL, 0x343525cc428ce63bUL, 0x5b69465ae65a173UL, 0xa340a31bc9afc09eUL, 0xb827b07287cb79deUL, 0x686a4b988519cc77UL, 0xb6d28cb5ccb42e6UL, 0x46814637935f813cUL, 0x704f60e50f96f3bdUL, 0xd0d497310a3398efUL, 0x16da5196b99685ccUL, 0x8d028c6f26bf0278UL, 0xe09ec1ca1f2de77aUL, 0xa1a92e62146731deUL, 0x2db4a32d732d0b99UL, 0xaf5c20f36eb55cb1UL, 0xc7d6c3fd922ac74aUL, 0x5d2c48b5e354d4afUL, 0x797ede649b57501fUL, 0x5eb841e6dd6ab962UL, 0x8fad87fb24558e95UL, 0xba58916bc6a9a95fUL, 0xf2fdbcc936aea03eUL, 0x829bbe0991e2a85UL, 0x19b04f9fe4da1495UL, 0x6acf36a646c9e5adUL, 0xc7ece1ac10500751UL, 0xa50a4fec11f70d4bUL, 0x358bdf5665c52095UL, 0xcbe0793d46097c48UL, 0xadce5b665dad498eUL, 0xff4da7f5002542d7UL, 0x6dfcfec567fb4894UL, 0x89bee60b47884f82UL, 0x798b2ef2c657d431UL, 0x4bc277c72381ddefUL, 0xdd12bde363879896UL, 0xd03d867448a2816UL, 0xd101c5dbf1a2ef4fUL, 0x9784ef8e4703bbdeUL, 0xba257bc6c70f312cUL, 0x1a07b0ce8914502dUL, 0xa2038bb7e345de9eUL, 0x9a50e731adcc2ffdUL, 0x72a1b7e4226f6be6UL, 0x2a7175ecd9b21749UL, 0x66108f51bb86fa10UL, 0x34a1ce635b985ffaUL, 0xe5436fc844ded7cdUL, 0x54e2ebd9b3642e92UL, 0xcc211ea3770df420UL, 0x69439cc6b730bff4UL, 0xca86df9089bdaf9aUL, 0xa9c5d7b366c85d25UL, 0x98423d46ee1be840UL, 0x67de01a04daa27a9UL, 0x93e6ff48bf0a568bUL, 0x4df5bb17060a0d59UL, 0x1293e2b3a13a97adUL, 0x7ae53b6db89f1713UL, 0x2126bef8d265a4a9UL, 0x8595625fc78eada1UL, 0x7305d593f786876UL, 0x40934ef652f57667UL, 0x44a63d9808ba40edUL, 0x1554d0ce4487ec50UL, 0x2c77228c03fd97c1UL, 0x347fa5c18621b48fUL, 0x8fa73b59bd058865UL, 0x34d7b5ed42956fb2UL, 0x7af9dd267af668aeUL, 0x68ff4b830c43691eUL, 0x1f4e76b37a0b10caUL, 0x69af6bda852adf65UL, 0xf5f3ba4cf5ecd15cUL, 0x64a7af2b3b4d8a7dUL, 0x3877ad0f5867282bUL, 0xcd20c3c4c1cf09d8UL, 0xc9f0eca796d4e594UL, 0xc94f5e56769b14faUL, 0x70ef5a1eb0ce5056UL, 0x9a418789839e13b0UL, 0x93e1d94f2da9cb29UL, 0x929ebcaced3629f4UL, 0xe1deb43d619ca0adUL, 0x34830f13073c2760UL, 0x27c3b29e5b539653UL, 0x253d7959da6c53e8UL, 0xc3bd687ac339415bUL, 0x69061e260e784ec1UL, 0x4f87653cb6a72ca6UL, 0xff23ca9e9713ff91UL, 0x8191909c2a038b09UL, 0xcc72283dd76a2a91UL, 0xbd19524710431e60UL, 0xfe47953d2e27ff22UL, 0x323213854071613UL, 0x98e4507baed45523UL, 0x7a32a48e20863cc1UL, 0xfc8f2a7a5c4ffe44UL, 0x6464270a80e2c27UL, 0x31c8a0f75da8aa46UL, 0xf465491c410c7983UL, 0x4c476cd99b54a4c9UL, 0xa67c488fc6d51f0UL, 0x7def559f70cbe39eUL, 0xcadd0a06ff15b42aUL, 0x2dd7e19e156211d3UL, 0x1224c97854abaa5fUL, 0xe5a0bf4f2a0d702eUL, 0xb7ad8c3383262f78UL, 0xeef6fb11090f7be7UL, 0x22a2d29905265d01UL, 0xd53f6aef9f80574eUL, 0x4d4c80597b4119ddUL, 0x68b4ce0f31d5af8fUL, 0x43aee55ba63db3bcUL, 0xb400c1aef49a198eUL, 0xb88e988c8b8f7497UL, 0x6430a4334060075fUL, 0x81b68adee00a6ec7UL, 0x767f972c22ae840eUL, 0x530aa9276a13ae03UL, 0xc861486680c00ebeUL, 0x36d15bdc014dd8eUL, 0xecff2e58455d081dUL, 0xa615524ed4275c06UL, 0x259ba8e0224b453dUL, 0x316b122c58b2a2UL, 0xc78048c14120a728UL, 0x6e3d3ca3d543ff21UL, 0x4b3751c044968a7aUL, 0x62d62458b16544UL, 0x8f00918282414e50UL, 0xdc7a7947aa87fe43UL, 0x966ea380892d14f4UL, 0xc5ac48b162ca88UL, 0x1e01230504829ca0UL, 0xb8f4f28f550ffc87UL, 0x2cdd4701125a29e8UL, 0x18b589162c59511UL, 0x3c02460a09053940UL, 0x71e9e51eaa1ff90eUL, 0xece3b62f077f0b91UL, 0x5fdf14b69fa239dUL, 0x667a9865d990c592UL, 0xc1c452032932b530UL, 0xd9c76c5e0efe1722UL, 0xbfbe296d3f4473bUL, 0xccf530cbb3218b24UL, 0x8388a40652656a60UL, 0x6d7e0913e377605UL, 0x111c85440b9987c8UL, 0x879475e6add9a15aUL, 0x2506d032d9c793edUL, 0xb8f6f90f5fa5b44bUL, 0x24d24ae1bb42062fUL, 0x1156ffbc9029f5a6UL, 0x681a385bce8260f7UL, 0x71edf21ebf4b6896UL, 0x49a495c376840c5fUL, 0x22adff792053eb4cUL, 0xd03470b79d04c1eeUL, 0xe3dbe43d7e96d12cUL, 0x93492b86ed0818beUL, 0x455bfef240a7d698UL, 0xa068e16f3a0983dcUL, 0xc7b7c87afd2da258UL, 0x2692570dda10317dUL, 0x8ab7fde4814fad31UL, 0x40d1c2de741307b8UL, 0x3a36a8d8d9901cf1UL, 0x4bcfee7218516b44UL, 0xb11efb8c905ed70UL, 0xa3b41d82952b485dUL, 0x746d51b1b32039e2UL, 0x979fdce430a2d688UL, 0x1623df71920bdae0UL, 0x47683b052a5690baUL, 0x5d839b4e458b2b85UL, 0x29d4f9a1cd34a4afUL, 0x3239aa92ef8d02d3UL, 0xacc7ee3429a06658UL, 0xbb07369c8b16570aUL, 0x53a9f3439a69495eUL, 0x64735525df1a05a6UL, 0x598fdc685340ccb0UL, 0x760e6d39162cae14UL, 0xa753e68734d292bdUL, 0xc8e6aa4bbe340b4cUL, 0xb31fb8d0a6819960UL, 0x5945e25f0f920469UL, 0x484c8d67c5d42cc5UL, 0x8fb340e6b7f2a18bUL, 0x4428e99f300e75edUL, 0xb28bc4be1f2408d2UL, 0x90991acf8ba8598aUL, 0x1f6681cd6fe54316UL, 0x8851d33e601cebdbUL, 0x6517897c3e4811a4UL, 0x2132359f1750b315UL, 0x3ecd039adfca862dUL, 0x10a3a67cc039d7b6UL, 0xca2f12f87c902348UL, 0x42646b3e2ea1662aUL, 0x7d9a0735bf950c5aUL, 0x21474cf98073af6cUL, 0x21071ddddaeb1ed1UL, 0x82239615f133c5eaUL, 0xe54a1a1ab4b0afa6UL, 0x609901cd7dea19f4UL, 0xf7570396961d65e3UL, 0x2ac6c424e16826bUL, 0xd4ea2044a2fbe85fUL, 0xe3259ba486d974c5UL, 0xeeae072d2c3acbc6UL, 0x558d8849c2d04d7UL, 0xa9d4408945f7d0beUL, 0xc64b37490db2e98bUL, 0x680536777bbecfcdUL, 0xc5af160942b0010UL, 0x4dd695634075166eUL, 0xae81f6ac6668943bUL, 0xd00a6ceef77d9f9aUL, 0x18b5e2c128560020UL, 0x9bad2ac680ea2cdcUL, 0x5d03ed58ccd12876UL, 0x154de1f0cd306775UL, 0x378085ebfcdd09feUL, 0x292441fcca4eeeaaUL, 0x9810428fe4af17c1UL, 0x2a9bc3e19a60ceeaUL, 0x6f010bd7f9ba13fcUL, 0x524883f9949ddd54UL, 0x3020851fc95e2f82UL, 0xe06ebfee170ac595UL, 0xd8e957c65f052e47UL, 0xbaef1382e2a10dbaUL, 0x42569201efb11828UL, 0x758447f10dded36bUL, 0xb739efe5127b5530UL, 0x6ba033740ed8ac67UL, 0xa6babc3da26f777dUL, 0xeb088fe21bbda6d6UL, 0x6e73dfca24f6aa60UL, 0xd74066e81db158cfUL, 0x4d75787b44deeefaUL, 0x634827e914b015edUL, 0xda0cfffde59c5d7eUL, 0xb0fed9a1f0f8068cUL, 0xb8fd68c8f4b09ad9UL, 0x73c977ff0aab739bUL, 0xb2f2bf926749b343UL, 0x7f83a7322a6aba0bUL, 0x53ed49af946c729fUL, 0xe792effe1556e736UL, 0x65e57f24ce936686UL, 0xff074e6454d57417UL, 0xa7da935f28d8e53eUL, 0xcf25dffc2aadce6cUL, 0xcbcafe499d26cd0dUL, 0xfe0e9cc8a9aae82eUL, 0x4fb526be51b1ca7dUL, 0x2b1287d57690c499UL, 0x917ebcfa963c93a4UL, 0xe2632de098cf674fUL, 0xbd7dd542de6ed3d7UL, 0xe37c3787ceead173UL, 0x2416399c80082ef7UL, 0xdab84fb0fa04798dUL, 0x58ec32bbc1d0e083UL, 0x73a15722be1efaa7UL, 0x4ec73350ac615450UL, 0xab0e8b103f924408UL, 0x93cffd49feac862bUL, 0xe742ae457c3df54eUL, 0x9d8e66a158c2a8a0UL, 0x561d16207f248810UL, 0x279ffa93fd590c57UL, 0xce855c8af87bea9cUL, 0x3b1ccd42b1855141UL, 0xac3a2c40fe491021UL, 0x4f3ff527fab218aeUL, 0x28538138d33c8d79UL, 0x70d2daeccf7bab3cUL, 0x460a4cf037089750UL, 0xbc68727188697671UL, 0x50a70271a6791af2UL, 0xe1a5b5d99ef75678UL, 0x8c1499e06e112ea0UL, 0x78d0e4e310d2ece2UL, 0x14173cce6f396da5UL, 0xc5a02bda919fa54fUL, 0x65727b117b8ea53UL, 0xd3b651f85ca89ee9UL, 0x282e799cde72db4aUL, 0x8b4057b5233f4a9eUL, 0xcae4f622f71d4a7UL, 0xa76ca3f0b9513dd2UL, 0x505cf339bce5b694UL, 0x1680af6a467e953cUL, 0x195c9ec45ee3a94fUL, 0x4ed947e172a27ba4UL, 0x15e0de5e5a003569UL, 0x2bea1ebd208c23c7UL, 0x2cc729f9765de58cUL, 0xbfa517fc9849b064UL, 0x2bc1bcbcb4006ad2UL, 0x57d43d7a4118478eUL, 0x598e53f2ecbbcb18UL, 0x7f4a2ff9309360c8UL, 0x578379796800d5a4UL, 0xafa87af482308f1cUL, 0xb31ca7e5d9779630UL, 0xfe945ff26126c190UL, 0x1a5fcadff3caf309UL, 0x59bbb580a8101787UL, 0x78475bba79759b73UL, 0xdf3f27dabf40c40dUL, 0x81e6ad92c45ebe53UL, 0xb59c2b68fc5126b1UL, 0xeef0a305397181f4UL, 0x9c69d78b038ccf36UL, 0x3cd5b2588bd7ca6UL, 0x6b3856d1f8a24d63UL, 0xdde1460a72e303e9UL, 0x38d3af1607199e6dUL, 0xb2c38e6632b1a10dUL, 0xd09bedca5d359379UL, 0xa5bc98652e5cb0c0UL, 0x53b0c612733e7bf7UL, 0x65871ccc6563421aUL, 0xa137db94ba6b26f3UL, 0x4b7930ca5cb96181UL, 0xa7618c24e67cf7efUL, 0xcb0e3998cac68434UL, 0x426fb72974d64de6UL, 0x96f26194b972c303UL, 0x4ec31849ccf9efdeUL, 0x961c7331958d0868UL, 0x84df6e52e9ac9bcdUL, 0x2de4c32972e58606UL, 0x9d86309399f3dfbdUL, 0x2c38e6632b1a10d0UL, 0x9bedca5d359379bUL, 0x5bc98652e5cb0c0dUL, 0x3b0c612733e7bf7aUL, 0xed28f4eb75ff79e1UL, 0x1596f9220ac36689UL, 0xa9ed18d4000caf08UL, 0x540f5a701ac239d8UL, 0x6f08d1fbc835ab83UL, 0x2dc6b22db9f7c4acUL, 0x4da425d9cb83e902UL, 0x8a092cde4889349dUL, 0xde11a3f7906b5706UL, 0x5b8d645b73ef8958UL, 0x9b484bb39707d204UL, 0x141259bc9112693aUL, 0xbc2347ef20d6ae0cUL, 0xb71ac8b6e7df12b1UL, 0x369097672e0fa408UL, 0x2824b3792224d275UL, 0x78468fde41ad5c18UL, 0x6e35916dcfbe2563UL, 0x6d212ece5c1f4811UL, 0x504966f24449a4eaUL, 0xf08d1fbc835ab830UL, 0xdc6b22db9f7c4ac6UL, 0xda425d9cb83e9022UL, 0xa092cde4889349d4UL, 0x54430754257e2821UL, 0xbe3d05de92899c32UL, 0xaafaaf48bbe79757UL, 0x633203f76c2bd485UL, 0xa8860ea84afc5042UL, 0x7c7a0bbd25133864UL, 0x55f55e9177cf2eafUL, 0xc66407eed857a90bUL, 0xe455257db633f8c5UL, 0xfe1f5713e6577976UL, 0xb594a9532404ea4cUL, 0xaedf97e3cda2153aUL, 0x7df372d64faca9cbUL, 0xfad5ee4e60dffb52UL, 0x755746d78393638bUL, 0x7fa8b7f9e6496d59UL, 0xfbe6e5ac9f595396UL, 0xf5abdc9cc1bff6a4UL, 0xeaae8daf0726c717UL, 0xff516ff3cc92dab2UL, 0x4294f3741d79ff6dUL, 0xedbcf9502f0ee4f6UL, 0xcb230f2fc5d7393dUL, 0xdcb547d9e428f249UL, 0x3070dec51938a69bUL, 0xdd92b2c9f26cc053UL, 0x88380a2e4034c569UL, 0x9b7d178db55ca3bfUL, 0x60e1bd8a32714d36UL, 0xbb256593e4d980a6UL, 0x1070145c80698ad3UL, 0x36fa2f1b6ab9477fUL, 0x749a43394729c22dUL, 0x70a18b4e65c208f3UL, 0x3e9e3cc8cb49a2b5UL, 0x4fe3c608a87fc9d2UL, 0xe93486728e53845aUL, 0xe143169ccb8411e6UL, 0x7d3c79919693456aUL, 0x9fc78c1150ff93a4UL, 0xd2690ce51ca708b4UL, 0xc2862d39970823cdUL, 0xfa78f3232d268ad5UL, 0x3f8f1822a1ff2748UL, 0xa4d219ca394e1168UL, 0x850c5a732e10479bUL, 0xf4f1e6465a4d15abUL, 0x7f1e304543fe4e91UL, 0xfcfd0bb951577a91UL, 0xcf3f48ff0518688UL, 0xf79dd8fd7f009c45UL, 0xdc2bf8b4faf1da0fUL, 0x4ca32f5f8165ad63UL, 0x1f0ca9764cd204aeUL, 0xf145a58b359b8f98UL, 0x9a40695788eef333UL, 0x2c1f669221000287UL, 0x38f2128535d500e3UL, 0xfcf55f67a0ada822UL, 0x16974a916cd0a14bUL, 0x583ecd244200050eUL, 0x71e4250a6baa01c6UL, 0xf9eabecf415b5044UL, 0x2d2e9522d9a14297UL, 0x524a265a7cb525dUL, 0xe5230a7d7b250a33UL, 0xedab69ef492c179aUL, 0x784ab27bce4fc203UL, 0xa4944cb4f96a4baUL, 0xca4614faf64a1466UL, 0xdb56d3de92582f35UL, 0xf09564f79c9f8407UL, 0xa1cbb1bbbce61135UL, 0x9267699c40e52173UL, 0xa8d3b3ccef2ae979UL, 0xc33d51d144324f23UL, 0xf6ce5b5a5a077a2bUL, 0x222593512dbb4b58UL, 0x4fd973e815cf65e1UL, 0xa46d3b9cf569d96bUL, 0xed9cb6b4b40ef456UL, 0x444b26a25b7696b1UL, 0x9fb2e7d02b9ecbc2UL, 0x48da7739ead3b2d6UL, 0xdb396d69681de8acUL, 0x88964d44b6ed2d63UL, 0x3f65cfa0573d9784UL, 0x91b4ee73d5a765adUL, 0x32be2fff3f08919UL, 0x17c7dae0c1ab5378UL, 0x60b58b3165e1981bUL, 0x17e44d9d6438c76UL, 0xb30efdd2c42a4a73UL, 0x2964f5a82f27af4fUL, 0xdf15021300598724UL, 0x20eb118dd18a5fc0UL, 0x661dfba5885494e6UL, 0x52c9eb505e4f5e9fUL, 0xbe2a042600b30e48UL, 0x41d6231ba314bf81UL, 0x7962cf663362718dUL, 0xa37896c910efb481UL, 0x622a1c3dcafcab82UL, 0xa1bbde093b24382fUL, 0x479ca6e1450fbb5bUL, 0x401a6dfb8dae60bdUL, 0xda2a2c0a5e63e017UL, 0x6160242c0b453772UL, 0x8f394dc28a1f76b6UL, 0x8034dbf71b5cc17aUL, 0xb4545814bcc7c02eUL, 0xc2c04858168a6ee5UL, 0x1e729b85143eed6cUL, 0x69b7ee36b982f5UL, 0x68a8b029798f805dUL, 0x858090b02d14ddcbUL, 0x3ce5370a287ddad8UL, 0xd36fdc6d7305eaUL, 0xd1516052f31f00baUL, 0xb0121605a29bb96UL, 0xcc9356397330edf1UL, 0x74d9fd17697026bUL, 0xbcdcd4d42da4b666UL, 0x3415dafec95e3001UL, 0x9926ac72e661dbe2UL, 0xe9b3fa2ed2e04d7UL, 0x79b9a9a85b496cccUL, 0x682bb5fd92bc6003UL, 0x871460c8ef08ef85UL, 0x1bdd3f2c762d0010UL, 0xed0d47217d086e8aUL, 0xf240f3c55875872aUL, 0xbb71f9bcfdda874bUL, 0x31513e31402b099eUL, 0xc4649a33318a6a06UL, 0xc6967fb4cde64979UL, 0x76e3f379fbb50e96UL, 0x62a27c628056133dUL, 0x88c934666314d40cUL, 0x8d2cff699bcc92f3UL, 0xedc7e6f3f76a1d2cUL, 0xc544f8c500ac267aUL, 0x119268ccc629a818UL, 0x1a59fed3379925e7UL, 0xdb8fcde7eed43a58UL, 0x8a89f18a01584cf5UL, 0x2324d1998c535031UL, 0x34b3fda66f324bceUL, 0x246a3e2fe632cf1UL, 0x13f8a37daec19054UL, 0x5837b742d33c1771UL, 0x4b706372a369d0b0UL, 0x48d47c5fcc659e2UL, 0x27f146fb5d8320a8UL, 0xb06f6e85a6782ee2UL, 0x96e0c6e546d3a160UL, 0x91a8f8bf98cb3c4UL, 0x4fe28df6bb064150UL, 0x60dedd0b4cf05dc4UL, 0x2dc18dca8da742c1UL, 0x12351f17f3196788UL, 0x9fc51bed760c82a0UL, 0xc1bdba1699e0bb88UL, 0x5b831b951b4e8582UL, 0x246a3e2fe632cf10UL, 0x3f8a37daec190540UL, 0x837b742d33c17711UL, 0xb706372a369d0b05UL, 0x48d47c5fcc659e20UL, 0x7f146fb5d8320a80UL, 0x6f6e85a6782ee22UL, 0x6e0c6e546d3a160bUL, 0x91a8f8bf98cb3c40UL, 0xfe28df6bb0641500UL, 0xdedd0b4cf05dc44UL, 0xdc18dca8da742c16UL, 0x9608c952125d20c1UL, 0xfabafebeccb923beUL, 0x5a5b51855910f9bUL, 0x9a26216fc9e51f00UL, 0x2c1192a424ba4182UL, 0xf575fd7d9972477dUL, 0xb4b6a30ab221f37UL, 0x344c42df93ca3e00UL, 0x5823254849748304UL, 0xeaebfafb32e48efaUL, 0x1696d46156443e6fUL, 0x689885bf27947c00UL, 0xb0464a9092e90608UL, 0xd5d7f5f665c91df4UL, 0x2d2da8c2ac887cdfUL, 0xd1310b7e4f28f800UL, 0x608c952125d20c10UL, 0xabafebeccb923be9UL, 0x5a5b51855910f9bfUL, 0xa26216fc9e51f000UL, 0x7440126f686f4061UL, 0x51b497b03b557e6dUL, 0xaac8b77b79bb446dUL, 0x66d3b5c741aea72cUL, 0x5dd91cf3f315d883UL, 0xa5826f09dadbf565UL, 0x4bef7a8738ec3fc8UL, 0xefb0f3b0fe500975UL, 0xbbb239e7e62bb106UL, 0x4b04de13b5b7eacaUL, 0x97def50e71d87f91UL, 0xdf61e761fca012eaUL, 0x776473cfcc57620cUL, 0x9609bc276b6fd595UL, 0x2fbdea1ce3b0ff22UL, 0xbec3cec3f94025d5UL, 0x5b91dfb2bb659c59UL, 0x2af838277aaea295UL, 0x4105c0480cfb4957UL, 0x5f9005b98f8d0c86UL, 0xb723bf6576cb38b2UL, 0x55f0704ef55d452aUL, 0x820b809019f692aeUL, 0xbf200b731f1a190cUL, 0x6e477ecaed967164UL, 0xabe0e09deaba8a55UL, 0x417012033ed255cUL, 0x7e4016e63e343219UL, 0xdc8efd95db2ce2c8UL, 0x57c1c13bd57514aaUL, 0x82e024067da4ab9UL, 0xfc802dcc7c686432UL, 0xc44c30695929dd1UL, 0xa968c21e069b20eaUL, 0xe2210f1042e2260UL, 0xdb17c3a685dd8f48UL, 0xadd0be2008ee63e3UL, 0x543ac455a147486bUL, 0x23a3593c3c6f3d3UL, 0x94381f7376b659bcUL, 0x5ba17c4011dcc7c6UL, 0xa87588ab428e90d7UL, 0x4746b27878de7a6UL, 0x28703ee6ed6cb378UL, 0xb742f88023b98f8cUL, 0x50eb1156851d21aeUL, 0x8e8d64f0f1bcf4dUL, 0x50e07dcddad966f0UL, 0xdbdcc92d64b84759UL, 0xa73d62c4a64b4ae2UL, 0xfafb8efd5ad2988UL, 0x83d763a5c8bf8accUL, 0x2e0aa77eabbd6f3UL, 0x489185e0e0e79c7aUL, 0x12165ae60c0e403UL, 0x25b95f75ec7252b4UL, 0xb0986cc2f6bcf5a7UL, 0x97c84ba86dbe314bUL, 0x1c3cdf2d0a1b7f14UL, 0x696526d5a5e9e244UL, 0x6130d985ed79eb4eUL, 0x2f909750db7c6297UL, 0x3879be5a1436fe29UL, 0xd2ca4dab4bd3c488UL, 0xc261b30bdaf3d69cUL, 0x5f212ea1b6f8c52eUL, 0x70f37cb4286dfc52UL, 0xa5949b5697a78910UL, 0x84c36617b5e7ad38UL, 0xbe425d436df18a5dUL, 0xe1e6f96850dbf8a4UL, 0x4b2936ad2f4f1220UL, 0xbcdff40248040231UL, 0x7a6ffaef77921d04UL, 0xddb3e6a16a2d465bUL, 0xb445f5642393636dUL, 0x79bfe80490080462UL, 0xf4dff5deef243a09UL, 0xbb67cd42d45a8cb6UL, 0x688beac84726c6dbUL, 0xf37fd009201008c4UL, 0xe9bfebbdde487412UL, 0x76cf9a85a8b5196dUL, 0xd117d5908e4d8db7UL, 0x53a6983f63eb49c9UL, 0xd594971210e1e19aUL, 0xf3e1217a9af085c9UL, 0x8038331f61965c42UL, 0x12140853e41dcbd3UL, 0xadc26e4d8db2ca8bUL, 0xf9bc5684fe7bbc81UL, 0x2267fe00be21ffa9UL, 0x9171288aebf0cfe7UL, 0x5d6f9cf2b7149ca9UL, 0xed06b978376dce11UL, 0x66d8643f014eb87fUL, 0x97bb6938f42ac78fUL, 0xbc34798cc25830ecUL, 0xc4736681a5412b30UL, 0xefa750407f9037d3UL, 0x2f76d271e8558f1eUL, 0x7868f31984b061d9UL, 0x88e6cd034a825661UL, 0xdf4ea080ff206fa7UL, 0x5eeda4e3d0ab1e3cUL, 0xf0d1e6330960c3b2UL, 0x11cd9a069504acc2UL, 0xbe9d4101fe40df4fUL, 0xbddb49c7a1563c78UL, 0xe1a3cc6612c18764UL, 0x239b340d2a095985UL, 0x7d3a8203fc81be9eUL, 0x7bb6938f42ac78f0UL, 0xc34798cc25830ec9UL, 0x4736681a5412b30bUL, 0xfa750407f9037d3cUL, 0xf76d271e8558f1e0UL, 0x868f31984b061d92UL, 0x8e6cd034a8256617UL, 0xf4ea080ff206fa78UL, 0x5b837610297abb81UL, 0xbf523593a7d329aUL, 0x2a7b4189bd07b3dUL, 0xcbc388219900b3ddUL, 0x25fd40d713e2f43UL, 0x110106dbd88b6c8bUL, 0x1b317c40fc3a4168UL, 0xb590887d4f0c2096UL, 0x4bfa81ae27c5e86UL, 0x22020db7b116d916UL, 0x3662f881f87482d0UL, 0x6b2110fa9e18412cUL, 0x97f5035c4f8bd0cUL, 0x44041b6f622db22cUL, 0x6cc5f103f0e905a0UL, 0xd64221f53c308258UL, 0xa7a79846aa3a2259UL, 0x8ee376b7682a6de7UL, 0xc7f5f6762a48bc52UL, 0x8e93dbd4056c439cUL, 0x4f4f308d547444b2UL, 0x1dc6ed6ed054dbcfUL, 0x8febecec549178a5UL, 0x1d27b7a80ad88739UL, 0x2bc759378b23d125UL, 0x3d669ab40cd8be21UL, 0x1a9cda962b84658UL, 0x1858f76e68bc495fUL, 0xe2d78a42358cfa0bUL, 0x7c267501b5c075fdUL, 0x1d2d8f230eea3ba2UL, 0x12a676e2ac75d592UL, 0x70f62ca948d2ac57UL, 0xfea7aa6ac7f1e244UL, 0x24250a37d64ec056UL, 0x75b75fb25e6ec08UL, 0x54b5617fb26e00efUL, 0xfba414bc2392cd37UL, 0x5634001e670737bfUL, 0x2ca173c836c09f3cUL, 0x1c33fad24717599fUL, 0xf1a36911eb5493d1UL, 0xb216144d0594d86dUL, 0x7b557fae108c7954UL, 0x8d3ecd89ade5eb7fUL, 0xe5ad924a7ad82e1dUL, 0x7a523cebc0b307c9UL, 0xd4bd67625c15b585UL, 0x1a7d9b135bcbd6feUL, 0xcb5b2494f5b05c3bUL, 0xf4a479d781660f93UL, 0xa97acec4b82b6b0aUL, 0x81a20e0b945cf5bdUL, 0x905d09404711b1c9UL, 0xf736e7dec956a835UL, 0x70e205b70d5b9139UL, 0xb61d243a0b72b33bUL, 0x265152e922526a2cUL, 0xf013dbcc5937e779UL, 0xc3d3935067ba655fUL, 0xd9637059352e3e37UL, 0x4a49e5bbe8d5dde6UL, 0xfe59a3e979f579e0UL, 0xa5b0be9eb2798d93UL, 0xb2c6e0b26a5c7c6eUL, 0x9493cb77d1abbbcdUL, 0xfcb347d2f3eaf3c0UL, 0x4b617d3d64f31b27UL, 0x658dc164d4b8f8dcUL, 0x292796efa357779bUL, 0xf9668fa5e7d5e781UL, 0x96c2fa7ac9e6364fUL, 0x7e42bae48abaa9f9UL, 0x54a46db6eadfe689UL, 0xecb30b3a04317810UL, 0xf926ccbeec12bb3UL, 0x49dc4de436be0bb3UL, 0xafa39b0479cec4adUL, 0xc7180205c3f84732UL, 0x3d3341a9a08f104bUL, 0x93b89bc86d7c1766UL, 0x5f473608f39d895aUL, 0x8e30040b87f08e65UL, 0x7a668353411e2097UL, 0x27713790daf82eccUL, 0xbe8e6c11e73b12b5UL, 0x1c6008170fe11ccaUL, 0xf4cd06a6823c412fUL, 0xfbbb570c963b05d9UL, 0x7bf7984a62072cd5UL, 0x26be045fd4588e87UL, 0xcb8d95737975c572UL, 0x422f96340fbd53f3UL, 0xf10470fd687f5014UL, 0x53021cce632baa1cUL, 0xb50cb2d88fe6cdc8UL, 0x310614453cb1ffa7UL, 0xe4e3a1937c8fa997UL, 0xb87a2ded0dcde32bUL, 0x480efd8f62c0dcbcUL, 0xd75510a75aa8a70fUL, 0xcf2c034f556e5a91UL, 0x6e8a4fabd0017145UL, 0xb20a6320b88cfe55UL, 0x1bf31963969a165fUL, 0x98b346f706adbc9cUL, 0xc36a8b266b985599UL, 0x46035e7f0c14bb86UL, 0x37e632c72d342cbeUL, 0x31668dee0d5b7938UL, 0x86d5164cd730ab33UL, 0x8c06bcfe1829770dUL, 0x6fcc658e5a68597cUL, 0x62cd1bdc1ab6f270UL, 0xdaa2c99ae615666UL, 0x180d79fc3052ee1bUL, 0xdf98cb1cb4d0b2f8UL, 0xc59a37b8356de4e0UL, 0x1b5459335cc2acccUL, 0x301af3f860a5dc36UL, 0xbf31963969a165f0UL, 0x8b346f706adbc9c1UL, 0x36a8b266b9855999UL, 0x6035e7f0c14bb86cUL, 0xcb3a145ff08993a1UL, 0x10839e8979c69a3cUL, 0x732f70bcb8900421UL, 0xe27c57dfff9a37f4UL, 0x967428bfe1132742UL, 0x21073d12f38d3479UL, 0xe65ee17971200842UL, 0xc4f8afbfff346fe8UL, 0x99b16952e1ed16c5UL, 0x44e53a4c4b6b614cUL, 0xd2c3d68329daa796UL, 0xabe6c741836598fdUL, 0x863bea88e01175cbUL, 0x8f2134f13aa7cb26UL, 0xbbf9b977982ff83eUL, 0x75da16bd7bc676d7UL, 0xb92eed3ce3e9b3d7UL, 0x18a9298bd93e9ff2UL, 0x698d669efbc5476fUL, 0xc9a3b5448a81aa83UL, 0x725dda79c7d367aeUL, 0x31525317b27d3fe5UL, 0xd31acd3df78a8edeUL, 0x93476a8915035506UL, 0x51e28cdeac6d971dUL, 0x644fe646c88b7675UL, 0xb84b8e0a248faaaeUL, 0x4994d2c570bed21UL, 0xa3c519bd58db2e3aUL, 0xc89fcc8d9116eceaUL, 0x70971c14491f555cUL, 0x9329a58ae17da43UL, 0xf2d30b57927d0435UL, 0x97d4d9728e5cd06aUL, 0xff502c5959a41dabUL, 0x3072ac8f2122f3aaUL, 0xe5a616af24fa086aUL, 0x2fa9b2e51cb9a0d5UL, 0xfea058b2b3483b57UL, 0x60e5591e4245e755UL, 0xcb4c2d5e49f410d4UL, 0x5f5365ca397341abUL, 0xfd40b165669076aeUL, 0xc1cab23c848bceabUL, 0x96985abc93e821a8UL, 0xbea6cb9472e68357UL, 0xfa8162cacd20ed5cUL, 0x8395647909179d57UL, 0x2d30b57927d04350UL, 0x7d4d9728e5cd06afUL, 0xf502c5959a41dab9UL, 0x72ac8f2122f3aafUL, 0xef3852df6c6bdee1UL, 0xfc706e3867eb04e1UL, 0xf47b9f5aff190260UL, 0x2c4209da59533273UL, 0x6b299d93fb1ce583UL, 0xfe0b9c1963a7007cUL, 0xf6892ac435a8b3d3UL, 0x7a938b8acfab23cbUL, 0xd6533b27f639cb06UL, 0xfc173832c74e00f8UL, 0xed1255886b5167a7UL, 0xf52717159f564797UL, 0xaca6764fec73960cUL, 0xf82e70658e9c01f1UL, 0xda24ab10d6a2cf4fUL, 0xea4e2e2b3eac8f2fUL, 0x594cec9fd8e72c18UL, 0xf05ce0cb1d3803e3UL, 0xb4495621ad459e9fUL, 0xd49c5c567d591e5fUL, 0xb299d93fb1ce5830UL, 0xe0b9c1963a7007c6UL, 0x6892ac435a8b3d3fUL, 0xa938b8acfab23cbfUL, 0xd06a8a524057e821UL, 0xc798c345d8910632UL, 0xcf5b4cf77e8ccd6dUL, 0x7066e96788693e52UL, 0xa0d514a480afd042UL, 0x8f31868bb1220c65UL, 0x9eb699eefd199adbUL, 0xe0cdd2cf10d27ca5UL, 0x41aa2949015fa084UL, 0x1e630d17624418cbUL, 0x3d6d33ddfa3335b7UL, 0xc19ba59e21a4f94bUL, 0x8354529202bf4108UL, 0x3cc61a2ec4883196UL, 0x7ada67bbf4666b6eUL, 0x83374b3c4349f296UL, 0xb3f19d0926b5da51UL, 0x7f67743425616a92UL, 0xebcadb06235661ceUL, 0x24790e46fb9ea200UL, 0x67e33a124d6bb4a2UL, 0xfecee8684ac2d525UL, 0xd795b60c46acc39cUL, 0x48f21c8df73d4401UL, 0x7a9f4c09b91c3105UL, 0xfb7690b939f4a3f5UL, 0xb155786946c3302bUL, 0xb3f3a1259377cf2fUL, 0xf53e98137238620aUL, 0xf6ed217273e947eaUL, 0x62aaf0d28d866057UL, 0x67e7424b26ef9e5fUL, 0x5f24080bc7bb9c55UL, 0xeb31028d4ba3866aUL, 0xdb2bf5d4d09677bdUL, 0xedd91ca830d27b92UL, 0xbe4810178f7738aaUL, 0xd662051a97470cd4UL, 0xb657eba9a12cef7bUL, 0xdbb2395061a4f725UL, 0xc9c918023d252915UL, 0xaa2f4a5c82ff1016UL, 0x72d1c32289c369e5UL, 0x9573ea9ebe44a967UL, 0x26cb082959810a6bUL, 0x52b5d4d0a98f2992UL, 0xfbdd9234d81c64d9UL, 0x8f04d03018415e2UL, 0x4d961052b30214d6UL, 0xa56ba9a1531e5324UL, 0xf7bb2469b038c9b2UL, 0x11e09a0603082bc5UL, 0x9b2c20a5660429acUL, 0x4ad75342a63ca648UL, 0xef7648d360719365UL, 0x23c1340c0610578bUL, 0x3658414acc085358UL, 0x95aea6854c794c91UL, 0xdeec91a6c0e326caUL, 0x478268180c20af17UL, 0xd9e9bab8bbdbfef1UL, 0x2db60d633483909dUL, 0xa3a7373c4a5cfa87UL, 0xad13480e654c1903UL, 0xb3d3757177b7fde2UL, 0x5b6c1ac66907213bUL, 0x474e6e7894b9f50eUL, 0x5a26901cca983207UL, 0xd2ffd2cfcca4a385UL, 0xb03375e57e7f4bc8UL, 0x90e2c880e2e95d0eUL, 0x965ab807e83d2322UL, 0x10a69db2ba821f4bUL, 0x668daba3508f9e2eUL, 0x3fbb85700e480d0fUL, 0xea2e831ad770169UL, 0x214d3b6575043e96UL, 0xcd1b5746a11f3c5cUL, 0x7f770ae01c901a1eUL, 0x1d45d0635aee02d2UL, 0x429a76caea087d2cUL, 0x9a36ae8d423e78b8UL, 0xfeee15c03920343dUL, 0x3a8ba0c6b5dc05a4UL, 0x8534ed95d410fa58UL, 0x346d5d1a847cf170UL, 0xfddc2b807240687bUL, 0x7517418d6bb80b49UL, 0xbf30e3068beaacf1UL, 0x6e31fa5ca488eb5eUL, 0xe5c643712f1a67e4UL, 0xc8391b24aa7d51bfUL, 0x7e61c60d17d559e2UL, 0xdc63f4b94911d6bdUL, 0xcb8c86e25e34cfc8UL, 0x9072364954faa37fUL, 0xfcc38c1a2faab3c4UL, 0xb8c7e9729223ad7aUL, 0x97190dc4bc699f91UL, 0x20e46c92a9f546ffUL, 0x4cde20197c9e3fc9UL, 0x7764928c8836534aUL, 0x304c0ff8b3498831UL, 0x63df411b2ee7cad3UL, 0x99bc4032f93c7f92UL, 0xeec92519106ca694UL, 0x60981ff166931062UL, 0xc7be82365dcf95a6UL, 0x33788065f278ff24UL, 0xdd924a3220d94d29UL, 0xc1303fe2cd2620c5UL, 0x8f7d046cbb9f2b4cUL, 0xd3a838e6c73aa609UL, 0xbdcfd40dedc393edUL, 0x9c1e6bb451d6f699UL, 0x3ced90e70a3311b5UL, 0x120949e0adbe1453UL, 0x7d74e87277f62e64UL, 0x2642c31968375a21UL, 0x5bccb9f0696b6447UL, 0x241293c15b7c28a6UL, 0xfae9d0e4efec5cc8UL, 0x4c858632d06eb442UL, 0xb79973e0d2d6c88eUL, 0x48252782b6f8514cUL, 0xf5d3a1c9dfd8b990UL, 0x990b0c65a0dd6885UL, 0x6f32e7c1a5ad911cUL, 0x251377284e3bfad9UL, 0xed4c03fa13c07a9fUL, 0x2c680cba8a206619UL, 0xfc7257bd36566515UL, 0x4a26ee509c77f5b2UL, 0xda9807f42780f53eUL, 0x58d019751440cc33UL, 0xf8e4af7a6cacca2aUL, 0x2114e48c1b24b325UL, 0xb3db4f81e370e3c3UL, 0xafde269be31b2f75UL, 0xd3dec6caa454d378UL, 0x4229c9183649664aUL, 0x67b69f03c6e1c786UL, 0x5fbc4d37c6365eebUL, 0xa7bd8d9548a9a6f1UL, 0x845392306c92cc94UL, 0xcf6d3e078dc38f0cUL, 0xbf789a6f8c6cbdd6UL, 0x4f7b1b2a91534de2UL, 0xbdfe1c4dfaeec169UL, 0x98313c66b7f617a6UL, 0x608f20aed343ccbfUL, 0xbce1ae6b5fabdce9UL, 0xcea500b6d616da93UL, 0x368938a4c39d26f2UL, 0xdf60552c6d1d2e6dUL, 0x5bd4c4e8c25afefeUL, 0x281339408fe6ed67UL, 0x6bf931202b4b445aUL, 0xa0bebe2911a0ebc8UL, 0x95be11eff9b8bad1UL, 0xe57f4aac3c06828fUL, 0xd1192229fae7810bUL, 0x5f036823e8db6082UL, 0x96bbbe18e7c328fUL, 0xcafe9558780d051eUL, 0xa2324453f5cf0217UL, 0xbe06d047d1b6c105UL, 0x12d777c31cf8651eUL, 0x95fd2ab0f01a0a3cUL, 0x446488a7eb9e042fUL, 0x7c0da08fa36d820bUL, 0x25aeef8639f0ca3dUL, 0x9ea36d4cc3ff4c39UL, 0x8e2251267b4d01e0UL, 0xe665556e8d41b304UL, 0x694a47320eecd356UL, 0x881fe2b4a435c033UL, 0x1aafe2255aeb0a7eUL, 0xd2b4beacd119d11bUL, 0xf083165a60d4e181UL, 0x103fc569486b8066UL, 0x355fc44ab5d614fdUL, 0xa5697d59a233a236UL, 0xe1062cb4c1a9c303UL, 0x207f8ad290d700ccUL, 0x6abf88956bac29faUL, 0x4ad2fab34467446cUL, 0xc20c596983538607UL, 0xf5a62d88026559d9UL, 0xd39451437b295a4bUL, 0x8bdbe11743543fcaUL, 0xa60f2aed7baa4b22UL, 0x5e15633d2701ebf3UL, 0xa1c3e2ef5a23bd28UL, 0x9c9d65f4d32c887UL, 0x6e09cde48a59d169UL, 0xbc2ac67a4e03d7e6UL, 0x4387c5deb4477a50UL, 0x1393acbe9a65910fUL, 0xdc139bc914b3a2d2UL, 0xcd0cb4d9bfccf78dUL, 0x81e4cbd4c4fffd1eUL, 0x39594d0cff51950cUL, 0x9a30afac546a0288UL, 0x9a1969b37f99ef1aUL, 0x3c997a989fffa3dUL, 0x72b29a19fea32a19UL, 0x34615f58a8d40510UL, 0x816beb4bdcf88675UL, 0x1786f3abf8efdc4UL, 0xfb1b204236dce320UL, 0x4ad5268f2ca54d0cUL, 0xb78eeeba9a3a54abUL, 0x41b9e1cd36cf236UL, 0xe84854f5a6237152UL, 0xb7bdd5202447dd35UL, 0x6f1ddd753474a956UL, 0x8373c39a6d9e46dUL, 0xd090a9eb4c46e2a4UL, 0x6f7baa40488fba6bUL, 0xde3bbaea68e952acUL, 0x106e78734db3c8daUL, 0xa12153d6988dc548UL, 0xdef75480911f74d7UL, 0xbc7775d4d1d2a558UL, 0x20dcf0e69b6791b5UL, 0x4242a7ad311b8a90UL, 0xbdeea901223ee9afUL, 0x78eeeba9a3a54ab0UL, 0x41b9e1cd36cf236bUL, 0x84854f5a62371520UL, 0x7bdd5202447dd35eUL, 0xf1ddd753474a9560UL, 0x8373c39a6d9e46d6UL, 0x90a9eb4c46e2a40UL, 0xf7baa40488fba6bdUL, 0xe3bbaea68e952ac0UL, 0x6e78734db3c8dadUL, 0x12153d6988dc5481UL, 0xef75480911f74d7aUL, 0xc7775d4d1d2a5580UL, 0xdcf0e69b6791b5bUL, 0x242a7ad311b8a902UL, 0xdeea901223ee9af4UL, 0x8eeeba9a3a54ab00UL, 0x1b9e1cd36cf236b7UL, 0x4854f5a623715204UL, 0xbdd5202447dd35e8UL, 0xa8844d1957620e41UL, 0x31d779cf759564d0UL, 0x8ed7ff3d8d78131aUL, 0x59bdd876f2b72cfcUL, 0x51089a32aec41c82UL, 0x63aef39eeb2ac9a1UL, 0x1daffe7b1af02634UL, 0xb37bb0ede56e59f9UL, 0x17480c487e436145UL, 0xc1b6a7547a249afdUL, 0x2521e887fe7afb7aUL, 0x44e0f9e5b7d1f4deUL, 0x9bc920bddf4d9acbUL, 0x85860ec158383c45UL, 0x543dc57e376f41e7UL, 0xabd66bf512aeae90UL, 0x3792417bbe9b3596UL, 0xb0c1d82b070788bUL, 0xa87b8afc6ede83cfUL, 0x57acd7ea255d5d20UL, 0x6f2482f77d366b2cUL, 0x16183b0560e0f116UL, 0x50f715f8ddbd079eUL, 0xaf59afd44ababa41UL, 0xde4905eefa6cd658UL, 0x2c30760ac1c1e22cUL, 0xa1ee2bf1bb7a0f3cUL, 0x5eb35fa895757482UL, 0xbc920bddf4d9acb0UL, 0x5860ec158383c459UL, 0x43dc57e376f41e78UL, 0xbd66bf512aeae905UL, 0x792417bbe9b35960UL, 0xb0c1d82b070788b3UL, 0x87b8afc6ede83cf0UL, 0x7acd7ea255d5d20aUL, 0xf2482f77d366b2c0UL, 0x6183b0560e0f1166UL, 0xf715f8ddbd079e1UL, 0xf59afd44ababa415UL, 0x51c966c285063dc1UL, 0xc5ec20c5b06f2b72UL, 0x9cab6a7c3a44d0UL, 0xc92262b72a5a0f06UL, 0x16cbf5a829c723c3UL, 0x8d3301e2ccaf5f5bUL, 0x1f4742a533ee3eb3UL, 0xb0535d5029b95920UL, 0x2d97eb50538e4786UL, 0x1a6603c5995ebeb6UL, 0x3e8e854a67dc7d67UL, 0x60a6baa05372b240UL, 0xee76ee8d84d7d74dUL, 0x322747e29ecc74d3UL, 0x63631ee504224ddcUL, 0xe35aed7edbe823acUL, 0xdceddd1b09afae9aUL, 0x644e8fc53d98e9a7UL, 0xc6c63dca08449bb8UL, 0xc6b5dafdb7d04758UL, 0xc82821b30940575UL, 0xce765fe3d740daf0UL, 0x93f26fe5db138062UL, 0xaf7c2dc512adc99dUL, 0x1905043661280aeaUL, 0x9cecbfc7ae81b5e0UL, 0x27e4dfcbb62700c5UL, 0x5ef85b8a255b933bUL, 0x320a086cc25015d4UL, 0x39d97f8f5d036bc0UL, 0x4fc9bf976c4e018bUL, 0xbdf0b7144ab72676UL, 0x641410d984a02ba8UL, 0x73b2ff1eba06d780UL, 0x9f937f2ed89c0316UL, 0x7be16e28956e4cecUL, 0xc82821b309405750UL, 0xe765fe3d740daf00UL, 0x3f26fe5db138062cUL, 0xf7c2dc512adc99d9UL, 0x905043661280aea0UL, 0xcecbfc7ae81b5e01UL, 0x7e4dfcbb62700c59UL, 0xef85b8a255b933b2UL, 0x95f9bee106ca0501UL, 0x9b7cb89c7c47b5bcUL, 0xe2e5ed070f7aafa1UL, 0xfd1ce97ad67f2048UL, 0x9eaa45ef2e5f5243UL, 0x3012315154fe62c6UL, 0xdbb5ce7fd56fe851UL, 0xd82e4acbd1f307bdUL, 0x880db3f37f75fcc7UL, 0x66cf22cb058dcc32UL, 0xa915888e614567b0UL, 0x924b0da9deeb4857UL, 0x101b67e6feebf98eUL, 0xcd9e45960b1b9865UL, 0x522b111cc28acf60UL, 0x24961b53bdd690afUL, 0x956ff7e0de1cab5dUL, 0x9dd7cb45ba463975UL, 0xba2836484e8f29d3UL, 0x6b3bae9906a06672UL, 0x2adfefc1bc3956baUL, 0x3baf968b748c72ebUL, 0x74506c909d1e53a7UL, 0xd6775d320d40cce5UL, 0xe0e6e7ae5bb9f535UL, 0x71b46d7f4569ec69UL, 0xf6decd50f1a6105cUL, 0x8ef9225a678cdee6UL, 0x7494f77194b8b22bUL, 0xe5839a9726a2d16cUL, 0xf3c38ed028d697aaUL, 0x3fe5dc8ab214fae1UL, 0xe929eee329716456UL, 0xcb07352e4d45a2d8UL, 0xe7871da051ad2f55UL, 0x7fcbb9156429f5c3UL, 0x670ae5eb712990edUL, 0x90e52a3536fa4c0eUL, 0xd1702f3168c0e9b9UL, 0xdd80ea14b55eacabUL, 0x7b4cf3fbc198799bUL, 0x27211403c18591a3UL, 0xbc9e4a131a1b6461UL, 0x99164c1717b01e7bUL, 0x43c0dfdaa0fbab77UL, 0x48a9686e2f7a2af9UL, 0x67428057ffac7fd0UL, 0x103b0010526d7bdbUL, 0x32d88798623c0eafUL, 0x97b990b5f2855c4dUL, 0xd0fb14de34c248b2UL, 0x261981ed9d7b09aUL, 0x65b10f30c4781d5eUL, 0x2f73216be50ab89aUL, 0xa1f629bc69849165UL, 0x4c3303db3af6135UL, 0x7e3b264cab3b62fdUL, 0x580d02be6664788bUL, 0x5d924709189395d8UL, 0x2b91f8451a538547UL, 0x492f74b475bd9dbbUL, 0xb6f1451560b9f8a9UL, 0xa55a9a63fabd9ca2UL, 0x753468b449aa4da2UL, 0x2707d145c8b06337UL, 0x6b09ca436d02f8edUL, 0x54cb20b63ee18e57UL, 0xc87f4956ee59dc69UL, 0x4e0fa28b9160c66eUL, 0xd6139486da05f1daUL, 0xa996416c7dc31caeUL, 0x90fe92addcb3b8d2UL, 0x29467d3a010ad49dUL, 0xaacc6964187aea0bUL, 0x4d5296a9301c8e4fUL, 0x3eabd65c46a3689UL, 0xe7d5c25921def17bUL, 0x537392a19c84dda9UL, 0x84db3923aba3ab8dUL, 0x25c2e2f5f5d92a3eUL, 0xcfab84b243bde2f6UL, 0xa6e725433909bb53UL, 0x9b672475747571aUL, 0x4b85c5ebebb2547dUL, 0x2a0e3149a4b09dadUL, 0x4b250aefde627f18UL, 0xd12f0ff65141927UL, 0xb51c13e9aa69efd6UL, 0xe1455abe6aaa631bUL, 0x90a155b610b5f78fUL, 0x45bf58f01b2855cUL, 0x482fbfed29de9880UL, 0x77d38d51f69f9e77UL, 0x27a9eb058d1ae6a0UL, 0x16c9ff6fc8ffbdabUL, 0xb248e7e42eb0762cUL, 0x5afe228ecef464afUL, 0x49b89662b644c4ffUL, 0x33edeaae5a65cc44UL, 0x468657f6206dab74UL, 0xa57d30be23911fUL, 0x959a6cacc0f88041UL, 0x79a5c12d7f512f9aUL, 0xaf1b37d23dd611c4UL, 0x14afa617c47223eUL, 0x2b34d95981f10082UL, 0xf34b825afea25f35UL, 0x5e366fa47bac2388UL, 0x295f4c2f88e447cUL, 0x5669b2b303e20104UL, 0xe69704b5fd44be6aUL, 0xbc6cdf48f7584711UL, 0xb072d1a8d2d7d0b9UL, 0xaa38250fabb50bb7UL, 0xd3501d1a3113cbc6UL, 0x5ace26af93bdc90fUL, 0x60e5a351a5afa172UL, 0x54704a1f576a176fUL, 0xa6a03a346227978dUL, 0xb59c4d5f277b921fUL, 0xc1cb46a34b5f42e4UL, 0xa8e0943eaed42edeUL, 0x4d407468c44f2f1aUL, 0x6b389abe4ef7243fUL, 0x36cfb56bb575dd89UL, 0x572a6814f1d95402UL, 0x84fefca04304e927UL, 0xf466ad42e0e30f52UL, 0xd8c652fa4920e353UL, 0xa8bf90404fc3a1bbUL, 0x1783ed314d93655cUL, 0xcadac2bbbccb5989UL, 0xb18ca5f49241c6a6UL, 0x517f20809f874377UL, 0x2f07da629b26cab9UL, 0x95b585777996b312UL, 0x63194be924838d4cUL, 0xa2fe41013f0e86efUL, 0x5e0fb4c5364d9572UL, 0x2b6b0aeef32d6624UL, 0xc63297d249071a98UL, 0x45fc82027e1d0ddeUL, 0xbc1f698a6c9b2ae5UL, 0x56d615dde65acc48UL, 0x8c652fa4920e3530UL, 0x8bf90404fc3a1bbdUL, 0x783ed314d93655caUL, 0xadac2bbbccb59891UL, 0x18ca5f49241c6a60UL, 0x17f20809f874377bUL, 0xf07da629b26cab95UL, 0x5b585777996b3122UL, 0x3194be924838d4c0UL, 0x2fe41013f0e86ef6UL, 0xe0fb4c5364d9572aUL, 0xb6b0aeef32d66245UL, 0xd6704509b3baf1c1UL, 0x5923604e4da1d453UL, 0xdf888cd702281946UL, 0x4f76c5e018a183a7UL, 0xace08a136775e382UL, 0xb246c09c9b43a8a7UL, 0xbf1119ae0450328cUL, 0x9eed8bc03143074fUL, 0xec982c0bed209f45UL, 0x6266c1509af658f0UL, 0x605c272dc33ad20bUL, 0x1fcc8fbe1f8b49b3UL, 0xd9305817da413e8aUL, 0xc4cd82a135ecb1e1UL, 0xc0b84e5b8675a416UL, 0x3f991f7c3f169366UL, 0xb260b02fb4827d14UL, 0x899b05426bd963c3UL, 0x81709cb70ceb482dUL, 0x7f323ef87e2d26cdUL, 0x64c1605f6904fa28UL, 0x13360a84d7b2c787UL, 0x2e1396e19d6905bUL, 0xfe647df0fc5a4d9bUL, 0xc982c0bed209f450UL, 0x266c1509af658f0eUL, 0x5c272dc33ad20b6UL, 0xfcc8fbe1f8b49b36UL, 0x9305817da413e8a0UL, 0x4cd82a135ecb1e1dUL, 0xb84e5b8675a416cUL, 0xf991f7c3f169366cUL, 0x93523ad66bec8901UL, 0x9f5b144f11e73584UL, 0x977df01052e35caUL, 0xd13477b99fdf2bf4UL, 0x26a475acd7d91202UL, 0x3eb6289e23ce6b09UL, 0x12efbe020a5c6b95UL, 0xa268ef733fbe57e8UL, 0xf811d3748c797c45UL, 0x7b871155ebeddfadUL, 0x3ba16875df226038UL, 0x66c646d80271e8fcUL, 0x457a9ec43b39a0cbUL, 0xf1e562c27baab6e4UL, 0x693cc49a75de7762UL, 0xef9b158e79ee96d4UL, 0x3fac05a555b819d7UL, 0xe52185ed5b246477UL, 0xcc079d45202659d7UL, 0xfd21b3228ed06a84UL, 0xca01336788bb6befUL, 0xcca84bb31a39c151UL, 0x86712efb8bd604bdUL, 0xd854fe7b60ad9225UL, 0x215b5ee232bd8f9fUL, 0x9fbbd70f98028b1cUL, 0x129c4986dc36be69UL, 0x92be64c8bc566367UL, 0x42b6bdc4657b1f3eUL, 0x3f77ae1f30051638UL, 0x2538930db86d7cd3UL, 0x257cc99178acc6ceUL, 0x856d7b88caf63e7cUL, 0x7eef5c3e600a2c70UL, 0x4a71261b70daf9a6UL, 0x4af99322f1598d9cUL, 0xbf83cf3cb62724b9UL, 0xfb35f8156c65515eUL, 0x8a9c58472a2f445eUL, 0xb7e4be7b9fbe5c14UL, 0xca5ea6544f851133UL, 0xf080b04374bbab02UL, 0xb46a4ff9fc43fafUL, 0x4ddee4c94271ff05UL, 0x21e47485bcc17a27UL, 0xe7ea20ef45065fbaUL, 0x8f35d8ef412c84dUL, 0xb9aa51acf9eeb926UL, 0x43c8e90b7982f44eUL, 0xcfd441de8a0cbf74UL, 0x11e6bb1de825909bUL, 0x7354a359f3dd724cUL, 0x8791d216f305e89cUL, 0x9fa883bd14197ee8UL, 0x23cd763bd04b2137UL, 0xe6a946b3e7bae498UL, 0xf23a42de60bd138UL, 0x3f51077a2832fdd1UL, 0x479aec77a096426fUL, 0xcd528d67cf75c930UL, 0x1e47485bcc17a270UL, 0x7ea20ef45065fba2UL, 0x8f35d8ef412c84deUL, 0x9aa51acf9eeb9260UL, 0x89d7a89abbe41ca1UL, 0xfbaf5d810cbafefbUL, 0x15a5af49c3beaeUL, 0x175dada140da63edUL, 0x13af513577c83942UL, 0xf75ebb021975fdf7UL, 0x2b4b5e93877d5dUL, 0x2ebb5b4281b4c7daUL, 0x92079a47cc5b2ac5UL, 0xe856366d9e9af251UL, 0x1e2882ccec944da9UL, 0x7f612ebb7e64c898UL, 0x91560ca2bb7d0dcbUL, 0xd6472cb29144ed1cUL, 0x222f11e812b22c41UL, 0xdcd5c54881c4d61cUL, 0x97f52168553143d7UL, 0xaa65190c8ef8d386UL, 0x5a2037a1eefeef91UL, 0x9bbc12af7e84eb14UL, 0x9ab37afd89a9dfefUL, 0x52217270b180aeb2UL, 0xaa3e7b3216676831UL, 0x156fbd6080049104UL, 0x3566f5fb1353bfdeUL, 0xa442e4e163015d65UL, 0x547cf6642cced062UL, 0x2adf7ac100092209UL, 0x6acdebf626a77fbcUL, 0x4885c9c2c602bacaUL, 0xa8f9ecc8599da0c5UL, 0x55bef58200124412UL, 0x60c2efc16e85a739UL, 0x97e0d3ec20747c2bUL, 0x4f8dcde178a1f698UL, 0x896a733a7d29cf09UL, 0xc185df82dd0b4e72UL, 0x2fc1a7d840e8f856UL, 0x9f1b9bc2f143ed31UL, 0x12d4e674fa539e12UL, 0x830bbf05ba169ce4UL, 0x5f834fb081d1f0adUL, 0x3e373785e287da62UL, 0x25a9cce9f4a73c25UL, 0xb34e462657e66189UL, 0xb9eddf08afd2e8e4UL, 0x62107b7a0e9503d6UL, 0x694401ed94433f66UL, 0xd3c5b4618c079b53UL, 0x7530fe78f3d4d876UL, 0xda5ee285d6b0b0bfUL, 0xf09f9be5558b39e0UL, 0x12d250ee3bc46ee7UL, 0xec8abc984bd8b952UL, 0xaac3d17a66fbd66cUL, 0xc328aff4d61b34edUL, 0x90fd99f15443858fUL, 0xdffe39593bc07b1bUL, 0x4bf9b685066d1bcbUL, 0xa446c7d7d13b2ef7UL, 0x94a20bcf8b4c535fUL, 0xb91732dbdbf1ff88UL, 0x898d797bc7408085UL, 0x6a9a1791df7b1ac2UL, 0x2944179f1698a6beUL, 0x722e65b7b7e3ff11UL, 0x131af2f78e81010bUL, 0xd5342f23bef63585UL, 0x52882f3e2d314d7cUL, 0xe45ccb6f6fc7fe22UL, 0x2635e5ef1d020216UL, 0xaa685e477dec6b0aUL, 0xa5105e7c5a629af8UL, 0xc8b996dedf8ffc44UL, 0x4c6bcbde3a04042dUL, 0x54d0bc8efbd8d614UL, 0x4a20bcf8b4c535f0UL, 0x91732dbdbf1ff889UL, 0x98d797bc7408085bUL, 0xa9a1791df7b1ac28UL, 0x944179f1698a6be0UL, 0x22e65b7b7e3ff112UL, 0x31af2f78e81010b7UL, 0x5342f23bef635851UL, 0x2882f3e2d314d7c0UL, 0x45ccb6f6fc7fe225UL, 0x635e5ef1d020216eUL, 0xa685e477dec6b0a2UL, 0x5105e7c5a629af80UL, 0x8b996dedf8ffc44aUL, 0xc6bcbde3a04042dcUL, 0x4d0bc8efbd8d6144UL, 0xa20bcf8b4c535f00UL, 0x1732dbdbf1ff8894UL, 0x8d797bc7408085b9UL, 0x9a1791df7b1ac289UL, 0x44179f1698a6be00UL, 0x2e65b7b7e3ff1129UL, 0x1af2f78e81010b72UL, 0x342f23bef6358513UL, 0x882f3e2d314d7c00UL, 0x5ccb6f6fc7fe2252UL, 0x35e5ef1d020216e4UL, 0x685e477dec6b0a26UL, 0xa50744774151a041UL, 0xbf7d9eb6238d4d1aUL, 0x75b5ca4bcf9e9adaUL, 0xf2ab16c5a5db5360UL, 0x4a0e88ee82a34082UL, 0x7efb3d6c471a9a35UL, 0xeb6b94979f3d35b5UL, 0xe5562d8b4bb6a6c0UL, 0x214429f0268dd945UL, 0xfb1d3ab122443dd5UL, 0xc8a93d5ef5e0dc78UL, 0xe8bbc328ea600aadUL, 0x428853e04d1bb28aUL, 0xf63a756244887baaUL, 0x91527abdebc1b8f1UL, 0xd1778651d4c0155bUL, 0x30499fedb9fc3d55UL, 0xea9faaad2561feebUL, 0x3cdae10a1c19c6f1UL, 0x80f8949dd48d6d9bUL, 0xd5ca07f6503322ebUL, 0xd3d41533e6b2f469UL, 0x67cbd665f3a93af1UL, 0x23e6b105d4179c1aUL, 0xab940feca06645d6UL, 0xa7a82a67cd65e8d3UL, 0xcf97accbe75275e3UL, 0x47cd620ba82f3834UL, 0xe27127f46307d3edUL, 0x49bb14a636bad818UL, 0x81514de6053e5cd5UL, 0xad8d5c292d533745UL, 0xc4e24fe8c60fa7daUL, 0x9376294c6d75b031UL, 0x2a29bcc0a7cb9aaUL, 0x5b1ab8525aa66e8bUL, 0x89c49fd18c1f4fb4UL, 0x26ec5298daeb6063UL, 0x545379814f97355UL, 0xb63570a4b54cdd16UL, 0xa6d0078e3bf5c729UL, 0x4b33e55819a7c978UL, 0x14f47b41e26851b8UL, 0x4e7d79771794fd00UL, 0x4da00f1c77eb8e52UL, 0x9667cab0334f92f1UL, 0x29e8f683c4d0a370UL, 0x9cfaf2ee2f29fa00UL, 0x2e192615cc1c44e5UL, 0x2a24d509caee2c5dUL, 0x4daff976423bf1f3UL, 0x1be27de2235eb32cUL, 0xe96b7406bbf3d18bUL, 0x52a2ea7a39ad5105UL, 0x8521e69d4fed54f4UL, 0x15d363fa3bb02174UL, 0xd2d6e80d77e7a316UL, 0xa545d4f4735aa20bUL, 0xa43cd3a9fdaa9e8UL, 0x2ba6c7f4776042e9UL, 0xa5add01aefcf462cUL, 0x4a8ba9e8e6b54417UL, 0x14879a753fb553d1UL, 0x574d8fe8eec085d2UL, 0x4b5ba035df9e8c58UL, 0x951753d1cd6a882fUL, 0x290f34ea7f6aa7a2UL, 0xae9b1fd1dd810ba4UL, 0x96b7406bbf3d18b0UL, 0x2a2ea7a39ad5105eUL, 0x521e69d4fed54f45UL, 0x5d363fa3bb021748UL, 0x2d6e80d77e7a3160UL, 0x545d4f4735aa20bdUL, 0xa43cd3a9fdaa9e8aUL, 0xba6c7f4776042e90UL, 0xef843983df3f3a81UL, 0xae51dee7c72548c5UL, 0x5607b32230cf8a06UL, 0x56cf66b091051a0dUL, 0x6a514b2a9db52d43UL, 0x5a48fda6223b9834UL, 0xb2717235aa05a31fUL, 0x8f89555f5f077336UL, 0x61fbae7818a102c7UL, 0xb27abb25e80639d7UL, 0x7a9cf01a9f91f12cUL, 0x3d053280c303a141UL, 0x76ae64dd12895dcfUL, 0x621e36227c7d7a11UL, 0xeb47f444f4b9554bUL, 0x581dfd3ffb0a05aeUL, 0xed5cc9ba2512bb9eUL, 0xc43c6c44f8faf422UL, 0xd68fe889e972aa96UL, 0xb03bfa7ff6140b5dUL, 0x6fe0ab5969ee2f7dUL, 0x8e9398e05d84e1faUL, 0xb361c562197fe23fUL, 0x42606cc191255197UL, 0xdfc156b2d3dc5efaUL, 0x1d2731c0bb09c3f4UL, 0x66c38ac432ffc47fUL, 0x84c0d983224aa32fUL, 0xbf82ad65a7b8bdf4UL, 0x3a4e6381761387e9UL, 0xcd87158865ff88feUL, 0x981b3064495465eUL, 0xca5c62e66cba23a9UL, 0x7277876b4056066cUL, 0x85703f610065a6eeUL, 0x3114fe32f427cb91UL, 0x94b8c5ccd9744752UL, 0xe4ef0ed680ac0cd9UL, 0xae07ec200cb4ddcUL, 0x6229fc65e84f9723UL, 0x29718b99b2e88ea4UL, 0xc9de1dad015819b3UL, 0x15c0fd8401969bb9UL, 0xc453f8cbd09f2e46UL, 0x52e3173365d11d48UL, 0x93bc3b5a02b03366UL, 0x2b81fb08032d3773UL, 0x88a7f197a13e5c8cUL, 0xa5c62e66cba23a90UL, 0x277876b4056066ccUL, 0x5703f610065a6ee7UL, 0x114fe32f427cb918UL, 0xfed564e0b48f2d61UL, 0x481bad01a6b1c426UL, 0xb079f851c72e6adcUL, 0x885e60f9f4351cUL, 0xfdaac9c1691e5ac2UL, 0x90375a034d63884dUL, 0x60f3f0a38e5cd5b8UL, 0x110bcc1f3e86a39UL, 0xfb559382d23cb584UL, 0x206eb4069ac7109bUL, 0xc1e7e1471cb9ab71UL, 0x2217983e7d0d472UL, 0xf6ab2705a4796b08UL, 0x40dd680d358e2137UL, 0x83cfc28e397356e2UL, 0x442f307cfa1a8e5UL, 0xed564e0b48f2d610UL, 0x81bad01a6b1c426fUL, 0x79f851c72e6adc4UL, 0x885e60f9f4351cbUL, 0xdaac9c1691e5ac20UL, 0x375a034d63884dfUL, 0xf3f0a38e5cd5b89UL, 0x110bcc1f3e86a396UL, }; + +#endif diff --git a/crypto_kem/hqc-256/avx2/gf.c b/crypto_kem/hqc-256/avx2/gf.c new file mode 100644 index 00000000..f112f62f --- /dev/null +++ b/crypto_kem/hqc-256/avx2/gf.c @@ -0,0 +1,167 @@ +#include "gf.h" +#include "parameters.h" +#include +#include +#include +/** + * @file gf.c + * Galois field implementation with multiplication using the pclmulqdq instruction + */ + + +static uint16_t gf_reduce(uint64_t x, size_t deg_x); +static uint16_t gf_quad(uint64_t a); + + + +/** + * Logarithm of elements of GF(2^10) to the base alpha (root of x^10 + x^3 + 1). + * The logarithm of 0 is set to 1024 by convention. + */ +static const uint16_t log[1024] = { + 1024, 0, 1, 77, 2, 154, 78, 956, 3, 10, 155, 325, 79, 618, 957, 231, 4, 308, 11, 200, 156, 889, 326, 695, 80, 24, 619, 87, 958, 402, 232, 436, 5, 513, 309, 551, 12, 40, 201, 479, 157, 518, 890, 101, 327, 164, 696, 860, 81, 258, 25, 385, 620, 277, 88, 577, 959, 772, 403, 680, 233, 52, 437, 966, 6, 20, 514, 768, 310, 650, 552, 129, 13, 314, 41, 849, 202, 757, 480, 980, 158, 213, 519, 335, 891, 462, 102, 907, 328, 654, 165, 264, 697, 369, 861, 354, 82, 675, 259, 590, 26, 628, 386, 991, 621, 556, 278, 822, 89, 219, 578, 117, 960, 937, 773, 533, 404, 491, 681, 241, 234, 133, 53, 595, 438, 178, 967, 943, 7, 1020, 21, 305, 515, 510, 769, 255, 311, 17, 651, 210, 553, 672, 130, 934, 14, 1017, 315, 1014, 42, 610, 850, 191, 203, 318, 758, 31, 481, 428, 981, 568, 159, 613, 214, 752, 520, 667, 336, 788, 892, 45, 463, 801, 103, 525, 908, 705, 329, 194, 655, 1008, 166, 642, 265, 296, 698, 853, 370, 633, 862, 899, 355, 779, 83, 321, 676, 97, 260, 845, 591, 818, 27, 206, 629, 797, 387, 793, 992, 727, 622, 34, 557, 661, 279, 420, 823, 834, 90, 761, 220, 391, 579, 926, 118, 451, 961, 431, 938, 349, 774, 563, 534, 446, 405, 484, 492, 731, 682, 341, 242, 714, 235, 571, 134, 290, 54, 412, 596, 140, 439, 984, 179, 996, 968, 810, 944, 539, 8, 616, 1021, 152, 22, 400, 306, 887, 516, 162, 511, 38, 770, 50, 256, 275, 312, 755, 18, 648, 652, 367, 211, 460, 554, 217, 673, 626, 131, 176, 935, 489, 15, 670, 1018, 508, 316, 426, 1015, 608, 43, 523, 611, 665, 851, 897, 192, 640, 204, 791, 319, 843, 759, 924, 32, 418, 482, 339, 429, 561, 982, 808, 569, 410, 160, 48, 614, 398, 215, 174, 753, 365, 521, 895, 668, 424, 337, 806, 789, 922, 893, 804, 46, 172, 464, 872, 802, 870, 104, 466, 526, 283, 909, 874, 706, 736, 330, 528, 195, 380, 656, 285, 1009, 1003, 167, 106, 643, 838, 266, 468, 297, 66, 699, 708, 854, 111, 371, 738, 634, 60, 863, 911, 900, 827, 356, 876, 780, 497, 84, 197, 322, 74, 677, 382, 98, 548, 261, 332, 846, 765, 592, 530, 819, 587, 28, 1011, 207, 302, 630, 1005, 798, 749, 388, 658, 794, 94, 993, 287, 728, 346, 623, 645, 35, 149, 558, 840, 662, 505, 280, 169, 421, 395, 824, 108, 835, 377, 91, 299, 762, 71, 221, 68, 392, 146, 580, 268, 927, 224, 119, 470, 452, 687, 962, 856, 432, 227, 939, 113, 350, 976, 775, 701, 564, 930, 535, 710, 447, 723, 406, 636, 485, 271, 493, 62, 732, 918, 683, 373, 342, 583, 243, 740, 715, 719, 236, 902, 572, 690, 135, 829, 291, 186, 55, 865, 413, 455, 597, 913, 141, 744, 440, 782, 985, 473, 180, 499, 997, 602, 969, 358, 811, 122, 945, 878, 540, 247, 9, 324, 617, 230, 1022, 76, 153, 955, 23, 86, 401, 435, 307, 199, 888, 694, 517, 100, 163, 859, 512, 550, 39, 478, 771, 679, 51, 965, 257, 384, 276, 576, 313, 848, 756, 979, 19, 767, 649, 128, 653, 263, 368, 353, 212, 334, 461, 906, 555, 821, 218, 116, 674, 589, 627, 990, 132, 594, 177, 942, 936, 532, 490, 240, 16, 209, 671, 933, 1019, 304, 509, 254, 317, 30, 427, 567, 1016, 1013, 609, 190, 44, 800, 524, 704, 612, 751, 666, 787, 852, 632, 898, 778, 193, 1007, 641, 295, 205, 796, 792, 726, 320, 96, 844, 817, 760, 390, 925, 450, 33, 660, 419, 833, 483, 730, 340, 713, 430, 348, 562, 445, 983, 995, 809, 538, 570, 289, 411, 139, 161, 37, 49, 274, 615, 151, 399, 886, 216, 625, 175, 488, 754, 647, 366, 459, 522, 664, 896, 639, 669, 507, 425, 607, 338, 560, 807, 409, 790, 842, 923, 417, 894, 423, 805, 921, 47, 397, 173, 364, 465, 282, 873, 735, 803, 171, 871, 869, 105, 837, 467, 65, 527, 379, 284, 1002, 910, 826, 875, 496, 707, 110, 737, 59, 331, 764, 529, 586, 196, 73, 381, 547, 657, 93, 286, 345, 1010, 301, 1004, 748, 168, 394, 107, 376, 644, 148, 839, 504, 267, 223, 469, 686, 298, 70, 67, 145, 700, 929, 709, 722, 855, 226, 112, 975, 372, 582, 739, 718, 635, 270, 61, 917, 864, 454, 912, 743, 901, 689, 828, 185, 357, 121, 877, 246, 781, 472, 498, 601, 85, 434, 198, 693, 323, 229, 75, 954, 678, 964, 383, 575, 99, 858, 549, 477, 262, 352, 333, 905, 847, 978, 766, 127, 593, 941, 531, 239, 820, 115, 588, 989, 29, 566, 1012, 189, 208, 932, 303, 253, 631, 777, 1006, 294, 799, 703, 750, 786, 389, 449, 659, 832, 795, 725, 95, 816, 994, 537, 288, 138, 729, 712, 347, 444, 624, 487, 646, 458, 36, 273, 150, 885, 559, 408, 841, 416, 663, 638, 506, 606, 281, 734, 170, 868, 422, 920, 396, 363, 825, 495, 109, 58, 836, 64, 378, 1001, 92, 344, 300, 747, 763, 585, 72, 546, 222, 685, 69, 144, 393, 375, 147, 503, 581, 717, 269, 916, 928, 721, 225, 974, 120, 245, 471, 600, 453, 742, 688, 184, 963, 574, 857, 476, 433, 692, 228, 953, 940, 238, 114, 988, 351, 904, 977, 126, 776, 293, 702, 785, 565, 188, 931, 252, 536, 137, 711, 443, 448, 831, 724, 815, 407, 415, 637, 605, 486, 457, 272, 884, 494, 57, 63, 1000, 733, 867, 919, 362, 684, 143, 374, 502, 343, 746, 584, 545, 244, 599, 741, 183, 716, 915, 720, 973, 237, 987, 903, 125, 573, 475, 691, 952, 136, 442, 830, 814, 292, 784, 187, 251, 56, 999, 866, 361, 414, 604, 456, 883, 598, 182, 914, 972, 142, 501, 745, 544, 441, 813, 783, 250, 986, 124, 474, 951, 181, 971, 500, 543, 998, 360, 603, 882, 970, 542, 359, 881, 812, 249, 123, 950, 946, 947, 879, 948, 541, 880, 248, 949 +}; + + + +/** + * Returns the integer i such that elt = a^i + * where a is the primitive element of GF(2^GF_M). + *@returns the logarithm of the given element + */ +uint16_t PQCLEAN_HQC256_AVX2_gf_log(uint16_t elt) { + return log[elt]; +} + + + +/** + * Reduces polynomial x modulo primitive polynomial GF_POLY. + * @returns x mod GF_POLY + * @param[in] x Polynomial of degree less than 64 + * @param[in] deg_x The degree of polynomial x + */ +uint16_t gf_reduce(uint64_t x, size_t deg_x) { + // Compute the distance between the primitive polynomial first two set bits + size_t lz1 = __builtin_clz(PARAM_GF_POLY); + size_t lz2 = __builtin_clz(PARAM_GF_POLY ^ 1 << PARAM_M); + size_t dist = lz2 - lz1; + + // Deduce the number of steps of reduction + size_t steps = CEIL_DIVIDE(deg_x - (PARAM_M - 1), dist); + + // Reduce + for (size_t i = 0; i < steps; ++i) { + uint64_t mod = x >> PARAM_M; + x &= (1 << PARAM_M) - 1; + x ^= mod; + + size_t tz1 = 0; + uint16_t rmdr = PARAM_GF_POLY ^ 1; + for (size_t j = __builtin_popcount(PARAM_GF_POLY) - 2; j; --j) { + size_t tz2 = __builtin_ctz(rmdr); + size_t shift = tz2 - tz1; + mod <<= shift; + x ^= mod; + rmdr ^= 1 << tz2; + tz1 = tz2; + } + } + + return x; +} + + + +/** + * Multiplies two elements of GF(2^GF_M). + * @returns the product a*b + * @param[in] a Element of GF(2^GF_M) + * @param[in] b Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQC256_AVX2_gf_mul(uint16_t a, uint16_t b) { + __m128i va = _mm_cvtsi32_si128(a); + __m128i vb = _mm_cvtsi32_si128(b); + __m128i vab = _mm_clmulepi64_si128(va, vb, 0); + uint32_t ab = _mm_cvtsi128_si32(vab); + + return gf_reduce(ab, 2 * (PARAM_M - 1)); +} + + + +/** + * Squares an element of GF(2^GF_M). + * @returns a^2 + * @param[in] a Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQC256_AVX2_gf_square(uint16_t a) { + uint32_t b = a; + uint32_t s = b & 1; + for (size_t i = 1; i < PARAM_M; ++i) { + b <<= 1; + s ^= b & (1 << 2 * i); + } + + return gf_reduce(s, 2 * (PARAM_M - 1)); +} + + + +/** + * Computes the 4th power of an element of GF(2^GF_M). + * @returns a^4 + * @param[in] a Element of GF(2^GF_M) + */ +uint16_t gf_quad(uint64_t a) { + uint64_t q = a & 1; + for (size_t i = 1; i < PARAM_M; ++i) { + a <<= 3; + q ^= a & (1ull << 4 * i); + } + + return gf_reduce(q, 4 * (PARAM_M - 1)); +} + + + +/** + * Computes the inverse of an element of GF(2^10), + * using a shorter chain of squares and multiplications than fast exponentiation. + * @returns the inverse of a + * @param[in] a Element of GF(2^10) + */ +uint16_t PQCLEAN_HQC256_AVX2_gf_inverse(uint16_t a) { + uint16_t p; + uint16_t a2; + + a2 = PQCLEAN_HQC256_AVX2_gf_square(a); // a^2 + a = PQCLEAN_HQC256_AVX2_gf_mul(a2, a); // a^2.a + p = gf_quad(a); // a^8.a^4 + a = PQCLEAN_HQC256_AVX2_gf_mul(p, a); // a^8.a^4.a^2.a + p = gf_quad(a); // a^32.a^16.a^8.a^4 + p = gf_quad(p); // a^128.a^64.a^32.a^16 + a = PQCLEAN_HQC256_AVX2_gf_mul(p, a); // a^128.a^64.a^32.a^16.a^8.a^4.a^2.a + p = gf_quad(a); // a^512.a^256.a^128.a^64.a^32.a^16.a^8.a^4 + p = PQCLEAN_HQC256_AVX2_gf_mul(p, a2); // a^-1 + + return p; +} + + + +/** + * Returns i modulo 2^GF_M-1. + * i must be less than 2*(2^GF_M-1). + * Therefore, the return value is either i or i-2^GF_M+1. + * @returns i mod (2^GF_M-1) + * @param[in] i The integer whose modulo is taken + */ +uint16_t PQCLEAN_HQC256_AVX2_gf_mod(uint16_t i) { + uint16_t tmp = i - PARAM_GF_MUL_ORDER; + + // mask = 0xffff if (i < GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & PARAM_GF_MUL_ORDER); +} diff --git a/crypto_kem/hqc-256/avx2/gf.h b/crypto_kem/hqc-256/avx2/gf.h new file mode 100644 index 00000000..c2dbc118 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/gf.h @@ -0,0 +1,29 @@ +#ifndef GF_H +#define GF_H + + +/** + * @file gf.h + * Header file of gf.c + */ + +#include + +#include +#include + +void PQCLEAN_HQC256_AVX2_gf_generate(uint16_t *exp, uint16_t *log, int16_t m); + + +uint16_t PQCLEAN_HQC256_AVX2_gf_log(uint16_t elt); + +uint16_t PQCLEAN_HQC256_AVX2_gf_mul(uint16_t a, uint16_t b); + +uint16_t PQCLEAN_HQC256_AVX2_gf_square(uint16_t a); + +uint16_t PQCLEAN_HQC256_AVX2_gf_inverse(uint16_t a); + +uint16_t PQCLEAN_HQC256_AVX2_gf_mod(uint16_t i); + + +#endif diff --git a/crypto_kem/hqc-256/avx2/gf2x.c b/crypto_kem/hqc-256/avx2/gf2x.c new file mode 100644 index 00000000..abd11014 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/gf2x.c @@ -0,0 +1,763 @@ +#include "gf2x.h" +#include "parameters.h" +#include +#include +#include + +/** + * \file gf2x.c + * \brief AVX2 implementation of multiplication of two polynomials + */ + + +// sizes for Toom-Cook +#define T_TM3_3W_256 32 +#define T_TM3_3W_64 128 +// constants TOOM3REC +#define tTM3R 1116 +#define T_TM3R_3W_256 93 +#define T_TM3R_3W_64 (T_TM3R_3W_256<<2) + +#define VEC_N_ARRAY_SIZE_VEC CEIL_DIVIDE(PARAM_N, 256) /*!< The number of needed vectors to store PARAM_N bits*/ +#define WORD 64 +#define LAST64 (PARAM_N >> 6) +uint64_t a1_times_a2[2 * VEC_N_256_SIZE_64 + 1]; +uint64_t tmp_reduce[VEC_N_ARRAY_SIZE_VEC << 2]; +__m256i *o256 = (__m256i *) tmp_reduce; +uint64_t bloc64[PARAM_OMEGA_R]; // Allocation with the biggest possible weight +uint64_t bit64[PARAM_OMEGA_R]; // Allocation with the biggest possible weight + + +static inline void reduce(uint64_t *o, const uint64_t *a); +inline static void karat_mult_1(__m128i *C, __m128i *A, __m128i *B); +inline static void karat_mult_2(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_4(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_8(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_16(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_32(__m256i *C, __m256i *A, __m256i *B); +static inline void divByXplus1(__m256i *out, __m256i *in, int size); +static inline void divByXplus1_256(__m256i *out, __m256i *in, int size); +static void TOOM3Mult(uint64_t *Out, const uint64_t *A, const uint64_t *B); +static void TOOM3RecMult(uint64_t *Out, const uint64_t *A, const uint64_t *B); + + + +/** + * @brief Compute o(x) = a(x) mod \f$ X^n - 1\f$ + * + * This function computes the modular reduction of the polynomial a(x) + * + * @param[out] o Pointer to the result + * @param[in] a Pointer to the polynomial a(x) + */ +static inline void reduce(uint64_t *o, const uint64_t *a) { + __m256i r256, carry256; + __m256i *a256 = (__m256i *) a; + static const int32_t dec64 = PARAM_N & 0x3f; + static const int32_t d0 = WORD - dec64; + int32_t i, i2; + + for (i = LAST64 ; i < (PARAM_N >> 5) - 4 ; i += 4) { + r256 = _mm256_lddqu_si256((__m256i const *) (& a[i])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_lddqu_si256((__m256i const *) (& a[i + 1])); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = a256[i2] ^ r256; + } + + r256 = _mm256_lddqu_si256((__m256i const *)(& a[i])); + carry256 = _mm256_lddqu_si256((__m256i const *)(& a[i + 1])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = a256[i2] ^ r256; + tmp_reduce[LAST64] &= RED_MASK; + memcpy(o, tmp_reduce, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * A(x) and B(x) are stored in 128-bit registers + * This function computes A(x)*B(x) using Karatsuba + * + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_1(__m128i *C, __m128i *A, __m128i *B) { + __m128i D1[2]; + __m128i D0[2], D2[2]; + __m128i Al = _mm_loadu_si128(A); + __m128i Ah = _mm_loadu_si128(A + 1); + __m128i Bl = _mm_loadu_si128(B); + __m128i Bh = _mm_loadu_si128(B + 1); + + // Compute Al.Bl=D0 + __m128i DD0 = _mm_clmulepi64_si128(Al, Bl, 0); + __m128i DD2 = _mm_clmulepi64_si128(Al, Bl, 0x11); + __m128i AAlpAAh = _mm_xor_si128(Al, _mm_shuffle_epi32(Al, 0x4e)); + __m128i BBlpBBh = _mm_xor_si128(Bl, _mm_shuffle_epi32(Bl, 0x4e)); + __m128i DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D0[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D0[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Compute Ah.Bh=D2 + DD0 = _mm_clmulepi64_si128(Ah, Bh, 0); + DD2 = _mm_clmulepi64_si128(Ah, Bh, 0x11); + AAlpAAh = _mm_xor_si128(Ah, _mm_shuffle_epi32(Ah, 0x4e)); + BBlpBBh = _mm_xor_si128(Bh, _mm_shuffle_epi32(Bh, 0x4e)); + DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D2[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D2[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Compute AlpAh.BlpBh=D1 + // Initialisation of AlpAh and BlpBh + __m128i AlpAh = _mm_xor_si128(Al, Ah); + __m128i BlpBh = _mm_xor_si128(Bl, Bh); + DD0 = _mm_clmulepi64_si128(AlpAh, BlpBh, 0); + DD2 = _mm_clmulepi64_si128(AlpAh, BlpBh, 0x11); + AAlpAAh = _mm_xor_si128(AlpAh, _mm_shuffle_epi32(AlpAh, 0x4e)); + BBlpBBh = _mm_xor_si128(BlpBh, _mm_shuffle_epi32(BlpBh, 0x4e)); + DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D1[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D1[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Final comutation of C + __m128i middle = _mm_xor_si128(D0[1], D2[0]); + C[0] = D0[0]; + C[1] = middle ^ D0[0] ^ D1[0]; + C[2] = middle ^ D1[1] ^ D2[1]; + C[3] = D2[1]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_2(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[2], D1[2], D2[2], SAA, SBB; + __m128i *A128 = (__m128i *)A, *B128 = (__m128i *)B; + + karat_mult_1((__m128i *) D0, A128, B128); + karat_mult_1((__m128i *) D2, A128 + 2, B128 + 2); + + SAA = A[0] ^ A[1]; + SBB = B[0] ^ B[1]; + + karat_mult_1((__m128i *) D1, (__m128i *) &SAA, (__m128i *) &SBB); + __m256i middle = _mm256_xor_si256(D0[1], D2[0]); + + C[0] = D0[0]; + C[1] = middle ^ D0[0] ^ D1[0]; + C[2] = middle ^ D1[1] ^ D2[1]; + C[3] = D2[1]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_4(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[4], D1[4], D2[4], SAA[2], SBB[2]; + + karat_mult_2( D0, A, B); + karat_mult_2(D2, A + 2, B + 2); + + SAA[0] = A[0] ^ A[2]; + SBB[0] = B[0] ^ B[2]; + SAA[1] = A[1] ^ A[3]; + SBB[1] = B[1] ^ B[3]; + + karat_mult_2( D1, SAA, SBB); + + __m256i middle0 = _mm256_xor_si256(D0[2], D2[0]); + __m256i middle1 = _mm256_xor_si256(D0[3], D2[1]); + + C[0] = D0[0]; + C[1] = D0[1]; + C[2] = middle0 ^ D0[0] ^ D1[0]; + C[3] = middle1 ^ D0[1] ^ D1[1]; + C[4] = middle0 ^ D1[2] ^ D2[2]; + C[5] = middle1 ^ D1[3] ^ D2[3]; + C[6] = D2[2]; + C[7] = D2[3]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_8(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[8], D1[8], D2[8], SAA[4], SBB[4]; + + karat_mult_4( D0, A, B); + karat_mult_4(D2, A + 4, B + 4); + + for (int32_t i = 0 ; i < 4 ; i++) { + int is = i + 4; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_4(D1, SAA, SBB); + + for (int32_t i = 0 ; i < 4 ; i++) { + int32_t is = i + 4; + int32_t is2 = is + 4; + int32_t is3 = is2 + 4; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_16(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[16], D1[16], D2[16], SAA[8], SBB[8]; + + karat_mult_8( D0, A, B); + karat_mult_8(D2, A + 8, B + 8); + + for (int32_t i = 0 ; i < 8 ; i++) { + int32_t is = i + 8; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_8( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 8 ; i++) { + int32_t is = i + 8; + int32_t is2 = is + 8; + int32_t is3 = is2 + 8; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_32(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[32], D1[32], D2[32], SAA[16], SBB[16]; + + karat_mult_16( D0, A, B); + karat_mult_16(D2, A + 16, B + 16); + + for (int32_t i = 0 ; i < 16 ; i++) { + int is = i + 16; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_16( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 16 ; i++) { + int32_t is = i + 16; + int32_t is2 = is + 16; + int32_t is3 = is2 + 16; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute B(x) = A(x)/(x+1) + * + * This function computes A(x)/(x+1) using a Quercia like algorithm + * @param[out] out Pointer to the result + * @param[in] in Pointer to the polynomial A(x) + * @param[in] size used to define the number of coeeficients of A + */ +static inline void divByXplus1(__m256i *out, __m256i *in, int size) { + uint64_t *A = (uint64_t *) in; + uint64_t *B = (uint64_t *) out; + + B[0] = A[0]; + + for (int32_t i = 1 ; i < 2 * (size << 2) ; i++) { + B[i] = B[i - 1] ^ A[i]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) using TOOM3Mult + * + * This function computes A(x)*B(x) using TOOM-COOK3 Multiplication + * last multiplication are done using Karatsuba + * @param[out] Out Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +static void TOOM3Mult(uint64_t *Out, const uint64_t *A, const uint64_t *B) { + static __m256i U0[T_TM3_3W_256], V0[T_TM3_3W_256], U1[T_TM3_3W_256], V1[T_TM3_3W_256], U2[T_TM3_3W_256], V2[T_TM3_3W_256]; + static __m256i W0[2 * (T_TM3_3W_256)], W1[2 * (T_TM3_3W_256)], W2[2 * (T_TM3_3W_256)], W3[2 * (T_TM3_3W_256)], W4[2 * (T_TM3_3W_256)]; + static __m256i tmp[2 * (T_TM3_3W_256)]; + static __m256i ro256[6 * (T_TM3_3W_256)]; + const __m256i zero = (__m256i) { + 0ul, 0ul, 0ul, 0ul + }; + int32_t T2 = T_TM3_3W_64 << 1; + + for (int32_t i = 0 ; i < T_TM3_3W_256 - 1 ; i++) { + int32_t i4 = i << 2; + int32_t i42 = i4 - 2; + U0[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4])); + V0[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4])); + U1[i] = _mm256_lddqu_si256((__m256i const *)(& A[i42 + T_TM3_3W_64])); + V1[i] = _mm256_lddqu_si256((__m256i const *)(& B[i42 + T_TM3_3W_64])); + U2[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4 + T2 - 4])); + V2[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4 + T2 - 4])); + } + + for (int32_t i = T_TM3_3W_256 - 1 ; i < T_TM3_3W_256 ; i++) { + int32_t i4 = i << 2; + int32_t i41 = i4 + 1; + U0[i] = (__m256i) { + A[i4], A[i41], 0x0ul, 0x0ul + }; + V0[i] = (__m256i) { + B[i4], B[i41], 0x0ul, 0x0ul + }; + U1[i] = (__m256i) { + A[i4 + T_TM3_3W_64 - 2], A[i41 + T_TM3_3W_64 - 2], 0x0ul, 0x0ul + }; + V1[i] = (__m256i) { + B[i4 + T_TM3_3W_64 - 2], B[i41 + T_TM3_3W_64 - 2], 0x0ul, 0x0ul + }; + U2[i] = (__m256i) { + A[i4 - 4 + T2], A[i4 - 3 + T2], 0x0ul, 0x0ul + }; + V2[i] = (__m256i) { + B[i4 - 4 + T2], B[i4 - 3 + T2], 0x0ul, 0x0ul + }; + } + + // Evaluation phase : x= X^64 + // P(X): P0=(0); P1=(1); P2=(x); P3=(1+x); P4=(\infty) + // Evaluation: 5*2 add, 2*2 shift; 5 mul (n) + //W3 = U2 + U1 + U0 ; W2 = V2 + V1 + V0 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W3[i] = U0[i] ^ U1[i] ^ U2[i]; + W2[i] = V0[i] ^ V1[i] ^ V2[i]; + } + + //W1 = W2 * W3 + karat_mult_32( W1, W2, W3); + + //W0 =(U1 + U2*x)*x ; W4 =(V1 + V2*x)*x (SIZE = T_TM3_3W_256 !) + int64_t *U1_64 = ((int64_t *) U1); + int64_t *U2_64 = ((int64_t *) U2); + + int64_t *V1_64 = ((int64_t *) V1); + int64_t *V2_64 = ((int64_t *) V2); + + W0[0] = _mm256_set_epi64x(U1_64[2] ^ U2_64[1], U1_64[1] ^ U2_64[0], U1_64[0], 0); + W4[0] = _mm256_set_epi64x(V1_64[2] ^ V2_64[1], V1_64[1] ^ V2_64[0], V1_64[0], 0); + + U1_64 = ((int64_t *) U1); + U2_64 = ((int64_t *) U2); + + V1_64 = ((int64_t *) V1); + V2_64 = ((int64_t *) V2); + + for (int32_t i = 1 ; i < T_TM3_3W_256 ; i++) { + int i4 = i << 2; + W0[i] = _mm256_lddqu_si256((__m256i const *)(& U1_64[i4 - 1])); + W0[i] ^= _mm256_lddqu_si256((__m256i const *)(& U2_64[i4 - 2])); + + W4[i] = _mm256_lddqu_si256((__m256i const *)(& V1_64[i4 - 1])); + W4[i] ^= _mm256_lddqu_si256((__m256i const *)(& V2_64[i4 - 2])); + } + + //W3 = W3 + W0 ; W2 = W2 + W4 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W3[i] ^= W0[i]; + W2[i] ^= W4[i]; + } + + //W0 = W0 + U0 ; W4 = W4 + V0 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W0[i] ^= U0[i]; + W4[i] ^= V0[i]; + } + + //W3 = W3 * W2 ; W2 = W0 * W4 + karat_mult_32(tmp, W3, W2); + + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W3[i] = tmp[i]; + } + + karat_mult_32(W2, W0, W4); + //W4 = U2 * V2 ; W0 = U0 * V0 + karat_mult_32(W4, U2, V2); + karat_mult_32(W0, U0, V0); + + // Interpolation phase + // 9 add, 1 shift, 1 Smul, 2 Sdiv (2n) + //W3 = W3 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W3[i] ^= W2[i]; + } + + //W1 = W1 + W0 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W1[i] ^= W0[i]; + } + + //W2 =(W2 + W0)/x -> x = X^64 + U1_64 = ((int64_t *) W2); + U2_64 = ((int64_t *) W0); + for (int32_t i = 0 ; i < (T_TM3_3W_256 << 1) ; i++) { + int32_t i4 = i << 2; + W2[i] = _mm256_lddqu_si256((__m256i const *)(& U1_64[i4 + 1])); + W2[i] ^= _mm256_lddqu_si256((__m256i const *)(& U2_64[i4 + 1])); + } + + //W2 =(W2 + W3 + W4*(x^3+1))/(x+1) + U1_64 = ((int64_t *) W4); + __m256i *U1_256 = (__m256i *) (U1_64 + 1); + tmp[0] = W2[0] ^ W3[0] ^ W4[0] ^ (__m256i) { + 0x0ul, 0x0ul, 0x0ul, U1_64[0] + }; + + for (int32_t i = 1 ; i < (T_TM3_3W_256 << 1) - 1 ; i++) { + tmp[i] = W2[i] ^ W3[i] ^ W4[i] ^ _mm256_lddqu_si256(&U1_256[i - 1]); + } + + divByXplus1(W2, tmp, T_TM3_3W_256); + W2[2 * (T_TM3_3W_256) - 1] = zero; + + //W3 =(W3 + W1)/(x*(x+1)) + U1_64 = (int64_t *) W3; + U1_256 = (__m256i *) (U1_64 + 1); + + U2_64 = (int64_t *) W1; + __m256i *U2_256 = (__m256i *) (U2_64 + 1); + + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) - 1 ; i++) { + tmp[i] = _mm256_lddqu_si256(&U1_256[i]) ^ _mm256_lddqu_si256(&U2_256[i]); + } + + divByXplus1(W3, tmp, T_TM3_3W_256); + W3[2 * (T_TM3_3W_256) - 1] = zero; + + //W1 = W1 + W4 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W1[i] ^= W2[i] ^ W4[i]; + } + + //W2 = W2 + W3 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W2[i] ^= W3[i]; + } + + // Recomposition + //W = W0+ W1*x+ W2*x^2+ W3*x^3 + W4*x^4 + //W0, W1, W4 of size 2*T_TM3_3W_256, W2 and W3 of size 2*(T_TM3_3W_256) + for (int32_t i = 0 ; i < (T_TM3_3W_256 << 1) - 1 ; i++) { + ro256[i] = W0[i]; + ro256[i + 2 * T_TM3_3W_256 - 1] = W2[i]; + ro256[i + 4 * T_TM3_3W_256 - 2] = W4[i]; + } + + ro256[(T_TM3_3W_256 << 1) - 1] = W0[(T_TM3_3W_256 << 1) - 1] ^ W2[0]; + ro256[(T_TM3_3W_256 << 2) - 2] = W2[(T_TM3_3W_256 << 1) - 1] ^ W4[0]; + ro256[(T_TM3_3W_256 * 6) - 3] = W4[(T_TM3_3W_256 << 1) - 1]; + + U1_64 = ((int64_t *) &ro256[T_TM3_3W_256]); + U1_256 = (__m256i *) (U1_64 - 2); + + U2_64 = ((int64_t *) &ro256[3 * T_TM3_3W_256 - 1]); + U2_256 = (__m256i *) (U2_64 - 2); + + for (int32_t i = 0 ; i < T_TM3_3W_256 << 1 ; i++) { + _mm256_storeu_si256(&U1_256[i], W1[i] ^ _mm256_lddqu_si256(&U1_256[i])); + _mm256_storeu_si256(&U2_256[i], W3[i] ^ _mm256_loadu_si256(&U2_256[i])); + } + + for (int32_t i = 0 ; i < 6 * T_TM3_3W_256 - 2 ; i++) { + uint64_t *out64 = Out + (i << 2); + _mm256_storeu_si256((__m256i *)out64, ro256[i]); + } +} + + + +/** + * @brief Compute B(x) = A(x)/(x+1) + * + * This function computes A(x)/(x+1) using a Quercia like algorithm + * @param[out] out Pointer to the result + * @param[in] in Pointer to the polynomial A(x) + * @param[in] size used to define the number of coeeficients of A + */ +static inline void divByXplus1_256(__m256i *out, __m256i *in, int32_t size) { + out[0] = in[0]; + for (int32_t i = 1 ; i < 2 * (size + 2) ; i++) { + out[i] = out[i - 1] ^ in[i]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) using TOOM3Mult with recursive call + * + * This function computes A(x)*B(x) using recursive TOOM-COOK3 Multiplication + * @param[out] Out Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +static void TOOM3RecMult(uint64_t *Out, const uint64_t *A, const uint64_t *B) { + __m256i U0[T_TM3R_3W_256 + 2], V0[T_TM3R_3W_256 + 2], U1[T_TM3R_3W_256 + 2], V1[T_TM3R_3W_256 + 2], U2[T_TM3R_3W_256 + 2], V2[T_TM3R_3W_256 + 2]; + __m256i W0[2 * (T_TM3R_3W_256 + 2)], W1[2 * (T_TM3R_3W_256 + 2)], W2[2 * (T_TM3R_3W_256 + 2)], W3[2 * (T_TM3R_3W_256 + 2)], W4[2 * (T_TM3R_3W_256 + 2)]; + __m256i tmp[2 * (T_TM3R_3W_256 + 2) + 3]; + __m256i ro256[tTM3R / 2]; + const __m256i zero = (__m256i) { + 0ul, 0ul, 0ul, 0ul + }; + int32_t T2 = T_TM3R_3W_64 << 1; + + for (int32_t i = 0 ; i < T_TM3R_3W_256 ; i++) { + int32_t i4 = i << 2; + U0[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4])); + V0[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4])); + U1[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4 + T_TM3R_3W_64])); + V1[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4 + T_TM3R_3W_64])); + U2[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4 + T2])); + V2[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4 + T2])); + } + + for (int32_t i = T_TM3R_3W_256 ; i < T_TM3R_3W_256 + 2 ; i++) { + U0[i] = zero; + V0[i] = zero; + U1[i] = zero; + V1[i] = zero; + U2[i] = zero; + V2[i] = zero; + } + + // Evaluation phase : x= X^256 + // P(X): P0=(0); P1=(1); P2=(x); P3=(1+x); P4=(\infty) + // Evaluation: 5*2 add, 2*2 shift; 5 mul (n) + //W3 = U2 + U1 + U0 ; W2 = V2 + V1 + V0 + + for (int32_t i = 0 ; i < T_TM3R_3W_256 ; i++) { + W3[i] = U0[i] ^ U1[i] ^ U2[i]; + W2[i] = V0[i] ^ V1[i] ^ V2[i]; + } + + for (int32_t i = T_TM3R_3W_256 ; i < T_TM3R_3W_256 + 2 ; i++) { + W2[i] = zero; + W3[i] = zero; + } + + //W1 = W2 * W3 + TOOM3Mult((uint64_t *) W1, (uint64_t *) W2, (uint64_t *) W3); + //W0 =(U1 + U2*x)*x ; W4 =(V1 + V2*x)*x (SIZE = T_TM3_3W_256 + 2 !) + W0[0] = zero; + W4[0] = zero; + W0[1] = U1[0]; + W4[1] = V1[0]; + + for (int32_t i = 1 ; i < T_TM3R_3W_256 + 1 ; i++) { + W0[i + 1] = U1[i] ^ U2[i - 1]; + W4[i + 1] = V1[i] ^ V2[i - 1]; + } + + W0[T_TM3R_3W_256 + 1] = U2[T_TM3R_3W_256 - 1]; + W4[T_TM3R_3W_256 + 1] = V2[T_TM3R_3W_256 - 1]; + + //W3 = W3 + W0 ; W2 = W2 + W4 + for (int32_t i = 0 ; i < T_TM3R_3W_256 + 2 ; i++) { + W3[i] ^= W0[i]; + W2[i] ^= W4[i]; + } + + //W0 = W0 + U0 ; W4 = W4 + V0 + for (int32_t i = 0 ; i < T_TM3R_3W_256 + 2 ; i++) { + W0[i] ^= U0[i]; + W4[i] ^= V0[i]; + } + + //W3 = W3 * W2 ; W2 = W0 * W4 + TOOM3Mult((uint64_t *) tmp, (uint64_t *) W3, (uint64_t *) W2); + + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) ; i++) { + W3[i] = tmp[i]; + } + + TOOM3Mult((uint64_t *) W2, (uint64_t *) W0, (uint64_t *) W4); + + //W4 = U2 * V2 ; W0 = U0 * V0 + TOOM3Mult((uint64_t *) W4, (uint64_t *) U2, (uint64_t *) V2); + TOOM3Mult((uint64_t *) W0, (uint64_t *) U0, (uint64_t *) V0); + + //Interpolation phase + //9 add, 1 shift, 1 Smul, 2 Sdiv (2n) + + //W3 = W3 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) ; i++) { + W3[i] ^= W2[i]; + } + + //W1 = W1 + W0 + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256) ; i++) { + W1[i] ^= W0[i]; + } + + //W2 =(W2 + W0)/x + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) - 1 ; i++) { + int32_t i1 = i + 1; + W2[i] = W2[i1] ^ W0[i1]; + } + + W2[2 * (T_TM3R_3W_256 + 2) - 1] = zero; + + //W2 =(W2 + W3 + W4*(x^3+1))/(x+1) + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) ; i++) { + tmp[i] = W2[i] ^ W3[i] ^ W4[i]; + } + + tmp[2 * (T_TM3R_3W_256 + 2)] = zero; + tmp[2 * (T_TM3R_3W_256 + 2) + 1] = zero; + tmp[2 * (T_TM3R_3W_256 + 2) + 2] = zero; + + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256) ; i++) { + tmp[i + 3] ^= W4[i]; + } + + divByXplus1_256(W2, tmp, T_TM3R_3W_256); + + //W3 =(W3 + W1)/(x*(x+1)) + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) - 1 ; i++) { + int32_t i1 = i + 1; + tmp[i] = W3[i1] ^ W1[i1]; + } + + tmp[ 2 * (T_TM3R_3W_256 + 2) - 1] = zero; + divByXplus1_256(W3, tmp, T_TM3R_3W_256); + + //W1 = W1 + W4 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) ; i++) { + W1[i] ^= W2[i] ^ W4[i]; + } + //W2 = W2 + W3 + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) ; i++) { + W2[i] ^= W3[i]; + } + + // Recomposition + //W = W0+ W1*x+ W2*x^2+ W3*x^3 + W4*x^4 + //W0, W1, W4 of size 2*T_TM3_3W_256, W2 and W3 of size 2*(T_TM3_3W_256+2) + for (int32_t i = 0 ; i < T_TM3R_3W_256 ; i++) { + ro256[i] = W0[i]; + ro256[i + T_TM3R_3W_256] = W0[i + T_TM3R_3W_256] ^ W1[i]; + ro256[i + 2 * T_TM3R_3W_256] = W1[i + T_TM3R_3W_256] ^ W2[i]; + ro256[i + 3 * T_TM3R_3W_256] = W2[i + T_TM3R_3W_256] ^ W3[i]; + ro256[i + 4 * T_TM3R_3W_256] = W3[i + T_TM3R_3W_256] ^ W4[i]; + ro256[i + 5 * T_TM3R_3W_256] = W4[i + T_TM3R_3W_256]; + } + + ro256[4 * T_TM3R_3W_256] ^= W2[2 * T_TM3R_3W_256]; + ro256[5 * T_TM3R_3W_256] ^= W3[2 * T_TM3R_3W_256]; + + ro256[1 + 4 * T_TM3R_3W_256] ^= W2[1 + 2 * T_TM3R_3W_256]; + ro256[1 + 5 * T_TM3R_3W_256] ^= W3[1 + 2 * T_TM3R_3W_256]; + + ro256[2 + 4 * T_TM3R_3W_256] ^= W2[2 + 2 * T_TM3R_3W_256]; + ro256[2 + 5 * T_TM3R_3W_256] ^= W3[2 + 2 * T_TM3R_3W_256]; + + ro256[3 + 4 * T_TM3R_3W_256] ^= W2[3 + 2 * T_TM3R_3W_256]; + ro256[3 + 5 * T_TM3R_3W_256] ^= W3[3 + 2 * T_TM3R_3W_256]; + + + for (int32_t i = 0 ; i < 6 * T_TM3R_3W_256 - 2 ; i++) { + uint64_t *out64 = Out + (i << 2); + _mm256_storeu_si256((__m256i *)out64, ro256[i]); + } +} + + + +/** + * @brief Multiply two polynomials modulo \f$ X^n - 1\f$. + * + * This functions multiplies a sparse polynomial a1 (of Hamming weight equal to weight) + * and a dense polynomial a2. The multiplication is done modulo \f$ X^n - 1\f$. + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to a polynomial + * @param[in] a2 Pointer to a polynomial + */ +void PQCLEAN_HQC256_AVX2_vect_mul(uint64_t *o, const uint64_t *a1, const uint64_t *a2) { + TOOM3RecMult(a1_times_a2, a1, a2); + reduce(o, a1_times_a2); + + // clear all + memset(a1_times_a2, 0, (VEC_N_SIZE_64 << 1) * sizeof(uint64_t)); +} diff --git a/crypto_kem/hqc-256/avx2/gf2x.h b/crypto_kem/hqc-256/avx2/gf2x.h new file mode 100644 index 00000000..cbc014a3 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/gf2x.h @@ -0,0 +1,17 @@ +#ifndef GF2X_H +#define GF2X_H + + +/** + * @file gf2x.h + * @brief Header file for gf2x.c + */ + +#include + +#include + +void PQCLEAN_HQC256_AVX2_vect_mul(uint64_t *o, const uint64_t *a1, const uint64_t *a2); + + +#endif diff --git a/crypto_kem/hqc-256/avx2/hqc.c b/crypto_kem/hqc-256/avx2/hqc.c new file mode 100644 index 00000000..2c39b68e --- /dev/null +++ b/crypto_kem/hqc-256/avx2/hqc.c @@ -0,0 +1,138 @@ +#include "code.h" +#include "gf2x.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +/** + * @file hqc.c + * @brief Implementation of hqc.h + */ + + + +/** + * @brief Keygen of the HQC_PKE IND_CPA scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + */ +void PQCLEAN_HQC256_AVX2_hqc_pke_keygen(unsigned char *pk, unsigned char *sk) { + AES_XOF_struct sk_seedexpander; + AES_XOF_struct pk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + uint8_t pk_seed[SEED_BYTES] = {0}; + uint64_t x[VEC_N_256_SIZE_64] = {0}; + uint64_t y[VEC_N_256_SIZE_64] = {0}; + uint64_t h[VEC_N_256_SIZE_64] = {0}; + uint64_t s[VEC_N_256_SIZE_64] = {0}; + + // Create seed_expanders for public key and secret key + randombytes(sk_seed, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + randombytes(pk_seed, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute secret key + PQCLEAN_HQC256_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQC256_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, y, PARAM_OMEGA); + + // Compute public key + PQCLEAN_HQC256_AVX2_vect_set_random(&pk_seedexpander, h); + PQCLEAN_HQC256_AVX2_vect_mul(s, y, h); + PQCLEAN_HQC256_AVX2_vect_add(s, x, s, VEC_N_256_SIZE_64); + + // Parse keys to string + PQCLEAN_HQC256_AVX2_hqc_public_key_to_string(pk, pk_seed, s); + PQCLEAN_HQC256_AVX2_hqc_secret_key_to_string(sk, sk_seed, pk); + +} + + + +/** + * @brief Encryption of the HQC_PKE IND_CPA scheme + * + * The cihertext is composed of vectors u and v. + * + * @param[out] u Vector u (first part of the ciphertext) + * @param[out] v Vector v (second part of the ciphertext) + * @param[in] m Vector representing the message to encrypt + * @param[in] theta Seed used to derive randomness required for encryption + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC256_AVX2_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk) { + AES_XOF_struct seedexpander; + uint64_t h[VEC_N_256_SIZE_64] = {0}; + uint64_t s[VEC_N_256_SIZE_64] = {0}; + uint64_t r1[VEC_N_256_SIZE_64] = {0}; + uint64_t r2[VEC_N_256_SIZE_64] = {0}; + uint64_t e[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp1[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_256_SIZE_64] = {0}; + + // Create seed_expander from theta + seedexpander_init(&seedexpander, theta, theta + 32, SEEDEXPANDER_MAX_LENGTH); + + // Retrieve h and s from public key + PQCLEAN_HQC256_AVX2_hqc_public_key_from_string(h, s, pk); + + // Generate r1, r2 and e + PQCLEAN_HQC256_AVX2_vect_set_random_fixed_weight(&seedexpander, r1, PARAM_OMEGA_R); + PQCLEAN_HQC256_AVX2_vect_set_random_fixed_weight(&seedexpander, r2, PARAM_OMEGA_R); + PQCLEAN_HQC256_AVX2_vect_set_random_fixed_weight(&seedexpander, e, PARAM_OMEGA_E); + + // Compute u = r1 + r2.h + PQCLEAN_HQC256_AVX2_vect_mul(u, r2, h); + PQCLEAN_HQC256_AVX2_vect_add(u, r1, u, VEC_N_256_SIZE_64); + + // Compute v = m.G by encoding the message + PQCLEAN_HQC256_AVX2_code_encode(v, m); + PQCLEAN_HQC256_AVX2_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + + // Compute v = m.G + s.r2 + e + PQCLEAN_HQC256_AVX2_vect_mul(tmp2, r2, s); + PQCLEAN_HQC256_AVX2_vect_add(tmp2, e, tmp2, VEC_N_256_SIZE_64); + PQCLEAN_HQC256_AVX2_vect_add(tmp2, tmp1, tmp2, VEC_N_256_SIZE_64); + PQCLEAN_HQC256_AVX2_vect_resize(v, PARAM_N1N2, tmp2, PARAM_N); + +} + + + +/** + * @brief Decryption of the HQC_PKE IND_CPA scheme + * + * @param[out] m Vector representing the decrypted message + * @param[in] u Vector u (first part of the ciphertext) + * @param[in] v Vector v (second part of the ciphertext) + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQC256_AVX2_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk) { + uint64_t x[VEC_N_256_SIZE_64] = {0}; + uint64_t y[VEC_N_256_SIZE_64] = {0}; + uint8_t pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t tmp1[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_256_SIZE_64] = {0}; + + // Retrieve x, y, pk from secret key + PQCLEAN_HQC256_AVX2_hqc_secret_key_from_string(x, y, pk, sk); + + // Compute v - u.y + PQCLEAN_HQC256_AVX2_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + PQCLEAN_HQC256_AVX2_vect_mul(tmp2, y, u); + PQCLEAN_HQC256_AVX2_vect_add(tmp2, tmp1, tmp2, VEC_N_256_SIZE_64); + + + // Compute m by decoding v - u.y + PQCLEAN_HQC256_AVX2_code_decode(m, tmp2); +} diff --git a/crypto_kem/hqc-256/avx2/hqc.h b/crypto_kem/hqc-256/avx2/hqc.h new file mode 100644 index 00000000..b6534ecb --- /dev/null +++ b/crypto_kem/hqc-256/avx2/hqc.h @@ -0,0 +1,21 @@ +#ifndef HQC_H +#define HQC_H + + +/** + * @file hqc.h + * @brief Functions of the HQC_PKE IND_CPA scheme + */ + +#include + +#include + +void PQCLEAN_HQC256_AVX2_hqc_pke_keygen(unsigned char *pk, unsigned char *sk); + +void PQCLEAN_HQC256_AVX2_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk); + +void PQCLEAN_HQC256_AVX2_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-256/avx2/kem.c b/crypto_kem/hqc-256/avx2/kem.c new file mode 100644 index 00000000..85b85276 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/kem.c @@ -0,0 +1,138 @@ +#include "api.h" +#include "fips202.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "sha2.h" +#include "vector.h" +#include +#include +/** + * @file kem.c + * @brief Implementation of api.h + */ + + + +/** + * @brief Keygen of the HQC_KEM IND_CAA2 scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + * @returns 0 if keygen is successful + */ +int PQCLEAN_HQC256_AVX2_crypto_kem_keypair(unsigned char *pk, unsigned char *sk) { + + PQCLEAN_HQC256_AVX2_hqc_pke_keygen(pk, sk); + return 0; +} + + + +/** + * @brief Encapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ct String containing the ciphertext + * @param[out] ss String containing the shared secret + * @param[in] pk String containing the public key + * @returns 0 if encapsulation is successful + */ +int PQCLEAN_HQC256_AVX2_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk) { + + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint64_t u[VEC_N_256_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Computing m + PQCLEAN_HQC256_AVX2_vect_set_random_from_randombytes(m); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m + PQCLEAN_HQC256_AVX2_hqc_pke_encrypt(u, v, m, theta, pk); + + // Computing d + sha512(d, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Computing ciphertext + PQCLEAN_HQC256_AVX2_hqc_ciphertext_to_string(ct, u, v, d); + + + return 0; +} + + + +/** + * @brief Decapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ss String containing the shared secret + * @param[in] ct String containing the cipĥertext + * @param[in] sk String containing the secret key + * @returns 0 if decapsulation is successful, -1 otherwise + */ +int PQCLEAN_HQC256_AVX2_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk) { + + int8_t result = -1; + uint64_t u[VEC_N_256_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t u2[VEC_N_256_SIZE_64] = {0}; + uint64_t v2[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d2[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Retrieving u, v and d from ciphertext + PQCLEAN_HQC256_AVX2_hqc_ciphertext_from_string(u, v, d, ct); + + // Retrieving pk from sk + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); + + // Decryting + PQCLEAN_HQC256_AVX2_hqc_pke_decrypt(m, u, v, sk); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m' + PQCLEAN_HQC256_AVX2_hqc_pke_encrypt(u2, v2, m, theta, pk); + + // Computing d' + sha512(d2, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Abort if c != c' or d != d' + result = (PQCLEAN_HQC256_AVX2_vect_compare(u, u2, VEC_N_SIZE_BYTES) == 0 && PQCLEAN_HQC256_AVX2_vect_compare(v, v2, VEC_N1N2_SIZE_BYTES) == 0 && PQCLEAN_HQC256_AVX2_vect_compare((uint64_t *)d, (uint64_t *)d2, SHA512_BYTES) == 0); + for (size_t i = 0 ; i < SHARED_SECRET_BYTES ; i++) { + ss[i] = result * ss[i]; + } + result--; + + + return result; +} diff --git a/crypto_kem/hqc-256/avx2/parameters.h b/crypto_kem/hqc-256/avx2/parameters.h new file mode 100644 index 00000000..ce4398e2 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/parameters.h @@ -0,0 +1,130 @@ +#ifndef HQC_PARAMETERS_H +#define HQC_PARAMETERS_H +/** + * @file parameters.h + * @brief Parameters of the HQC_KEM IND-CCA2 scheme + */ + +#include "api.h" +#include "api.h" +#include "vector.h" + + +#define CEIL_DIVIDE(a, b) (((a)/(b)) + ((a) % (b) == 0 ? 0 : 1)) /*!< Divide a by b and ceil the result*/ +#define BITMASK(a, size) ((1UL << ((a) % (size))) - 1) /*!< Create a mask*/ + +/* + #define PARAM_N Define the parameter n of the scheme + #define PARAM_N1 Define the parameter n1 of the scheme (length of BCH code) + #define PARAM_N2 Define the parameter n2 of the scheme (length of the repetition code) + #define PARAM_N1N2 Define the parameter n1 * n2 of the scheme (length of the tensor code) + #define PARAM_OMEGA Define the parameter omega of the scheme + #define PARAM_OMEGA_E Define the parameter omega_e of the scheme + #define PARAM_OMEGA_R Define the parameter omega_r of the scheme + #define PARAM_SECURITY Define the security level corresponding to the chosen parameters + #define PARAM_DFR_EXP Define the decryption failure rate corresponding to the chosen parameters + + #define SECRET_KEY_BYTES Define the size of the secret key in bytes + #define PUBLIC_KEY_BYTES Define the size of the public key in bytes + #define SHARED_SECRET_BYTES Define the size of the shared secret in bytes + #define CIPHERTEXT_BYTES Define the size of the ciphertext in bytes + + #define UTILS_REJECTION_THRESHOLD Define the rejection threshold used to generate given weight vectors (see vector_set_random_fixed_weight function) + #define VEC_N_SIZE_BYTES Define the size of the array used to store a PARAM_N sized vector in bytes + #define VEC_K_SIZE_BYTES Define the size of the array used to store a PARAM_K sized vector in bytes + #define VEC_N1_SIZE_BYTES Define the size of the array used to store a PARAM_N1 sized vector in bytes + #define VEC_N1N2_SIZE_BYTES Define the size of the array used to store a PARAM_N1N2 sized vector in bytes + + #define VEC_N_SIZE_64 Define the size of the array used to store a PARAM_N sized vector in 64 bits + #define VEC_K_SIZE_64 Define the size of the array used to store a PARAM_K sized vector in 64 bits + #define VEC_N1_SIZE_64 Define the size of the array used to store a PARAM_N1 sized vector in 64 bits + #define VEC_N1N2_SIZE_64 Define the size of the array used to store a PARAM_N1N2 sized vector in 64 bits + + #define VEC_N_256_SIZE_64 Define the size of the array of 64 bits elements used to store an array of size PARAM_N considered as elements of 256 bits + #define VEC_N1N2_256_SIZE_64 Define the size of the array of 64 bits elements used to store an array of size PARAM_N1N2 considered as elements of 256 bits + + #define PARAM_T Define a threshold for decoding repetition code word (PARAM_T = (PARAM_N2 - 1) / 2) + + #define PARAM_DELTA Define the parameter delta of the scheme (correcting capacity of the BCH code) + #define PARAM_M Define a positive integer + #define PARAM_GF_POLY Generator polynomial of galois field GF(2^PARAM_M), represented in hexadecimial form + #define PARAM_GF_MUL_ORDER Define the size of the multiplicative group of GF(2^PARAM_M), i.e 2^PARAM_M -1 + #define PARAM_K Define the size of the information bits of the BCH code + #define PARAM_G Define the size of the generator polynomial of BCH code + #define PARAM_FFT The additive FFT takes a 2^PARAM_FFT polynomial as input + We use the FFT to compute the roots of sigma, whose degree if PARAM_DELTA=60 + The smallest power of 2 greater than 60+1 is 64=2^6 + #define PARAM_BCH_POLY Generator polynomial of the BCH code + + #define RED_MASK A mask fot the higher bits of a vector + #define SHA512_BYTES Define the size of SHA512 output in bytes + #define SEED_BYTES Define the size of the seed in bytes + #define SEEDEXPANDER_MAX_LENGTH Define the seed expander max length +*/ + +#define PARAM_N 69259 +#define PARAM_N1 796 +#define PARAM_N2 87 +#define PARAM_N1N2 69252 +#define PARAM_OMEGA 133 +#define PARAM_OMEGA_E 153 +#define PARAM_OMEGA_R 153 +#define PARAM_SECURITY 256 +#define PARAM_DFR_EXP 256 + +#define SECRET_KEY_BYTES PQCLEAN_HQC256_AVX2_CRYPTO_SECRETKEYBYTES +#define PUBLIC_KEY_BYTES PQCLEAN_HQC256_AVX2_CRYPTO_PUBLICKEYBYTES +#define SHARED_SECRET_BYTES PQCLEAN_HQC256_AVX2_CRYPTO_BYTES +#define CIPHERTEXT_BYTES PQCLEAN_HQC256_AVX2_CRYPTO_CIPHERTEXTBYTES + +#define UTILS_REJECTION_THRESHOLD 16760678 +#define VEC_K_SIZE_BYTES CEIL_DIVIDE(PARAM_K, 8) +#define VEC_N_SIZE_BYTES CEIL_DIVIDE(PARAM_N, 8) +#define VEC_N1_SIZE_BYTES CEIL_DIVIDE(PARAM_N1, 8) +#define VEC_N1N2_SIZE_BYTES CEIL_DIVIDE(PARAM_N1N2, 8) + +#define VEC_N_SIZE_64 CEIL_DIVIDE(PARAM_N, 64) +#define VEC_K_SIZE_64 CEIL_DIVIDE(PARAM_K, 64) +#define VEC_N1_SIZE_64 CEIL_DIVIDE(PARAM_N1, 64) +#define VEC_N1N2_SIZE_64 CEIL_DIVIDE(PARAM_N1N2, 64) + +#define PARAM_N_MULT 71424 +#define VEC_N_256_SIZE_64 (CEIL_DIVIDE(PARAM_N_MULT, 256) << 2) +#define VEC_N1N2_256_SIZE_64 (CEIL_DIVIDE(PARAM_N1N2, 256) << 2) + +#define PARAM_T 43 + +#define PARAM_DELTA 60 +#define PARAM_M 10 +#define PARAM_GF_POLY 0x409 +#define PARAM_GF_MUL_ORDER 1023 +#define PARAM_K 256 +#define PARAM_G 541 +#define PARAM_FFT 6 +#define PARAM_FFT_T 7 +#define PARAM_BCH_POLY { \ + 1,1,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0, \ + 1,0,0,1,0,1,1,0,1,0,0,1,1,1,0,0,1,1,1,0,0,0,1,0,1,0,1,0,1,1,0,0, \ + 1,0,1,0,0,1,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0, \ + 0,1,0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,0,1,1,1,1,0,1,0,0,1,1,1,1,0,1, \ + 0,0,0,1,0,0,1,1,1,1,1,0,1,0,0,0,1,0,1,1,0,0,0,1,0,1,0,0,1,0,0,0, \ + 1,1,0,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,1,0,1,0,0,1,0,0,1,1,0,1,0, \ + 0,0,0,1,1,0,0,0,0,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1, \ + 1,0,1,1,0,0,0,1,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,1,0, \ + 0,0,1,1,0,0,1,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,1,1,0,0,1,0,1,1, \ + 1,1,1,1,0,1,1,1,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,1,0,1,1,1,0,1,0,1, \ + 0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,1,0,1,1,0,0,0,1,0,1,1,0,0,0, \ + 1,0,0,1,0,0,1,1,0,0,1,0,1,0,0,1,1,1,1,0,0,1,1,0,0,1,1,0,1,0,1,1, \ + 0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,1,1,1, \ + 0,1,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,0,0,1,0,0,1,1,0,0, \ + 0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,1,0,0,0,0,1,0,1,1, \ + 1,1,0,0,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,1,0,0, \ + 1,0,1,1,0,0,0,0,0,1,1,1,1,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1 \ + }; + +#define RED_MASK 0x00000000000007ffUL +#define SHA512_BYTES 64 +#define SEED_BYTES 40 +#define SEEDEXPANDER_MAX_LENGTH 4294967295 + +#endif diff --git a/crypto_kem/hqc-256/avx2/parsing.c b/crypto_kem/hqc-256/avx2/parsing.c new file mode 100644 index 00000000..0ecd1562 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/parsing.c @@ -0,0 +1,121 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file parsing.c + * @brief Functions to parse secret key, public key and ciphertext of the HQC scheme + */ + + + +/** + * @brief Parse a secret key into a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] sk String containing the secret key + * @param[in] sk_seed Seed used to generate the secret key + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC256_AVX2_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk) { + memcpy(sk, sk_seed, SEED_BYTES); + memcpy(sk + SEED_BYTES, pk, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a secret key from a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] x uint64_t representation of vector x + * @param[out] y uint64_t representation of vector y + * @param[out] pk String containing the public key + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQC256_AVX2_hqc_secret_key_from_string(uint64_t *x, uint64_t *y, uint8_t *pk, const uint8_t *sk) { + AES_XOF_struct sk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + + memcpy(sk_seed, sk, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + PQCLEAN_HQC256_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQC256_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, y, PARAM_OMEGA); + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a public key into a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] pk String containing the public key + * @param[in] pk_seed Seed used to generate the public key + * @param[in] s uint8_t representation of vector s + */ +void PQCLEAN_HQC256_AVX2_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s) { + memcpy(pk, pk_seed, SEED_BYTES); + memcpy(pk + SEED_BYTES, s, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Parse a public key from a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] h uint8_t representation of vector h + * @param[out] s uint8_t representation of vector s + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC256_AVX2_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk) { + AES_XOF_struct pk_seedexpander; + uint8_t pk_seed[SEED_BYTES] = {0}; + + memcpy(pk_seed, pk, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + PQCLEAN_HQC256_AVX2_vect_set_random(&pk_seedexpander, h); + + memcpy(s, pk + SEED_BYTES, VEC_N_SIZE_BYTES); +} + + +/** + * @brief Parse a ciphertext into a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] ct String containing the ciphertext + * @param[in] u uint8_t representation of vector u + * @param[in] v uint8_t representation of vector v + * @param[in] d String containing the hash d + */ +void PQCLEAN_HQC256_AVX2_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d) { + memcpy(ct, u, VEC_N_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, d, SHA512_BYTES); +} + + +/** + * @brief Parse a ciphertext from a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] u uint8_t representation of vector u + * @param[out] v uint8_t representation of vector v + * @param[out] d String containing the hash d + * @param[in] ct String containing the ciphertext + */ +void PQCLEAN_HQC256_AVX2_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct) { + memcpy(u, ct, VEC_N_SIZE_BYTES); + memcpy(v, ct + VEC_N_SIZE_BYTES, VEC_N1N2_SIZE_BYTES); + memcpy(d, ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, SHA512_BYTES); +} diff --git a/crypto_kem/hqc-256/avx2/parsing.h b/crypto_kem/hqc-256/avx2/parsing.h new file mode 100644 index 00000000..87a88e96 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/parsing.h @@ -0,0 +1,29 @@ +#ifndef PARSING_H +#define PARSING_H + + +/** + * @file parsing.h + * @brief Header file for parsing.c + */ + +#include + +#include + +void PQCLEAN_HQC256_AVX2_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk); + +void PQCLEAN_HQC256_AVX2_hqc_secret_key_from_string(uint64_t *x, uint64_t *y, uint8_t *pk, const uint8_t *sk); + + +void PQCLEAN_HQC256_AVX2_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s); + +void PQCLEAN_HQC256_AVX2_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk); + + +void PQCLEAN_HQC256_AVX2_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d); + +void PQCLEAN_HQC256_AVX2_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct); + + +#endif diff --git a/crypto_kem/hqc-256/avx2/repetition.c b/crypto_kem/hqc-256/avx2/repetition.c new file mode 100644 index 00000000..e6cd357e --- /dev/null +++ b/crypto_kem/hqc-256/avx2/repetition.c @@ -0,0 +1,42 @@ +#include "parameters.h" +#include "repetition.h" +#include +#include +#include +#include +/** + * @file repetition.c + * @brief Implementation of repetition codes + */ + + + +/** + * @brief Decoding the code words to a message using the repetition code + * + * We use a majority decoding. In fact we have that PARAM_N2 = 2 * PARAM_T + 1, thus, + * if the Hamming weight of the vector is greater than PARAM_T, the code word is decoded + * to 1 and 0 otherwise. + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQC256_AVX2_repetition_code_decode(uint64_t *m, const uint64_t *em) { + size_t t = 0, b, bn, bi, c, cn, ci; + uint64_t cx, ones; + uint64_t cy; + + for (b = 0 ; b < PARAM_N1N2 - PARAM_N2 + 1 ; b += PARAM_N2) { + bn = b >> 6; + bi = b & 63; + c = b + PARAM_N2 - 1; + cn = c >> 6; + ci = c & 63; + cx = em[cn] << (63 - ci); + int64_t verif = (cn == (bn + 1)); + cy = em[bn + 1]; + ones = _mm_popcnt_u64((em[bn] >> bi) | (cx * (1 - verif))) + _mm_popcnt_u64((1 - verif) * cy + verif * cx); + m[t >> 6] |= ((uint64_t)(ones > PARAM_T)) << (t & 63); + t++; + } +} diff --git a/crypto_kem/hqc-256/avx2/repetition.h b/crypto_kem/hqc-256/avx2/repetition.h new file mode 100644 index 00000000..fd0e6e28 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/repetition.h @@ -0,0 +1,17 @@ +#ifndef REPETITION_H +#define REPETITION_H + + +/** + * @file repetition.h + * @brief Header file for repetition.c + */ + +#include + +#include + +void PQCLEAN_HQC256_AVX2_repetition_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-256/avx2/vector.c b/crypto_kem/hqc-256/avx2/vector.c new file mode 100644 index 00000000..bc9a065d --- /dev/null +++ b/crypto_kem/hqc-256/avx2/vector.c @@ -0,0 +1,200 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +#include +/** + * @file vector.c + * @brief Implementation of vectors sampling and some utilities for the HQC scheme + */ + + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC256_AVX2_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight) { + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; + uint32_t random_data = 0; + uint32_t tmp[PARAM_OMEGA_R] = {0}; + uint8_t exist = 0; + size_t j = 0; + __m256i bit256[PARAM_OMEGA_R]; + __m256i bloc256[PARAM_OMEGA_R]; + static __m256i posCmp256 = (__m256i) { + 0UL, 1UL, 2UL, 3UL + }; +#define LOOP_SIZE CEIL_DIVIDE(PARAM_N, 256) + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (tmp[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + tmp[i] = random_data; + } + } + + for (uint32_t i = 0 ; i < weight ; i++) { + // we store the bloc number and bit position of each vb[i] + uint64_t bloc = tmp[i] >> 6; + bloc256[i] = _mm256_set1_epi64x(bloc >> 2); + uint64_t pos = (bloc & 0x3UL); + __m256i pos256 = _mm256_set1_epi64x(pos); + __m256i mask256 = _mm256_cmpeq_epi64(pos256, posCmp256); + uint64_t bit64 = 1ULL << (tmp[i] & 0x3f); + __m256i bloc256 = _mm256_set1_epi64x(bit64); + bit256[i] = bloc256 & mask256; + } + + for (uint32_t i = 0 ; i < LOOP_SIZE ; i++) { + __m256i aux = _mm256_loadu_si256(((__m256i *)v) + i); + __m256i i256 = _mm256_set1_epi64x(i); + + for (uint32_t j = 0 ; j < weight ; j++) { + __m256i mask256 = _mm256_cmpeq_epi64(bloc256[j], i256); + aux ^= bit256[j] & mask256; + } + _mm256_storeu_si256(((__m256i *)v) + i, aux); + } + +#undef LOOP_SIZE +} + + + +/** + * @brief Generates a random vector of dimension PARAM_N + * + * This function generates a random binary vector of dimension PARAM_N. It generates a random + * array of bytes using the seedexpander function, and drop the extra bits using a mask. + * + * @param[in] v Pointer to an array + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC256_AVX2_vect_set_random(AES_XOF_struct *ctx, uint64_t *v) { + uint8_t rand_bytes[VEC_N_SIZE_BYTES] = {0}; + + seedexpander(ctx, rand_bytes, VEC_N_SIZE_BYTES); + + memcpy(v, rand_bytes, VEC_N_SIZE_BYTES); + v[VEC_N_SIZE_64 - 1] &= BITMASK(PARAM_N, 64); +} + + + +/** + * @brief Generates a random vector + * + * This function generates a random binary vector. It uses the the randombytes function. + * + * @param[in] v Pointer to an array + */ +void PQCLEAN_HQC256_AVX2_vect_set_random_from_randombytes(uint64_t *v) { + uint8_t rand_bytes [VEC_K_SIZE_BYTES] = {0}; + + randombytes(rand_bytes, VEC_K_SIZE_BYTES); + memcpy(v, rand_bytes, VEC_K_SIZE_BYTES); +} + + + +/** + * @brief Adds two vectors + * + * @param[out] o Pointer to an array that is the result + * @param[in] v1 Pointer to an array that is the first vector + * @param[in] v2 Pointer to an array that is the second vector + * @param[in] size Integer that is the size of the vectors + */ +void PQCLEAN_HQC256_AVX2_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size) { + for (uint32_t i = 0 ; i < size ; ++i) { + o[i] = v1[i] ^ v2[i]; + } +} + + + +/** + * @brief Compares two vectors + * + * @param[in] v1 Pointer to an array that is first vector + * @param[in] v2 Pointer to an array that is second vector + * @param[in] size Integer that is the size of the vectors + * @returns 0 if the vectors are equals and a negative/psotive value otherwise + */ +int PQCLEAN_HQC256_AVX2_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size) { + unsigned char diff = 0; + + for (uint32_t i = 0 ; i < size ; i++) { + diff |= ((uint8_t *) v1)[i] ^ ((uint8_t *) v2)[i]; + } + return diff != 0; +} + + + +/** + * @brief Resize a vector so that it contains size_o bits + * + * @param[out] o Pointer to the output vector + * @param[in] size_o Integer that is the size of the output vector in bits + * @param[in] v Pointer to the input vector + * @param[in] size_v Integer that is the size of the input vector in bits + */ +void PQCLEAN_HQC256_AVX2_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v) { + if (size_o < size_v) { + uint64_t mask = 0x7FFFFFFFFFFFFFFF; + int8_t val = 0; + + if (size_o % 64) { + val = 64 - (size_o % 64); + } + + memcpy(o, v, VEC_N1N2_SIZE_BYTES); + + for (int8_t i = 0 ; i < val ; ++i) { + o[VEC_N1N2_SIZE_64 - 1] &= (mask >> i); + } + } else { + memcpy(o, v, CEIL_DIVIDE(size_v, 8)); + } +} diff --git a/crypto_kem/hqc-256/avx2/vector.h b/crypto_kem/hqc-256/avx2/vector.h new file mode 100644 index 00000000..8a671d09 --- /dev/null +++ b/crypto_kem/hqc-256/avx2/vector.h @@ -0,0 +1,29 @@ +#ifndef VECTOR_H +#define VECTOR_H + + +/** + * @file vector.h + * @brief Header file for vector.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQC256_AVX2_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight); + +void PQCLEAN_HQC256_AVX2_vect_set_random(AES_XOF_struct *ctx, uint64_t *v); + +void PQCLEAN_HQC256_AVX2_vect_set_random_from_randombytes(uint64_t *v); + + +void PQCLEAN_HQC256_AVX2_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size); + +int PQCLEAN_HQC256_AVX2_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size); + +void PQCLEAN_HQC256_AVX2_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v); + + +#endif diff --git a/crypto_kem/hqc-256/clean/LICENSE b/crypto_kem/hqc-256/clean/LICENSE new file mode 100644 index 00000000..d5d21fff --- /dev/null +++ b/crypto_kem/hqc-256/clean/LICENSE @@ -0,0 +1 @@ +Public Domain diff --git a/crypto_kem/hqc-256/clean/Makefile b/crypto_kem/hqc-256/clean/Makefile new file mode 100644 index 00000000..bd79b1b4 --- /dev/null +++ b/crypto_kem/hqc-256/clean/Makefile @@ -0,0 +1,19 @@ +# This Makefile can be used with GNU Make or BSD Make + +LIB=libhqc-256_clean.a +HEADERS=api.h bch.h code.h fft.h gf2x.h gf.h hqc.h parameters.h parsing.h repetition.h vector.h +OBJECTS=bch.o code.o fft.o gf2x.o gf.o hqc.o kem.o parsing.o repetition.o vector.o + +CFLAGS=-O3 -Wall -Wextra -Wpedantic -Wvla -Werror -Wredundant-decls -Wmissing-prototypes -std=c99 -I../../../common $(EXTRAFLAGS) + +all: $(LIB) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +$(LIB): $(OBJECTS) + $(AR) -r $@ $(OBJECTS) + +clean: + $(RM) $(OBJECTS) + $(RM) $(LIB) diff --git a/crypto_kem/hqc-256/clean/Makefile.Microsoft_nmake b/crypto_kem/hqc-256/clean/Makefile.Microsoft_nmake new file mode 100644 index 00000000..adb4585b --- /dev/null +++ b/crypto_kem/hqc-256/clean/Makefile.Microsoft_nmake @@ -0,0 +1,19 @@ +# This Makefile can be used with Microsoft Visual Studio's nmake using the command: +# nmake /f Makefile.Microsoft_nmake + +LIBRARY=libhqc-256_clean.lib +OBJECTS=bch.obj code.obj fft.obj gf2x.obj gf.obj hqc.obj kem.obj parsing.obj repetition.obj vector.obj + +CFLAGS=/nologo /O2 /I ..\..\..\common /W4 /WX + +all: $(LIBRARY) + +# Make sure objects are recompiled if headers change. +$(OBJECTS): *.h + +$(LIBRARY): $(OBJECTS) + LIB.EXE /NOLOGO /WX /OUT:$@ $** + +clean: + -DEL $(OBJECTS) + -DEL $(LIBRARY) diff --git a/crypto_kem/hqc-256/clean/api.h b/crypto_kem/hqc-256/clean/api.h new file mode 100644 index 00000000..55e79b54 --- /dev/null +++ b/crypto_kem/hqc-256/clean/api.h @@ -0,0 +1,25 @@ +#ifndef PQCLEAN_HQC256_CLEAN_API_H +#define PQCLEAN_HQC256_CLEAN_API_H +/** + * @file api.h + * @brief NIST KEM API used by the HQC_KEM IND-CCA2 scheme + */ + +#define PQCLEAN_HQC256_CLEAN_CRYPTO_ALGNAME "HQC-256" + +#define PQCLEAN_HQC256_CLEAN_CRYPTO_SECRETKEYBYTES 8738 +#define PQCLEAN_HQC256_CLEAN_CRYPTO_PUBLICKEYBYTES 8698 +#define PQCLEAN_HQC256_CLEAN_CRYPTO_BYTES 64 +#define PQCLEAN_HQC256_CLEAN_CRYPTO_CIPHERTEXTBYTES 17379 + +// As a technicality, the public key is appended to the secret key in order to respect the NIST API. +// Without this constraint, PQCLEAN_HQC256_CLEAN_CRYPTO_SECRETKEYBYTES would be defined as 32 + +int PQCLEAN_HQC256_CLEAN_crypto_kem_keypair(unsigned char *pk, unsigned char *sk); + +int PQCLEAN_HQC256_CLEAN_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk); + +int PQCLEAN_HQC256_CLEAN_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-256/clean/bch.c b/crypto_kem/hqc-256/clean/bch.c new file mode 100644 index 00000000..8047e526 --- /dev/null +++ b/crypto_kem/hqc-256/clean/bch.c @@ -0,0 +1,383 @@ +#include "bch.h" +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include "vector.h" +#include +#include +/** + * @file bch.c + * Constant time implementation of BCH codes + */ + + +static uint16_t mod(uint16_t i, uint16_t modulus); +static void compute_cyclotomic_cosets(uint16_t *cosets, uint16_t upper_bound); +static void unpack_message(uint8_t *message_unpacked, const uint64_t *message); +static void lfsr_encode(uint8_t *codeword, const uint8_t *message); +static void pack_codeword(uint64_t *codeword, const uint8_t *codeword_unpacked); +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes); +static void message_from_codeword(uint64_t *message, const uint64_t *codeword); +static void compute_syndromes(uint16_t *syndromes, const uint64_t *vector); +static void compute_roots(uint64_t *error, const uint16_t *sigma); + +/** + * @brief Returns i modulo the given modulus. + * + * i must be less than 2*modulus. + * Therefore, the return value is either i or i-modulus. + * @returns i mod (modulus) + * @param[in] i The integer whose modulo is taken + * @param[in] modulus The modulus + */ +static uint16_t mod(uint16_t i, uint16_t modulus) { + uint16_t tmp = i - modulus; + + // mask = 0xffff if(i < PARAM_GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & modulus); +} + + + +/** + * @brief Computes the odd binary cyclotomic cosets modulo 2^m-1 for integers less than upper_bound. + * + * The array cosets of size 2^m-1 is filled by placing at index i the coset representative of i. + * @param[out] cosets Array receiving the coset representatives + * @param[in] upper_bound The upper bound + */ +static void compute_cyclotomic_cosets(uint16_t *cosets, uint16_t upper_bound) { + // Compute the odd cyclotomic classes + for (uint16_t i = 1 ; i < upper_bound ; i += 2) { + if (cosets[i] == 0) { // If i does not already belong to a class + uint16_t tmp = i; + size_t j = PARAM_M; + cosets[i] = i; + while (--j) { // Complete i's class + tmp = mod(2 * tmp, PARAM_GF_MUL_ORDER); + cosets[tmp] = i; + } + } + } +} + + + +/** + * @brief Computes the generator polynomial of the primitive BCH code with given parameters. + * + * Code length is 2^m-1.
+ * Parameter t is the targeted correction capacity of the code + * and receives the real correction capacity (which is at least equal to the target).
+ * exp and log are arrays giving antilog and log of GF(2^m) elements. + * @returns the degree of the generator polynomial + * @param[out] bch_poly Array of size (m*t + 1) receiving the coefficients of the generator polynomial + * @param[in,out] t Targeted correction capacity; receives the real correction capacity + * @param[in] exp Antilog table of GF(2^m) + * @param[in] log Log table of GF(2^m) + */ +size_t PQCLEAN_HQC256_CLEAN_compute_bch_poly(uint16_t *bch_poly, size_t *t, const uint16_t *exp, const uint16_t *log) { + uint16_t cosets[PARAM_GF_MUL_ORDER]; + size_t deg_bch_poly = 0; + + memset(cosets, 0, 2 * PARAM_GF_MUL_ORDER); + compute_cyclotomic_cosets(cosets, 2 * *t); + + // Start with bch_poly(X) = 1 + bch_poly[0] = 1; + + for (uint16_t i = 1 ; i < PARAM_GF_MUL_ORDER ; ++i) { + if (cosets[i] == 0) { + continue; + } + + // Multiply bch_poly(X) by X-a^i + for (size_t j = deg_bch_poly ; j ; --j) { + int16_t mask = -((uint16_t) - bch_poly[j] >> 15); + bch_poly[j] = (mask & exp[mod(log[bch_poly[j]] + i, PARAM_GF_MUL_ORDER)]) ^ bch_poly[j - 1]; + } + bch_poly[0] = exp[mod(log[bch_poly[0]] + i, PARAM_GF_MUL_ORDER)]; + bch_poly[++deg_bch_poly] = 1; + } + + // Determine the real correction capacity + while (cosets[2 * *t + 1] != 0) { + ++*t; + } + + return deg_bch_poly; +} + + + +/** + * @brief Unpacks the message message to the array message_unpacked where each byte stores a bit of the message + * + * @param[out] message_unpacked Array of VEC_K_SIZE_BYTES bytes receiving the unpacked message + * @param[in] message Array of PARAM_K bytes storing the packed message + */ +static void unpack_message(uint8_t *message_unpacked, const uint64_t *message) { + for (size_t i = 0 ; i < (VEC_K_SIZE_64 - (PARAM_K % 64 != 0)) ; ++i) { + for (size_t j = 0 ; j < 64 ; ++j) { + message_unpacked[j + 64 * i] = (message[i] >> j) & 0x0000000000000001; + } + } + + for (int8_t j = 0 ; j < PARAM_K % 64 ; ++j) { + message_unpacked[j + 64 * (VEC_K_SIZE_64 - 1)] = (message[VEC_K_SIZE_64 - 1] >> j) & 0x0000000000000001; + } +} + + +/** + * @brief Encodes the message message to a codeword codeword using the generator polynomial bch_poly of the code + * + * @param[out] codeword Array of PARAM_N1 bytes receiving the codeword + * @param[in] message Array of PARAM_K bytes storing the message to encode + */ +static void lfsr_encode(uint8_t *codeword, const uint8_t *message) { + uint8_t gate_value = 0; + uint8_t bch_poly[PARAM_G] = PARAM_BCH_POLY; + + // Compute the Parity-check digits + for (int16_t i = PARAM_K - 1 ; i >= 0 ; --i) { + gate_value = message[i] ^ codeword[PARAM_N1 - PARAM_K - 1]; + + for (size_t j = PARAM_N1 - PARAM_K - 1 ; j ; --j) { + codeword[j] = codeword[j - 1] ^ (-gate_value & bch_poly[j]); + } + + codeword[0] = gate_value; + } + + // Add the message + memcpy(codeword + PARAM_N1 - PARAM_K, message, PARAM_K); +} + + + +/** + * @brief Packs the codeword from an array codeword_unpacked where each byte stores a bit to a compact array codeword + * + * @param[out] codeword Array of VEC_N1_SIZE_BYTES bytes receiving the packed codeword + * @param[in] codeword_unpacked Array of PARAM_N1 bytes storing the unpacked codeword + */ +static void pack_codeword(uint64_t *codeword, const uint8_t *codeword_unpacked) { + for (size_t i = 0 ; i < (VEC_N1_SIZE_64 - (PARAM_N1 % 64 != 0)) ; ++i) { + for (size_t j = 0 ; j < 64 ; ++j) { + codeword[i] |= ((uint64_t) codeword_unpacked[j + 64 * i]) << j; + } + } + + for (size_t j = 0 ; j < PARAM_N1 % 64 ; ++j) { + codeword[VEC_N1_SIZE_64 - 1] |= ((uint64_t) codeword_unpacked[j + 64 * (VEC_N1_SIZE_64 - 1)]) << j; + } +} + + +/** + * @brief Encodes a message message of PARAM_K bits to a BCH codeword codeword of PARAM_N1 bits + * + * Following @cite lin1983error (Chapter 4 - Cyclic Codes), + * We perform a systematic encoding using a linear (PARAM_N1 - PARAM_K)-stage shift register + * with feedback connections based on the generator polynomial bch_poly of the BCH code. + * + * @param[out] codeword Array of size VEC_N1_SIZE_BYTES receiving the encoded message + * @param[in] message Array of size VEC_K_SIZE_BYTES storing the message + */ +void PQCLEAN_HQC256_CLEAN_bch_code_encode(uint64_t *codeword, const uint64_t *message) { + uint8_t message_unpacked[PARAM_K]; + uint8_t codeword_unpacked[PARAM_N1] = {0}; + + unpack_message(message_unpacked, message); + lfsr_encode(codeword_unpacked, message_unpacked); + pack_codeword(codeword, codeword_unpacked); +} + + +/** + * @brief Computes the error locator polynomial (ELP) sigma + * + * This is a constant time implementation of Berlekamp's simplified algorithm (see @cite joiner1995decoding).
+ * We use the letter p for rho which is initialized at -1/2.
+ * The array X_sigma_p represents the polynomial X^(2(mu-rho))*sigma_p(X).
+ * Instead of maintaining a list of sigmas, we update in place both sigma and X_sigma_p.
+ * sigma_copy serves as a temporary save of sigma in case X_sigma_p needs to be updated.
+ * We can properly correct only if the degree of sigma does not exceed PARAM_DELTA. + * This means only the first PARAM_DELTA + 1 coefficients of sigma are of value + * and we only need to save its first PARAM_DELTA - 1 coefficients. + * + * @returns the degree of the ELP sigma + * @param[out] sigma Array of size (at least) PARAM_DELTA receiving the ELP + * @param[in] syndromes Array of size (at least) 2*PARAM_DELTA storing the syndromes + */ +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes) { + sigma[0] = 1; + size_t deg_sigma = 0; + size_t deg_sigma_p = 0; + uint16_t sigma_copy[PARAM_DELTA - 1] = {0}; + size_t deg_sigma_copy = 0; + uint16_t X_sigma_p[PARAM_DELTA + 1] = {0, 1}; + int32_t pp = -1; // 2*rho + uint16_t d_p = 1; + uint16_t d = syndromes[0]; + + for (size_t mu = 0 ; mu < PARAM_DELTA ; ++mu) { + // Save sigma in case we need it to update X_sigma_p + memcpy(sigma_copy, sigma, 2 * (PARAM_DELTA - 1)); + deg_sigma_copy = deg_sigma; + + uint16_t dd = PQCLEAN_HQC256_CLEAN_gf_mul(d, PQCLEAN_HQC256_CLEAN_gf_inverse(d_p)); // 0 if(d == 0) + for (size_t i = 1 ; (i <= 2 * mu + 1) && (i <= PARAM_DELTA) ; ++i) { + sigma[i] ^= PQCLEAN_HQC256_CLEAN_gf_mul(dd, X_sigma_p[i]); + } + + size_t deg_X = 2 * mu - pp; // 2*(mu-rho) + size_t deg_X_sigma_p = deg_X + deg_sigma_p; + + // mask1 = 0xffff if(d != 0) and 0 otherwise + int16_t mask1 = -((uint16_t) - d >> 15); + + // mask2 = 0xffff if(deg_X_sigma_p > deg_sigma) and 0 otherwise + int16_t mask2 = -((uint16_t) (deg_sigma - deg_X_sigma_p) >> 15); + + // mask12 = 0xffff if the deg_sigma increased and 0 otherwise + int16_t mask12 = mask1 & mask2; + deg_sigma = (mask12 & deg_X_sigma_p) ^ (~mask12 & deg_sigma); + + if (mu == PARAM_DELTA - 1) { + break; + } + + // Update pp, d_p and X_sigma_p if needed + pp = (mask12 & (2 * mu)) ^ (~mask12 & pp); + d_p = (mask12 & d) ^ (~mask12 & d_p); + for (size_t i = PARAM_DELTA - 1 ; i ; --i) { + X_sigma_p[i + 1] = (mask12 & sigma_copy[i - 1]) ^ (~mask12 & X_sigma_p[i - 1]); + } + X_sigma_p[1] = 0; + X_sigma_p[0] = 0; + deg_sigma_p = (mask12 & deg_sigma_copy) ^ (~mask12 & deg_sigma_p); + + // Compute the next discrepancy + d = syndromes[2 * mu + 2]; + for (size_t i = 1 ; (i <= 2 * mu + 1) && (i <= PARAM_DELTA) ; ++i) { + d ^= PQCLEAN_HQC256_CLEAN_gf_mul(sigma[i], syndromes[2 * mu + 2 - i]); + } + } + + return deg_sigma; +} + + + +/** + * @brief Retrieves the message message from the codeword codeword + * + * Since we performed a systematic encoding, the message is the last PARAM_K bits of the codeword. + * + * @param[out] message Array of size VEC_K_SIZE_BYTES receiving the message + * @param[in] codeword Array of size VEC_N1_SIZE_BYTES storing the codeword + */ +static void message_from_codeword(uint64_t *message, const uint64_t *codeword) { + int32_t val = PARAM_N1 - PARAM_K; + + uint64_t mask1 = (uint64_t) (0xffffffffffffffff << val % 64); + uint64_t mask2 = (uint64_t) (0xffffffffffffffff >> (64 - val % 64)); + size_t index = val / 64; + + for (size_t i = 0 ; i < VEC_K_SIZE_64 - 1 ; ++i) { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + uint64_t message2 = (codeword[++index] & mask2) << (64 - val % 64); + message[i] = message1 | message2; + } + + // Last byte (8-val % 8 is the number of bits given by message1) + if ((PARAM_K % 64 == 0) || (64 - val % 64 < PARAM_K % 64)) { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + uint64_t message2 = (codeword[++index] & mask2) << (64 - val % 64); + message[VEC_K_SIZE_64 - 1] = message1 | message2; + } else { + uint64_t message1 = (codeword[index] & mask1) >> val % 64; + message[VEC_K_SIZE_64 - 1] = message1; + } +} + + +/** + * @brief Computes the 2^PARAM_DELTA syndromes from the received vector vector + * + * Syndromes are the sum of powers of alpha weighted by vector's coefficients. + * To do so, we use the additive FFT transpose, which takes as input a family w of GF(2^PARAM_M) elements + * and outputs the weighted power sums of these w.
+ * Therefore, this requires twisting and applying a permutation before feeding vector to the PQCLEAN_HQC256_CLEAN_fft transpose.
+ * For more details see Berstein, Chou and Schawbe's explanations: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] syndromes Array of size 2^(PARAM_FFT_T) receiving the 2*PARAM_DELTA syndromes + * @param[in] vector Array of size VEC_N1_SIZE_BYTES storing the received word + */ +static void compute_syndromes(uint16_t *syndromes, const uint64_t *vector) { + uint16_t w[1 << PARAM_M]; + + PQCLEAN_HQC256_CLEAN_fft_t_preprocess_bch_codeword(w, vector); + PQCLEAN_HQC256_CLEAN_fft_t(syndromes, w, 2 * PARAM_DELTA); +} + + +/** + * @brief Computes the error polynomial error from the error locator polynomial sigma + * + * See function PQCLEAN_HQC256_CLEAN_fft for more details. + * + * @param[out] error Array of VEC_N1_SIZE_BYTES elements receiving the error polynomial + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + */ +static void compute_roots(uint64_t *error, const uint16_t *sigma) { + uint16_t w[1 << PARAM_M] = {0}; // w will receive the evaluation of sigma in all field elements + + PQCLEAN_HQC256_CLEAN_fft(w, sigma, PARAM_DELTA + 1); + PQCLEAN_HQC256_CLEAN_fft_retrieve_bch_error_poly(error, w); +} + + + +/** + * @brief Decodes the received word + * + * This function relies on four steps: + *
    + *
  1. The first step, done by additive FFT transpose, is the computation of the 2*PARAM_DELTA syndromes. + *
  2. The second step is the computation of the error-locator polynomial sigma. + *
  3. The third step, done by additive FFT, is finding the error-locator numbers by calculating the roots of the polynomial sigma and takings their inverses. + *
  4. The fourth step is the correction of the errors in the received polynomial. + *
+ * For a more complete picture on BCH decoding, see Shu. Lin and Daniel J. Costello in Error Control Coding: Fundamentals and Applications @cite lin1983error + * + * @param[out] message Array of size VEC_K_SIZE_BYTES receiving the decoded message + * @param[in] vector Array of size VEC_N1_SIZE_BYTES storing the received word + */ +void PQCLEAN_HQC256_CLEAN_bch_code_decode(uint64_t *message, uint64_t *vector) { + uint16_t syndromes[1 << PARAM_FFT_T] = {0}; + uint16_t sigma[1 << PARAM_FFT] = {0}; + uint64_t error[(1 << PARAM_M) / 8] = {0}; + + // Calculate the 2*PARAM_DELTA syndromes + compute_syndromes(syndromes, vector); + + // Compute the error locator polynomial sigma + // Sigma's degree is at most PARAM_DELTA but the FFT requires the extra room + compute_elp(sigma, syndromes); + + // Compute the error polynomial error + compute_roots(error, sigma); + + // Add the error polynomial to the received polynomial + PQCLEAN_HQC256_CLEAN_vect_add(vector, vector, error, VEC_N1_SIZE_64); + + // Retrieve the message from the decoded codeword + message_from_codeword(message, vector); + +} diff --git a/crypto_kem/hqc-256/clean/bch.h b/crypto_kem/hqc-256/clean/bch.h new file mode 100644 index 00000000..6ec06ba1 --- /dev/null +++ b/crypto_kem/hqc-256/clean/bch.h @@ -0,0 +1,23 @@ +#ifndef BCH_H +#define BCH_H + + +/** + * @file bch.h + * Header file of bch.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQC256_CLEAN_bch_code_encode(uint64_t *codeword, const uint64_t *message); + +void PQCLEAN_HQC256_CLEAN_bch_code_decode(uint64_t *message, uint64_t *vector); + + +size_t PQCLEAN_HQC256_CLEAN_compute_bch_poly(uint16_t *bch_poly, size_t *t, const uint16_t *exp, const uint16_t *log); + + +#endif diff --git a/crypto_kem/hqc-256/clean/code.c b/crypto_kem/hqc-256/clean/code.c new file mode 100644 index 00000000..3d5ad7e2 --- /dev/null +++ b/crypto_kem/hqc-256/clean/code.c @@ -0,0 +1,49 @@ +#include "bch.h" +#include "code.h" +#include "parameters.h" +#include "repetition.h" +#include +#include +/** + * @file code.c + * @brief Implementation of tensor code + */ + + + +/** + * + * @brief Encoding the message m to a code word em using the tensor code + * + * First we encode the message using the BCH code, then with the repetition code to obtain + * a tensor code word. + * + * @param[out] em Pointer to an array that is the tensor code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQC256_CLEAN_code_encode(uint64_t *em, const uint64_t *m) { + + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQC256_CLEAN_bch_code_encode(tmp, m); + PQCLEAN_HQC256_CLEAN_repetition_code_encode(em, tmp); + +} + + + +/** + * @brief Decoding the code word em to a message m using the tensor code + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQC256_CLEAN_code_decode(uint64_t *m, const uint64_t *em) { + + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQC256_CLEAN_repetition_code_decode(tmp, em); + PQCLEAN_HQC256_CLEAN_bch_code_decode(m, tmp); + + +} diff --git a/crypto_kem/hqc-256/clean/code.h b/crypto_kem/hqc-256/clean/code.h new file mode 100644 index 00000000..03c52aa5 --- /dev/null +++ b/crypto_kem/hqc-256/clean/code.h @@ -0,0 +1,20 @@ +#ifndef CODE_H +#define CODE_H + + +/** + * @file code.h + * Header file of code.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQC256_CLEAN_code_encode(uint64_t *em, const uint64_t *message); + +void PQCLEAN_HQC256_CLEAN_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-256/clean/fft.c b/crypto_kem/hqc-256/clean/fft.c new file mode 100644 index 00000000..60583582 --- /dev/null +++ b/crypto_kem/hqc-256/clean/fft.c @@ -0,0 +1,627 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include +#include +#include +/** + * @file fft.c + * Implementation of the additive FFT and its transpose. + * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + */ + + +static void compute_fft_betas(uint16_t *betas); +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size); +static void radix_t(uint16_t *f, const uint16_t *f0, const uint16_t *f1, uint32_t m_f); +static void fft_t_rec(uint16_t *f, const uint16_t *w, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f); +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); + + +/** + * @brief Computes the basis of betas (omitting 1) used in the additive FFT and its transpose + * + * @param[out] betas Array of size PARAM_M-1 + */ +static void compute_fft_betas(uint16_t *betas) { + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + betas[i] = 1 << (PARAM_M - 1 - i); + } +} + + + +/** + * @brief Computes the subset sums of the given set + * + * The array subset_sums is such that its ith element is + * the subset sum of the set elements given by the binary form of i. + * + * @param[out] subset_sums Array of size 2^set_size receiving the subset sums + * @param[in] set Array of set_size elements + * @param[in] set_size Size of the array set + */ +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size) { + subset_sums[0] = 0; + + for (size_t i = 0 ; i < set_size ; ++i) { + for (size_t j = 0 ; j < (1U << i) ; ++j) { + subset_sums[(1 << i) + j] = set[i] ^ subset_sums[j]; + } + } +} + + + +/** + * @brief Transpose of the linear radix conversion + * + * This is a direct transposition of the radix function + * implemented following the process of transposing a linear function as exposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f Array of size a power of 2 + * @param[in] f0 Array half the size of f + * @param[in] f1 Array half the size of f + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix_t(uint16_t *f, const uint16_t *f0, const uint16_t *f1, uint32_t m_f) { + switch (m_f) { + case 4: + f[0] = f0[0]; + f[1] = f1[0]; + f[2] = f0[1] ^ f1[0]; + f[3] = f[2] ^ f1[1]; + f[4] = f[2] ^ f0[2]; + f[5] = f[3] ^ f1[2]; + f[6] = f[4] ^ f0[3] ^ f1[2]; + f[7] = f[3] ^ f0[3] ^ f1[3]; + f[8] = f[4] ^ f0[4]; + f[9] = f[5] ^ f1[4]; + f[10] = f[6] ^ f0[5] ^ f1[4]; + f[11] = f[7] ^ f0[5] ^ f1[4] ^ f1[5]; + f[12] = f[8] ^ f0[5] ^ f0[6] ^ f1[4]; + f[13] = f[7] ^ f[9] ^ f[11] ^ f1[6]; + f[14] = f[6] ^ f0[6] ^ f0[7] ^ f1[6]; + f[15] = f[7] ^ f0[7] ^ f1[7]; + return; + + case 3: + f[0] = f0[0]; + f[1] = f1[0]; + f[2] = f0[1] ^ f1[0]; + f[3] = f[2] ^ f1[1]; + f[4] = f[2] ^ f0[2]; + f[5] = f[3] ^ f1[2]; + f[6] = f[4] ^ f0[3] ^ f1[2]; + f[7] = f[3] ^ f0[3] ^ f1[3]; + return; + + case 2: + f[0] = f0[0]; + f[1] = f1[0]; + f[2] = f0[1] ^ f1[0]; + f[3] = f[2] ^ f1[1]; + return; + + case 1: + f[0] = f0[0]; + f[1] = f1[0]; + return; + + default: + ; + + size_t n = 1 << (m_f - 2); + + uint16_t Q0[1 << (PARAM_FFT_T - 2)]; + uint16_t Q1[1 << (PARAM_FFT_T - 2)]; + uint16_t R0[1 << (PARAM_FFT_T - 2)]; + uint16_t R1[1 << (PARAM_FFT_T - 2)]; + + uint16_t Q[1 << 2 * (PARAM_FFT_T - 2)]; + uint16_t R[1 << 2 * (PARAM_FFT_T - 2)]; + + memcpy(Q0, f0 + n, 2 * n); + memcpy(Q1, f1 + n, 2 * n); + memcpy(R0, f0, 2 * n); + memcpy(R1, f1, 2 * n); + + radix_t (Q, Q0, Q1, m_f - 1); + radix_t (R, R0, R1, m_f - 1); + + memcpy(f, R, 4 * n); + memcpy(f + 2 * n, R + n, 2 * n); + memcpy(f + 3 * n, Q + n, 2 * n); + + for (size_t i = 0 ; i < n ; ++i) { + f[2 * n + i] ^= Q[i]; + f[3 * n + i] ^= f[2 * n + i]; + } + } +} + + + +/** + * @brief Recursively computes syndromes of family w + * + * This function is a subroutine of the function fft_t + * + * @param[out] f Array receiving the syndromes + * @param[in] w Array storing the family + * @param[in] f_coeffs Length of syndromes vector + * @param[in] m 2^m is the smallest power of 2 greater or equal to the length of family w + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the length of f + * @param[in] betas FFT constants + */ +static void fft_t_rec(uint16_t *f, const uint16_t *w, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + size_t k = 1 << (m - 1); + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + uint16_t gammas_sums[1 << (PARAM_M - 1)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t f0[1 << (PARAM_FFT_T - 2)] = {0}; + uint16_t f1[1 << (PARAM_FFT_T - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + f[0] = 0; + for (size_t i = 0 ; i < (1U << m) ; ++i) { + f[0] ^= w[i]; + } + f[1] = 0; + + uint16_t betas_sums[1 << (PARAM_M - 1)]; + betas_sums[0] = 0; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + size_t index = (1 << j) + k; + betas_sums[index] = betas_sums[k] ^ betas[j]; + f[1] ^= PQCLEAN_HQC256_CLEAN_gf_mul(betas_sums[index], w[index]); + } + } + + return; + } + + // Compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQC256_CLEAN_gf_mul(betas[i], PQCLEAN_HQC256_CLEAN_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQC256_CLEAN_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas subset sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + /* Step 6: Compute u and v from w (aka w) + * w[i] = u[i] + G[i].v[i] + * w[k+i] = w[i] + v[i] = u[i] + (G[i]+1).v[i] + * Transpose: + * u[i] = w[i] + w[k+i] + * v[i] = G[i].w[i] + (G[i]+1).w[k+i] = G[i].u[i] + w[k+i] */ + if (f_coeffs <= 3) { // 3-coefficient polynomial f case + // Step 5: Compute f0 from u and f1 from v + f1[1] = 0; + u[0] = w[0] ^ w[k]; + f1[0] = w[k]; + for (size_t i = 1 ; i < k ; ++i) { + u[i] = w[i] ^ w[k + i]; + f1[0] ^= PQCLEAN_HQC256_CLEAN_gf_mul(gammas_sums[i], u[i]) ^ w[k + i]; + } + fft_t_rec(f0, u, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + } else { + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + u[0] = w[0] ^ w[k]; + v[0] = w[k]; + + for (size_t i = 1 ; i < k ; ++i) { + u[i] = w[i] ^ w[k + i]; + v[i] = PQCLEAN_HQC256_CLEAN_gf_mul(gammas_sums[i], u[i]) ^ w[k + i]; + } + + // Step 5: Compute f0 from u and f1 from v + fft_t_rec(f0, u, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + fft_t_rec(f1, v, f_coeffs / 2, m - 1, m_f - 1, deltas); + } + + // Step 3: Compute g from g0 and g1 + radix_t(f, f0, f1, m_f); + + // Step 2: compute f from g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQC256_CLEAN_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQC256_CLEAN_gf_mul(beta_m_pow, f[i]); + } + } +} + + + +/** + * @brief Computes the syndromes f of the family w + * + * Since the syndromes linear map is the transpose of multipoint evaluation, + * it uses exactly the same constants, either hardcoded or precomputed by compute_fft_lut(...).
+ * This follows directives from Bernstein, Chou and Schwabe given here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f Array of size 2*(PARAM_FFT_T) elements receiving the syndromes + * @param[in] w Array of PARAM_GF_MUL_ORDER+1 elements + * @param[in] f_coeffs Length of syndromes vector f + */ +void PQCLEAN_HQC256_CLEAN_fft_t(uint16_t *f, const uint16_t *w, size_t f_coeffs) { + // Transposed from Gao and Mateer algorithm + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)] = {0}; + uint16_t v[1 << (PARAM_M - 1)] = {0}; + uint16_t deltas[PARAM_M - 1]; + uint16_t f0[1 << (PARAM_FFT_T - 1)]; + uint16_t f1[1 << (PARAM_FFT_T - 1)]; + + compute_fft_betas(betas); + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + /* Step 6: Compute u and v from w (aka w) + * + * We had: + * w[i] = u[i] + G[i].v[i] + * w[k+i] = w[i] + v[i] = u[i] + (G[i]+1).v[i] + * Transpose: + * u[i] = w[i] + w[k+i] + * v[i] = G[i].w[i] + (G[i]+1).w[k+i] = G[i].u[i] + w[k+i] */ + u[0] = w[0] ^ w[k]; + v[0] = w[k]; + for (size_t i = 1 ; i < k ; ++i) { + u[i] = w[i] ^ w[k + i]; + v[i] = PQCLEAN_HQC256_CLEAN_gf_mul(betas_sums[i], u[i]) ^ w[k + i]; + } + + // Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQC256_CLEAN_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5: Compute f0 from u and f1 from v + fft_t_rec(f0, u, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT_T - 1, deltas); + fft_t_rec(f1, v, f_coeffs / 2, PARAM_M - 1, PARAM_FFT_T - 1, deltas); + + // Step 3: Compute g from g0 and g1 + radix_t(f, f0, f1, PARAM_FFT_T); + + // Step 2: beta_m = 1 so f = g +} + + + +/** + * @brief Computes the radix conversion of a polynomial f in GF(2^m)[x] + * + * Computes f0 and f1 such that f(x) = f0(x^2-x) + x.f1(x^2-x) + * as proposed by Bernstein, Chou and Schwabe: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f0 Array half the size of f + * @param[out] f1 Array half the size of f + * @param[in] f Array of size a power of 2 + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f) { + switch (m_f) { + case 4: + f0[4] = f[8] ^ f[12]; + f0[6] = f[12] ^ f[14]; + f0[7] = f[14] ^ f[15]; + f1[5] = f[11] ^ f[13]; + f1[6] = f[13] ^ f[14]; + f1[7] = f[15]; + f0[5] = f[10] ^ f[12] ^ f1[5]; + f1[4] = f[9] ^ f[13] ^ f0[5]; + + f0[0] = f[0]; + f1[3] = f[7] ^ f[11] ^ f[15]; + f0[3] = f[6] ^ f[10] ^ f[14] ^ f1[3]; + f0[2] = f[4] ^ f0[4] ^ f0[3] ^ f1[3]; + f1[1] = f[3] ^ f[5] ^ f[9] ^ f[13] ^ f1[3]; + f1[2] = f[3] ^ f1[1] ^ f0[3]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 3: + f0[0] = f[0]; + f0[2] = f[4] ^ f[6]; + f0[3] = f[6] ^ f[7]; + f1[1] = f[3] ^ f[5] ^ f[7]; + f1[2] = f[5] ^ f[6]; + f1[3] = f[7]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 2: + f0[0] = f[0]; + f0[1] = f[2] ^ f[3]; + f1[0] = f[1] ^ f0[1]; + f1[1] = f[3]; + return; + + case 1: + f0[0] = f[0]; + f1[0] = f[1]; + return; + + default: + ; + size_t n = 1 << (m_f - 2); + + uint16_t Q[2 * (1 << (PARAM_FFT - 2))]; + uint16_t R[2 * (1 << (PARAM_FFT - 2))]; + + uint16_t Q0[1 << (PARAM_FFT - 2)]; + uint16_t Q1[1 << (PARAM_FFT - 2)]; + uint16_t R0[1 << (PARAM_FFT - 2)]; + uint16_t R1[1 << (PARAM_FFT - 2)]; + + memcpy(Q, f + 3 * n, 2 * n); + memcpy(Q + n, f + 3 * n, 2 * n); + memcpy(R, f, 4 * n); + + for (size_t i = 0 ; i < n ; ++i) { + Q[i] ^= f[2 * n + i]; + R[n + i] ^= Q[i]; + } + + radix(Q0, Q1, Q, m_f - 1); + radix(R0, R1, R, m_f - 1); + + memcpy(f0, R0, 2 * n); + memcpy(f0 + n, Q0, 2 * n); + memcpy(f1, R1, 2 * n); + memcpy(f1 + n, Q1, 2 * n); + } +} + + + +/** + * @brief Evaluates f at all subset sums of a given set + * + * This function is a subroutine of the function fft. + * + * @param[out] w Array + * @param[in] f Array + * @param[in] f_coeffs Number of coefficients of f + * @param[in] m Number of betas + * @param[in] m_f Number of coefficients of f (one more than its degree) + * @param[in] betas FFT constants + */ +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + uint16_t f0[1 << (PARAM_FFT - 2)]; + uint16_t f1[1 << (PARAM_FFT - 2)]; + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + size_t k = 1 << (m - 1); + uint16_t gammas_sums[1 << (PARAM_M - 2)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + uint16_t tmp[PARAM_M - (PARAM_FFT - 1)]; + for (size_t i = 0 ; i < m ; ++i) { + tmp[i] = PQCLEAN_HQC256_CLEAN_gf_mul(betas[i], f[1]); + } + + w[0] = f[0]; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + w[(1 << j) + k] = w[k] ^ tmp[j]; + } + } + + return; + } + + // Step 2: compute g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQC256_CLEAN_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQC256_CLEAN_gf_mul(beta_m_pow, f[i]); + } + } + + // Step 3 + radix(f0, f1, f, m_f); + + // Step 4: compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQC256_CLEAN_gf_mul(betas[i], PQCLEAN_HQC256_CLEAN_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQC256_CLEAN_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + + if (f_coeffs <= 3) { // 3-coefficient polynomial f case: f1 is constant + w[0] = u[0]; + w[k] = u[0] ^ f1[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC256_CLEAN_gf_mul(gammas_sums[i], f1[0]); + w[k + i] = w[i] ^ f1[0]; + } + } else { + fft_rec(v, f1, f_coeffs / 2, m - 1, m_f - 1, deltas); + + // Step 6 + memcpy(w + k, v, 2 * k); + w[0] = u[0]; + w[k] ^= u[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC256_CLEAN_gf_mul(gammas_sums[i], v[i]); + w[k + i] ^= w[i]; + } + } +} + + + +/** + * @brief Evaluates f on all fields elements using an additive FFT algorithm + * + * f_coeffs is the number of coefficients of f (one less than its degree).
+ * The FFT proceeds recursively to evaluate f at all subset sums of a basis B.
+ * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf
+ * Note that on this first call (as opposed to the recursive calls to fft_rec), gammas are equal to betas, + * meaning the first gammas subset sums are actually the subset sums of betas (except 1).
+ * Also note that f is altered during computation (twisted at each level). + * + * @param[out] w Array + * @param[in] f Array of 2^PARAM_FFT elements + * @param[in] f_coeffs Number coefficients of f (i.e. deg(f)+1) + */ +void PQCLEAN_HQC256_CLEAN_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs) { + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + uint16_t f0[1 << (PARAM_FFT - 1)]; + uint16_t f1[1 << (PARAM_FFT - 1)]; + uint16_t deltas[PARAM_M - 1]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)]; + uint16_t v[1 << (PARAM_M - 1)]; + + // Follows Gao and Mateer algorithm + compute_fft_betas(betas); + + // Step 1: PARAM_FFT > 1, nothing to do + + // Compute gammas sums + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + // Step 2: beta_m = 1, nothing to do + + // Step 3 + radix(f0, f1, f, PARAM_FFT); + + // Step 4: Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQC256_CLEAN_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + fft_rec(v, f1, f_coeffs / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + + // Step 6, 7 and error polynomial computation + memcpy(w + k, v, 2 * k); + + // Check if 0 is root + w[0] = u[0]; + + // Check if 1 is root + w[k] ^= u[0]; + + // Find other roots + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQC256_CLEAN_gf_mul(betas_sums[i], v[i]); + w[k + i] ^= w[i]; + } +} + + + +/** + * @brief Arranges the received word vector in a form w such that applying the additive FFT transpose to w yields the BCH syndromes of the received word vector. + * + * Since the received word vector gives coefficients of the primitive element alpha, we twist accordingly.
+ * Furthermore, the additive FFT transpose needs elements indexed by their decomposition on the chosen basis, + * so we apply the adequate permutation. + * + * @param[out] w Array of size 2^PARAM_M + * @param[in] vector Array of size VEC_N1_SIZE_BYTES + */ +void PQCLEAN_HQC256_CLEAN_fft_t_preprocess_bch_codeword(uint16_t *w, const uint64_t *vector) { + uint16_t r[1 << PARAM_M]; + uint16_t gammas[PARAM_M - 1]; + uint16_t gammas_sums[1 << (PARAM_M - 1)]; + size_t k = 1 << (PARAM_M - 1); + + // Unpack the received word vector into array r + size_t i; + for (i = 0 ; i < VEC_N1_SIZE_64 - (PARAM_N1 % 64 != 0) ; ++i) { + for (size_t j = 0 ; j < 64 ; ++j) { + r[64 * i + j] = (uint8_t) ((vector[i] >> j) & 1); + } + } + + // Last byte + for (size_t j = 0 ; j < PARAM_N1 % 64 ; ++j) { + r[64 * i + j] = (uint8_t) ((vector[i] >> j) & 1); + } + + // Complete r with zeros + memset(r + PARAM_N1, 0, 2 * ((1 << PARAM_M) - PARAM_N1)); + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + // Twist and permute r adequately to obtain w + w[0] = 0; + w[k] = -r[0] & 1; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = -r[PQCLEAN_HQC256_CLEAN_gf_log(gammas_sums[i])] & gammas_sums[i]; + w[k + i] = -r[PQCLEAN_HQC256_CLEAN_gf_log(gammas_sums[i] ^ 1)] & (gammas_sums[i] ^ 1); + } +} + + + +/** + * @brief Retrieves the error polynomial error from the evaluations w of the ELP (Error Locator Polynomial) on all field elements. + * + * @param[out] error Array of size VEC_N1_SIZE_BYTES + * @param[in] w Array of size 2^PARAM_M + */ +void PQCLEAN_HQC256_CLEAN_fft_retrieve_bch_error_poly(uint64_t *error, const uint16_t *w) { + uint16_t gammas[PARAM_M - 1]; + uint16_t gammas_sums[1 << (PARAM_M - 1)]; + size_t k = 1 << (PARAM_M - 1); + size_t index = PARAM_GF_MUL_ORDER; + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + error[0] ^= ((uint64_t) 1) ^ ((uint16_t) - w[0] >> 15); + uint64_t bit = ((uint64_t) 1) ^ ((uint16_t) - w[k] >> 15); + error[index / 8] ^= bit << (index % 64); + + for (size_t i = 1 ; i < k ; ++i) { + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQC256_CLEAN_gf_log(gammas_sums[i]); + bit = ((uint64_t) 1) ^ ((uint16_t) - w[i] >> 15); + error[index / 64] ^= bit << (index % 64); + + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQC256_CLEAN_gf_log(gammas_sums[i] ^ 1); + bit = ((uint64_t) 1) ^ ((uint16_t) - w[k + i] >> 15); + error[index / 64] ^= bit << (index % 64); + } +} diff --git a/crypto_kem/hqc-256/clean/fft.h b/crypto_kem/hqc-256/clean/fft.h new file mode 100644 index 00000000..a5f98f66 --- /dev/null +++ b/crypto_kem/hqc-256/clean/fft.h @@ -0,0 +1,25 @@ +#ifndef FFT_H +#define FFT_H + + +/** + * @file fft.h + * Header file of fft.c + */ + +#include + +#include +#include + +void PQCLEAN_HQC256_CLEAN_fft_t(uint16_t *f, const uint16_t *w, size_t f_coeffs); + +void PQCLEAN_HQC256_CLEAN_fft_t_preprocess_bch_codeword(uint16_t *w, const uint64_t *vector); + + +void PQCLEAN_HQC256_CLEAN_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs); + +void PQCLEAN_HQC256_CLEAN_fft_retrieve_bch_error_poly(uint64_t *error, const uint16_t *w); + + +#endif diff --git a/crypto_kem/hqc-256/clean/gf.c b/crypto_kem/hqc-256/clean/gf.c new file mode 100644 index 00000000..41f630a7 --- /dev/null +++ b/crypto_kem/hqc-256/clean/gf.c @@ -0,0 +1,132 @@ +#include "gf.h" +#include "parameters.h" +#include +/** + * @file gf.c + * Galois field implementation with multiplication using lookup tables + */ + + + +/** + * Powers of the root alpha of x^10 + x^3 + 1. + * The last two elements are needed by the PQCLEAN_HQC256_CLEAN_gf_mul function from gf_mul.c + * (for example if both elements to multiply are zero). + */ +static const uint16_t exp[1026] = { + 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 9, 18, 36, 72, 144, 288, 576, 137, 274, 548, 65, 130, 260, 520, 25, 50, 100, 200, 400, 800, 585, 155, 310, 620, 209, 418, 836, 641, 267, 534, 37, 74, 148, 296, 592, 169, 338, 676, 321, 642, 269, 538, 61, 122, 244, 488, 976, 937, 859, 703, 375, 750, 469, 938, 861, 691, 367, 734, 437, 874, 733, 435, 870, 709, 387, 774, 517, 3, 6, 12, 24, 48, 96, 192, 384, 768, 521, 27, 54, 108, 216, 432, 864, 713, 411, 822, 613, 195, 390, 780, 529, 43, 86, 172, 344, 688, 361, 722, 429, 858, 701, 371, 742, 453, 906, 797, 563, 111, 222, 444, 888, 761, 507, 1014, 997, 963, 911, 791, 551, 71, 142, 284, 568, 121, 242, 484, 968, 921, 827, 639, 247, 494, 988, 945, 875, 735, 439, 878, 725, 419, 838, 645, 259, 518, 5, 10, 20, 40, 80, 160, 320, 640, 265, 530, 45, 90, 180, 360, 720, 425, 850, 685, 339, 678, 325, 650, 285, 570, 125, 250, 500, 1000, 985, 955, 895, 759, 487, 974, 917, 803, 591, 151, 302, 604, 177, 354, 708, 385, 770, 525, 19, 38, 76, 152, 304, 608, 201, 402, 804, 577, 139, 278, 556, 81, 162, 324, 648, 281, 562, 109, 218, 436, 872, 729, 443, 886, 741, 451, 902, 773, 515, 15, 30, 60, 120, 240, 480, 960, 905, 795, 575, 119, 238, 476, 952, 889, 763, 511, 1022, 1013, 995, 975, 919, 807, 583, 135, 270, 540, 49, 98, 196, 392, 784, 553, 91, 182, 364, 728, 441, 882, 749, 467, 934, 837, 643, 271, 542, 53, 106, 212, 424, 848, 681, 347, 694, 357, 714, 413, 826, 637, 243, 486, 972, 913, 811, 607, 183, 366, 732, 433, 866, 717, 403, 806, 581, 131, 262, 524, 17, 34, 68, 136, 272, 544, 73, 146, 292, 584, 153, 306, 612, 193, 386, 772, 513, 11, 22, 44, 88, 176, 352, 704, 393, 786, 557, 83, 166, 332, 664, 313, 626, 237, 474, 948, 865, 715, 415, 830, 629, 227, 454, 908, 785, 555, 95, 190, 380, 760, 505, 1010, 1005, 979, 943, 855, 679, 327, 654, 277, 554, 93, 186, 372, 744, 473, 946, 877, 723, 431, 862, 693, 355, 710, 389, 778, 541, 51, 102, 204, 408, 816, 617, 219, 438, 876, 721, 427, 854, 677, 323, 646, 261, 522, 29, 58, 116, 232, 464, 928, 841, 667, 319, 638, 245, 490, 980, 929, 843, 671, 311, 622, 213, 426, 852, 673, 331, 662, 293, 586, 157, 314, 628, 225, 450, 900, 769, 523, 31, 62, 124, 248, 496, 992, 969, 923, 831, 631, 231, 462, 924, 817, 619, 223, 446, 892, 753, 491, 982, 933, 835, 655, 279, 558, 85, 170, 340, 680, 345, 690, 365, 730, 445, 890, 765, 499, 998, 965, 899, 783, 535, 39, 78, 156, 312, 624, 233, 466, 932, 833, 651, 287, 574, 117, 234, 468, 936, 857, 699, 383, 766, 501, 1002, 989, 947, 879, 727, 423, 846, 661, 291, 582, 133, 266, 532, 33, 66, 132, 264, 528, 41, 82, 164, 328, 656, 297, 594, 173, 346, 692, 353, 706, 397, 794, 573, 115, 230, 460, 920, 825, 635, 255, 510, 1020, 1009, 1003, 991, 951, 871, 711, 391, 782, 533, 35, 70, 140, 280, 560, 105, 210, 420, 840, 665, 315, 630, 229, 458, 916, 801, 587, 159, 318, 636, 241, 482, 964, 897, 779, 543, 55, 110, 220, 440, 880, 745, 475, 950, 869, 707, 399, 798, 565, 99, 198, 396, 792, 569, 123, 246, 492, 984, 953, 891, 767, 503, 1006, 981, 931, 847, 663, 295, 590, 149, 298, 596, 161, 322, 644, 257, 514, 13, 26, 52, 104, 208, 416, 832, 649, 283, 566, 101, 202, 404, 808, 601, 187, 374, 748, 465, 930, 845, 659, 303, 606, 181, 362, 724, 417, 834, 653, 275, 550, 69, 138, 276, 552, 89, 178, 356, 712, 409, 818, 621, 211, 422, 844, 657, 299, 598, 165, 330, 660, 289, 578, 141, 282, 564, 97, 194, 388, 776, 537, 59, 118, 236, 472, 944, 873, 731, 447, 894, 757, 483, 966, 901, 771, 527, 23, 46, 92, 184, 368, 736, 457, 914, 813, 595, 175, 350, 700, 369, 738, 461, 922, 829, 627, 239, 478, 956, 881, 747, 479, 958, 885, 739, 463, 926, 821, 611, 207, 414, 828, 625, 235, 470, 940, 849, 683, 351, 702, 373, 746, 477, 954, 893, 755, 495, 990, 949, 867, 719, 407, 814, 597, 163, 326, 652, 273, 546, 77, 154, 308, 616, 217, 434, 868, 705, 395, 790, 549, 67, 134, 268, 536, 57, 114, 228, 456, 912, 809, 603, 191, 382, 764, 497, 994, 973, 915, 815, 599, 167, 334, 668, 305, 610, 205, 410, 820, 609, 203, 406, 812, 593, 171, 342, 684, 337, 674, 333, 666, 317, 634, 253, 506, 1012, 993, 971, 927, 823, 615, 199, 398, 796, 561, 107, 214, 428, 856, 697, 379, 758, 485, 970, 925, 819, 623, 215, 430, 860, 689, 363, 726, 421, 842, 669, 307, 614, 197, 394, 788, 545, 75, 150, 300, 600, 185, 370, 740, 449, 898, 781, 531, 47, 94, 188, 376, 752, 489, 978, 941, 851, 687, 343, 686, 341, 682, 349, 698, 381, 762, 509, 1018, 1021, 1011, 1007, 983, 935, 839, 647, 263, 526, 21, 42, 84, 168, 336, 672, 329, 658, 301, 602, 189, 378, 756, 481, 962, 909, 787, 559, 87, 174, 348, 696, 377, 754, 493, 986, 957, 883, 751, 471, 942, 853, 675, 335, 670, 309, 618, 221, 442, 884, 737, 459, 918, 805, 579, 143, 286, 572, 113, 226, 452, 904, 793, 571, 127, 254, 508, 1016, 1017, 1019, 1023, 1015, 999, 967, 903, 775, 519, 7, 14, 28, 56, 112, 224, 448, 896, 777, 539, 63, 126, 252, 504, 1008, 1001, 987, 959, 887, 743, 455, 910, 789, 547, 79, 158, 316, 632, 249, 498, 996, 961, 907, 799, 567, 103, 206, 412, 824, 633, 251, 502, 1004, 977, 939, 863, 695, 359, 718, 405, 810, 605, 179, 358, 716, 401, 802, 589, 147, 294, 588, 145, 290, 580, 129, 258, 516, 1, 2, 4 +}; + + + +/** + * Logarithm of elements of GF(2^10) to the base alpha (root of x^10 + x^3 + 1). + * The logarithm of 0 is set to 1024 by convention. + */ +static const uint16_t log[1024] = { + 1024, 0, 1, 77, 2, 154, 78, 956, 3, 10, 155, 325, 79, 618, 957, 231, 4, 308, 11, 200, 156, 889, 326, 695, 80, 24, 619, 87, 958, 402, 232, 436, 5, 513, 309, 551, 12, 40, 201, 479, 157, 518, 890, 101, 327, 164, 696, 860, 81, 258, 25, 385, 620, 277, 88, 577, 959, 772, 403, 680, 233, 52, 437, 966, 6, 20, 514, 768, 310, 650, 552, 129, 13, 314, 41, 849, 202, 757, 480, 980, 158, 213, 519, 335, 891, 462, 102, 907, 328, 654, 165, 264, 697, 369, 861, 354, 82, 675, 259, 590, 26, 628, 386, 991, 621, 556, 278, 822, 89, 219, 578, 117, 960, 937, 773, 533, 404, 491, 681, 241, 234, 133, 53, 595, 438, 178, 967, 943, 7, 1020, 21, 305, 515, 510, 769, 255, 311, 17, 651, 210, 553, 672, 130, 934, 14, 1017, 315, 1014, 42, 610, 850, 191, 203, 318, 758, 31, 481, 428, 981, 568, 159, 613, 214, 752, 520, 667, 336, 788, 892, 45, 463, 801, 103, 525, 908, 705, 329, 194, 655, 1008, 166, 642, 265, 296, 698, 853, 370, 633, 862, 899, 355, 779, 83, 321, 676, 97, 260, 845, 591, 818, 27, 206, 629, 797, 387, 793, 992, 727, 622, 34, 557, 661, 279, 420, 823, 834, 90, 761, 220, 391, 579, 926, 118, 451, 961, 431, 938, 349, 774, 563, 534, 446, 405, 484, 492, 731, 682, 341, 242, 714, 235, 571, 134, 290, 54, 412, 596, 140, 439, 984, 179, 996, 968, 810, 944, 539, 8, 616, 1021, 152, 22, 400, 306, 887, 516, 162, 511, 38, 770, 50, 256, 275, 312, 755, 18, 648, 652, 367, 211, 460, 554, 217, 673, 626, 131, 176, 935, 489, 15, 670, 1018, 508, 316, 426, 1015, 608, 43, 523, 611, 665, 851, 897, 192, 640, 204, 791, 319, 843, 759, 924, 32, 418, 482, 339, 429, 561, 982, 808, 569, 410, 160, 48, 614, 398, 215, 174, 753, 365, 521, 895, 668, 424, 337, 806, 789, 922, 893, 804, 46, 172, 464, 872, 802, 870, 104, 466, 526, 283, 909, 874, 706, 736, 330, 528, 195, 380, 656, 285, 1009, 1003, 167, 106, 643, 838, 266, 468, 297, 66, 699, 708, 854, 111, 371, 738, 634, 60, 863, 911, 900, 827, 356, 876, 780, 497, 84, 197, 322, 74, 677, 382, 98, 548, 261, 332, 846, 765, 592, 530, 819, 587, 28, 1011, 207, 302, 630, 1005, 798, 749, 388, 658, 794, 94, 993, 287, 728, 346, 623, 645, 35, 149, 558, 840, 662, 505, 280, 169, 421, 395, 824, 108, 835, 377, 91, 299, 762, 71, 221, 68, 392, 146, 580, 268, 927, 224, 119, 470, 452, 687, 962, 856, 432, 227, 939, 113, 350, 976, 775, 701, 564, 930, 535, 710, 447, 723, 406, 636, 485, 271, 493, 62, 732, 918, 683, 373, 342, 583, 243, 740, 715, 719, 236, 902, 572, 690, 135, 829, 291, 186, 55, 865, 413, 455, 597, 913, 141, 744, 440, 782, 985, 473, 180, 499, 997, 602, 969, 358, 811, 122, 945, 878, 540, 247, 9, 324, 617, 230, 1022, 76, 153, 955, 23, 86, 401, 435, 307, 199, 888, 694, 517, 100, 163, 859, 512, 550, 39, 478, 771, 679, 51, 965, 257, 384, 276, 576, 313, 848, 756, 979, 19, 767, 649, 128, 653, 263, 368, 353, 212, 334, 461, 906, 555, 821, 218, 116, 674, 589, 627, 990, 132, 594, 177, 942, 936, 532, 490, 240, 16, 209, 671, 933, 1019, 304, 509, 254, 317, 30, 427, 567, 1016, 1013, 609, 190, 44, 800, 524, 704, 612, 751, 666, 787, 852, 632, 898, 778, 193, 1007, 641, 295, 205, 796, 792, 726, 320, 96, 844, 817, 760, 390, 925, 450, 33, 660, 419, 833, 483, 730, 340, 713, 430, 348, 562, 445, 983, 995, 809, 538, 570, 289, 411, 139, 161, 37, 49, 274, 615, 151, 399, 886, 216, 625, 175, 488, 754, 647, 366, 459, 522, 664, 896, 639, 669, 507, 425, 607, 338, 560, 807, 409, 790, 842, 923, 417, 894, 423, 805, 921, 47, 397, 173, 364, 465, 282, 873, 735, 803, 171, 871, 869, 105, 837, 467, 65, 527, 379, 284, 1002, 910, 826, 875, 496, 707, 110, 737, 59, 331, 764, 529, 586, 196, 73, 381, 547, 657, 93, 286, 345, 1010, 301, 1004, 748, 168, 394, 107, 376, 644, 148, 839, 504, 267, 223, 469, 686, 298, 70, 67, 145, 700, 929, 709, 722, 855, 226, 112, 975, 372, 582, 739, 718, 635, 270, 61, 917, 864, 454, 912, 743, 901, 689, 828, 185, 357, 121, 877, 246, 781, 472, 498, 601, 85, 434, 198, 693, 323, 229, 75, 954, 678, 964, 383, 575, 99, 858, 549, 477, 262, 352, 333, 905, 847, 978, 766, 127, 593, 941, 531, 239, 820, 115, 588, 989, 29, 566, 1012, 189, 208, 932, 303, 253, 631, 777, 1006, 294, 799, 703, 750, 786, 389, 449, 659, 832, 795, 725, 95, 816, 994, 537, 288, 138, 729, 712, 347, 444, 624, 487, 646, 458, 36, 273, 150, 885, 559, 408, 841, 416, 663, 638, 506, 606, 281, 734, 170, 868, 422, 920, 396, 363, 825, 495, 109, 58, 836, 64, 378, 1001, 92, 344, 300, 747, 763, 585, 72, 546, 222, 685, 69, 144, 393, 375, 147, 503, 581, 717, 269, 916, 928, 721, 225, 974, 120, 245, 471, 600, 453, 742, 688, 184, 963, 574, 857, 476, 433, 692, 228, 953, 940, 238, 114, 988, 351, 904, 977, 126, 776, 293, 702, 785, 565, 188, 931, 252, 536, 137, 711, 443, 448, 831, 724, 815, 407, 415, 637, 605, 486, 457, 272, 884, 494, 57, 63, 1000, 733, 867, 919, 362, 684, 143, 374, 502, 343, 746, 584, 545, 244, 599, 741, 183, 716, 915, 720, 973, 237, 987, 903, 125, 573, 475, 691, 952, 136, 442, 830, 814, 292, 784, 187, 251, 56, 999, 866, 361, 414, 604, 456, 883, 598, 182, 914, 972, 142, 501, 745, 544, 441, 813, 783, 250, 986, 124, 474, 951, 181, 971, 500, 543, 998, 360, 603, 882, 970, 542, 359, 881, 812, 249, 123, 950, 946, 947, 879, 948, 541, 880, 248, 949 +}; + + + +/** + * @brief Generates exp and log lookup tables of GF(2^m). + * + * The logarithm of 0 is defined as 2^PARAM_M by convention.
+ * The last two elements of the exp table are needed by the PQCLEAN_HQC256_CLEAN_gf_mul function from gf_lutmul.c + * (for example if both elements to multiply are zero). + * @param[out] exp Array of size 2^PARAM_M + 2 receiving the powers of the primitive element + * @param[out] log Array of size 2^PARAM_M receiving the logarithms of the elements of GF(2^m) + * @param[in] m Parameter of Galois field GF(2^m) + */ +void PQCLEAN_HQC256_CLEAN_gf_generate(uint16_t *exp, uint16_t *log, int16_t m) { + uint16_t elt = 1; + uint16_t alpha = 2; // primitive element of GF(2^PARAM_M) + uint16_t gf_poly = PARAM_GF_POLY; + + for (size_t i = 0 ; i < (1U << m) - 1 ; ++i) { + exp[i] = elt; + log[elt] = i; + + elt *= alpha; + if (elt >= 1 << m) { + elt ^= gf_poly; + } + } + + exp[(1 << m) - 1] = 1; + exp[1 << m] = 2; + exp[(1 << m) + 1] = 4; + log[0] = 1 << m; // by convention +} + + + +/** + * @brief Returns the integer i such that elt = a^i where a is the primitive element of GF(2^PARAM_M). + * + * @returns the logarithm of the given element + */ +uint16_t PQCLEAN_HQC256_CLEAN_gf_log(uint16_t elt) { + return log[elt]; +} + + + +/** + * @brief Multiplies nonzero element a by element b + * + * @returns the product a*b + * @param[in] a First element of GF(2^PARAM_M) to multiply (cannot be zero) + * @param[in] b Second element of GF(2^PARAM_M) to multiply (cannot be zero) + */ +uint16_t PQCLEAN_HQC256_CLEAN_gf_mul(uint16_t a, uint16_t b) { + // mask = 0xffff if neither a nor b is zero. Otherwise mask is 0. + int16_t mask = ((log[a] | log[b]) >> PARAM_M) - 1; + return mask & exp[PQCLEAN_HQC256_CLEAN_gf_mod(log[a] + log[b])]; +} + + + +/** + * @brief Squares an element of GF(2^PARAM_M) + * + * @returns a^2 + * @param[in] a Element of GF(2^PARAM_M) + */ +uint16_t PQCLEAN_HQC256_CLEAN_gf_square(uint16_t a) { + int16_t mask = (log[a] >> PARAM_M) - 1; + return mask & exp[PQCLEAN_HQC256_CLEAN_gf_mod(2 * log[a])]; +} + + + +/** + * @brief Computes the inverse of an element of GF(2^PARAM_M) + * + * @returns the inverse of a + * @param[in] a Element of GF(2^PARAM_M) + */ +uint16_t PQCLEAN_HQC256_CLEAN_gf_inverse(uint16_t a) { + return exp[PARAM_GF_MUL_ORDER - log[a]]; +} + + + +/** + * @brief Returns i modulo 2^PARAM_M-1 + * + * i must be less than 2*(2^PARAM_M-1). + * Therefore, the return value is either i or i-2^PARAM_M+1. + * + * @returns i mod (2^PARAM_M-1) + * @param[in] i The integer whose modulo is taken + */ +uint16_t PQCLEAN_HQC256_CLEAN_gf_mod(uint16_t i) { + uint16_t tmp = i - PARAM_GF_MUL_ORDER; + + // mask = 0xffff if(i < PARAM_GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & PARAM_GF_MUL_ORDER); +} diff --git a/crypto_kem/hqc-256/clean/gf.h b/crypto_kem/hqc-256/clean/gf.h new file mode 100644 index 00000000..f539652d --- /dev/null +++ b/crypto_kem/hqc-256/clean/gf.h @@ -0,0 +1,29 @@ +#ifndef GF_H +#define GF_H + + +/** + * @file gf.h + * Header file of gf.c + */ + +#include + +#include +#include + +void PQCLEAN_HQC256_CLEAN_gf_generate(uint16_t *exp, uint16_t *log, int16_t m); + + +uint16_t PQCLEAN_HQC256_CLEAN_gf_log(uint16_t elt); + +uint16_t PQCLEAN_HQC256_CLEAN_gf_mul(uint16_t a, uint16_t b); + +uint16_t PQCLEAN_HQC256_CLEAN_gf_square(uint16_t a); + +uint16_t PQCLEAN_HQC256_CLEAN_gf_inverse(uint16_t a); + +uint16_t PQCLEAN_HQC256_CLEAN_gf_mod(uint16_t i); + + +#endif diff --git a/crypto_kem/hqc-256/clean/gf2x.c b/crypto_kem/hqc-256/clean/gf2x.c new file mode 100644 index 00000000..73e4e148 --- /dev/null +++ b/crypto_kem/hqc-256/clean/gf2x.c @@ -0,0 +1,155 @@ +#include "gf2x.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include +#include +#include +/** + * \file gf2x.c + * \brief Implementation of multiplication of two polynomials + */ + + +static inline void swap(uint16_t *tab, uint16_t elt1, uint16_t elt2); +static void reduce(uint64_t *o, const uint64_t *a); +static void fast_convolution_mult(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx); + +/** + * @brief swap two elements in a table + * + * This function exchanges tab[elt1] with tab[elt2] + * + * @param[in] tab Pointer to the table + * @param[in] elt1 Index of the first element + * @param[in] elt2 Index of the second element + */ +static inline void swap(uint16_t *tab, uint16_t elt1, uint16_t elt2) { + uint16_t tmp = tab[elt1]; + + tab[elt1] = tab[elt2]; + tab[elt2] = tmp; +} + + + +/** + * @brief Compute o(x) = a(x) mod \f$ X^n - 1\f$ + * + * This function computes the modular reduction of the polynomial a(x) + * + * @param[in] a Pointer to the polynomial a(x) + * @param[out] o Pointer to the result + */ +static void reduce(uint64_t *o, const uint64_t *a) { + uint64_t r; + uint64_t carry; + + for (uint32_t i = 0 ; i < VEC_N_SIZE_64 ; i++) { + r = a[i + VEC_N_SIZE_64 - 1] >> (PARAM_N & 63); + carry = (uint64_t) (a[i + VEC_N_SIZE_64] << (64 - (PARAM_N & 63))); + o[i] = a[i] ^ r ^ carry; + } + + o[VEC_N_SIZE_64 - 1] &= RED_MASK; +} + + + +/** + * @brief computes product of the polynomial a1(x) with the sparse polynomial a2 + * + * o(x) = a1(x)a2(x) + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to the sparse polynomial a2 (list of degrees of the monomials which appear in a2) + * @param[in] a2 Pointer to the polynomial a1(x) + * @param[in] weight Hamming wifht of the sparse polynomial a2 + * @param[in] ctx Pointer to a seed expander used to randomize the multiplication process + */ +static void fast_convolution_mult(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx) { +//static uint32_t fast_convolution_mult(const uint64_t *A, const uint32_t *vB, uint64_t *C, const uint16_t w, AES_XOF_struct *ctx) + uint64_t carry; + uint32_t dec, s; + uint64_t table[16 * (VEC_N_SIZE_64 + 1)]; + uint16_t permuted_table[16]; + uint16_t permutation_table[16]; + uint16_t permuted_sparse_vect[PARAM_OMEGA_E]; + uint16_t permutation_sparse_vect[PARAM_OMEGA_E]; + uint64_t *pt; + uint16_t *res_16; + + for (uint32_t i = 0 ; i < 16; i++) { + permuted_table[i] = i; + } + + seedexpander(ctx, (uint8_t *) permutation_table, 16 * sizeof(uint16_t)); + + for (uint32_t i = 0 ; i < 15 ; i++) { + swap(permuted_table + i, 0, permutation_table[i] % (16 - i)); + } + + pt = table + (permuted_table[0] * (VEC_N_SIZE_64 + 1)); + for (int32_t j = 0 ; j < VEC_N_SIZE_64 ; j++) { + pt[j] = a2[j]; + } + pt[VEC_N_SIZE_64] = 0x0; + + for (uint32_t i = 1 ; i < 16 ; i++) { + carry = 0; + pt = table + (permuted_table[i] * (VEC_N_SIZE_64 + 1)); + for (uint32_t j = 0 ; j < VEC_N_SIZE_64 ; j++) { + pt[j] = (a2[j] << i) ^ carry; + carry = (a2[j] >> ((64 - i))); + } + pt[VEC_N_SIZE_64] = carry; + } + + for (uint32_t i = 0 ; i < weight ; i++) { + permuted_sparse_vect[i] = i; + } + + seedexpander(ctx, (uint8_t *) permutation_sparse_vect, weight * sizeof(uint16_t)); + + for (uint32_t i = 0 ; i + 1 < weight ; i++) { + swap(permuted_sparse_vect + i, 0, permutation_sparse_vect[i] % (weight - i)); + } + + for (uint32_t i = 0 ; i < weight ; i++) { + dec = a1[permuted_sparse_vect[i]] & 0xf; + s = a1[permuted_sparse_vect[i]] >> 4; + res_16 = ((uint16_t *) o) + s; + pt = table + (permuted_table[dec] * (VEC_N_SIZE_64 + 1)); + + for (uint32_t j = 0 ; j < VEC_N_SIZE_64 + 1 ; j++) { + *res_16++ ^= (uint16_t) pt[j]; + *res_16++ ^= (uint16_t) (pt[j] >> 16); + *res_16++ ^= (uint16_t) (pt[j] >> 32); + *res_16++ ^= (uint16_t) (pt[j] >> 48); + } + } +} + + + +/** + * @brief Multiply two polynomials modulo \f$ X^n - 1\f$. + * + * This functions multiplies a sparse polynomial a1 (of Hamming weight equal to weight) + * and a dense polynomial a2. The multiplication is done modulo \f$ X^n - 1\f$. + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to the sparse polynomial + * @param[in] a2 Pointer to the dense polynomial + * @param[in] weight Integer that is the weigt of the sparse polynomial + * @param[in] ctx Pointer to the randomness context + */ +void PQCLEAN_HQC256_CLEAN_vect_mul(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx) { + uint64_t tmp[2 * VEC_N_SIZE_64 + 1]; + for (uint32_t j = 0 ; j < 2 * VEC_N_SIZE_64 + 1 ; j++) { + tmp[j] = 0; + } + + fast_convolution_mult(tmp, a1, a2, weight, ctx); + reduce(o, tmp); +} diff --git a/crypto_kem/hqc-256/clean/gf2x.h b/crypto_kem/hqc-256/clean/gf2x.h new file mode 100644 index 00000000..f9f1c0c1 --- /dev/null +++ b/crypto_kem/hqc-256/clean/gf2x.h @@ -0,0 +1,18 @@ +#ifndef GF2X_H +#define GF2X_H + + +/** + * @file gf2x.h + * @brief Header file for gf2x.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQC256_CLEAN_vect_mul(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx); + + +#endif diff --git a/crypto_kem/hqc-256/clean/hqc.c b/crypto_kem/hqc-256/clean/hqc.c new file mode 100644 index 00000000..4dd6467f --- /dev/null +++ b/crypto_kem/hqc-256/clean/hqc.c @@ -0,0 +1,143 @@ +#include "code.h" +#include "gf2x.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +/** + * @file hqc.c + * @brief Implementation of hqc.h + */ + + + +/** + * @brief Keygen of the HQC_PKE IND_CPA scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + */ +void PQCLEAN_HQC256_CLEAN_hqc_pke_keygen(unsigned char *pk, unsigned char *sk) { + AES_XOF_struct sk_seedexpander; + AES_XOF_struct pk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + uint8_t pk_seed[SEED_BYTES] = {0}; + uint64_t x[VEC_N_SIZE_64] = {0}; + uint32_t y[PARAM_OMEGA] = {0}; + uint64_t h[VEC_N_SIZE_64] = {0}; + uint64_t s[VEC_N_SIZE_64] = {0}; + + // Create seed_expanders for public key and secret key + randombytes(sk_seed, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + randombytes(pk_seed, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute secret key + PQCLEAN_HQC256_CLEAN_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQC256_CLEAN_vect_set_random_fixed_weight_by_coordinates(&sk_seedexpander, y, PARAM_OMEGA); + + // Compute public key + PQCLEAN_HQC256_CLEAN_vect_set_random(&pk_seedexpander, h); + PQCLEAN_HQC256_CLEAN_vect_mul(s, y, h, PARAM_OMEGA, &sk_seedexpander); + PQCLEAN_HQC256_CLEAN_vect_add(s, x, s, VEC_N_SIZE_64); + + // Parse keys to string + PQCLEAN_HQC256_CLEAN_hqc_public_key_to_string(pk, pk_seed, s); + PQCLEAN_HQC256_CLEAN_hqc_secret_key_to_string(sk, sk_seed, pk); + +} + + + +/** + * @brief Encryption of the HQC_PKE IND_CPA scheme + * + * The cihertext is composed of vectors u and v. + * + * @param[out] u Vector u (first part of the ciphertext) + * @param[out] v Vector v (second part of the ciphertext) + * @param[in] m Vector representing the message to encrypt + * @param[in] theta Seed used to derive randomness required for encryption + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC256_CLEAN_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk) { + AES_XOF_struct seedexpander; + uint64_t h[VEC_N_SIZE_64] = {0}; + uint64_t s[VEC_N_SIZE_64] = {0}; + uint64_t r1[VEC_N_SIZE_64] = {0}; + uint32_t r2[PARAM_OMEGA_R] = {0}; + uint64_t e[VEC_N_SIZE_64] = {0}; + uint64_t tmp1[VEC_N_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_SIZE_64] = {0}; + + // Create seed_expander from theta + seedexpander_init(&seedexpander, theta, theta + 32, SEEDEXPANDER_MAX_LENGTH); + + // Retrieve h and s from public key + PQCLEAN_HQC256_CLEAN_hqc_public_key_from_string(h, s, pk); + + // Generate r1, r2 and e + PQCLEAN_HQC256_CLEAN_vect_set_random_fixed_weight(&seedexpander, r1, PARAM_OMEGA_R); + PQCLEAN_HQC256_CLEAN_vect_set_random_fixed_weight_by_coordinates(&seedexpander, r2, PARAM_OMEGA_R); + PQCLEAN_HQC256_CLEAN_vect_set_random_fixed_weight(&seedexpander, e, PARAM_OMEGA_E); + + // Compute u = r1 + r2.h + PQCLEAN_HQC256_CLEAN_vect_mul(u, r2, h, PARAM_OMEGA_R, &seedexpander); + PQCLEAN_HQC256_CLEAN_vect_add(u, r1, u, VEC_N_SIZE_64); + + // Compute v = m.G by encoding the message + PQCLEAN_HQC256_CLEAN_code_encode(v, m); + PQCLEAN_HQC256_CLEAN_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + + // Compute v = m.G + s.r2 + e + PQCLEAN_HQC256_CLEAN_vect_mul(tmp2, r2, s, PARAM_OMEGA_R, &seedexpander); + PQCLEAN_HQC256_CLEAN_vect_add(tmp2, e, tmp2, VEC_N_SIZE_64); + PQCLEAN_HQC256_CLEAN_vect_add(tmp2, tmp1, tmp2, VEC_N_SIZE_64); + PQCLEAN_HQC256_CLEAN_vect_resize(v, PARAM_N1N2, tmp2, PARAM_N); + +} + + + +/** + * @brief Decryption of the HQC_PKE IND_CPA scheme + * + * @param[out] m Vector representing the decrypted message + * @param[in] u Vector u (first part of the ciphertext) + * @param[in] v Vector v (second part of the ciphertext) + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQC256_CLEAN_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk) { + uint64_t x[VEC_N_SIZE_64] = {0}; + uint32_t y[PARAM_OMEGA] = {0}; + uint8_t pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t tmp1[VEC_N_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_SIZE_64] = {0}; + AES_XOF_struct perm_seedexpander; + uint8_t perm_seed[SEED_BYTES] = {0}; + + // Retrieve x, y, pk from secret key + PQCLEAN_HQC256_CLEAN_hqc_secret_key_from_string(x, y, pk, sk); + + randombytes(perm_seed, SEED_BYTES); + seedexpander_init(&perm_seedexpander, perm_seed, perm_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute v - u.y + PQCLEAN_HQC256_CLEAN_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + PQCLEAN_HQC256_CLEAN_vect_mul(tmp2, y, u, PARAM_OMEGA, &perm_seedexpander); + PQCLEAN_HQC256_CLEAN_vect_add(tmp2, tmp1, tmp2, VEC_N_SIZE_64); + + + // Compute m by decoding v - u.y + PQCLEAN_HQC256_CLEAN_code_decode(m, tmp2); +} diff --git a/crypto_kem/hqc-256/clean/hqc.h b/crypto_kem/hqc-256/clean/hqc.h new file mode 100644 index 00000000..0c2ff47b --- /dev/null +++ b/crypto_kem/hqc-256/clean/hqc.h @@ -0,0 +1,21 @@ +#ifndef HQC_H +#define HQC_H + + +/** + * @file hqc.h + * @brief Functions of the HQC_PKE IND_CPA scheme + */ + +#include + +#include + +void PQCLEAN_HQC256_CLEAN_hqc_pke_keygen(unsigned char *pk, unsigned char *sk); + +void PQCLEAN_HQC256_CLEAN_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk); + +void PQCLEAN_HQC256_CLEAN_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-256/clean/kem.c b/crypto_kem/hqc-256/clean/kem.c new file mode 100644 index 00000000..9c310077 --- /dev/null +++ b/crypto_kem/hqc-256/clean/kem.c @@ -0,0 +1,138 @@ +#include "api.h" +#include "fips202.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "sha2.h" +#include "vector.h" +#include +#include +/** + * @file kem.c + * @brief Implementation of api.h + */ + + + +/** + * @brief Keygen of the HQC_KEM IND_CAA2 scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + * @returns 0 if keygen is successful + */ +int PQCLEAN_HQC256_CLEAN_crypto_kem_keypair(unsigned char *pk, unsigned char *sk) { + + PQCLEAN_HQC256_CLEAN_hqc_pke_keygen(pk, sk); + return 0; +} + + + +/** + * @brief Encapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ct String containing the ciphertext + * @param[out] ss String containing the shared secret + * @param[in] pk String containing the public key + * @returns 0 if encapsulation is successful + */ +int PQCLEAN_HQC256_CLEAN_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk) { + + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint64_t u[VEC_N_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Computing m + PQCLEAN_HQC256_CLEAN_vect_set_random_from_randombytes(m); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m + PQCLEAN_HQC256_CLEAN_hqc_pke_encrypt(u, v, m, theta, pk); + + // Computing d + sha512(d, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Computing ciphertext + PQCLEAN_HQC256_CLEAN_hqc_ciphertext_to_string(ct, u, v, d); + + + return 0; +} + + + +/** + * @brief Decapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ss String containing the shared secret + * @param[in] ct String containing the cipĥertext + * @param[in] sk String containing the secret key + * @returns 0 if decapsulation is successful, -1 otherwise + */ +int PQCLEAN_HQC256_CLEAN_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk) { + + int8_t result = -1; + uint64_t u[VEC_N_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t u2[VEC_N_SIZE_64] = {0}; + uint64_t v2[VEC_N1N2_SIZE_64] = {0}; + unsigned char d2[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Retrieving u, v and d from ciphertext + PQCLEAN_HQC256_CLEAN_hqc_ciphertext_from_string(u, v, d, ct); + + // Retrieving pk from sk + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); + + // Decryting + PQCLEAN_HQC256_CLEAN_hqc_pke_decrypt(m, u, v, sk); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m' + PQCLEAN_HQC256_CLEAN_hqc_pke_encrypt(u2, v2, m, theta, pk); + + // Computing d' + sha512(d2, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Abort if c != c' or d != d' + result = (PQCLEAN_HQC256_CLEAN_vect_compare(u, u2, VEC_N_SIZE_BYTES) == 0 && PQCLEAN_HQC256_CLEAN_vect_compare(v, v2, VEC_N1N2_SIZE_BYTES) == 0 && memcmp(d, d2, SHA512_BYTES) == 0); + for (size_t i = 0 ; i < SHARED_SECRET_BYTES ; i++) { + ss[i] = result * ss[i]; + } + result--; + + + return result; +} diff --git a/crypto_kem/hqc-256/clean/parameters.h b/crypto_kem/hqc-256/clean/parameters.h new file mode 100644 index 00000000..57ea9a46 --- /dev/null +++ b/crypto_kem/hqc-256/clean/parameters.h @@ -0,0 +1,126 @@ +#ifndef HQC_PARAMETERS_H +#define HQC_PARAMETERS_H +/** + * @file parameters.h + * @brief Parameters of the HQC_KEM IND-CCA2 scheme + */ + +#include "api.h" +#include "api.h" +#include "vector.h" + + +#define CEIL_DIVIDE(a, b) (((a)/(b)) + ((a) % (b) == 0 ? 0 : 1)) /*!< Divide a by b and ceil the result*/ +#define BITMASK(a, size) ((1UL << ((a) % (size))) - 1) /*!< Create a mask*/ + +/* + #define PARAM_N Define the parameter n of the scheme + #define PARAM_N1 Define the parameter n1 of the scheme (length of BCH code) + #define PARAM_N2 Define the parameter n2 of the scheme (length of the repetition code) + #define PARAM_N1N2 Define the parameter n1 * n2 of the scheme (length of the tensor code) + #define PARAM_OMEGA Define the parameter omega of the scheme + #define PARAM_OMEGA_E Define the parameter omega_e of the scheme + #define PARAM_OMEGA_R Define the parameter omega_r of the scheme + #define PARAM_SECURITY Define the security level corresponding to the chosen parameters + #define PARAM_DFR_EXP Define the decryption failure rate corresponding to the chosen parameters + + #define SECRET_KEY_BYTES Define the size of the secret key in bytes + #define PUBLIC_KEY_BYTES Define the size of the public key in bytes + #define SHARED_SECRET_BYTES Define the size of the shared secret in bytes + #define CIPHERTEXT_BYTES Define the size of the ciphertext in bytes + + #define UTILS_REJECTION_THRESHOLD Define the rejection threshold used to generate given weight vectors (see vector_set_random_fixed_weight function) + #define VEC_N_SIZE_BYTES Define the size of the array used to store a PARAM_N sized vector in bytes + #define VEC_K_SIZE_BYTES Define the size of the array used to store a PARAM_K sized vector in bytes + #define VEC_N1_SIZE_BYTES Define the size of the array used to store a PARAM_N1 sized vector in bytes + #define VEC_N1N2_SIZE_BYTES Define the size of the array used to store a PARAM_N1N2 sized vector in bytes + + #define VEC_N_SIZE_64 Define the size of the array used to store a PARAM_N sized vector in 64 bits + #define VEC_K_SIZE_64 Define the size of the array used to store a PARAM_K sized vector in 64 bits + #define VEC_N1_SIZE_64 Define the size of the array used to store a PARAM_N1 sized vector in 64 bits + #define VEC_N1N2_SIZE_64 Define the size of the array used to store a PARAM_N1N2 sized vector in 64 bits + + #define PARAM_T Define a threshold for decoding repetition code word (PARAM_T = (PARAM_N2 - 1) / 2) + + #define PARAM_DELTA Define the parameter delta of the scheme (correcting capacity of the BCH code) + #define PARAM_M Define a positive integer + #define PARAM_GF_POLY Generator polynomial of galois field GF(2^PARAM_M), represented in hexadecimial form + #define PARAM_GF_MUL_ORDER Define the size of the multiplicative group of GF(2^PARAM_M), i.e 2^PARAM_M -1 + #define PARAM_K Define the size of the information bits of the BCH code + #define PARAM_G Define the size of the generator polynomial of BCH code + #define PARAM_FFT The additive FFT takes a 2^PARAM_FFT polynomial as input + We use the FFT to compute the roots of sigma, whose degree if PARAM_DELTA=60 + The smallest power of 2 greater than 60+1 is 64=2^6 + #define PARAM_FFT_T The additive FFT transpose computes a (2^PARAM_FFT_T)-sized syndrome vector + We want to compute 2*PARAM_DELTA=120 syndromes + The smallest power of 2 greater than 120 is 2^7 + #define PARAM_BCH_POLY Generator polynomial of the BCH code + + #define RED_MASK A mask fot the higher bits of a vector + #define SHA512_BYTES Define the size of SHA512 output in bytes + #define SEED_BYTES Define the size of the seed in bytes + #define SEEDEXPANDER_MAX_LENGTH Define the seed expander max length +*/ + +#define PARAM_N 69259 +#define PARAM_N1 796 +#define PARAM_N2 87 +#define PARAM_N1N2 69252 +#define PARAM_OMEGA 133 +#define PARAM_OMEGA_E 153 +#define PARAM_OMEGA_R 153 +#define PARAM_SECURITY 256 +#define PARAM_DFR_EXP 256 + +#define SECRET_KEY_BYTES PQCLEAN_HQC256_CLEAN_CRYPTO_SECRETKEYBYTES +#define PUBLIC_KEY_BYTES PQCLEAN_HQC256_CLEAN_CRYPTO_PUBLICKEYBYTES +#define SHARED_SECRET_BYTES PQCLEAN_HQC256_CLEAN_CRYPTO_BYTES +#define CIPHERTEXT_BYTES PQCLEAN_HQC256_CLEAN_CRYPTO_CIPHERTEXTBYTES + +#define UTILS_REJECTION_THRESHOLD 16760678 +#define VEC_K_SIZE_BYTES CEIL_DIVIDE(PARAM_K, 8) +#define VEC_N_SIZE_BYTES CEIL_DIVIDE(PARAM_N, 8) +#define VEC_N1_SIZE_BYTES CEIL_DIVIDE(PARAM_N1, 8) +#define VEC_N1N2_SIZE_BYTES CEIL_DIVIDE(PARAM_N1N2, 8) + +#define VEC_N_SIZE_64 CEIL_DIVIDE(PARAM_N, 64) +#define VEC_K_SIZE_64 CEIL_DIVIDE(PARAM_K, 64) +#define VEC_N1_SIZE_64 CEIL_DIVIDE(PARAM_N1, 64) +#define VEC_N1N2_SIZE_64 CEIL_DIVIDE(PARAM_N1N2, 64) + +#define PARAM_T 43 + +#define PARAM_DELTA 60 +#define PARAM_M 10 +#define PARAM_GF_POLY 0x409 +#define PARAM_GF_MUL_ORDER 1023 +#define PARAM_K 256 +#define PARAM_G 541 +#define PARAM_FFT 6 +#define PARAM_FFT_T 7 +#define PARAM_BCH_POLY { \ + 1,1,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0, \ + 1,0,0,1,0,1,1,0,1,0,0,1,1,1,0,0,1,1,1,0,0,0,1,0,1,0,1,0,1,1,0,0, \ + 1,0,1,0,0,1,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0, \ + 0,1,0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,0,1,1,1,1,0,1,0,0,1,1,1,1,0,1, \ + 0,0,0,1,0,0,1,1,1,1,1,0,1,0,0,0,1,0,1,1,0,0,0,1,0,1,0,0,1,0,0,0, \ + 1,1,0,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,1,0,1,0,0,1,0,0,1,1,0,1,0, \ + 0,0,0,1,1,0,0,0,0,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1, \ + 1,0,1,1,0,0,0,1,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,1,0, \ + 0,0,1,1,0,0,1,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,1,1,0,0,1,0,1,1, \ + 1,1,1,1,0,1,1,1,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,1,0,1,1,1,0,1,0,1, \ + 0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,1,0,1,1,0,0,0,1,0,1,1,0,0,0, \ + 1,0,0,1,0,0,1,1,0,0,1,0,1,0,0,1,1,1,1,0,0,1,1,0,0,1,1,0,1,0,1,1, \ + 0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,1,1,1, \ + 0,1,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,0,0,1,0,0,1,1,0,0, \ + 0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,1,0,0,0,0,1,0,1,1, \ + 1,1,0,0,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,1,0,0, \ + 1,0,1,1,0,0,0,0,0,1,1,1,1,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1 \ + }; + +#define RED_MASK 0x00000000000007ffUL +#define SHA512_BYTES 64 +#define SEED_BYTES 40 +#define SEEDEXPANDER_MAX_LENGTH 4294967295 + +#endif diff --git a/crypto_kem/hqc-256/clean/parsing.c b/crypto_kem/hqc-256/clean/parsing.c new file mode 100644 index 00000000..2606b928 --- /dev/null +++ b/crypto_kem/hqc-256/clean/parsing.c @@ -0,0 +1,121 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file parsing.c + * @brief Functions to parse secret key, public key and ciphertext of the HQC scheme + */ + + + +/** + * @brief Parse a secret key into a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] sk String containing the secret key + * @param[in] sk_seed Seed used to generate the secret key + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC256_CLEAN_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk) { + memcpy(sk, sk_seed, SEED_BYTES); + memcpy(sk + SEED_BYTES, pk, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a secret key from a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] x uint64_t representation of vector x + * @param[out] y uint32_t representation of vector y + * @param[out] pk String containing the public key + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQC256_CLEAN_hqc_secret_key_from_string(uint64_t *x, uint32_t *y, uint8_t *pk, const uint8_t *sk) { + AES_XOF_struct sk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + + memcpy(sk_seed, sk, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + PQCLEAN_HQC256_CLEAN_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQC256_CLEAN_vect_set_random_fixed_weight_by_coordinates(&sk_seedexpander, y, PARAM_OMEGA); + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a public key into a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] pk String containing the public key + * @param[in] pk_seed Seed used to generate the public key + * @param[in] s uint8_t representation of vector s + */ +void PQCLEAN_HQC256_CLEAN_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s) { + memcpy(pk, pk_seed, SEED_BYTES); + memcpy(pk + SEED_BYTES, s, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Parse a public key from a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] h uint8_t representation of vector h + * @param[out] s uint8_t representation of vector s + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQC256_CLEAN_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk) { + AES_XOF_struct pk_seedexpander; + uint8_t pk_seed[SEED_BYTES] = {0}; + + memcpy(pk_seed, pk, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + PQCLEAN_HQC256_CLEAN_vect_set_random(&pk_seedexpander, h); + + memcpy(s, pk + SEED_BYTES, VEC_N_SIZE_BYTES); +} + + +/** + * @brief Parse a ciphertext into a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] ct String containing the ciphertext + * @param[in] u uint8_t representation of vector u + * @param[in] v uint8_t representation of vector v + * @param[in] d String containing the hash d + */ +void PQCLEAN_HQC256_CLEAN_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d) { + memcpy(ct, u, VEC_N_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, d, SHA512_BYTES); +} + + +/** + * @brief Parse a ciphertext from a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] u uint8_t representation of vector u + * @param[out] v uint8_t representation of vector v + * @param[out] d String containing the hash d + * @param[in] ct String containing the ciphertext + */ +void PQCLEAN_HQC256_CLEAN_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct) { + memcpy(u, ct, VEC_N_SIZE_BYTES); + memcpy(v, ct + VEC_N_SIZE_BYTES, VEC_N1N2_SIZE_BYTES); + memcpy(d, ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, SHA512_BYTES); +} diff --git a/crypto_kem/hqc-256/clean/parsing.h b/crypto_kem/hqc-256/clean/parsing.h new file mode 100644 index 00000000..626964d1 --- /dev/null +++ b/crypto_kem/hqc-256/clean/parsing.h @@ -0,0 +1,29 @@ +#ifndef PARSING_H +#define PARSING_H + + +/** + * @file parsing.h + * @brief Header file for parsing.c + */ + +#include + +#include + +void PQCLEAN_HQC256_CLEAN_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk); + +void PQCLEAN_HQC256_CLEAN_hqc_secret_key_from_string(uint64_t *x, uint32_t *y, uint8_t *pk, const uint8_t *sk); + + +void PQCLEAN_HQC256_CLEAN_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s); + +void PQCLEAN_HQC256_CLEAN_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk); + + +void PQCLEAN_HQC256_CLEAN_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d); + +void PQCLEAN_HQC256_CLEAN_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct); + + +#endif diff --git a/crypto_kem/hqc-256/clean/repetition.c b/crypto_kem/hqc-256/clean/repetition.c new file mode 100644 index 00000000..d7b39b37 --- /dev/null +++ b/crypto_kem/hqc-256/clean/repetition.c @@ -0,0 +1,100 @@ +#include "parameters.h" +#include "repetition.h" +#include +#include +#include +/** + * @file repetition.c + * @brief Implementation of repetition codes + */ + +static inline int32_t popcount(uint64_t n); + +/** + * @brief Encoding each bit in the message m using the repetition code + * + * + * @param[out] em Pointer to an array that is the code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQC256_CLEAN_repetition_code_encode(uint64_t *em, const uint64_t *m) { + static const uint64_t mask[2][3] = {{0x0UL, 0x0UL, 0x0UL}, {0xFFFFFFFFFFFFFFFFUL, 0xFFFFFFFFFFFFFFFFUL, 0x3FFFFFUL}}; + for (size_t i = 0 ; i < VEC_N1_SIZE_64 - 1 ; i++) { + for (size_t j = 0 ; j < 64 ; j++) { + uint8_t bit = (m[i] >> j) & 0x1; + uint32_t pos_r = PARAM_N2 * ((i << 6) + j); + uint16_t idx_r = (pos_r & 0x3f); + uint64_t *p64 = em; + p64 += pos_r >> 6; + *p64 ^= mask[bit][0] << idx_r; + int64_t aux = (41 - idx_r); + uint64_t aux2 = (aux > 0); + uint64_t idx2 = aux * aux2; + *(p64 + 1) ^= mask[bit][1] >> idx2; + *(p64 + 2) ^= mask[bit][2] >> ((63 - idx_r)); + } + } + + for (size_t j = 0 ; j < (PARAM_N1 & 0x3f) ; j++) { + uint8_t bit = (m[VEC_N1_SIZE_64 - 1] >> j) & 0x1; + uint32_t pos_r = PARAM_N2 * (((VEC_N1_SIZE_64 - 1) << 6) + j); + uint16_t idx_r = (pos_r & 0x3f); + uint64_t *p64 = em; + p64 += pos_r >> 6; + *p64 ^= mask[bit][0] << idx_r; + int64_t aux = (41 - idx_r); + uint64_t aux2 = (aux > 0); + uint64_t idx2 = aux * aux2; + *(p64 + 1) ^= mask[bit][1] >> idx2; + *(p64 + 2) ^= mask[bit][2] >> ((63 - idx_r)); + } +} + + + +/** + * @brief Compute the Hamming weight of the 64-bit integer n + * + * The Hamming weight is computed using a trick described in + * Henry S. Warren : "Hacker's Delight", chap 5., p. 66 + * @param[out] the Hamming weight of n + * @param[in] a 64-bit integer n + */ +static inline int32_t popcount(uint64_t n) { + n -= (n >> 1) & 0x5555555555555555UL; + n = (n & 0x3333333333333333UL) + ((n >> 2) & 0x3333333333333333UL); + n = (n + (n >> 4)) & 0x0f0f0f0f0f0f0f0fUL; + return (n * 0x0101010101010101UL) >> 56; +} + + + +/** + * @brief Decoding the code words to a message using the repetition code + * + * We use a majority decoding. In fact we have that PARAM_N2 = 2 * PARAM_T + 1, thus, + * if the Hamming weight of the vector is greater than PARAM_T, the code word is decoded + * to 1 and 0 otherwise. + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQC256_CLEAN_repetition_code_decode(uint64_t *m, const uint64_t *em) { + size_t t = 0, b, bn, bi, c, cn, ci; + uint64_t cx, ones; + uint64_t cy; + + for (b = 0; b < PARAM_N1N2 - PARAM_N2 + 1; b += PARAM_N2) { + bn = b >> 6; + bi = b & 63; + c = b + PARAM_N2 - 1; + cn = c >> 6; + ci = c & 63; + cx = em[cn] << (63 - ci); + int64_t verif = (cn == (bn + 1)); + cy = em[bn + 1]; + ones = popcount((em[bn] >> bi) | (cx * (1 - verif))) + popcount((1 - verif) * cy + verif * cx); + m[t >> 6] |= ((uint64_t) (ones > PARAM_T)) << (t & 63); + t++; + } +} diff --git a/crypto_kem/hqc-256/clean/repetition.h b/crypto_kem/hqc-256/clean/repetition.h new file mode 100644 index 00000000..2787d673 --- /dev/null +++ b/crypto_kem/hqc-256/clean/repetition.h @@ -0,0 +1,19 @@ +#ifndef REPETITION_H +#define REPETITION_H + + +/** + * @file repetition.h + * @brief Header file for repetition.c + */ + +#include + +#include + +void PQCLEAN_HQC256_CLEAN_repetition_code_encode(uint64_t *em, const uint64_t *m); + +void PQCLEAN_HQC256_CLEAN_repetition_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-256/clean/vector.c b/crypto_kem/hqc-256/clean/vector.c new file mode 100644 index 00000000..3b3c5f8a --- /dev/null +++ b/crypto_kem/hqc-256/clean/vector.c @@ -0,0 +1,226 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file vector.c + * @brief Implementation of vectors sampling and some utilities for the HQC scheme + */ + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. The vector + * is stored by position. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC256_CLEAN_vect_set_random_fixed_weight_by_coordinates(AES_XOF_struct *ctx, uint32_t *v, uint16_t weight) { + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; // weight is expected to be <= PARAM_OMEGA_R + uint32_t random_data = 0; + uint8_t exist = 0; + size_t j = 0; + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (v[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + v[i] = random_data; + } + } +} + + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC256_CLEAN_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight) { + + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; // weight is expected to be <= PARAM_OMEGA_R + uint32_t random_data = 0; + uint32_t tmp[PARAM_OMEGA_R] = {0}; + uint8_t exist = 0; + size_t j = 0; + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (tmp[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + tmp[i] = random_data; + } + } + + for (uint16_t i = 0 ; i < weight ; ++i) { + int32_t index = tmp[i] / 64; + int32_t pos = tmp[i] % 64; + v[index] |= ((uint64_t) 1) << pos; + } +} + + + +/** + * @brief Generates a random vector of dimension PARAM_N + * + * This function generates a random binary vector of dimension PARAM_N. It generates a random + * array of bytes using the seedexpander function, and drop the extra bits using a mask. + * + * @param[in] v Pointer to an array + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQC256_CLEAN_vect_set_random(AES_XOF_struct *ctx, uint64_t *v) { + uint8_t rand_bytes[VEC_N_SIZE_BYTES] = {0}; + + seedexpander(ctx, rand_bytes, VEC_N_SIZE_BYTES); + + memcpy(v, rand_bytes, VEC_N_SIZE_BYTES); + v[VEC_N_SIZE_64 - 1] &= BITMASK(PARAM_N, 64); +} + + + +/** + * @brief Generates a random vector + * + * This function generates a random binary vector. It uses the the randombytes function. + * + * @param[in] v Pointer to an array + */ +void PQCLEAN_HQC256_CLEAN_vect_set_random_from_randombytes(uint64_t *v) { + uint8_t rand_bytes [VEC_K_SIZE_BYTES] = {0}; + + randombytes(rand_bytes, VEC_K_SIZE_BYTES); + memcpy(v, rand_bytes, VEC_K_SIZE_BYTES); +} + + + +/** + * @brief Adds two vectors + * + * @param[out] o Pointer to an array that is the result + * @param[in] v1 Pointer to an array that is the first vector + * @param[in] v2 Pointer to an array that is the second vector + * @param[in] size Integer that is the size of the vectors + */ +void PQCLEAN_HQC256_CLEAN_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size) { + for (uint32_t i = 0 ; i < size ; ++i) { + o[i] = v1[i] ^ v2[i]; + } +} + + +/** + * @brief Compares two vectors + * + * @param[in] v1 Pointer to an array that is first vector + * @param[in] v2 Pointer to an array that is second vector + * @param[in] size Integer that is the size of the vectors + * @returns 0 if the vectors are equals and a negative/psotive value otherwise + */ +int PQCLEAN_HQC256_CLEAN_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size) { + return memcmp(v1, v2, size); +} + + + +/** + * @brief Resize a vector so that it contains size_o bits + * + * @param[out] o Pointer to the output vector + * @param[in] size_o Integer that is the size of the output vector in bits + * @param[in] v Pointer to the input vector + * @param[in] size_v Integer that is the size of the input vector in bits + */ +void PQCLEAN_HQC256_CLEAN_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v) { + if (size_o < size_v) { + uint64_t mask = 0x7FFFFFFFFFFFFFFF; + int8_t val = 0; + + if (size_o % 64) { + val = 64 - (size_o % 64); + } + + memcpy(o, v, VEC_N1N2_SIZE_BYTES); + + for (int8_t i = 0 ; i < val ; ++i) { + o[VEC_N1N2_SIZE_64 - 1] &= (mask >> i); + } + } else { + memcpy(o, v, CEIL_DIVIDE(size_v, 8)); + } +} diff --git a/crypto_kem/hqc-256/clean/vector.h b/crypto_kem/hqc-256/clean/vector.h new file mode 100644 index 00000000..6731a65b --- /dev/null +++ b/crypto_kem/hqc-256/clean/vector.h @@ -0,0 +1,31 @@ +#ifndef VECTOR_H +#define VECTOR_H + + +/** + * @file vector.h + * @brief Header file for vector.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQC256_CLEAN_vect_set_random_fixed_weight_by_coordinates(AES_XOF_struct *ctx, uint32_t *v, uint16_t weight); + +void PQCLEAN_HQC256_CLEAN_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight); + +void PQCLEAN_HQC256_CLEAN_vect_set_random(AES_XOF_struct *ctx, uint64_t *v); + +void PQCLEAN_HQC256_CLEAN_vect_set_random_from_randombytes(uint64_t *v); + + +void PQCLEAN_HQC256_CLEAN_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size); + +int PQCLEAN_HQC256_CLEAN_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size); + +void PQCLEAN_HQC256_CLEAN_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/META.yml b/crypto_kem/hqc-rmrs-128/META.yml new file mode 100644 index 00000000..f39f1694 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/META.yml @@ -0,0 +1,34 @@ +name: HQC-RMRS-128 +type: kem +claimed-nist-level: 1 +claimed-security: IND-CCA2 +length-ciphertext: 5191 +length-public-key: 2607 +length-secret-key: 2647 +length-shared-secret: 64 +nistkat-sha256: 3e8023f5ed44d10902265f0e557cf00414e35c09bf86b1bf09195f9f8565ebb7 +principal-submitters: + - Carlos Aguilar Melchor + - Nicolas Aragon + - Slim Bettaieb + - Olivier Blazy + - Jurjen Bos + - Jean-Christophe Deneuville + - Philippe Gaborit + - Edoardo Persichetti + - Jean-Marc Robert + - Pascal Véron + - Gilles Zémor + - Loïc Bidoux +implementations: + - name: clean + version: 2020-05-29 + - name: avx2 + version: 2020-05-29 + supported_platforms: + - architecture: x86_64 + operating_systems: + - Linux + - Darwin + required_flags: + - avx2 diff --git a/crypto_kem/hqc-rmrs-128/avx2/LICENSE b/crypto_kem/hqc-rmrs-128/avx2/LICENSE new file mode 100644 index 00000000..d5d21fff --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/LICENSE @@ -0,0 +1 @@ +Public Domain diff --git a/crypto_kem/hqc-rmrs-128/avx2/Makefile b/crypto_kem/hqc-rmrs-128/avx2/Makefile new file mode 100644 index 00000000..35e0362c --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/Makefile @@ -0,0 +1,22 @@ +# This Makefile can be used with GNU Make or BSD Make + +LIB=libhqc-rmrs-128_avx2.a +HEADERS=api.h code.h fft.h gf2x.h gf.h hqc.h parameters.h parsing.h reed_muller.h reed_solomon.h vector.h +OBJECTS=code.o fft.o gf2x.o gf.o hqc.o kem.o parsing.o reed_muller.o reed_solomon.o vector.o + +CFLAGS=-O3 -mavx2 -mbmi -mpclmul -Wall -Wextra -Wpedantic -Wvla -Werror -Wredundant-decls -Wmissing-prototypes -std=c99 -I../../../common $(EXTRAFLAGS) + +all: $(LIB) + +%.o: %.s $(HEADERS) + $(AS) -o $@ $< + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +$(LIB): $(OBJECTS) + $(AR) -r $@ $(OBJECTS) + +clean: + $(RM) $(OBJECTS) + $(RM) $(LIB) diff --git a/crypto_kem/hqc-rmrs-128/avx2/api.h b/crypto_kem/hqc-rmrs-128/avx2/api.h new file mode 100644 index 00000000..e5f94c1d --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/api.h @@ -0,0 +1,25 @@ +#ifndef PQCLEAN_HQCRMRS128_AVX2_API_H +#define PQCLEAN_HQCRMRS128_AVX2_API_H +/** + * @file api.h + * @brief NIST KEM API used by the HQC_KEM IND-CCA2 scheme + */ + +#define PQCLEAN_HQCRMRS128_AVX2_CRYPTO_ALGNAME "HQC-RMRS-128" + +#define PQCLEAN_HQCRMRS128_AVX2_CRYPTO_SECRETKEYBYTES 2647 +#define PQCLEAN_HQCRMRS128_AVX2_CRYPTO_PUBLICKEYBYTES 2607 +#define PQCLEAN_HQCRMRS128_AVX2_CRYPTO_BYTES 64 +#define PQCLEAN_HQCRMRS128_AVX2_CRYPTO_CIPHERTEXTBYTES 5191 + +// As a technicality, the public key is appended to the secret key in order to respect the NIST API. +// Without this constraint, PQCLEAN_HQCRMRS128_AVX2_CRYPTO_SECRETKEYBYTES would be defined as 32 + +int PQCLEAN_HQCRMRS128_AVX2_crypto_kem_keypair(unsigned char *pk, unsigned char *sk); + +int PQCLEAN_HQCRMRS128_AVX2_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk); + +int PQCLEAN_HQCRMRS128_AVX2_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/avx2/code.c b/crypto_kem/hqc-rmrs-128/avx2/code.c new file mode 100644 index 00000000..ca4c9ab4 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/code.c @@ -0,0 +1,47 @@ +#include "code.h" +#include "parameters.h" +#include "reed_muller.h" +#include "reed_solomon.h" +#include +#include +/** + * @file code.c + * @brief Implementation of concatenated code + */ + + + +/** + * + * @brief Encoding the message m to a code word em using the concatenated code + * + * First we encode the message using the Reed-Solomon code, then with the duplicated Reed-Muller code we obtain + * a concatenated code word. + * + * @param[out] em Pointer to an array that is the tensor code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQCRMRS128_AVX2_code_encode(uint64_t *em, const uint64_t *m) { + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQCRMRS128_AVX2_reed_solomon_encode(tmp, m); + PQCLEAN_HQCRMRS128_AVX2_reed_muller_encode(em, tmp); + +} + + + +/** + * @brief Decoding the code word em to a message m using the concatenated code + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQCRMRS128_AVX2_code_decode(uint64_t *m, const uint64_t *em) { + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQCRMRS128_AVX2_reed_muller_decode(tmp, em); + PQCLEAN_HQCRMRS128_AVX2_reed_solomon_decode(m, tmp); + + +} diff --git a/crypto_kem/hqc-rmrs-128/avx2/code.h b/crypto_kem/hqc-rmrs-128/avx2/code.h new file mode 100644 index 00000000..550ff599 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/code.h @@ -0,0 +1,20 @@ +#ifndef CODE_H +#define CODE_H + + +/** + * @file code.h + * Header file of code.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS128_AVX2_code_encode(uint64_t *em, const uint64_t *message); + +void PQCLEAN_HQCRMRS128_AVX2_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/avx2/fft.c b/crypto_kem/hqc-rmrs-128/avx2/fft.c new file mode 100644 index 00000000..4e7ccedc --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/fft.c @@ -0,0 +1,331 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include +#include +/** + * @file fft.c + * Implementation of the additive FFT and its transpose. + * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + */ + + +static void compute_fft_betas(uint16_t *betas); +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size); +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f); +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); + + +/** + * @brief Computes the basis of betas (omitting 1) used in the additive FFT and its transpose + * + * @param[out] betas Array of size PARAM_M-1 + */ +static void compute_fft_betas(uint16_t *betas) { + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + betas[i] = 1 << (PARAM_M - 1 - i); + } +} + + + +/** + * @brief Computes the subset sums of the given set + * + * The array subset_sums is such that its ith element is + * the subset sum of the set elements given by the binary form of i. + * + * @param[out] subset_sums Array of size 2^set_size receiving the subset sums + * @param[in] set Array of set_size elements + * @param[in] set_size Size of the array set + */ +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size) { + subset_sums[0] = 0; + + for (size_t i = 0 ; i < set_size ; ++i) { + for (size_t j = 0 ; j < (1U << i) ; ++j) { + subset_sums[(1 << i) + j] = set[i] ^ subset_sums[j]; + } + } +} + + + +/** + * @brief Computes the radix conversion of a polynomial f in GF(2^m)[x] + * + * Computes f0 and f1 such that f(x) = f0(x^2-x) + x.f1(x^2-x) + * as proposed by Bernstein, Chou and Schwabe: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f0 Array half the size of f + * @param[out] f1 Array half the size of f + * @param[in] f Array of size a power of 2 + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f) { + switch (m_f) { + case 4: + f0[4] = f[8] ^ f[12]; + f0[6] = f[12] ^ f[14]; + f0[7] = f[14] ^ f[15]; + f1[5] = f[11] ^ f[13]; + f1[6] = f[13] ^ f[14]; + f1[7] = f[15]; + f0[5] = f[10] ^ f[12] ^ f1[5]; + f1[4] = f[9] ^ f[13] ^ f0[5]; + + f0[0] = f[0]; + f1[3] = f[7] ^ f[11] ^ f[15]; + f0[3] = f[6] ^ f[10] ^ f[14] ^ f1[3]; + f0[2] = f[4] ^ f0[4] ^ f0[3] ^ f1[3]; + f1[1] = f[3] ^ f[5] ^ f[9] ^ f[13] ^ f1[3]; + f1[2] = f[3] ^ f1[1] ^ f0[3]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 3: + f0[0] = f[0]; + f0[2] = f[4] ^ f[6]; + f0[3] = f[6] ^ f[7]; + f1[1] = f[3] ^ f[5] ^ f[7]; + f1[2] = f[5] ^ f[6]; + f1[3] = f[7]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 2: + f0[0] = f[0]; + f0[1] = f[2] ^ f[3]; + f1[0] = f[1] ^ f0[1]; + f1[1] = f[3]; + return; + + case 1: + f0[0] = f[0]; + f1[0] = f[1]; + return; + + default: + ; + size_t n = 1 << (m_f - 2); + + uint16_t Q[2 * (1 << (PARAM_FFT - 2))]; + uint16_t R[2 * (1 << (PARAM_FFT - 2))]; + + uint16_t Q0[1 << (PARAM_FFT - 2)]; + uint16_t Q1[1 << (PARAM_FFT - 2)]; + uint16_t R0[1 << (PARAM_FFT - 2)]; + uint16_t R1[1 << (PARAM_FFT - 2)]; + + memcpy(Q, f + 3 * n, 2 * n); + memcpy(Q + n, f + 3 * n, 2 * n); + memcpy(R, f, 4 * n); + + for (size_t i = 0 ; i < n ; ++i) { + Q[i] ^= f[2 * n + i]; + R[n + i] ^= Q[i]; + } + + radix(Q0, Q1, Q, m_f - 1); + radix(R0, R1, R, m_f - 1); + + memcpy(f0, R0, 2 * n); + memcpy(f0 + n, Q0, 2 * n); + memcpy(f1, R1, 2 * n); + memcpy(f1 + n, Q1, 2 * n); + } +} + + + +/** + * @brief Evaluates f at all subset sums of a given set + * + * This function is a subroutine of the function fft. + * + * @param[out] w Array + * @param[in] f Array + * @param[in] f_coeffs Number of coefficients of f + * @param[in] m Number of betas + * @param[in] m_f Number of coefficients of f (one more than its degree) + * @param[in] betas FFT constants + */ +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + uint16_t f0[1 << (PARAM_FFT - 2)]; + uint16_t f1[1 << (PARAM_FFT - 2)]; + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + size_t k = 1 << (m - 1); + uint16_t gammas_sums[1 << (PARAM_M - 2)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + uint16_t tmp[PARAM_M - (PARAM_FFT - 1)]; + for (size_t i = 0 ; i < m ; ++i) { + tmp[i] = PQCLEAN_HQCRMRS128_AVX2_gf_mul(betas[i], f[1]); + } + + w[0] = f[0]; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + w[(1 << j) + k] = w[k] ^ tmp[j]; + } + } + + return; + } + + // Step 2: compute g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQCRMRS128_AVX2_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQCRMRS128_AVX2_gf_mul(beta_m_pow, f[i]); + } + } + + // Step 3 + radix(f0, f1, f, m_f); + + // Step 4: compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQCRMRS128_AVX2_gf_mul(betas[i], PQCLEAN_HQCRMRS128_AVX2_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQCRMRS128_AVX2_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + + if (f_coeffs <= 3) { // 3-coefficient polynomial f case: f1 is constant + w[0] = u[0]; + w[k] = u[0] ^ f1[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS128_AVX2_gf_mul(gammas_sums[i], f1[0]); + w[k + i] = w[i] ^ f1[0]; + } + } else { + fft_rec(v, f1, f_coeffs / 2, m - 1, m_f - 1, deltas); + + // Step 6 + memcpy(w + k, v, 2 * k); + w[0] = u[0]; + w[k] ^= u[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS128_AVX2_gf_mul(gammas_sums[i], v[i]); + w[k + i] ^= w[i]; + } + } +} + + + +/** + * @brief Evaluates f on all fields elements using an additive FFT algorithm + * + * f_coeffs is the number of coefficients of f (one less than its degree).
+ * The FFT proceeds recursively to evaluate f at all subset sums of a basis B.
+ * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf
+ * Note that on this first call (as opposed to the recursive calls to fft_rec), gammas are equal to betas, + * meaning the first gammas subset sums are actually the subset sums of betas (except 1).
+ * Also note that f is altered during computation (twisted at each level). + * + * @param[out] w Array + * @param[in] f Array of 2^PARAM_FFT elements + * @param[in] f_coeffs Number coefficients of f (i.e. deg(f)+1) + */ +void PQCLEAN_HQCRMRS128_AVX2_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs) { + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + uint16_t f0[1 << (PARAM_FFT - 1)]; + uint16_t f1[1 << (PARAM_FFT - 1)]; + uint16_t deltas[PARAM_M - 1]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)]; + uint16_t v[1 << (PARAM_M - 1)]; + + // Follows Gao and Mateer algorithm + compute_fft_betas(betas); + + // Step 1: PARAM_FFT > 1, nothing to do + + // Compute gammas sums + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + // Step 2: beta_m = 1, nothing to do + + // Step 3 + radix(f0, f1, f, PARAM_FFT); + + // Step 4: Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQCRMRS128_AVX2_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + fft_rec(v, f1, f_coeffs / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + + // Step 6, 7 and error polynomial computation + memcpy(w + k, v, 2 * k); + + // Check if 0 is root + w[0] = u[0]; + + // Check if 1 is root + w[k] ^= u[0]; + + // Find other roots + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS128_AVX2_gf_mul(betas_sums[i], v[i]); + w[k + i] ^= w[i]; + } +} + + + +/** + * @brief Retrieves the error polynomial error from the evaluations w of the ELP (Error Locator Polynomial) on all field elements. + * + * @param[out] error Array with the error + * @param[out] error_compact Array with the error in a compact form + * @param[in] w Array of size 2^PARAM_M + */ +void PQCLEAN_HQCRMRS128_AVX2_fft_retrieve_error_poly(uint8_t *error, const uint16_t *w) { + uint16_t gammas[PARAM_M - 1] = {0}; + uint16_t gammas_sums[1 << (PARAM_M - 1)] = {0}; + size_t k = 1 << (PARAM_M - 1); + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + error[0] ^= 1 ^ ((uint16_t) - w[0] >> 15); + error[0] ^= 1 ^ ((uint16_t) - w[k] >> 15); + + size_t index = PARAM_GF_MUL_ORDER; + + for (size_t i = 1 ; i < k ; ++i) { + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQCRMRS128_AVX2_gf_log(gammas_sums[i]); + error[index] ^= 1 ^ ((uint16_t) - w[i] >> 15); + + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQCRMRS128_AVX2_gf_log(gammas_sums[i] ^ 1); + error[index] ^= 1 ^ ((uint16_t) - w[k + i] >> 15); + } +} diff --git a/crypto_kem/hqc-rmrs-128/avx2/fft.h b/crypto_kem/hqc-rmrs-128/avx2/fft.h new file mode 100644 index 00000000..0155414a --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/fft.h @@ -0,0 +1,21 @@ +#ifndef FFT_H +#define FFT_H + + +/** + * @file fft.h + * Header file of fft.c + */ + + +#include + +#include +#include + +void PQCLEAN_HQCRMRS128_AVX2_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs); + +void PQCLEAN_HQCRMRS128_AVX2_fft_retrieve_error_poly(uint8_t *error, const uint16_t *w); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/avx2/gf.c b/crypto_kem/hqc-rmrs-128/avx2/gf.c new file mode 100644 index 00000000..1a2a17a5 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/gf.c @@ -0,0 +1,134 @@ +#include "gf.h" +#include "parameters.h" +#include +#include +#include +/** + * @file gf.c + * Galois field implementation with multiplication using the pclmulqdq instruction + */ + + +static uint16_t gf_reduce(uint64_t x, size_t deg_x); + + +/** + * Returns the integer i such that elt = a^i + * where a is the primitive element of GF(2^GF_M). + *@returns the logarithm of the given element + */ +uint16_t PQCLEAN_HQCRMRS128_AVX2_gf_log(uint16_t elt) { + return log[elt]; +} + + + +/** + * Reduces polynomial x modulo primitive polynomial GF_POLY. + * @returns x mod GF_POLY + * @param[in] x Polynomial of degree less than 64 + * @param[in] deg_x The degree of polynomial x + */ +static uint16_t gf_reduce(uint64_t x, size_t deg_x) { + // Compute the distance between the primitive polynomial first two set bits + size_t lz1 = __builtin_clz(PARAM_GF_POLY); + size_t lz2 = __builtin_clz(PARAM_GF_POLY ^ 1 << PARAM_M); + size_t dist = lz2 - lz1; + + // Deduce the number of steps of reduction + size_t steps = CEIL_DIVIDE(deg_x - (PARAM_M - 1), dist); + + // Reduce + for (size_t i = 0; i < steps; ++i) { + uint64_t mod = x >> PARAM_M; + x &= (1 << PARAM_M) - 1; + x ^= mod; + + size_t tz1 = 0; + uint16_t rmdr = PARAM_GF_POLY ^ 1; + for (size_t j = __builtin_popcount(PARAM_GF_POLY) - 2; j; --j) { + size_t tz2 = __builtin_ctz(rmdr); + size_t shift = tz2 - tz1; + mod <<= shift; + x ^= mod; + rmdr ^= 1 << tz2; + tz1 = tz2; + } + } + + return x; +} + + + +/** + * Multiplies two elements of GF(2^GF_M). + * @returns the product a*b + * @param[in] a Element of GF(2^GF_M) + * @param[in] b Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQCRMRS128_AVX2_gf_mul(uint16_t a, uint16_t b) { + __m128i va = _mm_cvtsi32_si128(a); + __m128i vb = _mm_cvtsi32_si128(b); + __m128i vab = _mm_clmulepi64_si128(va, vb, 0); + uint32_t ab = _mm_cvtsi128_si32(vab); + + return gf_reduce(ab, 2 * (PARAM_M - 1)); +} + + + +/** + * Squares an element of GF(2^GF_M). + * @returns a^2 + * @param[in] a Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQCRMRS128_AVX2_gf_square(uint16_t a) { + uint32_t b = a; + uint32_t s = b & 1; + for (size_t i = 1; i < PARAM_M; ++i) { + b <<= 1; + s ^= b & (1 << 2 * i); + } + + return gf_reduce(s, 2 * (PARAM_M - 1)); +} + + +/** + * Computes the inverse of an element of GF(2^GF_M) by fast exponentiation. + * @returns the inverse of a + * @param[in] a Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQCRMRS128_AVX2_gf_inverse(uint16_t a) { + size_t pow = (1 << PARAM_M) - 2; + uint16_t inv = 1; + + do { + if (pow & 1) { + inv = PQCLEAN_HQCRMRS128_AVX2_gf_mul(inv, a); + } + a = PQCLEAN_HQCRMRS128_AVX2_gf_square(a); + pow >>= 1; + } while (pow); + + return inv; +} + + + +/** + * Returns i modulo 2^GF_M-1. + * i must be less than 2*(2^GF_M-1). + * Therefore, the return value is either i or i-2^GF_M+1. + * @returns i mod (2^GF_M-1) + * @param[in] i The integer whose modulo is taken + */ +uint16_t PQCLEAN_HQCRMRS128_AVX2_gf_mod(uint16_t i) { + uint16_t tmp = i - PARAM_GF_MUL_ORDER; + + // mask = 0xffff if (i < GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & PARAM_GF_MUL_ORDER); +} diff --git a/crypto_kem/hqc-rmrs-128/avx2/gf.h b/crypto_kem/hqc-rmrs-128/avx2/gf.h new file mode 100644 index 00000000..9c072c07 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/gf.h @@ -0,0 +1,43 @@ +#ifndef GF_H +#define GF_H + + +/** + * @file gf.h + * Header file of gf.c + */ + +#include + +#include +#include + + +/** + * Powers of the root alpha of 1 + x^2 + x^3 + x^4 + x^8. + * The last two elements are needed by the PQCLEAN_HQCRMRS128_AVX2_gf_mul function + * (for example if both elements to multiply are zero). + */ +static const uint16_t exp [258] = { 1, 2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240, 253, 231, 211, 187, 107, 214, 177, 127, 254, 225, 223, 163, 91, 182, 113, 226, 217, 175, 67, 134, 17, 34, 68, 136, 13, 26, 52, 104, 208, 189, 103, 206, 129, 31, 62, 124, 248, 237, 199, 147, 59, 118, 236, 197, 151, 51, 102, 204, 133, 23, 46, 92, 184, 109, 218, 169, 79, 158, 33, 66, 132, 21, 42, 84, 168, 77, 154, 41, 82, 164, 85, 170, 73, 146, 57, 114, 228, 213, 183, 115, 230, 209, 191, 99, 198, 145, 63, 126, 252, 229, 215, 179, 123, 246, 241, 255, 227, 219, 171, 75, 150, 49, 98, 196, 149, 55, 110, 220, 165, 87, 174, 65, 130, 25, 50, 100, 200, 141, 7, 14, 28, 56, 112, 224, 221, 167, 83, 166, 81, 162, 89, 178, 121, 242, 249, 239, 195, 155, 43, 86, 172, 69, 138, 9, 18, 36, 72, 144, 61, 122, 244, 245, 247, 243, 251, 235, 203, 139, 11, 22, 44, 88, 176, 125, 250, 233, 207, 131, 27, 54, 108, 216, 173, 71, 142, 1, 2, 4 }; + + + +/** + * Logarithm of elements of GF(2^8) to the base alpha (root of 1 + x^2 + x^3 + x^4 + x^8). + * The logarithm of 0 is set to 0 by convention. + */ +static const uint16_t log [256] = { 0, 0, 1, 25, 2, 50, 26, 198, 3, 223, 51, 238, 27, 104, 199, 75, 4, 100, 224, 14, 52, 141, 239, 129, 28, 193, 105, 248, 200, 8, 76, 113, 5, 138, 101, 47, 225, 36, 15, 33, 53, 147, 142, 218, 240, 18, 130, 69, 29, 181, 194, 125, 106, 39, 249, 185, 201, 154, 9, 120, 77, 228, 114, 166, 6, 191, 139, 98, 102, 221, 48, 253, 226, 152, 37, 179, 16, 145, 34, 136, 54, 208, 148, 206, 143, 150, 219, 189, 241, 210, 19, 92, 131, 56, 70, 64, 30, 66, 182, 163, 195, 72, 126, 110, 107, 58, 40, 84, 250, 133, 186, 61, 202, 94, 155, 159, 10, 21, 121, 43, 78, 212, 229, 172, 115, 243, 167, 87, 7, 112, 192, 247, 140, 128, 99, 13, 103, 74, 222, 237, 49, 197, 254, 24, 227, 165, 153, 119, 38, 184, 180, 124, 17, 68, 146, 217, 35, 32, 137, 46, 55, 63, 209, 91, 149, 188, 207, 205, 144, 135, 151, 178, 220, 252, 190, 97, 242, 86, 211, 171, 20, 42, 93, 158, 132, 60, 57, 83, 71, 109, 65, 162, 31, 45, 67, 216, 183, 123, 164, 118, 196, 23, 73, 236, 127, 12, 111, 246, 108, 161, 59, 82, 41, 157, 85, 170, 251, 96, 134, 177, 187, 204, 62, 90, 203, 89, 95, 176, 156, 169, 160, 81, 11, 245, 22, 235, 122, 117, 44, 215, 79, 174, 213, 233, 230, 231, 173, 232, 116, 214, 244, 234, 168, 80, 88, 175 }; + + +uint16_t PQCLEAN_HQCRMRS128_AVX2_gf_log(uint16_t elt); + +uint16_t PQCLEAN_HQCRMRS128_AVX2_gf_mul(uint16_t a, uint16_t b); + +uint16_t PQCLEAN_HQCRMRS128_AVX2_gf_square(uint16_t a); + +uint16_t PQCLEAN_HQCRMRS128_AVX2_gf_inverse(uint16_t a); + +uint16_t PQCLEAN_HQCRMRS128_AVX2_gf_mod(uint16_t i); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/avx2/gf2x.c b/crypto_kem/hqc-rmrs-128/avx2/gf2x.c new file mode 100644 index 00000000..d718fd39 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/gf2x.c @@ -0,0 +1,558 @@ +#include "gf2x.h" +#include "parameters.h" +#include +#include +#include + +/** + * \file gf2x.c + * \brief AVX2 implementation of multiplication of two polynomials + */ + + +// sizes for Toom-Cook +#define T_TM3_3W_256 32 +#define T_TM3_3W_64 128 + +#define VEC_N_ARRAY_SIZE_VEC CEIL_DIVIDE(PARAM_N, 256) /*!< The number of needed vectors to store PARAM_N bits*/ +#define WORD 64 +#define LAST64 (PARAM_N >> 6) +uint64_t a1_times_a2[2 * VEC_N_256_SIZE_64 + 1]; +uint64_t tmp_reduce[VEC_N_ARRAY_SIZE_VEC << 2]; +__m256i *o256 = (__m256i *) tmp_reduce; +uint64_t bloc64[PARAM_OMEGA_R]; // Allocation with the biggest possible weight +uint64_t bit64[PARAM_OMEGA_R]; // Allocation with the biggest possible weight + + +static inline void reduce(uint64_t *o, const uint64_t *a); +inline static void karat_mult_1(__m128i *C, __m128i *A, __m128i *B); +inline static void karat_mult_2(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_4(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_8(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_16(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_32(__m256i *C, __m256i *A, __m256i *B); +static inline void divByXplus1(__m256i *out, __m256i *in, int size); +static void TOOM3Mult(uint64_t *Out, const uint64_t *A, const uint64_t *B); + + + +/** + * @brief Compute o(x) = a(x) mod \f$ X^n - 1\f$ + * + * This function computes the modular reduction of the polynomial a(x) + * + * @param[out] o Pointer to the result + * @param[in] a Pointer to the polynomial a(x) + */ +static inline void reduce(uint64_t *o, const uint64_t *a) { + __m256i r256, carry256; + __m256i *a256 = (__m256i *) a; + static const int32_t dec64 = PARAM_N & 0x3f; + static const int32_t d0 = WORD - dec64; + int32_t i, i2; + + for (i = LAST64 ; i < (PARAM_N >> 5) - 4 ; i += 4) { + r256 = _mm256_lddqu_si256((__m256i const *) (& a[i])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_lddqu_si256((__m256i const *) (& a[i + 1])); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = a256[i2] ^ r256; + } + + r256 = (__m256i) { + a[i], a[i + 1], 0x0UL, 0x0UL + }; + carry256 = _mm256_lddqu_si256((__m256i const *) (& a[i + 1])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = (a256[i2] ^ r256); + tmp_reduce[LAST64] &= RED_MASK; + memcpy(o, tmp_reduce, VEC_N_SIZE_BYTES); +} + +/** + * @brief Compute C(x) = A(x)*B(x) + * A(x) and B(x) are stored in 128-bit registers + * This function computes A(x)*B(x) using Karatsuba + * + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_1(__m128i *C, __m128i *A, __m128i *B) { + __m128i D1[2]; + __m128i D0[2], D2[2]; + __m128i Al = _mm_loadu_si128(A); + __m128i Ah = _mm_loadu_si128(A + 1); + __m128i Bl = _mm_loadu_si128(B); + __m128i Bh = _mm_loadu_si128(B + 1); + + // Compute Al.Bl=D0 + __m128i DD0 = _mm_clmulepi64_si128(Al, Bl, 0); + __m128i DD2 = _mm_clmulepi64_si128(Al, Bl, 0x11); + __m128i AAlpAAh = _mm_xor_si128(Al, _mm_shuffle_epi32(Al, 0x4e)); + __m128i BBlpBBh = _mm_xor_si128(Bl, _mm_shuffle_epi32(Bl, 0x4e)); + __m128i DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D0[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D0[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Compute Ah.Bh=D2 + DD0 = _mm_clmulepi64_si128(Ah, Bh, 0); + DD2 = _mm_clmulepi64_si128(Ah, Bh, 0x11); + AAlpAAh = _mm_xor_si128(Ah, _mm_shuffle_epi32(Ah, 0x4e)); + BBlpBBh = _mm_xor_si128(Bh, _mm_shuffle_epi32(Bh, 0x4e)); + DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D2[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D2[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Compute AlpAh.BlpBh=D1 + // Initialisation of AlpAh and BlpBh + __m128i AlpAh = _mm_xor_si128(Al, Ah); + __m128i BlpBh = _mm_xor_si128(Bl, Bh); + DD0 = _mm_clmulepi64_si128(AlpAh, BlpBh, 0); + DD2 = _mm_clmulepi64_si128(AlpAh, BlpBh, 0x11); + AAlpAAh = _mm_xor_si128(AlpAh, _mm_shuffle_epi32(AlpAh, 0x4e)); + BBlpBBh = _mm_xor_si128(BlpBh, _mm_shuffle_epi32(BlpBh, 0x4e)); + DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D1[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D1[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Final comutation of C + __m128i middle = _mm_xor_si128(D0[1], D2[0]); + C[0] = D0[0]; + C[1] = middle ^ D0[0] ^ D1[0]; + C[2] = middle ^ D1[1] ^ D2[1]; + C[3] = D2[1]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_2(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[2], D1[2], D2[2], SAA, SBB; + __m128i *A128 = (__m128i *)A, *B128 = (__m128i *)B; + + karat_mult_1((__m128i *) D0, A128, B128); + karat_mult_1((__m128i *) D2, A128 + 2, B128 + 2); + + SAA = A[0] ^ A[1]; + SBB = B[0] ^ B[1]; + + karat_mult_1((__m128i *) D1, (__m128i *) &SAA, (__m128i *) &SBB); + __m256i middle = _mm256_xor_si256(D0[1], D2[0]); + + C[0] = D0[0]; + C[1] = middle ^ D0[0] ^ D1[0]; + C[2] = middle ^ D1[1] ^ D2[1]; + C[3] = D2[1]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_4(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[4], D1[4], D2[4], SAA[2], SBB[2]; + + karat_mult_2( D0, A, B); + karat_mult_2(D2, A + 2, B + 2); + + SAA[0] = A[0] ^ A[2]; + SBB[0] = B[0] ^ B[2]; + SAA[1] = A[1] ^ A[3]; + SBB[1] = B[1] ^ B[3]; + + karat_mult_2( D1, SAA, SBB); + + __m256i middle0 = _mm256_xor_si256(D0[2], D2[0]); + __m256i middle1 = _mm256_xor_si256(D0[3], D2[1]); + + C[0] = D0[0]; + C[1] = D0[1]; + C[2] = middle0 ^ D0[0] ^ D1[0]; + C[3] = middle1 ^ D0[1] ^ D1[1]; + C[4] = middle0 ^ D1[2] ^ D2[2]; + C[5] = middle1 ^ D1[3] ^ D2[3]; + C[6] = D2[2]; + C[7] = D2[3]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_8(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[8], D1[8], D2[8], SAA[4], SBB[4]; + + karat_mult_4( D0, A, B); + karat_mult_4(D2, A + 4, B + 4); + + for (int32_t i = 0 ; i < 4 ; i++) { + int is = i + 4; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_4(D1, SAA, SBB); + + for (int32_t i = 0 ; i < 4 ; i++) { + int32_t is = i + 4; + int32_t is2 = is + 4; + int32_t is3 = is2 + 4; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_16(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[16], D1[16], D2[16], SAA[8], SBB[8]; + + karat_mult_8( D0, A, B); + karat_mult_8(D2, A + 8, B + 8); + + for (int32_t i = 0 ; i < 8 ; i++) { + int32_t is = i + 8; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_8( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 8 ; i++) { + int32_t is = i + 8; + int32_t is2 = is + 8; + int32_t is3 = is2 + 8; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_32(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[32], D1[32], D2[32], SAA[16], SBB[16]; + + karat_mult_16( D0, A, B); + karat_mult_16(D2, A + 16, B + 16); + + for (int32_t i = 0 ; i < 16 ; i++) { + int is = i + 16; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_16( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 16 ; i++) { + int32_t is = i + 16; + int32_t is2 = is + 16; + int32_t is3 = is2 + 16; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + +/** + * @brief Compute B(x) = A(x)/(x+1) + * + * This function computes A(x)/(x+1) using a Quercia like algorithm + * @param[out] out Pointer to the result + * @param[in] in Pointer to the polynomial A(x) + * @param[in] size used to define the number of coeeficients of A + */ +static inline void divByXplus1(__m256i *out, __m256i *in, int size) { + uint64_t *A = (uint64_t *) in; + uint64_t *B = (uint64_t *) out; + + B[0] = A[0]; + + for (int32_t i = 1 ; i < 2 * (size << 2) ; i++) { + B[i] = B[i - 1] ^ A[i]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) using TOOM3Mult + * + * This function computes A(x)*B(x) using TOOM-COOK3 Multiplication + * last multiplication are done using Karatsuba + * @param[out] Out Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +static void TOOM3Mult(uint64_t *Out, const uint64_t *A, const uint64_t *B) { + static __m256i U0[T_TM3_3W_256], V0[T_TM3_3W_256], U1[T_TM3_3W_256], V1[T_TM3_3W_256], U2[T_TM3_3W_256], V2[T_TM3_3W_256]; + static __m256i W0[2 * (T_TM3_3W_256)], W1[2 * (T_TM3_3W_256)], W2[2 * (T_TM3_3W_256)], W3[2 * (T_TM3_3W_256)], W4[2 * (T_TM3_3W_256)]; + static __m256i tmp[2 * (T_TM3_3W_256)]; + static __m256i ro256[6 * (T_TM3_3W_256)]; + const __m256i zero = (__m256i) { + 0ul, 0ul, 0ul, 0ul + }; + int32_t T2 = T_TM3_3W_64 << 1; + + for (int32_t i = 0 ; i < T_TM3_3W_256 - 1 ; i++) { + int32_t i4 = i << 2; + int32_t i42 = i4 - 2; + U0[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4])); + V0[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4])); + U1[i] = _mm256_lddqu_si256((__m256i const *)(& A[i42 + T_TM3_3W_64])); + V1[i] = _mm256_lddqu_si256((__m256i const *)(& B[i42 + T_TM3_3W_64])); + U2[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4 + T2 - 4])); + V2[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4 + T2 - 4])); + } + + for (int32_t i = T_TM3_3W_256 - 1 ; i < T_TM3_3W_256 ; i++) { + int32_t i4 = i << 2; + int32_t i41 = i4 + 1; + U0[i] = (__m256i) { + A[i4], A[i41], 0x0ul, 0x0ul + }; + V0[i] = (__m256i) { + B[i4], B[i41], 0x0ul, 0x0ul + }; + U1[i] = (__m256i) { + A[i4 + T_TM3_3W_64 - 2], A[i41 + T_TM3_3W_64 - 2], 0x0ul, 0x0ul + }; + V1[i] = (__m256i) { + B[i4 + T_TM3_3W_64 - 2], B[i41 + T_TM3_3W_64 - 2], 0x0ul, 0x0ul + }; + U2[i] = (__m256i) { + A[i4 - 4 + T2], A[i4 - 3 + T2], 0x0ul, 0x0ul + }; + V2[i] = (__m256i) { + B[i4 - 4 + T2], B[i4 - 3 + T2], 0x0ul, 0x0ul + }; + } + + // Evaluation phase : x= X^64 + // P(X): P0=(0); P1=(1); P2=(x); P3=(1+x); P4=(\infty) + // Evaluation: 5*2 add, 2*2 shift; 5 mul (n) + //W3 = U2 + U1 + U0 ; W2 = V2 + V1 + V0 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W3[i] = U0[i] ^ U1[i] ^ U2[i]; + W2[i] = V0[i] ^ V1[i] ^ V2[i]; + } + + //W1 = W2 * W3 + karat_mult_32( W1, W2, W3); + + //W0 =(U1 + U2*x)*x ; W4 =(V1 + V2*x)*x (SIZE = T_TM3_3W_256 !) + int64_t *U1_64 = ((int64_t *) U1); + int64_t *U2_64 = ((int64_t *) U2); + + int64_t *V1_64 = ((int64_t *) V1); + int64_t *V2_64 = ((int64_t *) V2); + + W0[0] = _mm256_set_epi64x(U1_64[2] ^ U2_64[1], U1_64[1] ^ U2_64[0], U1_64[0], 0); + W4[0] = _mm256_set_epi64x(V1_64[2] ^ V2_64[1], V1_64[1] ^ V2_64[0], V1_64[0], 0); + + U1_64 = ((int64_t *) U1); + U2_64 = ((int64_t *) U2); + + V1_64 = ((int64_t *) V1); + V2_64 = ((int64_t *) V2); + + for (int32_t i = 1 ; i < T_TM3_3W_256 ; i++) { + int i4 = i << 2; + W0[i] = _mm256_lddqu_si256((__m256i const *)(& U1_64[i4 - 1])); + W0[i] ^= _mm256_lddqu_si256((__m256i const *)(& U2_64[i4 - 2])); + + W4[i] = _mm256_lddqu_si256((__m256i const *)(& V1_64[i4 - 1])); + W4[i] ^= _mm256_lddqu_si256((__m256i const *)(& V2_64[i4 - 2])); + } + + //W3 = W3 + W0 ; W2 = W2 + W4 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W3[i] ^= W0[i]; + W2[i] ^= W4[i]; + } + + //W0 = W0 + U0 ; W4 = W4 + V0 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W0[i] ^= U0[i]; + W4[i] ^= V0[i]; + } + + //W3 = W3 * W2 ; W2 = W0 * W4 + karat_mult_32(tmp, W3, W2); + + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W3[i] = tmp[i]; + } + + karat_mult_32(W2, W0, W4); + //W4 = U2 * V2 ; W0 = U0 * V0 + karat_mult_32(W4, U2, V2); + karat_mult_32(W0, U0, V0); + + // Interpolation phase + // 9 add, 1 shift, 1 Smul, 2 Sdiv (2n) + //W3 = W3 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W3[i] ^= W2[i]; + } + + //W1 = W1 + W0 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W1[i] ^= W0[i]; + } + + //W2 =(W2 + W0)/x -> x = X^64 + U1_64 = ((int64_t *) W2); + U2_64 = ((int64_t *) W0); + for (int32_t i = 0 ; i < (T_TM3_3W_256 << 1) ; i++) { + int32_t i4 = i << 2; + W2[i] = _mm256_lddqu_si256((__m256i const *)(& U1_64[i4 + 1])); + W2[i] ^= _mm256_lddqu_si256((__m256i const *)(& U2_64[i4 + 1])); + } + + //W2 =(W2 + W3 + W4*(x^3+1))/(x+1) + U1_64 = ((int64_t *) W4); + __m256i *U1_256 = (__m256i *) (U1_64 + 1); + tmp[0] = W2[0] ^ W3[0] ^ W4[0] ^ (__m256i) { + 0x0ul, 0x0ul, 0x0ul, U1_64[0] + }; + + for (int32_t i = 1 ; i < (T_TM3_3W_256 << 1) - 1 ; i++) { + tmp[i] = W2[i] ^ W3[i] ^ W4[i] ^ _mm256_lddqu_si256(&U1_256[i - 1]); + } + + divByXplus1(W2, tmp, T_TM3_3W_256); + W2[2 * (T_TM3_3W_256) - 1] = zero; + + //W3 =(W3 + W1)/(x*(x+1)) + U1_64 = (int64_t *) W3; + U1_256 = (__m256i *) (U1_64 + 1); + + U2_64 = (int64_t *) W1; + __m256i *U2_256 = (__m256i *) (U2_64 + 1); + + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) - 1 ; i++) { + tmp[i] = _mm256_lddqu_si256(&U1_256[i]) ^ _mm256_lddqu_si256(&U2_256[i]); + } + + divByXplus1(W3, tmp, T_TM3_3W_256); + W3[2 * (T_TM3_3W_256) - 1] = zero; + + //W1 = W1 + W4 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W1[i] ^= W2[i] ^ W4[i]; + } + + //W2 = W2 + W3 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W2[i] ^= W3[i]; + } + + // Recomposition + //W = W0+ W1*x+ W2*x^2+ W3*x^3 + W4*x^4 + //W0, W1, W4 of size 2*T_TM3_3W_256, W2 and W3 of size 2*(T_TM3_3W_256) + for (int32_t i = 0 ; i < (T_TM3_3W_256 << 1) - 1 ; i++) { + ro256[i] = W0[i]; + ro256[i + 2 * T_TM3_3W_256 - 1] = W2[i]; + ro256[i + 4 * T_TM3_3W_256 - 2] = W4[i]; + } + + ro256[(T_TM3_3W_256 << 1) - 1] = W0[(T_TM3_3W_256 << 1) - 1] ^ W2[0]; + ro256[(T_TM3_3W_256 << 2) - 2] = W2[(T_TM3_3W_256 << 1) - 1] ^ W4[0]; + ro256[(T_TM3_3W_256 * 6) - 3] = W4[(T_TM3_3W_256 << 1) - 1]; + + U1_64 = ((int64_t *) &ro256[T_TM3_3W_256]); + U1_256 = (__m256i *) (U1_64 - 2); + + U2_64 = ((int64_t *) &ro256[3 * T_TM3_3W_256 - 1]); + U2_256 = (__m256i *) (U2_64 - 2); + + for (int32_t i = 0 ; i < T_TM3_3W_256 << 1 ; i++) { + _mm256_storeu_si256(&U1_256[i], W1[i] ^ _mm256_lddqu_si256(&U1_256[i])); + _mm256_storeu_si256(&U2_256[i], W3[i] ^ _mm256_loadu_si256(&U2_256[i])); + } + + for (int32_t i = 0 ; i < 6 * T_TM3_3W_256 - 2 ; i++) { + uint64_t *out64 = Out + (i << 2); + _mm256_storeu_si256((__m256i *)out64, ro256[i]); + } +} + + +/** + * @brief Multiply two polynomials modulo \f$ X^n - 1\f$. + * + * This functions multiplies a sparse polynomial a1 (of Hamming weight equal to weight) + * and a dense polynomial a2. The multiplication is done modulo \f$ X^n - 1\f$. + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to a polynomial + * @param[in] a2 Pointer to a polynomial + */ +void PQCLEAN_HQCRMRS128_AVX2_vect_mul(uint64_t *o, const uint64_t *a1, const uint64_t *a2) { + TOOM3Mult(a1_times_a2, a1, a2); + reduce(o, a1_times_a2); + + // clear all + memset(a1_times_a2, 0, (VEC_N_SIZE_64 << 1) * sizeof(uint64_t)); +} diff --git a/crypto_kem/hqc-rmrs-128/avx2/gf2x.h b/crypto_kem/hqc-rmrs-128/avx2/gf2x.h new file mode 100644 index 00000000..0f4473e5 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/gf2x.h @@ -0,0 +1,17 @@ +#ifndef GF2X_H +#define GF2X_H + + +/** + * @file gf2x.h + * @brief Header file for gf2x.c + */ + +#include + +#include + +void PQCLEAN_HQCRMRS128_AVX2_vect_mul(uint64_t *o, const uint64_t *a1, const uint64_t *a2); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/avx2/hqc.c b/crypto_kem/hqc-rmrs-128/avx2/hqc.c new file mode 100644 index 00000000..597c9454 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/hqc.c @@ -0,0 +1,138 @@ +#include "code.h" +#include "gf2x.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +/** + * @file hqc.c + * @brief Implementation of hqc.h + */ + + + +/** + * @brief Keygen of the HQC_PKE IND_CPA scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS128_AVX2_hqc_pke_keygen(unsigned char *pk, unsigned char *sk) { + AES_XOF_struct sk_seedexpander; + AES_XOF_struct pk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + uint8_t pk_seed[SEED_BYTES] = {0}; + uint64_t x[VEC_N_256_SIZE_64] = {0}; + uint64_t y[VEC_N_256_SIZE_64] = {0}; + uint64_t h[VEC_N_256_SIZE_64] = {0}; + uint64_t s[VEC_N_256_SIZE_64] = {0}; + + // Create seed_expanders for public key and secret key + randombytes(sk_seed, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + randombytes(pk_seed, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute secret key + PQCLEAN_HQCRMRS128_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQCRMRS128_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, y, PARAM_OMEGA); + + // Compute public key + PQCLEAN_HQCRMRS128_AVX2_vect_set_random(&pk_seedexpander, h); + PQCLEAN_HQCRMRS128_AVX2_vect_mul(s, y, h); + PQCLEAN_HQCRMRS128_AVX2_vect_add(s, x, s, VEC_N_256_SIZE_64); + + // Parse keys to string + PQCLEAN_HQCRMRS128_AVX2_hqc_public_key_to_string(pk, pk_seed, s); + PQCLEAN_HQCRMRS128_AVX2_hqc_secret_key_to_string(sk, sk_seed, pk); + +} + + + +/** + * @brief Encryption of the HQC_PKE IND_CPA scheme + * + * The cihertext is composed of vectors u and v. + * + * @param[out] u Vector u (first part of the ciphertext) + * @param[out] v Vector v (second part of the ciphertext) + * @param[in] m Vector representing the message to encrypt + * @param[in] theta Seed used to derive randomness required for encryption + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS128_AVX2_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk) { + AES_XOF_struct seedexpander; + uint64_t h[VEC_N_256_SIZE_64] = {0}; + uint64_t s[VEC_N_256_SIZE_64] = {0}; + uint64_t r1[VEC_N_256_SIZE_64] = {0}; + uint64_t r2[VEC_N_256_SIZE_64] = {0}; + uint64_t e[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp1[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_256_SIZE_64] = {0}; + + // Create seed_expander from theta + seedexpander_init(&seedexpander, theta, theta + 32, SEEDEXPANDER_MAX_LENGTH); + + // Retrieve h and s from public key + PQCLEAN_HQCRMRS128_AVX2_hqc_public_key_from_string(h, s, pk); + + // Generate r1, r2 and e + PQCLEAN_HQCRMRS128_AVX2_vect_set_random_fixed_weight(&seedexpander, r1, PARAM_OMEGA_R); + PQCLEAN_HQCRMRS128_AVX2_vect_set_random_fixed_weight(&seedexpander, r2, PARAM_OMEGA_R); + PQCLEAN_HQCRMRS128_AVX2_vect_set_random_fixed_weight(&seedexpander, e, PARAM_OMEGA_E); + + // Compute u = r1 + r2.h + PQCLEAN_HQCRMRS128_AVX2_vect_mul(u, r2, h); + PQCLEAN_HQCRMRS128_AVX2_vect_add(u, r1, u, VEC_N_256_SIZE_64); + + // Compute v = m.G by encoding the message + PQCLEAN_HQCRMRS128_AVX2_code_encode(v, m); + PQCLEAN_HQCRMRS128_AVX2_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + + // Compute v = m.G + s.r2 + e + PQCLEAN_HQCRMRS128_AVX2_vect_mul(tmp2, r2, s); + PQCLEAN_HQCRMRS128_AVX2_vect_add(tmp2, e, tmp2, VEC_N_256_SIZE_64); + PQCLEAN_HQCRMRS128_AVX2_vect_add(tmp2, tmp1, tmp2, VEC_N_256_SIZE_64); + PQCLEAN_HQCRMRS128_AVX2_vect_resize(v, PARAM_N1N2, tmp2, PARAM_N); + +} + + + +/** + * @brief Decryption of the HQC_PKE IND_CPA scheme + * + * @param[out] m Vector representing the decrypted message + * @param[in] u Vector u (first part of the ciphertext) + * @param[in] v Vector v (second part of the ciphertext) + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS128_AVX2_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk) { + uint64_t x[VEC_N_256_SIZE_64] = {0}; + uint64_t y[VEC_N_256_SIZE_64] = {0}; + uint8_t pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t tmp1[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_256_SIZE_64] = {0}; + + // Retrieve x, y, pk from secret key + PQCLEAN_HQCRMRS128_AVX2_hqc_secret_key_from_string(x, y, pk, sk); + + // Compute v - u.y + PQCLEAN_HQCRMRS128_AVX2_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + PQCLEAN_HQCRMRS128_AVX2_vect_mul(tmp2, y, u); + PQCLEAN_HQCRMRS128_AVX2_vect_add(tmp2, tmp1, tmp2, VEC_N_256_SIZE_64); + + + // Compute m by decoding v - u.y + PQCLEAN_HQCRMRS128_AVX2_code_decode(m, tmp2); +} diff --git a/crypto_kem/hqc-rmrs-128/avx2/hqc.h b/crypto_kem/hqc-rmrs-128/avx2/hqc.h new file mode 100644 index 00000000..b3383093 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/hqc.h @@ -0,0 +1,21 @@ +#ifndef HQC_H +#define HQC_H + + +/** + * @file hqc.h + * @brief Functions of the HQC_PKE IND_CPA scheme + */ + +#include + +#include + +void PQCLEAN_HQCRMRS128_AVX2_hqc_pke_keygen(unsigned char *pk, unsigned char *sk); + +void PQCLEAN_HQCRMRS128_AVX2_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk); + +void PQCLEAN_HQCRMRS128_AVX2_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/avx2/kem.c b/crypto_kem/hqc-rmrs-128/avx2/kem.c new file mode 100644 index 00000000..cb64bad6 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/kem.c @@ -0,0 +1,138 @@ +#include "api.h" +#include "fips202.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "sha2.h" +#include "vector.h" +#include +#include +/** + * @file kem.c + * @brief Implementation of api.h + */ + + + +/** + * @brief Keygen of the HQC_KEM IND_CAA2 scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + * @returns 0 if keygen is successful + */ +int PQCLEAN_HQCRMRS128_AVX2_crypto_kem_keypair(unsigned char *pk, unsigned char *sk) { + + PQCLEAN_HQCRMRS128_AVX2_hqc_pke_keygen(pk, sk); + return 0; +} + + + +/** + * @brief Encapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ct String containing the ciphertext + * @param[out] ss String containing the shared secret + * @param[in] pk String containing the public key + * @returns 0 if encapsulation is successful + */ +int PQCLEAN_HQCRMRS128_AVX2_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk) { + + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint64_t u[VEC_N_256_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Computing m + PQCLEAN_HQCRMRS128_AVX2_vect_set_random_from_randombytes(m); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m + PQCLEAN_HQCRMRS128_AVX2_hqc_pke_encrypt(u, v, m, theta, pk); + + // Computing d + sha512(d, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Computing ciphertext + PQCLEAN_HQCRMRS128_AVX2_hqc_ciphertext_to_string(ct, u, v, d); + + + return 0; +} + + + +/** + * @brief Decapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ss String containing the shared secret + * @param[in] ct String containing the cipĥertext + * @param[in] sk String containing the secret key + * @returns 0 if decapsulation is successful, -1 otherwise + */ +int PQCLEAN_HQCRMRS128_AVX2_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk) { + + int8_t result = -1; + uint64_t u[VEC_N_256_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t u2[VEC_N_256_SIZE_64] = {0}; + uint64_t v2[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d2[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Retrieving u, v and d from ciphertext + PQCLEAN_HQCRMRS128_AVX2_hqc_ciphertext_from_string(u, v, d, ct); + + // Retrieving pk from sk + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); + + // Decryting + PQCLEAN_HQCRMRS128_AVX2_hqc_pke_decrypt(m, u, v, sk); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m' + PQCLEAN_HQCRMRS128_AVX2_hqc_pke_encrypt(u2, v2, m, theta, pk); + + // Computing d' + sha512(d2, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Abort if c != c' or d != d' + result = (PQCLEAN_HQCRMRS128_AVX2_vect_compare(u, u2, VEC_N_SIZE_BYTES) == 0 && PQCLEAN_HQCRMRS128_AVX2_vect_compare(v, v2, VEC_N1N2_SIZE_BYTES) == 0 && PQCLEAN_HQCRMRS128_AVX2_vect_compare((uint64_t *)d, (uint64_t *)d2, SHA512_BYTES) == 0); + for (size_t i = 0 ; i < SHARED_SECRET_BYTES ; i++) { + ss[i] = result * ss[i]; + } + result--; + + + return result; +} diff --git a/crypto_kem/hqc-rmrs-128/avx2/parameters.h b/crypto_kem/hqc-rmrs-128/avx2/parameters.h new file mode 100644 index 00000000..ab9c1488 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/parameters.h @@ -0,0 +1,109 @@ +#ifndef HQC_PARAMETERS_H +#define HQC_PARAMETERS_H + + +/** + * @file parameters.h + * @brief Parameters of the HQC_KEM IND-CCA2 scheme + */ + +#include "api.h" +#include "api.h" + + +#define CEIL_DIVIDE(a, b) (((a)/(b)) + ((a) % (b) == 0 ? 0 : 1)) /*!< Divide a by b and ceil the result*/ +#define BITMASK(a, size) ((1UL << ((a) % (size))) - 1) /*!< Create a mask*/ + + +/* + #define PARAM_N Define the parameter n of the scheme + #define PARAM_N1 Define the parameter n1 of the scheme (length of Reed-Solomon code) + #define PARAM_N2 Define the parameter n2 of the scheme (length of Duplicated Reed-Muller code) + #define PARAM_N1N2 Define the length in bits of the Concatenated code + #define PARAM_OMEGA Define the parameter omega of the scheme + #define PARAM_OMEGA_E Define the parameter omega_e of the scheme + #define PARAM_OMEGA_R Define the parameter omega_r of the scheme + #define PARAM_SECURITY Define the security level corresponding to the chosen parameters + #define PARAM_DFR_EXP Define the decryption failure rate corresponding to the chosen parameters + + #define SECRET_KEY_BYTES Define the size of the secret key in bytes + #define PUBLIC_KEY_BYTES Define the size of the public key in bytes + #define SHARED_SECRET_BYTES Define the size of the shared secret in bytes + #define CIPHERTEXT_BYTES Define the size of the ciphertext in bytes + + #define UTILS_REJECTION_THRESHOLD Define the rejection threshold used to generate given weight vectors (see vector_set_random_fixed_weight function) + #define VEC_N_SIZE_BYTES Define the size of the array used to store a PARAM_N sized vector in bytes + #define VEC_K_SIZE_BYTES Define the size of the array used to store a PARAM_K sized vector in bytes + #define VEC_N1Y_SIZE_BYTES Define the size of the array used to store a PARAM_N1 sized vector in bytes + #define VEC_N1N2_SIZE_BYTES Define the size of the array used to store a PARAM_N1N2 sized vector in bytes + + #define VEC_N_SIZE_64 Define the size of the array used to store a PARAM_N sized vector in 64 bits + #define VEC_K_SIZE_64 Define the size of the array used to store a PARAM_K sized vector in 64 bits + #define VEC_N1_SIZE_64 Define the size of the array used to store a PARAM_N1 sized vector in 64 bits + #define VEC_N1N2_SIZE_64 Define the size of the array used to store a PARAM_N1N2 sized vector in 64 bits + + #define VEC_N_256_SIZE_64 Define the size of the array of 64 bits elements used to store an array of size PARAM_N considered as elements of 256 bits + #define VEC_N1N2_256_SIZE_64 Define the size of the array of 64 bits elements used to store an array of size PARAM_N1N2 considered as elements of 256 bits + + #define PARAM_DELTA Define the parameter delta of the scheme (correcting capacity of the Reed-Solomon code) + #define PARAM_M Define a positive integer + #define PARAM_GF_POLY Generator polynomial of galois field GF(2^PARAM_M), represented in hexadecimial form + #define PARAM_GF_MUL_ORDER Define the size of the multiplicative group of GF(2^PARAM_M), i.e 2^PARAM_M -1 + #define PARAM_K Define the size of the information bits of the Reed-Solomon code + #define PARAM_G Define the size of the generator polynomial of Reed-Solomon code + #define PARAM_FFT The additive FFT takes a 2^PARAM_FFT polynomial as input + We use the FFT to compute the roots of sigma, whose degree if PARAM_DELTA=24 + The smallest power of 2 greater than 24+1 is 32=2^5 + #define RS_POLY_COEFS Coefficients of the generator polynomial of the Reed-Solomon code + + #define RED_MASK A mask fot the higher bits of a vector + #define SHA512_BYTES Define the size of SHA512 output in bytes + #define SEED_BYTES Define the size of the seed in bytes + #define SEEDEXPANDER_MAX_LENGTH Define the seed expander max length +*/ + +#define PARAM_N 20533 +#define PARAM_N1 80 +#define PARAM_N2 256 +#define PARAM_N1N2 20480 +#define PARAM_OMEGA 67 +#define PARAM_OMEGA_E 77 +#define PARAM_OMEGA_R 77 +#define PARAM_SECURITY 128 +#define PARAM_DFR_EXP 128 + +#define SECRET_KEY_BYTES PQCLEAN_HQCRMRS128_AVX2_CRYPTO_SECRETKEYBYTES +#define PUBLIC_KEY_BYTES PQCLEAN_HQCRMRS128_AVX2_CRYPTO_PUBLICKEYBYTES +#define SHARED_SECRET_BYTES PQCLEAN_HQCRMRS128_AVX2_CRYPTO_BYTES +#define CIPHERTEXT_BYTES PQCLEAN_HQCRMRS128_AVX2_CRYPTO_CIPHERTEXTBYTES + +#define UTILS_REJECTION_THRESHOLD 16775461 +#define VEC_N_SIZE_BYTES CEIL_DIVIDE(PARAM_N, 8) +#define VEC_K_SIZE_BYTES PARAM_K +#define VEC_N1_SIZE_BYTES PARAM_N1 +#define VEC_N1N2_SIZE_BYTES CEIL_DIVIDE(PARAM_N1N2, 8) + +#define VEC_N_SIZE_64 CEIL_DIVIDE(PARAM_N, 64) +#define VEC_K_SIZE_64 CEIL_DIVIDE(PARAM_K, 8) +#define VEC_N1_SIZE_64 CEIL_DIVIDE(PARAM_N1, 8) +#define VEC_N1N2_SIZE_64 CEIL_DIVIDE(PARAM_N1N2, 64) + +#define PARAM_N_MULT 24192 +#define VEC_N_256_SIZE_64 (CEIL_DIVIDE(PARAM_N_MULT, 256) << 2) +#define VEC_N1N2_256_SIZE_64 (CEIL_DIVIDE(PARAM_N1N2, 256) << 2) + +#define PARAM_DELTA 24 +#define PARAM_M 8 +#define PARAM_GF_POLY 0x11D +#define PARAM_GF_MUL_ORDER 255 +#define PARAM_K 32 +#define PARAM_G 49 +#define PARAM_FFT 5 +#define RS_POLY_COEFS 228,231,214,81,113,204,19,169,10,244,117,219,130,12,160,151,195,170,150,151,251,218,245,166,149,183,109,176,148,218,21,161,240,25,15,71,62,5,17,32,157,194,73,195,218,14,12,122,1 + +#define RED_MASK 0x1fffffffffffffUL +#define SHA512_BYTES 64 +#define SEED_BYTES 40 +#define SEEDEXPANDER_MAX_LENGTH 4294967295 + +#endif diff --git a/crypto_kem/hqc-rmrs-128/avx2/parsing.c b/crypto_kem/hqc-rmrs-128/avx2/parsing.c new file mode 100644 index 00000000..6ac71097 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/parsing.c @@ -0,0 +1,121 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file parsing.c + * @brief Functions to parse secret key, public key and ciphertext of the HQC scheme + */ + + + +/** + * @brief Parse a secret key into a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] sk String containing the secret key + * @param[in] sk_seed Seed used to generate the secret key + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS128_AVX2_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk) { + memcpy(sk, sk_seed, SEED_BYTES); + memcpy(sk + SEED_BYTES, pk, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a secret key from a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] x uint64_t representation of vector x + * @param[out] y uint64_t representation of vector y + * @param[out] pk String containing the public key + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS128_AVX2_hqc_secret_key_from_string(uint64_t *x, uint64_t *y, uint8_t *pk, const uint8_t *sk) { + AES_XOF_struct sk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + + memcpy(sk_seed, sk, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + PQCLEAN_HQCRMRS128_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQCRMRS128_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, y, PARAM_OMEGA); + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a public key into a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] pk String containing the public key + * @param[in] pk_seed Seed used to generate the public key + * @param[in] s uint8_t representation of vector s + */ +void PQCLEAN_HQCRMRS128_AVX2_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s) { + memcpy(pk, pk_seed, SEED_BYTES); + memcpy(pk + SEED_BYTES, s, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Parse a public key from a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] h uint8_t representation of vector h + * @param[out] s uint8_t representation of vector s + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS128_AVX2_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk) { + AES_XOF_struct pk_seedexpander; + uint8_t pk_seed[SEED_BYTES] = {0}; + + memcpy(pk_seed, pk, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + PQCLEAN_HQCRMRS128_AVX2_vect_set_random(&pk_seedexpander, h); + + memcpy(s, pk + SEED_BYTES, VEC_N_SIZE_BYTES); +} + + +/** + * @brief Parse a ciphertext into a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] ct String containing the ciphertext + * @param[in] u uint8_t representation of vector u + * @param[in] v uint8_t representation of vector v + * @param[in] d String containing the hash d + */ +void PQCLEAN_HQCRMRS128_AVX2_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d) { + memcpy(ct, u, VEC_N_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, d, SHA512_BYTES); +} + + +/** + * @brief Parse a ciphertext from a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] u uint8_t representation of vector u + * @param[out] v uint8_t representation of vector v + * @param[out] d String containing the hash d + * @param[in] ct String containing the ciphertext + */ +void PQCLEAN_HQCRMRS128_AVX2_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct) { + memcpy(u, ct, VEC_N_SIZE_BYTES); + memcpy(v, ct + VEC_N_SIZE_BYTES, VEC_N1N2_SIZE_BYTES); + memcpy(d, ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, SHA512_BYTES); +} diff --git a/crypto_kem/hqc-rmrs-128/avx2/parsing.h b/crypto_kem/hqc-rmrs-128/avx2/parsing.h new file mode 100644 index 00000000..9a6ce620 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/parsing.h @@ -0,0 +1,29 @@ +#ifndef PARSING_H +#define PARSING_H + + +/** + * @file parsing.h + * @brief Header file for parsing.c + */ + +#include + +#include + +void PQCLEAN_HQCRMRS128_AVX2_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk); + +void PQCLEAN_HQCRMRS128_AVX2_hqc_secret_key_from_string(uint64_t *x, uint64_t *y, uint8_t *pk, const uint8_t *sk); + + +void PQCLEAN_HQCRMRS128_AVX2_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s); + +void PQCLEAN_HQCRMRS128_AVX2_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk); + + +void PQCLEAN_HQCRMRS128_AVX2_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d); + +void PQCLEAN_HQCRMRS128_AVX2_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/avx2/reed_muller.c b/crypto_kem/hqc-rmrs-128/avx2/reed_muller.c new file mode 100644 index 00000000..d39b7d7c --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/reed_muller.c @@ -0,0 +1,376 @@ +#include "parameters.h" +#include "reed_muller.h" +#include +#include +#include +/** + * @file reed_muller.c + * Constant time implementation of Reed-Muller code RM(1,7) + */ + + +// number of repeated code words +#define MULTIPLICITY CEIL_DIVIDE(PARAM_N2, 128) + +// copy bit 0 into all bits of a 64 bit value +#define BIT0MASK(x) (int64_t)(-((x) & 1)) + +static void encode(uint64_t *word, uint32_t message); +static void expand_and_sum(__m256i *dst, const uint64_t *src); +static void hadamard(__m256i *src, __m256i *dst); +static int32_t find_peaks(__m256i *transform); + + + +/** + * @brief Encode a single byte into a single codeword using RM(1,7) + * + * Encoding matrix of this code: + * bit pattern (note that bits are numbered big endian) + * 0 aaaaaaaa aaaaaaaa aaaaaaaa aaaaaaaa + * 1 cccccccc cccccccc cccccccc cccccccc + * 2 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0 + * 3 ff00ff00 ff00ff00 ff00ff00 ff00ff00 + * 4 ffff0000 ffff0000 ffff0000 ffff0000 + * 5 00000000 ffffffff 00000000 ffffffff + * 6 00000000 00000000 ffffffff ffffffff + * 7 ffffffff ffffffff ffffffff ffffffff + * + * @param[out] word An RM(1,7) codeword + * @param[in] message A message to encode + */ +static void encode(uint64_t *word, uint32_t message) { + // the four parts of the word are identical + // except for encoding bits 5 and 6 + uint32_t first_word; + // bit 7 flips all the bits, do that first to save work + first_word = BIT0MASK(message >> 7); + // bits 0, 1, 2, 3, 4 are the same for all four longs + // (Warning: in the bit matrix above, low bits are at the left!) + first_word ^= BIT0MASK(message >> 0) & 0xaaaaaaaa; + first_word ^= BIT0MASK(message >> 1) & 0xcccccccc; + first_word ^= BIT0MASK(message >> 2) & 0xf0f0f0f0; + first_word ^= BIT0MASK(message >> 3) & 0xff00ff00; + first_word ^= BIT0MASK(message >> 4) & 0xffff0000; + // we can store this in the first quarter + ((uint32_t *) word)[0] = first_word; + // bit 5 flips entries 1 and 3; bit 6 flips 2 and 3 + first_word ^= BIT0MASK(message >> 5); + ((uint32_t *) word)[1] = first_word; + first_word ^= BIT0MASK(message >> 6); + ((uint32_t *) word)[3] = first_word; + first_word ^= BIT0MASK(message >> 5); + ((uint32_t *) word)[2] = first_word; +} + + + +/** + * @brief Add multiple codewords into expanded codeword + * + * Note: this does not write the codewords as -1 or +1 as the green machine does + * instead, just 0 and 1 is used. + * The resulting hadamard transform has: + * all values are halved + * the first entry is 64 too high + * + * @param[out] dst Structure that contain the expanded codeword + * @param[in] src Structure that contain the codeword + */ +inline void expand_and_sum(__m256i *dst, const uint64_t *src) { + uint16_t v[16]; + for (size_t part = 0 ; part < 8 ; part++) { + dst[part] = _mm256_setzero_si256(); + } + for (size_t copy = 0 ; copy < MULTIPLICITY ; copy++) { + for (size_t part = 0; part < 8; part++) { + for (size_t bit = 0; bit < 16; bit++) { + v[bit] = (((uint16_t *)(&src[2 * copy]))[part] >> bit) & 1; + } + dst[part] += _mm256_set_epi16(v[15], v[14], v[13], v[12], v[11], v[10], v[9], v[8], + v[7], v[6], v[5], v[4], v[3], v[2], v[1], v[0]); + } + } +} + + + +/** + * @brief Hadamard transform + * + * Perform hadamard transform of src and store result in dst + * src is overwritten: it is also used as intermediate buffer + * Method is best explained if we use H(3) instead of H(7): + * + * The routine multiplies by the matrix H(3): + * [1 1 1 1 1 1 1 1] + * [1 -1 1 -1 1 -1 1 -1] + * [1 1 -1 -1 1 1 -1 -1] + * [a b c d e f g h] * [1 -1 -1 1 1 -1 -1 1] = result of routine + * [1 1 1 1 -1 -1 -1 -1] + * [1 -1 1 -1 -1 1 -1 1] + * [1 1 -1 -1 -1 -1 1 1] + * [1 -1 -1 1 -1 1 1 -1] + * You can do this in three passes, where each pass does this: + * set lower half of buffer to pairwise sums, + * and upper half to differences + * index 0 1 2 3 4 5 6 7 + * input: a, b, c, d, e, f, g, h + * pass 1: a+b, c+d, e+f, g+h, a-b, c-d, e-f, g-h + * pass 2: a+b+c+d, e+f+g+h, a-b+c-d, e-f+g-h, a+b-c-d, e+f-g-h, a-b-c+d, e-f-g+h + * pass 3: a+b+c+d+e+f+g+h a+b-c-d+e+f-g-h a+b+c+d-e-f-g-h a+b-c-d-e+-f+g+h + * a-b+c-d+e-f+g-h a-b-c+d+e-f-g+h a-b+c-d-e+f-g+h a-b-c+d-e+f+g-h + * This order of computation is chosen because it vectorises well. + * Likewise, this routine multiplies by H(7) in seven passes. + * + * @param[out] src Structure that contain the expanded codeword + * @param[out] dst Structure that contain the expanded codeword + */ +inline void hadamard(__m256i *src, __m256i *dst) { + // the passes move data: + // src -> dst -> src -> dst -> src -> dst -> src -> dst + // using p1 and p2 alternately + __m256i *p1 = src; + __m256i *p2 = dst; + __m256i *p3; + for (size_t pass = 0 ; pass < 7 ; pass++) { + // warning: hadd works "within lanes" as Intel call it + // so you have to swap the middle 64 bit blocks of the result + for (size_t part = 0 ; part < 4 ; part++) { + p2[part] = _mm256_permute4x64_epi64(_mm256_hadd_epi16(p1[2 * part], p1[2 * part + 1]), 0xd8); + p2[part + 4] = _mm256_permute4x64_epi64(_mm256_hsub_epi16(p1[2 * part], p1[2 * part + 1]), 0xd8); + } + // swap p1, p2 for next round + p3 = p1; + p1 = p2; + p2 = p3; + } +} + + + +/** + * @brief Finding the location of the highest value + * + * This is the final step of the green machine: find the location of the highest value, + * and add 128 if the peak is positive + * Notes on decoding + * The standard "Green machine" decoder words as follows: + * if the received codeword is W, compute (2 * W - 1) * H7 + * The entries of the resulting vector are always even and vary from + * -128 (= the complement is a code word, add bit 7 to decode) + * via 0 (this is a different codeword) + * to 128 (this is the code word). + * + * Our decoding differs in two ways: + * - We take W instead of 2 * W - 1 (so the entries are 0,1 instead of -1,1) + * - We take the sum of the repititions (so the entries are 0..MULTIPLICITY) + * This implies that we have to subtract 64M (M=MULTIPLICITY) + * from the first entry to make sure the first codewords is handled properly + * and that the entries vary from -64M to 64M. + * -64M or 64M stands for a perfect codeword. + * If there are fewer than 32M errors, there is always a unique codeword + * which an entry with absolute value > 32M; + * this is because an error changes an entry by 1. + * The highest number that seem to be decodable is 50 errors, so that the + * highest entries in the hadamard transform can be as low as 12. + * But this is different for the repeated code. + * Because multiple codewords are added, this changes: the lowest value of the + * hadamard transform of the sum of six words is seen to be as low as 43 (!), + * which is way less than 12*6. + * + * It is possible that there are more errors, but the word is still uniquely + * decodable: we found a word with distance of 50 from the nearest codeword. + * That means that the highest entry can be as low as 14M. + * Since we have to do binary search, we search for the range 1-64M + * which can be done in 6+l2g(M) steps. + * The binary search is based on (values>32M are unique): + * M 32M min> max> firstStep #steps + * 2 64 1 64 33 +- 16 6 + * 4 128 1 128 65 +- 32 7 + * 6 192 1 192 129 +- 64 8 + * + * As a check, we run a sample for M=6 to see the peak value; it ranged + * from 43 to 147, so my analysis looks right. Also, it shows that decoding + * far beyond the bound of 32M is needed. + * + * For the vectors, it would be tempting to use 8 bit ints, + * because the values "almost" fit in there. + * We could use some trickery to fit it in 8 bits, like saturated add or + * division by 2 in a late step. + * Unfortunately, these instructions do not exist. + * the adds _mm512_adds_epi8 is available only on the latest processors, + * and division, shift, mulhi are not available at all for 8 bits. + * So, we use 16 bit ints. + * + * For the search of the optimal comparison value, + * remember the transform contains 64M-d, + * where d are the distances to the codewords. + * The highest value gives the most likely codeword. + * There is not fast vectorized way to find this value, so we search for the + * maximum value itself. + * In each pass, we collect a bit map of the transform values that are, + * say >bound. There are three cases: + * bit map = 0: all code words are further away than 64M-bound (decrease bound) + * bit map has one bit: one unique code word has distance < 64M-bound + * bit map has multiple bits: multiple words (increase bound) + * We will search for the lowest value of bound that gives a nonzero bit map. + * + * @param[in] transform Structure that contain the expanded codeword + */ +inline int32_t find_peaks(__m256i *transform) { + // a whole lot of vector variables + __m256i bitmap, abs_rows[8], bound, active_row, max_abs_rows; + __m256i peak_mask; + // compute absolute value of transform + for (size_t i = 0 ; i < 8 ; i++) { + abs_rows[i] = _mm256_abs_epi16(transform[i]); + } + // compute a vector of 16 elements which contains the maximum somewhere + // (later used to compute bits 0 through 3 of message) + max_abs_rows = abs_rows[0]; + for (size_t i = 1 ; i < 8 ; i++) { + max_abs_rows = _mm256_max_epi16(max_abs_rows, abs_rows[i]); + } + + // do binary search for the highest value that is lower than the maximum + // loop invariant: lower gives bit map = 0, lower + width gives bit map > 0 + int32_t lower = 1; + // this gives 64, 128 or 256 for MULTIPLICITY = 2, 4, 6 + int32_t width = 1 << (5 + MULTIPLICITY / 2); + // if you don't unroll this loop, it fits in the loop cache + // uncomment the line below to speeding up the program by a few percent + // #pragma GCC unroll 0 + while (width > 1) { + width >>= 1; + // compare with lower + width; put result in bitmap + // make vector from value of new bound + bound = _mm256_broadcastw_epi16(_mm_cvtsi32_si128(lower + width)); + bitmap = _mm256_cmpgt_epi16(max_abs_rows, bound); + // step up if there are any matches + // rely on compiler to use conditional move here + int32_t step_mask = _mm256_testz_si256(bitmap, bitmap) - 1; + lower += step_mask & width; + } + // lower+width contains the maximum value of the vector + // or less, if the maximum is very high (which is OK) + // normally, there is one maximum, but sometimes there are more + // find where the maxima occur in the maximum vector + // (each determines lower 4 bits of peak position) + // construct vector filled with bound-1 + bound = _mm256_broadcastw_epi16(_mm_cvtsi32_si128(lower + width - 1)); + + // find in which of the 8 groups a maximum occurs to compute bits 4, 5, 6 of message + // find lowest value by searching backwards skip first check to save time + size_t message = 0x70; + for (int32_t i = 7 ; i >= 0 ; i--) { + bitmap = _mm256_cmpgt_epi16(abs_rows[i], bound); + int message_mask = (-(int16_t)(_mm256_testz_si256(bitmap, bitmap) == 0)) >> 15; + message ^= message_mask & (message ^ (unsigned)i << 4); + } + // we decided which row of the matrix contains the lowest match + // select proper row + int8_t index = message >> 4; + __m256i res; + __m256i tmp = (__m256i) { + 0ULL, 0ULL, 0ULL, 0ULL + }; + + for (int8_t i = 0; i < 8; i++) { + int8_t abs_value = (int8_t)(index - i); + int8_t mask1 = abs_value >> 7; + abs_value ^= mask1; + abs_value -= mask1; + int8_t mask2 = ((uint8_t) - abs_value >> 7); + int64_t mask3 = (-1ULL) + mask2; + __m256i vect_mask = (__m256i) { + mask3, mask3, mask3, mask3 + }; + res = _mm256_and_si256(abs_rows[i], vect_mask); + tmp = _mm256_or_si256(tmp, res); + } + + active_row = tmp; + + // get the column number of the vector element + // by setting the bits corresponding to the columns + // and then adding elements within two groups of 8 + peak_mask = _mm256_cmpgt_epi16(active_row, bound); + peak_mask &= _mm256_set_epi16(-32768, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1); + for (int32_t i = 0 ; i < 3 ; i++) { + peak_mask = _mm256_hadd_epi16(peak_mask, peak_mask); + } + // add low 4 bits of message + message |= __tzcnt_u16(_mm256_extract_epi16(peak_mask, 0) + _mm256_extract_epi16(peak_mask, 8)); + + // set bit 7 if sign of biggest value is positive + // make sure a jump isn't generated by the compiler + tmp = (__m256i) { + 0ULL, 0ULL, 0ULL, 0ULL + }; + for (uint32_t i = 0; i < 8; i++) { + int64_t message_mask = (-(int64_t)(i == message / 16)) >> 63; + __m256i vect_mask = (__m256i) { + message_mask, message_mask, message_mask, message_mask + }; + tmp = _mm256_or_si256(tmp, _mm256_and_si256(vect_mask, transform[i])); + } + uint16_t result = 0; + for (uint32_t i = 0; i < 16; i++) { + uint16_t *ptr = (uint16_t *) &tmp; + int32_t message_mask = (-(int32_t)(i == message % 16)) >> (sizeof(int32_t) * 8 - 1); + result |= message_mask & ptr[i]; + } + message |= (0x8000 & ~result) >> 8; + return message; +} + + + +/** + * @brief Encodes the received word + * + * The message consists of N1 bytes each byte is encoded into PARAM_N2 bits, + * or MULTIPLICITY repeats of 128 bits + * + * @param[out] cdw Array of size VEC_N1N2_SIZE_64 receiving the encoded message + * @param[in] msg Array of size VEC_N1_SIZE_64 storing the message + */ +void PQCLEAN_HQCRMRS128_AVX2_reed_muller_encode(uint64_t *cdw, const uint64_t *msg) { + for (size_t i = 0 ; i < VEC_N1_SIZE_BYTES ; i++) { + // fill entries i * MULTIPLICITY to (i+1) * MULTIPLICITY + // encode first word + encode(&cdw[2 * i * MULTIPLICITY], ((uint8_t *)msg)[i]); + // copy to other identical codewords + for (size_t copy = 1 ; copy < MULTIPLICITY ; copy++) { + memcpy(&cdw[2 * (i * MULTIPLICITY + copy)], &cdw[2 * i * MULTIPLICITY], 2 * sizeof(uint64_t)); + } + } +} + + + +/** + * @brief Decodes the received word + * + * Decoding uses fast hadamard transform, for a more complete picture on Reed-Muller decoding, see MacWilliams, Florence Jessie, and Neil James Alexander Sloane. + * The theory of error-correcting codes codes @cite macwilliams1977theory + * + * @param[out] msg Array of size VEC_N1_SIZE_64 receiving the decoded message + * @param[in] cdw Array of size VEC_N1N2_SIZE_64 storing the received word + */ +void PQCLEAN_HQCRMRS128_AVX2_reed_muller_decode(uint64_t *msg, const uint64_t *cdw) { + __m256i expanded[8]; + __m256i transform[8]; + for (size_t i = 0 ; i < VEC_N1_SIZE_BYTES ; i++) { + // collect the codewords + expand_and_sum(expanded, &cdw[2 * i * MULTIPLICITY]); + // apply hadamard transform + hadamard(expanded, transform); + // fix the first entry to get the half Hadamard transform + transform[0] -= _mm256_set_epi16(0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 64 * MULTIPLICITY); + // finish the decoding + ((uint8_t *)msg)[i] = find_peaks(transform); + } +} diff --git a/crypto_kem/hqc-rmrs-128/avx2/reed_muller.h b/crypto_kem/hqc-rmrs-128/avx2/reed_muller.h new file mode 100644 index 00000000..6cd6834e --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/reed_muller.h @@ -0,0 +1,20 @@ +#ifndef REED_MULLER_H +#define REED_MULLER_H + + +/** + * @file reed_muller.h + * Header file of reed_muller.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS128_AVX2_reed_muller_encode(uint64_t *cdw, const uint64_t *msg); + +void PQCLEAN_HQCRMRS128_AVX2_reed_muller_decode(uint64_t *msg, const uint64_t *cdw); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/avx2/reed_solomon.c b/crypto_kem/hqc-rmrs-128/avx2/reed_solomon.c new file mode 100644 index 00000000..a3d5d0e9 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/reed_solomon.c @@ -0,0 +1,340 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include "reed_solomon.h" +#include +#include +#include +/** + * @file reed_solomon.c + * Constant time implementation of Reed-Solomon codes + */ + + +static void compute_syndromes(uint16_t *syndromes, uint8_t *cdw); +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes); +static void compute_roots(uint8_t *error, uint16_t *sigma); +static void compute_z_poly(uint16_t *z, const uint16_t *sigma, uint8_t degree, const uint16_t *syndromes); +static void compute_error_values(uint16_t *error_values, const uint16_t *z, const uint8_t *error); +static void correct_errors(uint8_t *cdw, const uint16_t *error_values); + +static const uint16_t alpha_ij_pow [48][79] = {{2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240}, {4, 16, 64, 29, 116, 205, 19, 76, 45, 180, 234, 143, 6, 24, 96, 157, 78, 37, 148, 106, 181, 238, 159, 70, 5, 20, 80, 93, 105, 185, 222, 95, 97, 153, 94, 101, 137, 30, 120, 253, 211, 107, 177, 254, 223, 91, 113, 217, 67, 17, 68, 13, 52, 208, 103, 129, 62, 248, 199, 59, 236, 151, 102, 133, 46, 184, 218, 79, 33, 132, 42, 168, 154, 82, 85, 73, 57, 228, 183}, {8, 64, 58, 205, 38, 45, 117, 143, 12, 96, 39, 37, 53, 181, 193, 70, 10, 80, 186, 185, 161, 97, 47, 101, 15, 120, 231, 107, 127, 223, 182, 217, 134, 68, 26, 208, 206, 62, 237, 59, 197, 102, 23, 184, 169, 33, 21, 168, 41, 85, 146, 228, 115, 191, 145, 252, 179, 241, 219, 150, 196, 110, 87, 130, 100, 7, 56, 221, 166, 89, 242, 195, 86, 138, 36, 61, 245, 251, 139}, {16, 29, 205, 76, 180, 143, 24, 157, 37, 106, 238, 70, 20, 93, 185, 95, 153, 101, 30, 253, 107, 254, 91, 217, 17, 13, 208, 129, 248, 59, 151, 133, 184, 79, 132, 168, 82, 73, 228, 230, 198, 252, 123, 227, 150, 149, 165, 130, 200, 28, 221, 81, 121, 195, 172, 18, 61, 247, 203, 44, 250, 27, 173, 2, 32, 58, 135, 152, 117, 3, 48, 39, 74, 212, 193, 140, 40, 186, 111}, {32, 116, 38, 180, 3, 96, 156, 106, 193, 5, 160, 185, 190, 94, 15, 253, 214, 223, 226, 17, 26, 103, 124, 59, 51, 46, 169, 132, 77, 85, 114, 230, 145, 215, 255, 150, 55, 174, 100, 28, 167, 89, 239, 172, 36, 244, 235, 44, 233, 108, 1, 32, 116, 38, 180, 3, 96, 156, 106, 193, 5, 160, 185, 190, 94, 15, 253, 214, 223, 226, 17, 26, 103, 124, 59, 51, 46, 169, 132}, {64, 205, 45, 143, 96, 37, 181, 70, 80, 185, 97, 101, 120, 107, 223, 217, 68, 208, 62, 59, 102, 184, 33, 168, 85, 228, 191, 252, 241, 150, 110, 130, 7, 221, 89, 195, 138, 61, 251, 44, 207, 173, 8, 58, 38, 117, 12, 39, 53, 193, 10, 186, 161, 47, 15, 231, 127, 182, 134, 26, 206, 237, 197, 23, 169, 21, 41, 146, 115, 145, 179, 219, 196, 87, 100, 56, 166, 242, 86}, {128, 19, 117, 24, 156, 181, 140, 93, 161, 94, 60, 107, 163, 67, 26, 129, 147, 102, 109, 132, 41, 57, 209, 252, 255, 98, 87, 200, 224, 89, 155, 18, 245, 11, 233, 173, 16, 232, 45, 3, 157, 53, 159, 40, 185, 194, 137, 231, 254, 226, 68, 189, 248, 197, 46, 158, 168, 170, 183, 145, 123, 75, 110, 25, 28, 166, 249, 69, 61, 235, 176, 54, 2, 29, 38, 234, 48, 37, 119}, {29, 76, 143, 157, 106, 70, 93, 95, 101, 253, 254, 217, 13, 129, 59, 133, 79, 168, 73, 230, 252, 227, 149, 130, 28, 81, 195, 18, 247, 44, 27, 2, 58, 152, 3, 39, 212, 140, 186, 190, 202, 231, 225, 175, 26, 31, 118, 23, 158, 77, 146, 209, 229, 219, 55, 25, 56, 162, 155, 36, 243, 88, 54, 4, 116, 45, 6, 78, 181, 5, 105, 97, 137, 211, 223, 67, 52, 62, 236}, {58, 45, 12, 37, 193, 80, 161, 101, 231, 223, 134, 208, 237, 102, 169, 168, 146, 191, 179, 150, 87, 7, 166, 195, 36, 251, 125, 173, 64, 38, 143, 39, 181, 10, 185, 47, 120, 127, 217, 26, 62, 197, 184, 21, 85, 115, 252, 219, 110, 100, 221, 242, 138, 245, 44, 54, 8, 205, 117, 96, 53, 70, 186, 97, 15, 107, 182, 68, 206, 59, 23, 33, 41, 228, 145, 241, 196, 130, 56}, {116, 180, 96, 106, 5, 185, 94, 253, 223, 17, 103, 59, 46, 132, 85, 230, 215, 150, 174, 28, 89, 172, 244, 44, 108, 32, 38, 3, 156, 193, 160, 190, 15, 214, 226, 26, 124, 51, 169, 77, 114, 145, 255, 55, 100, 167, 239, 36, 235, 233, 1, 116, 180, 96, 106, 5, 185, 94, 253, 223, 17, 103, 59, 46, 132, 85, 230, 215, 150, 174, 28, 89, 172, 244, 44, 108, 32, 38, 3}, {232, 234, 39, 238, 160, 97, 60, 254, 134, 103, 118, 184, 84, 57, 145, 227, 220, 7, 162, 172, 245, 176, 71, 58, 180, 192, 181, 40, 95, 15, 177, 175, 208, 147, 46, 21, 73, 99, 241, 55, 200, 166, 43, 122, 44, 216, 128, 45, 48, 106, 10, 222, 202, 107, 226, 52, 237, 133, 66, 85, 209, 123, 196, 50, 167, 195, 144, 11, 54, 32, 76, 12, 148, 140, 185, 188, 211, 182, 13}, {205, 143, 37, 70, 185, 101, 107, 217, 208, 59, 184, 168, 228, 252, 150, 130, 221, 195, 61, 44, 173, 58, 117, 39, 193, 186, 47, 231, 182, 26, 237, 23, 21, 146, 145, 219, 87, 56, 242, 36, 139, 54, 64, 45, 96, 181, 80, 97, 120, 223, 68, 62, 102, 33, 85, 191, 241, 110, 7, 89, 138, 251, 207, 8, 38, 12, 53, 10, 161, 15, 127, 134, 206, 197, 169, 41, 115, 179, 196}, {135, 6, 53, 20, 190, 120, 163, 13, 237, 46, 84, 228, 229, 98, 100, 81, 69, 251, 131, 32, 45, 192, 238, 186, 94, 187, 217, 189, 236, 169, 82, 209, 241, 220, 28, 242, 72, 22, 173, 116, 201, 37, 140, 222, 15, 254, 34, 62, 204, 132, 146, 63, 75, 130, 167, 43, 245, 250, 4, 38, 24, 212, 80, 194, 253, 182, 52, 147, 184, 77, 183, 179, 149, 141, 89, 9, 203, 54, 128}, {19, 24, 181, 93, 94, 107, 67, 129, 102, 132, 57, 252, 98, 200, 89, 18, 11, 173, 232, 3, 53, 40, 194, 231, 226, 189, 197, 158, 170, 145, 75, 25, 166, 69, 235, 54, 29, 234, 37, 5, 95, 120, 91, 52, 59, 218, 82, 191, 227, 174, 221, 43, 247, 207, 32, 90, 39, 35, 111, 15, 225, 136, 237, 92, 77, 115, 246, 220, 56, 239, 122, 125, 4, 76, 96, 238, 105, 101, 177}, {38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145}, {76, 157, 70, 95, 253, 217, 129, 133, 168, 230, 227, 130, 81, 18, 44, 2, 152, 39, 140, 190, 231, 175, 31, 23, 77, 209, 219, 25, 162, 36, 88, 4, 45, 78, 5, 97, 211, 67, 62, 46, 154, 191, 171, 50, 89, 72, 176, 8, 90, 156, 10, 194, 187, 134, 124, 92, 41, 99, 75, 100, 178, 144, 125, 16, 180, 37, 20, 153, 107, 17, 248, 184, 82, 198, 150, 200, 121, 61, 250}, {152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153}, {45, 37, 80, 101, 223, 208, 102, 168, 191, 150, 7, 195, 251, 173, 38, 39, 10, 47, 127, 26, 197, 21, 115, 219, 100, 242, 245, 54, 205, 96, 70, 97, 107, 68, 59, 33, 228, 241, 130, 89, 61, 207, 58, 12, 193, 161, 231, 134, 237, 169, 146, 179, 87, 166, 36, 125, 64, 143, 181, 185, 120, 217, 62, 184, 85, 252, 110, 221, 138, 44, 8, 117, 53, 186, 15, 182, 206, 23, 41}, {90, 148, 186, 30, 226, 62, 109, 73, 179, 174, 162, 61, 131, 232, 96, 140, 153, 127, 52, 51, 168, 99, 98, 56, 172, 22, 8, 234, 212, 185, 240, 67, 237, 79, 114, 241, 25, 121, 245, 108, 19, 39, 20, 188, 223, 189, 133, 41, 63, 55, 221, 9, 176, 64, 3, 238, 161, 211, 34, 59, 66, 183, 219, 200, 239, 251, 71, 152, 37, 160, 137, 182, 129, 92, 85, 229, 165, 166, 72}, {180, 106, 185, 253, 17, 59, 132, 230, 150, 28, 172, 44, 32, 3, 193, 190, 214, 26, 51, 77, 145, 55, 167, 36, 233, 116, 96, 5, 94, 223, 103, 46, 85, 215, 174, 89, 244, 108, 38, 156, 160, 15, 226, 124, 169, 114, 255, 100, 239, 235, 1, 180, 106, 185, 253, 17, 59, 132, 230, 150, 28, 172, 44, 32, 3, 193, 190, 214, 26, 51, 77, 145, 55, 167, 36, 233, 116, 96, 5}, {117, 181, 161, 107, 26, 102, 41, 252, 87, 89, 245, 173, 45, 53, 185, 231, 68, 197, 168, 145, 110, 166, 61, 54, 38, 37, 186, 120, 134, 59, 21, 191, 196, 221, 36, 207, 205, 39, 80, 15, 217, 237, 33, 115, 150, 56, 138, 125, 58, 96, 10, 101, 182, 62, 169, 228, 219, 7, 86, 44, 64, 12, 70, 47, 223, 206, 184, 146, 241, 100, 195, 139, 8, 143, 193, 97, 127, 208, 23}, {234, 238, 97, 254, 103, 184, 57, 227, 7, 172, 176, 58, 192, 40, 15, 175, 147, 21, 99, 55, 166, 122, 216, 45, 106, 222, 107, 52, 133, 85, 123, 50, 195, 11, 32, 12, 140, 188, 182, 124, 158, 115, 49, 224, 36, 131, 19, 37, 105, 253, 68, 151, 154, 252, 174, 121, 251, 2, 201, 193, 194, 225, 206, 109, 114, 219, 14, 69, 125, 116, 157, 80, 30, 67, 59, 42, 198, 110, 81}, {201, 159, 47, 91, 124, 33, 209, 149, 166, 244, 71, 117, 238, 194, 223, 31, 79, 115, 98, 167, 61, 216, 90, 181, 190, 254, 206, 218, 213, 150, 224, 72, 54, 152, 106, 161, 177, 189, 184, 114, 171, 56, 18, 131, 38, 148, 111, 107, 104, 46, 146, 227, 14, 138, 233, 135, 37, 210, 211, 26, 133, 170, 241, 141, 172, 125, 232, 78, 186, 253, 136, 102, 164, 123, 100, 43, 88, 58, 157}, {143, 70, 101, 217, 59, 168, 252, 130, 195, 44, 58, 39, 186, 231, 26, 23, 146, 219, 56, 36, 54, 45, 181, 97, 223, 62, 33, 191, 110, 89, 251, 8, 12, 10, 15, 134, 197, 41, 179, 100, 86, 125, 205, 37, 185, 107, 208, 184, 228, 150, 221, 61, 173, 117, 193, 47, 182, 237, 21, 145, 87, 242, 139, 64, 96, 80, 120, 68, 102, 85, 241, 7, 138, 207, 38, 53, 161, 127, 206}, {3, 5, 15, 17, 51, 85, 255, 28, 36, 108, 180, 193, 94, 226, 59, 77, 215, 100, 172, 233, 38, 106, 190, 223, 124, 132, 145, 174, 239, 44, 116, 156, 185, 214, 103, 169, 230, 55, 89, 235, 32, 96, 160, 253, 26, 46, 114, 150, 167, 244, 1, 3, 5, 15, 17, 51, 85, 255, 28, 36, 108, 180, 193, 94, 226, 59, 77, 215, 100, 172, 233, 38, 106, 190, 223, 124, 132, 145, 174}, {6, 20, 120, 13, 46, 228, 98, 81, 251, 32, 192, 186, 187, 189, 169, 209, 220, 242, 22, 116, 37, 222, 254, 62, 132, 63, 130, 43, 250, 38, 212, 194, 182, 147, 77, 179, 141, 9, 54, 180, 159, 101, 67, 151, 85, 227, 112, 61, 142, 3, 10, 60, 136, 23, 114, 49, 166, 243, 16, 96, 93, 211, 208, 218, 230, 110, 121, 11, 58, 156, 111, 127, 31, 66, 145, 65, 155, 125, 19}, {12, 80, 231, 208, 169, 191, 87, 195, 125, 38, 181, 47, 217, 197, 85, 219, 221, 245, 8, 96, 186, 107, 206, 33, 145, 130, 86, 207, 45, 193, 101, 134, 102, 146, 150, 166, 251, 64, 39, 185, 127, 62, 21, 252, 100, 138, 54, 117, 70, 15, 68, 23, 228, 196, 89, 139, 58, 37, 161, 223, 237, 168, 179, 7, 36, 173, 143, 10, 120, 26, 184, 115, 110, 242, 44, 205, 53, 97, 182}, {24, 93, 107, 129, 132, 252, 200, 18, 173, 3, 40, 231, 189, 158, 145, 25, 69, 54, 234, 5, 120, 52, 218, 191, 174, 43, 207, 90, 35, 15, 136, 92, 115, 220, 239, 125, 76, 238, 101, 17, 133, 228, 149, 121, 44, 135, 212, 47, 175, 51, 146, 49, 162, 139, 116, 148, 97, 113, 236, 85, 171, 83, 251, 128, 156, 161, 163, 147, 41, 255, 224, 245, 16, 157, 185, 254, 248, 168, 123}, {48, 105, 127, 248, 77, 241, 224, 247, 64, 156, 95, 182, 236, 170, 150, 162, 11, 205, 212, 94, 134, 133, 213, 110, 239, 250, 45, 35, 30, 26, 218, 99, 130, 69, 108, 143, 40, 211, 206, 132, 229, 7, 144, 2, 96, 210, 254, 237, 154, 255, 221, 243, 128, 37, 190, 113, 197, 73, 49, 89, 22, 135, 181, 188, 17, 23, 183, 220, 195, 233, 90, 70, 60, 52, 169, 198, 25, 138, 216}, {96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15}, {192, 222, 182, 151, 114, 110, 155, 27, 143, 160, 177, 237, 82, 75, 89, 88, 152, 70, 240, 103, 21, 123, 224, 251, 116, 212, 101, 136, 218, 145, 200, 144, 8, 78, 190, 217, 204, 183, 87, 172, 216, 12, 105, 225, 59, 170, 98, 242, 250, 180, 10, 211, 31, 168, 255, 83, 139, 135, 238, 15, 52, 158, 252, 14, 244, 64, 74, 153, 134, 46, 209, 130, 9, 142, 96, 111, 91, 197, 57}, {157, 95, 217, 133, 230, 130, 18, 2, 39, 190, 175, 23, 209, 25, 36, 4, 78, 97, 67, 46, 191, 50, 72, 8, 156, 194, 134, 92, 99, 100, 144, 16, 37, 153, 17, 184, 198, 200, 61, 32, 74, 47, 34, 109, 145, 141, 122, 64, 148, 94, 68, 218, 63, 7, 244, 128, 53, 188, 136, 169, 126, 14, 245, 29, 106, 101, 13, 79, 252, 28, 247, 58, 212, 202, 26, 158, 229, 56, 243}, {39, 97, 134, 184, 145, 7, 245, 58, 181, 15, 208, 21, 241, 166, 44, 45, 10, 107, 237, 85, 196, 195, 54, 12, 185, 182, 102, 115, 130, 36, 8, 37, 47, 68, 169, 252, 56, 251, 205, 193, 120, 206, 168, 219, 89, 125, 117, 80, 127, 59, 146, 110, 86, 173, 96, 161, 217, 23, 191, 100, 61, 64, 53, 101, 26, 33, 179, 221, 139, 38, 70, 231, 62, 41, 150, 242, 207, 143, 186}, {78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79}, {156, 94, 26, 132, 255, 89, 233, 3, 185, 226, 46, 145, 28, 235, 38, 5, 214, 59, 114, 174, 36, 32, 106, 15, 103, 77, 150, 239, 108, 96, 190, 17, 169, 215, 167, 44, 180, 160, 223, 51, 230, 100, 244, 116, 193, 253, 124, 85, 55, 172, 1, 156, 94, 26, 132, 255, 89, 233, 3, 185, 226, 46, 145, 28, 235, 38, 5, 214, 59, 114, 174, 36, 32, 106, 15, 103, 77, 150, 239}, {37, 101, 208, 168, 150, 195, 173, 39, 47, 26, 21, 219, 242, 54, 96, 97, 68, 33, 241, 89, 207, 12, 161, 134, 169, 179, 166, 125, 143, 185, 217, 184, 252, 221, 44, 117, 186, 182, 23, 145, 56, 139, 45, 80, 223, 102, 191, 7, 251, 38, 10, 127, 197, 115, 100, 245, 205, 70, 107, 59, 228, 130, 61, 58, 193, 231, 237, 146, 87, 36, 64, 181, 120, 62, 85, 110, 138, 8, 53}, {74, 137, 206, 82, 55, 138, 16, 212, 120, 124, 73, 87, 72, 29, 193, 211, 147, 228, 25, 244, 205, 140, 177, 197, 230, 141, 251, 76, 40, 223, 204, 198, 56, 11, 180, 186, 113, 92, 252, 167, 176, 143, 111, 67, 169, 123, 162, 207, 24, 190, 68, 66, 227, 242, 108, 157, 47, 52, 84, 150, 155, 142, 37, 202, 103, 41, 149, 69, 8, 106, 60, 62, 170, 165, 36, 128, 238, 231, 199}, {148, 30, 62, 73, 174, 61, 232, 140, 127, 51, 99, 56, 22, 234, 185, 67, 79, 241, 121, 108, 39, 188, 189, 41, 55, 9, 64, 238, 211, 59, 183, 200, 251, 152, 160, 182, 92, 229, 166, 233, 24, 97, 13, 42, 150, 43, 2, 53, 60, 124, 146, 65, 122, 205, 5, 254, 102, 198, 112, 44, 201, 111, 134, 158, 255, 242, 216, 78, 101, 103, 82, 110, 18, 128, 193, 187, 118, 115, 141}, {53, 120, 237, 228, 100, 251, 45, 186, 217, 169, 241, 242, 173, 37, 15, 62, 146, 130, 245, 38, 80, 182, 184, 179, 89, 54, 39, 101, 206, 85, 87, 61, 205, 10, 223, 23, 252, 166, 207, 96, 47, 208, 41, 110, 36, 58, 70, 127, 102, 145, 221, 125, 12, 97, 26, 168, 196, 138, 64, 193, 107, 197, 191, 56, 44, 143, 161, 68, 21, 150, 86, 8, 181, 231, 59, 115, 7, 139, 117}, {106, 253, 59, 230, 28, 44, 3, 190, 26, 77, 55, 36, 116, 5, 223, 46, 215, 89, 108, 156, 15, 124, 114, 100, 235, 180, 185, 17, 132, 150, 172, 32, 193, 214, 51, 145, 167, 233, 96, 94, 103, 85, 174, 244, 38, 160, 226, 169, 255, 239, 1, 106, 253, 59, 230, 28, 44, 3, 190, 26, 77, 55, 36, 116, 5, 223, 46, 215, 89, 108, 156, 15, 124, 114, 100, 235, 180, 185, 17}, {212, 211, 197, 198, 167, 207, 157, 202, 62, 114, 200, 139, 201, 95, 26, 154, 220, 61, 19, 160, 217, 158, 171, 86, 32, 159, 127, 133, 229, 89, 216, 74, 120, 147, 230, 56, 176, 24, 47, 103, 170, 130, 243, 90, 185, 34, 42, 196, 18, 116, 10, 91, 109, 241, 239, 2, 181, 187, 151, 145, 83, 131, 39, 137, 124, 228, 141, 11, 143, 190, 52, 41, 165, 122, 38, 93, 175, 33, 75}, {181, 107, 102, 252, 89, 173, 53, 231, 197, 145, 166, 54, 37, 120, 59, 191, 221, 207, 39, 15, 237, 115, 56, 125, 96, 101, 62, 228, 7, 44, 12, 47, 206, 146, 100, 139, 143, 97, 208, 85, 130, 251, 117, 161, 26, 41, 87, 245, 45, 185, 68, 168, 110, 61, 38, 186, 134, 21, 196, 36, 205, 80, 217, 33, 150, 138, 58, 10, 182, 169, 219, 86, 64, 70, 223, 184, 241, 195, 8}, {119, 177, 23, 123, 239, 8, 159, 225, 184, 255, 43, 64, 140, 91, 169, 171, 69, 58, 20, 226, 33, 49, 18, 205, 160, 67, 21, 149, 144, 38, 105, 34, 168, 220, 244, 45, 111, 13, 41, 174, 243, 117, 95, 104, 85, 25, 203, 143, 194, 103, 146, 200, 22, 12, 94, 31, 228, 14, 176, 96, 202, 248, 115, 112, 233, 39, 30, 147, 191, 167, 27, 37, 240, 236, 145, 81, 216, 53, 211}, {238, 254, 184, 227, 172, 58, 40, 175, 21, 55, 122, 45, 222, 52, 85, 50, 11, 12, 188, 124, 115, 224, 131, 37, 253, 151, 252, 121, 2, 193, 225, 109, 219, 69, 116, 80, 67, 42, 110, 244, 90, 161, 104, 170, 100, 22, 24, 101, 248, 230, 221, 27, 74, 231, 51, 229, 242, 4, 159, 223, 218, 171, 138, 232, 160, 134, 84, 220, 245, 180, 95, 208, 73, 200, 44, 48, 202, 237, 209}, {193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44}, {159, 91, 33, 149, 244, 117, 194, 31, 115, 167, 216, 181, 254, 218, 150, 72, 152, 161, 189, 114, 56, 131, 148, 107, 46, 227, 138, 135, 210, 26, 170, 141, 125, 78, 253, 102, 123, 43, 58, 160, 34, 41, 25, 22, 96, 30, 236, 252, 249, 32, 10, 175, 84, 87, 235, 6, 101, 199, 198, 89, 2, 35, 182, 66, 55, 245, 234, 153, 62, 230, 83, 173, 119, 225, 169, 49, 144, 45, 95}, {35, 113, 21, 165, 235, 12, 137, 118, 252, 239, 128, 80, 34, 82, 100, 176, 78, 231, 133, 255, 138, 19, 111, 208, 114, 112, 54, 212, 254, 169, 98, 122, 117, 153, 124, 191, 162, 2, 70, 226, 42, 87, 203, 24, 15, 236, 229, 195, 29, 160, 68, 164, 200, 125, 156, 211, 23, 227, 9, 38, 222, 189, 228, 224, 108, 181, 225, 79, 196, 244, 234, 47, 248, 99, 89, 4, 140, 217, 84}, {70, 217, 168, 130, 44, 39, 231, 23, 219, 36, 45, 97, 62, 191, 89, 8, 10, 134, 41, 100, 125, 37, 107, 184, 150, 61, 117, 47, 237, 145, 242, 64, 80, 68, 85, 7, 207, 53, 127, 169, 196, 245, 143, 101, 59, 252, 195, 58, 186, 26, 146, 56, 54, 181, 223, 33, 110, 251, 12, 15, 197, 179, 86, 205, 185, 208, 228, 221, 173, 193, 182, 21, 87, 139, 96, 120, 102, 241, 138}}; + + + +/** + * @brief Encodes a message message of PARAM_K bits to a Reed-Solomon codeword codeword of PARAM_N1 bytes + * + * Following @cite lin1983error (Chapter 4 - Cyclic Codes), + * We perform a systematic encoding using a linear (PARAM_N1 - PARAM_K)-stage shift register + * with feedback connections based on the generator polynomial PARAM_RS_POLY of the Reed-Solomon code. + * + * @param[out] cdw Array of size VEC_N1_SIZE_64 receiving the encoded message + * @param[in] msg Array of size VEC_K_SIZE_64 storing the message + */ +void PQCLEAN_HQCRMRS128_AVX2_reed_solomon_encode(uint64_t *cdw, const uint64_t *msg) { + uint8_t gate_value = 0; + + uint16_t tmp[PARAM_G] = {0}; + uint16_t PARAM_RS_POLY [] = {RS_POLY_COEFS}; + + uint8_t msg_bytes[PARAM_K] = {0}; + uint8_t cdw_bytes[PARAM_N1] = {0}; + + for (size_t i = 0 ; i < VEC_K_SIZE_64 ; ++i) { + for (size_t j = 0 ; j < 8 ; ++j) { + msg_bytes[i * 8 + j] = (uint8_t) (msg[i] >> (j * 8)); + } + } + + for (int i = PARAM_K - 1 ; i >= 0 ; --i) { + gate_value = msg_bytes[i] ^ cdw_bytes[PARAM_N1 - PARAM_K - 1]; + + for (size_t j = 0 ; j < PARAM_G ; ++j) { + tmp[j] = PQCLEAN_HQCRMRS128_AVX2_gf_mul(gate_value, PARAM_RS_POLY[j]); + } + + for (size_t k = PARAM_N1 - PARAM_K - 1 ; k ; --k) { + cdw_bytes[k] = cdw_bytes[k - 1] ^ tmp[k]; + } + + cdw_bytes[0] = tmp[0]; + } + + memcpy(cdw_bytes + PARAM_N1 - PARAM_K, msg_bytes, PARAM_K); + memcpy(cdw, cdw_bytes, PARAM_N1); +} + + + +/** + * @brief Computes 2 * PARAM_DELTA syndromes + * + * @param[out] syndromes Array of size 2 * PARAM_DELTA receiving the computed syndromes + * @param[in] cdw Array of size PARAM_N1 storing the received vector + */ +void compute_syndromes(uint16_t *syndromes, uint8_t *cdw) { + for (size_t i = 0 ; i < 2 * PARAM_DELTA ; ++i) { + for (size_t j = 1 ; j < PARAM_N1 ; ++j) { + syndromes[i] ^= PQCLEAN_HQCRMRS128_AVX2_gf_mul(cdw[j], alpha_ij_pow[i][j - 1]); + } + syndromes[i] ^= cdw[0]; + } +} + + + +/** + * @brief Computes the error locator polynomial (ELP) sigma + * + * This is a constant time implementation of Berlekamp's simplified algorithm (see @cite lin1983error (Chapter 6 - BCH Codes).
+ * We use the letter p for rho which is initialized at -1.
+ * The array X_sigma_p represents the polynomial X^(mu-rho)*sigma_p(X).
+ * Instead of maintaining a list of sigmas, we update in place both sigma and X_sigma_p.
+ * sigma_copy serves as a temporary save of sigma in case X_sigma_p needs to be updated.
+ * We can properly correct only if the degree of sigma does not exceed PARAM_DELTA. + * This means only the first PARAM_DELTA + 1 coefficients of sigma are of value + * and we only need to save its first PARAM_DELTA - 1 coefficients. + * + * @returns the degree of the ELP sigma + * @param[out] sigma Array of size (at least) PARAM_DELTA receiving the ELP + * @param[in] syndromes Array of size (at least) 2*PARAM_DELTA storing the syndromes + */ +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes) { + sigma[0] = 1; + size_t deg_sigma = 0; + size_t deg_sigma_p = 0; + uint16_t sigma_copy[PARAM_DELTA + 1] = {0}; + size_t deg_sigma_copy = 0; + uint16_t X_sigma_p[PARAM_DELTA + 1] = {0, 1}; + int32_t pp = -1; // 2*rho + uint16_t d_p = 1; + uint16_t d = syndromes[0]; + + for (size_t mu = 0 ; (mu < (2 * PARAM_DELTA)) ; ++mu) { + // Save sigma in case we need it to update X_sigma_p + memcpy(sigma_copy, sigma, 2 * (PARAM_DELTA)); + deg_sigma_copy = deg_sigma; + + uint16_t dd = PQCLEAN_HQCRMRS128_AVX2_gf_mul(d, PQCLEAN_HQCRMRS128_AVX2_gf_inverse(d_p)); + + for (size_t i = 1 ; (i <= mu + 1) && (i <= PARAM_DELTA) ; ++i) { + sigma[i] ^= PQCLEAN_HQCRMRS128_AVX2_gf_mul(dd, X_sigma_p[i]); + } + + size_t deg_X = mu - pp; + size_t deg_X_sigma_p = deg_X + deg_sigma_p; + + // mask1 = 0xffff if(d != 0) and 0 otherwise + int16_t mask1 = -((uint16_t) - d >> 15); + + // mask2 = 0xffff if(deg_X_sigma_p > deg_sigma) and 0 otherwise + int16_t mask2 = -((uint16_t) (deg_sigma - deg_X_sigma_p) >> 15); + + // mask12 = 0xffff if the deg_sigma increased and 0 otherwise + int16_t mask12 = mask1 & mask2; + deg_sigma = (mask12 & deg_X_sigma_p) ^ (~mask12 & deg_sigma); + + if (mu == (2 * PARAM_DELTA - 1)) { + break; + } + + pp = (mask12 & mu) ^ (~mask12 & pp); + d_p = (mask12 & d) ^ (~mask12 & d_p); + for (size_t i = PARAM_DELTA ; i ; --i) { + X_sigma_p[i] = (mask12 & sigma_copy[i - 1]) ^ (~mask12 & X_sigma_p[i - 1]); + } + + deg_sigma_p = (mask12 & deg_sigma_copy) ^ (~mask12 & deg_sigma_p); + d = syndromes[mu + 1]; + + for (size_t i = 1 ; (i <= mu + 1) && (i <= PARAM_DELTA) ; ++i) { + d ^= PQCLEAN_HQCRMRS128_AVX2_gf_mul(sigma[i], syndromes[mu + 1 - i]); + } + } + + return deg_sigma; +} + + + +/** + * @brief Computes the error polynomial error from the error locator polynomial sigma + * + * See function PQCLEAN_HQCRMRS128_AVX2_fft for more details. + * + * @param[out] error Array of 2^PARAM_M elements receiving the error polynomial + * @param[out] error_compact Array of PARAM_DELTA + PARAM_N1 elements receiving a compact representation of the vector error + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + */ +static void compute_roots(uint8_t *error, uint16_t *sigma) { + uint16_t w[1 << PARAM_M] = {0}; + + PQCLEAN_HQCRMRS128_AVX2_fft(w, sigma, PARAM_DELTA + 1); + PQCLEAN_HQCRMRS128_AVX2_fft_retrieve_error_poly(error, w); +} + + + +/** + * @brief Computes the polynomial z(x) + * + * See @cite lin1983error (Chapter 6 - BCH Codes) for more details. + * + * @param[out] z Array of PARAM_DELTA + 1 elements receiving the polynomial z(x) + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + * @param[in] degree Integer that is the degree of polynomial sigma + * @param[in] syndromes Array of 2 * PARAM_DELTA storing the syndromes + */ +static void compute_z_poly(uint16_t *z, const uint16_t *sigma, uint8_t degree, const uint16_t *syndromes) { + z[0] = 1; + + for (size_t i = 1 ; i < PARAM_DELTA + 1 ; ++i) { + int16_t mask2 = -((uint16_t) (i - degree - 1) >> 15); + z[i] = ((uint16_t)mask2) & sigma[i]; + } + + z[1] ^= syndromes[0]; + + for (size_t i = 2 ; i <= PARAM_DELTA ; ++i) { + int16_t mask2 = -((uint16_t) (i - degree - 1) >> 15); + z[i] ^= ((uint16_t)mask2 & syndromes[i - 1]); + + for (size_t j = 1 ; j < i ; ++j) { + z[i] ^= ((uint16_t)mask2) & PQCLEAN_HQCRMRS128_AVX2_gf_mul(sigma[j], syndromes[i - j - 1]); + } + } +} + + + +/** + * @brief Computes the error values + * + * See @cite lin1983error (Chapter 6 - BCH Codes) for more details. + * + * @param[out] error_values Array of PARAM_DELTA elements receiving the error values + * @param[in] z Array of PARAM_DELTA + 1 elements storing the polynomial z(x) + * @param[in] z_degree Integer that is the degree of polynomial z(x) + * @param[in] error_compact Array of PARAM_DELTA + PARAM_N1 storing compact representation of the error + */ +static void compute_error_values(uint16_t *error_values, const uint16_t *z, const uint8_t *error) { + uint16_t beta_j[PARAM_DELTA] = {0}; + uint16_t e_j[PARAM_DELTA] = {0}; + + uint16_t delta_counter = 0; + uint16_t delta_real_value; + + // Compute the beta_{j_i} page 31 of the documentation + for (size_t i = 0 ; i < PARAM_N1 ; i++) { + uint16_t found = 0; + int16_t valuemask = ((int16_t) - (error[i] != 0)) >> 15; + for (size_t j = 0 ; j < PARAM_DELTA ; j++) { + int16_t indexmask = ((int16_t) - (j == delta_counter)) >> 15; + beta_j[j] += indexmask & valuemask & exp[i]; + found += indexmask & valuemask & 1; + } + delta_counter += found; + } + delta_real_value = delta_counter; + + // Compute the e_{j_i} page 31 of the documentation + for (size_t i = 0 ; i < PARAM_DELTA ; ++i) { + uint16_t tmp1 = 1; + uint16_t tmp2 = 1; + uint16_t inverse = PQCLEAN_HQCRMRS128_AVX2_gf_inverse(beta_j[i]); + uint16_t inverse_power_j = 1; + + for (size_t j = 1 ; j <= PARAM_DELTA ; ++j) { + inverse_power_j = PQCLEAN_HQCRMRS128_AVX2_gf_mul(inverse_power_j, inverse); + tmp1 ^= PQCLEAN_HQCRMRS128_AVX2_gf_mul(inverse_power_j, z[j]); + } + for (size_t k = 1 ; k < PARAM_DELTA ; ++k) { + tmp2 = PQCLEAN_HQCRMRS128_AVX2_gf_mul(tmp2, (1 ^ PQCLEAN_HQCRMRS128_AVX2_gf_mul(inverse, beta_j[(i + k) % PARAM_DELTA]))); + } + int16_t mask = ((int16_t) - (i < delta_real_value)) >> 15; + e_j[i] = mask & PQCLEAN_HQCRMRS128_AVX2_gf_mul(tmp1, PQCLEAN_HQCRMRS128_AVX2_gf_inverse(tmp2)); + } + + // Place the delta e_{j_i} values at the right coordinates of the output vector + delta_counter = 0; + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + uint16_t found = 0; + int16_t valuemask = ((int16_t) - (error[i] != 0)) >> 15; + for (size_t j = 0 ; j < PARAM_DELTA ; j++) { + int16_t indexmask = ((int16_t) - (j == delta_counter)) >> 15; + error_values[i] += indexmask & valuemask & e_j[j]; + found += indexmask & valuemask & 1; + } + delta_counter += found; + } +} + + + +/** + * @brief Correct the errors + * + * @param[out] cdw Array of PARAM_N1 elements receiving the corrected vector + * @param[in] error Array of the error vector + * @param[in] error_values Array of PARAM_DELTA elements storing the error values + */ +static void correct_errors(uint8_t *cdw, const uint16_t *error_values) { + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + cdw[i] ^= error_values[i]; + } +} + + + +/** + * @brief Decodes the received word + * + * This function relies on six steps: + *
    + *
  1. The first step, is the computation of the 2*PARAM_DELTA syndromes. + *
  2. The second step is the computation of the error-locator polynomial sigma. + *
  3. The third step, done by additive FFT, is finding the error-locator numbers by calculating the roots of the polynomial sigma and takings their inverses. + *
  4. The fourth step, is the polynomial z(x). + *
  5. The fifth step, is the computation of the error values. + *
  6. The sixth step is the correction of the errors in the received polynomial. + *
+ * For a more complete picture on Reed-Solomon decoding, see Shu. Lin and Daniel J. Costello in Error Control Coding: Fundamentals and Applications @cite lin1983error + * + * @param[out] msg Array of size VEC_K_SIZE_64 receiving the decoded message + * @param[in] cdw Array of size VEC_N1_SIZE_64 storing the received word + */ +void PQCLEAN_HQCRMRS128_AVX2_reed_solomon_decode(uint64_t *msg, uint64_t *cdw) { + uint8_t cdw_bytes[PARAM_N1] = {0}; + uint16_t syndromes[2 * PARAM_DELTA] = {0}; + uint16_t sigma[1 << PARAM_FFT] = {0}; + uint8_t error[1 << PARAM_M] = {0}; + uint16_t z[PARAM_N1] = {0}; + uint16_t error_values[PARAM_N1] = {0}; + + // Copy the vector in an array of bytes + memcpy(cdw_bytes, cdw, PARAM_N1); + + // Calculate the 2*PARAM_DELTA syndromes + compute_syndromes(syndromes, cdw_bytes); + + // Compute the error locator polynomial sigma + // Sigma's degree is at most PARAM_DELTA but the FFT requires the extra room + size_t deg = compute_elp(sigma, syndromes); + + // Compute the error polynomial error + compute_roots(error, sigma); + + // Compute the polynomial z(x) + compute_z_poly(z, sigma, deg, syndromes); + + // Compute the error values + compute_error_values(error_values, z, error); + + // Correct the errors + correct_errors(cdw_bytes, error_values); + + // Retrieve the message from the decoded codeword + memcpy(msg, cdw_bytes + (PARAM_G - 1), PARAM_K); + +} diff --git a/crypto_kem/hqc-rmrs-128/avx2/reed_solomon.h b/crypto_kem/hqc-rmrs-128/avx2/reed_solomon.h new file mode 100644 index 00000000..333c091f --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/reed_solomon.h @@ -0,0 +1,20 @@ +#ifndef REED_SOLOMON_H +#define REED_SOLOMON_H + + +/** + * @file reed_solomon.h + * Header file of reed_solomon.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS128_AVX2_reed_solomon_encode(uint64_t *cdw, const uint64_t *msg); + +void PQCLEAN_HQCRMRS128_AVX2_reed_solomon_decode(uint64_t *msg, uint64_t *cdw); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/avx2/vector.c b/crypto_kem/hqc-rmrs-128/avx2/vector.c new file mode 100644 index 00000000..ff97279d --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/vector.c @@ -0,0 +1,200 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +#include +/** + * @file vector.c + * @brief Implementation of vectors sampling and some utilities for the HQC scheme + */ + + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS128_AVX2_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight) { + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; + uint32_t random_data = 0; + uint32_t tmp[PARAM_OMEGA_R] = {0}; + uint8_t exist = 0; + size_t j = 0; + __m256i bit256[PARAM_OMEGA_R]; + __m256i bloc256[PARAM_OMEGA_R]; + static __m256i posCmp256 = (__m256i) { + 0UL, 1UL, 2UL, 3UL + }; +#define LOOP_SIZE CEIL_DIVIDE(PARAM_N, 256) + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (tmp[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + tmp[i] = random_data; + } + } + + for (uint32_t i = 0 ; i < weight ; i++) { + // we store the bloc number and bit position of each vb[i] + uint64_t bloc = tmp[i] >> 6; + bloc256[i] = _mm256_set1_epi64x(bloc >> 2); + uint64_t pos = (bloc & 0x3UL); + __m256i pos256 = _mm256_set1_epi64x(pos); + __m256i mask256 = _mm256_cmpeq_epi64(pos256, posCmp256); + uint64_t bit64 = 1ULL << (tmp[i] & 0x3f); + __m256i bloc256 = _mm256_set1_epi64x(bit64); + bit256[i] = bloc256 & mask256; + } + + for (uint32_t i = 0 ; i < LOOP_SIZE ; i++) { + __m256i aux = _mm256_loadu_si256(((__m256i *)v) + i); + __m256i i256 = _mm256_set1_epi64x(i); + + for (uint32_t j = 0 ; j < weight ; j++) { + __m256i mask256 = _mm256_cmpeq_epi64(bloc256[j], i256); + aux ^= bit256[j] & mask256; + } + _mm256_storeu_si256(((__m256i *)v) + i, aux); + } + +#undef LOOP_SIZE +} + + + +/** + * @brief Generates a random vector of dimension PARAM_N + * + * This function generates a random binary vector of dimension PARAM_N. It generates a random + * array of bytes using the seedexpander function, and drop the extra bits using a mask. + * + * @param[in] v Pointer to an array + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS128_AVX2_vect_set_random(AES_XOF_struct *ctx, uint64_t *v) { + uint8_t rand_bytes[VEC_N_SIZE_BYTES] = {0}; + + seedexpander(ctx, rand_bytes, VEC_N_SIZE_BYTES); + + memcpy(v, rand_bytes, VEC_N_SIZE_BYTES); + v[VEC_N_SIZE_64 - 1] &= BITMASK(PARAM_N, 64); +} + + + +/** + * @brief Generates a random vector + * + * This function generates a random binary vector. It uses the the randombytes function. + * + * @param[in] v Pointer to an array + */ +void PQCLEAN_HQCRMRS128_AVX2_vect_set_random_from_randombytes(uint64_t *v) { + uint8_t rand_bytes [VEC_K_SIZE_BYTES] = {0}; + + randombytes(rand_bytes, VEC_K_SIZE_BYTES); + memcpy(v, rand_bytes, VEC_K_SIZE_BYTES); +} + + + +/** + * @brief Adds two vectors + * + * @param[out] o Pointer to an array that is the result + * @param[in] v1 Pointer to an array that is the first vector + * @param[in] v2 Pointer to an array that is the second vector + * @param[in] size Integer that is the size of the vectors + */ +void PQCLEAN_HQCRMRS128_AVX2_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size) { + for (uint32_t i = 0 ; i < size ; ++i) { + o[i] = v1[i] ^ v2[i]; + } +} + + + +/** + * @brief Compares two vectors + * + * @param[in] v1 Pointer to an array that is first vector + * @param[in] v2 Pointer to an array that is second vector + * @param[in] size Integer that is the size of the vectors + * @returns 0 if the vectors are equals and a negative/psotive value otherwise + */ +int PQCLEAN_HQCRMRS128_AVX2_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size) { + unsigned char diff = 0; + + for (uint32_t i = 0 ; i < size ; i++) { + diff |= ((uint8_t *) v1)[i] ^ ((uint8_t *) v2)[i]; + } + return diff != 0; +} + + + +/** + * @brief Resize a vector so that it contains size_o bits + * + * @param[out] o Pointer to the output vector + * @param[in] size_o Integer that is the size of the output vector in bits + * @param[in] v Pointer to the input vector + * @param[in] size_v Integer that is the size of the input vector in bits + */ +void PQCLEAN_HQCRMRS128_AVX2_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v) { + if (size_o < size_v) { + uint64_t mask = 0x7FFFFFFFFFFFFFFF; + int8_t val = 0; + + if (size_o % 64) { + val = 64 - (size_o % 64); + } + + memcpy(o, v, VEC_N1N2_SIZE_BYTES); + + for (int8_t i = 0 ; i < val ; ++i) { + o[VEC_N1N2_SIZE_64 - 1] &= (mask >> i); + } + } else { + memcpy(o, v, CEIL_DIVIDE(size_v, 8)); + } +} diff --git a/crypto_kem/hqc-rmrs-128/avx2/vector.h b/crypto_kem/hqc-rmrs-128/avx2/vector.h new file mode 100644 index 00000000..c929fcd7 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/avx2/vector.h @@ -0,0 +1,29 @@ +#ifndef VECTOR_H +#define VECTOR_H + + +/** + * @file vector.h + * @brief Header file for vector.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQCRMRS128_AVX2_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight); + +void PQCLEAN_HQCRMRS128_AVX2_vect_set_random(AES_XOF_struct *ctx, uint64_t *v); + +void PQCLEAN_HQCRMRS128_AVX2_vect_set_random_from_randombytes(uint64_t *v); + + +void PQCLEAN_HQCRMRS128_AVX2_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size); + +int PQCLEAN_HQCRMRS128_AVX2_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size); + +void PQCLEAN_HQCRMRS128_AVX2_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/clean/LICENSE b/crypto_kem/hqc-rmrs-128/clean/LICENSE new file mode 100644 index 00000000..d5d21fff --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/LICENSE @@ -0,0 +1 @@ +Public Domain diff --git a/crypto_kem/hqc-rmrs-128/clean/Makefile b/crypto_kem/hqc-rmrs-128/clean/Makefile new file mode 100644 index 00000000..b11c576a --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/Makefile @@ -0,0 +1,19 @@ +# This Makefile can be used with GNU Make or BSD Make + +LIB=libhqc-rmrs-128_clean.a +HEADERS=api.h code.h fft.h gf2x.h gf.h hqc.h parameters.h parsing.h reed_muller.h reed_solomon.h vector.h +OBJECTS=code.o fft.o gf2x.o gf.o hqc.o kem.o parsing.o reed_muller.o reed_solomon.o vector.o + +CFLAGS=-O3 -Wall -Wextra -Wpedantic -Wvla -Werror -Wredundant-decls -Wmissing-prototypes -std=c99 -I../../../common $(EXTRAFLAGS) + +all: $(LIB) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +$(LIB): $(OBJECTS) + $(AR) -r $@ $(OBJECTS) + +clean: + $(RM) $(OBJECTS) + $(RM) $(LIB) diff --git a/crypto_kem/hqc-rmrs-128/clean/Makefile.Microsoft_nmake b/crypto_kem/hqc-rmrs-128/clean/Makefile.Microsoft_nmake new file mode 100644 index 00000000..4a7b8081 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/Makefile.Microsoft_nmake @@ -0,0 +1,19 @@ +# This Makefile can be used with Microsoft Visual Studio's nmake using the command: +# nmake /f Makefile.Microsoft_nmake + +LIBRARY=libhqc-rmrs-128_clean.lib +OBJECTS=code.obj fft.obj gf2x.obj gf.obj hqc.obj kem.obj parsing.obj reed_muller.obj reed_solomon.obj vector.obj + +CFLAGS=/nologo /O2 /I ..\..\..\common /W4 /WX + +all: $(LIBRARY) + +# Make sure objects are recompiled if headers change. +$(OBJECTS): *.h + +$(LIBRARY): $(OBJECTS) + LIB.EXE /NOLOGO /WX /OUT:$@ $** + +clean: + -DEL $(OBJECTS) + -DEL $(LIBRARY) diff --git a/crypto_kem/hqc-rmrs-128/clean/api.h b/crypto_kem/hqc-rmrs-128/clean/api.h new file mode 100644 index 00000000..83a5576b --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/api.h @@ -0,0 +1,25 @@ +#ifndef PQCLEAN_HQCRMRS128_CLEAN_API_H +#define PQCLEAN_HQCRMRS128_CLEAN_API_H +/** + * @file api.h + * @brief NIST KEM API used by the HQC_KEM IND-CCA2 scheme + */ + +#define PQCLEAN_HQCRMRS128_CLEAN_CRYPTO_ALGNAME "HQC-RMRS-128" + +#define PQCLEAN_HQCRMRS128_CLEAN_CRYPTO_SECRETKEYBYTES 2647 +#define PQCLEAN_HQCRMRS128_CLEAN_CRYPTO_PUBLICKEYBYTES 2607 +#define PQCLEAN_HQCRMRS128_CLEAN_CRYPTO_BYTES 64 +#define PQCLEAN_HQCRMRS128_CLEAN_CRYPTO_CIPHERTEXTBYTES 5191 + +// As a technicality, the public key is appended to the secret key in order to respect the NIST API. +// Without this constraint, PQCLEAN_HQCRMRS128_CLEAN_CRYPTO_SECRETKEYBYTES would be defined as 32 + +int PQCLEAN_HQCRMRS128_CLEAN_crypto_kem_keypair(unsigned char *pk, unsigned char *sk); + +int PQCLEAN_HQCRMRS128_CLEAN_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk); + +int PQCLEAN_HQCRMRS128_CLEAN_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/clean/code.c b/crypto_kem/hqc-rmrs-128/clean/code.c new file mode 100644 index 00000000..8e33370e --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/code.c @@ -0,0 +1,47 @@ +#include "code.h" +#include "parameters.h" +#include "reed_muller.h" +#include "reed_solomon.h" +#include +#include +/** + * @file code.c + * @brief Implementation of concatenated code + */ + + + +/** + * + * @brief Encoding the message m to a code word em using the concatenated code + * + * First we encode the message using the Reed-Solomon code, then with the duplicated Reed-Muller code we obtain + * a concatenated code word. + * + * @param[out] em Pointer to an array that is the tensor code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQCRMRS128_CLEAN_code_encode(uint64_t *em, const uint64_t *m) { + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQCRMRS128_CLEAN_reed_solomon_encode(tmp, m); + PQCLEAN_HQCRMRS128_CLEAN_reed_muller_encode(em, tmp); + +} + + + +/** + * @brief Decoding the code word em to a message m using the concatenated code + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQCRMRS128_CLEAN_code_decode(uint64_t *m, const uint64_t *em) { + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQCRMRS128_CLEAN_reed_muller_decode(tmp, em); + PQCLEAN_HQCRMRS128_CLEAN_reed_solomon_decode(m, tmp); + + +} diff --git a/crypto_kem/hqc-rmrs-128/clean/code.h b/crypto_kem/hqc-rmrs-128/clean/code.h new file mode 100644 index 00000000..c63963eb --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/code.h @@ -0,0 +1,20 @@ +#ifndef CODE_H +#define CODE_H + + +/** + * @file code.h + * Header file of code.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS128_CLEAN_code_encode(uint64_t *em, const uint64_t *message); + +void PQCLEAN_HQCRMRS128_CLEAN_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/clean/fft.c b/crypto_kem/hqc-rmrs-128/clean/fft.c new file mode 100644 index 00000000..c00f1ac0 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/fft.c @@ -0,0 +1,331 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include +#include +/** + * @file fft.c + * Implementation of the additive FFT and its transpose. + * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + */ + + +static void compute_fft_betas(uint16_t *betas); +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size); +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f); +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); + + +/** + * @brief Computes the basis of betas (omitting 1) used in the additive FFT and its transpose + * + * @param[out] betas Array of size PARAM_M-1 + */ +static void compute_fft_betas(uint16_t *betas) { + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + betas[i] = 1 << (PARAM_M - 1 - i); + } +} + + + +/** + * @brief Computes the subset sums of the given set + * + * The array subset_sums is such that its ith element is + * the subset sum of the set elements given by the binary form of i. + * + * @param[out] subset_sums Array of size 2^set_size receiving the subset sums + * @param[in] set Array of set_size elements + * @param[in] set_size Size of the array set + */ +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size) { + subset_sums[0] = 0; + + for (size_t i = 0 ; i < set_size ; ++i) { + for (size_t j = 0 ; j < (1U << i) ; ++j) { + subset_sums[(1 << i) + j] = set[i] ^ subset_sums[j]; + } + } +} + + + +/** + * @brief Computes the radix conversion of a polynomial f in GF(2^m)[x] + * + * Computes f0 and f1 such that f(x) = f0(x^2-x) + x.f1(x^2-x) + * as proposed by Bernstein, Chou and Schwabe: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f0 Array half the size of f + * @param[out] f1 Array half the size of f + * @param[in] f Array of size a power of 2 + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f) { + switch (m_f) { + case 4: + f0[4] = f[8] ^ f[12]; + f0[6] = f[12] ^ f[14]; + f0[7] = f[14] ^ f[15]; + f1[5] = f[11] ^ f[13]; + f1[6] = f[13] ^ f[14]; + f1[7] = f[15]; + f0[5] = f[10] ^ f[12] ^ f1[5]; + f1[4] = f[9] ^ f[13] ^ f0[5]; + + f0[0] = f[0]; + f1[3] = f[7] ^ f[11] ^ f[15]; + f0[3] = f[6] ^ f[10] ^ f[14] ^ f1[3]; + f0[2] = f[4] ^ f0[4] ^ f0[3] ^ f1[3]; + f1[1] = f[3] ^ f[5] ^ f[9] ^ f[13] ^ f1[3]; + f1[2] = f[3] ^ f1[1] ^ f0[3]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 3: + f0[0] = f[0]; + f0[2] = f[4] ^ f[6]; + f0[3] = f[6] ^ f[7]; + f1[1] = f[3] ^ f[5] ^ f[7]; + f1[2] = f[5] ^ f[6]; + f1[3] = f[7]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 2: + f0[0] = f[0]; + f0[1] = f[2] ^ f[3]; + f1[0] = f[1] ^ f0[1]; + f1[1] = f[3]; + return; + + case 1: + f0[0] = f[0]; + f1[0] = f[1]; + return; + + default: + ; + size_t n = 1 << (m_f - 2); + + uint16_t Q[2 * (1 << (PARAM_FFT - 2))]; + uint16_t R[2 * (1 << (PARAM_FFT - 2))]; + + uint16_t Q0[1 << (PARAM_FFT - 2)]; + uint16_t Q1[1 << (PARAM_FFT - 2)]; + uint16_t R0[1 << (PARAM_FFT - 2)]; + uint16_t R1[1 << (PARAM_FFT - 2)]; + + memcpy(Q, f + 3 * n, 2 * n); + memcpy(Q + n, f + 3 * n, 2 * n); + memcpy(R, f, 4 * n); + + for (size_t i = 0 ; i < n ; ++i) { + Q[i] ^= f[2 * n + i]; + R[n + i] ^= Q[i]; + } + + radix(Q0, Q1, Q, m_f - 1); + radix(R0, R1, R, m_f - 1); + + memcpy(f0, R0, 2 * n); + memcpy(f0 + n, Q0, 2 * n); + memcpy(f1, R1, 2 * n); + memcpy(f1 + n, Q1, 2 * n); + } +} + + + +/** + * @brief Evaluates f at all subset sums of a given set + * + * This function is a subroutine of the function fft. + * + * @param[out] w Array + * @param[in] f Array + * @param[in] f_coeffs Number of coefficients of f + * @param[in] m Number of betas + * @param[in] m_f Number of coefficients of f (one more than its degree) + * @param[in] betas FFT constants + */ +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + uint16_t f0[1 << (PARAM_FFT - 2)]; + uint16_t f1[1 << (PARAM_FFT - 2)]; + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + size_t k = 1 << (m - 1); + uint16_t gammas_sums[1 << (PARAM_M - 2)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + uint16_t tmp[PARAM_M - (PARAM_FFT - 1)]; + for (size_t i = 0 ; i < m ; ++i) { + tmp[i] = PQCLEAN_HQCRMRS128_CLEAN_gf_mul(betas[i], f[1]); + } + + w[0] = f[0]; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + w[(1 << j) + k] = w[k] ^ tmp[j]; + } + } + + return; + } + + // Step 2: compute g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQCRMRS128_CLEAN_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQCRMRS128_CLEAN_gf_mul(beta_m_pow, f[i]); + } + } + + // Step 3 + radix(f0, f1, f, m_f); + + // Step 4: compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQCRMRS128_CLEAN_gf_mul(betas[i], PQCLEAN_HQCRMRS128_CLEAN_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQCRMRS128_CLEAN_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + + if (f_coeffs <= 3) { // 3-coefficient polynomial f case: f1 is constant + w[0] = u[0]; + w[k] = u[0] ^ f1[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS128_CLEAN_gf_mul(gammas_sums[i], f1[0]); + w[k + i] = w[i] ^ f1[0]; + } + } else { + fft_rec(v, f1, f_coeffs / 2, m - 1, m_f - 1, deltas); + + // Step 6 + memcpy(w + k, v, 2 * k); + w[0] = u[0]; + w[k] ^= u[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS128_CLEAN_gf_mul(gammas_sums[i], v[i]); + w[k + i] ^= w[i]; + } + } +} + + + +/** + * @brief Evaluates f on all fields elements using an additive FFT algorithm + * + * f_coeffs is the number of coefficients of f (one less than its degree).
+ * The FFT proceeds recursively to evaluate f at all subset sums of a basis B.
+ * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf
+ * Note that on this first call (as opposed to the recursive calls to fft_rec), gammas are equal to betas, + * meaning the first gammas subset sums are actually the subset sums of betas (except 1).
+ * Also note that f is altered during computation (twisted at each level). + * + * @param[out] w Array + * @param[in] f Array of 2^PARAM_FFT elements + * @param[in] f_coeffs Number coefficients of f (i.e. deg(f)+1) + */ +void PQCLEAN_HQCRMRS128_CLEAN_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs) { + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + uint16_t f0[1 << (PARAM_FFT - 1)]; + uint16_t f1[1 << (PARAM_FFT - 1)]; + uint16_t deltas[PARAM_M - 1]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)]; + uint16_t v[1 << (PARAM_M - 1)]; + + // Follows Gao and Mateer algorithm + compute_fft_betas(betas); + + // Step 1: PARAM_FFT > 1, nothing to do + + // Compute gammas sums + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + // Step 2: beta_m = 1, nothing to do + + // Step 3 + radix(f0, f1, f, PARAM_FFT); + + // Step 4: Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQCRMRS128_CLEAN_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + fft_rec(v, f1, f_coeffs / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + + // Step 6, 7 and error polynomial computation + memcpy(w + k, v, 2 * k); + + // Check if 0 is root + w[0] = u[0]; + + // Check if 1 is root + w[k] ^= u[0]; + + // Find other roots + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS128_CLEAN_gf_mul(betas_sums[i], v[i]); + w[k + i] ^= w[i]; + } +} + + + +/** + * @brief Retrieves the error polynomial error from the evaluations w of the ELP (Error Locator Polynomial) on all field elements. + * + * @param[out] error Array with the error + * @param[out] error_compact Array with the error in a compact form + * @param[in] w Array of size 2^PARAM_M + */ +void PQCLEAN_HQCRMRS128_CLEAN_fft_retrieve_error_poly(uint8_t *error, const uint16_t *w) { + uint16_t gammas[PARAM_M - 1] = {0}; + uint16_t gammas_sums[1 << (PARAM_M - 1)] = {0}; + size_t k = 1 << (PARAM_M - 1); + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + error[0] ^= 1 ^ ((uint16_t) - w[0] >> 15); + error[0] ^= 1 ^ ((uint16_t) - w[k] >> 15); + + size_t index = PARAM_GF_MUL_ORDER; + + for (size_t i = 1 ; i < k ; ++i) { + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQCRMRS128_CLEAN_gf_log(gammas_sums[i]); + error[index] ^= 1 ^ ((uint16_t) - w[i] >> 15); + + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQCRMRS128_CLEAN_gf_log(gammas_sums[i] ^ 1); + error[index] ^= 1 ^ ((uint16_t) - w[k + i] >> 15); + } +} diff --git a/crypto_kem/hqc-rmrs-128/clean/fft.h b/crypto_kem/hqc-rmrs-128/clean/fft.h new file mode 100644 index 00000000..4c9d3d2b --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/fft.h @@ -0,0 +1,21 @@ +#ifndef FFT_H +#define FFT_H + + +/** + * @file fft.h + * Header file of fft.c + */ + + +#include + +#include +#include + +void PQCLEAN_HQCRMRS128_CLEAN_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs); + +void PQCLEAN_HQCRMRS128_CLEAN_fft_retrieve_error_poly(uint8_t *error, const uint16_t *w); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/clean/gf.c b/crypto_kem/hqc-rmrs-128/clean/gf.c new file mode 100644 index 00000000..5a9da4b8 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/gf.c @@ -0,0 +1,116 @@ +#include "gf.h" +#include "parameters.h" +#include +/** + * @file gf.c + * Galois field implementation with multiplication using lookup tables + */ + + + +/** + * Generates exp and log lookup tables of GF(2^m). + * The logarithm of 0 is defined as 2^PARAM_M by convention.
+ * The last two elements of the exp table are needed by the PQCLEAN_HQCRMRS128_CLEAN_gf_mul function. + * (for example if both elements to multiply are zero). + * @param[out] exp Array of size 2^PARAM_M + 2 receiving the powers of the primitive element + * @param[out] log Array of size 2^PARAM_M receiving the logarithms of the elements of GF(2^m) + * @param[in] m Parameter of Galois field GF(2^m) + */ +void PQCLEAN_HQCRMRS128_CLEAN_gf_generate(uint16_t *exp, uint16_t *log, int16_t m) { + uint16_t elt = 1; + uint16_t alpha = 2; // primitive element of GF(2^PARAM_M) + uint16_t gf_poly = PARAM_GF_POLY; + + for (size_t i = 0 ; i < (1U << m) - 1 ; ++i) { + exp[i] = elt; + log[elt] = i; + + elt *= alpha; + if (elt >= 1 << m) { + elt ^= gf_poly; + } + } + + exp[(1 << m) - 1] = 1; + exp[1 << m] = 2; + exp[(1 << m) + 1] = 4; + log[0] = 1 << m; // by convention +} + + + +/** + * Returns the requested power of the primitive element of GF(2^PARAM_M). + * @returns a^i + */ +uint16_t PQCLEAN_HQCRMRS128_CLEAN_gf_exp(uint16_t i) { + return exp[i]; +} + + + +/** + * Returns the integer i such that elt = a^i + * where a is the primitive element of GF(2^PARAM_M). + * @returns the logarithm of the given element + */ +uint16_t PQCLEAN_HQCRMRS128_CLEAN_gf_log(uint16_t elt) { + return log[elt]; +} + + + +/** + * Multiplies nonzero element 'a' by element 'b'. + * @returns the product a*b + * @param[in] a First element of GF(2^PARAM_M) to multiply (cannot be zero) + * @param[in] b Second element of GF(2^PARAM_M) to multiply (cannot be zero) + */ +uint16_t PQCLEAN_HQCRMRS128_CLEAN_gf_mul(uint16_t a, uint16_t b) { + // mask = 0xffff if neither a nor b is zero. Otherwise mask is 0. + // mask = 0xffff si ni a ni b n'est nul. sinon mask = 0 + int16_t mask = ((log[a] | log[b]) >> PARAM_M) - 1; + return mask & exp[PQCLEAN_HQCRMRS128_CLEAN_gf_mod(log[a] + log[b])]; +} + + + +/** + * Squares an element of GF(2^PARAM_M). + * @returns a^2 + * @param[in] a Element of GF(2^PARAM_M) + */ +uint16_t PQCLEAN_HQCRMRS128_CLEAN_gf_square(uint16_t a) { + int16_t mask = (log[a] >> PARAM_M) - 1; + return mask & exp[PQCLEAN_HQCRMRS128_CLEAN_gf_mod(2 * log[a])]; +} + + + +/** + * Computes the inverse of an element of GF(2^PARAM_M). + * @returns the inverse of a + * @param[in] a Element of GF(2^PARAM_M) + */ +uint16_t PQCLEAN_HQCRMRS128_CLEAN_gf_inverse(uint16_t a) { + return exp[PARAM_GF_MUL_ORDER - log[a]]; +} + + + +/** + * Returns i modulo 2^PARAM_M-1. + * i must be less than 2*(2^PARAM_M-1). + * Therefore, the return value is either i or i-2^PARAM_M+1. + * @returns i mod (2^PARAM_M-1) + * @param[in] i The integer whose modulo is taken + */ +uint16_t PQCLEAN_HQCRMRS128_CLEAN_gf_mod(uint16_t i) { + uint16_t tmp = (uint16_t) (i - PARAM_GF_MUL_ORDER); + + // mask = 0xffff if(i < PARAM_GF_MUL_ORDER) + uint16_t mask = ~(tmp >> 15) + 1; + + return tmp + (mask & PARAM_GF_MUL_ORDER); +} diff --git a/crypto_kem/hqc-rmrs-128/clean/gf.h b/crypto_kem/hqc-rmrs-128/clean/gf.h new file mode 100644 index 00000000..9082d688 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/gf.h @@ -0,0 +1,48 @@ +#ifndef GF_H +#define GF_H + + +/** + * @file gf.h + * Header file of gf.c + */ + +#include + +#include +#include + + +/** + * Powers of the root alpha of 1 + x^2 + x^3 + x^4 + x^8. + * The last two elements are needed by the PQCLEAN_HQCRMRS128_CLEAN_gf_mul function + * (for example if both elements to multiply are zero). + */ +static const uint16_t exp [258] = { 1, 2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240, 253, 231, 211, 187, 107, 214, 177, 127, 254, 225, 223, 163, 91, 182, 113, 226, 217, 175, 67, 134, 17, 34, 68, 136, 13, 26, 52, 104, 208, 189, 103, 206, 129, 31, 62, 124, 248, 237, 199, 147, 59, 118, 236, 197, 151, 51, 102, 204, 133, 23, 46, 92, 184, 109, 218, 169, 79, 158, 33, 66, 132, 21, 42, 84, 168, 77, 154, 41, 82, 164, 85, 170, 73, 146, 57, 114, 228, 213, 183, 115, 230, 209, 191, 99, 198, 145, 63, 126, 252, 229, 215, 179, 123, 246, 241, 255, 227, 219, 171, 75, 150, 49, 98, 196, 149, 55, 110, 220, 165, 87, 174, 65, 130, 25, 50, 100, 200, 141, 7, 14, 28, 56, 112, 224, 221, 167, 83, 166, 81, 162, 89, 178, 121, 242, 249, 239, 195, 155, 43, 86, 172, 69, 138, 9, 18, 36, 72, 144, 61, 122, 244, 245, 247, 243, 251, 235, 203, 139, 11, 22, 44, 88, 176, 125, 250, 233, 207, 131, 27, 54, 108, 216, 173, 71, 142, 1, 2, 4 }; + + + +/** + * Logarithm of elements of GF(2^8) to the base alpha (root of 1 + x^2 + x^3 + x^4 + x^8). + * The logarithm of 0 is set to 0 by convention. + */ +static const uint16_t log [256] = { 0, 0, 1, 25, 2, 50, 26, 198, 3, 223, 51, 238, 27, 104, 199, 75, 4, 100, 224, 14, 52, 141, 239, 129, 28, 193, 105, 248, 200, 8, 76, 113, 5, 138, 101, 47, 225, 36, 15, 33, 53, 147, 142, 218, 240, 18, 130, 69, 29, 181, 194, 125, 106, 39, 249, 185, 201, 154, 9, 120, 77, 228, 114, 166, 6, 191, 139, 98, 102, 221, 48, 253, 226, 152, 37, 179, 16, 145, 34, 136, 54, 208, 148, 206, 143, 150, 219, 189, 241, 210, 19, 92, 131, 56, 70, 64, 30, 66, 182, 163, 195, 72, 126, 110, 107, 58, 40, 84, 250, 133, 186, 61, 202, 94, 155, 159, 10, 21, 121, 43, 78, 212, 229, 172, 115, 243, 167, 87, 7, 112, 192, 247, 140, 128, 99, 13, 103, 74, 222, 237, 49, 197, 254, 24, 227, 165, 153, 119, 38, 184, 180, 124, 17, 68, 146, 217, 35, 32, 137, 46, 55, 63, 209, 91, 149, 188, 207, 205, 144, 135, 151, 178, 220, 252, 190, 97, 242, 86, 211, 171, 20, 42, 93, 158, 132, 60, 57, 83, 71, 109, 65, 162, 31, 45, 67, 216, 183, 123, 164, 118, 196, 23, 73, 236, 127, 12, 111, 246, 108, 161, 59, 82, 41, 157, 85, 170, 251, 96, 134, 177, 187, 204, 62, 90, 203, 89, 95, 176, 156, 169, 160, 81, 11, 245, 22, 235, 122, 117, 44, 215, 79, 174, 213, 233, 230, 231, 173, 232, 116, 214, 244, 234, 168, 80, 88, 175 }; + + +void PQCLEAN_HQCRMRS128_CLEAN_gf_generate(uint16_t *exp, uint16_t *log, int16_t m); + + +uint16_t PQCLEAN_HQCRMRS128_CLEAN_gf_log(uint16_t elt); + +uint16_t PQCLEAN_HQCRMRS128_CLEAN_gf_exp(uint16_t i); + +uint16_t PQCLEAN_HQCRMRS128_CLEAN_gf_mul(uint16_t a, uint16_t b); + +uint16_t PQCLEAN_HQCRMRS128_CLEAN_gf_square(uint16_t a); + +uint16_t PQCLEAN_HQCRMRS128_CLEAN_gf_inverse(uint16_t a); + +uint16_t PQCLEAN_HQCRMRS128_CLEAN_gf_mod(uint16_t i); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/clean/gf2x.c b/crypto_kem/hqc-rmrs-128/clean/gf2x.c new file mode 100644 index 00000000..2a4dd88b --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/gf2x.c @@ -0,0 +1,155 @@ +#include "gf2x.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include +#include +#include +/** + * \file gf2x.c + * \brief Implementation of multiplication of two polynomials + */ + + +static inline void swap(uint16_t *tab, uint16_t elt1, uint16_t elt2); +static void reduce(uint64_t *o, const uint64_t *a); +static void fast_convolution_mult(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx); + +/** + * @brief swap two elements in a table + * + * This function exchanges tab[elt1] with tab[elt2] + * + * @param[in] tab Pointer to the table + * @param[in] elt1 Index of the first element + * @param[in] elt2 Index of the second element + */ +static inline void swap(uint16_t *tab, uint16_t elt1, uint16_t elt2) { + uint16_t tmp = tab[elt1]; + + tab[elt1] = tab[elt2]; + tab[elt2] = tmp; +} + + + +/** + * @brief Compute o(x) = a(x) mod \f$ X^n - 1\f$ + * + * This function computes the modular reduction of the polynomial a(x) + * + * @param[in] a Pointer to the polynomial a(x) + * @param[out] o Pointer to the result + */ +static void reduce(uint64_t *o, const uint64_t *a) { + uint64_t r; + uint64_t carry; + + for (uint32_t i = 0 ; i < VEC_N_SIZE_64 ; i++) { + r = a[i + VEC_N_SIZE_64 - 1] >> (PARAM_N & 63); + carry = (uint64_t) (a[i + VEC_N_SIZE_64] << (64 - (PARAM_N & 63))); + o[i] = a[i] ^ r ^ carry; + } + + o[VEC_N_SIZE_64 - 1] &= RED_MASK; +} + + + +/** + * @brief computes product of the polynomial a1(x) with the sparse polynomial a2 + * + * o(x) = a1(x)a2(x) + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to the sparse polynomial a2 (list of degrees of the monomials which appear in a2) + * @param[in] a2 Pointer to the polynomial a1(x) + * @param[in] weight Hamming wifht of the sparse polynomial a2 + * @param[in] ctx Pointer to a seed expander used to randomize the multiplication process + */ +static void fast_convolution_mult(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx) { +//static uint32_t fast_convolution_mult(const uint64_t *A, const uint32_t *vB, uint64_t *C, const uint16_t w, AES_XOF_struct *ctx) + uint64_t carry; + uint32_t dec, s; + uint64_t table[16 * (VEC_N_SIZE_64 + 1)]; + uint16_t permuted_table[16]; + uint16_t permutation_table[16]; + uint16_t permuted_sparse_vect[PARAM_OMEGA_E]; + uint16_t permutation_sparse_vect[PARAM_OMEGA_E]; + uint64_t *pt; + uint16_t *res_16; + + for (uint32_t i = 0 ; i < 16; i++) { + permuted_table[i] = i; + } + + seedexpander(ctx, (uint8_t *) permutation_table, 16 * sizeof(uint16_t)); + + for (uint32_t i = 0 ; i < 15 ; i++) { + swap(permuted_table + i, 0, permutation_table[i] % (16 - i)); + } + + pt = table + (permuted_table[0] * (VEC_N_SIZE_64 + 1)); + for (int32_t j = 0 ; j < VEC_N_SIZE_64 ; j++) { + pt[j] = a2[j]; + } + pt[VEC_N_SIZE_64] = 0x0; + + for (uint32_t i = 1 ; i < 16 ; i++) { + carry = 0; + pt = table + (permuted_table[i] * (VEC_N_SIZE_64 + 1)); + for (uint32_t j = 0 ; j < VEC_N_SIZE_64 ; j++) { + pt[j] = (a2[j] << i) ^ carry; + carry = (a2[j] >> ((64 - i))); + } + pt[VEC_N_SIZE_64] = carry; + } + + for (uint32_t i = 0 ; i < weight ; i++) { + permuted_sparse_vect[i] = i; + } + + seedexpander(ctx, (uint8_t *) permutation_sparse_vect, weight * sizeof(uint16_t)); + + for (uint32_t i = 0 ; i + 1 < weight ; i++) { + swap(permuted_sparse_vect + i, 0, permutation_sparse_vect[i] % (weight - i)); + } + + for (uint32_t i = 0 ; i < weight ; i++) { + dec = a1[permuted_sparse_vect[i]] & 0xf; + s = a1[permuted_sparse_vect[i]] >> 4; + res_16 = ((uint16_t *) o) + s; + pt = table + (permuted_table[dec] * (VEC_N_SIZE_64 + 1)); + + for (uint32_t j = 0 ; j < VEC_N_SIZE_64 + 1 ; j++) { + *res_16++ ^= (uint16_t) pt[j]; + *res_16++ ^= (uint16_t) (pt[j] >> 16); + *res_16++ ^= (uint16_t) (pt[j] >> 32); + *res_16++ ^= (uint16_t) (pt[j] >> 48); + } + } +} + + + +/** + * @brief Multiply two polynomials modulo \f$ X^n - 1\f$. + * + * This functions multiplies a sparse polynomial a1 (of Hamming weight equal to weight) + * and a dense polynomial a2. The multiplication is done modulo \f$ X^n - 1\f$. + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to the sparse polynomial + * @param[in] a2 Pointer to the dense polynomial + * @param[in] weight Integer that is the weigt of the sparse polynomial + * @param[in] ctx Pointer to the randomness context + */ +void PQCLEAN_HQCRMRS128_CLEAN_vect_mul(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx) { + uint64_t tmp[2 * VEC_N_SIZE_64 + 1]; + for (uint32_t j = 0 ; j < 2 * VEC_N_SIZE_64 + 1 ; j++) { + tmp[j] = 0; + } + + fast_convolution_mult(tmp, a1, a2, weight, ctx); + reduce(o, tmp); +} diff --git a/crypto_kem/hqc-rmrs-128/clean/gf2x.h b/crypto_kem/hqc-rmrs-128/clean/gf2x.h new file mode 100644 index 00000000..bc1dd354 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/gf2x.h @@ -0,0 +1,18 @@ +#ifndef GF2X_H +#define GF2X_H + + +/** + * @file gf2x.h + * @brief Header file for gf2x.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQCRMRS128_CLEAN_vect_mul(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/clean/hqc.c b/crypto_kem/hqc-rmrs-128/clean/hqc.c new file mode 100644 index 00000000..9e0855e1 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/hqc.c @@ -0,0 +1,143 @@ +#include "code.h" +#include "gf2x.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +/** + * @file hqc.c + * @brief Implementation of hqc.h + */ + + + +/** + * @brief Keygen of the HQC_PKE IND_CPA scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS128_CLEAN_hqc_pke_keygen(unsigned char *pk, unsigned char *sk) { + AES_XOF_struct sk_seedexpander; + AES_XOF_struct pk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + uint8_t pk_seed[SEED_BYTES] = {0}; + uint64_t x[VEC_N_SIZE_64] = {0}; + uint32_t y[PARAM_OMEGA] = {0}; + uint64_t h[VEC_N_SIZE_64] = {0}; + uint64_t s[VEC_N_SIZE_64] = {0}; + + // Create seed_expanders for public key and secret key + randombytes(sk_seed, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + randombytes(pk_seed, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute secret key + PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_fixed_weight_by_coordinates(&sk_seedexpander, y, PARAM_OMEGA); + + // Compute public key + PQCLEAN_HQCRMRS128_CLEAN_vect_set_random(&pk_seedexpander, h); + PQCLEAN_HQCRMRS128_CLEAN_vect_mul(s, y, h, PARAM_OMEGA, &sk_seedexpander); + PQCLEAN_HQCRMRS128_CLEAN_vect_add(s, x, s, VEC_N_SIZE_64); + + // Parse keys to string + PQCLEAN_HQCRMRS128_CLEAN_hqc_public_key_to_string(pk, pk_seed, s); + PQCLEAN_HQCRMRS128_CLEAN_hqc_secret_key_to_string(sk, sk_seed, pk); + +} + + + +/** + * @brief Encryption of the HQC_PKE IND_CPA scheme + * + * The cihertext is composed of vectors u and v. + * + * @param[out] u Vector u (first part of the ciphertext) + * @param[out] v Vector v (second part of the ciphertext) + * @param[in] m Vector representing the message to encrypt + * @param[in] theta Seed used to derive randomness required for encryption + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS128_CLEAN_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk) { + AES_XOF_struct seedexpander; + uint64_t h[VEC_N_SIZE_64] = {0}; + uint64_t s[VEC_N_SIZE_64] = {0}; + uint64_t r1[VEC_N_SIZE_64] = {0}; + uint32_t r2[PARAM_OMEGA_R] = {0}; + uint64_t e[VEC_N_SIZE_64] = {0}; + uint64_t tmp1[VEC_N_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_SIZE_64] = {0}; + + // Create seed_expander from theta + seedexpander_init(&seedexpander, theta, theta + 32, SEEDEXPANDER_MAX_LENGTH); + + // Retrieve h and s from public key + PQCLEAN_HQCRMRS128_CLEAN_hqc_public_key_from_string(h, s, pk); + + // Generate r1, r2 and e + PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_fixed_weight(&seedexpander, r1, PARAM_OMEGA_R); + PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_fixed_weight_by_coordinates(&seedexpander, r2, PARAM_OMEGA_R); + PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_fixed_weight(&seedexpander, e, PARAM_OMEGA_E); + + // Compute u = r1 + r2.h + PQCLEAN_HQCRMRS128_CLEAN_vect_mul(u, r2, h, PARAM_OMEGA_R, &seedexpander); + PQCLEAN_HQCRMRS128_CLEAN_vect_add(u, r1, u, VEC_N_SIZE_64); + + // Compute v = m.G by encoding the message + PQCLEAN_HQCRMRS128_CLEAN_code_encode(v, m); + PQCLEAN_HQCRMRS128_CLEAN_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + + // Compute v = m.G + s.r2 + e + PQCLEAN_HQCRMRS128_CLEAN_vect_mul(tmp2, r2, s, PARAM_OMEGA_R, &seedexpander); + PQCLEAN_HQCRMRS128_CLEAN_vect_add(tmp2, e, tmp2, VEC_N_SIZE_64); + PQCLEAN_HQCRMRS128_CLEAN_vect_add(tmp2, tmp1, tmp2, VEC_N_SIZE_64); + PQCLEAN_HQCRMRS128_CLEAN_vect_resize(v, PARAM_N1N2, tmp2, PARAM_N); + +} + + + +/** + * @brief Decryption of the HQC_PKE IND_CPA scheme + * + * @param[out] m Vector representing the decrypted message + * @param[in] u Vector u (first part of the ciphertext) + * @param[in] v Vector v (second part of the ciphertext) + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS128_CLEAN_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk) { + uint64_t x[VEC_N_SIZE_64] = {0}; + uint32_t y[PARAM_OMEGA] = {0}; + uint8_t pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t tmp1[VEC_N_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_SIZE_64] = {0}; + AES_XOF_struct perm_seedexpander; + uint8_t perm_seed[SEED_BYTES] = {0}; + + // Retrieve x, y, pk from secret key + PQCLEAN_HQCRMRS128_CLEAN_hqc_secret_key_from_string(x, y, pk, sk); + + randombytes(perm_seed, SEED_BYTES); + seedexpander_init(&perm_seedexpander, perm_seed, perm_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute v - u.y + PQCLEAN_HQCRMRS128_CLEAN_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + PQCLEAN_HQCRMRS128_CLEAN_vect_mul(tmp2, y, u, PARAM_OMEGA, &perm_seedexpander); + PQCLEAN_HQCRMRS128_CLEAN_vect_add(tmp2, tmp1, tmp2, VEC_N_SIZE_64); + + + // Compute m by decoding v - u.y + PQCLEAN_HQCRMRS128_CLEAN_code_decode(m, tmp2); +} diff --git a/crypto_kem/hqc-rmrs-128/clean/hqc.h b/crypto_kem/hqc-rmrs-128/clean/hqc.h new file mode 100644 index 00000000..67ba8f0e --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/hqc.h @@ -0,0 +1,21 @@ +#ifndef HQC_H +#define HQC_H + + +/** + * @file hqc.h + * @brief Functions of the HQC_PKE IND_CPA scheme + */ + +#include + +#include + +void PQCLEAN_HQCRMRS128_CLEAN_hqc_pke_keygen(unsigned char *pk, unsigned char *sk); + +void PQCLEAN_HQCRMRS128_CLEAN_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk); + +void PQCLEAN_HQCRMRS128_CLEAN_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/clean/kem.c b/crypto_kem/hqc-rmrs-128/clean/kem.c new file mode 100644 index 00000000..5bc2aac0 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/kem.c @@ -0,0 +1,138 @@ +#include "api.h" +#include "fips202.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "sha2.h" +#include "vector.h" +#include +#include +/** + * @file kem.c + * @brief Implementation of api.h + */ + + + +/** + * @brief Keygen of the HQC_KEM IND_CAA2 scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + * @returns 0 if keygen is successful + */ +int PQCLEAN_HQCRMRS128_CLEAN_crypto_kem_keypair(unsigned char *pk, unsigned char *sk) { + + PQCLEAN_HQCRMRS128_CLEAN_hqc_pke_keygen(pk, sk); + return 0; +} + + + +/** + * @brief Encapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ct String containing the ciphertext + * @param[out] ss String containing the shared secret + * @param[in] pk String containing the public key + * @returns 0 if encapsulation is successful + */ +int PQCLEAN_HQCRMRS128_CLEAN_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk) { + + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint64_t u[VEC_N_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Computing m + PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_from_randombytes(m); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m + PQCLEAN_HQCRMRS128_CLEAN_hqc_pke_encrypt(u, v, m, theta, pk); + + // Computing d + sha512(d, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Computing ciphertext + PQCLEAN_HQCRMRS128_CLEAN_hqc_ciphertext_to_string(ct, u, v, d); + + + return 0; +} + + + +/** + * @brief Decapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ss String containing the shared secret + * @param[in] ct String containing the cipĥertext + * @param[in] sk String containing the secret key + * @returns 0 if decapsulation is successful, -1 otherwise + */ +int PQCLEAN_HQCRMRS128_CLEAN_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk) { + + int8_t result = -1; + uint64_t u[VEC_N_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t u2[VEC_N_SIZE_64] = {0}; + uint64_t v2[VEC_N1N2_SIZE_64] = {0}; + unsigned char d2[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Retrieving u, v and d from ciphertext + PQCLEAN_HQCRMRS128_CLEAN_hqc_ciphertext_from_string(u, v, d, ct); + + // Retrieving pk from sk + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); + + // Decryting + PQCLEAN_HQCRMRS128_CLEAN_hqc_pke_decrypt(m, u, v, sk); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m' + PQCLEAN_HQCRMRS128_CLEAN_hqc_pke_encrypt(u2, v2, m, theta, pk); + + // Computing d' + sha512(d2, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Abort if c != c' or d != d' + result = (PQCLEAN_HQCRMRS128_CLEAN_vect_compare(u, u2, VEC_N_SIZE_BYTES) == 0 && PQCLEAN_HQCRMRS128_CLEAN_vect_compare(v, v2, VEC_N1N2_SIZE_BYTES) == 0 && memcmp(d, d2, SHA512_BYTES) == 0); + for (size_t i = 0 ; i < SHARED_SECRET_BYTES ; i++) { + ss[i] = result * ss[i]; + } + result--; + + + return result; +} diff --git a/crypto_kem/hqc-rmrs-128/clean/parameters.h b/crypto_kem/hqc-rmrs-128/clean/parameters.h new file mode 100644 index 00000000..0aa2be8e --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/parameters.h @@ -0,0 +1,102 @@ +#ifndef HQC_PARAMETERS_H +#define HQC_PARAMETERS_H + + +/** + * @file parameters.h + * @brief Parameters of the HQC_KEM IND-CCA2 scheme + */ + +#include "api.h" +#include "api.h" + + +#define CEIL_DIVIDE(a, b) (((a)/(b)) + ((a) % (b) == 0 ? 0 : 1)) /*!< Divide a by b and ceil the result*/ +#define BITMASK(a, size) ((1UL << ((a) % (size))) - 1) /*!< Create a mask*/ + + +/* + #define PARAM_N Define the parameter n of the scheme + #define PARAM_N1 Define the parameter n1 of the scheme (length of Reed-Solomon code) + #define PARAM_N2 Define the parameter n2 of the scheme (length of Duplicated Reed-Muller code) + #define PARAM_N1N2 Define the length in bits of the Concatenated code + #define PARAM_OMEGA Define the parameter omega of the scheme + #define PARAM_OMEGA_E Define the parameter omega_e of the scheme + #define PARAM_OMEGA_R Define the parameter omega_r of the scheme + #define PARAM_SECURITY Define the security level corresponding to the chosen parameters + #define PARAM_DFR_EXP Define the decryption failure rate corresponding to the chosen parameters + + #define SECRET_KEY_BYTES Define the size of the secret key in bytes + #define PUBLIC_KEY_BYTES Define the size of the public key in bytes + #define SHARED_SECRET_BYTES Define the size of the shared secret in bytes + #define CIPHERTEXT_BYTES Define the size of the ciphertext in bytes + + #define UTILS_REJECTION_THRESHOLD Define the rejection threshold used to generate given weight vectors (see vector_set_random_fixed_weight function) + #define VEC_N_SIZE_BYTES Define the size of the array used to store a PARAM_N sized vector in bytes + #define VEC_K_SIZE_BYTES Define the size of the array used to store a PARAM_K sized vector in bytes + #define VEC_N1Y_SIZE_BYTES Define the size of the array used to store a PARAM_N1 sized vector in bytes + #define VEC_N1N2_SIZE_BYTES Define the size of the array used to store a PARAM_N1N2 sized vector in bytes + + #define VEC_N_SIZE_64 Define the size of the array used to store a PARAM_N sized vector in 64 bits + #define VEC_K_SIZE_64 Define the size of the array used to store a PARAM_K sized vector in 64 bits + #define VEC_N1_SIZE_64 Define the size of the array used to store a PARAM_N1 sized vector in 64 bits + #define VEC_N1N2_SIZE_64 Define the size of the array used to store a PARAM_N1N2 sized vector in 64 bits + + #define PARAM_DELTA Define the parameter delta of the scheme (correcting capacity of the Reed-Solomon code) + #define PARAM_M Define a positive integer + #define PARAM_GF_POLY Generator polynomial of galois field GF(2^PARAM_M), represented in hexadecimial form + #define PARAM_GF_MUL_ORDER Define the size of the multiplicative group of GF(2^PARAM_M), i.e 2^PARAM_M -1 + #define PARAM_K Define the size of the information bits of the Reed-Solomon code + #define PARAM_G Define the size of the generator polynomial of Reed-Solomon code + #define PARAM_FFT The additive FFT takes a 2^PARAM_FFT polynomial as input + We use the FFT to compute the roots of sigma, whose degree if PARAM_DELTA=24 + The smallest power of 2 greater than 24+1 is 32=2^5 + #define RS_POLY_COEFS Coefficients of the generator polynomial of the Reed-Solomon code + + #define RED_MASK A mask fot the higher bits of a vector + #define SHA512_BYTES Define the size of SHA512 output in bytes + #define SEED_BYTES Define the size of the seed in bytes + #define SEEDEXPANDER_MAX_LENGTH Define the seed expander max length +*/ + +#define PARAM_N 20533 +#define PARAM_N1 80 +#define PARAM_N2 256 +#define PARAM_N1N2 20480 +#define PARAM_OMEGA 67 +#define PARAM_OMEGA_E 77 +#define PARAM_OMEGA_R 77 +#define PARAM_SECURITY 128 +#define PARAM_DFR_EXP 128 + +#define SECRET_KEY_BYTES PQCLEAN_HQCRMRS128_CLEAN_CRYPTO_SECRETKEYBYTES +#define PUBLIC_KEY_BYTES PQCLEAN_HQCRMRS128_CLEAN_CRYPTO_PUBLICKEYBYTES +#define SHARED_SECRET_BYTES PQCLEAN_HQCRMRS128_CLEAN_CRYPTO_BYTES +#define CIPHERTEXT_BYTES PQCLEAN_HQCRMRS128_CLEAN_CRYPTO_CIPHERTEXTBYTES + +#define UTILS_REJECTION_THRESHOLD 16775461 +#define VEC_N_SIZE_BYTES CEIL_DIVIDE(PARAM_N, 8) +#define VEC_K_SIZE_BYTES PARAM_K +#define VEC_N1_SIZE_BYTES PARAM_N1 +#define VEC_N1N2_SIZE_BYTES CEIL_DIVIDE(PARAM_N1N2, 8) + +#define VEC_N_SIZE_64 CEIL_DIVIDE(PARAM_N, 64) +#define VEC_K_SIZE_64 CEIL_DIVIDE(PARAM_K, 8) +#define VEC_N1_SIZE_64 CEIL_DIVIDE(PARAM_N1, 8) +#define VEC_N1N2_SIZE_64 CEIL_DIVIDE(PARAM_N1N2, 64) + +#define PARAM_DELTA 24 +#define PARAM_M 8 +#define PARAM_GF_POLY 0x11D +#define PARAM_GF_MUL_ORDER 255 +#define PARAM_K 32 +#define PARAM_G 49 +#define PARAM_FFT 5 +#define RS_POLY_COEFS 228,231,214,81,113,204,19,169,10,244,117,219,130,12,160,151,195,170,150,151,251,218,245,166,149,183,109,176,148,218,21,161,240,25,15,71,62,5,17,32,157,194,73,195,218,14,12,122,1 + +#define RED_MASK 0x1fffffffffffffUL +#define SHA512_BYTES 64 +#define SEED_BYTES 40 +#define SEEDEXPANDER_MAX_LENGTH 4294967295 + +#endif diff --git a/crypto_kem/hqc-rmrs-128/clean/parsing.c b/crypto_kem/hqc-rmrs-128/clean/parsing.c new file mode 100644 index 00000000..1159c610 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/parsing.c @@ -0,0 +1,121 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file parsing.c + * @brief Functions to parse secret key, public key and ciphertext of the HQC scheme + */ + + + +/** + * @brief Parse a secret key into a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] sk String containing the secret key + * @param[in] sk_seed Seed used to generate the secret key + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS128_CLEAN_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk) { + memcpy(sk, sk_seed, SEED_BYTES); + memcpy(sk + SEED_BYTES, pk, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a secret key from a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] x uint64_t representation of vector x + * @param[out] y uint32_t representation of vector y + * @param[out] pk String containing the public key + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS128_CLEAN_hqc_secret_key_from_string(uint64_t *x, uint32_t *y, uint8_t *pk, const uint8_t *sk) { + AES_XOF_struct sk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + + memcpy(sk_seed, sk, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_fixed_weight_by_coordinates(&sk_seedexpander, y, PARAM_OMEGA); + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a public key into a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] pk String containing the public key + * @param[in] pk_seed Seed used to generate the public key + * @param[in] s uint8_t representation of vector s + */ +void PQCLEAN_HQCRMRS128_CLEAN_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s) { + memcpy(pk, pk_seed, SEED_BYTES); + memcpy(pk + SEED_BYTES, s, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Parse a public key from a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] h uint8_t representation of vector h + * @param[out] s uint8_t representation of vector s + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS128_CLEAN_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk) { + AES_XOF_struct pk_seedexpander; + uint8_t pk_seed[SEED_BYTES] = {0}; + + memcpy(pk_seed, pk, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + PQCLEAN_HQCRMRS128_CLEAN_vect_set_random(&pk_seedexpander, h); + + memcpy(s, pk + SEED_BYTES, VEC_N_SIZE_BYTES); +} + + +/** + * @brief Parse a ciphertext into a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] ct String containing the ciphertext + * @param[in] u uint8_t representation of vector u + * @param[in] v uint8_t representation of vector v + * @param[in] d String containing the hash d + */ +void PQCLEAN_HQCRMRS128_CLEAN_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d) { + memcpy(ct, u, VEC_N_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, d, SHA512_BYTES); +} + + +/** + * @brief Parse a ciphertext from a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] u uint8_t representation of vector u + * @param[out] v uint8_t representation of vector v + * @param[out] d String containing the hash d + * @param[in] ct String containing the ciphertext + */ +void PQCLEAN_HQCRMRS128_CLEAN_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct) { + memcpy(u, ct, VEC_N_SIZE_BYTES); + memcpy(v, ct + VEC_N_SIZE_BYTES, VEC_N1N2_SIZE_BYTES); + memcpy(d, ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, SHA512_BYTES); +} diff --git a/crypto_kem/hqc-rmrs-128/clean/parsing.h b/crypto_kem/hqc-rmrs-128/clean/parsing.h new file mode 100644 index 00000000..568b3f2e --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/parsing.h @@ -0,0 +1,29 @@ +#ifndef PARSING_H +#define PARSING_H + + +/** + * @file parsing.h + * @brief Header file for parsing.c + */ + +#include + +#include + +void PQCLEAN_HQCRMRS128_CLEAN_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk); + +void PQCLEAN_HQCRMRS128_CLEAN_hqc_secret_key_from_string(uint64_t *x, uint32_t *y, uint8_t *pk, const uint8_t *sk); + + +void PQCLEAN_HQCRMRS128_CLEAN_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s); + +void PQCLEAN_HQCRMRS128_CLEAN_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk); + + +void PQCLEAN_HQCRMRS128_CLEAN_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d); + +void PQCLEAN_HQCRMRS128_CLEAN_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/clean/reed_muller.c b/crypto_kem/hqc-rmrs-128/clean/reed_muller.c new file mode 100644 index 00000000..eca7d8f9 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/reed_muller.c @@ -0,0 +1,246 @@ +#include "parameters.h" +#include "reed_muller.h" +#include +#include +/** + * @file reed_muller.c + * Constant time implementation of Reed-Muller code RM(1,7) + */ + +// setting this will help the compiler with auto vectorization +#undef ALIGNVECTORS + + + +// number of repeated code words +#define MULTIPLICITY CEIL_DIVIDE(PARAM_N2, 128) + +// codeword is 128 bits, seen multiple ways +typedef union { + uint8_t u8[16]; + uint32_t u32[4]; +} codeword +; + +// Expanded codeword has a short for every bit, for internal calculations +typedef int16_t expandedCodeword[128] +; + +// copy bit 0 into all bits of a 32 bit value +#define BIT0MASK(x) (int32_t)(-((x) & 1)) + + +static void encode(codeword *word, int32_t message); +static void hadamard(expandedCodeword *src, expandedCodeword *dst); +static void expand_and_sum(expandedCodeword *dest, codeword src[]); +static int32_t find_peaks(expandedCodeword *transform); + + + +/** + * @brief Encode a single byte into a single codeword using RM(1,7) + * + * Encoding matrix of this code: + * bit pattern (note that bits are numbered big endian) + * 0 aaaaaaaa aaaaaaaa aaaaaaaa aaaaaaaa + * 1 cccccccc cccccccc cccccccc cccccccc + * 2 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0 + * 3 ff00ff00 ff00ff00 ff00ff00 ff00ff00 + * 4 ffff0000 ffff0000 ffff0000 ffff0000 + * 5 ffffffff 00000000 ffffffff 00000000 + * 6 ffffffff ffffffff 00000000 00000000 + * 7 ffffffff ffffffff ffffffff ffffffff + * + * @param[out] word An RM(1,7) codeword + * @param[in] message A message + */ +static void encode(codeword *word, int32_t message) { + // the four parts of the word are identical + // except for encoding bits 5 and 6 + int32_t first_word; + // bit 7 flips all the bits, do that first to save work + first_word = BIT0MASK(message >> 7); + // bits 0, 1, 2, 3, 4 are the same for all four longs + // (Warning: in the bit matrix above, low bits are at the left!) + first_word ^= BIT0MASK(message >> 0) & 0xaaaaaaaa; + first_word ^= BIT0MASK(message >> 1) & 0xcccccccc; + first_word ^= BIT0MASK(message >> 2) & 0xf0f0f0f0; + first_word ^= BIT0MASK(message >> 3) & 0xff00ff00; + first_word ^= BIT0MASK(message >> 4) & 0xffff0000; + // we can store this in the first quarter + word->u32[0] = first_word; + // bit 5 flips entries 1 and 3; bit 6 flips 2 and 3 + first_word ^= BIT0MASK(message >> 5); + word->u32[1] = first_word; + first_word ^= BIT0MASK(message >> 6); + word->u32[3] = first_word; + first_word ^= BIT0MASK(message >> 5); + word->u32[2] = first_word; +} + + + +/** + * @brief Hadamard transform + * + * Perform hadamard transform of src and store result in dst + * src is overwritten: it is also used as intermediate buffer + * Method is best explained if we use H(3) instead of H(7): + * + * The routine multiplies by the matrix H(3): + * [1 1 1 1 1 1 1 1] + * [1 -1 1 -1 1 -1 1 -1] + * [1 1 -1 -1 1 1 -1 -1] + * [a b c d e f g h] * [1 -1 -1 1 1 -1 -1 1] = result of routine + * [1 1 1 1 -1 -1 -1 -1] + * [1 -1 1 -1 -1 1 -1 1] + * [1 1 -1 -1 -1 -1 1 1] + * [1 -1 -1 1 -1 1 1 -1] + * You can do this in three passes, where each pass does this: + * set lower half of buffer to pairwise sums, + * and upper half to differences + * index 0 1 2 3 4 5 6 7 + * input: a, b, c, d, e, f, g, h + * pass 1: a+b, c+d, e+f, g+h, a-b, c-d, e-f, g-h + * pass 2: a+b+c+d, e+f+g+h, a-b+c-d, e-f+g-h, a+b-c-d, e+f-g-h, a-b-c+d, e-f-g+h + * pass 3: a+b+c+d+e+f+g+h a+b-c-d+e+f-g-h a+b+c+d-e-f-g-h a+b-c-d-e+-f+g+h + * a-b+c-d+e-f+g-h a-b-c+d+e-f-g+h a-b+c-d-e+f-g+h a-b-c+d-e+f+g-h + * This order of computation is chosen because it vectorises well. + * Likewise, this routine multiplies by H(7) in seven passes. + * + * @param[out] src Structure that contain the expanded codeword + * @param[out] dst Structure that contain the expanded codeword + */ +static void hadamard(expandedCodeword *src, expandedCodeword *dst) { + // the passes move data: + // src -> dst -> src -> dst -> src -> dst -> src -> dst + // using p1 and p2 alternately + expandedCodeword *p1 = src; + expandedCodeword *p2 = dst; + for (int32_t pass = 0 ; pass < 7 ; pass++) { + for (int32_t i = 0 ; i < 64 ; i++) { + (*p2)[i] = (*p1)[2 * i] + (*p1)[2 * i + 1]; + (*p2)[i + 64] = (*p1)[2 * i] - (*p1)[2 * i + 1]; + } + // swap p1, p2 for next round + expandedCodeword *p3 = p1; + p1 = p2; + p2 = p3; + } +} + + + +/** + * @brief Add multiple codewords into expanded codeword + * + * Accesses memory in order + * Note: this does not write the codewords as -1 or +1 as the green machine does + * instead, just 0 and 1 is used. + * The resulting hadamard transform has: + * all values are halved + * the first entry is 64 too high + * + * @param[out] dest Structure that contain the expanded codeword + * @param[in] src Structure that contain the codeword + */ +static void expand_and_sum(expandedCodeword *dest, codeword src[]) { + // start with the first copy + for (int32_t part = 0 ; part < 4 ; part++) { + for (int32_t bit = 0 ; bit < 32 ; bit++) { + (*dest)[part * 32 + bit] = src[0].u32[part] >> bit & 1; + } + } + // sum the rest of the copies + for (int32_t copy = 1 ; copy < MULTIPLICITY ; copy++) { + for (int32_t part = 0 ; part < 4 ; part++) { + for (int32_t bit = 0 ; bit < 32 ; bit++) { + (*dest)[part * 32 + bit] += src[copy].u32[part] >> bit & 1; + } + } + } +} + + + +/** + * @brief Finding the location of the highest value + * + * This is the final step of the green machine: find the location of the highest value, + * and add 128 if the peak is positive + * if there are two identical peaks, the peak with smallest value + * in the lowest 7 bits it taken + * @param[in] transform Structure that contain the expanded codeword + */ +static int32_t find_peaks(expandedCodeword *transform) { + int32_t peak_abs_value = 0; + int32_t peak_value = 0; + int32_t peak_pos = 0; + for (int32_t i = 0 ; i < 128 ; i++) { + // get absolute value + int32_t t = (*transform)[i]; + int32_t pos_mask = -(t > 0); + int32_t absolute = (pos_mask & t) | (~pos_mask & -t); + // all compilers nowadays compile with a conditional move + peak_value = absolute > peak_abs_value ? t : peak_value; + peak_pos = absolute > peak_abs_value ? i : peak_pos; + peak_abs_value = absolute > peak_abs_value ? absolute : peak_abs_value; + } + // set bit 7 + peak_pos |= 128 * (peak_value > 0); + return peak_pos; +} + + + +/** + * @brief Encodes the received word + * + * The message consists of N1 bytes each byte is encoded into PARAM_N2 bits, + * or MULTIPLICITY repeats of 128 bits + * + * @param[out] cdw Array of size VEC_N1N2_SIZE_64 receiving the encoded message + * @param[in] msg Array of size VEC_N1_SIZE_64 storing the message + */ +void PQCLEAN_HQCRMRS128_CLEAN_reed_muller_encode(uint64_t *cdw, const uint64_t *msg) { + uint8_t *message_array = (uint8_t *) msg; + codeword *codeArray = (codeword *) cdw; + for (size_t i = 0 ; i < VEC_N1_SIZE_BYTES ; i++) { + // fill entries i * MULTIPLICITY to (i+1) * MULTIPLICITY + int32_t pos = i * MULTIPLICITY; + // encode first word + encode(&codeArray[pos], message_array[i]); + // copy to other identical codewords + for (size_t copy = 1 ; copy < MULTIPLICITY ; copy++) { + memcpy(&codeArray[pos + copy], &codeArray[pos], sizeof(codeword)); + } + } +} + + + +/** + * @brief Decodes the received word + * + * Decoding uses fast hadamard transform, for a more complete picture on Reed-Muller decoding, see MacWilliams, Florence Jessie, and Neil James Alexander Sloane. + * The theory of error-correcting codes codes @cite macwilliams1977theory + * + * @param[out] msg Array of size VEC_N1_SIZE_64 receiving the decoded message + * @param[in] cdw Array of size VEC_N1N2_SIZE_64 storing the received word + */ +void PQCLEAN_HQCRMRS128_CLEAN_reed_muller_decode(uint64_t *msg, const uint64_t *cdw) { + uint8_t *message_array = (uint8_t *) msg; + codeword *codeArray = (codeword *) cdw; + expandedCodeword expanded; + for (size_t i = 0 ; i < VEC_N1_SIZE_BYTES ; i++) { + // collect the codewords + expand_and_sum(&expanded, &codeArray[i * MULTIPLICITY]); + // apply hadamard transform + expandedCodeword transform; + hadamard(&expanded, &transform); + // fix the first entry to get the half Hadamard transform + transform[0] -= 64 * MULTIPLICITY; + // finish the decoding + message_array[i] = find_peaks(&transform); + } +} diff --git a/crypto_kem/hqc-rmrs-128/clean/reed_muller.h b/crypto_kem/hqc-rmrs-128/clean/reed_muller.h new file mode 100644 index 00000000..7a89ba02 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/reed_muller.h @@ -0,0 +1,20 @@ +#ifndef REED_MULLER_H +#define REED_MULLER_H + + +/** + * @file reed_muller.h + * Header file of reed_muller.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS128_CLEAN_reed_muller_encode(uint64_t *cdw, const uint64_t *msg); + +void PQCLEAN_HQCRMRS128_CLEAN_reed_muller_decode(uint64_t *msg, const uint64_t *cdw); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/clean/reed_solomon.c b/crypto_kem/hqc-rmrs-128/clean/reed_solomon.c new file mode 100644 index 00000000..0265c446 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/reed_solomon.c @@ -0,0 +1,340 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include "reed_solomon.h" +#include +#include +#include +/** + * @file reed_solomon.c + * Constant time implementation of Reed-Solomon codes + */ + + +static void compute_syndromes(uint16_t *syndromes, uint8_t *cdw); +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes); +static void compute_roots(uint8_t *error, uint16_t *sigma); +static void compute_z_poly(uint16_t *z, const uint16_t *sigma, uint8_t degree, const uint16_t *syndromes); +static void compute_error_values(uint16_t *error_values, const uint16_t *z, const uint8_t *error); +static void correct_errors(uint8_t *cdw, const uint16_t *error_values); + +static const uint16_t alpha_ij_pow [48][79] = {{2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240}, {4, 16, 64, 29, 116, 205, 19, 76, 45, 180, 234, 143, 6, 24, 96, 157, 78, 37, 148, 106, 181, 238, 159, 70, 5, 20, 80, 93, 105, 185, 222, 95, 97, 153, 94, 101, 137, 30, 120, 253, 211, 107, 177, 254, 223, 91, 113, 217, 67, 17, 68, 13, 52, 208, 103, 129, 62, 248, 199, 59, 236, 151, 102, 133, 46, 184, 218, 79, 33, 132, 42, 168, 154, 82, 85, 73, 57, 228, 183}, {8, 64, 58, 205, 38, 45, 117, 143, 12, 96, 39, 37, 53, 181, 193, 70, 10, 80, 186, 185, 161, 97, 47, 101, 15, 120, 231, 107, 127, 223, 182, 217, 134, 68, 26, 208, 206, 62, 237, 59, 197, 102, 23, 184, 169, 33, 21, 168, 41, 85, 146, 228, 115, 191, 145, 252, 179, 241, 219, 150, 196, 110, 87, 130, 100, 7, 56, 221, 166, 89, 242, 195, 86, 138, 36, 61, 245, 251, 139}, {16, 29, 205, 76, 180, 143, 24, 157, 37, 106, 238, 70, 20, 93, 185, 95, 153, 101, 30, 253, 107, 254, 91, 217, 17, 13, 208, 129, 248, 59, 151, 133, 184, 79, 132, 168, 82, 73, 228, 230, 198, 252, 123, 227, 150, 149, 165, 130, 200, 28, 221, 81, 121, 195, 172, 18, 61, 247, 203, 44, 250, 27, 173, 2, 32, 58, 135, 152, 117, 3, 48, 39, 74, 212, 193, 140, 40, 186, 111}, {32, 116, 38, 180, 3, 96, 156, 106, 193, 5, 160, 185, 190, 94, 15, 253, 214, 223, 226, 17, 26, 103, 124, 59, 51, 46, 169, 132, 77, 85, 114, 230, 145, 215, 255, 150, 55, 174, 100, 28, 167, 89, 239, 172, 36, 244, 235, 44, 233, 108, 1, 32, 116, 38, 180, 3, 96, 156, 106, 193, 5, 160, 185, 190, 94, 15, 253, 214, 223, 226, 17, 26, 103, 124, 59, 51, 46, 169, 132}, {64, 205, 45, 143, 96, 37, 181, 70, 80, 185, 97, 101, 120, 107, 223, 217, 68, 208, 62, 59, 102, 184, 33, 168, 85, 228, 191, 252, 241, 150, 110, 130, 7, 221, 89, 195, 138, 61, 251, 44, 207, 173, 8, 58, 38, 117, 12, 39, 53, 193, 10, 186, 161, 47, 15, 231, 127, 182, 134, 26, 206, 237, 197, 23, 169, 21, 41, 146, 115, 145, 179, 219, 196, 87, 100, 56, 166, 242, 86}, {128, 19, 117, 24, 156, 181, 140, 93, 161, 94, 60, 107, 163, 67, 26, 129, 147, 102, 109, 132, 41, 57, 209, 252, 255, 98, 87, 200, 224, 89, 155, 18, 245, 11, 233, 173, 16, 232, 45, 3, 157, 53, 159, 40, 185, 194, 137, 231, 254, 226, 68, 189, 248, 197, 46, 158, 168, 170, 183, 145, 123, 75, 110, 25, 28, 166, 249, 69, 61, 235, 176, 54, 2, 29, 38, 234, 48, 37, 119}, {29, 76, 143, 157, 106, 70, 93, 95, 101, 253, 254, 217, 13, 129, 59, 133, 79, 168, 73, 230, 252, 227, 149, 130, 28, 81, 195, 18, 247, 44, 27, 2, 58, 152, 3, 39, 212, 140, 186, 190, 202, 231, 225, 175, 26, 31, 118, 23, 158, 77, 146, 209, 229, 219, 55, 25, 56, 162, 155, 36, 243, 88, 54, 4, 116, 45, 6, 78, 181, 5, 105, 97, 137, 211, 223, 67, 52, 62, 236}, {58, 45, 12, 37, 193, 80, 161, 101, 231, 223, 134, 208, 237, 102, 169, 168, 146, 191, 179, 150, 87, 7, 166, 195, 36, 251, 125, 173, 64, 38, 143, 39, 181, 10, 185, 47, 120, 127, 217, 26, 62, 197, 184, 21, 85, 115, 252, 219, 110, 100, 221, 242, 138, 245, 44, 54, 8, 205, 117, 96, 53, 70, 186, 97, 15, 107, 182, 68, 206, 59, 23, 33, 41, 228, 145, 241, 196, 130, 56}, {116, 180, 96, 106, 5, 185, 94, 253, 223, 17, 103, 59, 46, 132, 85, 230, 215, 150, 174, 28, 89, 172, 244, 44, 108, 32, 38, 3, 156, 193, 160, 190, 15, 214, 226, 26, 124, 51, 169, 77, 114, 145, 255, 55, 100, 167, 239, 36, 235, 233, 1, 116, 180, 96, 106, 5, 185, 94, 253, 223, 17, 103, 59, 46, 132, 85, 230, 215, 150, 174, 28, 89, 172, 244, 44, 108, 32, 38, 3}, {232, 234, 39, 238, 160, 97, 60, 254, 134, 103, 118, 184, 84, 57, 145, 227, 220, 7, 162, 172, 245, 176, 71, 58, 180, 192, 181, 40, 95, 15, 177, 175, 208, 147, 46, 21, 73, 99, 241, 55, 200, 166, 43, 122, 44, 216, 128, 45, 48, 106, 10, 222, 202, 107, 226, 52, 237, 133, 66, 85, 209, 123, 196, 50, 167, 195, 144, 11, 54, 32, 76, 12, 148, 140, 185, 188, 211, 182, 13}, {205, 143, 37, 70, 185, 101, 107, 217, 208, 59, 184, 168, 228, 252, 150, 130, 221, 195, 61, 44, 173, 58, 117, 39, 193, 186, 47, 231, 182, 26, 237, 23, 21, 146, 145, 219, 87, 56, 242, 36, 139, 54, 64, 45, 96, 181, 80, 97, 120, 223, 68, 62, 102, 33, 85, 191, 241, 110, 7, 89, 138, 251, 207, 8, 38, 12, 53, 10, 161, 15, 127, 134, 206, 197, 169, 41, 115, 179, 196}, {135, 6, 53, 20, 190, 120, 163, 13, 237, 46, 84, 228, 229, 98, 100, 81, 69, 251, 131, 32, 45, 192, 238, 186, 94, 187, 217, 189, 236, 169, 82, 209, 241, 220, 28, 242, 72, 22, 173, 116, 201, 37, 140, 222, 15, 254, 34, 62, 204, 132, 146, 63, 75, 130, 167, 43, 245, 250, 4, 38, 24, 212, 80, 194, 253, 182, 52, 147, 184, 77, 183, 179, 149, 141, 89, 9, 203, 54, 128}, {19, 24, 181, 93, 94, 107, 67, 129, 102, 132, 57, 252, 98, 200, 89, 18, 11, 173, 232, 3, 53, 40, 194, 231, 226, 189, 197, 158, 170, 145, 75, 25, 166, 69, 235, 54, 29, 234, 37, 5, 95, 120, 91, 52, 59, 218, 82, 191, 227, 174, 221, 43, 247, 207, 32, 90, 39, 35, 111, 15, 225, 136, 237, 92, 77, 115, 246, 220, 56, 239, 122, 125, 4, 76, 96, 238, 105, 101, 177}, {38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145}, {76, 157, 70, 95, 253, 217, 129, 133, 168, 230, 227, 130, 81, 18, 44, 2, 152, 39, 140, 190, 231, 175, 31, 23, 77, 209, 219, 25, 162, 36, 88, 4, 45, 78, 5, 97, 211, 67, 62, 46, 154, 191, 171, 50, 89, 72, 176, 8, 90, 156, 10, 194, 187, 134, 124, 92, 41, 99, 75, 100, 178, 144, 125, 16, 180, 37, 20, 153, 107, 17, 248, 184, 82, 198, 150, 200, 121, 61, 250}, {152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153}, {45, 37, 80, 101, 223, 208, 102, 168, 191, 150, 7, 195, 251, 173, 38, 39, 10, 47, 127, 26, 197, 21, 115, 219, 100, 242, 245, 54, 205, 96, 70, 97, 107, 68, 59, 33, 228, 241, 130, 89, 61, 207, 58, 12, 193, 161, 231, 134, 237, 169, 146, 179, 87, 166, 36, 125, 64, 143, 181, 185, 120, 217, 62, 184, 85, 252, 110, 221, 138, 44, 8, 117, 53, 186, 15, 182, 206, 23, 41}, {90, 148, 186, 30, 226, 62, 109, 73, 179, 174, 162, 61, 131, 232, 96, 140, 153, 127, 52, 51, 168, 99, 98, 56, 172, 22, 8, 234, 212, 185, 240, 67, 237, 79, 114, 241, 25, 121, 245, 108, 19, 39, 20, 188, 223, 189, 133, 41, 63, 55, 221, 9, 176, 64, 3, 238, 161, 211, 34, 59, 66, 183, 219, 200, 239, 251, 71, 152, 37, 160, 137, 182, 129, 92, 85, 229, 165, 166, 72}, {180, 106, 185, 253, 17, 59, 132, 230, 150, 28, 172, 44, 32, 3, 193, 190, 214, 26, 51, 77, 145, 55, 167, 36, 233, 116, 96, 5, 94, 223, 103, 46, 85, 215, 174, 89, 244, 108, 38, 156, 160, 15, 226, 124, 169, 114, 255, 100, 239, 235, 1, 180, 106, 185, 253, 17, 59, 132, 230, 150, 28, 172, 44, 32, 3, 193, 190, 214, 26, 51, 77, 145, 55, 167, 36, 233, 116, 96, 5}, {117, 181, 161, 107, 26, 102, 41, 252, 87, 89, 245, 173, 45, 53, 185, 231, 68, 197, 168, 145, 110, 166, 61, 54, 38, 37, 186, 120, 134, 59, 21, 191, 196, 221, 36, 207, 205, 39, 80, 15, 217, 237, 33, 115, 150, 56, 138, 125, 58, 96, 10, 101, 182, 62, 169, 228, 219, 7, 86, 44, 64, 12, 70, 47, 223, 206, 184, 146, 241, 100, 195, 139, 8, 143, 193, 97, 127, 208, 23}, {234, 238, 97, 254, 103, 184, 57, 227, 7, 172, 176, 58, 192, 40, 15, 175, 147, 21, 99, 55, 166, 122, 216, 45, 106, 222, 107, 52, 133, 85, 123, 50, 195, 11, 32, 12, 140, 188, 182, 124, 158, 115, 49, 224, 36, 131, 19, 37, 105, 253, 68, 151, 154, 252, 174, 121, 251, 2, 201, 193, 194, 225, 206, 109, 114, 219, 14, 69, 125, 116, 157, 80, 30, 67, 59, 42, 198, 110, 81}, {201, 159, 47, 91, 124, 33, 209, 149, 166, 244, 71, 117, 238, 194, 223, 31, 79, 115, 98, 167, 61, 216, 90, 181, 190, 254, 206, 218, 213, 150, 224, 72, 54, 152, 106, 161, 177, 189, 184, 114, 171, 56, 18, 131, 38, 148, 111, 107, 104, 46, 146, 227, 14, 138, 233, 135, 37, 210, 211, 26, 133, 170, 241, 141, 172, 125, 232, 78, 186, 253, 136, 102, 164, 123, 100, 43, 88, 58, 157}, {143, 70, 101, 217, 59, 168, 252, 130, 195, 44, 58, 39, 186, 231, 26, 23, 146, 219, 56, 36, 54, 45, 181, 97, 223, 62, 33, 191, 110, 89, 251, 8, 12, 10, 15, 134, 197, 41, 179, 100, 86, 125, 205, 37, 185, 107, 208, 184, 228, 150, 221, 61, 173, 117, 193, 47, 182, 237, 21, 145, 87, 242, 139, 64, 96, 80, 120, 68, 102, 85, 241, 7, 138, 207, 38, 53, 161, 127, 206}, {3, 5, 15, 17, 51, 85, 255, 28, 36, 108, 180, 193, 94, 226, 59, 77, 215, 100, 172, 233, 38, 106, 190, 223, 124, 132, 145, 174, 239, 44, 116, 156, 185, 214, 103, 169, 230, 55, 89, 235, 32, 96, 160, 253, 26, 46, 114, 150, 167, 244, 1, 3, 5, 15, 17, 51, 85, 255, 28, 36, 108, 180, 193, 94, 226, 59, 77, 215, 100, 172, 233, 38, 106, 190, 223, 124, 132, 145, 174}, {6, 20, 120, 13, 46, 228, 98, 81, 251, 32, 192, 186, 187, 189, 169, 209, 220, 242, 22, 116, 37, 222, 254, 62, 132, 63, 130, 43, 250, 38, 212, 194, 182, 147, 77, 179, 141, 9, 54, 180, 159, 101, 67, 151, 85, 227, 112, 61, 142, 3, 10, 60, 136, 23, 114, 49, 166, 243, 16, 96, 93, 211, 208, 218, 230, 110, 121, 11, 58, 156, 111, 127, 31, 66, 145, 65, 155, 125, 19}, {12, 80, 231, 208, 169, 191, 87, 195, 125, 38, 181, 47, 217, 197, 85, 219, 221, 245, 8, 96, 186, 107, 206, 33, 145, 130, 86, 207, 45, 193, 101, 134, 102, 146, 150, 166, 251, 64, 39, 185, 127, 62, 21, 252, 100, 138, 54, 117, 70, 15, 68, 23, 228, 196, 89, 139, 58, 37, 161, 223, 237, 168, 179, 7, 36, 173, 143, 10, 120, 26, 184, 115, 110, 242, 44, 205, 53, 97, 182}, {24, 93, 107, 129, 132, 252, 200, 18, 173, 3, 40, 231, 189, 158, 145, 25, 69, 54, 234, 5, 120, 52, 218, 191, 174, 43, 207, 90, 35, 15, 136, 92, 115, 220, 239, 125, 76, 238, 101, 17, 133, 228, 149, 121, 44, 135, 212, 47, 175, 51, 146, 49, 162, 139, 116, 148, 97, 113, 236, 85, 171, 83, 251, 128, 156, 161, 163, 147, 41, 255, 224, 245, 16, 157, 185, 254, 248, 168, 123}, {48, 105, 127, 248, 77, 241, 224, 247, 64, 156, 95, 182, 236, 170, 150, 162, 11, 205, 212, 94, 134, 133, 213, 110, 239, 250, 45, 35, 30, 26, 218, 99, 130, 69, 108, 143, 40, 211, 206, 132, 229, 7, 144, 2, 96, 210, 254, 237, 154, 255, 221, 243, 128, 37, 190, 113, 197, 73, 49, 89, 22, 135, 181, 188, 17, 23, 183, 220, 195, 233, 90, 70, 60, 52, 169, 198, 25, 138, 216}, {96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15}, {192, 222, 182, 151, 114, 110, 155, 27, 143, 160, 177, 237, 82, 75, 89, 88, 152, 70, 240, 103, 21, 123, 224, 251, 116, 212, 101, 136, 218, 145, 200, 144, 8, 78, 190, 217, 204, 183, 87, 172, 216, 12, 105, 225, 59, 170, 98, 242, 250, 180, 10, 211, 31, 168, 255, 83, 139, 135, 238, 15, 52, 158, 252, 14, 244, 64, 74, 153, 134, 46, 209, 130, 9, 142, 96, 111, 91, 197, 57}, {157, 95, 217, 133, 230, 130, 18, 2, 39, 190, 175, 23, 209, 25, 36, 4, 78, 97, 67, 46, 191, 50, 72, 8, 156, 194, 134, 92, 99, 100, 144, 16, 37, 153, 17, 184, 198, 200, 61, 32, 74, 47, 34, 109, 145, 141, 122, 64, 148, 94, 68, 218, 63, 7, 244, 128, 53, 188, 136, 169, 126, 14, 245, 29, 106, 101, 13, 79, 252, 28, 247, 58, 212, 202, 26, 158, 229, 56, 243}, {39, 97, 134, 184, 145, 7, 245, 58, 181, 15, 208, 21, 241, 166, 44, 45, 10, 107, 237, 85, 196, 195, 54, 12, 185, 182, 102, 115, 130, 36, 8, 37, 47, 68, 169, 252, 56, 251, 205, 193, 120, 206, 168, 219, 89, 125, 117, 80, 127, 59, 146, 110, 86, 173, 96, 161, 217, 23, 191, 100, 61, 64, 53, 101, 26, 33, 179, 221, 139, 38, 70, 231, 62, 41, 150, 242, 207, 143, 186}, {78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79}, {156, 94, 26, 132, 255, 89, 233, 3, 185, 226, 46, 145, 28, 235, 38, 5, 214, 59, 114, 174, 36, 32, 106, 15, 103, 77, 150, 239, 108, 96, 190, 17, 169, 215, 167, 44, 180, 160, 223, 51, 230, 100, 244, 116, 193, 253, 124, 85, 55, 172, 1, 156, 94, 26, 132, 255, 89, 233, 3, 185, 226, 46, 145, 28, 235, 38, 5, 214, 59, 114, 174, 36, 32, 106, 15, 103, 77, 150, 239}, {37, 101, 208, 168, 150, 195, 173, 39, 47, 26, 21, 219, 242, 54, 96, 97, 68, 33, 241, 89, 207, 12, 161, 134, 169, 179, 166, 125, 143, 185, 217, 184, 252, 221, 44, 117, 186, 182, 23, 145, 56, 139, 45, 80, 223, 102, 191, 7, 251, 38, 10, 127, 197, 115, 100, 245, 205, 70, 107, 59, 228, 130, 61, 58, 193, 231, 237, 146, 87, 36, 64, 181, 120, 62, 85, 110, 138, 8, 53}, {74, 137, 206, 82, 55, 138, 16, 212, 120, 124, 73, 87, 72, 29, 193, 211, 147, 228, 25, 244, 205, 140, 177, 197, 230, 141, 251, 76, 40, 223, 204, 198, 56, 11, 180, 186, 113, 92, 252, 167, 176, 143, 111, 67, 169, 123, 162, 207, 24, 190, 68, 66, 227, 242, 108, 157, 47, 52, 84, 150, 155, 142, 37, 202, 103, 41, 149, 69, 8, 106, 60, 62, 170, 165, 36, 128, 238, 231, 199}, {148, 30, 62, 73, 174, 61, 232, 140, 127, 51, 99, 56, 22, 234, 185, 67, 79, 241, 121, 108, 39, 188, 189, 41, 55, 9, 64, 238, 211, 59, 183, 200, 251, 152, 160, 182, 92, 229, 166, 233, 24, 97, 13, 42, 150, 43, 2, 53, 60, 124, 146, 65, 122, 205, 5, 254, 102, 198, 112, 44, 201, 111, 134, 158, 255, 242, 216, 78, 101, 103, 82, 110, 18, 128, 193, 187, 118, 115, 141}, {53, 120, 237, 228, 100, 251, 45, 186, 217, 169, 241, 242, 173, 37, 15, 62, 146, 130, 245, 38, 80, 182, 184, 179, 89, 54, 39, 101, 206, 85, 87, 61, 205, 10, 223, 23, 252, 166, 207, 96, 47, 208, 41, 110, 36, 58, 70, 127, 102, 145, 221, 125, 12, 97, 26, 168, 196, 138, 64, 193, 107, 197, 191, 56, 44, 143, 161, 68, 21, 150, 86, 8, 181, 231, 59, 115, 7, 139, 117}, {106, 253, 59, 230, 28, 44, 3, 190, 26, 77, 55, 36, 116, 5, 223, 46, 215, 89, 108, 156, 15, 124, 114, 100, 235, 180, 185, 17, 132, 150, 172, 32, 193, 214, 51, 145, 167, 233, 96, 94, 103, 85, 174, 244, 38, 160, 226, 169, 255, 239, 1, 106, 253, 59, 230, 28, 44, 3, 190, 26, 77, 55, 36, 116, 5, 223, 46, 215, 89, 108, 156, 15, 124, 114, 100, 235, 180, 185, 17}, {212, 211, 197, 198, 167, 207, 157, 202, 62, 114, 200, 139, 201, 95, 26, 154, 220, 61, 19, 160, 217, 158, 171, 86, 32, 159, 127, 133, 229, 89, 216, 74, 120, 147, 230, 56, 176, 24, 47, 103, 170, 130, 243, 90, 185, 34, 42, 196, 18, 116, 10, 91, 109, 241, 239, 2, 181, 187, 151, 145, 83, 131, 39, 137, 124, 228, 141, 11, 143, 190, 52, 41, 165, 122, 38, 93, 175, 33, 75}, {181, 107, 102, 252, 89, 173, 53, 231, 197, 145, 166, 54, 37, 120, 59, 191, 221, 207, 39, 15, 237, 115, 56, 125, 96, 101, 62, 228, 7, 44, 12, 47, 206, 146, 100, 139, 143, 97, 208, 85, 130, 251, 117, 161, 26, 41, 87, 245, 45, 185, 68, 168, 110, 61, 38, 186, 134, 21, 196, 36, 205, 80, 217, 33, 150, 138, 58, 10, 182, 169, 219, 86, 64, 70, 223, 184, 241, 195, 8}, {119, 177, 23, 123, 239, 8, 159, 225, 184, 255, 43, 64, 140, 91, 169, 171, 69, 58, 20, 226, 33, 49, 18, 205, 160, 67, 21, 149, 144, 38, 105, 34, 168, 220, 244, 45, 111, 13, 41, 174, 243, 117, 95, 104, 85, 25, 203, 143, 194, 103, 146, 200, 22, 12, 94, 31, 228, 14, 176, 96, 202, 248, 115, 112, 233, 39, 30, 147, 191, 167, 27, 37, 240, 236, 145, 81, 216, 53, 211}, {238, 254, 184, 227, 172, 58, 40, 175, 21, 55, 122, 45, 222, 52, 85, 50, 11, 12, 188, 124, 115, 224, 131, 37, 253, 151, 252, 121, 2, 193, 225, 109, 219, 69, 116, 80, 67, 42, 110, 244, 90, 161, 104, 170, 100, 22, 24, 101, 248, 230, 221, 27, 74, 231, 51, 229, 242, 4, 159, 223, 218, 171, 138, 232, 160, 134, 84, 220, 245, 180, 95, 208, 73, 200, 44, 48, 202, 237, 209}, {193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44}, {159, 91, 33, 149, 244, 117, 194, 31, 115, 167, 216, 181, 254, 218, 150, 72, 152, 161, 189, 114, 56, 131, 148, 107, 46, 227, 138, 135, 210, 26, 170, 141, 125, 78, 253, 102, 123, 43, 58, 160, 34, 41, 25, 22, 96, 30, 236, 252, 249, 32, 10, 175, 84, 87, 235, 6, 101, 199, 198, 89, 2, 35, 182, 66, 55, 245, 234, 153, 62, 230, 83, 173, 119, 225, 169, 49, 144, 45, 95}, {35, 113, 21, 165, 235, 12, 137, 118, 252, 239, 128, 80, 34, 82, 100, 176, 78, 231, 133, 255, 138, 19, 111, 208, 114, 112, 54, 212, 254, 169, 98, 122, 117, 153, 124, 191, 162, 2, 70, 226, 42, 87, 203, 24, 15, 236, 229, 195, 29, 160, 68, 164, 200, 125, 156, 211, 23, 227, 9, 38, 222, 189, 228, 224, 108, 181, 225, 79, 196, 244, 234, 47, 248, 99, 89, 4, 140, 217, 84}, {70, 217, 168, 130, 44, 39, 231, 23, 219, 36, 45, 97, 62, 191, 89, 8, 10, 134, 41, 100, 125, 37, 107, 184, 150, 61, 117, 47, 237, 145, 242, 64, 80, 68, 85, 7, 207, 53, 127, 169, 196, 245, 143, 101, 59, 252, 195, 58, 186, 26, 146, 56, 54, 181, 223, 33, 110, 251, 12, 15, 197, 179, 86, 205, 185, 208, 228, 221, 173, 193, 182, 21, 87, 139, 96, 120, 102, 241, 138}}; + + + +/** + * @brief Encodes a message message of PARAM_K bits to a Reed-Solomon codeword codeword of PARAM_N1 bytes + * + * Following @cite lin1983error (Chapter 4 - Cyclic Codes), + * We perform a systematic encoding using a linear (PARAM_N1 - PARAM_K)-stage shift register + * with feedback connections based on the generator polynomial PARAM_RS_POLY of the Reed-Solomon code. + * + * @param[out] cdw Array of size VEC_N1_SIZE_64 receiving the encoded message + * @param[in] msg Array of size VEC_K_SIZE_64 storing the message + */ +void PQCLEAN_HQCRMRS128_CLEAN_reed_solomon_encode(uint64_t *cdw, const uint64_t *msg) { + uint8_t gate_value = 0; + + uint16_t tmp[PARAM_G] = {0}; + uint16_t PARAM_RS_POLY [] = {RS_POLY_COEFS}; + + uint8_t msg_bytes[PARAM_K] = {0}; + uint8_t cdw_bytes[PARAM_N1] = {0}; + + for (size_t i = 0 ; i < VEC_K_SIZE_64 ; ++i) { + for (size_t j = 0 ; j < 8 ; ++j) { + msg_bytes[i * 8 + j] = (uint8_t) (msg[i] >> (j * 8)); + } + } + + for (int i = PARAM_K - 1 ; i >= 0 ; --i) { + gate_value = msg_bytes[i] ^ cdw_bytes[PARAM_N1 - PARAM_K - 1]; + + for (size_t j = 0 ; j < PARAM_G ; ++j) { + tmp[j] = PQCLEAN_HQCRMRS128_CLEAN_gf_mul(gate_value, PARAM_RS_POLY[j]); + } + + for (size_t k = PARAM_N1 - PARAM_K - 1 ; k ; --k) { + cdw_bytes[k] = cdw_bytes[k - 1] ^ tmp[k]; + } + + cdw_bytes[0] = tmp[0]; + } + + memcpy(cdw_bytes + PARAM_N1 - PARAM_K, msg_bytes, PARAM_K); + memcpy(cdw, cdw_bytes, PARAM_N1); +} + + + +/** + * @brief Computes 2 * PARAM_DELTA syndromes + * + * @param[out] syndromes Array of size 2 * PARAM_DELTA receiving the computed syndromes + * @param[in] cdw Array of size PARAM_N1 storing the received vector + */ +void compute_syndromes(uint16_t *syndromes, uint8_t *cdw) { + for (size_t i = 0 ; i < 2 * PARAM_DELTA ; ++i) { + for (size_t j = 1 ; j < PARAM_N1 ; ++j) { + syndromes[i] ^= PQCLEAN_HQCRMRS128_CLEAN_gf_mul(cdw[j], alpha_ij_pow[i][j - 1]); + } + syndromes[i] ^= cdw[0]; + } +} + + + +/** + * @brief Computes the error locator polynomial (ELP) sigma + * + * This is a constant time implementation of Berlekamp's simplified algorithm (see @cite lin1983error (Chapter 6 - BCH Codes).
+ * We use the letter p for rho which is initialized at -1.
+ * The array X_sigma_p represents the polynomial X^(mu-rho)*sigma_p(X).
+ * Instead of maintaining a list of sigmas, we update in place both sigma and X_sigma_p.
+ * sigma_copy serves as a temporary save of sigma in case X_sigma_p needs to be updated.
+ * We can properly correct only if the degree of sigma does not exceed PARAM_DELTA. + * This means only the first PARAM_DELTA + 1 coefficients of sigma are of value + * and we only need to save its first PARAM_DELTA - 1 coefficients. + * + * @returns the degree of the ELP sigma + * @param[out] sigma Array of size (at least) PARAM_DELTA receiving the ELP + * @param[in] syndromes Array of size (at least) 2*PARAM_DELTA storing the syndromes + */ +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes) { + sigma[0] = 1; + size_t deg_sigma = 0; + size_t deg_sigma_p = 0; + uint16_t sigma_copy[PARAM_DELTA + 1] = {0}; + size_t deg_sigma_copy = 0; + uint16_t X_sigma_p[PARAM_DELTA + 1] = {0, 1}; + int32_t pp = -1; // 2*rho + uint16_t d_p = 1; + uint16_t d = syndromes[0]; + + for (size_t mu = 0 ; (mu < (2 * PARAM_DELTA)) ; ++mu) { + // Save sigma in case we need it to update X_sigma_p + memcpy(sigma_copy, sigma, 2 * (PARAM_DELTA)); + deg_sigma_copy = deg_sigma; + + uint16_t dd = PQCLEAN_HQCRMRS128_CLEAN_gf_mul(d, PQCLEAN_HQCRMRS128_CLEAN_gf_inverse(d_p)); + + for (size_t i = 1 ; (i <= mu + 1) && (i <= PARAM_DELTA) ; ++i) { + sigma[i] ^= PQCLEAN_HQCRMRS128_CLEAN_gf_mul(dd, X_sigma_p[i]); + } + + size_t deg_X = mu - pp; + size_t deg_X_sigma_p = deg_X + deg_sigma_p; + + // mask1 = 0xffff if(d != 0) and 0 otherwise + int16_t mask1 = -((uint16_t) - d >> 15); + + // mask2 = 0xffff if(deg_X_sigma_p > deg_sigma) and 0 otherwise + int16_t mask2 = -((uint16_t) (deg_sigma - deg_X_sigma_p) >> 15); + + // mask12 = 0xffff if the deg_sigma increased and 0 otherwise + int16_t mask12 = mask1 & mask2; + deg_sigma = (mask12 & deg_X_sigma_p) ^ (~mask12 & deg_sigma); + + if (mu == (2 * PARAM_DELTA - 1)) { + break; + } + + pp = (mask12 & mu) ^ (~mask12 & pp); + d_p = (mask12 & d) ^ (~mask12 & d_p); + for (size_t i = PARAM_DELTA ; i ; --i) { + X_sigma_p[i] = (mask12 & sigma_copy[i - 1]) ^ (~mask12 & X_sigma_p[i - 1]); + } + + deg_sigma_p = (mask12 & deg_sigma_copy) ^ (~mask12 & deg_sigma_p); + d = syndromes[mu + 1]; + + for (size_t i = 1 ; (i <= mu + 1) && (i <= PARAM_DELTA) ; ++i) { + d ^= PQCLEAN_HQCRMRS128_CLEAN_gf_mul(sigma[i], syndromes[mu + 1 - i]); + } + } + + return deg_sigma; +} + + + +/** + * @brief Computes the error polynomial error from the error locator polynomial sigma + * + * See function PQCLEAN_HQCRMRS128_CLEAN_fft for more details. + * + * @param[out] error Array of 2^PARAM_M elements receiving the error polynomial + * @param[out] error_compact Array of PARAM_DELTA + PARAM_N1 elements receiving a compact representation of the vector error + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + */ +static void compute_roots(uint8_t *error, uint16_t *sigma) { + uint16_t w[1 << PARAM_M] = {0}; + + PQCLEAN_HQCRMRS128_CLEAN_fft(w, sigma, PARAM_DELTA + 1); + PQCLEAN_HQCRMRS128_CLEAN_fft_retrieve_error_poly(error, w); +} + + + +/** + * @brief Computes the polynomial z(x) + * + * See @cite lin1983error (Chapter 6 - BCH Codes) for more details. + * + * @param[out] z Array of PARAM_DELTA + 1 elements receiving the polynomial z(x) + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + * @param[in] degree Integer that is the degree of polynomial sigma + * @param[in] syndromes Array of 2 * PARAM_DELTA storing the syndromes + */ +static void compute_z_poly(uint16_t *z, const uint16_t *sigma, uint8_t degree, const uint16_t *syndromes) { + z[0] = 1; + + for (size_t i = 1 ; i < PARAM_DELTA + 1 ; ++i) { + int16_t mask2 = -((uint16_t) (i - degree - 1) >> 15); + z[i] = ((uint16_t)mask2) & sigma[i]; + } + + z[1] ^= syndromes[0]; + + for (size_t i = 2 ; i <= PARAM_DELTA ; ++i) { + int16_t mask2 = -((uint16_t) (i - degree - 1) >> 15); + z[i] ^= ((uint16_t)mask2 & syndromes[i - 1]); + + for (size_t j = 1 ; j < i ; ++j) { + z[i] ^= ((uint16_t)mask2) & PQCLEAN_HQCRMRS128_CLEAN_gf_mul(sigma[j], syndromes[i - j - 1]); + } + } +} + + + +/** + * @brief Computes the error values + * + * See @cite lin1983error (Chapter 6 - BCH Codes) for more details. + * + * @param[out] error_values Array of PARAM_DELTA elements receiving the error values + * @param[in] z Array of PARAM_DELTA + 1 elements storing the polynomial z(x) + * @param[in] z_degree Integer that is the degree of polynomial z(x) + * @param[in] error_compact Array of PARAM_DELTA + PARAM_N1 storing compact representation of the error + */ +static void compute_error_values(uint16_t *error_values, const uint16_t *z, const uint8_t *error) { + uint16_t beta_j[PARAM_DELTA] = {0}; + uint16_t e_j[PARAM_DELTA] = {0}; + + uint16_t delta_counter = 0; + uint16_t delta_real_value; + + // Compute the beta_{j_i} page 31 of the documentation + for (size_t i = 0 ; i < PARAM_N1 ; i++) { + uint16_t found = 0; + int16_t valuemask = ((int16_t) - (error[i] != 0)) >> 15; + for (size_t j = 0 ; j < PARAM_DELTA ; j++) { + int16_t indexmask = ((int16_t) - (j == delta_counter)) >> 15; + beta_j[j] += indexmask & valuemask & exp[i]; + found += indexmask & valuemask & 1; + } + delta_counter += found; + } + delta_real_value = delta_counter; + + // Compute the e_{j_i} page 31 of the documentation + for (size_t i = 0 ; i < PARAM_DELTA ; ++i) { + uint16_t tmp1 = 1; + uint16_t tmp2 = 1; + uint16_t inverse = PQCLEAN_HQCRMRS128_CLEAN_gf_inverse(beta_j[i]); + uint16_t inverse_power_j = 1; + + for (size_t j = 1 ; j <= PARAM_DELTA ; ++j) { + inverse_power_j = PQCLEAN_HQCRMRS128_CLEAN_gf_mul(inverse_power_j, inverse); + tmp1 ^= PQCLEAN_HQCRMRS128_CLEAN_gf_mul(inverse_power_j, z[j]); + } + for (size_t k = 1 ; k < PARAM_DELTA ; ++k) { + tmp2 = PQCLEAN_HQCRMRS128_CLEAN_gf_mul(tmp2, (1 ^ PQCLEAN_HQCRMRS128_CLEAN_gf_mul(inverse, beta_j[(i + k) % PARAM_DELTA]))); + } + int16_t mask = ((int16_t) - (i < delta_real_value)) >> 15; + e_j[i] = mask & PQCLEAN_HQCRMRS128_CLEAN_gf_mul(tmp1, PQCLEAN_HQCRMRS128_CLEAN_gf_inverse(tmp2)); + } + + // Place the delta e_{j_i} values at the right coordinates of the output vector + delta_counter = 0; + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + uint16_t found = 0; + int16_t valuemask = ((int16_t) - (error[i] != 0)) >> 15; + for (size_t j = 0 ; j < PARAM_DELTA ; j++) { + int16_t indexmask = ((int16_t) - (j == delta_counter)) >> 15; + error_values[i] += indexmask & valuemask & e_j[j]; + found += indexmask & valuemask & 1; + } + delta_counter += found; + } +} + + + +/** + * @brief Correct the errors + * + * @param[out] cdw Array of PARAM_N1 elements receiving the corrected vector + * @param[in] error Array of the error vector + * @param[in] error_values Array of PARAM_DELTA elements storing the error values + */ +static void correct_errors(uint8_t *cdw, const uint16_t *error_values) { + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + cdw[i] ^= error_values[i]; + } +} + + + +/** + * @brief Decodes the received word + * + * This function relies on six steps: + *
    + *
  1. The first step, is the computation of the 2*PARAM_DELTA syndromes. + *
  2. The second step is the computation of the error-locator polynomial sigma. + *
  3. The third step, done by additive FFT, is finding the error-locator numbers by calculating the roots of the polynomial sigma and takings their inverses. + *
  4. The fourth step, is the polynomial z(x). + *
  5. The fifth step, is the computation of the error values. + *
  6. The sixth step is the correction of the errors in the received polynomial. + *
+ * For a more complete picture on Reed-Solomon decoding, see Shu. Lin and Daniel J. Costello in Error Control Coding: Fundamentals and Applications @cite lin1983error + * + * @param[out] msg Array of size VEC_K_SIZE_64 receiving the decoded message + * @param[in] cdw Array of size VEC_N1_SIZE_64 storing the received word + */ +void PQCLEAN_HQCRMRS128_CLEAN_reed_solomon_decode(uint64_t *msg, uint64_t *cdw) { + uint8_t cdw_bytes[PARAM_N1] = {0}; + uint16_t syndromes[2 * PARAM_DELTA] = {0}; + uint16_t sigma[1 << PARAM_FFT] = {0}; + uint8_t error[1 << PARAM_M] = {0}; + uint16_t z[PARAM_N1] = {0}; + uint16_t error_values[PARAM_N1] = {0}; + + // Copy the vector in an array of bytes + memcpy(cdw_bytes, cdw, PARAM_N1); + + // Calculate the 2*PARAM_DELTA syndromes + compute_syndromes(syndromes, cdw_bytes); + + // Compute the error locator polynomial sigma + // Sigma's degree is at most PARAM_DELTA but the FFT requires the extra room + size_t deg = compute_elp(sigma, syndromes); + + // Compute the error polynomial error + compute_roots(error, sigma); + + // Compute the polynomial z(x) + compute_z_poly(z, sigma, deg, syndromes); + + // Compute the error values + compute_error_values(error_values, z, error); + + // Correct the errors + correct_errors(cdw_bytes, error_values); + + // Retrieve the message from the decoded codeword + memcpy(msg, cdw_bytes + (PARAM_G - 1), PARAM_K); + +} diff --git a/crypto_kem/hqc-rmrs-128/clean/reed_solomon.h b/crypto_kem/hqc-rmrs-128/clean/reed_solomon.h new file mode 100644 index 00000000..ded7cd01 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/reed_solomon.h @@ -0,0 +1,20 @@ +#ifndef REED_SOLOMON_H +#define REED_SOLOMON_H + + +/** + * @file reed_solomon.h + * Header file of reed_solomon.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS128_CLEAN_reed_solomon_encode(uint64_t *cdw, const uint64_t *msg); + +void PQCLEAN_HQCRMRS128_CLEAN_reed_solomon_decode(uint64_t *msg, uint64_t *cdw); + + +#endif diff --git a/crypto_kem/hqc-rmrs-128/clean/vector.c b/crypto_kem/hqc-rmrs-128/clean/vector.c new file mode 100644 index 00000000..c3927fd5 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/vector.c @@ -0,0 +1,226 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file vector.c + * @brief Implementation of vectors sampling and some utilities for the HQC scheme + */ + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. The vector + * is stored by position. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_fixed_weight_by_coordinates(AES_XOF_struct *ctx, uint32_t *v, uint16_t weight) { + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; // weight is expected to be <= PARAM_OMEGA_R + uint32_t random_data = 0; + uint8_t exist = 0; + size_t j = 0; + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (v[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + v[i] = random_data; + } + } +} + + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight) { + + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; // weight is expected to be <= PARAM_OMEGA_R + uint32_t random_data = 0; + uint32_t tmp[PARAM_OMEGA_R] = {0}; + uint8_t exist = 0; + size_t j = 0; + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (tmp[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + tmp[i] = random_data; + } + } + + for (uint16_t i = 0 ; i < weight ; ++i) { + int32_t index = tmp[i] / 64; + int32_t pos = tmp[i] % 64; + v[index] |= ((uint64_t) 1) << pos; + } +} + + + +/** + * @brief Generates a random vector of dimension PARAM_N + * + * This function generates a random binary vector of dimension PARAM_N. It generates a random + * array of bytes using the seedexpander function, and drop the extra bits using a mask. + * + * @param[in] v Pointer to an array + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS128_CLEAN_vect_set_random(AES_XOF_struct *ctx, uint64_t *v) { + uint8_t rand_bytes[VEC_N_SIZE_BYTES] = {0}; + + seedexpander(ctx, rand_bytes, VEC_N_SIZE_BYTES); + + memcpy(v, rand_bytes, VEC_N_SIZE_BYTES); + v[VEC_N_SIZE_64 - 1] &= BITMASK(PARAM_N, 64); +} + + + +/** + * @brief Generates a random vector + * + * This function generates a random binary vector. It uses the the randombytes function. + * + * @param[in] v Pointer to an array + */ +void PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_from_randombytes(uint64_t *v) { + uint8_t rand_bytes [VEC_K_SIZE_BYTES] = {0}; + + randombytes(rand_bytes, VEC_K_SIZE_BYTES); + memcpy(v, rand_bytes, VEC_K_SIZE_BYTES); +} + + + +/** + * @brief Adds two vectors + * + * @param[out] o Pointer to an array that is the result + * @param[in] v1 Pointer to an array that is the first vector + * @param[in] v2 Pointer to an array that is the second vector + * @param[in] size Integer that is the size of the vectors + */ +void PQCLEAN_HQCRMRS128_CLEAN_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size) { + for (uint32_t i = 0 ; i < size ; ++i) { + o[i] = v1[i] ^ v2[i]; + } +} + + +/** + * @brief Compares two vectors + * + * @param[in] v1 Pointer to an array that is first vector + * @param[in] v2 Pointer to an array that is second vector + * @param[in] size Integer that is the size of the vectors + * @returns 0 if the vectors are equals and a negative/psotive value otherwise + */ +int PQCLEAN_HQCRMRS128_CLEAN_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size) { + return memcmp(v1, v2, size); +} + + + +/** + * @brief Resize a vector so that it contains size_o bits + * + * @param[out] o Pointer to the output vector + * @param[in] size_o Integer that is the size of the output vector in bits + * @param[in] v Pointer to the input vector + * @param[in] size_v Integer that is the size of the input vector in bits + */ +void PQCLEAN_HQCRMRS128_CLEAN_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v) { + if (size_o < size_v) { + uint64_t mask = 0x7FFFFFFFFFFFFFFF; + int8_t val = 0; + + if (size_o % 64) { + val = 64 - (size_o % 64); + } + + memcpy(o, v, VEC_N1N2_SIZE_BYTES); + + for (int8_t i = 0 ; i < val ; ++i) { + o[VEC_N1N2_SIZE_64 - 1] &= (mask >> i); + } + } else { + memcpy(o, v, CEIL_DIVIDE(size_v, 8)); + } +} diff --git a/crypto_kem/hqc-rmrs-128/clean/vector.h b/crypto_kem/hqc-rmrs-128/clean/vector.h new file mode 100644 index 00000000..8a3c4990 --- /dev/null +++ b/crypto_kem/hqc-rmrs-128/clean/vector.h @@ -0,0 +1,31 @@ +#ifndef VECTOR_H +#define VECTOR_H + + +/** + * @file vector.h + * @brief Header file for vector.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_fixed_weight_by_coordinates(AES_XOF_struct *ctx, uint32_t *v, uint16_t weight); + +void PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight); + +void PQCLEAN_HQCRMRS128_CLEAN_vect_set_random(AES_XOF_struct *ctx, uint64_t *v); + +void PQCLEAN_HQCRMRS128_CLEAN_vect_set_random_from_randombytes(uint64_t *v); + + +void PQCLEAN_HQCRMRS128_CLEAN_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size); + +int PQCLEAN_HQCRMRS128_CLEAN_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size); + +void PQCLEAN_HQCRMRS128_CLEAN_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/META.yml b/crypto_kem/hqc-rmrs-192/META.yml new file mode 100644 index 00000000..01da3512 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/META.yml @@ -0,0 +1,34 @@ +name: HQC-RMRS-192 +type: kem +claimed-nist-level: 3 +claimed-security: IND-CCA2 +length-ciphertext: 9794 +length-public-key: 4906 +length-secret-key: 4946 +length-shared-secret: 64 +nistkat-sha256: 248c5e5d14f1722eeb39947c2f0065d49ff709d1cef146e4362cad27240754d3 +principal-submitters: + - Carlos Aguilar Melchor + - Nicolas Aragon + - Slim Bettaieb + - Olivier Blazy + - Jurjen Bos + - Jean-Christophe Deneuville + - Philippe Gaborit + - Edoardo Persichetti + - Jean-Marc Robert + - Pascal Véron + - Gilles Zémor + - Loïc Bidoux +implementations: + - name: clean + version: 2020-05-29 + - name: avx2 + version: 2020-05-29 + supported_platforms: + - architecture: x86_64 + operating_systems: + - Linux + - Darwin + required_flags: + - avx2 diff --git a/crypto_kem/hqc-rmrs-192/avx2/LICENSE b/crypto_kem/hqc-rmrs-192/avx2/LICENSE new file mode 100644 index 00000000..d5d21fff --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/LICENSE @@ -0,0 +1 @@ +Public Domain diff --git a/crypto_kem/hqc-rmrs-192/avx2/Makefile b/crypto_kem/hqc-rmrs-192/avx2/Makefile new file mode 100644 index 00000000..4199cc73 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/Makefile @@ -0,0 +1,22 @@ +# This Makefile can be used with GNU Make or BSD Make + +LIB=libhqc-rmrs-192_avx2.a +HEADERS=api.h code.h fft.h gf2x.h gf.h hqc.h parameters.h parsing.h reed_muller.h reed_solomon.h vector.h +OBJECTS=code.o fft.o gf2x.o gf.o hqc.o kem.o parsing.o reed_muller.o reed_solomon.o vector.o + +CFLAGS=-O3 -mavx2 -mbmi -mpclmul -Wall -Wextra -Wpedantic -Wvla -Werror -Wredundant-decls -Wmissing-prototypes -std=c99 -I../../../common $(EXTRAFLAGS) + +all: $(LIB) + +%.o: %.s $(HEADERS) + $(AS) -o $@ $< + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +$(LIB): $(OBJECTS) + $(AR) -r $@ $(OBJECTS) + +clean: + $(RM) $(OBJECTS) + $(RM) $(LIB) diff --git a/crypto_kem/hqc-rmrs-192/avx2/api.h b/crypto_kem/hqc-rmrs-192/avx2/api.h new file mode 100644 index 00000000..319edde7 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/api.h @@ -0,0 +1,25 @@ +#ifndef PQCLEAN_HQCRMRS192_AVX2_API_H +#define PQCLEAN_HQCRMRS192_AVX2_API_H +/** + * @file api.h + * @brief NIST KEM API used by the HQC_KEM IND-CCA2 scheme + */ + +#define PQCLEAN_HQCRMRS192_AVX2_CRYPTO_ALGNAME "HQC-RMRS-192" + +#define PQCLEAN_HQCRMRS192_AVX2_CRYPTO_SECRETKEYBYTES 4946 +#define PQCLEAN_HQCRMRS192_AVX2_CRYPTO_PUBLICKEYBYTES 4906 +#define PQCLEAN_HQCRMRS192_AVX2_CRYPTO_BYTES 64 +#define PQCLEAN_HQCRMRS192_AVX2_CRYPTO_CIPHERTEXTBYTES 9794 + +// As a technicality, the public key is appended to the secret key in order to respect the NIST API. +// Without this constraint, PQCLEAN_HQCRMRS192_AVX2_CRYPTO_SECRETKEYBYTES would be defined as 32 + +int PQCLEAN_HQCRMRS192_AVX2_crypto_kem_keypair(unsigned char *pk, unsigned char *sk); + +int PQCLEAN_HQCRMRS192_AVX2_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk); + +int PQCLEAN_HQCRMRS192_AVX2_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/avx2/code.c b/crypto_kem/hqc-rmrs-192/avx2/code.c new file mode 100644 index 00000000..70e401bc --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/code.c @@ -0,0 +1,47 @@ +#include "code.h" +#include "parameters.h" +#include "reed_muller.h" +#include "reed_solomon.h" +#include +#include +/** + * @file code.c + * @brief Implementation of concatenated code + */ + + + +/** + * + * @brief Encoding the message m to a code word em using the concatenated code + * + * First we encode the message using the Reed-Solomon code, then with the duplicated Reed-Muller code we obtain + * a concatenated code word. + * + * @param[out] em Pointer to an array that is the tensor code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQCRMRS192_AVX2_code_encode(uint64_t *em, const uint64_t *m) { + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQCRMRS192_AVX2_reed_solomon_encode(tmp, m); + PQCLEAN_HQCRMRS192_AVX2_reed_muller_encode(em, tmp); + +} + + + +/** + * @brief Decoding the code word em to a message m using the concatenated code + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQCRMRS192_AVX2_code_decode(uint64_t *m, const uint64_t *em) { + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQCRMRS192_AVX2_reed_muller_decode(tmp, em); + PQCLEAN_HQCRMRS192_AVX2_reed_solomon_decode(m, tmp); + + +} diff --git a/crypto_kem/hqc-rmrs-192/avx2/code.h b/crypto_kem/hqc-rmrs-192/avx2/code.h new file mode 100644 index 00000000..e2f1ef55 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/code.h @@ -0,0 +1,20 @@ +#ifndef CODE_H +#define CODE_H + + +/** + * @file code.h + * Header file of code.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS192_AVX2_code_encode(uint64_t *em, const uint64_t *message); + +void PQCLEAN_HQCRMRS192_AVX2_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/avx2/fft.c b/crypto_kem/hqc-rmrs-192/avx2/fft.c new file mode 100644 index 00000000..0d16a456 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/fft.c @@ -0,0 +1,331 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include +#include +/** + * @file fft.c + * Implementation of the additive FFT and its transpose. + * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + */ + + +static void compute_fft_betas(uint16_t *betas); +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size); +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f); +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); + + +/** + * @brief Computes the basis of betas (omitting 1) used in the additive FFT and its transpose + * + * @param[out] betas Array of size PARAM_M-1 + */ +static void compute_fft_betas(uint16_t *betas) { + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + betas[i] = 1 << (PARAM_M - 1 - i); + } +} + + + +/** + * @brief Computes the subset sums of the given set + * + * The array subset_sums is such that its ith element is + * the subset sum of the set elements given by the binary form of i. + * + * @param[out] subset_sums Array of size 2^set_size receiving the subset sums + * @param[in] set Array of set_size elements + * @param[in] set_size Size of the array set + */ +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size) { + subset_sums[0] = 0; + + for (size_t i = 0 ; i < set_size ; ++i) { + for (size_t j = 0 ; j < (1U << i) ; ++j) { + subset_sums[(1 << i) + j] = set[i] ^ subset_sums[j]; + } + } +} + + + +/** + * @brief Computes the radix conversion of a polynomial f in GF(2^m)[x] + * + * Computes f0 and f1 such that f(x) = f0(x^2-x) + x.f1(x^2-x) + * as proposed by Bernstein, Chou and Schwabe: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f0 Array half the size of f + * @param[out] f1 Array half the size of f + * @param[in] f Array of size a power of 2 + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f) { + switch (m_f) { + case 4: + f0[4] = f[8] ^ f[12]; + f0[6] = f[12] ^ f[14]; + f0[7] = f[14] ^ f[15]; + f1[5] = f[11] ^ f[13]; + f1[6] = f[13] ^ f[14]; + f1[7] = f[15]; + f0[5] = f[10] ^ f[12] ^ f1[5]; + f1[4] = f[9] ^ f[13] ^ f0[5]; + + f0[0] = f[0]; + f1[3] = f[7] ^ f[11] ^ f[15]; + f0[3] = f[6] ^ f[10] ^ f[14] ^ f1[3]; + f0[2] = f[4] ^ f0[4] ^ f0[3] ^ f1[3]; + f1[1] = f[3] ^ f[5] ^ f[9] ^ f[13] ^ f1[3]; + f1[2] = f[3] ^ f1[1] ^ f0[3]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 3: + f0[0] = f[0]; + f0[2] = f[4] ^ f[6]; + f0[3] = f[6] ^ f[7]; + f1[1] = f[3] ^ f[5] ^ f[7]; + f1[2] = f[5] ^ f[6]; + f1[3] = f[7]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 2: + f0[0] = f[0]; + f0[1] = f[2] ^ f[3]; + f1[0] = f[1] ^ f0[1]; + f1[1] = f[3]; + return; + + case 1: + f0[0] = f[0]; + f1[0] = f[1]; + return; + + default: + ; + size_t n = 1 << (m_f - 2); + + uint16_t Q[2 * (1 << (PARAM_FFT - 2))]; + uint16_t R[2 * (1 << (PARAM_FFT - 2))]; + + uint16_t Q0[1 << (PARAM_FFT - 2)]; + uint16_t Q1[1 << (PARAM_FFT - 2)]; + uint16_t R0[1 << (PARAM_FFT - 2)]; + uint16_t R1[1 << (PARAM_FFT - 2)]; + + memcpy(Q, f + 3 * n, 2 * n); + memcpy(Q + n, f + 3 * n, 2 * n); + memcpy(R, f, 4 * n); + + for (size_t i = 0 ; i < n ; ++i) { + Q[i] ^= f[2 * n + i]; + R[n + i] ^= Q[i]; + } + + radix(Q0, Q1, Q, m_f - 1); + radix(R0, R1, R, m_f - 1); + + memcpy(f0, R0, 2 * n); + memcpy(f0 + n, Q0, 2 * n); + memcpy(f1, R1, 2 * n); + memcpy(f1 + n, Q1, 2 * n); + } +} + + + +/** + * @brief Evaluates f at all subset sums of a given set + * + * This function is a subroutine of the function fft. + * + * @param[out] w Array + * @param[in] f Array + * @param[in] f_coeffs Number of coefficients of f + * @param[in] m Number of betas + * @param[in] m_f Number of coefficients of f (one more than its degree) + * @param[in] betas FFT constants + */ +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + uint16_t f0[1 << (PARAM_FFT - 2)]; + uint16_t f1[1 << (PARAM_FFT - 2)]; + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + size_t k = 1 << (m - 1); + uint16_t gammas_sums[1 << (PARAM_M - 2)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + uint16_t tmp[PARAM_M - (PARAM_FFT - 1)]; + for (size_t i = 0 ; i < m ; ++i) { + tmp[i] = PQCLEAN_HQCRMRS192_AVX2_gf_mul(betas[i], f[1]); + } + + w[0] = f[0]; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + w[(1 << j) + k] = w[k] ^ tmp[j]; + } + } + + return; + } + + // Step 2: compute g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQCRMRS192_AVX2_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQCRMRS192_AVX2_gf_mul(beta_m_pow, f[i]); + } + } + + // Step 3 + radix(f0, f1, f, m_f); + + // Step 4: compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQCRMRS192_AVX2_gf_mul(betas[i], PQCLEAN_HQCRMRS192_AVX2_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQCRMRS192_AVX2_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + + if (f_coeffs <= 3) { // 3-coefficient polynomial f case: f1 is constant + w[0] = u[0]; + w[k] = u[0] ^ f1[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS192_AVX2_gf_mul(gammas_sums[i], f1[0]); + w[k + i] = w[i] ^ f1[0]; + } + } else { + fft_rec(v, f1, f_coeffs / 2, m - 1, m_f - 1, deltas); + + // Step 6 + memcpy(w + k, v, 2 * k); + w[0] = u[0]; + w[k] ^= u[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS192_AVX2_gf_mul(gammas_sums[i], v[i]); + w[k + i] ^= w[i]; + } + } +} + + + +/** + * @brief Evaluates f on all fields elements using an additive FFT algorithm + * + * f_coeffs is the number of coefficients of f (one less than its degree).
+ * The FFT proceeds recursively to evaluate f at all subset sums of a basis B.
+ * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf
+ * Note that on this first call (as opposed to the recursive calls to fft_rec), gammas are equal to betas, + * meaning the first gammas subset sums are actually the subset sums of betas (except 1).
+ * Also note that f is altered during computation (twisted at each level). + * + * @param[out] w Array + * @param[in] f Array of 2^PARAM_FFT elements + * @param[in] f_coeffs Number coefficients of f (i.e. deg(f)+1) + */ +void PQCLEAN_HQCRMRS192_AVX2_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs) { + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + uint16_t f0[1 << (PARAM_FFT - 1)]; + uint16_t f1[1 << (PARAM_FFT - 1)]; + uint16_t deltas[PARAM_M - 1]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)]; + uint16_t v[1 << (PARAM_M - 1)]; + + // Follows Gao and Mateer algorithm + compute_fft_betas(betas); + + // Step 1: PARAM_FFT > 1, nothing to do + + // Compute gammas sums + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + // Step 2: beta_m = 1, nothing to do + + // Step 3 + radix(f0, f1, f, PARAM_FFT); + + // Step 4: Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQCRMRS192_AVX2_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + fft_rec(v, f1, f_coeffs / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + + // Step 6, 7 and error polynomial computation + memcpy(w + k, v, 2 * k); + + // Check if 0 is root + w[0] = u[0]; + + // Check if 1 is root + w[k] ^= u[0]; + + // Find other roots + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS192_AVX2_gf_mul(betas_sums[i], v[i]); + w[k + i] ^= w[i]; + } +} + + + +/** + * @brief Retrieves the error polynomial error from the evaluations w of the ELP (Error Locator Polynomial) on all field elements. + * + * @param[out] error Array with the error + * @param[out] error_compact Array with the error in a compact form + * @param[in] w Array of size 2^PARAM_M + */ +void PQCLEAN_HQCRMRS192_AVX2_fft_retrieve_error_poly(uint8_t *error, const uint16_t *w) { + uint16_t gammas[PARAM_M - 1] = {0}; + uint16_t gammas_sums[1 << (PARAM_M - 1)] = {0}; + size_t k = 1 << (PARAM_M - 1); + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + error[0] ^= 1 ^ ((uint16_t) - w[0] >> 15); + error[0] ^= 1 ^ ((uint16_t) - w[k] >> 15); + + size_t index = PARAM_GF_MUL_ORDER; + + for (size_t i = 1 ; i < k ; ++i) { + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQCRMRS192_AVX2_gf_log(gammas_sums[i]); + error[index] ^= 1 ^ ((uint16_t) - w[i] >> 15); + + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQCRMRS192_AVX2_gf_log(gammas_sums[i] ^ 1); + error[index] ^= 1 ^ ((uint16_t) - w[k + i] >> 15); + } +} diff --git a/crypto_kem/hqc-rmrs-192/avx2/fft.h b/crypto_kem/hqc-rmrs-192/avx2/fft.h new file mode 100644 index 00000000..b0b9e5bc --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/fft.h @@ -0,0 +1,21 @@ +#ifndef FFT_H +#define FFT_H + + +/** + * @file fft.h + * Header file of fft.c + */ + + +#include + +#include +#include + +void PQCLEAN_HQCRMRS192_AVX2_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs); + +void PQCLEAN_HQCRMRS192_AVX2_fft_retrieve_error_poly(uint8_t *error, const uint16_t *w); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/avx2/gf.c b/crypto_kem/hqc-rmrs-192/avx2/gf.c new file mode 100644 index 00000000..1d6920ef --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/gf.c @@ -0,0 +1,134 @@ +#include "gf.h" +#include "parameters.h" +#include +#include +#include +/** + * @file gf.c + * Galois field implementation with multiplication using the pclmulqdq instruction + */ + + +static uint16_t gf_reduce(uint64_t x, size_t deg_x); + + +/** + * Returns the integer i such that elt = a^i + * where a is the primitive element of GF(2^GF_M). + *@returns the logarithm of the given element + */ +uint16_t PQCLEAN_HQCRMRS192_AVX2_gf_log(uint16_t elt) { + return log[elt]; +} + + + +/** + * Reduces polynomial x modulo primitive polynomial GF_POLY. + * @returns x mod GF_POLY + * @param[in] x Polynomial of degree less than 64 + * @param[in] deg_x The degree of polynomial x + */ +static uint16_t gf_reduce(uint64_t x, size_t deg_x) { + // Compute the distance between the primitive polynomial first two set bits + size_t lz1 = __builtin_clz(PARAM_GF_POLY); + size_t lz2 = __builtin_clz(PARAM_GF_POLY ^ 1 << PARAM_M); + size_t dist = lz2 - lz1; + + // Deduce the number of steps of reduction + size_t steps = CEIL_DIVIDE(deg_x - (PARAM_M - 1), dist); + + // Reduce + for (size_t i = 0; i < steps; ++i) { + uint64_t mod = x >> PARAM_M; + x &= (1 << PARAM_M) - 1; + x ^= mod; + + size_t tz1 = 0; + uint16_t rmdr = PARAM_GF_POLY ^ 1; + for (size_t j = __builtin_popcount(PARAM_GF_POLY) - 2; j; --j) { + size_t tz2 = __builtin_ctz(rmdr); + size_t shift = tz2 - tz1; + mod <<= shift; + x ^= mod; + rmdr ^= 1 << tz2; + tz1 = tz2; + } + } + + return x; +} + + + +/** + * Multiplies two elements of GF(2^GF_M). + * @returns the product a*b + * @param[in] a Element of GF(2^GF_M) + * @param[in] b Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQCRMRS192_AVX2_gf_mul(uint16_t a, uint16_t b) { + __m128i va = _mm_cvtsi32_si128(a); + __m128i vb = _mm_cvtsi32_si128(b); + __m128i vab = _mm_clmulepi64_si128(va, vb, 0); + uint32_t ab = _mm_cvtsi128_si32(vab); + + return gf_reduce(ab, 2 * (PARAM_M - 1)); +} + + + +/** + * Squares an element of GF(2^GF_M). + * @returns a^2 + * @param[in] a Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQCRMRS192_AVX2_gf_square(uint16_t a) { + uint32_t b = a; + uint32_t s = b & 1; + for (size_t i = 1; i < PARAM_M; ++i) { + b <<= 1; + s ^= b & (1 << 2 * i); + } + + return gf_reduce(s, 2 * (PARAM_M - 1)); +} + + +/** + * Computes the inverse of an element of GF(2^GF_M) by fast exponentiation. + * @returns the inverse of a + * @param[in] a Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQCRMRS192_AVX2_gf_inverse(uint16_t a) { + size_t pow = (1 << PARAM_M) - 2; + uint16_t inv = 1; + + do { + if (pow & 1) { + inv = PQCLEAN_HQCRMRS192_AVX2_gf_mul(inv, a); + } + a = PQCLEAN_HQCRMRS192_AVX2_gf_square(a); + pow >>= 1; + } while (pow); + + return inv; +} + + + +/** + * Returns i modulo 2^GF_M-1. + * i must be less than 2*(2^GF_M-1). + * Therefore, the return value is either i or i-2^GF_M+1. + * @returns i mod (2^GF_M-1) + * @param[in] i The integer whose modulo is taken + */ +uint16_t PQCLEAN_HQCRMRS192_AVX2_gf_mod(uint16_t i) { + uint16_t tmp = i - PARAM_GF_MUL_ORDER; + + // mask = 0xffff if (i < GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & PARAM_GF_MUL_ORDER); +} diff --git a/crypto_kem/hqc-rmrs-192/avx2/gf.h b/crypto_kem/hqc-rmrs-192/avx2/gf.h new file mode 100644 index 00000000..780e986c --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/gf.h @@ -0,0 +1,43 @@ +#ifndef GF_H +#define GF_H + + +/** + * @file gf.h + * Header file of gf.c + */ + +#include + +#include +#include + + +/** + * Powers of the root alpha of 1 + x^2 + x^3 + x^4 + x^8. + * The last two elements are needed by the PQCLEAN_HQCRMRS192_AVX2_gf_mul function + * (for example if both elements to multiply are zero). + */ +static const uint16_t exp [258] = { 1, 2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240, 253, 231, 211, 187, 107, 214, 177, 127, 254, 225, 223, 163, 91, 182, 113, 226, 217, 175, 67, 134, 17, 34, 68, 136, 13, 26, 52, 104, 208, 189, 103, 206, 129, 31, 62, 124, 248, 237, 199, 147, 59, 118, 236, 197, 151, 51, 102, 204, 133, 23, 46, 92, 184, 109, 218, 169, 79, 158, 33, 66, 132, 21, 42, 84, 168, 77, 154, 41, 82, 164, 85, 170, 73, 146, 57, 114, 228, 213, 183, 115, 230, 209, 191, 99, 198, 145, 63, 126, 252, 229, 215, 179, 123, 246, 241, 255, 227, 219, 171, 75, 150, 49, 98, 196, 149, 55, 110, 220, 165, 87, 174, 65, 130, 25, 50, 100, 200, 141, 7, 14, 28, 56, 112, 224, 221, 167, 83, 166, 81, 162, 89, 178, 121, 242, 249, 239, 195, 155, 43, 86, 172, 69, 138, 9, 18, 36, 72, 144, 61, 122, 244, 245, 247, 243, 251, 235, 203, 139, 11, 22, 44, 88, 176, 125, 250, 233, 207, 131, 27, 54, 108, 216, 173, 71, 142, 1, 2, 4 }; + + + +/** + * Logarithm of elements of GF(2^8) to the base alpha (root of 1 + x^2 + x^3 + x^4 + x^8). + * The logarithm of 0 is set to 0 by convention. + */ +static const uint16_t log [256] = { 0, 0, 1, 25, 2, 50, 26, 198, 3, 223, 51, 238, 27, 104, 199, 75, 4, 100, 224, 14, 52, 141, 239, 129, 28, 193, 105, 248, 200, 8, 76, 113, 5, 138, 101, 47, 225, 36, 15, 33, 53, 147, 142, 218, 240, 18, 130, 69, 29, 181, 194, 125, 106, 39, 249, 185, 201, 154, 9, 120, 77, 228, 114, 166, 6, 191, 139, 98, 102, 221, 48, 253, 226, 152, 37, 179, 16, 145, 34, 136, 54, 208, 148, 206, 143, 150, 219, 189, 241, 210, 19, 92, 131, 56, 70, 64, 30, 66, 182, 163, 195, 72, 126, 110, 107, 58, 40, 84, 250, 133, 186, 61, 202, 94, 155, 159, 10, 21, 121, 43, 78, 212, 229, 172, 115, 243, 167, 87, 7, 112, 192, 247, 140, 128, 99, 13, 103, 74, 222, 237, 49, 197, 254, 24, 227, 165, 153, 119, 38, 184, 180, 124, 17, 68, 146, 217, 35, 32, 137, 46, 55, 63, 209, 91, 149, 188, 207, 205, 144, 135, 151, 178, 220, 252, 190, 97, 242, 86, 211, 171, 20, 42, 93, 158, 132, 60, 57, 83, 71, 109, 65, 162, 31, 45, 67, 216, 183, 123, 164, 118, 196, 23, 73, 236, 127, 12, 111, 246, 108, 161, 59, 82, 41, 157, 85, 170, 251, 96, 134, 177, 187, 204, 62, 90, 203, 89, 95, 176, 156, 169, 160, 81, 11, 245, 22, 235, 122, 117, 44, 215, 79, 174, 213, 233, 230, 231, 173, 232, 116, 214, 244, 234, 168, 80, 88, 175 }; + + +uint16_t PQCLEAN_HQCRMRS192_AVX2_gf_log(uint16_t elt); + +uint16_t PQCLEAN_HQCRMRS192_AVX2_gf_mul(uint16_t a, uint16_t b); + +uint16_t PQCLEAN_HQCRMRS192_AVX2_gf_square(uint16_t a); + +uint16_t PQCLEAN_HQCRMRS192_AVX2_gf_inverse(uint16_t a); + +uint16_t PQCLEAN_HQCRMRS192_AVX2_gf_mod(uint16_t i); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/avx2/gf2x.c b/crypto_kem/hqc-rmrs-192/avx2/gf2x.c new file mode 100644 index 00000000..51a32cdd --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/gf2x.c @@ -0,0 +1,606 @@ +#include "gf2x.h" +#include "parameters.h" +#include +#include +#include + +/** + * \file gf2x.c + * \brief AVX2 implementation of multiplication of two polynomials + */ + + +// sizes for Toom-Cook +#define T_TM3_3W_256 64 +#define T_TM3_3W_64 256 + +#define VEC_N_ARRAY_SIZE_VEC CEIL_DIVIDE(PARAM_N, 256) /*!< The number of needed vectors to store PARAM_N bits*/ +#define WORD 64 +#define LAST64 (PARAM_N >> 6) +uint64_t a1_times_a2[2 * VEC_N_256_SIZE_64 + 1]; +uint64_t tmp_reduce[VEC_N_ARRAY_SIZE_VEC << 2]; +__m256i *o256 = (__m256i *) tmp_reduce; +uint64_t bloc64[PARAM_OMEGA_R]; // Allocation with the biggest possible weight +uint64_t bit64[PARAM_OMEGA_R]; // Allocation with the biggest possible weight + + +static inline void reduce(uint64_t *o, const uint64_t *a); +inline static void karat_mult_1(__m128i *C, __m128i *A, __m128i *B); +inline static void karat_mult_2(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_4(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_8(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_16(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_32(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_64(__m256i *C, __m256i *A, __m256i *B); +static inline void divByXplus1(__m256i *out, __m256i *in, int size); +static void TOOM3Mult(uint64_t *Out, const uint64_t *A, const uint64_t *B); + + + +/** + * @brief Compute o(x) = a(x) mod \f$ X^n - 1\f$ + * + * This function computes the modular reduction of the polynomial a(x) + * + * @param[out] o Pointer to the result + * @param[in] a Pointer to the polynomial a(x) + */ +static inline void reduce(uint64_t *o, const uint64_t *a) { + __m256i r256, carry256; + __m256i *a256 = (__m256i *) a; + static const int32_t dec64 = PARAM_N & 0x3f; + static const int32_t d0 = WORD - dec64; + int32_t i, i2; + + for (i = LAST64 ; i < (PARAM_N >> 5) - 4 ; i += 4) { + r256 = _mm256_lddqu_si256((__m256i const *) (& a[i])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_lddqu_si256((__m256i const *) (& a[i + 1])); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = a256[i2] ^ r256; + } + + r256 = _mm256_lddqu_si256((__m256i const *)(& a[i])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_lddqu_si256((__m256i const *)(& a[i + 1])); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = a256[i2] ^ r256; + i += 4; + r256 = _mm256_lddqu_si256((__m256i const *)(& a[i])); + carry256 = _mm256_lddqu_si256((__m256i const *) (& a[i + 1])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = (a256[i2] ^ r256); + tmp_reduce[LAST64] &= RED_MASK; + memcpy(o, tmp_reduce, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * A(x) and B(x) are stored in 128-bit registers + * This function computes A(x)*B(x) using Karatsuba + * + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_1(__m128i *C, __m128i *A, __m128i *B) { + __m128i D1[2]; + __m128i D0[2], D2[2]; + __m128i Al = _mm_loadu_si128(A); + __m128i Ah = _mm_loadu_si128(A + 1); + __m128i Bl = _mm_loadu_si128(B); + __m128i Bh = _mm_loadu_si128(B + 1); + + // Compute Al.Bl=D0 + __m128i DD0 = _mm_clmulepi64_si128(Al, Bl, 0); + __m128i DD2 = _mm_clmulepi64_si128(Al, Bl, 0x11); + __m128i AAlpAAh = _mm_xor_si128(Al, _mm_shuffle_epi32(Al, 0x4e)); + __m128i BBlpBBh = _mm_xor_si128(Bl, _mm_shuffle_epi32(Bl, 0x4e)); + __m128i DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D0[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D0[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Compute Ah.Bh=D2 + DD0 = _mm_clmulepi64_si128(Ah, Bh, 0); + DD2 = _mm_clmulepi64_si128(Ah, Bh, 0x11); + AAlpAAh = _mm_xor_si128(Ah, _mm_shuffle_epi32(Ah, 0x4e)); + BBlpBBh = _mm_xor_si128(Bh, _mm_shuffle_epi32(Bh, 0x4e)); + DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D2[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D2[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Compute AlpAh.BlpBh=D1 + // Initialisation of AlpAh and BlpBh + __m128i AlpAh = _mm_xor_si128(Al, Ah); + __m128i BlpBh = _mm_xor_si128(Bl, Bh); + DD0 = _mm_clmulepi64_si128(AlpAh, BlpBh, 0); + DD2 = _mm_clmulepi64_si128(AlpAh, BlpBh, 0x11); + AAlpAAh = _mm_xor_si128(AlpAh, _mm_shuffle_epi32(AlpAh, 0x4e)); + BBlpBBh = _mm_xor_si128(BlpBh, _mm_shuffle_epi32(BlpBh, 0x4e)); + DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D1[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D1[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Final comutation of C + __m128i middle = _mm_xor_si128(D0[1], D2[0]); + C[0] = D0[0]; + C[1] = middle ^ D0[0] ^ D1[0]; + C[2] = middle ^ D1[1] ^ D2[1]; + C[3] = D2[1]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_2(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[2], D1[2], D2[2], SAA, SBB; + __m128i *A128 = (__m128i *)A, *B128 = (__m128i *)B; + + karat_mult_1((__m128i *) D0, A128, B128); + karat_mult_1((__m128i *) D2, A128 + 2, B128 + 2); + + SAA = A[0] ^ A[1]; + SBB = B[0] ^ B[1]; + + karat_mult_1((__m128i *) D1, (__m128i *) &SAA, (__m128i *) &SBB); + __m256i middle = _mm256_xor_si256(D0[1], D2[0]); + + C[0] = D0[0]; + C[1] = middle ^ D0[0] ^ D1[0]; + C[2] = middle ^ D1[1] ^ D2[1]; + C[3] = D2[1]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_4(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[4], D1[4], D2[4], SAA[2], SBB[2]; + + karat_mult_2( D0, A, B); + karat_mult_2(D2, A + 2, B + 2); + + SAA[0] = A[0] ^ A[2]; + SBB[0] = B[0] ^ B[2]; + SAA[1] = A[1] ^ A[3]; + SBB[1] = B[1] ^ B[3]; + + karat_mult_2( D1, SAA, SBB); + + __m256i middle0 = _mm256_xor_si256(D0[2], D2[0]); + __m256i middle1 = _mm256_xor_si256(D0[3], D2[1]); + + C[0] = D0[0]; + C[1] = D0[1]; + C[2] = middle0 ^ D0[0] ^ D1[0]; + C[3] = middle1 ^ D0[1] ^ D1[1]; + C[4] = middle0 ^ D1[2] ^ D2[2]; + C[5] = middle1 ^ D1[3] ^ D2[3]; + C[6] = D2[2]; + C[7] = D2[3]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_8(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[8], D1[8], D2[8], SAA[4], SBB[4]; + + karat_mult_4( D0, A, B); + karat_mult_4(D2, A + 4, B + 4); + + for (int32_t i = 0 ; i < 4 ; i++) { + int is = i + 4; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_4(D1, SAA, SBB); + + for (int32_t i = 0 ; i < 4 ; i++) { + int32_t is = i + 4; + int32_t is2 = is + 4; + int32_t is3 = is2 + 4; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_16(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[16], D1[16], D2[16], SAA[8], SBB[8]; + + karat_mult_8( D0, A, B); + karat_mult_8(D2, A + 8, B + 8); + + for (int32_t i = 0 ; i < 8 ; i++) { + int32_t is = i + 8; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_8( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 8 ; i++) { + int32_t is = i + 8; + int32_t is2 = is + 8; + int32_t is3 = is2 + 8; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_32(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[32], D1[32], D2[32], SAA[16], SBB[16]; + + karat_mult_16( D0, A, B); + karat_mult_16(D2, A + 16, B + 16); + + for (int32_t i = 0 ; i < 16 ; i++) { + int is = i + 16; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_16( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 16 ; i++) { + int32_t is = i + 16; + int32_t is2 = is + 16; + int32_t is3 = is2 + 16; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_64(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[64], D1[64], D2[64], SAA[32], SBB[32]; + + karat_mult_32( D0, A, B); + karat_mult_32(D2, A + 32, B + 32); + for (int32_t i = 0 ; i < 32 ; i++) { + int32_t is = i + 32; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_32( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 32 ; i++) { + int32_t is = i + 32; + int32_t is2 = is + 32; + int32_t is3 = is2 + 32; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute B(x) = A(x)/(x+1) + * + * This function computes A(x)/(x+1) using a Quercia like algorithm + * @param[out] out Pointer to the result + * @param[in] in Pointer to the polynomial A(x) + * @param[in] size used to define the number of coeeficients of A + */ +static inline void divByXplus1(__m256i *out, __m256i *in, int size) { + uint64_t *A = (uint64_t *) in; + uint64_t *B = (uint64_t *) out; + + B[0] = A[0]; + + for (int32_t i = 1 ; i < 2 * (size << 2) ; i++) { + B[i] = B[i - 1] ^ A[i]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) using TOOM3Mult + * + * This function computes A(x)*B(x) using TOOM-COOK3 Multiplication + * last multiplication are done using Karatsuba + * @param[out] Out Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +static void TOOM3Mult(uint64_t *Out, const uint64_t *A, const uint64_t *B) { + static __m256i U0[T_TM3_3W_256], V0[T_TM3_3W_256], U1[T_TM3_3W_256], V1[T_TM3_3W_256], U2[T_TM3_3W_256], V2[T_TM3_3W_256]; + static __m256i W0[2 * (T_TM3_3W_256)], W1[2 * (T_TM3_3W_256)], W2[2 * (T_TM3_3W_256)], W3[2 * (T_TM3_3W_256)], W4[2 * (T_TM3_3W_256)]; + static __m256i tmp[2 * (T_TM3_3W_256)]; + static __m256i ro256[6 * (T_TM3_3W_256)]; + const __m256i zero = (__m256i) { + 0ul, 0ul, 0ul, 0ul + }; + int32_t T2 = T_TM3_3W_64 << 1; + + for (int32_t i = 0 ; i < T_TM3_3W_256 - 1 ; i++) { + int32_t i4 = i << 2; + int32_t i42 = i4 - 2; + U0[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4])); + V0[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4])); + U1[i] = _mm256_lddqu_si256((__m256i const *)(& A[i42 + T_TM3_3W_64])); + V1[i] = _mm256_lddqu_si256((__m256i const *)(& B[i42 + T_TM3_3W_64])); + U2[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4 + T2 - 4])); + V2[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4 + T2 - 4])); + } + + for (int32_t i = T_TM3_3W_256 - 1 ; i < T_TM3_3W_256 ; i++) { + int32_t i4 = i << 2; + int32_t i41 = i4 + 1; + U0[i] = (__m256i) { + A[i4], A[i41], 0x0ul, 0x0ul + }; + V0[i] = (__m256i) { + B[i4], B[i41], 0x0ul, 0x0ul + }; + U1[i] = (__m256i) { + A[i4 + T_TM3_3W_64 - 2], A[i41 + T_TM3_3W_64 - 2], 0x0ul, 0x0ul + }; + V1[i] = (__m256i) { + B[i4 + T_TM3_3W_64 - 2], B[i41 + T_TM3_3W_64 - 2], 0x0ul, 0x0ul + }; + U2[i] = (__m256i) { + A[i4 - 4 + T2], A[i4 - 3 + T2], 0x0ul, 0x0ul + }; + V2[i] = (__m256i) { + B[i4 - 4 + T2], B[i4 - 3 + T2], 0x0ul, 0x0ul + }; + } + + // Evaluation phase : x= X^64 + // P(X): P0=(0); P1=(1); P2=(x); P3=(1+x); P4=(\infty) + // Evaluation: 5*2 add, 2*2 shift; 5 mul (n) + //W3 = U2 + U1 + U0 ; W2 = V2 + V1 + V0 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W3[i] = U0[i] ^ U1[i] ^ U2[i]; + W2[i] = V0[i] ^ V1[i] ^ V2[i]; + } + + //W1 = W2 * W3 + karat_mult_64( W1, W2, W3); + //W0 =(U1 + U2*x)*x ; W4 =(V1 + V2*x)*x (SIZE = T_TM3_3W_256 !) + int64_t *U1_64 = ((int64_t *) U1); + int64_t *U2_64 = ((int64_t *) U2); + + int64_t *V1_64 = ((int64_t *) V1); + int64_t *V2_64 = ((int64_t *) V2); + + W0[0] = _mm256_set_epi64x(U1_64[2] ^ U2_64[1], U1_64[1] ^ U2_64[0], U1_64[0], 0); + W4[0] = _mm256_set_epi64x(V1_64[2] ^ V2_64[1], V1_64[1] ^ V2_64[0], V1_64[0], 0); + + U1_64 = ((int64_t *) U1); + U2_64 = ((int64_t *) U2); + + V1_64 = ((int64_t *) V1); + V2_64 = ((int64_t *) V2); + + for (int32_t i = 1 ; i < T_TM3_3W_256 ; i++) { + int i4 = i << 2; + W0[i] = _mm256_lddqu_si256((__m256i const *)(& U1_64[i4 - 1])); + W0[i] ^= _mm256_lddqu_si256((__m256i const *)(& U2_64[i4 - 2])); + + W4[i] = _mm256_lddqu_si256((__m256i const *)(& V1_64[i4 - 1])); + W4[i] ^= _mm256_lddqu_si256((__m256i const *)(& V2_64[i4 - 2])); + } + + //W3 = W3 + W0 ; W2 = W2 + W4 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W3[i] ^= W0[i]; + W2[i] ^= W4[i]; + } + + //W0 = W0 + U0 ; W4 = W4 + V0 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W0[i] ^= U0[i]; + W4[i] ^= V0[i]; + } + + karat_mult_64(tmp, W3, W2); + + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W3[i] = tmp[i]; + } + + karat_mult_64( W2, W0, W4); + + //W4 = U2 * V2 ; W0 = U0 * V0 + karat_mult_64(W4, U2, V2); + karat_mult_64(W0, U0, V0); + + // Interpolation phase + // 9 add, 1 shift, 1 Smul, 2 Sdiv (2n) + //W3 = W3 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W3[i] ^= W2[i]; + } + + //W1 = W1 + W0 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W1[i] ^= W0[i]; + } + + //W2 =(W2 + W0)/x -> x = X^64 + U1_64 = ((int64_t *) W2); + U2_64 = ((int64_t *) W0); + for (int32_t i = 0 ; i < (T_TM3_3W_256 << 1) ; i++) { + int32_t i4 = i << 2; + W2[i] = _mm256_lddqu_si256((__m256i const *)(& U1_64[i4 + 1])); + W2[i] ^= _mm256_lddqu_si256((__m256i const *)(& U2_64[i4 + 1])); + } + + //W2 =(W2 + W3 + W4*(x^3+1))/(x+1) + U1_64 = ((int64_t *) W4); + __m256i *U1_256 = (__m256i *) (U1_64 + 1); + tmp[0] = W2[0] ^ W3[0] ^ W4[0] ^ (__m256i) { + 0x0ul, 0x0ul, 0x0ul, U1_64[0] + }; + + for (int32_t i = 1 ; i < (T_TM3_3W_256 << 1) - 1 ; i++) { + tmp[i] = W2[i] ^ W3[i] ^ W4[i] ^ _mm256_lddqu_si256(&U1_256[i - 1]); + } + + divByXplus1(W2, tmp, T_TM3_3W_256); + W2[2 * (T_TM3_3W_256) - 1] = zero; + + //W3 =(W3 + W1)/(x*(x+1)) + U1_64 = (int64_t *) W3; + U1_256 = (__m256i *) (U1_64 + 1); + + U2_64 = (int64_t *) W1; + __m256i *U2_256 = (__m256i *) (U2_64 + 1); + + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) - 1 ; i++) { + tmp[i] = _mm256_lddqu_si256(&U1_256[i]) ^ _mm256_lddqu_si256(&U2_256[i]); + } + + divByXplus1(W3, tmp, T_TM3_3W_256); + W3[2 * (T_TM3_3W_256) - 1] = zero; + + //W1 = W1 + W4 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W1[i] ^= W2[i] ^ W4[i]; + } + + //W2 = W2 + W3 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W2[i] ^= W3[i]; + } + + // Recomposition + //W = W0+ W1*x+ W2*x^2+ W3*x^3 + W4*x^4 + //W0, W1, W4 of size 2*T_TM3_3W_256, W2 and W3 of size 2*(T_TM3_3W_256) + for (int32_t i = 0 ; i < (T_TM3_3W_256 << 1) - 1 ; i++) { + ro256[i] = W0[i]; + ro256[i + 2 * T_TM3_3W_256 - 1] = W2[i]; + ro256[i + 4 * T_TM3_3W_256 - 2] = W4[i]; + } + + ro256[(T_TM3_3W_256 << 1) - 1] = W0[(T_TM3_3W_256 << 1) - 1] ^ W2[0]; + ro256[(T_TM3_3W_256 << 2) - 2] = W2[(T_TM3_3W_256 << 1) - 1] ^ W4[0]; + ro256[(T_TM3_3W_256 * 6) - 3] = W4[(T_TM3_3W_256 << 1) - 1]; + + U1_64 = ((int64_t *) &ro256[T_TM3_3W_256]); + U1_256 = (__m256i *) (U1_64 - 2); + + U2_64 = ((int64_t *) &ro256[3 * T_TM3_3W_256 - 1]); + U2_256 = (__m256i *) (U2_64 - 2); + + for (int32_t i = 0 ; i < T_TM3_3W_256 << 1 ; i++) { + _mm256_storeu_si256(&U1_256[i], W1[i] ^ _mm256_lddqu_si256(&U1_256[i])); + _mm256_storeu_si256(&U2_256[i], W3[i] ^ _mm256_loadu_si256(&U2_256[i])); + } + + for (int32_t i = 0 ; i < 6 * T_TM3_3W_256 - 2 ; i++) { + uint64_t *out64 = Out + (i << 2); + _mm256_storeu_si256((__m256i *)out64, ro256[i]); + } +} + + + +/** + * @brief Multiply two polynomials modulo \f$ X^n - 1\f$. + * + * This functions multiplies a sparse polynomial a1 (of Hamming weight equal to weight) + * and a dense polynomial a2. The multiplication is done modulo \f$ X^n - 1\f$. + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to a polynomial + * @param[in] a2 Pointer to a polynomial + */ +void PQCLEAN_HQCRMRS192_AVX2_vect_mul(uint64_t *o, const uint64_t *a1, const uint64_t *a2) { + TOOM3Mult(a1_times_a2, a1, a2); + reduce(o, a1_times_a2); + + // clear all + memset(a1_times_a2, 0, (VEC_N_SIZE_64 << 1) * sizeof(uint64_t)); +} diff --git a/crypto_kem/hqc-rmrs-192/avx2/gf2x.h b/crypto_kem/hqc-rmrs-192/avx2/gf2x.h new file mode 100644 index 00000000..6aaf3d3e --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/gf2x.h @@ -0,0 +1,17 @@ +#ifndef GF2X_H +#define GF2X_H + + +/** + * @file gf2x.h + * @brief Header file for gf2x.c + */ + +#include + +#include + +void PQCLEAN_HQCRMRS192_AVX2_vect_mul(uint64_t *o, const uint64_t *a1, const uint64_t *a2); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/avx2/hqc.c b/crypto_kem/hqc-rmrs-192/avx2/hqc.c new file mode 100644 index 00000000..627b47e0 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/hqc.c @@ -0,0 +1,138 @@ +#include "code.h" +#include "gf2x.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +/** + * @file hqc.c + * @brief Implementation of hqc.h + */ + + + +/** + * @brief Keygen of the HQC_PKE IND_CPA scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS192_AVX2_hqc_pke_keygen(unsigned char *pk, unsigned char *sk) { + AES_XOF_struct sk_seedexpander; + AES_XOF_struct pk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + uint8_t pk_seed[SEED_BYTES] = {0}; + uint64_t x[VEC_N_256_SIZE_64] = {0}; + uint64_t y[VEC_N_256_SIZE_64] = {0}; + uint64_t h[VEC_N_256_SIZE_64] = {0}; + uint64_t s[VEC_N_256_SIZE_64] = {0}; + + // Create seed_expanders for public key and secret key + randombytes(sk_seed, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + randombytes(pk_seed, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute secret key + PQCLEAN_HQCRMRS192_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQCRMRS192_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, y, PARAM_OMEGA); + + // Compute public key + PQCLEAN_HQCRMRS192_AVX2_vect_set_random(&pk_seedexpander, h); + PQCLEAN_HQCRMRS192_AVX2_vect_mul(s, y, h); + PQCLEAN_HQCRMRS192_AVX2_vect_add(s, x, s, VEC_N_256_SIZE_64); + + // Parse keys to string + PQCLEAN_HQCRMRS192_AVX2_hqc_public_key_to_string(pk, pk_seed, s); + PQCLEAN_HQCRMRS192_AVX2_hqc_secret_key_to_string(sk, sk_seed, pk); + +} + + + +/** + * @brief Encryption of the HQC_PKE IND_CPA scheme + * + * The cihertext is composed of vectors u and v. + * + * @param[out] u Vector u (first part of the ciphertext) + * @param[out] v Vector v (second part of the ciphertext) + * @param[in] m Vector representing the message to encrypt + * @param[in] theta Seed used to derive randomness required for encryption + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS192_AVX2_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk) { + AES_XOF_struct seedexpander; + uint64_t h[VEC_N_256_SIZE_64] = {0}; + uint64_t s[VEC_N_256_SIZE_64] = {0}; + uint64_t r1[VEC_N_256_SIZE_64] = {0}; + uint64_t r2[VEC_N_256_SIZE_64] = {0}; + uint64_t e[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp1[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_256_SIZE_64] = {0}; + + // Create seed_expander from theta + seedexpander_init(&seedexpander, theta, theta + 32, SEEDEXPANDER_MAX_LENGTH); + + // Retrieve h and s from public key + PQCLEAN_HQCRMRS192_AVX2_hqc_public_key_from_string(h, s, pk); + + // Generate r1, r2 and e + PQCLEAN_HQCRMRS192_AVX2_vect_set_random_fixed_weight(&seedexpander, r1, PARAM_OMEGA_R); + PQCLEAN_HQCRMRS192_AVX2_vect_set_random_fixed_weight(&seedexpander, r2, PARAM_OMEGA_R); + PQCLEAN_HQCRMRS192_AVX2_vect_set_random_fixed_weight(&seedexpander, e, PARAM_OMEGA_E); + + // Compute u = r1 + r2.h + PQCLEAN_HQCRMRS192_AVX2_vect_mul(u, r2, h); + PQCLEAN_HQCRMRS192_AVX2_vect_add(u, r1, u, VEC_N_256_SIZE_64); + + // Compute v = m.G by encoding the message + PQCLEAN_HQCRMRS192_AVX2_code_encode(v, m); + PQCLEAN_HQCRMRS192_AVX2_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + + // Compute v = m.G + s.r2 + e + PQCLEAN_HQCRMRS192_AVX2_vect_mul(tmp2, r2, s); + PQCLEAN_HQCRMRS192_AVX2_vect_add(tmp2, e, tmp2, VEC_N_256_SIZE_64); + PQCLEAN_HQCRMRS192_AVX2_vect_add(tmp2, tmp1, tmp2, VEC_N_256_SIZE_64); + PQCLEAN_HQCRMRS192_AVX2_vect_resize(v, PARAM_N1N2, tmp2, PARAM_N); + +} + + + +/** + * @brief Decryption of the HQC_PKE IND_CPA scheme + * + * @param[out] m Vector representing the decrypted message + * @param[in] u Vector u (first part of the ciphertext) + * @param[in] v Vector v (second part of the ciphertext) + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS192_AVX2_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk) { + uint64_t x[VEC_N_256_SIZE_64] = {0}; + uint64_t y[VEC_N_256_SIZE_64] = {0}; + uint8_t pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t tmp1[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_256_SIZE_64] = {0}; + + // Retrieve x, y, pk from secret key + PQCLEAN_HQCRMRS192_AVX2_hqc_secret_key_from_string(x, y, pk, sk); + + // Compute v - u.y + PQCLEAN_HQCRMRS192_AVX2_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + PQCLEAN_HQCRMRS192_AVX2_vect_mul(tmp2, y, u); + PQCLEAN_HQCRMRS192_AVX2_vect_add(tmp2, tmp1, tmp2, VEC_N_256_SIZE_64); + + + // Compute m by decoding v - u.y + PQCLEAN_HQCRMRS192_AVX2_code_decode(m, tmp2); +} diff --git a/crypto_kem/hqc-rmrs-192/avx2/hqc.h b/crypto_kem/hqc-rmrs-192/avx2/hqc.h new file mode 100644 index 00000000..49e68a75 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/hqc.h @@ -0,0 +1,21 @@ +#ifndef HQC_H +#define HQC_H + + +/** + * @file hqc.h + * @brief Functions of the HQC_PKE IND_CPA scheme + */ + +#include + +#include + +void PQCLEAN_HQCRMRS192_AVX2_hqc_pke_keygen(unsigned char *pk, unsigned char *sk); + +void PQCLEAN_HQCRMRS192_AVX2_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk); + +void PQCLEAN_HQCRMRS192_AVX2_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/avx2/kem.c b/crypto_kem/hqc-rmrs-192/avx2/kem.c new file mode 100644 index 00000000..d9b9425b --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/kem.c @@ -0,0 +1,138 @@ +#include "api.h" +#include "fips202.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "sha2.h" +#include "vector.h" +#include +#include +/** + * @file kem.c + * @brief Implementation of api.h + */ + + + +/** + * @brief Keygen of the HQC_KEM IND_CAA2 scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + * @returns 0 if keygen is successful + */ +int PQCLEAN_HQCRMRS192_AVX2_crypto_kem_keypair(unsigned char *pk, unsigned char *sk) { + + PQCLEAN_HQCRMRS192_AVX2_hqc_pke_keygen(pk, sk); + return 0; +} + + + +/** + * @brief Encapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ct String containing the ciphertext + * @param[out] ss String containing the shared secret + * @param[in] pk String containing the public key + * @returns 0 if encapsulation is successful + */ +int PQCLEAN_HQCRMRS192_AVX2_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk) { + + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint64_t u[VEC_N_256_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Computing m + PQCLEAN_HQCRMRS192_AVX2_vect_set_random_from_randombytes(m); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m + PQCLEAN_HQCRMRS192_AVX2_hqc_pke_encrypt(u, v, m, theta, pk); + + // Computing d + sha512(d, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Computing ciphertext + PQCLEAN_HQCRMRS192_AVX2_hqc_ciphertext_to_string(ct, u, v, d); + + + return 0; +} + + + +/** + * @brief Decapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ss String containing the shared secret + * @param[in] ct String containing the cipĥertext + * @param[in] sk String containing the secret key + * @returns 0 if decapsulation is successful, -1 otherwise + */ +int PQCLEAN_HQCRMRS192_AVX2_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk) { + + int8_t result = -1; + uint64_t u[VEC_N_256_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t u2[VEC_N_256_SIZE_64] = {0}; + uint64_t v2[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d2[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Retrieving u, v and d from ciphertext + PQCLEAN_HQCRMRS192_AVX2_hqc_ciphertext_from_string(u, v, d, ct); + + // Retrieving pk from sk + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); + + // Decryting + PQCLEAN_HQCRMRS192_AVX2_hqc_pke_decrypt(m, u, v, sk); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m' + PQCLEAN_HQCRMRS192_AVX2_hqc_pke_encrypt(u2, v2, m, theta, pk); + + // Computing d' + sha512(d2, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Abort if c != c' or d != d' + result = (PQCLEAN_HQCRMRS192_AVX2_vect_compare(u, u2, VEC_N_SIZE_BYTES) == 0 && PQCLEAN_HQCRMRS192_AVX2_vect_compare(v, v2, VEC_N1N2_SIZE_BYTES) == 0 && PQCLEAN_HQCRMRS192_AVX2_vect_compare((uint64_t *)d, (uint64_t *)d2, SHA512_BYTES) == 0); + for (size_t i = 0 ; i < SHARED_SECRET_BYTES ; i++) { + ss[i] = result * ss[i]; + } + result--; + + + return result; +} diff --git a/crypto_kem/hqc-rmrs-192/avx2/parameters.h b/crypto_kem/hqc-rmrs-192/avx2/parameters.h new file mode 100644 index 00000000..d8422a66 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/parameters.h @@ -0,0 +1,109 @@ +#ifndef HQC_PARAMETERS_H +#define HQC_PARAMETERS_H + + +/** + * @file parameters.h + * @brief Parameters of the HQC_KEM IND-CCA2 scheme + */ + +#include "api.h" +#include "api.h" + + +#define CEIL_DIVIDE(a, b) (((a)/(b)) + ((a) % (b) == 0 ? 0 : 1)) /*!< Divide a by b and ceil the result*/ +#define BITMASK(a, size) ((1UL << ((a) % (size))) - 1) /*!< Create a mask*/ + + +/* + #define PARAM_N Define the parameter n of the scheme + #define PARAM_N1 Define the parameter n1 of the scheme (length of Reed-Solomon code) + #define PARAM_N2 Define the parameter n2 of the scheme (length of Duplicated Reed-Muller code) + #define PARAM_N1N2 Define the length in bits of the Concatenated code + #define PARAM_OMEGA Define the parameter omega of the scheme + #define PARAM_OMEGA_E Define the parameter omega_e of the scheme + #define PARAM_OMEGA_R Define the parameter omega_r of the scheme + #define PARAM_SECURITY Define the security level corresponding to the chosen parameters + #define PARAM_DFR_EXP Define the decryption failure rate corresponding to the chosen parameters + + #define SECRET_KEY_BYTES Define the size of the secret key in bytes + #define PUBLIC_KEY_BYTES Define the size of the public key in bytes + #define SHARED_SECRET_BYTES Define the size of the shared secret in bytes + #define CIPHERTEXT_BYTES Define the size of the ciphertext in bytes + + #define UTILS_REJECTION_THRESHOLD Define the rejection threshold used to generate given weight vectors (see vector_set_random_fixed_weight function) + #define VEC_N_SIZE_BYTES Define the size of the array used to store a PARAM_N sized vector in bytes + #define VEC_K_SIZE_BYTES Define the size of the array used to store a PARAM_K sized vector in bytes + #define VEC_N1Y_SIZE_BYTES Define the size of the array used to store a PARAM_N1 sized vector in bytes + #define VEC_N1N2_SIZE_BYTES Define the size of the array used to store a PARAM_N1N2 sized vector in bytes + + #define VEC_N_SIZE_64 Define the size of the array used to store a PARAM_N sized vector in 64 bits + #define VEC_K_SIZE_64 Define the size of the array used to store a PARAM_K sized vector in 64 bits + #define VEC_N1_SIZE_64 Define the size of the array used to store a PARAM_N1 sized vector in 64 bits + #define VEC_N1N2_SIZE_64 Define the size of the array used to store a PARAM_N1N2 sized vector in 64 bits + + #define VEC_N_256_SIZE_64 Define the size of the array of 64 bits elements used to store an array of size PARAM_N considered as elements of 256 bits + #define VEC_N1N2_256_SIZE_64 Define the size of the array of 64 bits elements used to store an array of size PARAM_N1N2 considered as elements of 256 bits + + #define PARAM_DELTA Define the parameter delta of the scheme (correcting capacity of the Reed-Solomon code) + #define PARAM_M Define a positive integer + #define PARAM_GF_POLY Generator polynomial of galois field GF(2^PARAM_M), represented in hexadecimial form + #define PARAM_GF_MUL_ORDER Define the size of the multiplicative group of GF(2^PARAM_M), i.e 2^PARAM_M -1 + #define PARAM_K Define the size of the information bits of the Reed-Solomon code + #define PARAM_G Define the size of the generator polynomial of Reed-Solomon code + #define PARAM_FFT The additive FFT takes a 2^PARAM_FFT polynomial as input + We use the FFT to compute the roots of sigma, whose degree if PARAM_DELTA=22 + The smallest power of 2 greater than 22+1 is 32=2^5 + #define RS_POLY_COEFS Coefficients of the generator polynomial of the Reed-Solomon code + + #define RED_MASK A mask fot the higher bits of a vector + #define SHA512_BYTES Define the size of SHA512 output in bytes + #define SEED_BYTES Define the size of the seed in bytes + #define SEEDEXPANDER_MAX_LENGTH Define the seed expander max length +*/ + +#define PARAM_N 38923 +#define PARAM_N1 76 +#define PARAM_N2 512 +#define PARAM_N1N2 38912 +#define PARAM_OMEGA 101 +#define PARAM_OMEGA_E 117 +#define PARAM_OMEGA_R 117 +#define PARAM_SECURITY 192 +#define PARAM_DFR_EXP 192 + +#define SECRET_KEY_BYTES PQCLEAN_HQCRMRS192_AVX2_CRYPTO_SECRETKEYBYTES +#define PUBLIC_KEY_BYTES PQCLEAN_HQCRMRS192_AVX2_CRYPTO_PUBLICKEYBYTES +#define SHARED_SECRET_BYTES PQCLEAN_HQCRMRS192_AVX2_CRYPTO_BYTES +#define CIPHERTEXT_BYTES PQCLEAN_HQCRMRS192_AVX2_CRYPTO_CIPHERTEXTBYTES + +#define UTILS_REJECTION_THRESHOLD 16775813 +#define VEC_N_SIZE_BYTES CEIL_DIVIDE(PARAM_N, 8) +#define VEC_K_SIZE_BYTES PARAM_K +#define VEC_N1_SIZE_BYTES PARAM_N1 +#define VEC_N1N2_SIZE_BYTES CEIL_DIVIDE(PARAM_N1N2, 8) + +#define VEC_N_SIZE_64 CEIL_DIVIDE(PARAM_N, 64) +#define VEC_K_SIZE_64 CEIL_DIVIDE(PARAM_K, 8) +#define VEC_N1_SIZE_64 CEIL_DIVIDE(PARAM_N1, 8) +#define VEC_N1N2_SIZE_64 CEIL_DIVIDE(PARAM_N1N2, 64) + +#define PARAM_N_MULT 48768 +#define VEC_N_256_SIZE_64 (CEIL_DIVIDE(PARAM_N_MULT, 256) << 2) +#define VEC_N1N2_256_SIZE_64 (CEIL_DIVIDE(PARAM_N1N2, 256) << 2) + +#define PARAM_DELTA 22 +#define PARAM_M 8 +#define PARAM_GF_POLY 0x11D +#define PARAM_GF_MUL_ORDER 255 +#define PARAM_K 32 +#define PARAM_G 45 +#define PARAM_FFT 5 +#define RS_POLY_COEFS 36,248,168,57,215,30,166,88,196,173,61,214,100,134,168,41,57,216,254,252,68,194,32,234,205,39,99,6,66,127,53,221,1,17,7,219,161,30,173,30,51,95,58,65,1 + +#define RED_MASK 0x7ffUL +#define SHA512_BYTES 64 +#define SEED_BYTES 40 +#define SEEDEXPANDER_MAX_LENGTH 4294967295 + +#endif diff --git a/crypto_kem/hqc-rmrs-192/avx2/parsing.c b/crypto_kem/hqc-rmrs-192/avx2/parsing.c new file mode 100644 index 00000000..96451cef --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/parsing.c @@ -0,0 +1,121 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file parsing.c + * @brief Functions to parse secret key, public key and ciphertext of the HQC scheme + */ + + + +/** + * @brief Parse a secret key into a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] sk String containing the secret key + * @param[in] sk_seed Seed used to generate the secret key + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS192_AVX2_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk) { + memcpy(sk, sk_seed, SEED_BYTES); + memcpy(sk + SEED_BYTES, pk, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a secret key from a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] x uint64_t representation of vector x + * @param[out] y uint64_t representation of vector y + * @param[out] pk String containing the public key + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS192_AVX2_hqc_secret_key_from_string(uint64_t *x, uint64_t *y, uint8_t *pk, const uint8_t *sk) { + AES_XOF_struct sk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + + memcpy(sk_seed, sk, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + PQCLEAN_HQCRMRS192_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQCRMRS192_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, y, PARAM_OMEGA); + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a public key into a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] pk String containing the public key + * @param[in] pk_seed Seed used to generate the public key + * @param[in] s uint8_t representation of vector s + */ +void PQCLEAN_HQCRMRS192_AVX2_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s) { + memcpy(pk, pk_seed, SEED_BYTES); + memcpy(pk + SEED_BYTES, s, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Parse a public key from a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] h uint8_t representation of vector h + * @param[out] s uint8_t representation of vector s + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS192_AVX2_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk) { + AES_XOF_struct pk_seedexpander; + uint8_t pk_seed[SEED_BYTES] = {0}; + + memcpy(pk_seed, pk, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + PQCLEAN_HQCRMRS192_AVX2_vect_set_random(&pk_seedexpander, h); + + memcpy(s, pk + SEED_BYTES, VEC_N_SIZE_BYTES); +} + + +/** + * @brief Parse a ciphertext into a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] ct String containing the ciphertext + * @param[in] u uint8_t representation of vector u + * @param[in] v uint8_t representation of vector v + * @param[in] d String containing the hash d + */ +void PQCLEAN_HQCRMRS192_AVX2_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d) { + memcpy(ct, u, VEC_N_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, d, SHA512_BYTES); +} + + +/** + * @brief Parse a ciphertext from a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] u uint8_t representation of vector u + * @param[out] v uint8_t representation of vector v + * @param[out] d String containing the hash d + * @param[in] ct String containing the ciphertext + */ +void PQCLEAN_HQCRMRS192_AVX2_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct) { + memcpy(u, ct, VEC_N_SIZE_BYTES); + memcpy(v, ct + VEC_N_SIZE_BYTES, VEC_N1N2_SIZE_BYTES); + memcpy(d, ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, SHA512_BYTES); +} diff --git a/crypto_kem/hqc-rmrs-192/avx2/parsing.h b/crypto_kem/hqc-rmrs-192/avx2/parsing.h new file mode 100644 index 00000000..6c13d6fb --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/parsing.h @@ -0,0 +1,29 @@ +#ifndef PARSING_H +#define PARSING_H + + +/** + * @file parsing.h + * @brief Header file for parsing.c + */ + +#include + +#include + +void PQCLEAN_HQCRMRS192_AVX2_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk); + +void PQCLEAN_HQCRMRS192_AVX2_hqc_secret_key_from_string(uint64_t *x, uint64_t *y, uint8_t *pk, const uint8_t *sk); + + +void PQCLEAN_HQCRMRS192_AVX2_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s); + +void PQCLEAN_HQCRMRS192_AVX2_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk); + + +void PQCLEAN_HQCRMRS192_AVX2_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d); + +void PQCLEAN_HQCRMRS192_AVX2_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/avx2/reed_muller.c b/crypto_kem/hqc-rmrs-192/avx2/reed_muller.c new file mode 100644 index 00000000..8759e44a --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/reed_muller.c @@ -0,0 +1,376 @@ +#include "parameters.h" +#include "reed_muller.h" +#include +#include +#include +/** + * @file reed_muller.c + * Constant time implementation of Reed-Muller code RM(1,7) + */ + + +// number of repeated code words +#define MULTIPLICITY CEIL_DIVIDE(PARAM_N2, 128) + +// copy bit 0 into all bits of a 64 bit value +#define BIT0MASK(x) (int64_t)(-((x) & 1)) + +static void encode(uint64_t *word, uint32_t message); +static void expand_and_sum(__m256i *dst, const uint64_t *src); +static void hadamard(__m256i *src, __m256i *dst); +static int32_t find_peaks(__m256i *transform); + + + +/** + * @brief Encode a single byte into a single codeword using RM(1,7) + * + * Encoding matrix of this code: + * bit pattern (note that bits are numbered big endian) + * 0 aaaaaaaa aaaaaaaa aaaaaaaa aaaaaaaa + * 1 cccccccc cccccccc cccccccc cccccccc + * 2 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0 + * 3 ff00ff00 ff00ff00 ff00ff00 ff00ff00 + * 4 ffff0000 ffff0000 ffff0000 ffff0000 + * 5 00000000 ffffffff 00000000 ffffffff + * 6 00000000 00000000 ffffffff ffffffff + * 7 ffffffff ffffffff ffffffff ffffffff + * + * @param[out] word An RM(1,7) codeword + * @param[in] message A message to encode + */ +static void encode(uint64_t *word, uint32_t message) { + // the four parts of the word are identical + // except for encoding bits 5 and 6 + uint32_t first_word; + // bit 7 flips all the bits, do that first to save work + first_word = BIT0MASK(message >> 7); + // bits 0, 1, 2, 3, 4 are the same for all four longs + // (Warning: in the bit matrix above, low bits are at the left!) + first_word ^= BIT0MASK(message >> 0) & 0xaaaaaaaa; + first_word ^= BIT0MASK(message >> 1) & 0xcccccccc; + first_word ^= BIT0MASK(message >> 2) & 0xf0f0f0f0; + first_word ^= BIT0MASK(message >> 3) & 0xff00ff00; + first_word ^= BIT0MASK(message >> 4) & 0xffff0000; + // we can store this in the first quarter + ((uint32_t *) word)[0] = first_word; + // bit 5 flips entries 1 and 3; bit 6 flips 2 and 3 + first_word ^= BIT0MASK(message >> 5); + ((uint32_t *) word)[1] = first_word; + first_word ^= BIT0MASK(message >> 6); + ((uint32_t *) word)[3] = first_word; + first_word ^= BIT0MASK(message >> 5); + ((uint32_t *) word)[2] = first_word; +} + + + +/** + * @brief Add multiple codewords into expanded codeword + * + * Note: this does not write the codewords as -1 or +1 as the green machine does + * instead, just 0 and 1 is used. + * The resulting hadamard transform has: + * all values are halved + * the first entry is 64 too high + * + * @param[out] dst Structure that contain the expanded codeword + * @param[in] src Structure that contain the codeword + */ +inline void expand_and_sum(__m256i *dst, const uint64_t *src) { + uint16_t v[16]; + for (size_t part = 0 ; part < 8 ; part++) { + dst[part] = _mm256_setzero_si256(); + } + for (size_t copy = 0 ; copy < MULTIPLICITY ; copy++) { + for (size_t part = 0; part < 8; part++) { + for (size_t bit = 0; bit < 16; bit++) { + v[bit] = (((uint16_t *)(&src[2 * copy]))[part] >> bit) & 1; + } + dst[part] += _mm256_set_epi16(v[15], v[14], v[13], v[12], v[11], v[10], v[9], v[8], + v[7], v[6], v[5], v[4], v[3], v[2], v[1], v[0]); + } + } +} + + + +/** + * @brief Hadamard transform + * + * Perform hadamard transform of src and store result in dst + * src is overwritten: it is also used as intermediate buffer + * Method is best explained if we use H(3) instead of H(7): + * + * The routine multiplies by the matrix H(3): + * [1 1 1 1 1 1 1 1] + * [1 -1 1 -1 1 -1 1 -1] + * [1 1 -1 -1 1 1 -1 -1] + * [a b c d e f g h] * [1 -1 -1 1 1 -1 -1 1] = result of routine + * [1 1 1 1 -1 -1 -1 -1] + * [1 -1 1 -1 -1 1 -1 1] + * [1 1 -1 -1 -1 -1 1 1] + * [1 -1 -1 1 -1 1 1 -1] + * You can do this in three passes, where each pass does this: + * set lower half of buffer to pairwise sums, + * and upper half to differences + * index 0 1 2 3 4 5 6 7 + * input: a, b, c, d, e, f, g, h + * pass 1: a+b, c+d, e+f, g+h, a-b, c-d, e-f, g-h + * pass 2: a+b+c+d, e+f+g+h, a-b+c-d, e-f+g-h, a+b-c-d, e+f-g-h, a-b-c+d, e-f-g+h + * pass 3: a+b+c+d+e+f+g+h a+b-c-d+e+f-g-h a+b+c+d-e-f-g-h a+b-c-d-e+-f+g+h + * a-b+c-d+e-f+g-h a-b-c+d+e-f-g+h a-b+c-d-e+f-g+h a-b-c+d-e+f+g-h + * This order of computation is chosen because it vectorises well. + * Likewise, this routine multiplies by H(7) in seven passes. + * + * @param[out] src Structure that contain the expanded codeword + * @param[out] dst Structure that contain the expanded codeword + */ +inline void hadamard(__m256i *src, __m256i *dst) { + // the passes move data: + // src -> dst -> src -> dst -> src -> dst -> src -> dst + // using p1 and p2 alternately + __m256i *p1 = src; + __m256i *p2 = dst; + __m256i *p3; + for (size_t pass = 0 ; pass < 7 ; pass++) { + // warning: hadd works "within lanes" as Intel call it + // so you have to swap the middle 64 bit blocks of the result + for (size_t part = 0 ; part < 4 ; part++) { + p2[part] = _mm256_permute4x64_epi64(_mm256_hadd_epi16(p1[2 * part], p1[2 * part + 1]), 0xd8); + p2[part + 4] = _mm256_permute4x64_epi64(_mm256_hsub_epi16(p1[2 * part], p1[2 * part + 1]), 0xd8); + } + // swap p1, p2 for next round + p3 = p1; + p1 = p2; + p2 = p3; + } +} + + + +/** + * @brief Finding the location of the highest value + * + * This is the final step of the green machine: find the location of the highest value, + * and add 128 if the peak is positive + * Notes on decoding + * The standard "Green machine" decoder words as follows: + * if the received codeword is W, compute (2 * W - 1) * H7 + * The entries of the resulting vector are always even and vary from + * -128 (= the complement is a code word, add bit 7 to decode) + * via 0 (this is a different codeword) + * to 128 (this is the code word). + * + * Our decoding differs in two ways: + * - We take W instead of 2 * W - 1 (so the entries are 0,1 instead of -1,1) + * - We take the sum of the repititions (so the entries are 0..MULTIPLICITY) + * This implies that we have to subtract 64M (M=MULTIPLICITY) + * from the first entry to make sure the first codewords is handled properly + * and that the entries vary from -64M to 64M. + * -64M or 64M stands for a perfect codeword. + * If there are fewer than 32M errors, there is always a unique codeword + * which an entry with absolute value > 32M; + * this is because an error changes an entry by 1. + * The highest number that seem to be decodable is 50 errors, so that the + * highest entries in the hadamard transform can be as low as 12. + * But this is different for the repeated code. + * Because multiple codewords are added, this changes: the lowest value of the + * hadamard transform of the sum of six words is seen to be as low as 43 (!), + * which is way less than 12*6. + * + * It is possible that there are more errors, but the word is still uniquely + * decodable: we found a word with distance of 50 from the nearest codeword. + * That means that the highest entry can be as low as 14M. + * Since we have to do binary search, we search for the range 1-64M + * which can be done in 6+l2g(M) steps. + * The binary search is based on (values>32M are unique): + * M 32M min> max> firstStep #steps + * 2 64 1 64 33 +- 16 6 + * 4 128 1 128 65 +- 32 7 + * 6 192 1 192 129 +- 64 8 + * + * As a check, we run a sample for M=6 to see the peak value; it ranged + * from 43 to 147, so my analysis looks right. Also, it shows that decoding + * far beyond the bound of 32M is needed. + * + * For the vectors, it would be tempting to use 8 bit ints, + * because the values "almost" fit in there. + * We could use some trickery to fit it in 8 bits, like saturated add or + * division by 2 in a late step. + * Unfortunately, these instructions do not exist. + * the adds _mm512_adds_epi8 is available only on the latest processors, + * and division, shift, mulhi are not available at all for 8 bits. + * So, we use 16 bit ints. + * + * For the search of the optimal comparison value, + * remember the transform contains 64M-d, + * where d are the distances to the codewords. + * The highest value gives the most likely codeword. + * There is not fast vectorized way to find this value, so we search for the + * maximum value itself. + * In each pass, we collect a bit map of the transform values that are, + * say >bound. There are three cases: + * bit map = 0: all code words are further away than 64M-bound (decrease bound) + * bit map has one bit: one unique code word has distance < 64M-bound + * bit map has multiple bits: multiple words (increase bound) + * We will search for the lowest value of bound that gives a nonzero bit map. + * + * @param[in] transform Structure that contain the expanded codeword + */ +inline int32_t find_peaks(__m256i *transform) { + // a whole lot of vector variables + __m256i bitmap, abs_rows[8], bound, active_row, max_abs_rows; + __m256i peak_mask; + // compute absolute value of transform + for (size_t i = 0 ; i < 8 ; i++) { + abs_rows[i] = _mm256_abs_epi16(transform[i]); + } + // compute a vector of 16 elements which contains the maximum somewhere + // (later used to compute bits 0 through 3 of message) + max_abs_rows = abs_rows[0]; + for (size_t i = 1 ; i < 8 ; i++) { + max_abs_rows = _mm256_max_epi16(max_abs_rows, abs_rows[i]); + } + + // do binary search for the highest value that is lower than the maximum + // loop invariant: lower gives bit map = 0, lower + width gives bit map > 0 + int32_t lower = 1; + // this gives 64, 128 or 256 for MULTIPLICITY = 2, 4, 6 + int32_t width = 1 << (5 + MULTIPLICITY / 2); + // if you don't unroll this loop, it fits in the loop cache + // uncomment the line below to speeding up the program by a few percent + // #pragma GCC unroll 0 + while (width > 1) { + width >>= 1; + // compare with lower + width; put result in bitmap + // make vector from value of new bound + bound = _mm256_broadcastw_epi16(_mm_cvtsi32_si128(lower + width)); + bitmap = _mm256_cmpgt_epi16(max_abs_rows, bound); + // step up if there are any matches + // rely on compiler to use conditional move here + int32_t step_mask = _mm256_testz_si256(bitmap, bitmap) - 1; + lower += step_mask & width; + } + // lower+width contains the maximum value of the vector + // or less, if the maximum is very high (which is OK) + // normally, there is one maximum, but sometimes there are more + // find where the maxima occur in the maximum vector + // (each determines lower 4 bits of peak position) + // construct vector filled with bound-1 + bound = _mm256_broadcastw_epi16(_mm_cvtsi32_si128(lower + width - 1)); + + // find in which of the 8 groups a maximum occurs to compute bits 4, 5, 6 of message + // find lowest value by searching backwards skip first check to save time + size_t message = 0x70; + for (int32_t i = 7 ; i >= 0 ; i--) { + bitmap = _mm256_cmpgt_epi16(abs_rows[i], bound); + int message_mask = (-(int16_t)(_mm256_testz_si256(bitmap, bitmap) == 0)) >> 15; + message ^= message_mask & (message ^ (unsigned)i << 4); + } + // we decided which row of the matrix contains the lowest match + // select proper row + int8_t index = message >> 4; + __m256i res; + __m256i tmp = (__m256i) { + 0ULL, 0ULL, 0ULL, 0ULL + }; + + for (int8_t i = 0; i < 8; i++) { + int8_t abs_value = (int8_t)(index - i); + int8_t mask1 = abs_value >> 7; + abs_value ^= mask1; + abs_value -= mask1; + int8_t mask2 = ((uint8_t) - abs_value >> 7); + int64_t mask3 = (-1ULL) + mask2; + __m256i vect_mask = (__m256i) { + mask3, mask3, mask3, mask3 + }; + res = _mm256_and_si256(abs_rows[i], vect_mask); + tmp = _mm256_or_si256(tmp, res); + } + + active_row = tmp; + + // get the column number of the vector element + // by setting the bits corresponding to the columns + // and then adding elements within two groups of 8 + peak_mask = _mm256_cmpgt_epi16(active_row, bound); + peak_mask &= _mm256_set_epi16(-32768, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1); + for (int32_t i = 0 ; i < 3 ; i++) { + peak_mask = _mm256_hadd_epi16(peak_mask, peak_mask); + } + // add low 4 bits of message + message |= __tzcnt_u16(_mm256_extract_epi16(peak_mask, 0) + _mm256_extract_epi16(peak_mask, 8)); + + // set bit 7 if sign of biggest value is positive + // make sure a jump isn't generated by the compiler + tmp = (__m256i) { + 0ULL, 0ULL, 0ULL, 0ULL + }; + for (uint32_t i = 0; i < 8; i++) { + int64_t message_mask = (-(int64_t)(i == message / 16)) >> 63; + __m256i vect_mask = (__m256i) { + message_mask, message_mask, message_mask, message_mask + }; + tmp = _mm256_or_si256(tmp, _mm256_and_si256(vect_mask, transform[i])); + } + uint16_t result = 0; + for (uint32_t i = 0; i < 16; i++) { + uint16_t *ptr = (uint16_t *) &tmp; + int32_t message_mask = (-(int32_t)(i == message % 16)) >> (sizeof(int32_t) * 8 - 1); + result |= message_mask & ptr[i]; + } + message |= (0x8000 & ~result) >> 8; + return message; +} + + + +/** + * @brief Encodes the received word + * + * The message consists of N1 bytes each byte is encoded into PARAM_N2 bits, + * or MULTIPLICITY repeats of 128 bits + * + * @param[out] cdw Array of size VEC_N1N2_SIZE_64 receiving the encoded message + * @param[in] msg Array of size VEC_N1_SIZE_64 storing the message + */ +void PQCLEAN_HQCRMRS192_AVX2_reed_muller_encode(uint64_t *cdw, const uint64_t *msg) { + for (size_t i = 0 ; i < VEC_N1_SIZE_BYTES ; i++) { + // fill entries i * MULTIPLICITY to (i+1) * MULTIPLICITY + // encode first word + encode(&cdw[2 * i * MULTIPLICITY], ((uint8_t *)msg)[i]); + // copy to other identical codewords + for (size_t copy = 1 ; copy < MULTIPLICITY ; copy++) { + memcpy(&cdw[2 * (i * MULTIPLICITY + copy)], &cdw[2 * i * MULTIPLICITY], 2 * sizeof(uint64_t)); + } + } +} + + + +/** + * @brief Decodes the received word + * + * Decoding uses fast hadamard transform, for a more complete picture on Reed-Muller decoding, see MacWilliams, Florence Jessie, and Neil James Alexander Sloane. + * The theory of error-correcting codes codes @cite macwilliams1977theory + * + * @param[out] msg Array of size VEC_N1_SIZE_64 receiving the decoded message + * @param[in] cdw Array of size VEC_N1N2_SIZE_64 storing the received word + */ +void PQCLEAN_HQCRMRS192_AVX2_reed_muller_decode(uint64_t *msg, const uint64_t *cdw) { + __m256i expanded[8]; + __m256i transform[8]; + for (size_t i = 0 ; i < VEC_N1_SIZE_BYTES ; i++) { + // collect the codewords + expand_and_sum(expanded, &cdw[2 * i * MULTIPLICITY]); + // apply hadamard transform + hadamard(expanded, transform); + // fix the first entry to get the half Hadamard transform + transform[0] -= _mm256_set_epi16(0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 64 * MULTIPLICITY); + // finish the decoding + ((uint8_t *)msg)[i] = find_peaks(transform); + } +} diff --git a/crypto_kem/hqc-rmrs-192/avx2/reed_muller.h b/crypto_kem/hqc-rmrs-192/avx2/reed_muller.h new file mode 100644 index 00000000..1a95a9c5 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/reed_muller.h @@ -0,0 +1,20 @@ +#ifndef REED_MULLER_H +#define REED_MULLER_H + + +/** + * @file reed_muller.h + * Header file of reed_muller.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS192_AVX2_reed_muller_encode(uint64_t *cdw, const uint64_t *msg); + +void PQCLEAN_HQCRMRS192_AVX2_reed_muller_decode(uint64_t *msg, const uint64_t *cdw); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/avx2/reed_solomon.c b/crypto_kem/hqc-rmrs-192/avx2/reed_solomon.c new file mode 100644 index 00000000..3c96f8e0 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/reed_solomon.c @@ -0,0 +1,340 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include "reed_solomon.h" +#include +#include +#include +/** + * @file reed_solomon.c + * Constant time implementation of Reed-Solomon codes + */ + + +static void compute_syndromes(uint16_t *syndromes, uint8_t *cdw); +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes); +static void compute_roots(uint8_t *error, uint16_t *sigma); +static void compute_z_poly(uint16_t *z, const uint16_t *sigma, uint8_t degree, const uint16_t *syndromes); +static void compute_error_values(uint16_t *error_values, const uint16_t *z, const uint8_t *error); +static void correct_errors(uint8_t *cdw, const uint16_t *error_values); + +static const uint16_t alpha_ij_pow [44][75] = {{2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15}, {4, 16, 64, 29, 116, 205, 19, 76, 45, 180, 234, 143, 6, 24, 96, 157, 78, 37, 148, 106, 181, 238, 159, 70, 5, 20, 80, 93, 105, 185, 222, 95, 97, 153, 94, 101, 137, 30, 120, 253, 211, 107, 177, 254, 223, 91, 113, 217, 67, 17, 68, 13, 52, 208, 103, 129, 62, 248, 199, 59, 236, 151, 102, 133, 46, 184, 218, 79, 33, 132, 42, 168, 154, 82, 85}, {8, 64, 58, 205, 38, 45, 117, 143, 12, 96, 39, 37, 53, 181, 193, 70, 10, 80, 186, 185, 161, 97, 47, 101, 15, 120, 231, 107, 127, 223, 182, 217, 134, 68, 26, 208, 206, 62, 237, 59, 197, 102, 23, 184, 169, 33, 21, 168, 41, 85, 146, 228, 115, 191, 145, 252, 179, 241, 219, 150, 196, 110, 87, 130, 100, 7, 56, 221, 166, 89, 242, 195, 86, 138, 36}, {16, 29, 205, 76, 180, 143, 24, 157, 37, 106, 238, 70, 20, 93, 185, 95, 153, 101, 30, 253, 107, 254, 91, 217, 17, 13, 208, 129, 248, 59, 151, 133, 184, 79, 132, 168, 82, 73, 228, 230, 198, 252, 123, 227, 150, 149, 165, 130, 200, 28, 221, 81, 121, 195, 172, 18, 61, 247, 203, 44, 250, 27, 173, 2, 32, 58, 135, 152, 117, 3, 48, 39, 74, 212, 193}, {32, 116, 38, 180, 3, 96, 156, 106, 193, 5, 160, 185, 190, 94, 15, 253, 214, 223, 226, 17, 26, 103, 124, 59, 51, 46, 169, 132, 77, 85, 114, 230, 145, 215, 255, 150, 55, 174, 100, 28, 167, 89, 239, 172, 36, 244, 235, 44, 233, 108, 1, 32, 116, 38, 180, 3, 96, 156, 106, 193, 5, 160, 185, 190, 94, 15, 253, 214, 223, 226, 17, 26, 103, 124, 59}, {64, 205, 45, 143, 96, 37, 181, 70, 80, 185, 97, 101, 120, 107, 223, 217, 68, 208, 62, 59, 102, 184, 33, 168, 85, 228, 191, 252, 241, 150, 110, 130, 7, 221, 89, 195, 138, 61, 251, 44, 207, 173, 8, 58, 38, 117, 12, 39, 53, 193, 10, 186, 161, 47, 15, 231, 127, 182, 134, 26, 206, 237, 197, 23, 169, 21, 41, 146, 115, 145, 179, 219, 196, 87, 100}, {128, 19, 117, 24, 156, 181, 140, 93, 161, 94, 60, 107, 163, 67, 26, 129, 147, 102, 109, 132, 41, 57, 209, 252, 255, 98, 87, 200, 224, 89, 155, 18, 245, 11, 233, 173, 16, 232, 45, 3, 157, 53, 159, 40, 185, 194, 137, 231, 254, 226, 68, 189, 248, 197, 46, 158, 168, 170, 183, 145, 123, 75, 110, 25, 28, 166, 249, 69, 61, 235, 176, 54, 2, 29, 38}, {29, 76, 143, 157, 106, 70, 93, 95, 101, 253, 254, 217, 13, 129, 59, 133, 79, 168, 73, 230, 252, 227, 149, 130, 28, 81, 195, 18, 247, 44, 27, 2, 58, 152, 3, 39, 212, 140, 186, 190, 202, 231, 225, 175, 26, 31, 118, 23, 158, 77, 146, 209, 229, 219, 55, 25, 56, 162, 155, 36, 243, 88, 54, 4, 116, 45, 6, 78, 181, 5, 105, 97, 137, 211, 223}, {58, 45, 12, 37, 193, 80, 161, 101, 231, 223, 134, 208, 237, 102, 169, 168, 146, 191, 179, 150, 87, 7, 166, 195, 36, 251, 125, 173, 64, 38, 143, 39, 181, 10, 185, 47, 120, 127, 217, 26, 62, 197, 184, 21, 85, 115, 252, 219, 110, 100, 221, 242, 138, 245, 44, 54, 8, 205, 117, 96, 53, 70, 186, 97, 15, 107, 182, 68, 206, 59, 23, 33, 41, 228, 145}, {116, 180, 96, 106, 5, 185, 94, 253, 223, 17, 103, 59, 46, 132, 85, 230, 215, 150, 174, 28, 89, 172, 244, 44, 108, 32, 38, 3, 156, 193, 160, 190, 15, 214, 226, 26, 124, 51, 169, 77, 114, 145, 255, 55, 100, 167, 239, 36, 235, 233, 1, 116, 180, 96, 106, 5, 185, 94, 253, 223, 17, 103, 59, 46, 132, 85, 230, 215, 150, 174, 28, 89, 172, 244, 44}, {232, 234, 39, 238, 160, 97, 60, 254, 134, 103, 118, 184, 84, 57, 145, 227, 220, 7, 162, 172, 245, 176, 71, 58, 180, 192, 181, 40, 95, 15, 177, 175, 208, 147, 46, 21, 73, 99, 241, 55, 200, 166, 43, 122, 44, 216, 128, 45, 48, 106, 10, 222, 202, 107, 226, 52, 237, 133, 66, 85, 209, 123, 196, 50, 167, 195, 144, 11, 54, 32, 76, 12, 148, 140, 185}, {205, 143, 37, 70, 185, 101, 107, 217, 208, 59, 184, 168, 228, 252, 150, 130, 221, 195, 61, 44, 173, 58, 117, 39, 193, 186, 47, 231, 182, 26, 237, 23, 21, 146, 145, 219, 87, 56, 242, 36, 139, 54, 64, 45, 96, 181, 80, 97, 120, 223, 68, 62, 102, 33, 85, 191, 241, 110, 7, 89, 138, 251, 207, 8, 38, 12, 53, 10, 161, 15, 127, 134, 206, 197, 169}, {135, 6, 53, 20, 190, 120, 163, 13, 237, 46, 84, 228, 229, 98, 100, 81, 69, 251, 131, 32, 45, 192, 238, 186, 94, 187, 217, 189, 236, 169, 82, 209, 241, 220, 28, 242, 72, 22, 173, 116, 201, 37, 140, 222, 15, 254, 34, 62, 204, 132, 146, 63, 75, 130, 167, 43, 245, 250, 4, 38, 24, 212, 80, 194, 253, 182, 52, 147, 184, 77, 183, 179, 149, 141, 89}, {19, 24, 181, 93, 94, 107, 67, 129, 102, 132, 57, 252, 98, 200, 89, 18, 11, 173, 232, 3, 53, 40, 194, 231, 226, 189, 197, 158, 170, 145, 75, 25, 166, 69, 235, 54, 29, 234, 37, 5, 95, 120, 91, 52, 59, 218, 82, 191, 227, 174, 221, 43, 247, 207, 32, 90, 39, 35, 111, 15, 225, 136, 237, 92, 77, 115, 246, 220, 56, 239, 122, 125, 4, 76, 96}, {38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26}, {76, 157, 70, 95, 253, 217, 129, 133, 168, 230, 227, 130, 81, 18, 44, 2, 152, 39, 140, 190, 231, 175, 31, 23, 77, 209, 219, 25, 162, 36, 88, 4, 45, 78, 5, 97, 211, 67, 62, 46, 154, 191, 171, 50, 89, 72, 176, 8, 90, 156, 10, 194, 187, 134, 124, 92, 41, 99, 75, 100, 178, 144, 125, 16, 180, 37, 20, 153, 107, 17, 248, 184, 82, 198, 150}, {152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1}, {45, 37, 80, 101, 223, 208, 102, 168, 191, 150, 7, 195, 251, 173, 38, 39, 10, 47, 127, 26, 197, 21, 115, 219, 100, 242, 245, 54, 205, 96, 70, 97, 107, 68, 59, 33, 228, 241, 130, 89, 61, 207, 58, 12, 193, 161, 231, 134, 237, 169, 146, 179, 87, 166, 36, 125, 64, 143, 181, 185, 120, 217, 62, 184, 85, 252, 110, 221, 138, 44, 8, 117, 53, 186, 15}, {90, 148, 186, 30, 226, 62, 109, 73, 179, 174, 162, 61, 131, 232, 96, 140, 153, 127, 52, 51, 168, 99, 98, 56, 172, 22, 8, 234, 212, 185, 240, 67, 237, 79, 114, 241, 25, 121, 245, 108, 19, 39, 20, 188, 223, 189, 133, 41, 63, 55, 221, 9, 176, 64, 3, 238, 161, 211, 34, 59, 66, 183, 219, 200, 239, 251, 71, 152, 37, 160, 137, 182, 129, 92, 85}, {180, 106, 185, 253, 17, 59, 132, 230, 150, 28, 172, 44, 32, 3, 193, 190, 214, 26, 51, 77, 145, 55, 167, 36, 233, 116, 96, 5, 94, 223, 103, 46, 85, 215, 174, 89, 244, 108, 38, 156, 160, 15, 226, 124, 169, 114, 255, 100, 239, 235, 1, 180, 106, 185, 253, 17, 59, 132, 230, 150, 28, 172, 44, 32, 3, 193, 190, 214, 26, 51, 77, 145, 55, 167, 36}, {117, 181, 161, 107, 26, 102, 41, 252, 87, 89, 245, 173, 45, 53, 185, 231, 68, 197, 168, 145, 110, 166, 61, 54, 38, 37, 186, 120, 134, 59, 21, 191, 196, 221, 36, 207, 205, 39, 80, 15, 217, 237, 33, 115, 150, 56, 138, 125, 58, 96, 10, 101, 182, 62, 169, 228, 219, 7, 86, 44, 64, 12, 70, 47, 223, 206, 184, 146, 241, 100, 195, 139, 8, 143, 193}, {234, 238, 97, 254, 103, 184, 57, 227, 7, 172, 176, 58, 192, 40, 15, 175, 147, 21, 99, 55, 166, 122, 216, 45, 106, 222, 107, 52, 133, 85, 123, 50, 195, 11, 32, 12, 140, 188, 182, 124, 158, 115, 49, 224, 36, 131, 19, 37, 105, 253, 68, 151, 154, 252, 174, 121, 251, 2, 201, 193, 194, 225, 206, 109, 114, 219, 14, 69, 125, 116, 157, 80, 30, 67, 59}, {201, 159, 47, 91, 124, 33, 209, 149, 166, 244, 71, 117, 238, 194, 223, 31, 79, 115, 98, 167, 61, 216, 90, 181, 190, 254, 206, 218, 213, 150, 224, 72, 54, 152, 106, 161, 177, 189, 184, 114, 171, 56, 18, 131, 38, 148, 111, 107, 104, 46, 146, 227, 14, 138, 233, 135, 37, 210, 211, 26, 133, 170, 241, 141, 172, 125, 232, 78, 186, 253, 136, 102, 164, 123, 100}, {143, 70, 101, 217, 59, 168, 252, 130, 195, 44, 58, 39, 186, 231, 26, 23, 146, 219, 56, 36, 54, 45, 181, 97, 223, 62, 33, 191, 110, 89, 251, 8, 12, 10, 15, 134, 197, 41, 179, 100, 86, 125, 205, 37, 185, 107, 208, 184, 228, 150, 221, 61, 173, 117, 193, 47, 182, 237, 21, 145, 87, 242, 139, 64, 96, 80, 120, 68, 102, 85, 241, 7, 138, 207, 38}, {3, 5, 15, 17, 51, 85, 255, 28, 36, 108, 180, 193, 94, 226, 59, 77, 215, 100, 172, 233, 38, 106, 190, 223, 124, 132, 145, 174, 239, 44, 116, 156, 185, 214, 103, 169, 230, 55, 89, 235, 32, 96, 160, 253, 26, 46, 114, 150, 167, 244, 1, 3, 5, 15, 17, 51, 85, 255, 28, 36, 108, 180, 193, 94, 226, 59, 77, 215, 100, 172, 233, 38, 106, 190, 223}, {6, 20, 120, 13, 46, 228, 98, 81, 251, 32, 192, 186, 187, 189, 169, 209, 220, 242, 22, 116, 37, 222, 254, 62, 132, 63, 130, 43, 250, 38, 212, 194, 182, 147, 77, 179, 141, 9, 54, 180, 159, 101, 67, 151, 85, 227, 112, 61, 142, 3, 10, 60, 136, 23, 114, 49, 166, 243, 16, 96, 93, 211, 208, 218, 230, 110, 121, 11, 58, 156, 111, 127, 31, 66, 145}, {12, 80, 231, 208, 169, 191, 87, 195, 125, 38, 181, 47, 217, 197, 85, 219, 221, 245, 8, 96, 186, 107, 206, 33, 145, 130, 86, 207, 45, 193, 101, 134, 102, 146, 150, 166, 251, 64, 39, 185, 127, 62, 21, 252, 100, 138, 54, 117, 70, 15, 68, 23, 228, 196, 89, 139, 58, 37, 161, 223, 237, 168, 179, 7, 36, 173, 143, 10, 120, 26, 184, 115, 110, 242, 44}, {24, 93, 107, 129, 132, 252, 200, 18, 173, 3, 40, 231, 189, 158, 145, 25, 69, 54, 234, 5, 120, 52, 218, 191, 174, 43, 207, 90, 35, 15, 136, 92, 115, 220, 239, 125, 76, 238, 101, 17, 133, 228, 149, 121, 44, 135, 212, 47, 175, 51, 146, 49, 162, 139, 116, 148, 97, 113, 236, 85, 171, 83, 251, 128, 156, 161, 163, 147, 41, 255, 224, 245, 16, 157, 185}, {48, 105, 127, 248, 77, 241, 224, 247, 64, 156, 95, 182, 236, 170, 150, 162, 11, 205, 212, 94, 134, 133, 213, 110, 239, 250, 45, 35, 30, 26, 218, 99, 130, 69, 108, 143, 40, 211, 206, 132, 229, 7, 144, 2, 96, 210, 254, 237, 154, 255, 221, 243, 128, 37, 190, 113, 197, 73, 49, 89, 22, 135, 181, 188, 17, 23, 183, 220, 195, 233, 90, 70, 60, 52, 169}, {96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89}, {192, 222, 182, 151, 114, 110, 155, 27, 143, 160, 177, 237, 82, 75, 89, 88, 152, 70, 240, 103, 21, 123, 224, 251, 116, 212, 101, 136, 218, 145, 200, 144, 8, 78, 190, 217, 204, 183, 87, 172, 216, 12, 105, 225, 59, 170, 98, 242, 250, 180, 10, 211, 31, 168, 255, 83, 139, 135, 238, 15, 52, 158, 252, 14, 244, 64, 74, 153, 134, 46, 209, 130, 9, 142, 96}, {157, 95, 217, 133, 230, 130, 18, 2, 39, 190, 175, 23, 209, 25, 36, 4, 78, 97, 67, 46, 191, 50, 72, 8, 156, 194, 134, 92, 99, 100, 144, 16, 37, 153, 17, 184, 198, 200, 61, 32, 74, 47, 34, 109, 145, 141, 122, 64, 148, 94, 68, 218, 63, 7, 244, 128, 53, 188, 136, 169, 126, 14, 245, 29, 106, 101, 13, 79, 252, 28, 247, 58, 212, 202, 26}, {39, 97, 134, 184, 145, 7, 245, 58, 181, 15, 208, 21, 241, 166, 44, 45, 10, 107, 237, 85, 196, 195, 54, 12, 185, 182, 102, 115, 130, 36, 8, 37, 47, 68, 169, 252, 56, 251, 205, 193, 120, 206, 168, 219, 89, 125, 117, 80, 127, 59, 146, 110, 86, 173, 96, 161, 217, 23, 191, 100, 61, 64, 53, 101, 26, 33, 179, 221, 139, 38, 70, 231, 62, 41, 150}, {78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1}, {156, 94, 26, 132, 255, 89, 233, 3, 185, 226, 46, 145, 28, 235, 38, 5, 214, 59, 114, 174, 36, 32, 106, 15, 103, 77, 150, 239, 108, 96, 190, 17, 169, 215, 167, 44, 180, 160, 223, 51, 230, 100, 244, 116, 193, 253, 124, 85, 55, 172, 1, 156, 94, 26, 132, 255, 89, 233, 3, 185, 226, 46, 145, 28, 235, 38, 5, 214, 59, 114, 174, 36, 32, 106, 15}, {37, 101, 208, 168, 150, 195, 173, 39, 47, 26, 21, 219, 242, 54, 96, 97, 68, 33, 241, 89, 207, 12, 161, 134, 169, 179, 166, 125, 143, 185, 217, 184, 252, 221, 44, 117, 186, 182, 23, 145, 56, 139, 45, 80, 223, 102, 191, 7, 251, 38, 10, 127, 197, 115, 100, 245, 205, 70, 107, 59, 228, 130, 61, 58, 193, 231, 237, 146, 87, 36, 64, 181, 120, 62, 85}, {74, 137, 206, 82, 55, 138, 16, 212, 120, 124, 73, 87, 72, 29, 193, 211, 147, 228, 25, 244, 205, 140, 177, 197, 230, 141, 251, 76, 40, 223, 204, 198, 56, 11, 180, 186, 113, 92, 252, 167, 176, 143, 111, 67, 169, 123, 162, 207, 24, 190, 68, 66, 227, 242, 108, 157, 47, 52, 84, 150, 155, 142, 37, 202, 103, 41, 149, 69, 8, 106, 60, 62, 170, 165, 36}, {148, 30, 62, 73, 174, 61, 232, 140, 127, 51, 99, 56, 22, 234, 185, 67, 79, 241, 121, 108, 39, 188, 189, 41, 55, 9, 64, 238, 211, 59, 183, 200, 251, 152, 160, 182, 92, 229, 166, 233, 24, 97, 13, 42, 150, 43, 2, 53, 60, 124, 146, 65, 122, 205, 5, 254, 102, 198, 112, 44, 201, 111, 134, 158, 255, 242, 216, 78, 101, 103, 82, 110, 18, 128, 193}, {53, 120, 237, 228, 100, 251, 45, 186, 217, 169, 241, 242, 173, 37, 15, 62, 146, 130, 245, 38, 80, 182, 184, 179, 89, 54, 39, 101, 206, 85, 87, 61, 205, 10, 223, 23, 252, 166, 207, 96, 47, 208, 41, 110, 36, 58, 70, 127, 102, 145, 221, 125, 12, 97, 26, 168, 196, 138, 64, 193, 107, 197, 191, 56, 44, 143, 161, 68, 21, 150, 86, 8, 181, 231, 59}, {106, 253, 59, 230, 28, 44, 3, 190, 26, 77, 55, 36, 116, 5, 223, 46, 215, 89, 108, 156, 15, 124, 114, 100, 235, 180, 185, 17, 132, 150, 172, 32, 193, 214, 51, 145, 167, 233, 96, 94, 103, 85, 174, 244, 38, 160, 226, 169, 255, 239, 1, 106, 253, 59, 230, 28, 44, 3, 190, 26, 77, 55, 36, 116, 5, 223, 46, 215, 89, 108, 156, 15, 124, 114, 100}, {212, 211, 197, 198, 167, 207, 157, 202, 62, 114, 200, 139, 201, 95, 26, 154, 220, 61, 19, 160, 217, 158, 171, 86, 32, 159, 127, 133, 229, 89, 216, 74, 120, 147, 230, 56, 176, 24, 47, 103, 170, 130, 243, 90, 185, 34, 42, 196, 18, 116, 10, 91, 109, 241, 239, 2, 181, 187, 151, 145, 83, 131, 39, 137, 124, 228, 141, 11, 143, 190, 52, 41, 165, 122, 38}, {181, 107, 102, 252, 89, 173, 53, 231, 197, 145, 166, 54, 37, 120, 59, 191, 221, 207, 39, 15, 237, 115, 56, 125, 96, 101, 62, 228, 7, 44, 12, 47, 206, 146, 100, 139, 143, 97, 208, 85, 130, 251, 117, 161, 26, 41, 87, 245, 45, 185, 68, 168, 110, 61, 38, 186, 134, 21, 196, 36, 205, 80, 217, 33, 150, 138, 58, 10, 182, 169, 219, 86, 64, 70, 223}, {119, 177, 23, 123, 239, 8, 159, 225, 184, 255, 43, 64, 140, 91, 169, 171, 69, 58, 20, 226, 33, 49, 18, 205, 160, 67, 21, 149, 144, 38, 105, 34, 168, 220, 244, 45, 111, 13, 41, 174, 243, 117, 95, 104, 85, 25, 203, 143, 194, 103, 146, 200, 22, 12, 94, 31, 228, 14, 176, 96, 202, 248, 115, 112, 233, 39, 30, 147, 191, 167, 27, 37, 240, 236, 145}, {238, 254, 184, 227, 172, 58, 40, 175, 21, 55, 122, 45, 222, 52, 85, 50, 11, 12, 188, 124, 115, 224, 131, 37, 253, 151, 252, 121, 2, 193, 225, 109, 219, 69, 116, 80, 67, 42, 110, 244, 90, 161, 104, 170, 100, 22, 24, 101, 248, 230, 221, 27, 74, 231, 51, 229, 242, 4, 159, 223, 218, 171, 138, 232, 160, 134, 84, 220, 245, 180, 95, 208, 73, 200, 44}}; + + + +/** + * @brief Encodes a message message of PARAM_K bits to a Reed-Solomon codeword codeword of PARAM_N1 bytes + * + * Following @cite lin1983error (Chapter 4 - Cyclic Codes), + * We perform a systematic encoding using a linear (PARAM_N1 - PARAM_K)-stage shift register + * with feedback connections based on the generator polynomial PARAM_RS_POLY of the Reed-Solomon code. + * + * @param[out] cdw Array of size VEC_N1_SIZE_64 receiving the encoded message + * @param[in] msg Array of size VEC_K_SIZE_64 storing the message + */ +void PQCLEAN_HQCRMRS192_AVX2_reed_solomon_encode(uint64_t *cdw, const uint64_t *msg) { + uint8_t gate_value = 0; + + uint16_t tmp[PARAM_G] = {0}; + uint16_t PARAM_RS_POLY [] = {RS_POLY_COEFS}; + + uint8_t msg_bytes[PARAM_K] = {0}; + uint8_t cdw_bytes[PARAM_N1] = {0}; + + for (size_t i = 0 ; i < VEC_K_SIZE_64 ; ++i) { + for (size_t j = 0 ; j < 8 ; ++j) { + msg_bytes[i * 8 + j] = (uint8_t) (msg[i] >> (j * 8)); + } + } + + for (int i = PARAM_K - 1 ; i >= 0 ; --i) { + gate_value = msg_bytes[i] ^ cdw_bytes[PARAM_N1 - PARAM_K - 1]; + + for (size_t j = 0 ; j < PARAM_G ; ++j) { + tmp[j] = PQCLEAN_HQCRMRS192_AVX2_gf_mul(gate_value, PARAM_RS_POLY[j]); + } + + for (size_t k = PARAM_N1 - PARAM_K - 1 ; k ; --k) { + cdw_bytes[k] = cdw_bytes[k - 1] ^ tmp[k]; + } + + cdw_bytes[0] = tmp[0]; + } + + memcpy(cdw_bytes + PARAM_N1 - PARAM_K, msg_bytes, PARAM_K); + memcpy(cdw, cdw_bytes, PARAM_N1); +} + + + +/** + * @brief Computes 2 * PARAM_DELTA syndromes + * + * @param[out] syndromes Array of size 2 * PARAM_DELTA receiving the computed syndromes + * @param[in] cdw Array of size PARAM_N1 storing the received vector + */ +void compute_syndromes(uint16_t *syndromes, uint8_t *cdw) { + for (size_t i = 0 ; i < 2 * PARAM_DELTA ; ++i) { + for (size_t j = 1 ; j < PARAM_N1 ; ++j) { + syndromes[i] ^= PQCLEAN_HQCRMRS192_AVX2_gf_mul(cdw[j], alpha_ij_pow[i][j - 1]); + } + syndromes[i] ^= cdw[0]; + } +} + + + +/** + * @brief Computes the error locator polynomial (ELP) sigma + * + * This is a constant time implementation of Berlekamp's simplified algorithm (see @cite lin1983error (Chapter 6 - BCH Codes).
+ * We use the letter p for rho which is initialized at -1.
+ * The array X_sigma_p represents the polynomial X^(mu-rho)*sigma_p(X).
+ * Instead of maintaining a list of sigmas, we update in place both sigma and X_sigma_p.
+ * sigma_copy serves as a temporary save of sigma in case X_sigma_p needs to be updated.
+ * We can properly correct only if the degree of sigma does not exceed PARAM_DELTA. + * This means only the first PARAM_DELTA + 1 coefficients of sigma are of value + * and we only need to save its first PARAM_DELTA - 1 coefficients. + * + * @returns the degree of the ELP sigma + * @param[out] sigma Array of size (at least) PARAM_DELTA receiving the ELP + * @param[in] syndromes Array of size (at least) 2*PARAM_DELTA storing the syndromes + */ +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes) { + sigma[0] = 1; + size_t deg_sigma = 0; + size_t deg_sigma_p = 0; + uint16_t sigma_copy[PARAM_DELTA + 1] = {0}; + size_t deg_sigma_copy = 0; + uint16_t X_sigma_p[PARAM_DELTA + 1] = {0, 1}; + int32_t pp = -1; // 2*rho + uint16_t d_p = 1; + uint16_t d = syndromes[0]; + + for (size_t mu = 0 ; (mu < (2 * PARAM_DELTA)) ; ++mu) { + // Save sigma in case we need it to update X_sigma_p + memcpy(sigma_copy, sigma, 2 * (PARAM_DELTA)); + deg_sigma_copy = deg_sigma; + + uint16_t dd = PQCLEAN_HQCRMRS192_AVX2_gf_mul(d, PQCLEAN_HQCRMRS192_AVX2_gf_inverse(d_p)); + + for (size_t i = 1 ; (i <= mu + 1) && (i <= PARAM_DELTA) ; ++i) { + sigma[i] ^= PQCLEAN_HQCRMRS192_AVX2_gf_mul(dd, X_sigma_p[i]); + } + + size_t deg_X = mu - pp; + size_t deg_X_sigma_p = deg_X + deg_sigma_p; + + // mask1 = 0xffff if(d != 0) and 0 otherwise + int16_t mask1 = -((uint16_t) - d >> 15); + + // mask2 = 0xffff if(deg_X_sigma_p > deg_sigma) and 0 otherwise + int16_t mask2 = -((uint16_t) (deg_sigma - deg_X_sigma_p) >> 15); + + // mask12 = 0xffff if the deg_sigma increased and 0 otherwise + int16_t mask12 = mask1 & mask2; + deg_sigma = (mask12 & deg_X_sigma_p) ^ (~mask12 & deg_sigma); + + if (mu == (2 * PARAM_DELTA - 1)) { + break; + } + + pp = (mask12 & mu) ^ (~mask12 & pp); + d_p = (mask12 & d) ^ (~mask12 & d_p); + for (size_t i = PARAM_DELTA ; i ; --i) { + X_sigma_p[i] = (mask12 & sigma_copy[i - 1]) ^ (~mask12 & X_sigma_p[i - 1]); + } + + deg_sigma_p = (mask12 & deg_sigma_copy) ^ (~mask12 & deg_sigma_p); + d = syndromes[mu + 1]; + + for (size_t i = 1 ; (i <= mu + 1) && (i <= PARAM_DELTA) ; ++i) { + d ^= PQCLEAN_HQCRMRS192_AVX2_gf_mul(sigma[i], syndromes[mu + 1 - i]); + } + } + + return deg_sigma; +} + + + +/** + * @brief Computes the error polynomial error from the error locator polynomial sigma + * + * See function PQCLEAN_HQCRMRS192_AVX2_fft for more details. + * + * @param[out] error Array of 2^PARAM_M elements receiving the error polynomial + * @param[out] error_compact Array of PARAM_DELTA + PARAM_N1 elements receiving a compact representation of the vector error + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + */ +static void compute_roots(uint8_t *error, uint16_t *sigma) { + uint16_t w[1 << PARAM_M] = {0}; + + PQCLEAN_HQCRMRS192_AVX2_fft(w, sigma, PARAM_DELTA + 1); + PQCLEAN_HQCRMRS192_AVX2_fft_retrieve_error_poly(error, w); +} + + + +/** + * @brief Computes the polynomial z(x) + * + * See @cite lin1983error (Chapter 6 - BCH Codes) for more details. + * + * @param[out] z Array of PARAM_DELTA + 1 elements receiving the polynomial z(x) + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + * @param[in] degree Integer that is the degree of polynomial sigma + * @param[in] syndromes Array of 2 * PARAM_DELTA storing the syndromes + */ +static void compute_z_poly(uint16_t *z, const uint16_t *sigma, uint8_t degree, const uint16_t *syndromes) { + z[0] = 1; + + for (size_t i = 1 ; i < PARAM_DELTA + 1 ; ++i) { + int16_t mask2 = -((uint16_t) (i - degree - 1) >> 15); + z[i] = ((uint16_t)mask2) & sigma[i]; + } + + z[1] ^= syndromes[0]; + + for (size_t i = 2 ; i <= PARAM_DELTA ; ++i) { + int16_t mask2 = -((uint16_t) (i - degree - 1) >> 15); + z[i] ^= ((uint16_t)mask2 & syndromes[i - 1]); + + for (size_t j = 1 ; j < i ; ++j) { + z[i] ^= ((uint16_t)mask2) & PQCLEAN_HQCRMRS192_AVX2_gf_mul(sigma[j], syndromes[i - j - 1]); + } + } +} + + + +/** + * @brief Computes the error values + * + * See @cite lin1983error (Chapter 6 - BCH Codes) for more details. + * + * @param[out] error_values Array of PARAM_DELTA elements receiving the error values + * @param[in] z Array of PARAM_DELTA + 1 elements storing the polynomial z(x) + * @param[in] z_degree Integer that is the degree of polynomial z(x) + * @param[in] error_compact Array of PARAM_DELTA + PARAM_N1 storing compact representation of the error + */ +static void compute_error_values(uint16_t *error_values, const uint16_t *z, const uint8_t *error) { + uint16_t beta_j[PARAM_DELTA] = {0}; + uint16_t e_j[PARAM_DELTA] = {0}; + + uint16_t delta_counter = 0; + uint16_t delta_real_value; + + // Compute the beta_{j_i} page 31 of the documentation + for (size_t i = 0 ; i < PARAM_N1 ; i++) { + uint16_t found = 0; + int16_t valuemask = ((int16_t) - (error[i] != 0)) >> 15; + for (size_t j = 0 ; j < PARAM_DELTA ; j++) { + int16_t indexmask = ((int16_t) - (j == delta_counter)) >> 15; + beta_j[j] += indexmask & valuemask & exp[i]; + found += indexmask & valuemask & 1; + } + delta_counter += found; + } + delta_real_value = delta_counter; + + // Compute the e_{j_i} page 31 of the documentation + for (size_t i = 0 ; i < PARAM_DELTA ; ++i) { + uint16_t tmp1 = 1; + uint16_t tmp2 = 1; + uint16_t inverse = PQCLEAN_HQCRMRS192_AVX2_gf_inverse(beta_j[i]); + uint16_t inverse_power_j = 1; + + for (size_t j = 1 ; j <= PARAM_DELTA ; ++j) { + inverse_power_j = PQCLEAN_HQCRMRS192_AVX2_gf_mul(inverse_power_j, inverse); + tmp1 ^= PQCLEAN_HQCRMRS192_AVX2_gf_mul(inverse_power_j, z[j]); + } + for (size_t k = 1 ; k < PARAM_DELTA ; ++k) { + tmp2 = PQCLEAN_HQCRMRS192_AVX2_gf_mul(tmp2, (1 ^ PQCLEAN_HQCRMRS192_AVX2_gf_mul(inverse, beta_j[(i + k) % PARAM_DELTA]))); + } + int16_t mask = ((int16_t) - (i < delta_real_value)) >> 15; + e_j[i] = mask & PQCLEAN_HQCRMRS192_AVX2_gf_mul(tmp1, PQCLEAN_HQCRMRS192_AVX2_gf_inverse(tmp2)); + } + + // Place the delta e_{j_i} values at the right coordinates of the output vector + delta_counter = 0; + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + uint16_t found = 0; + int16_t valuemask = ((int16_t) - (error[i] != 0)) >> 15; + for (size_t j = 0 ; j < PARAM_DELTA ; j++) { + int16_t indexmask = ((int16_t) - (j == delta_counter)) >> 15; + error_values[i] += indexmask & valuemask & e_j[j]; + found += indexmask & valuemask & 1; + } + delta_counter += found; + } +} + + + +/** + * @brief Correct the errors + * + * @param[out] cdw Array of PARAM_N1 elements receiving the corrected vector + * @param[in] error Array of the error vector + * @param[in] error_values Array of PARAM_DELTA elements storing the error values + */ +static void correct_errors(uint8_t *cdw, const uint16_t *error_values) { + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + cdw[i] ^= error_values[i]; + } +} + + + +/** + * @brief Decodes the received word + * + * This function relies on six steps: + *
    + *
  1. The first step, is the computation of the 2*PARAM_DELTA syndromes. + *
  2. The second step is the computation of the error-locator polynomial sigma. + *
  3. The third step, done by additive FFT, is finding the error-locator numbers by calculating the roots of the polynomial sigma and takings their inverses. + *
  4. The fourth step, is the polynomial z(x). + *
  5. The fifth step, is the computation of the error values. + *
  6. The sixth step is the correction of the errors in the received polynomial. + *
+ * For a more complete picture on Reed-Solomon decoding, see Shu. Lin and Daniel J. Costello in Error Control Coding: Fundamentals and Applications @cite lin1983error + * + * @param[out] msg Array of size VEC_K_SIZE_64 receiving the decoded message + * @param[in] cdw Array of size VEC_N1_SIZE_64 storing the received word + */ +void PQCLEAN_HQCRMRS192_AVX2_reed_solomon_decode(uint64_t *msg, uint64_t *cdw) { + uint8_t cdw_bytes[PARAM_N1] = {0}; + uint16_t syndromes[2 * PARAM_DELTA] = {0}; + uint16_t sigma[1 << PARAM_FFT] = {0}; + uint8_t error[1 << PARAM_M] = {0}; + uint16_t z[PARAM_N1] = {0}; + uint16_t error_values[PARAM_N1] = {0}; + + // Copy the vector in an array of bytes + memcpy(cdw_bytes, cdw, PARAM_N1); + + // Calculate the 2*PARAM_DELTA syndromes + compute_syndromes(syndromes, cdw_bytes); + + // Compute the error locator polynomial sigma + // Sigma's degree is at most PARAM_DELTA but the FFT requires the extra room + size_t deg = compute_elp(sigma, syndromes); + + // Compute the error polynomial error + compute_roots(error, sigma); + + // Compute the polynomial z(x) + compute_z_poly(z, sigma, deg, syndromes); + + // Compute the error values + compute_error_values(error_values, z, error); + + // Correct the errors + correct_errors(cdw_bytes, error_values); + + // Retrieve the message from the decoded codeword + memcpy(msg, cdw_bytes + (PARAM_G - 1), PARAM_K); + +} diff --git a/crypto_kem/hqc-rmrs-192/avx2/reed_solomon.h b/crypto_kem/hqc-rmrs-192/avx2/reed_solomon.h new file mode 100644 index 00000000..da99ef87 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/reed_solomon.h @@ -0,0 +1,20 @@ +#ifndef REED_SOLOMON_H +#define REED_SOLOMON_H + + +/** + * @file reed_solomon.h + * Header file of reed_solomon.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS192_AVX2_reed_solomon_encode(uint64_t *cdw, const uint64_t *msg); + +void PQCLEAN_HQCRMRS192_AVX2_reed_solomon_decode(uint64_t *msg, uint64_t *cdw); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/avx2/vector.c b/crypto_kem/hqc-rmrs-192/avx2/vector.c new file mode 100644 index 00000000..b82b92c4 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/vector.c @@ -0,0 +1,200 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +#include +/** + * @file vector.c + * @brief Implementation of vectors sampling and some utilities for the HQC scheme + */ + + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS192_AVX2_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight) { + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; + uint32_t random_data = 0; + uint32_t tmp[PARAM_OMEGA_R] = {0}; + uint8_t exist = 0; + size_t j = 0; + __m256i bit256[PARAM_OMEGA_R]; + __m256i bloc256[PARAM_OMEGA_R]; + static __m256i posCmp256 = (__m256i) { + 0UL, 1UL, 2UL, 3UL + }; +#define LOOP_SIZE CEIL_DIVIDE(PARAM_N, 256) + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (tmp[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + tmp[i] = random_data; + } + } + + for (uint32_t i = 0 ; i < weight ; i++) { + // we store the bloc number and bit position of each vb[i] + uint64_t bloc = tmp[i] >> 6; + bloc256[i] = _mm256_set1_epi64x(bloc >> 2); + uint64_t pos = (bloc & 0x3UL); + __m256i pos256 = _mm256_set1_epi64x(pos); + __m256i mask256 = _mm256_cmpeq_epi64(pos256, posCmp256); + uint64_t bit64 = 1ULL << (tmp[i] & 0x3f); + __m256i bloc256 = _mm256_set1_epi64x(bit64); + bit256[i] = bloc256 & mask256; + } + + for (uint32_t i = 0 ; i < LOOP_SIZE ; i++) { + __m256i aux = _mm256_loadu_si256(((__m256i *)v) + i); + __m256i i256 = _mm256_set1_epi64x(i); + + for (uint32_t j = 0 ; j < weight ; j++) { + __m256i mask256 = _mm256_cmpeq_epi64(bloc256[j], i256); + aux ^= bit256[j] & mask256; + } + _mm256_storeu_si256(((__m256i *)v) + i, aux); + } + +#undef LOOP_SIZE +} + + + +/** + * @brief Generates a random vector of dimension PARAM_N + * + * This function generates a random binary vector of dimension PARAM_N. It generates a random + * array of bytes using the seedexpander function, and drop the extra bits using a mask. + * + * @param[in] v Pointer to an array + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS192_AVX2_vect_set_random(AES_XOF_struct *ctx, uint64_t *v) { + uint8_t rand_bytes[VEC_N_SIZE_BYTES] = {0}; + + seedexpander(ctx, rand_bytes, VEC_N_SIZE_BYTES); + + memcpy(v, rand_bytes, VEC_N_SIZE_BYTES); + v[VEC_N_SIZE_64 - 1] &= BITMASK(PARAM_N, 64); +} + + + +/** + * @brief Generates a random vector + * + * This function generates a random binary vector. It uses the the randombytes function. + * + * @param[in] v Pointer to an array + */ +void PQCLEAN_HQCRMRS192_AVX2_vect_set_random_from_randombytes(uint64_t *v) { + uint8_t rand_bytes [VEC_K_SIZE_BYTES] = {0}; + + randombytes(rand_bytes, VEC_K_SIZE_BYTES); + memcpy(v, rand_bytes, VEC_K_SIZE_BYTES); +} + + + +/** + * @brief Adds two vectors + * + * @param[out] o Pointer to an array that is the result + * @param[in] v1 Pointer to an array that is the first vector + * @param[in] v2 Pointer to an array that is the second vector + * @param[in] size Integer that is the size of the vectors + */ +void PQCLEAN_HQCRMRS192_AVX2_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size) { + for (uint32_t i = 0 ; i < size ; ++i) { + o[i] = v1[i] ^ v2[i]; + } +} + + + +/** + * @brief Compares two vectors + * + * @param[in] v1 Pointer to an array that is first vector + * @param[in] v2 Pointer to an array that is second vector + * @param[in] size Integer that is the size of the vectors + * @returns 0 if the vectors are equals and a negative/psotive value otherwise + */ +int PQCLEAN_HQCRMRS192_AVX2_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size) { + unsigned char diff = 0; + + for (uint32_t i = 0 ; i < size ; i++) { + diff |= ((uint8_t *) v1)[i] ^ ((uint8_t *) v2)[i]; + } + return diff != 0; +} + + + +/** + * @brief Resize a vector so that it contains size_o bits + * + * @param[out] o Pointer to the output vector + * @param[in] size_o Integer that is the size of the output vector in bits + * @param[in] v Pointer to the input vector + * @param[in] size_v Integer that is the size of the input vector in bits + */ +void PQCLEAN_HQCRMRS192_AVX2_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v) { + if (size_o < size_v) { + uint64_t mask = 0x7FFFFFFFFFFFFFFF; + int8_t val = 0; + + if (size_o % 64) { + val = 64 - (size_o % 64); + } + + memcpy(o, v, VEC_N1N2_SIZE_BYTES); + + for (int8_t i = 0 ; i < val ; ++i) { + o[VEC_N1N2_SIZE_64 - 1] &= (mask >> i); + } + } else { + memcpy(o, v, CEIL_DIVIDE(size_v, 8)); + } +} diff --git a/crypto_kem/hqc-rmrs-192/avx2/vector.h b/crypto_kem/hqc-rmrs-192/avx2/vector.h new file mode 100644 index 00000000..6d217dce --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/avx2/vector.h @@ -0,0 +1,29 @@ +#ifndef VECTOR_H +#define VECTOR_H + + +/** + * @file vector.h + * @brief Header file for vector.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQCRMRS192_AVX2_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight); + +void PQCLEAN_HQCRMRS192_AVX2_vect_set_random(AES_XOF_struct *ctx, uint64_t *v); + +void PQCLEAN_HQCRMRS192_AVX2_vect_set_random_from_randombytes(uint64_t *v); + + +void PQCLEAN_HQCRMRS192_AVX2_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size); + +int PQCLEAN_HQCRMRS192_AVX2_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size); + +void PQCLEAN_HQCRMRS192_AVX2_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/clean/LICENSE b/crypto_kem/hqc-rmrs-192/clean/LICENSE new file mode 100644 index 00000000..d5d21fff --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/LICENSE @@ -0,0 +1 @@ +Public Domain diff --git a/crypto_kem/hqc-rmrs-192/clean/Makefile b/crypto_kem/hqc-rmrs-192/clean/Makefile new file mode 100644 index 00000000..1f29ed17 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/Makefile @@ -0,0 +1,19 @@ +# This Makefile can be used with GNU Make or BSD Make + +LIB=libhqc-rmrs-192_clean.a +HEADERS=api.h code.h fft.h gf2x.h gf.h hqc.h parameters.h parsing.h reed_muller.h reed_solomon.h vector.h +OBJECTS=code.o fft.o gf2x.o gf.o hqc.o kem.o parsing.o reed_muller.o reed_solomon.o vector.o + +CFLAGS=-O3 -Wall -Wextra -Wpedantic -Wvla -Werror -Wredundant-decls -Wmissing-prototypes -std=c99 -I../../../common $(EXTRAFLAGS) + +all: $(LIB) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +$(LIB): $(OBJECTS) + $(AR) -r $@ $(OBJECTS) + +clean: + $(RM) $(OBJECTS) + $(RM) $(LIB) diff --git a/crypto_kem/hqc-rmrs-192/clean/Makefile.Microsoft_nmake b/crypto_kem/hqc-rmrs-192/clean/Makefile.Microsoft_nmake new file mode 100644 index 00000000..61cd6ffe --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/Makefile.Microsoft_nmake @@ -0,0 +1,19 @@ +# This Makefile can be used with Microsoft Visual Studio's nmake using the command: +# nmake /f Makefile.Microsoft_nmake + +LIBRARY=libhqc-rmrs-192_clean.lib +OBJECTS=code.obj fft.obj gf2x.obj gf.obj hqc.obj kem.obj parsing.obj reed_muller.obj reed_solomon.obj vector.obj + +CFLAGS=/nologo /O2 /I ..\..\..\common /W4 /WX + +all: $(LIBRARY) + +# Make sure objects are recompiled if headers change. +$(OBJECTS): *.h + +$(LIBRARY): $(OBJECTS) + LIB.EXE /NOLOGO /WX /OUT:$@ $** + +clean: + -DEL $(OBJECTS) + -DEL $(LIBRARY) diff --git a/crypto_kem/hqc-rmrs-192/clean/api.h b/crypto_kem/hqc-rmrs-192/clean/api.h new file mode 100644 index 00000000..33872654 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/api.h @@ -0,0 +1,25 @@ +#ifndef PQCLEAN_HQCRMRS192_CLEAN_API_H +#define PQCLEAN_HQCRMRS192_CLEAN_API_H +/** + * @file api.h + * @brief NIST KEM API used by the HQC_KEM IND-CCA2 scheme + */ + +#define PQCLEAN_HQCRMRS192_CLEAN_CRYPTO_ALGNAME "HQC-RMRS-192" + +#define PQCLEAN_HQCRMRS192_CLEAN_CRYPTO_SECRETKEYBYTES 4946 +#define PQCLEAN_HQCRMRS192_CLEAN_CRYPTO_PUBLICKEYBYTES 4906 +#define PQCLEAN_HQCRMRS192_CLEAN_CRYPTO_BYTES 64 +#define PQCLEAN_HQCRMRS192_CLEAN_CRYPTO_CIPHERTEXTBYTES 9794 + +// As a technicality, the public key is appended to the secret key in order to respect the NIST API. +// Without this constraint, PQCLEAN_HQCRMRS192_CLEAN_CRYPTO_SECRETKEYBYTES would be defined as 32 + +int PQCLEAN_HQCRMRS192_CLEAN_crypto_kem_keypair(unsigned char *pk, unsigned char *sk); + +int PQCLEAN_HQCRMRS192_CLEAN_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk); + +int PQCLEAN_HQCRMRS192_CLEAN_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/clean/code.c b/crypto_kem/hqc-rmrs-192/clean/code.c new file mode 100644 index 00000000..dae9cd9f --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/code.c @@ -0,0 +1,47 @@ +#include "code.h" +#include "parameters.h" +#include "reed_muller.h" +#include "reed_solomon.h" +#include +#include +/** + * @file code.c + * @brief Implementation of concatenated code + */ + + + +/** + * + * @brief Encoding the message m to a code word em using the concatenated code + * + * First we encode the message using the Reed-Solomon code, then with the duplicated Reed-Muller code we obtain + * a concatenated code word. + * + * @param[out] em Pointer to an array that is the tensor code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQCRMRS192_CLEAN_code_encode(uint64_t *em, const uint64_t *m) { + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQCRMRS192_CLEAN_reed_solomon_encode(tmp, m); + PQCLEAN_HQCRMRS192_CLEAN_reed_muller_encode(em, tmp); + +} + + + +/** + * @brief Decoding the code word em to a message m using the concatenated code + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQCRMRS192_CLEAN_code_decode(uint64_t *m, const uint64_t *em) { + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQCRMRS192_CLEAN_reed_muller_decode(tmp, em); + PQCLEAN_HQCRMRS192_CLEAN_reed_solomon_decode(m, tmp); + + +} diff --git a/crypto_kem/hqc-rmrs-192/clean/code.h b/crypto_kem/hqc-rmrs-192/clean/code.h new file mode 100644 index 00000000..5d449a0d --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/code.h @@ -0,0 +1,20 @@ +#ifndef CODE_H +#define CODE_H + + +/** + * @file code.h + * Header file of code.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS192_CLEAN_code_encode(uint64_t *em, const uint64_t *message); + +void PQCLEAN_HQCRMRS192_CLEAN_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/clean/fft.c b/crypto_kem/hqc-rmrs-192/clean/fft.c new file mode 100644 index 00000000..55bf9a56 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/fft.c @@ -0,0 +1,331 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include +#include +/** + * @file fft.c + * Implementation of the additive FFT and its transpose. + * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + */ + + +static void compute_fft_betas(uint16_t *betas); +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size); +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f); +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); + + +/** + * @brief Computes the basis of betas (omitting 1) used in the additive FFT and its transpose + * + * @param[out] betas Array of size PARAM_M-1 + */ +static void compute_fft_betas(uint16_t *betas) { + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + betas[i] = 1 << (PARAM_M - 1 - i); + } +} + + + +/** + * @brief Computes the subset sums of the given set + * + * The array subset_sums is such that its ith element is + * the subset sum of the set elements given by the binary form of i. + * + * @param[out] subset_sums Array of size 2^set_size receiving the subset sums + * @param[in] set Array of set_size elements + * @param[in] set_size Size of the array set + */ +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size) { + subset_sums[0] = 0; + + for (size_t i = 0 ; i < set_size ; ++i) { + for (size_t j = 0 ; j < (1U << i) ; ++j) { + subset_sums[(1 << i) + j] = set[i] ^ subset_sums[j]; + } + } +} + + + +/** + * @brief Computes the radix conversion of a polynomial f in GF(2^m)[x] + * + * Computes f0 and f1 such that f(x) = f0(x^2-x) + x.f1(x^2-x) + * as proposed by Bernstein, Chou and Schwabe: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f0 Array half the size of f + * @param[out] f1 Array half the size of f + * @param[in] f Array of size a power of 2 + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f) { + switch (m_f) { + case 4: + f0[4] = f[8] ^ f[12]; + f0[6] = f[12] ^ f[14]; + f0[7] = f[14] ^ f[15]; + f1[5] = f[11] ^ f[13]; + f1[6] = f[13] ^ f[14]; + f1[7] = f[15]; + f0[5] = f[10] ^ f[12] ^ f1[5]; + f1[4] = f[9] ^ f[13] ^ f0[5]; + + f0[0] = f[0]; + f1[3] = f[7] ^ f[11] ^ f[15]; + f0[3] = f[6] ^ f[10] ^ f[14] ^ f1[3]; + f0[2] = f[4] ^ f0[4] ^ f0[3] ^ f1[3]; + f1[1] = f[3] ^ f[5] ^ f[9] ^ f[13] ^ f1[3]; + f1[2] = f[3] ^ f1[1] ^ f0[3]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 3: + f0[0] = f[0]; + f0[2] = f[4] ^ f[6]; + f0[3] = f[6] ^ f[7]; + f1[1] = f[3] ^ f[5] ^ f[7]; + f1[2] = f[5] ^ f[6]; + f1[3] = f[7]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 2: + f0[0] = f[0]; + f0[1] = f[2] ^ f[3]; + f1[0] = f[1] ^ f0[1]; + f1[1] = f[3]; + return; + + case 1: + f0[0] = f[0]; + f1[0] = f[1]; + return; + + default: + ; + size_t n = 1 << (m_f - 2); + + uint16_t Q[2 * (1 << (PARAM_FFT - 2))]; + uint16_t R[2 * (1 << (PARAM_FFT - 2))]; + + uint16_t Q0[1 << (PARAM_FFT - 2)]; + uint16_t Q1[1 << (PARAM_FFT - 2)]; + uint16_t R0[1 << (PARAM_FFT - 2)]; + uint16_t R1[1 << (PARAM_FFT - 2)]; + + memcpy(Q, f + 3 * n, 2 * n); + memcpy(Q + n, f + 3 * n, 2 * n); + memcpy(R, f, 4 * n); + + for (size_t i = 0 ; i < n ; ++i) { + Q[i] ^= f[2 * n + i]; + R[n + i] ^= Q[i]; + } + + radix(Q0, Q1, Q, m_f - 1); + radix(R0, R1, R, m_f - 1); + + memcpy(f0, R0, 2 * n); + memcpy(f0 + n, Q0, 2 * n); + memcpy(f1, R1, 2 * n); + memcpy(f1 + n, Q1, 2 * n); + } +} + + + +/** + * @brief Evaluates f at all subset sums of a given set + * + * This function is a subroutine of the function fft. + * + * @param[out] w Array + * @param[in] f Array + * @param[in] f_coeffs Number of coefficients of f + * @param[in] m Number of betas + * @param[in] m_f Number of coefficients of f (one more than its degree) + * @param[in] betas FFT constants + */ +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + uint16_t f0[1 << (PARAM_FFT - 2)]; + uint16_t f1[1 << (PARAM_FFT - 2)]; + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + size_t k = 1 << (m - 1); + uint16_t gammas_sums[1 << (PARAM_M - 2)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + uint16_t tmp[PARAM_M - (PARAM_FFT - 1)]; + for (size_t i = 0 ; i < m ; ++i) { + tmp[i] = PQCLEAN_HQCRMRS192_CLEAN_gf_mul(betas[i], f[1]); + } + + w[0] = f[0]; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + w[(1 << j) + k] = w[k] ^ tmp[j]; + } + } + + return; + } + + // Step 2: compute g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQCRMRS192_CLEAN_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQCRMRS192_CLEAN_gf_mul(beta_m_pow, f[i]); + } + } + + // Step 3 + radix(f0, f1, f, m_f); + + // Step 4: compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQCRMRS192_CLEAN_gf_mul(betas[i], PQCLEAN_HQCRMRS192_CLEAN_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQCRMRS192_CLEAN_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + + if (f_coeffs <= 3) { // 3-coefficient polynomial f case: f1 is constant + w[0] = u[0]; + w[k] = u[0] ^ f1[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS192_CLEAN_gf_mul(gammas_sums[i], f1[0]); + w[k + i] = w[i] ^ f1[0]; + } + } else { + fft_rec(v, f1, f_coeffs / 2, m - 1, m_f - 1, deltas); + + // Step 6 + memcpy(w + k, v, 2 * k); + w[0] = u[0]; + w[k] ^= u[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS192_CLEAN_gf_mul(gammas_sums[i], v[i]); + w[k + i] ^= w[i]; + } + } +} + + + +/** + * @brief Evaluates f on all fields elements using an additive FFT algorithm + * + * f_coeffs is the number of coefficients of f (one less than its degree).
+ * The FFT proceeds recursively to evaluate f at all subset sums of a basis B.
+ * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf
+ * Note that on this first call (as opposed to the recursive calls to fft_rec), gammas are equal to betas, + * meaning the first gammas subset sums are actually the subset sums of betas (except 1).
+ * Also note that f is altered during computation (twisted at each level). + * + * @param[out] w Array + * @param[in] f Array of 2^PARAM_FFT elements + * @param[in] f_coeffs Number coefficients of f (i.e. deg(f)+1) + */ +void PQCLEAN_HQCRMRS192_CLEAN_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs) { + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + uint16_t f0[1 << (PARAM_FFT - 1)]; + uint16_t f1[1 << (PARAM_FFT - 1)]; + uint16_t deltas[PARAM_M - 1]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)]; + uint16_t v[1 << (PARAM_M - 1)]; + + // Follows Gao and Mateer algorithm + compute_fft_betas(betas); + + // Step 1: PARAM_FFT > 1, nothing to do + + // Compute gammas sums + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + // Step 2: beta_m = 1, nothing to do + + // Step 3 + radix(f0, f1, f, PARAM_FFT); + + // Step 4: Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQCRMRS192_CLEAN_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + fft_rec(v, f1, f_coeffs / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + + // Step 6, 7 and error polynomial computation + memcpy(w + k, v, 2 * k); + + // Check if 0 is root + w[0] = u[0]; + + // Check if 1 is root + w[k] ^= u[0]; + + // Find other roots + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS192_CLEAN_gf_mul(betas_sums[i], v[i]); + w[k + i] ^= w[i]; + } +} + + + +/** + * @brief Retrieves the error polynomial error from the evaluations w of the ELP (Error Locator Polynomial) on all field elements. + * + * @param[out] error Array with the error + * @param[out] error_compact Array with the error in a compact form + * @param[in] w Array of size 2^PARAM_M + */ +void PQCLEAN_HQCRMRS192_CLEAN_fft_retrieve_error_poly(uint8_t *error, const uint16_t *w) { + uint16_t gammas[PARAM_M - 1] = {0}; + uint16_t gammas_sums[1 << (PARAM_M - 1)] = {0}; + size_t k = 1 << (PARAM_M - 1); + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + error[0] ^= 1 ^ ((uint16_t) - w[0] >> 15); + error[0] ^= 1 ^ ((uint16_t) - w[k] >> 15); + + size_t index = PARAM_GF_MUL_ORDER; + + for (size_t i = 1 ; i < k ; ++i) { + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQCRMRS192_CLEAN_gf_log(gammas_sums[i]); + error[index] ^= 1 ^ ((uint16_t) - w[i] >> 15); + + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQCRMRS192_CLEAN_gf_log(gammas_sums[i] ^ 1); + error[index] ^= 1 ^ ((uint16_t) - w[k + i] >> 15); + } +} diff --git a/crypto_kem/hqc-rmrs-192/clean/fft.h b/crypto_kem/hqc-rmrs-192/clean/fft.h new file mode 100644 index 00000000..c35a080a --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/fft.h @@ -0,0 +1,21 @@ +#ifndef FFT_H +#define FFT_H + + +/** + * @file fft.h + * Header file of fft.c + */ + + +#include + +#include +#include + +void PQCLEAN_HQCRMRS192_CLEAN_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs); + +void PQCLEAN_HQCRMRS192_CLEAN_fft_retrieve_error_poly(uint8_t *error, const uint16_t *w); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/clean/gf.c b/crypto_kem/hqc-rmrs-192/clean/gf.c new file mode 100644 index 00000000..9245800b --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/gf.c @@ -0,0 +1,116 @@ +#include "gf.h" +#include "parameters.h" +#include +/** + * @file gf.c + * Galois field implementation with multiplication using lookup tables + */ + + + +/** + * Generates exp and log lookup tables of GF(2^m). + * The logarithm of 0 is defined as 2^PARAM_M by convention.
+ * The last two elements of the exp table are needed by the PQCLEAN_HQCRMRS192_CLEAN_gf_mul function. + * (for example if both elements to multiply are zero). + * @param[out] exp Array of size 2^PARAM_M + 2 receiving the powers of the primitive element + * @param[out] log Array of size 2^PARAM_M receiving the logarithms of the elements of GF(2^m) + * @param[in] m Parameter of Galois field GF(2^m) + */ +void PQCLEAN_HQCRMRS192_CLEAN_gf_generate(uint16_t *exp, uint16_t *log, int16_t m) { + uint16_t elt = 1; + uint16_t alpha = 2; // primitive element of GF(2^PARAM_M) + uint16_t gf_poly = PARAM_GF_POLY; + + for (size_t i = 0 ; i < (1U << m) - 1 ; ++i) { + exp[i] = elt; + log[elt] = i; + + elt *= alpha; + if (elt >= 1 << m) { + elt ^= gf_poly; + } + } + + exp[(1 << m) - 1] = 1; + exp[1 << m] = 2; + exp[(1 << m) + 1] = 4; + log[0] = 1 << m; // by convention +} + + + +/** + * Returns the requested power of the primitive element of GF(2^PARAM_M). + * @returns a^i + */ +uint16_t PQCLEAN_HQCRMRS192_CLEAN_gf_exp(uint16_t i) { + return exp[i]; +} + + + +/** + * Returns the integer i such that elt = a^i + * where a is the primitive element of GF(2^PARAM_M). + * @returns the logarithm of the given element + */ +uint16_t PQCLEAN_HQCRMRS192_CLEAN_gf_log(uint16_t elt) { + return log[elt]; +} + + + +/** + * Multiplies nonzero element 'a' by element 'b'. + * @returns the product a*b + * @param[in] a First element of GF(2^PARAM_M) to multiply (cannot be zero) + * @param[in] b Second element of GF(2^PARAM_M) to multiply (cannot be zero) + */ +uint16_t PQCLEAN_HQCRMRS192_CLEAN_gf_mul(uint16_t a, uint16_t b) { + // mask = 0xffff if neither a nor b is zero. Otherwise mask is 0. + // mask = 0xffff si ni a ni b n'est nul. sinon mask = 0 + int16_t mask = ((log[a] | log[b]) >> PARAM_M) - 1; + return mask & exp[PQCLEAN_HQCRMRS192_CLEAN_gf_mod(log[a] + log[b])]; +} + + + +/** + * Squares an element of GF(2^PARAM_M). + * @returns a^2 + * @param[in] a Element of GF(2^PARAM_M) + */ +uint16_t PQCLEAN_HQCRMRS192_CLEAN_gf_square(uint16_t a) { + int16_t mask = (log[a] >> PARAM_M) - 1; + return mask & exp[PQCLEAN_HQCRMRS192_CLEAN_gf_mod(2 * log[a])]; +} + + + +/** + * Computes the inverse of an element of GF(2^PARAM_M). + * @returns the inverse of a + * @param[in] a Element of GF(2^PARAM_M) + */ +uint16_t PQCLEAN_HQCRMRS192_CLEAN_gf_inverse(uint16_t a) { + return exp[PARAM_GF_MUL_ORDER - log[a]]; +} + + + +/** + * Returns i modulo 2^PARAM_M-1. + * i must be less than 2*(2^PARAM_M-1). + * Therefore, the return value is either i or i-2^PARAM_M+1. + * @returns i mod (2^PARAM_M-1) + * @param[in] i The integer whose modulo is taken + */ +uint16_t PQCLEAN_HQCRMRS192_CLEAN_gf_mod(uint16_t i) { + uint16_t tmp = (uint16_t) (i - PARAM_GF_MUL_ORDER); + + // mask = 0xffff if(i < PARAM_GF_MUL_ORDER) + uint16_t mask = ~(tmp >> 15) + 1; + + return tmp + (mask & PARAM_GF_MUL_ORDER); +} diff --git a/crypto_kem/hqc-rmrs-192/clean/gf.h b/crypto_kem/hqc-rmrs-192/clean/gf.h new file mode 100644 index 00000000..e93a4145 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/gf.h @@ -0,0 +1,48 @@ +#ifndef GF_H +#define GF_H + + +/** + * @file gf.h + * Header file of gf.c + */ + +#include + +#include +#include + + +/** + * Powers of the root alpha of 1 + x^2 + x^3 + x^4 + x^8. + * The last two elements are needed by the PQCLEAN_HQCRMRS192_CLEAN_gf_mul function + * (for example if both elements to multiply are zero). + */ +static const uint16_t exp [258] = { 1, 2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240, 253, 231, 211, 187, 107, 214, 177, 127, 254, 225, 223, 163, 91, 182, 113, 226, 217, 175, 67, 134, 17, 34, 68, 136, 13, 26, 52, 104, 208, 189, 103, 206, 129, 31, 62, 124, 248, 237, 199, 147, 59, 118, 236, 197, 151, 51, 102, 204, 133, 23, 46, 92, 184, 109, 218, 169, 79, 158, 33, 66, 132, 21, 42, 84, 168, 77, 154, 41, 82, 164, 85, 170, 73, 146, 57, 114, 228, 213, 183, 115, 230, 209, 191, 99, 198, 145, 63, 126, 252, 229, 215, 179, 123, 246, 241, 255, 227, 219, 171, 75, 150, 49, 98, 196, 149, 55, 110, 220, 165, 87, 174, 65, 130, 25, 50, 100, 200, 141, 7, 14, 28, 56, 112, 224, 221, 167, 83, 166, 81, 162, 89, 178, 121, 242, 249, 239, 195, 155, 43, 86, 172, 69, 138, 9, 18, 36, 72, 144, 61, 122, 244, 245, 247, 243, 251, 235, 203, 139, 11, 22, 44, 88, 176, 125, 250, 233, 207, 131, 27, 54, 108, 216, 173, 71, 142, 1, 2, 4 }; + + + +/** + * Logarithm of elements of GF(2^8) to the base alpha (root of 1 + x^2 + x^3 + x^4 + x^8). + * The logarithm of 0 is set to 0 by convention. + */ +static const uint16_t log [256] = { 0, 0, 1, 25, 2, 50, 26, 198, 3, 223, 51, 238, 27, 104, 199, 75, 4, 100, 224, 14, 52, 141, 239, 129, 28, 193, 105, 248, 200, 8, 76, 113, 5, 138, 101, 47, 225, 36, 15, 33, 53, 147, 142, 218, 240, 18, 130, 69, 29, 181, 194, 125, 106, 39, 249, 185, 201, 154, 9, 120, 77, 228, 114, 166, 6, 191, 139, 98, 102, 221, 48, 253, 226, 152, 37, 179, 16, 145, 34, 136, 54, 208, 148, 206, 143, 150, 219, 189, 241, 210, 19, 92, 131, 56, 70, 64, 30, 66, 182, 163, 195, 72, 126, 110, 107, 58, 40, 84, 250, 133, 186, 61, 202, 94, 155, 159, 10, 21, 121, 43, 78, 212, 229, 172, 115, 243, 167, 87, 7, 112, 192, 247, 140, 128, 99, 13, 103, 74, 222, 237, 49, 197, 254, 24, 227, 165, 153, 119, 38, 184, 180, 124, 17, 68, 146, 217, 35, 32, 137, 46, 55, 63, 209, 91, 149, 188, 207, 205, 144, 135, 151, 178, 220, 252, 190, 97, 242, 86, 211, 171, 20, 42, 93, 158, 132, 60, 57, 83, 71, 109, 65, 162, 31, 45, 67, 216, 183, 123, 164, 118, 196, 23, 73, 236, 127, 12, 111, 246, 108, 161, 59, 82, 41, 157, 85, 170, 251, 96, 134, 177, 187, 204, 62, 90, 203, 89, 95, 176, 156, 169, 160, 81, 11, 245, 22, 235, 122, 117, 44, 215, 79, 174, 213, 233, 230, 231, 173, 232, 116, 214, 244, 234, 168, 80, 88, 175 }; + + +void PQCLEAN_HQCRMRS192_CLEAN_gf_generate(uint16_t *exp, uint16_t *log, int16_t m); + + +uint16_t PQCLEAN_HQCRMRS192_CLEAN_gf_log(uint16_t elt); + +uint16_t PQCLEAN_HQCRMRS192_CLEAN_gf_exp(uint16_t i); + +uint16_t PQCLEAN_HQCRMRS192_CLEAN_gf_mul(uint16_t a, uint16_t b); + +uint16_t PQCLEAN_HQCRMRS192_CLEAN_gf_square(uint16_t a); + +uint16_t PQCLEAN_HQCRMRS192_CLEAN_gf_inverse(uint16_t a); + +uint16_t PQCLEAN_HQCRMRS192_CLEAN_gf_mod(uint16_t i); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/clean/gf2x.c b/crypto_kem/hqc-rmrs-192/clean/gf2x.c new file mode 100644 index 00000000..8687d08f --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/gf2x.c @@ -0,0 +1,155 @@ +#include "gf2x.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include +#include +#include +/** + * \file gf2x.c + * \brief Implementation of multiplication of two polynomials + */ + + +static inline void swap(uint16_t *tab, uint16_t elt1, uint16_t elt2); +static void reduce(uint64_t *o, const uint64_t *a); +static void fast_convolution_mult(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx); + +/** + * @brief swap two elements in a table + * + * This function exchanges tab[elt1] with tab[elt2] + * + * @param[in] tab Pointer to the table + * @param[in] elt1 Index of the first element + * @param[in] elt2 Index of the second element + */ +static inline void swap(uint16_t *tab, uint16_t elt1, uint16_t elt2) { + uint16_t tmp = tab[elt1]; + + tab[elt1] = tab[elt2]; + tab[elt2] = tmp; +} + + + +/** + * @brief Compute o(x) = a(x) mod \f$ X^n - 1\f$ + * + * This function computes the modular reduction of the polynomial a(x) + * + * @param[in] a Pointer to the polynomial a(x) + * @param[out] o Pointer to the result + */ +static void reduce(uint64_t *o, const uint64_t *a) { + uint64_t r; + uint64_t carry; + + for (uint32_t i = 0 ; i < VEC_N_SIZE_64 ; i++) { + r = a[i + VEC_N_SIZE_64 - 1] >> (PARAM_N & 63); + carry = (uint64_t) (a[i + VEC_N_SIZE_64] << (64 - (PARAM_N & 63))); + o[i] = a[i] ^ r ^ carry; + } + + o[VEC_N_SIZE_64 - 1] &= RED_MASK; +} + + + +/** + * @brief computes product of the polynomial a1(x) with the sparse polynomial a2 + * + * o(x) = a1(x)a2(x) + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to the sparse polynomial a2 (list of degrees of the monomials which appear in a2) + * @param[in] a2 Pointer to the polynomial a1(x) + * @param[in] weight Hamming wifht of the sparse polynomial a2 + * @param[in] ctx Pointer to a seed expander used to randomize the multiplication process + */ +static void fast_convolution_mult(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx) { +//static uint32_t fast_convolution_mult(const uint64_t *A, const uint32_t *vB, uint64_t *C, const uint16_t w, AES_XOF_struct *ctx) + uint64_t carry; + uint32_t dec, s; + uint64_t table[16 * (VEC_N_SIZE_64 + 1)]; + uint16_t permuted_table[16]; + uint16_t permutation_table[16]; + uint16_t permuted_sparse_vect[PARAM_OMEGA_E]; + uint16_t permutation_sparse_vect[PARAM_OMEGA_E]; + uint64_t *pt; + uint16_t *res_16; + + for (uint32_t i = 0 ; i < 16; i++) { + permuted_table[i] = i; + } + + seedexpander(ctx, (uint8_t *) permutation_table, 16 * sizeof(uint16_t)); + + for (uint32_t i = 0 ; i < 15 ; i++) { + swap(permuted_table + i, 0, permutation_table[i] % (16 - i)); + } + + pt = table + (permuted_table[0] * (VEC_N_SIZE_64 + 1)); + for (int32_t j = 0 ; j < VEC_N_SIZE_64 ; j++) { + pt[j] = a2[j]; + } + pt[VEC_N_SIZE_64] = 0x0; + + for (uint32_t i = 1 ; i < 16 ; i++) { + carry = 0; + pt = table + (permuted_table[i] * (VEC_N_SIZE_64 + 1)); + for (uint32_t j = 0 ; j < VEC_N_SIZE_64 ; j++) { + pt[j] = (a2[j] << i) ^ carry; + carry = (a2[j] >> ((64 - i))); + } + pt[VEC_N_SIZE_64] = carry; + } + + for (uint32_t i = 0 ; i < weight ; i++) { + permuted_sparse_vect[i] = i; + } + + seedexpander(ctx, (uint8_t *) permutation_sparse_vect, weight * sizeof(uint16_t)); + + for (uint32_t i = 0 ; i + 1 < weight ; i++) { + swap(permuted_sparse_vect + i, 0, permutation_sparse_vect[i] % (weight - i)); + } + + for (uint32_t i = 0 ; i < weight ; i++) { + dec = a1[permuted_sparse_vect[i]] & 0xf; + s = a1[permuted_sparse_vect[i]] >> 4; + res_16 = ((uint16_t *) o) + s; + pt = table + (permuted_table[dec] * (VEC_N_SIZE_64 + 1)); + + for (uint32_t j = 0 ; j < VEC_N_SIZE_64 + 1 ; j++) { + *res_16++ ^= (uint16_t) pt[j]; + *res_16++ ^= (uint16_t) (pt[j] >> 16); + *res_16++ ^= (uint16_t) (pt[j] >> 32); + *res_16++ ^= (uint16_t) (pt[j] >> 48); + } + } +} + + + +/** + * @brief Multiply two polynomials modulo \f$ X^n - 1\f$. + * + * This functions multiplies a sparse polynomial a1 (of Hamming weight equal to weight) + * and a dense polynomial a2. The multiplication is done modulo \f$ X^n - 1\f$. + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to the sparse polynomial + * @param[in] a2 Pointer to the dense polynomial + * @param[in] weight Integer that is the weigt of the sparse polynomial + * @param[in] ctx Pointer to the randomness context + */ +void PQCLEAN_HQCRMRS192_CLEAN_vect_mul(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx) { + uint64_t tmp[2 * VEC_N_SIZE_64 + 1]; + for (uint32_t j = 0 ; j < 2 * VEC_N_SIZE_64 + 1 ; j++) { + tmp[j] = 0; + } + + fast_convolution_mult(tmp, a1, a2, weight, ctx); + reduce(o, tmp); +} diff --git a/crypto_kem/hqc-rmrs-192/clean/gf2x.h b/crypto_kem/hqc-rmrs-192/clean/gf2x.h new file mode 100644 index 00000000..697ec71d --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/gf2x.h @@ -0,0 +1,18 @@ +#ifndef GF2X_H +#define GF2X_H + + +/** + * @file gf2x.h + * @brief Header file for gf2x.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQCRMRS192_CLEAN_vect_mul(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/clean/hqc.c b/crypto_kem/hqc-rmrs-192/clean/hqc.c new file mode 100644 index 00000000..9fe4d225 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/hqc.c @@ -0,0 +1,143 @@ +#include "code.h" +#include "gf2x.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +/** + * @file hqc.c + * @brief Implementation of hqc.h + */ + + + +/** + * @brief Keygen of the HQC_PKE IND_CPA scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS192_CLEAN_hqc_pke_keygen(unsigned char *pk, unsigned char *sk) { + AES_XOF_struct sk_seedexpander; + AES_XOF_struct pk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + uint8_t pk_seed[SEED_BYTES] = {0}; + uint64_t x[VEC_N_SIZE_64] = {0}; + uint32_t y[PARAM_OMEGA] = {0}; + uint64_t h[VEC_N_SIZE_64] = {0}; + uint64_t s[VEC_N_SIZE_64] = {0}; + + // Create seed_expanders for public key and secret key + randombytes(sk_seed, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + randombytes(pk_seed, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute secret key + PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_fixed_weight_by_coordinates(&sk_seedexpander, y, PARAM_OMEGA); + + // Compute public key + PQCLEAN_HQCRMRS192_CLEAN_vect_set_random(&pk_seedexpander, h); + PQCLEAN_HQCRMRS192_CLEAN_vect_mul(s, y, h, PARAM_OMEGA, &sk_seedexpander); + PQCLEAN_HQCRMRS192_CLEAN_vect_add(s, x, s, VEC_N_SIZE_64); + + // Parse keys to string + PQCLEAN_HQCRMRS192_CLEAN_hqc_public_key_to_string(pk, pk_seed, s); + PQCLEAN_HQCRMRS192_CLEAN_hqc_secret_key_to_string(sk, sk_seed, pk); + +} + + + +/** + * @brief Encryption of the HQC_PKE IND_CPA scheme + * + * The cihertext is composed of vectors u and v. + * + * @param[out] u Vector u (first part of the ciphertext) + * @param[out] v Vector v (second part of the ciphertext) + * @param[in] m Vector representing the message to encrypt + * @param[in] theta Seed used to derive randomness required for encryption + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS192_CLEAN_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk) { + AES_XOF_struct seedexpander; + uint64_t h[VEC_N_SIZE_64] = {0}; + uint64_t s[VEC_N_SIZE_64] = {0}; + uint64_t r1[VEC_N_SIZE_64] = {0}; + uint32_t r2[PARAM_OMEGA_R] = {0}; + uint64_t e[VEC_N_SIZE_64] = {0}; + uint64_t tmp1[VEC_N_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_SIZE_64] = {0}; + + // Create seed_expander from theta + seedexpander_init(&seedexpander, theta, theta + 32, SEEDEXPANDER_MAX_LENGTH); + + // Retrieve h and s from public key + PQCLEAN_HQCRMRS192_CLEAN_hqc_public_key_from_string(h, s, pk); + + // Generate r1, r2 and e + PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_fixed_weight(&seedexpander, r1, PARAM_OMEGA_R); + PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_fixed_weight_by_coordinates(&seedexpander, r2, PARAM_OMEGA_R); + PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_fixed_weight(&seedexpander, e, PARAM_OMEGA_E); + + // Compute u = r1 + r2.h + PQCLEAN_HQCRMRS192_CLEAN_vect_mul(u, r2, h, PARAM_OMEGA_R, &seedexpander); + PQCLEAN_HQCRMRS192_CLEAN_vect_add(u, r1, u, VEC_N_SIZE_64); + + // Compute v = m.G by encoding the message + PQCLEAN_HQCRMRS192_CLEAN_code_encode(v, m); + PQCLEAN_HQCRMRS192_CLEAN_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + + // Compute v = m.G + s.r2 + e + PQCLEAN_HQCRMRS192_CLEAN_vect_mul(tmp2, r2, s, PARAM_OMEGA_R, &seedexpander); + PQCLEAN_HQCRMRS192_CLEAN_vect_add(tmp2, e, tmp2, VEC_N_SIZE_64); + PQCLEAN_HQCRMRS192_CLEAN_vect_add(tmp2, tmp1, tmp2, VEC_N_SIZE_64); + PQCLEAN_HQCRMRS192_CLEAN_vect_resize(v, PARAM_N1N2, tmp2, PARAM_N); + +} + + + +/** + * @brief Decryption of the HQC_PKE IND_CPA scheme + * + * @param[out] m Vector representing the decrypted message + * @param[in] u Vector u (first part of the ciphertext) + * @param[in] v Vector v (second part of the ciphertext) + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS192_CLEAN_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk) { + uint64_t x[VEC_N_SIZE_64] = {0}; + uint32_t y[PARAM_OMEGA] = {0}; + uint8_t pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t tmp1[VEC_N_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_SIZE_64] = {0}; + AES_XOF_struct perm_seedexpander; + uint8_t perm_seed[SEED_BYTES] = {0}; + + // Retrieve x, y, pk from secret key + PQCLEAN_HQCRMRS192_CLEAN_hqc_secret_key_from_string(x, y, pk, sk); + + randombytes(perm_seed, SEED_BYTES); + seedexpander_init(&perm_seedexpander, perm_seed, perm_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute v - u.y + PQCLEAN_HQCRMRS192_CLEAN_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + PQCLEAN_HQCRMRS192_CLEAN_vect_mul(tmp2, y, u, PARAM_OMEGA, &perm_seedexpander); + PQCLEAN_HQCRMRS192_CLEAN_vect_add(tmp2, tmp1, tmp2, VEC_N_SIZE_64); + + + // Compute m by decoding v - u.y + PQCLEAN_HQCRMRS192_CLEAN_code_decode(m, tmp2); +} diff --git a/crypto_kem/hqc-rmrs-192/clean/hqc.h b/crypto_kem/hqc-rmrs-192/clean/hqc.h new file mode 100644 index 00000000..7cfd4717 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/hqc.h @@ -0,0 +1,21 @@ +#ifndef HQC_H +#define HQC_H + + +/** + * @file hqc.h + * @brief Functions of the HQC_PKE IND_CPA scheme + */ + +#include + +#include + +void PQCLEAN_HQCRMRS192_CLEAN_hqc_pke_keygen(unsigned char *pk, unsigned char *sk); + +void PQCLEAN_HQCRMRS192_CLEAN_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk); + +void PQCLEAN_HQCRMRS192_CLEAN_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/clean/kem.c b/crypto_kem/hqc-rmrs-192/clean/kem.c new file mode 100644 index 00000000..72076bf7 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/kem.c @@ -0,0 +1,138 @@ +#include "api.h" +#include "fips202.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "sha2.h" +#include "vector.h" +#include +#include +/** + * @file kem.c + * @brief Implementation of api.h + */ + + + +/** + * @brief Keygen of the HQC_KEM IND_CAA2 scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + * @returns 0 if keygen is successful + */ +int PQCLEAN_HQCRMRS192_CLEAN_crypto_kem_keypair(unsigned char *pk, unsigned char *sk) { + + PQCLEAN_HQCRMRS192_CLEAN_hqc_pke_keygen(pk, sk); + return 0; +} + + + +/** + * @brief Encapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ct String containing the ciphertext + * @param[out] ss String containing the shared secret + * @param[in] pk String containing the public key + * @returns 0 if encapsulation is successful + */ +int PQCLEAN_HQCRMRS192_CLEAN_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk) { + + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint64_t u[VEC_N_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Computing m + PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_from_randombytes(m); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m + PQCLEAN_HQCRMRS192_CLEAN_hqc_pke_encrypt(u, v, m, theta, pk); + + // Computing d + sha512(d, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Computing ciphertext + PQCLEAN_HQCRMRS192_CLEAN_hqc_ciphertext_to_string(ct, u, v, d); + + + return 0; +} + + + +/** + * @brief Decapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ss String containing the shared secret + * @param[in] ct String containing the cipĥertext + * @param[in] sk String containing the secret key + * @returns 0 if decapsulation is successful, -1 otherwise + */ +int PQCLEAN_HQCRMRS192_CLEAN_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk) { + + int8_t result = -1; + uint64_t u[VEC_N_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t u2[VEC_N_SIZE_64] = {0}; + uint64_t v2[VEC_N1N2_SIZE_64] = {0}; + unsigned char d2[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Retrieving u, v and d from ciphertext + PQCLEAN_HQCRMRS192_CLEAN_hqc_ciphertext_from_string(u, v, d, ct); + + // Retrieving pk from sk + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); + + // Decryting + PQCLEAN_HQCRMRS192_CLEAN_hqc_pke_decrypt(m, u, v, sk); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m' + PQCLEAN_HQCRMRS192_CLEAN_hqc_pke_encrypt(u2, v2, m, theta, pk); + + // Computing d' + sha512(d2, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Abort if c != c' or d != d' + result = (PQCLEAN_HQCRMRS192_CLEAN_vect_compare(u, u2, VEC_N_SIZE_BYTES) == 0 && PQCLEAN_HQCRMRS192_CLEAN_vect_compare(v, v2, VEC_N1N2_SIZE_BYTES) == 0 && memcmp(d, d2, SHA512_BYTES) == 0); + for (size_t i = 0 ; i < SHARED_SECRET_BYTES ; i++) { + ss[i] = result * ss[i]; + } + result--; + + + return result; +} diff --git a/crypto_kem/hqc-rmrs-192/clean/parameters.h b/crypto_kem/hqc-rmrs-192/clean/parameters.h new file mode 100644 index 00000000..a417245e --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/parameters.h @@ -0,0 +1,102 @@ +#ifndef HQC_PARAMETERS_H +#define HQC_PARAMETERS_H + + +/** + * @file parameters.h + * @brief Parameters of the HQC_KEM IND-CCA2 scheme + */ + +#include "api.h" +#include "api.h" + + +#define CEIL_DIVIDE(a, b) (((a)/(b)) + ((a) % (b) == 0 ? 0 : 1)) /*!< Divide a by b and ceil the result*/ +#define BITMASK(a, size) ((1UL << ((a) % (size))) - 1) /*!< Create a mask*/ + + +/* + #define PARAM_N Define the parameter n of the scheme + #define PARAM_N1 Define the parameter n1 of the scheme (length of Reed-Solomon code) + #define PARAM_N2 Define the parameter n2 of the scheme (length of Duplicated Reed-Muller code) + #define PARAM_N1N2 Define the length in bits of the Concatenated code + #define PARAM_OMEGA Define the parameter omega of the scheme + #define PARAM_OMEGA_E Define the parameter omega_e of the scheme + #define PARAM_OMEGA_R Define the parameter omega_r of the scheme + #define PARAM_SECURITY Define the security level corresponding to the chosen parameters + #define PARAM_DFR_EXP Define the decryption failure rate corresponding to the chosen parameters + + #define SECRET_KEY_BYTES Define the size of the secret key in bytes + #define PUBLIC_KEY_BYTES Define the size of the public key in bytes + #define SHARED_SECRET_BYTES Define the size of the shared secret in bytes + #define CIPHERTEXT_BYTES Define the size of the ciphertext in bytes + + #define UTILS_REJECTION_THRESHOLD Define the rejection threshold used to generate given weight vectors (see vector_set_random_fixed_weight function) + #define VEC_N_SIZE_BYTES Define the size of the array used to store a PARAM_N sized vector in bytes + #define VEC_K_SIZE_BYTES Define the size of the array used to store a PARAM_K sized vector in bytes + #define VEC_N1Y_SIZE_BYTES Define the size of the array used to store a PARAM_N1 sized vector in bytes + #define VEC_N1N2_SIZE_BYTES Define the size of the array used to store a PARAM_N1N2 sized vector in bytes + + #define VEC_N_SIZE_64 Define the size of the array used to store a PARAM_N sized vector in 64 bits + #define VEC_K_SIZE_64 Define the size of the array used to store a PARAM_K sized vector in 64 bits + #define VEC_N1_SIZE_64 Define the size of the array used to store a PARAM_N1 sized vector in 64 bits + #define VEC_N1N2_SIZE_64 Define the size of the array used to store a PARAM_N1N2 sized vector in 64 bits + + #define PARAM_DELTA Define the parameter delta of the scheme (correcting capacity of the Reed-Solomon code) + #define PARAM_M Define a positive integer + #define PARAM_GF_POLY Generator polynomial of galois field GF(2^PARAM_M), represented in hexadecimial form + #define PARAM_GF_MUL_ORDER Define the size of the multiplicative group of GF(2^PARAM_M), i.e 2^PARAM_M -1 + #define PARAM_K Define the size of the information bits of the Reed-Solomon code + #define PARAM_G Define the size of the generator polynomial of Reed-Solomon code + #define PARAM_FFT The additive FFT takes a 2^PARAM_FFT polynomial as input + We use the FFT to compute the roots of sigma, whose degree if PARAM_DELTA=22 + The smallest power of 2 greater than 22+1 is 32=2^5 + #define RS_POLY_COEFS Coefficients of the generator polynomial of the Reed-Solomon code + + #define RED_MASK A mask fot the higher bits of a vector + #define SHA512_BYTES Define the size of SHA512 output in bytes + #define SEED_BYTES Define the size of the seed in bytes + #define SEEDEXPANDER_MAX_LENGTH Define the seed expander max length +*/ + +#define PARAM_N 38923 +#define PARAM_N1 76 +#define PARAM_N2 512 +#define PARAM_N1N2 38912 +#define PARAM_OMEGA 101 +#define PARAM_OMEGA_E 117 +#define PARAM_OMEGA_R 117 +#define PARAM_SECURITY 192 +#define PARAM_DFR_EXP 192 + +#define SECRET_KEY_BYTES PQCLEAN_HQCRMRS192_CLEAN_CRYPTO_SECRETKEYBYTES +#define PUBLIC_KEY_BYTES PQCLEAN_HQCRMRS192_CLEAN_CRYPTO_PUBLICKEYBYTES +#define SHARED_SECRET_BYTES PQCLEAN_HQCRMRS192_CLEAN_CRYPTO_BYTES +#define CIPHERTEXT_BYTES PQCLEAN_HQCRMRS192_CLEAN_CRYPTO_CIPHERTEXTBYTES + +#define UTILS_REJECTION_THRESHOLD 16775813 +#define VEC_N_SIZE_BYTES CEIL_DIVIDE(PARAM_N, 8) +#define VEC_K_SIZE_BYTES PARAM_K +#define VEC_N1_SIZE_BYTES PARAM_N1 +#define VEC_N1N2_SIZE_BYTES CEIL_DIVIDE(PARAM_N1N2, 8) + +#define VEC_N_SIZE_64 CEIL_DIVIDE(PARAM_N, 64) +#define VEC_K_SIZE_64 CEIL_DIVIDE(PARAM_K, 8) +#define VEC_N1_SIZE_64 CEIL_DIVIDE(PARAM_N1, 8) +#define VEC_N1N2_SIZE_64 CEIL_DIVIDE(PARAM_N1N2, 64) + +#define PARAM_DELTA 22 +#define PARAM_M 8 +#define PARAM_GF_POLY 0x11D +#define PARAM_GF_MUL_ORDER 255 +#define PARAM_K 32 +#define PARAM_G 45 +#define PARAM_FFT 5 +#define RS_POLY_COEFS 36,248,168,57,215,30,166,88,196,173,61,214,100,134,168,41,57,216,254,252,68,194,32,234,205,39,99,6,66,127,53,221,1,17,7,219,161,30,173,30,51,95,58,65,1 + +#define RED_MASK 0x7ffUL +#define SHA512_BYTES 64 +#define SEED_BYTES 40 +#define SEEDEXPANDER_MAX_LENGTH 4294967295 + +#endif diff --git a/crypto_kem/hqc-rmrs-192/clean/parsing.c b/crypto_kem/hqc-rmrs-192/clean/parsing.c new file mode 100644 index 00000000..a574517f --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/parsing.c @@ -0,0 +1,121 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file parsing.c + * @brief Functions to parse secret key, public key and ciphertext of the HQC scheme + */ + + + +/** + * @brief Parse a secret key into a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] sk String containing the secret key + * @param[in] sk_seed Seed used to generate the secret key + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS192_CLEAN_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk) { + memcpy(sk, sk_seed, SEED_BYTES); + memcpy(sk + SEED_BYTES, pk, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a secret key from a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] x uint64_t representation of vector x + * @param[out] y uint32_t representation of vector y + * @param[out] pk String containing the public key + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS192_CLEAN_hqc_secret_key_from_string(uint64_t *x, uint32_t *y, uint8_t *pk, const uint8_t *sk) { + AES_XOF_struct sk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + + memcpy(sk_seed, sk, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_fixed_weight_by_coordinates(&sk_seedexpander, y, PARAM_OMEGA); + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a public key into a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] pk String containing the public key + * @param[in] pk_seed Seed used to generate the public key + * @param[in] s uint8_t representation of vector s + */ +void PQCLEAN_HQCRMRS192_CLEAN_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s) { + memcpy(pk, pk_seed, SEED_BYTES); + memcpy(pk + SEED_BYTES, s, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Parse a public key from a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] h uint8_t representation of vector h + * @param[out] s uint8_t representation of vector s + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS192_CLEAN_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk) { + AES_XOF_struct pk_seedexpander; + uint8_t pk_seed[SEED_BYTES] = {0}; + + memcpy(pk_seed, pk, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + PQCLEAN_HQCRMRS192_CLEAN_vect_set_random(&pk_seedexpander, h); + + memcpy(s, pk + SEED_BYTES, VEC_N_SIZE_BYTES); +} + + +/** + * @brief Parse a ciphertext into a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] ct String containing the ciphertext + * @param[in] u uint8_t representation of vector u + * @param[in] v uint8_t representation of vector v + * @param[in] d String containing the hash d + */ +void PQCLEAN_HQCRMRS192_CLEAN_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d) { + memcpy(ct, u, VEC_N_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, d, SHA512_BYTES); +} + + +/** + * @brief Parse a ciphertext from a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] u uint8_t representation of vector u + * @param[out] v uint8_t representation of vector v + * @param[out] d String containing the hash d + * @param[in] ct String containing the ciphertext + */ +void PQCLEAN_HQCRMRS192_CLEAN_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct) { + memcpy(u, ct, VEC_N_SIZE_BYTES); + memcpy(v, ct + VEC_N_SIZE_BYTES, VEC_N1N2_SIZE_BYTES); + memcpy(d, ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, SHA512_BYTES); +} diff --git a/crypto_kem/hqc-rmrs-192/clean/parsing.h b/crypto_kem/hqc-rmrs-192/clean/parsing.h new file mode 100644 index 00000000..bfeb29cb --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/parsing.h @@ -0,0 +1,29 @@ +#ifndef PARSING_H +#define PARSING_H + + +/** + * @file parsing.h + * @brief Header file for parsing.c + */ + +#include + +#include + +void PQCLEAN_HQCRMRS192_CLEAN_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk); + +void PQCLEAN_HQCRMRS192_CLEAN_hqc_secret_key_from_string(uint64_t *x, uint32_t *y, uint8_t *pk, const uint8_t *sk); + + +void PQCLEAN_HQCRMRS192_CLEAN_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s); + +void PQCLEAN_HQCRMRS192_CLEAN_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk); + + +void PQCLEAN_HQCRMRS192_CLEAN_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d); + +void PQCLEAN_HQCRMRS192_CLEAN_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/clean/reed_muller.c b/crypto_kem/hqc-rmrs-192/clean/reed_muller.c new file mode 100644 index 00000000..014be214 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/reed_muller.c @@ -0,0 +1,246 @@ +#include "parameters.h" +#include "reed_muller.h" +#include +#include +/** + * @file reed_muller.c + * Constant time implementation of Reed-Muller code RM(1,7) + */ + +// setting this will help the compiler with auto vectorization +#undef ALIGNVECTORS + + + +// number of repeated code words +#define MULTIPLICITY CEIL_DIVIDE(PARAM_N2, 128) + +// codeword is 128 bits, seen multiple ways +typedef union { + uint8_t u8[16]; + uint32_t u32[4]; +} codeword +; + +// Expanded codeword has a short for every bit, for internal calculations +typedef int16_t expandedCodeword[128] +; + +// copy bit 0 into all bits of a 32 bit value +#define BIT0MASK(x) (int32_t)(-((x) & 1)) + + +static void encode(codeword *word, int32_t message); +static void hadamard(expandedCodeword *src, expandedCodeword *dst); +static void expand_and_sum(expandedCodeword *dest, codeword src[]); +static int32_t find_peaks(expandedCodeword *transform); + + + +/** + * @brief Encode a single byte into a single codeword using RM(1,7) + * + * Encoding matrix of this code: + * bit pattern (note that bits are numbered big endian) + * 0 aaaaaaaa aaaaaaaa aaaaaaaa aaaaaaaa + * 1 cccccccc cccccccc cccccccc cccccccc + * 2 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0 + * 3 ff00ff00 ff00ff00 ff00ff00 ff00ff00 + * 4 ffff0000 ffff0000 ffff0000 ffff0000 + * 5 ffffffff 00000000 ffffffff 00000000 + * 6 ffffffff ffffffff 00000000 00000000 + * 7 ffffffff ffffffff ffffffff ffffffff + * + * @param[out] word An RM(1,7) codeword + * @param[in] message A message + */ +static void encode(codeword *word, int32_t message) { + // the four parts of the word are identical + // except for encoding bits 5 and 6 + int32_t first_word; + // bit 7 flips all the bits, do that first to save work + first_word = BIT0MASK(message >> 7); + // bits 0, 1, 2, 3, 4 are the same for all four longs + // (Warning: in the bit matrix above, low bits are at the left!) + first_word ^= BIT0MASK(message >> 0) & 0xaaaaaaaa; + first_word ^= BIT0MASK(message >> 1) & 0xcccccccc; + first_word ^= BIT0MASK(message >> 2) & 0xf0f0f0f0; + first_word ^= BIT0MASK(message >> 3) & 0xff00ff00; + first_word ^= BIT0MASK(message >> 4) & 0xffff0000; + // we can store this in the first quarter + word->u32[0] = first_word; + // bit 5 flips entries 1 and 3; bit 6 flips 2 and 3 + first_word ^= BIT0MASK(message >> 5); + word->u32[1] = first_word; + first_word ^= BIT0MASK(message >> 6); + word->u32[3] = first_word; + first_word ^= BIT0MASK(message >> 5); + word->u32[2] = first_word; +} + + + +/** + * @brief Hadamard transform + * + * Perform hadamard transform of src and store result in dst + * src is overwritten: it is also used as intermediate buffer + * Method is best explained if we use H(3) instead of H(7): + * + * The routine multiplies by the matrix H(3): + * [1 1 1 1 1 1 1 1] + * [1 -1 1 -1 1 -1 1 -1] + * [1 1 -1 -1 1 1 -1 -1] + * [a b c d e f g h] * [1 -1 -1 1 1 -1 -1 1] = result of routine + * [1 1 1 1 -1 -1 -1 -1] + * [1 -1 1 -1 -1 1 -1 1] + * [1 1 -1 -1 -1 -1 1 1] + * [1 -1 -1 1 -1 1 1 -1] + * You can do this in three passes, where each pass does this: + * set lower half of buffer to pairwise sums, + * and upper half to differences + * index 0 1 2 3 4 5 6 7 + * input: a, b, c, d, e, f, g, h + * pass 1: a+b, c+d, e+f, g+h, a-b, c-d, e-f, g-h + * pass 2: a+b+c+d, e+f+g+h, a-b+c-d, e-f+g-h, a+b-c-d, e+f-g-h, a-b-c+d, e-f-g+h + * pass 3: a+b+c+d+e+f+g+h a+b-c-d+e+f-g-h a+b+c+d-e-f-g-h a+b-c-d-e+-f+g+h + * a-b+c-d+e-f+g-h a-b-c+d+e-f-g+h a-b+c-d-e+f-g+h a-b-c+d-e+f+g-h + * This order of computation is chosen because it vectorises well. + * Likewise, this routine multiplies by H(7) in seven passes. + * + * @param[out] src Structure that contain the expanded codeword + * @param[out] dst Structure that contain the expanded codeword + */ +static void hadamard(expandedCodeword *src, expandedCodeword *dst) { + // the passes move data: + // src -> dst -> src -> dst -> src -> dst -> src -> dst + // using p1 and p2 alternately + expandedCodeword *p1 = src; + expandedCodeword *p2 = dst; + for (int32_t pass = 0 ; pass < 7 ; pass++) { + for (int32_t i = 0 ; i < 64 ; i++) { + (*p2)[i] = (*p1)[2 * i] + (*p1)[2 * i + 1]; + (*p2)[i + 64] = (*p1)[2 * i] - (*p1)[2 * i + 1]; + } + // swap p1, p2 for next round + expandedCodeword *p3 = p1; + p1 = p2; + p2 = p3; + } +} + + + +/** + * @brief Add multiple codewords into expanded codeword + * + * Accesses memory in order + * Note: this does not write the codewords as -1 or +1 as the green machine does + * instead, just 0 and 1 is used. + * The resulting hadamard transform has: + * all values are halved + * the first entry is 64 too high + * + * @param[out] dest Structure that contain the expanded codeword + * @param[in] src Structure that contain the codeword + */ +static void expand_and_sum(expandedCodeword *dest, codeword src[]) { + // start with the first copy + for (int32_t part = 0 ; part < 4 ; part++) { + for (int32_t bit = 0 ; bit < 32 ; bit++) { + (*dest)[part * 32 + bit] = src[0].u32[part] >> bit & 1; + } + } + // sum the rest of the copies + for (int32_t copy = 1 ; copy < MULTIPLICITY ; copy++) { + for (int32_t part = 0 ; part < 4 ; part++) { + for (int32_t bit = 0 ; bit < 32 ; bit++) { + (*dest)[part * 32 + bit] += src[copy].u32[part] >> bit & 1; + } + } + } +} + + + +/** + * @brief Finding the location of the highest value + * + * This is the final step of the green machine: find the location of the highest value, + * and add 128 if the peak is positive + * if there are two identical peaks, the peak with smallest value + * in the lowest 7 bits it taken + * @param[in] transform Structure that contain the expanded codeword + */ +static int32_t find_peaks(expandedCodeword *transform) { + int32_t peak_abs_value = 0; + int32_t peak_value = 0; + int32_t peak_pos = 0; + for (int32_t i = 0 ; i < 128 ; i++) { + // get absolute value + int32_t t = (*transform)[i]; + int32_t pos_mask = -(t > 0); + int32_t absolute = (pos_mask & t) | (~pos_mask & -t); + // all compilers nowadays compile with a conditional move + peak_value = absolute > peak_abs_value ? t : peak_value; + peak_pos = absolute > peak_abs_value ? i : peak_pos; + peak_abs_value = absolute > peak_abs_value ? absolute : peak_abs_value; + } + // set bit 7 + peak_pos |= 128 * (peak_value > 0); + return peak_pos; +} + + + +/** + * @brief Encodes the received word + * + * The message consists of N1 bytes each byte is encoded into PARAM_N2 bits, + * or MULTIPLICITY repeats of 128 bits + * + * @param[out] cdw Array of size VEC_N1N2_SIZE_64 receiving the encoded message + * @param[in] msg Array of size VEC_N1_SIZE_64 storing the message + */ +void PQCLEAN_HQCRMRS192_CLEAN_reed_muller_encode(uint64_t *cdw, const uint64_t *msg) { + uint8_t *message_array = (uint8_t *) msg; + codeword *codeArray = (codeword *) cdw; + for (size_t i = 0 ; i < VEC_N1_SIZE_BYTES ; i++) { + // fill entries i * MULTIPLICITY to (i+1) * MULTIPLICITY + int32_t pos = i * MULTIPLICITY; + // encode first word + encode(&codeArray[pos], message_array[i]); + // copy to other identical codewords + for (size_t copy = 1 ; copy < MULTIPLICITY ; copy++) { + memcpy(&codeArray[pos + copy], &codeArray[pos], sizeof(codeword)); + } + } +} + + + +/** + * @brief Decodes the received word + * + * Decoding uses fast hadamard transform, for a more complete picture on Reed-Muller decoding, see MacWilliams, Florence Jessie, and Neil James Alexander Sloane. + * The theory of error-correcting codes codes @cite macwilliams1977theory + * + * @param[out] msg Array of size VEC_N1_SIZE_64 receiving the decoded message + * @param[in] cdw Array of size VEC_N1N2_SIZE_64 storing the received word + */ +void PQCLEAN_HQCRMRS192_CLEAN_reed_muller_decode(uint64_t *msg, const uint64_t *cdw) { + uint8_t *message_array = (uint8_t *) msg; + codeword *codeArray = (codeword *) cdw; + expandedCodeword expanded; + for (size_t i = 0 ; i < VEC_N1_SIZE_BYTES ; i++) { + // collect the codewords + expand_and_sum(&expanded, &codeArray[i * MULTIPLICITY]); + // apply hadamard transform + expandedCodeword transform; + hadamard(&expanded, &transform); + // fix the first entry to get the half Hadamard transform + transform[0] -= 64 * MULTIPLICITY; + // finish the decoding + message_array[i] = find_peaks(&transform); + } +} diff --git a/crypto_kem/hqc-rmrs-192/clean/reed_muller.h b/crypto_kem/hqc-rmrs-192/clean/reed_muller.h new file mode 100644 index 00000000..2f63af13 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/reed_muller.h @@ -0,0 +1,20 @@ +#ifndef REED_MULLER_H +#define REED_MULLER_H + + +/** + * @file reed_muller.h + * Header file of reed_muller.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS192_CLEAN_reed_muller_encode(uint64_t *cdw, const uint64_t *msg); + +void PQCLEAN_HQCRMRS192_CLEAN_reed_muller_decode(uint64_t *msg, const uint64_t *cdw); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/clean/reed_solomon.c b/crypto_kem/hqc-rmrs-192/clean/reed_solomon.c new file mode 100644 index 00000000..c3e782af --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/reed_solomon.c @@ -0,0 +1,340 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include "reed_solomon.h" +#include +#include +#include +/** + * @file reed_solomon.c + * Constant time implementation of Reed-Solomon codes + */ + + +static void compute_syndromes(uint16_t *syndromes, uint8_t *cdw); +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes); +static void compute_roots(uint8_t *error, uint16_t *sigma); +static void compute_z_poly(uint16_t *z, const uint16_t *sigma, uint8_t degree, const uint16_t *syndromes); +static void compute_error_values(uint16_t *error_values, const uint16_t *z, const uint8_t *error); +static void correct_errors(uint8_t *cdw, const uint16_t *error_values); + +static const uint16_t alpha_ij_pow [44][75] = {{2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15}, {4, 16, 64, 29, 116, 205, 19, 76, 45, 180, 234, 143, 6, 24, 96, 157, 78, 37, 148, 106, 181, 238, 159, 70, 5, 20, 80, 93, 105, 185, 222, 95, 97, 153, 94, 101, 137, 30, 120, 253, 211, 107, 177, 254, 223, 91, 113, 217, 67, 17, 68, 13, 52, 208, 103, 129, 62, 248, 199, 59, 236, 151, 102, 133, 46, 184, 218, 79, 33, 132, 42, 168, 154, 82, 85}, {8, 64, 58, 205, 38, 45, 117, 143, 12, 96, 39, 37, 53, 181, 193, 70, 10, 80, 186, 185, 161, 97, 47, 101, 15, 120, 231, 107, 127, 223, 182, 217, 134, 68, 26, 208, 206, 62, 237, 59, 197, 102, 23, 184, 169, 33, 21, 168, 41, 85, 146, 228, 115, 191, 145, 252, 179, 241, 219, 150, 196, 110, 87, 130, 100, 7, 56, 221, 166, 89, 242, 195, 86, 138, 36}, {16, 29, 205, 76, 180, 143, 24, 157, 37, 106, 238, 70, 20, 93, 185, 95, 153, 101, 30, 253, 107, 254, 91, 217, 17, 13, 208, 129, 248, 59, 151, 133, 184, 79, 132, 168, 82, 73, 228, 230, 198, 252, 123, 227, 150, 149, 165, 130, 200, 28, 221, 81, 121, 195, 172, 18, 61, 247, 203, 44, 250, 27, 173, 2, 32, 58, 135, 152, 117, 3, 48, 39, 74, 212, 193}, {32, 116, 38, 180, 3, 96, 156, 106, 193, 5, 160, 185, 190, 94, 15, 253, 214, 223, 226, 17, 26, 103, 124, 59, 51, 46, 169, 132, 77, 85, 114, 230, 145, 215, 255, 150, 55, 174, 100, 28, 167, 89, 239, 172, 36, 244, 235, 44, 233, 108, 1, 32, 116, 38, 180, 3, 96, 156, 106, 193, 5, 160, 185, 190, 94, 15, 253, 214, 223, 226, 17, 26, 103, 124, 59}, {64, 205, 45, 143, 96, 37, 181, 70, 80, 185, 97, 101, 120, 107, 223, 217, 68, 208, 62, 59, 102, 184, 33, 168, 85, 228, 191, 252, 241, 150, 110, 130, 7, 221, 89, 195, 138, 61, 251, 44, 207, 173, 8, 58, 38, 117, 12, 39, 53, 193, 10, 186, 161, 47, 15, 231, 127, 182, 134, 26, 206, 237, 197, 23, 169, 21, 41, 146, 115, 145, 179, 219, 196, 87, 100}, {128, 19, 117, 24, 156, 181, 140, 93, 161, 94, 60, 107, 163, 67, 26, 129, 147, 102, 109, 132, 41, 57, 209, 252, 255, 98, 87, 200, 224, 89, 155, 18, 245, 11, 233, 173, 16, 232, 45, 3, 157, 53, 159, 40, 185, 194, 137, 231, 254, 226, 68, 189, 248, 197, 46, 158, 168, 170, 183, 145, 123, 75, 110, 25, 28, 166, 249, 69, 61, 235, 176, 54, 2, 29, 38}, {29, 76, 143, 157, 106, 70, 93, 95, 101, 253, 254, 217, 13, 129, 59, 133, 79, 168, 73, 230, 252, 227, 149, 130, 28, 81, 195, 18, 247, 44, 27, 2, 58, 152, 3, 39, 212, 140, 186, 190, 202, 231, 225, 175, 26, 31, 118, 23, 158, 77, 146, 209, 229, 219, 55, 25, 56, 162, 155, 36, 243, 88, 54, 4, 116, 45, 6, 78, 181, 5, 105, 97, 137, 211, 223}, {58, 45, 12, 37, 193, 80, 161, 101, 231, 223, 134, 208, 237, 102, 169, 168, 146, 191, 179, 150, 87, 7, 166, 195, 36, 251, 125, 173, 64, 38, 143, 39, 181, 10, 185, 47, 120, 127, 217, 26, 62, 197, 184, 21, 85, 115, 252, 219, 110, 100, 221, 242, 138, 245, 44, 54, 8, 205, 117, 96, 53, 70, 186, 97, 15, 107, 182, 68, 206, 59, 23, 33, 41, 228, 145}, {116, 180, 96, 106, 5, 185, 94, 253, 223, 17, 103, 59, 46, 132, 85, 230, 215, 150, 174, 28, 89, 172, 244, 44, 108, 32, 38, 3, 156, 193, 160, 190, 15, 214, 226, 26, 124, 51, 169, 77, 114, 145, 255, 55, 100, 167, 239, 36, 235, 233, 1, 116, 180, 96, 106, 5, 185, 94, 253, 223, 17, 103, 59, 46, 132, 85, 230, 215, 150, 174, 28, 89, 172, 244, 44}, {232, 234, 39, 238, 160, 97, 60, 254, 134, 103, 118, 184, 84, 57, 145, 227, 220, 7, 162, 172, 245, 176, 71, 58, 180, 192, 181, 40, 95, 15, 177, 175, 208, 147, 46, 21, 73, 99, 241, 55, 200, 166, 43, 122, 44, 216, 128, 45, 48, 106, 10, 222, 202, 107, 226, 52, 237, 133, 66, 85, 209, 123, 196, 50, 167, 195, 144, 11, 54, 32, 76, 12, 148, 140, 185}, {205, 143, 37, 70, 185, 101, 107, 217, 208, 59, 184, 168, 228, 252, 150, 130, 221, 195, 61, 44, 173, 58, 117, 39, 193, 186, 47, 231, 182, 26, 237, 23, 21, 146, 145, 219, 87, 56, 242, 36, 139, 54, 64, 45, 96, 181, 80, 97, 120, 223, 68, 62, 102, 33, 85, 191, 241, 110, 7, 89, 138, 251, 207, 8, 38, 12, 53, 10, 161, 15, 127, 134, 206, 197, 169}, {135, 6, 53, 20, 190, 120, 163, 13, 237, 46, 84, 228, 229, 98, 100, 81, 69, 251, 131, 32, 45, 192, 238, 186, 94, 187, 217, 189, 236, 169, 82, 209, 241, 220, 28, 242, 72, 22, 173, 116, 201, 37, 140, 222, 15, 254, 34, 62, 204, 132, 146, 63, 75, 130, 167, 43, 245, 250, 4, 38, 24, 212, 80, 194, 253, 182, 52, 147, 184, 77, 183, 179, 149, 141, 89}, {19, 24, 181, 93, 94, 107, 67, 129, 102, 132, 57, 252, 98, 200, 89, 18, 11, 173, 232, 3, 53, 40, 194, 231, 226, 189, 197, 158, 170, 145, 75, 25, 166, 69, 235, 54, 29, 234, 37, 5, 95, 120, 91, 52, 59, 218, 82, 191, 227, 174, 221, 43, 247, 207, 32, 90, 39, 35, 111, 15, 225, 136, 237, 92, 77, 115, 246, 220, 56, 239, 122, 125, 4, 76, 96}, {38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26}, {76, 157, 70, 95, 253, 217, 129, 133, 168, 230, 227, 130, 81, 18, 44, 2, 152, 39, 140, 190, 231, 175, 31, 23, 77, 209, 219, 25, 162, 36, 88, 4, 45, 78, 5, 97, 211, 67, 62, 46, 154, 191, 171, 50, 89, 72, 176, 8, 90, 156, 10, 194, 187, 134, 124, 92, 41, 99, 75, 100, 178, 144, 125, 16, 180, 37, 20, 153, 107, 17, 248, 184, 82, 198, 150}, {152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1}, {45, 37, 80, 101, 223, 208, 102, 168, 191, 150, 7, 195, 251, 173, 38, 39, 10, 47, 127, 26, 197, 21, 115, 219, 100, 242, 245, 54, 205, 96, 70, 97, 107, 68, 59, 33, 228, 241, 130, 89, 61, 207, 58, 12, 193, 161, 231, 134, 237, 169, 146, 179, 87, 166, 36, 125, 64, 143, 181, 185, 120, 217, 62, 184, 85, 252, 110, 221, 138, 44, 8, 117, 53, 186, 15}, {90, 148, 186, 30, 226, 62, 109, 73, 179, 174, 162, 61, 131, 232, 96, 140, 153, 127, 52, 51, 168, 99, 98, 56, 172, 22, 8, 234, 212, 185, 240, 67, 237, 79, 114, 241, 25, 121, 245, 108, 19, 39, 20, 188, 223, 189, 133, 41, 63, 55, 221, 9, 176, 64, 3, 238, 161, 211, 34, 59, 66, 183, 219, 200, 239, 251, 71, 152, 37, 160, 137, 182, 129, 92, 85}, {180, 106, 185, 253, 17, 59, 132, 230, 150, 28, 172, 44, 32, 3, 193, 190, 214, 26, 51, 77, 145, 55, 167, 36, 233, 116, 96, 5, 94, 223, 103, 46, 85, 215, 174, 89, 244, 108, 38, 156, 160, 15, 226, 124, 169, 114, 255, 100, 239, 235, 1, 180, 106, 185, 253, 17, 59, 132, 230, 150, 28, 172, 44, 32, 3, 193, 190, 214, 26, 51, 77, 145, 55, 167, 36}, {117, 181, 161, 107, 26, 102, 41, 252, 87, 89, 245, 173, 45, 53, 185, 231, 68, 197, 168, 145, 110, 166, 61, 54, 38, 37, 186, 120, 134, 59, 21, 191, 196, 221, 36, 207, 205, 39, 80, 15, 217, 237, 33, 115, 150, 56, 138, 125, 58, 96, 10, 101, 182, 62, 169, 228, 219, 7, 86, 44, 64, 12, 70, 47, 223, 206, 184, 146, 241, 100, 195, 139, 8, 143, 193}, {234, 238, 97, 254, 103, 184, 57, 227, 7, 172, 176, 58, 192, 40, 15, 175, 147, 21, 99, 55, 166, 122, 216, 45, 106, 222, 107, 52, 133, 85, 123, 50, 195, 11, 32, 12, 140, 188, 182, 124, 158, 115, 49, 224, 36, 131, 19, 37, 105, 253, 68, 151, 154, 252, 174, 121, 251, 2, 201, 193, 194, 225, 206, 109, 114, 219, 14, 69, 125, 116, 157, 80, 30, 67, 59}, {201, 159, 47, 91, 124, 33, 209, 149, 166, 244, 71, 117, 238, 194, 223, 31, 79, 115, 98, 167, 61, 216, 90, 181, 190, 254, 206, 218, 213, 150, 224, 72, 54, 152, 106, 161, 177, 189, 184, 114, 171, 56, 18, 131, 38, 148, 111, 107, 104, 46, 146, 227, 14, 138, 233, 135, 37, 210, 211, 26, 133, 170, 241, 141, 172, 125, 232, 78, 186, 253, 136, 102, 164, 123, 100}, {143, 70, 101, 217, 59, 168, 252, 130, 195, 44, 58, 39, 186, 231, 26, 23, 146, 219, 56, 36, 54, 45, 181, 97, 223, 62, 33, 191, 110, 89, 251, 8, 12, 10, 15, 134, 197, 41, 179, 100, 86, 125, 205, 37, 185, 107, 208, 184, 228, 150, 221, 61, 173, 117, 193, 47, 182, 237, 21, 145, 87, 242, 139, 64, 96, 80, 120, 68, 102, 85, 241, 7, 138, 207, 38}, {3, 5, 15, 17, 51, 85, 255, 28, 36, 108, 180, 193, 94, 226, 59, 77, 215, 100, 172, 233, 38, 106, 190, 223, 124, 132, 145, 174, 239, 44, 116, 156, 185, 214, 103, 169, 230, 55, 89, 235, 32, 96, 160, 253, 26, 46, 114, 150, 167, 244, 1, 3, 5, 15, 17, 51, 85, 255, 28, 36, 108, 180, 193, 94, 226, 59, 77, 215, 100, 172, 233, 38, 106, 190, 223}, {6, 20, 120, 13, 46, 228, 98, 81, 251, 32, 192, 186, 187, 189, 169, 209, 220, 242, 22, 116, 37, 222, 254, 62, 132, 63, 130, 43, 250, 38, 212, 194, 182, 147, 77, 179, 141, 9, 54, 180, 159, 101, 67, 151, 85, 227, 112, 61, 142, 3, 10, 60, 136, 23, 114, 49, 166, 243, 16, 96, 93, 211, 208, 218, 230, 110, 121, 11, 58, 156, 111, 127, 31, 66, 145}, {12, 80, 231, 208, 169, 191, 87, 195, 125, 38, 181, 47, 217, 197, 85, 219, 221, 245, 8, 96, 186, 107, 206, 33, 145, 130, 86, 207, 45, 193, 101, 134, 102, 146, 150, 166, 251, 64, 39, 185, 127, 62, 21, 252, 100, 138, 54, 117, 70, 15, 68, 23, 228, 196, 89, 139, 58, 37, 161, 223, 237, 168, 179, 7, 36, 173, 143, 10, 120, 26, 184, 115, 110, 242, 44}, {24, 93, 107, 129, 132, 252, 200, 18, 173, 3, 40, 231, 189, 158, 145, 25, 69, 54, 234, 5, 120, 52, 218, 191, 174, 43, 207, 90, 35, 15, 136, 92, 115, 220, 239, 125, 76, 238, 101, 17, 133, 228, 149, 121, 44, 135, 212, 47, 175, 51, 146, 49, 162, 139, 116, 148, 97, 113, 236, 85, 171, 83, 251, 128, 156, 161, 163, 147, 41, 255, 224, 245, 16, 157, 185}, {48, 105, 127, 248, 77, 241, 224, 247, 64, 156, 95, 182, 236, 170, 150, 162, 11, 205, 212, 94, 134, 133, 213, 110, 239, 250, 45, 35, 30, 26, 218, 99, 130, 69, 108, 143, 40, 211, 206, 132, 229, 7, 144, 2, 96, 210, 254, 237, 154, 255, 221, 243, 128, 37, 190, 113, 197, 73, 49, 89, 22, 135, 181, 188, 17, 23, 183, 220, 195, 233, 90, 70, 60, 52, 169}, {96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89}, {192, 222, 182, 151, 114, 110, 155, 27, 143, 160, 177, 237, 82, 75, 89, 88, 152, 70, 240, 103, 21, 123, 224, 251, 116, 212, 101, 136, 218, 145, 200, 144, 8, 78, 190, 217, 204, 183, 87, 172, 216, 12, 105, 225, 59, 170, 98, 242, 250, 180, 10, 211, 31, 168, 255, 83, 139, 135, 238, 15, 52, 158, 252, 14, 244, 64, 74, 153, 134, 46, 209, 130, 9, 142, 96}, {157, 95, 217, 133, 230, 130, 18, 2, 39, 190, 175, 23, 209, 25, 36, 4, 78, 97, 67, 46, 191, 50, 72, 8, 156, 194, 134, 92, 99, 100, 144, 16, 37, 153, 17, 184, 198, 200, 61, 32, 74, 47, 34, 109, 145, 141, 122, 64, 148, 94, 68, 218, 63, 7, 244, 128, 53, 188, 136, 169, 126, 14, 245, 29, 106, 101, 13, 79, 252, 28, 247, 58, 212, 202, 26}, {39, 97, 134, 184, 145, 7, 245, 58, 181, 15, 208, 21, 241, 166, 44, 45, 10, 107, 237, 85, 196, 195, 54, 12, 185, 182, 102, 115, 130, 36, 8, 37, 47, 68, 169, 252, 56, 251, 205, 193, 120, 206, 168, 219, 89, 125, 117, 80, 127, 59, 146, 110, 86, 173, 96, 161, 217, 23, 191, 100, 61, 64, 53, 101, 26, 33, 179, 221, 139, 38, 70, 231, 62, 41, 150}, {78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1}, {156, 94, 26, 132, 255, 89, 233, 3, 185, 226, 46, 145, 28, 235, 38, 5, 214, 59, 114, 174, 36, 32, 106, 15, 103, 77, 150, 239, 108, 96, 190, 17, 169, 215, 167, 44, 180, 160, 223, 51, 230, 100, 244, 116, 193, 253, 124, 85, 55, 172, 1, 156, 94, 26, 132, 255, 89, 233, 3, 185, 226, 46, 145, 28, 235, 38, 5, 214, 59, 114, 174, 36, 32, 106, 15}, {37, 101, 208, 168, 150, 195, 173, 39, 47, 26, 21, 219, 242, 54, 96, 97, 68, 33, 241, 89, 207, 12, 161, 134, 169, 179, 166, 125, 143, 185, 217, 184, 252, 221, 44, 117, 186, 182, 23, 145, 56, 139, 45, 80, 223, 102, 191, 7, 251, 38, 10, 127, 197, 115, 100, 245, 205, 70, 107, 59, 228, 130, 61, 58, 193, 231, 237, 146, 87, 36, 64, 181, 120, 62, 85}, {74, 137, 206, 82, 55, 138, 16, 212, 120, 124, 73, 87, 72, 29, 193, 211, 147, 228, 25, 244, 205, 140, 177, 197, 230, 141, 251, 76, 40, 223, 204, 198, 56, 11, 180, 186, 113, 92, 252, 167, 176, 143, 111, 67, 169, 123, 162, 207, 24, 190, 68, 66, 227, 242, 108, 157, 47, 52, 84, 150, 155, 142, 37, 202, 103, 41, 149, 69, 8, 106, 60, 62, 170, 165, 36}, {148, 30, 62, 73, 174, 61, 232, 140, 127, 51, 99, 56, 22, 234, 185, 67, 79, 241, 121, 108, 39, 188, 189, 41, 55, 9, 64, 238, 211, 59, 183, 200, 251, 152, 160, 182, 92, 229, 166, 233, 24, 97, 13, 42, 150, 43, 2, 53, 60, 124, 146, 65, 122, 205, 5, 254, 102, 198, 112, 44, 201, 111, 134, 158, 255, 242, 216, 78, 101, 103, 82, 110, 18, 128, 193}, {53, 120, 237, 228, 100, 251, 45, 186, 217, 169, 241, 242, 173, 37, 15, 62, 146, 130, 245, 38, 80, 182, 184, 179, 89, 54, 39, 101, 206, 85, 87, 61, 205, 10, 223, 23, 252, 166, 207, 96, 47, 208, 41, 110, 36, 58, 70, 127, 102, 145, 221, 125, 12, 97, 26, 168, 196, 138, 64, 193, 107, 197, 191, 56, 44, 143, 161, 68, 21, 150, 86, 8, 181, 231, 59}, {106, 253, 59, 230, 28, 44, 3, 190, 26, 77, 55, 36, 116, 5, 223, 46, 215, 89, 108, 156, 15, 124, 114, 100, 235, 180, 185, 17, 132, 150, 172, 32, 193, 214, 51, 145, 167, 233, 96, 94, 103, 85, 174, 244, 38, 160, 226, 169, 255, 239, 1, 106, 253, 59, 230, 28, 44, 3, 190, 26, 77, 55, 36, 116, 5, 223, 46, 215, 89, 108, 156, 15, 124, 114, 100}, {212, 211, 197, 198, 167, 207, 157, 202, 62, 114, 200, 139, 201, 95, 26, 154, 220, 61, 19, 160, 217, 158, 171, 86, 32, 159, 127, 133, 229, 89, 216, 74, 120, 147, 230, 56, 176, 24, 47, 103, 170, 130, 243, 90, 185, 34, 42, 196, 18, 116, 10, 91, 109, 241, 239, 2, 181, 187, 151, 145, 83, 131, 39, 137, 124, 228, 141, 11, 143, 190, 52, 41, 165, 122, 38}, {181, 107, 102, 252, 89, 173, 53, 231, 197, 145, 166, 54, 37, 120, 59, 191, 221, 207, 39, 15, 237, 115, 56, 125, 96, 101, 62, 228, 7, 44, 12, 47, 206, 146, 100, 139, 143, 97, 208, 85, 130, 251, 117, 161, 26, 41, 87, 245, 45, 185, 68, 168, 110, 61, 38, 186, 134, 21, 196, 36, 205, 80, 217, 33, 150, 138, 58, 10, 182, 169, 219, 86, 64, 70, 223}, {119, 177, 23, 123, 239, 8, 159, 225, 184, 255, 43, 64, 140, 91, 169, 171, 69, 58, 20, 226, 33, 49, 18, 205, 160, 67, 21, 149, 144, 38, 105, 34, 168, 220, 244, 45, 111, 13, 41, 174, 243, 117, 95, 104, 85, 25, 203, 143, 194, 103, 146, 200, 22, 12, 94, 31, 228, 14, 176, 96, 202, 248, 115, 112, 233, 39, 30, 147, 191, 167, 27, 37, 240, 236, 145}, {238, 254, 184, 227, 172, 58, 40, 175, 21, 55, 122, 45, 222, 52, 85, 50, 11, 12, 188, 124, 115, 224, 131, 37, 253, 151, 252, 121, 2, 193, 225, 109, 219, 69, 116, 80, 67, 42, 110, 244, 90, 161, 104, 170, 100, 22, 24, 101, 248, 230, 221, 27, 74, 231, 51, 229, 242, 4, 159, 223, 218, 171, 138, 232, 160, 134, 84, 220, 245, 180, 95, 208, 73, 200, 44}}; + + + +/** + * @brief Encodes a message message of PARAM_K bits to a Reed-Solomon codeword codeword of PARAM_N1 bytes + * + * Following @cite lin1983error (Chapter 4 - Cyclic Codes), + * We perform a systematic encoding using a linear (PARAM_N1 - PARAM_K)-stage shift register + * with feedback connections based on the generator polynomial PARAM_RS_POLY of the Reed-Solomon code. + * + * @param[out] cdw Array of size VEC_N1_SIZE_64 receiving the encoded message + * @param[in] msg Array of size VEC_K_SIZE_64 storing the message + */ +void PQCLEAN_HQCRMRS192_CLEAN_reed_solomon_encode(uint64_t *cdw, const uint64_t *msg) { + uint8_t gate_value = 0; + + uint16_t tmp[PARAM_G] = {0}; + uint16_t PARAM_RS_POLY [] = {RS_POLY_COEFS}; + + uint8_t msg_bytes[PARAM_K] = {0}; + uint8_t cdw_bytes[PARAM_N1] = {0}; + + for (size_t i = 0 ; i < VEC_K_SIZE_64 ; ++i) { + for (size_t j = 0 ; j < 8 ; ++j) { + msg_bytes[i * 8 + j] = (uint8_t) (msg[i] >> (j * 8)); + } + } + + for (int i = PARAM_K - 1 ; i >= 0 ; --i) { + gate_value = msg_bytes[i] ^ cdw_bytes[PARAM_N1 - PARAM_K - 1]; + + for (size_t j = 0 ; j < PARAM_G ; ++j) { + tmp[j] = PQCLEAN_HQCRMRS192_CLEAN_gf_mul(gate_value, PARAM_RS_POLY[j]); + } + + for (size_t k = PARAM_N1 - PARAM_K - 1 ; k ; --k) { + cdw_bytes[k] = cdw_bytes[k - 1] ^ tmp[k]; + } + + cdw_bytes[0] = tmp[0]; + } + + memcpy(cdw_bytes + PARAM_N1 - PARAM_K, msg_bytes, PARAM_K); + memcpy(cdw, cdw_bytes, PARAM_N1); +} + + + +/** + * @brief Computes 2 * PARAM_DELTA syndromes + * + * @param[out] syndromes Array of size 2 * PARAM_DELTA receiving the computed syndromes + * @param[in] cdw Array of size PARAM_N1 storing the received vector + */ +void compute_syndromes(uint16_t *syndromes, uint8_t *cdw) { + for (size_t i = 0 ; i < 2 * PARAM_DELTA ; ++i) { + for (size_t j = 1 ; j < PARAM_N1 ; ++j) { + syndromes[i] ^= PQCLEAN_HQCRMRS192_CLEAN_gf_mul(cdw[j], alpha_ij_pow[i][j - 1]); + } + syndromes[i] ^= cdw[0]; + } +} + + + +/** + * @brief Computes the error locator polynomial (ELP) sigma + * + * This is a constant time implementation of Berlekamp's simplified algorithm (see @cite lin1983error (Chapter 6 - BCH Codes).
+ * We use the letter p for rho which is initialized at -1.
+ * The array X_sigma_p represents the polynomial X^(mu-rho)*sigma_p(X).
+ * Instead of maintaining a list of sigmas, we update in place both sigma and X_sigma_p.
+ * sigma_copy serves as a temporary save of sigma in case X_sigma_p needs to be updated.
+ * We can properly correct only if the degree of sigma does not exceed PARAM_DELTA. + * This means only the first PARAM_DELTA + 1 coefficients of sigma are of value + * and we only need to save its first PARAM_DELTA - 1 coefficients. + * + * @returns the degree of the ELP sigma + * @param[out] sigma Array of size (at least) PARAM_DELTA receiving the ELP + * @param[in] syndromes Array of size (at least) 2*PARAM_DELTA storing the syndromes + */ +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes) { + sigma[0] = 1; + size_t deg_sigma = 0; + size_t deg_sigma_p = 0; + uint16_t sigma_copy[PARAM_DELTA + 1] = {0}; + size_t deg_sigma_copy = 0; + uint16_t X_sigma_p[PARAM_DELTA + 1] = {0, 1}; + int32_t pp = -1; // 2*rho + uint16_t d_p = 1; + uint16_t d = syndromes[0]; + + for (size_t mu = 0 ; (mu < (2 * PARAM_DELTA)) ; ++mu) { + // Save sigma in case we need it to update X_sigma_p + memcpy(sigma_copy, sigma, 2 * (PARAM_DELTA)); + deg_sigma_copy = deg_sigma; + + uint16_t dd = PQCLEAN_HQCRMRS192_CLEAN_gf_mul(d, PQCLEAN_HQCRMRS192_CLEAN_gf_inverse(d_p)); + + for (size_t i = 1 ; (i <= mu + 1) && (i <= PARAM_DELTA) ; ++i) { + sigma[i] ^= PQCLEAN_HQCRMRS192_CLEAN_gf_mul(dd, X_sigma_p[i]); + } + + size_t deg_X = mu - pp; + size_t deg_X_sigma_p = deg_X + deg_sigma_p; + + // mask1 = 0xffff if(d != 0) and 0 otherwise + int16_t mask1 = -((uint16_t) - d >> 15); + + // mask2 = 0xffff if(deg_X_sigma_p > deg_sigma) and 0 otherwise + int16_t mask2 = -((uint16_t) (deg_sigma - deg_X_sigma_p) >> 15); + + // mask12 = 0xffff if the deg_sigma increased and 0 otherwise + int16_t mask12 = mask1 & mask2; + deg_sigma = (mask12 & deg_X_sigma_p) ^ (~mask12 & deg_sigma); + + if (mu == (2 * PARAM_DELTA - 1)) { + break; + } + + pp = (mask12 & mu) ^ (~mask12 & pp); + d_p = (mask12 & d) ^ (~mask12 & d_p); + for (size_t i = PARAM_DELTA ; i ; --i) { + X_sigma_p[i] = (mask12 & sigma_copy[i - 1]) ^ (~mask12 & X_sigma_p[i - 1]); + } + + deg_sigma_p = (mask12 & deg_sigma_copy) ^ (~mask12 & deg_sigma_p); + d = syndromes[mu + 1]; + + for (size_t i = 1 ; (i <= mu + 1) && (i <= PARAM_DELTA) ; ++i) { + d ^= PQCLEAN_HQCRMRS192_CLEAN_gf_mul(sigma[i], syndromes[mu + 1 - i]); + } + } + + return deg_sigma; +} + + + +/** + * @brief Computes the error polynomial error from the error locator polynomial sigma + * + * See function PQCLEAN_HQCRMRS192_CLEAN_fft for more details. + * + * @param[out] error Array of 2^PARAM_M elements receiving the error polynomial + * @param[out] error_compact Array of PARAM_DELTA + PARAM_N1 elements receiving a compact representation of the vector error + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + */ +static void compute_roots(uint8_t *error, uint16_t *sigma) { + uint16_t w[1 << PARAM_M] = {0}; + + PQCLEAN_HQCRMRS192_CLEAN_fft(w, sigma, PARAM_DELTA + 1); + PQCLEAN_HQCRMRS192_CLEAN_fft_retrieve_error_poly(error, w); +} + + + +/** + * @brief Computes the polynomial z(x) + * + * See @cite lin1983error (Chapter 6 - BCH Codes) for more details. + * + * @param[out] z Array of PARAM_DELTA + 1 elements receiving the polynomial z(x) + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + * @param[in] degree Integer that is the degree of polynomial sigma + * @param[in] syndromes Array of 2 * PARAM_DELTA storing the syndromes + */ +static void compute_z_poly(uint16_t *z, const uint16_t *sigma, uint8_t degree, const uint16_t *syndromes) { + z[0] = 1; + + for (size_t i = 1 ; i < PARAM_DELTA + 1 ; ++i) { + int16_t mask2 = -((uint16_t) (i - degree - 1) >> 15); + z[i] = ((uint16_t)mask2) & sigma[i]; + } + + z[1] ^= syndromes[0]; + + for (size_t i = 2 ; i <= PARAM_DELTA ; ++i) { + int16_t mask2 = -((uint16_t) (i - degree - 1) >> 15); + z[i] ^= ((uint16_t)mask2 & syndromes[i - 1]); + + for (size_t j = 1 ; j < i ; ++j) { + z[i] ^= ((uint16_t)mask2) & PQCLEAN_HQCRMRS192_CLEAN_gf_mul(sigma[j], syndromes[i - j - 1]); + } + } +} + + + +/** + * @brief Computes the error values + * + * See @cite lin1983error (Chapter 6 - BCH Codes) for more details. + * + * @param[out] error_values Array of PARAM_DELTA elements receiving the error values + * @param[in] z Array of PARAM_DELTA + 1 elements storing the polynomial z(x) + * @param[in] z_degree Integer that is the degree of polynomial z(x) + * @param[in] error_compact Array of PARAM_DELTA + PARAM_N1 storing compact representation of the error + */ +static void compute_error_values(uint16_t *error_values, const uint16_t *z, const uint8_t *error) { + uint16_t beta_j[PARAM_DELTA] = {0}; + uint16_t e_j[PARAM_DELTA] = {0}; + + uint16_t delta_counter = 0; + uint16_t delta_real_value; + + // Compute the beta_{j_i} page 31 of the documentation + for (size_t i = 0 ; i < PARAM_N1 ; i++) { + uint16_t found = 0; + int16_t valuemask = ((int16_t) - (error[i] != 0)) >> 15; + for (size_t j = 0 ; j < PARAM_DELTA ; j++) { + int16_t indexmask = ((int16_t) - (j == delta_counter)) >> 15; + beta_j[j] += indexmask & valuemask & exp[i]; + found += indexmask & valuemask & 1; + } + delta_counter += found; + } + delta_real_value = delta_counter; + + // Compute the e_{j_i} page 31 of the documentation + for (size_t i = 0 ; i < PARAM_DELTA ; ++i) { + uint16_t tmp1 = 1; + uint16_t tmp2 = 1; + uint16_t inverse = PQCLEAN_HQCRMRS192_CLEAN_gf_inverse(beta_j[i]); + uint16_t inverse_power_j = 1; + + for (size_t j = 1 ; j <= PARAM_DELTA ; ++j) { + inverse_power_j = PQCLEAN_HQCRMRS192_CLEAN_gf_mul(inverse_power_j, inverse); + tmp1 ^= PQCLEAN_HQCRMRS192_CLEAN_gf_mul(inverse_power_j, z[j]); + } + for (size_t k = 1 ; k < PARAM_DELTA ; ++k) { + tmp2 = PQCLEAN_HQCRMRS192_CLEAN_gf_mul(tmp2, (1 ^ PQCLEAN_HQCRMRS192_CLEAN_gf_mul(inverse, beta_j[(i + k) % PARAM_DELTA]))); + } + int16_t mask = ((int16_t) - (i < delta_real_value)) >> 15; + e_j[i] = mask & PQCLEAN_HQCRMRS192_CLEAN_gf_mul(tmp1, PQCLEAN_HQCRMRS192_CLEAN_gf_inverse(tmp2)); + } + + // Place the delta e_{j_i} values at the right coordinates of the output vector + delta_counter = 0; + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + uint16_t found = 0; + int16_t valuemask = ((int16_t) - (error[i] != 0)) >> 15; + for (size_t j = 0 ; j < PARAM_DELTA ; j++) { + int16_t indexmask = ((int16_t) - (j == delta_counter)) >> 15; + error_values[i] += indexmask & valuemask & e_j[j]; + found += indexmask & valuemask & 1; + } + delta_counter += found; + } +} + + + +/** + * @brief Correct the errors + * + * @param[out] cdw Array of PARAM_N1 elements receiving the corrected vector + * @param[in] error Array of the error vector + * @param[in] error_values Array of PARAM_DELTA elements storing the error values + */ +static void correct_errors(uint8_t *cdw, const uint16_t *error_values) { + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + cdw[i] ^= error_values[i]; + } +} + + + +/** + * @brief Decodes the received word + * + * This function relies on six steps: + *
    + *
  1. The first step, is the computation of the 2*PARAM_DELTA syndromes. + *
  2. The second step is the computation of the error-locator polynomial sigma. + *
  3. The third step, done by additive FFT, is finding the error-locator numbers by calculating the roots of the polynomial sigma and takings their inverses. + *
  4. The fourth step, is the polynomial z(x). + *
  5. The fifth step, is the computation of the error values. + *
  6. The sixth step is the correction of the errors in the received polynomial. + *
+ * For a more complete picture on Reed-Solomon decoding, see Shu. Lin and Daniel J. Costello in Error Control Coding: Fundamentals and Applications @cite lin1983error + * + * @param[out] msg Array of size VEC_K_SIZE_64 receiving the decoded message + * @param[in] cdw Array of size VEC_N1_SIZE_64 storing the received word + */ +void PQCLEAN_HQCRMRS192_CLEAN_reed_solomon_decode(uint64_t *msg, uint64_t *cdw) { + uint8_t cdw_bytes[PARAM_N1] = {0}; + uint16_t syndromes[2 * PARAM_DELTA] = {0}; + uint16_t sigma[1 << PARAM_FFT] = {0}; + uint8_t error[1 << PARAM_M] = {0}; + uint16_t z[PARAM_N1] = {0}; + uint16_t error_values[PARAM_N1] = {0}; + + // Copy the vector in an array of bytes + memcpy(cdw_bytes, cdw, PARAM_N1); + + // Calculate the 2*PARAM_DELTA syndromes + compute_syndromes(syndromes, cdw_bytes); + + // Compute the error locator polynomial sigma + // Sigma's degree is at most PARAM_DELTA but the FFT requires the extra room + size_t deg = compute_elp(sigma, syndromes); + + // Compute the error polynomial error + compute_roots(error, sigma); + + // Compute the polynomial z(x) + compute_z_poly(z, sigma, deg, syndromes); + + // Compute the error values + compute_error_values(error_values, z, error); + + // Correct the errors + correct_errors(cdw_bytes, error_values); + + // Retrieve the message from the decoded codeword + memcpy(msg, cdw_bytes + (PARAM_G - 1), PARAM_K); + +} diff --git a/crypto_kem/hqc-rmrs-192/clean/reed_solomon.h b/crypto_kem/hqc-rmrs-192/clean/reed_solomon.h new file mode 100644 index 00000000..8f9525d3 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/reed_solomon.h @@ -0,0 +1,20 @@ +#ifndef REED_SOLOMON_H +#define REED_SOLOMON_H + + +/** + * @file reed_solomon.h + * Header file of reed_solomon.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS192_CLEAN_reed_solomon_encode(uint64_t *cdw, const uint64_t *msg); + +void PQCLEAN_HQCRMRS192_CLEAN_reed_solomon_decode(uint64_t *msg, uint64_t *cdw); + + +#endif diff --git a/crypto_kem/hqc-rmrs-192/clean/vector.c b/crypto_kem/hqc-rmrs-192/clean/vector.c new file mode 100644 index 00000000..05db4963 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/vector.c @@ -0,0 +1,226 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file vector.c + * @brief Implementation of vectors sampling and some utilities for the HQC scheme + */ + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. The vector + * is stored by position. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_fixed_weight_by_coordinates(AES_XOF_struct *ctx, uint32_t *v, uint16_t weight) { + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; // weight is expected to be <= PARAM_OMEGA_R + uint32_t random_data = 0; + uint8_t exist = 0; + size_t j = 0; + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (v[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + v[i] = random_data; + } + } +} + + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight) { + + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; // weight is expected to be <= PARAM_OMEGA_R + uint32_t random_data = 0; + uint32_t tmp[PARAM_OMEGA_R] = {0}; + uint8_t exist = 0; + size_t j = 0; + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (tmp[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + tmp[i] = random_data; + } + } + + for (uint16_t i = 0 ; i < weight ; ++i) { + int32_t index = tmp[i] / 64; + int32_t pos = tmp[i] % 64; + v[index] |= ((uint64_t) 1) << pos; + } +} + + + +/** + * @brief Generates a random vector of dimension PARAM_N + * + * This function generates a random binary vector of dimension PARAM_N. It generates a random + * array of bytes using the seedexpander function, and drop the extra bits using a mask. + * + * @param[in] v Pointer to an array + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS192_CLEAN_vect_set_random(AES_XOF_struct *ctx, uint64_t *v) { + uint8_t rand_bytes[VEC_N_SIZE_BYTES] = {0}; + + seedexpander(ctx, rand_bytes, VEC_N_SIZE_BYTES); + + memcpy(v, rand_bytes, VEC_N_SIZE_BYTES); + v[VEC_N_SIZE_64 - 1] &= BITMASK(PARAM_N, 64); +} + + + +/** + * @brief Generates a random vector + * + * This function generates a random binary vector. It uses the the randombytes function. + * + * @param[in] v Pointer to an array + */ +void PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_from_randombytes(uint64_t *v) { + uint8_t rand_bytes [VEC_K_SIZE_BYTES] = {0}; + + randombytes(rand_bytes, VEC_K_SIZE_BYTES); + memcpy(v, rand_bytes, VEC_K_SIZE_BYTES); +} + + + +/** + * @brief Adds two vectors + * + * @param[out] o Pointer to an array that is the result + * @param[in] v1 Pointer to an array that is the first vector + * @param[in] v2 Pointer to an array that is the second vector + * @param[in] size Integer that is the size of the vectors + */ +void PQCLEAN_HQCRMRS192_CLEAN_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size) { + for (uint32_t i = 0 ; i < size ; ++i) { + o[i] = v1[i] ^ v2[i]; + } +} + + +/** + * @brief Compares two vectors + * + * @param[in] v1 Pointer to an array that is first vector + * @param[in] v2 Pointer to an array that is second vector + * @param[in] size Integer that is the size of the vectors + * @returns 0 if the vectors are equals and a negative/psotive value otherwise + */ +int PQCLEAN_HQCRMRS192_CLEAN_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size) { + return memcmp(v1, v2, size); +} + + + +/** + * @brief Resize a vector so that it contains size_o bits + * + * @param[out] o Pointer to the output vector + * @param[in] size_o Integer that is the size of the output vector in bits + * @param[in] v Pointer to the input vector + * @param[in] size_v Integer that is the size of the input vector in bits + */ +void PQCLEAN_HQCRMRS192_CLEAN_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v) { + if (size_o < size_v) { + uint64_t mask = 0x7FFFFFFFFFFFFFFF; + int8_t val = 0; + + if (size_o % 64) { + val = 64 - (size_o % 64); + } + + memcpy(o, v, VEC_N1N2_SIZE_BYTES); + + for (int8_t i = 0 ; i < val ; ++i) { + o[VEC_N1N2_SIZE_64 - 1] &= (mask >> i); + } + } else { + memcpy(o, v, CEIL_DIVIDE(size_v, 8)); + } +} diff --git a/crypto_kem/hqc-rmrs-192/clean/vector.h b/crypto_kem/hqc-rmrs-192/clean/vector.h new file mode 100644 index 00000000..55d9c0c9 --- /dev/null +++ b/crypto_kem/hqc-rmrs-192/clean/vector.h @@ -0,0 +1,31 @@ +#ifndef VECTOR_H +#define VECTOR_H + + +/** + * @file vector.h + * @brief Header file for vector.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_fixed_weight_by_coordinates(AES_XOF_struct *ctx, uint32_t *v, uint16_t weight); + +void PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight); + +void PQCLEAN_HQCRMRS192_CLEAN_vect_set_random(AES_XOF_struct *ctx, uint64_t *v); + +void PQCLEAN_HQCRMRS192_CLEAN_vect_set_random_from_randombytes(uint64_t *v); + + +void PQCLEAN_HQCRMRS192_CLEAN_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size); + +int PQCLEAN_HQCRMRS192_CLEAN_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size); + +void PQCLEAN_HQCRMRS192_CLEAN_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/META.yml b/crypto_kem/hqc-rmrs-256/META.yml new file mode 100644 index 00000000..1b37a436 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/META.yml @@ -0,0 +1,34 @@ +name: HQC-RMRS-256 +type: kem +claimed-nist-level: 5 +claimed-security: IND-CCA2 +length-ciphertext: 15047 +length-public-key: 7535 +length-secret-key: 7575 +length-shared-secret: 64 +nistkat-sha256: dea80abfb2356aed09967ac4cef4e5e1193a0d4823d9124aa75a5b389bea9392 +principal-submitters: + - Carlos Aguilar Melchor + - Nicolas Aragon + - Slim Bettaieb + - Olivier Blazy + - Jurjen Bos + - Jean-Christophe Deneuville + - Philippe Gaborit + - Edoardo Persichetti + - Jean-Marc Robert + - Pascal Véron + - Gilles Zémor + - Loïc Bidoux +implementations: + - name: clean + version: 2020-05-29 + - name: avx2 + version: 2020-05-29 + supported_platforms: + - architecture: x86_64 + operating_systems: + - Linux + - Darwin + required_flags: + - avx2 diff --git a/crypto_kem/hqc-rmrs-256/avx2/LICENSE b/crypto_kem/hqc-rmrs-256/avx2/LICENSE new file mode 100644 index 00000000..d5d21fff --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/LICENSE @@ -0,0 +1 @@ +Public Domain diff --git a/crypto_kem/hqc-rmrs-256/avx2/Makefile b/crypto_kem/hqc-rmrs-256/avx2/Makefile new file mode 100644 index 00000000..156263ce --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/Makefile @@ -0,0 +1,22 @@ +# This Makefile can be used with GNU Make or BSD Make + +LIB=libhqc-rmrs-256_avx2.a +HEADERS=api.h code.h fft.h gf2x.h gf.h hqc.h parameters.h parsing.h reed_muller.h reed_solomon.h vector.h +OBJECTS=code.o fft.o gf2x.o gf.o hqc.o kem.o parsing.o reed_muller.o reed_solomon.o vector.o + +CFLAGS=-O3 -mavx2 -mbmi -mpclmul -Wall -Wextra -Wpedantic -Wvla -Werror -Wredundant-decls -Wmissing-prototypes -std=c99 -I../../../common $(EXTRAFLAGS) + +all: $(LIB) + +%.o: %.s $(HEADERS) + $(AS) -o $@ $< + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +$(LIB): $(OBJECTS) + $(AR) -r $@ $(OBJECTS) + +clean: + $(RM) $(OBJECTS) + $(RM) $(LIB) diff --git a/crypto_kem/hqc-rmrs-256/avx2/api.h b/crypto_kem/hqc-rmrs-256/avx2/api.h new file mode 100644 index 00000000..bc027edd --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/api.h @@ -0,0 +1,25 @@ +#ifndef PQCLEAN_HQCRMRS256_AVX2_API_H +#define PQCLEAN_HQCRMRS256_AVX2_API_H +/** + * @file api.h + * @brief NIST KEM API used by the HQC_KEM IND-CCA2 scheme + */ + +#define PQCLEAN_HQCRMRS256_AVX2_CRYPTO_ALGNAME "HQC-RMRS-256" + +#define PQCLEAN_HQCRMRS256_AVX2_CRYPTO_SECRETKEYBYTES 7575 +#define PQCLEAN_HQCRMRS256_AVX2_CRYPTO_PUBLICKEYBYTES 7535 +#define PQCLEAN_HQCRMRS256_AVX2_CRYPTO_BYTES 64 +#define PQCLEAN_HQCRMRS256_AVX2_CRYPTO_CIPHERTEXTBYTES 15047 + +// As a technicality, the public key is appended to the secret key in order to respect the NIST API. +// Without this constraint, PQCLEAN_HQCRMRS256_AVX2_CRYPTO_SECRETKEYBYTES would be defined as 32 + +int PQCLEAN_HQCRMRS256_AVX2_crypto_kem_keypair(unsigned char *pk, unsigned char *sk); + +int PQCLEAN_HQCRMRS256_AVX2_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk); + +int PQCLEAN_HQCRMRS256_AVX2_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/avx2/code.c b/crypto_kem/hqc-rmrs-256/avx2/code.c new file mode 100644 index 00000000..874248d9 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/code.c @@ -0,0 +1,47 @@ +#include "code.h" +#include "parameters.h" +#include "reed_muller.h" +#include "reed_solomon.h" +#include +#include +/** + * @file code.c + * @brief Implementation of concatenated code + */ + + + +/** + * + * @brief Encoding the message m to a code word em using the concatenated code + * + * First we encode the message using the Reed-Solomon code, then with the duplicated Reed-Muller code we obtain + * a concatenated code word. + * + * @param[out] em Pointer to an array that is the tensor code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQCRMRS256_AVX2_code_encode(uint64_t *em, const uint64_t *m) { + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQCRMRS256_AVX2_reed_solomon_encode(tmp, m); + PQCLEAN_HQCRMRS256_AVX2_reed_muller_encode(em, tmp); + +} + + + +/** + * @brief Decoding the code word em to a message m using the concatenated code + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQCRMRS256_AVX2_code_decode(uint64_t *m, const uint64_t *em) { + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQCRMRS256_AVX2_reed_muller_decode(tmp, em); + PQCLEAN_HQCRMRS256_AVX2_reed_solomon_decode(m, tmp); + + +} diff --git a/crypto_kem/hqc-rmrs-256/avx2/code.h b/crypto_kem/hqc-rmrs-256/avx2/code.h new file mode 100644 index 00000000..b55a2f55 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/code.h @@ -0,0 +1,20 @@ +#ifndef CODE_H +#define CODE_H + + +/** + * @file code.h + * Header file of code.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS256_AVX2_code_encode(uint64_t *em, const uint64_t *message); + +void PQCLEAN_HQCRMRS256_AVX2_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/avx2/fft.c b/crypto_kem/hqc-rmrs-256/avx2/fft.c new file mode 100644 index 00000000..46f73955 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/fft.c @@ -0,0 +1,331 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include +#include +/** + * @file fft.c + * Implementation of the additive FFT and its transpose. + * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + */ + + +static void compute_fft_betas(uint16_t *betas); +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size); +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f); +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); + + +/** + * @brief Computes the basis of betas (omitting 1) used in the additive FFT and its transpose + * + * @param[out] betas Array of size PARAM_M-1 + */ +static void compute_fft_betas(uint16_t *betas) { + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + betas[i] = 1 << (PARAM_M - 1 - i); + } +} + + + +/** + * @brief Computes the subset sums of the given set + * + * The array subset_sums is such that its ith element is + * the subset sum of the set elements given by the binary form of i. + * + * @param[out] subset_sums Array of size 2^set_size receiving the subset sums + * @param[in] set Array of set_size elements + * @param[in] set_size Size of the array set + */ +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size) { + subset_sums[0] = 0; + + for (size_t i = 0 ; i < set_size ; ++i) { + for (size_t j = 0 ; j < (1U << i) ; ++j) { + subset_sums[(1 << i) + j] = set[i] ^ subset_sums[j]; + } + } +} + + + +/** + * @brief Computes the radix conversion of a polynomial f in GF(2^m)[x] + * + * Computes f0 and f1 such that f(x) = f0(x^2-x) + x.f1(x^2-x) + * as proposed by Bernstein, Chou and Schwabe: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f0 Array half the size of f + * @param[out] f1 Array half the size of f + * @param[in] f Array of size a power of 2 + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f) { + switch (m_f) { + case 4: + f0[4] = f[8] ^ f[12]; + f0[6] = f[12] ^ f[14]; + f0[7] = f[14] ^ f[15]; + f1[5] = f[11] ^ f[13]; + f1[6] = f[13] ^ f[14]; + f1[7] = f[15]; + f0[5] = f[10] ^ f[12] ^ f1[5]; + f1[4] = f[9] ^ f[13] ^ f0[5]; + + f0[0] = f[0]; + f1[3] = f[7] ^ f[11] ^ f[15]; + f0[3] = f[6] ^ f[10] ^ f[14] ^ f1[3]; + f0[2] = f[4] ^ f0[4] ^ f0[3] ^ f1[3]; + f1[1] = f[3] ^ f[5] ^ f[9] ^ f[13] ^ f1[3]; + f1[2] = f[3] ^ f1[1] ^ f0[3]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 3: + f0[0] = f[0]; + f0[2] = f[4] ^ f[6]; + f0[3] = f[6] ^ f[7]; + f1[1] = f[3] ^ f[5] ^ f[7]; + f1[2] = f[5] ^ f[6]; + f1[3] = f[7]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 2: + f0[0] = f[0]; + f0[1] = f[2] ^ f[3]; + f1[0] = f[1] ^ f0[1]; + f1[1] = f[3]; + return; + + case 1: + f0[0] = f[0]; + f1[0] = f[1]; + return; + + default: + ; + size_t n = 1 << (m_f - 2); + + uint16_t Q[2 * (1 << (PARAM_FFT - 2))]; + uint16_t R[2 * (1 << (PARAM_FFT - 2))]; + + uint16_t Q0[1 << (PARAM_FFT - 2)]; + uint16_t Q1[1 << (PARAM_FFT - 2)]; + uint16_t R0[1 << (PARAM_FFT - 2)]; + uint16_t R1[1 << (PARAM_FFT - 2)]; + + memcpy(Q, f + 3 * n, 2 * n); + memcpy(Q + n, f + 3 * n, 2 * n); + memcpy(R, f, 4 * n); + + for (size_t i = 0 ; i < n ; ++i) { + Q[i] ^= f[2 * n + i]; + R[n + i] ^= Q[i]; + } + + radix(Q0, Q1, Q, m_f - 1); + radix(R0, R1, R, m_f - 1); + + memcpy(f0, R0, 2 * n); + memcpy(f0 + n, Q0, 2 * n); + memcpy(f1, R1, 2 * n); + memcpy(f1 + n, Q1, 2 * n); + } +} + + + +/** + * @brief Evaluates f at all subset sums of a given set + * + * This function is a subroutine of the function fft. + * + * @param[out] w Array + * @param[in] f Array + * @param[in] f_coeffs Number of coefficients of f + * @param[in] m Number of betas + * @param[in] m_f Number of coefficients of f (one more than its degree) + * @param[in] betas FFT constants + */ +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + uint16_t f0[1 << (PARAM_FFT - 2)]; + uint16_t f1[1 << (PARAM_FFT - 2)]; + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + size_t k = 1 << (m - 1); + uint16_t gammas_sums[1 << (PARAM_M - 2)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + uint16_t tmp[PARAM_M - (PARAM_FFT - 1)]; + for (size_t i = 0 ; i < m ; ++i) { + tmp[i] = PQCLEAN_HQCRMRS256_AVX2_gf_mul(betas[i], f[1]); + } + + w[0] = f[0]; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + w[(1 << j) + k] = w[k] ^ tmp[j]; + } + } + + return; + } + + // Step 2: compute g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQCRMRS256_AVX2_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQCRMRS256_AVX2_gf_mul(beta_m_pow, f[i]); + } + } + + // Step 3 + radix(f0, f1, f, m_f); + + // Step 4: compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQCRMRS256_AVX2_gf_mul(betas[i], PQCLEAN_HQCRMRS256_AVX2_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQCRMRS256_AVX2_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + + if (f_coeffs <= 3) { // 3-coefficient polynomial f case: f1 is constant + w[0] = u[0]; + w[k] = u[0] ^ f1[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS256_AVX2_gf_mul(gammas_sums[i], f1[0]); + w[k + i] = w[i] ^ f1[0]; + } + } else { + fft_rec(v, f1, f_coeffs / 2, m - 1, m_f - 1, deltas); + + // Step 6 + memcpy(w + k, v, 2 * k); + w[0] = u[0]; + w[k] ^= u[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS256_AVX2_gf_mul(gammas_sums[i], v[i]); + w[k + i] ^= w[i]; + } + } +} + + + +/** + * @brief Evaluates f on all fields elements using an additive FFT algorithm + * + * f_coeffs is the number of coefficients of f (one less than its degree).
+ * The FFT proceeds recursively to evaluate f at all subset sums of a basis B.
+ * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf
+ * Note that on this first call (as opposed to the recursive calls to fft_rec), gammas are equal to betas, + * meaning the first gammas subset sums are actually the subset sums of betas (except 1).
+ * Also note that f is altered during computation (twisted at each level). + * + * @param[out] w Array + * @param[in] f Array of 2^PARAM_FFT elements + * @param[in] f_coeffs Number coefficients of f (i.e. deg(f)+1) + */ +void PQCLEAN_HQCRMRS256_AVX2_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs) { + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + uint16_t f0[1 << (PARAM_FFT - 1)]; + uint16_t f1[1 << (PARAM_FFT - 1)]; + uint16_t deltas[PARAM_M - 1]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)]; + uint16_t v[1 << (PARAM_M - 1)]; + + // Follows Gao and Mateer algorithm + compute_fft_betas(betas); + + // Step 1: PARAM_FFT > 1, nothing to do + + // Compute gammas sums + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + // Step 2: beta_m = 1, nothing to do + + // Step 3 + radix(f0, f1, f, PARAM_FFT); + + // Step 4: Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQCRMRS256_AVX2_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + fft_rec(v, f1, f_coeffs / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + + // Step 6, 7 and error polynomial computation + memcpy(w + k, v, 2 * k); + + // Check if 0 is root + w[0] = u[0]; + + // Check if 1 is root + w[k] ^= u[0]; + + // Find other roots + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS256_AVX2_gf_mul(betas_sums[i], v[i]); + w[k + i] ^= w[i]; + } +} + + + +/** + * @brief Retrieves the error polynomial error from the evaluations w of the ELP (Error Locator Polynomial) on all field elements. + * + * @param[out] error Array with the error + * @param[out] error_compact Array with the error in a compact form + * @param[in] w Array of size 2^PARAM_M + */ +void PQCLEAN_HQCRMRS256_AVX2_fft_retrieve_error_poly(uint8_t *error, const uint16_t *w) { + uint16_t gammas[PARAM_M - 1] = {0}; + uint16_t gammas_sums[1 << (PARAM_M - 1)] = {0}; + size_t k = 1 << (PARAM_M - 1); + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + error[0] ^= 1 ^ ((uint16_t) - w[0] >> 15); + error[0] ^= 1 ^ ((uint16_t) - w[k] >> 15); + + size_t index = PARAM_GF_MUL_ORDER; + + for (size_t i = 1 ; i < k ; ++i) { + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQCRMRS256_AVX2_gf_log(gammas_sums[i]); + error[index] ^= 1 ^ ((uint16_t) - w[i] >> 15); + + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQCRMRS256_AVX2_gf_log(gammas_sums[i] ^ 1); + error[index] ^= 1 ^ ((uint16_t) - w[k + i] >> 15); + } +} diff --git a/crypto_kem/hqc-rmrs-256/avx2/fft.h b/crypto_kem/hqc-rmrs-256/avx2/fft.h new file mode 100644 index 00000000..d68dcaa4 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/fft.h @@ -0,0 +1,21 @@ +#ifndef FFT_H +#define FFT_H + + +/** + * @file fft.h + * Header file of fft.c + */ + + +#include + +#include +#include + +void PQCLEAN_HQCRMRS256_AVX2_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs); + +void PQCLEAN_HQCRMRS256_AVX2_fft_retrieve_error_poly(uint8_t *error, const uint16_t *w); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/avx2/gf.c b/crypto_kem/hqc-rmrs-256/avx2/gf.c new file mode 100644 index 00000000..ac333cac --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/gf.c @@ -0,0 +1,134 @@ +#include "gf.h" +#include "parameters.h" +#include +#include +#include +/** + * @file gf.c + * Galois field implementation with multiplication using the pclmulqdq instruction + */ + + +static uint16_t gf_reduce(uint64_t x, size_t deg_x); + + +/** + * Returns the integer i such that elt = a^i + * where a is the primitive element of GF(2^GF_M). + *@returns the logarithm of the given element + */ +uint16_t PQCLEAN_HQCRMRS256_AVX2_gf_log(uint16_t elt) { + return log[elt]; +} + + + +/** + * Reduces polynomial x modulo primitive polynomial GF_POLY. + * @returns x mod GF_POLY + * @param[in] x Polynomial of degree less than 64 + * @param[in] deg_x The degree of polynomial x + */ +static uint16_t gf_reduce(uint64_t x, size_t deg_x) { + // Compute the distance between the primitive polynomial first two set bits + size_t lz1 = __builtin_clz(PARAM_GF_POLY); + size_t lz2 = __builtin_clz(PARAM_GF_POLY ^ 1 << PARAM_M); + size_t dist = lz2 - lz1; + + // Deduce the number of steps of reduction + size_t steps = CEIL_DIVIDE(deg_x - (PARAM_M - 1), dist); + + // Reduce + for (size_t i = 0; i < steps; ++i) { + uint64_t mod = x >> PARAM_M; + x &= (1 << PARAM_M) - 1; + x ^= mod; + + size_t tz1 = 0; + uint16_t rmdr = PARAM_GF_POLY ^ 1; + for (size_t j = __builtin_popcount(PARAM_GF_POLY) - 2; j; --j) { + size_t tz2 = __builtin_ctz(rmdr); + size_t shift = tz2 - tz1; + mod <<= shift; + x ^= mod; + rmdr ^= 1 << tz2; + tz1 = tz2; + } + } + + return x; +} + + + +/** + * Multiplies two elements of GF(2^GF_M). + * @returns the product a*b + * @param[in] a Element of GF(2^GF_M) + * @param[in] b Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQCRMRS256_AVX2_gf_mul(uint16_t a, uint16_t b) { + __m128i va = _mm_cvtsi32_si128(a); + __m128i vb = _mm_cvtsi32_si128(b); + __m128i vab = _mm_clmulepi64_si128(va, vb, 0); + uint32_t ab = _mm_cvtsi128_si32(vab); + + return gf_reduce(ab, 2 * (PARAM_M - 1)); +} + + + +/** + * Squares an element of GF(2^GF_M). + * @returns a^2 + * @param[in] a Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQCRMRS256_AVX2_gf_square(uint16_t a) { + uint32_t b = a; + uint32_t s = b & 1; + for (size_t i = 1; i < PARAM_M; ++i) { + b <<= 1; + s ^= b & (1 << 2 * i); + } + + return gf_reduce(s, 2 * (PARAM_M - 1)); +} + + +/** + * Computes the inverse of an element of GF(2^GF_M) by fast exponentiation. + * @returns the inverse of a + * @param[in] a Element of GF(2^GF_M) + */ +uint16_t PQCLEAN_HQCRMRS256_AVX2_gf_inverse(uint16_t a) { + size_t pow = (1 << PARAM_M) - 2; + uint16_t inv = 1; + + do { + if (pow & 1) { + inv = PQCLEAN_HQCRMRS256_AVX2_gf_mul(inv, a); + } + a = PQCLEAN_HQCRMRS256_AVX2_gf_square(a); + pow >>= 1; + } while (pow); + + return inv; +} + + + +/** + * Returns i modulo 2^GF_M-1. + * i must be less than 2*(2^GF_M-1). + * Therefore, the return value is either i or i-2^GF_M+1. + * @returns i mod (2^GF_M-1) + * @param[in] i The integer whose modulo is taken + */ +uint16_t PQCLEAN_HQCRMRS256_AVX2_gf_mod(uint16_t i) { + uint16_t tmp = i - PARAM_GF_MUL_ORDER; + + // mask = 0xffff if (i < GF_MUL_ORDER) + int16_t mask = -(tmp >> 15); + + return tmp + (mask & PARAM_GF_MUL_ORDER); +} diff --git a/crypto_kem/hqc-rmrs-256/avx2/gf.h b/crypto_kem/hqc-rmrs-256/avx2/gf.h new file mode 100644 index 00000000..efc12f6e --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/gf.h @@ -0,0 +1,43 @@ +#ifndef GF_H +#define GF_H + + +/** + * @file gf.h + * Header file of gf.c + */ + +#include + +#include +#include + + +/** + * Powers of the root alpha of 1 + x^2 + x^3 + x^4 + x^8. + * The last two elements are needed by the PQCLEAN_HQCRMRS256_AVX2_gf_mul function + * (for example if both elements to multiply are zero). + */ +static const uint16_t exp [258] = { 1, 2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240, 253, 231, 211, 187, 107, 214, 177, 127, 254, 225, 223, 163, 91, 182, 113, 226, 217, 175, 67, 134, 17, 34, 68, 136, 13, 26, 52, 104, 208, 189, 103, 206, 129, 31, 62, 124, 248, 237, 199, 147, 59, 118, 236, 197, 151, 51, 102, 204, 133, 23, 46, 92, 184, 109, 218, 169, 79, 158, 33, 66, 132, 21, 42, 84, 168, 77, 154, 41, 82, 164, 85, 170, 73, 146, 57, 114, 228, 213, 183, 115, 230, 209, 191, 99, 198, 145, 63, 126, 252, 229, 215, 179, 123, 246, 241, 255, 227, 219, 171, 75, 150, 49, 98, 196, 149, 55, 110, 220, 165, 87, 174, 65, 130, 25, 50, 100, 200, 141, 7, 14, 28, 56, 112, 224, 221, 167, 83, 166, 81, 162, 89, 178, 121, 242, 249, 239, 195, 155, 43, 86, 172, 69, 138, 9, 18, 36, 72, 144, 61, 122, 244, 245, 247, 243, 251, 235, 203, 139, 11, 22, 44, 88, 176, 125, 250, 233, 207, 131, 27, 54, 108, 216, 173, 71, 142, 1, 2, 4 }; + + + +/** + * Logarithm of elements of GF(2^8) to the base alpha (root of 1 + x^2 + x^3 + x^4 + x^8). + * The logarithm of 0 is set to 0 by convention. + */ +static const uint16_t log [256] = { 0, 0, 1, 25, 2, 50, 26, 198, 3, 223, 51, 238, 27, 104, 199, 75, 4, 100, 224, 14, 52, 141, 239, 129, 28, 193, 105, 248, 200, 8, 76, 113, 5, 138, 101, 47, 225, 36, 15, 33, 53, 147, 142, 218, 240, 18, 130, 69, 29, 181, 194, 125, 106, 39, 249, 185, 201, 154, 9, 120, 77, 228, 114, 166, 6, 191, 139, 98, 102, 221, 48, 253, 226, 152, 37, 179, 16, 145, 34, 136, 54, 208, 148, 206, 143, 150, 219, 189, 241, 210, 19, 92, 131, 56, 70, 64, 30, 66, 182, 163, 195, 72, 126, 110, 107, 58, 40, 84, 250, 133, 186, 61, 202, 94, 155, 159, 10, 21, 121, 43, 78, 212, 229, 172, 115, 243, 167, 87, 7, 112, 192, 247, 140, 128, 99, 13, 103, 74, 222, 237, 49, 197, 254, 24, 227, 165, 153, 119, 38, 184, 180, 124, 17, 68, 146, 217, 35, 32, 137, 46, 55, 63, 209, 91, 149, 188, 207, 205, 144, 135, 151, 178, 220, 252, 190, 97, 242, 86, 211, 171, 20, 42, 93, 158, 132, 60, 57, 83, 71, 109, 65, 162, 31, 45, 67, 216, 183, 123, 164, 118, 196, 23, 73, 236, 127, 12, 111, 246, 108, 161, 59, 82, 41, 157, 85, 170, 251, 96, 134, 177, 187, 204, 62, 90, 203, 89, 95, 176, 156, 169, 160, 81, 11, 245, 22, 235, 122, 117, 44, 215, 79, 174, 213, 233, 230, 231, 173, 232, 116, 214, 244, 234, 168, 80, 88, 175 }; + + +uint16_t PQCLEAN_HQCRMRS256_AVX2_gf_log(uint16_t elt); + +uint16_t PQCLEAN_HQCRMRS256_AVX2_gf_mul(uint16_t a, uint16_t b); + +uint16_t PQCLEAN_HQCRMRS256_AVX2_gf_square(uint16_t a); + +uint16_t PQCLEAN_HQCRMRS256_AVX2_gf_inverse(uint16_t a); + +uint16_t PQCLEAN_HQCRMRS256_AVX2_gf_mod(uint16_t i); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/avx2/gf2x.c b/crypto_kem/hqc-rmrs-256/avx2/gf2x.c new file mode 100644 index 00000000..40d1e7a5 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/gf2x.c @@ -0,0 +1,763 @@ +#include "gf2x.h" +#include "parameters.h" +#include +#include +#include + +/** + * \file gf2x.c + * \brief AVX2 implementation of multiplication of two polynomials + */ + + +// sizes for Toom-Cook +#define T_TM3_3W_256 32 +#define T_TM3_3W_64 128 +// constants TOOM3REC +#define tTM3R 1116 +#define T_TM3R_3W_256 93 +#define T_TM3R_3W_64 (T_TM3R_3W_256<<2) + +#define VEC_N_ARRAY_SIZE_VEC CEIL_DIVIDE(PARAM_N, 256) /*!< The number of needed vectors to store PARAM_N bits*/ +#define WORD 64 +#define LAST64 (PARAM_N >> 6) +uint64_t a1_times_a2[2 * VEC_N_256_SIZE_64 + 1]; +uint64_t tmp_reduce[VEC_N_ARRAY_SIZE_VEC << 2]; +__m256i *o256 = (__m256i *) tmp_reduce; +uint64_t bloc64[PARAM_OMEGA_R]; // Allocation with the biggest possible weight +uint64_t bit64[PARAM_OMEGA_R]; // Allocation with the biggest possible weight + + +static inline void reduce(uint64_t *o, const uint64_t *a); +inline static void karat_mult_1(__m128i *C, __m128i *A, __m128i *B); +inline static void karat_mult_2(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_4(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_8(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_16(__m256i *C, __m256i *A, __m256i *B); +inline static void karat_mult_32(__m256i *C, __m256i *A, __m256i *B); +static inline void divByXplus1(__m256i *out, __m256i *in, int size); +static inline void divByXplus1_256(__m256i *out, __m256i *in, int size); +static void TOOM3Mult(uint64_t *Out, const uint64_t *A, const uint64_t *B); +static void TOOM3RecMult(uint64_t *Out, const uint64_t *A, const uint64_t *B); + + + +/** + * @brief Compute o(x) = a(x) mod \f$ X^n - 1\f$ + * + * This function computes the modular reduction of the polynomial a(x) + * + * @param[out] o Pointer to the result + * @param[in] a Pointer to the polynomial a(x) + */ +static inline void reduce(uint64_t *o, const uint64_t *a) { + __m256i r256, carry256; + __m256i *a256 = (__m256i *) a; + static const int32_t dec64 = PARAM_N & 0x3f; + static const int32_t d0 = WORD - dec64; + int32_t i, i2; + + for (i = LAST64 ; i < (PARAM_N >> 5) - 4 ; i += 4) { + r256 = _mm256_lddqu_si256((__m256i const *) (& a[i])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_lddqu_si256((__m256i const *) (& a[i + 1])); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = a256[i2] ^ r256; + } + + r256 = _mm256_lddqu_si256((__m256i const *)(& a[i])); + carry256 = _mm256_lddqu_si256((__m256i const *)(& a[i + 1])); + r256 = _mm256_srli_epi64(r256, dec64); + carry256 = _mm256_slli_epi64(carry256, d0); + r256 ^= carry256; + i2 = (i - LAST64) >> 2; + o256[i2] = a256[i2] ^ r256; + tmp_reduce[LAST64] &= RED_MASK; + memcpy(o, tmp_reduce, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * A(x) and B(x) are stored in 128-bit registers + * This function computes A(x)*B(x) using Karatsuba + * + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_1(__m128i *C, __m128i *A, __m128i *B) { + __m128i D1[2]; + __m128i D0[2], D2[2]; + __m128i Al = _mm_loadu_si128(A); + __m128i Ah = _mm_loadu_si128(A + 1); + __m128i Bl = _mm_loadu_si128(B); + __m128i Bh = _mm_loadu_si128(B + 1); + + // Compute Al.Bl=D0 + __m128i DD0 = _mm_clmulepi64_si128(Al, Bl, 0); + __m128i DD2 = _mm_clmulepi64_si128(Al, Bl, 0x11); + __m128i AAlpAAh = _mm_xor_si128(Al, _mm_shuffle_epi32(Al, 0x4e)); + __m128i BBlpBBh = _mm_xor_si128(Bl, _mm_shuffle_epi32(Bl, 0x4e)); + __m128i DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D0[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D0[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Compute Ah.Bh=D2 + DD0 = _mm_clmulepi64_si128(Ah, Bh, 0); + DD2 = _mm_clmulepi64_si128(Ah, Bh, 0x11); + AAlpAAh = _mm_xor_si128(Ah, _mm_shuffle_epi32(Ah, 0x4e)); + BBlpBBh = _mm_xor_si128(Bh, _mm_shuffle_epi32(Bh, 0x4e)); + DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D2[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D2[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Compute AlpAh.BlpBh=D1 + // Initialisation of AlpAh and BlpBh + __m128i AlpAh = _mm_xor_si128(Al, Ah); + __m128i BlpBh = _mm_xor_si128(Bl, Bh); + DD0 = _mm_clmulepi64_si128(AlpAh, BlpBh, 0); + DD2 = _mm_clmulepi64_si128(AlpAh, BlpBh, 0x11); + AAlpAAh = _mm_xor_si128(AlpAh, _mm_shuffle_epi32(AlpAh, 0x4e)); + BBlpBBh = _mm_xor_si128(BlpBh, _mm_shuffle_epi32(BlpBh, 0x4e)); + DD1 = _mm_xor_si128(_mm_xor_si128(DD0, DD2), _mm_clmulepi64_si128(AAlpAAh, BBlpBBh, 0)); + D1[0] = _mm_xor_si128(DD0, _mm_unpacklo_epi64(_mm_setzero_si128(), DD1)); + D1[1] = _mm_xor_si128(DD2, _mm_unpackhi_epi64(DD1, _mm_setzero_si128())); + + // Final comutation of C + __m128i middle = _mm_xor_si128(D0[1], D2[0]); + C[0] = D0[0]; + C[1] = middle ^ D0[0] ^ D1[0]; + C[2] = middle ^ D1[1] ^ D2[1]; + C[3] = D2[1]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_2(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[2], D1[2], D2[2], SAA, SBB; + __m128i *A128 = (__m128i *)A, *B128 = (__m128i *)B; + + karat_mult_1((__m128i *) D0, A128, B128); + karat_mult_1((__m128i *) D2, A128 + 2, B128 + 2); + + SAA = A[0] ^ A[1]; + SBB = B[0] ^ B[1]; + + karat_mult_1((__m128i *) D1, (__m128i *) &SAA, (__m128i *) &SBB); + __m256i middle = _mm256_xor_si256(D0[1], D2[0]); + + C[0] = D0[0]; + C[1] = middle ^ D0[0] ^ D1[0]; + C[2] = middle ^ D1[1] ^ D2[1]; + C[3] = D2[1]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_4(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[4], D1[4], D2[4], SAA[2], SBB[2]; + + karat_mult_2( D0, A, B); + karat_mult_2(D2, A + 2, B + 2); + + SAA[0] = A[0] ^ A[2]; + SBB[0] = B[0] ^ B[2]; + SAA[1] = A[1] ^ A[3]; + SBB[1] = B[1] ^ B[3]; + + karat_mult_2( D1, SAA, SBB); + + __m256i middle0 = _mm256_xor_si256(D0[2], D2[0]); + __m256i middle1 = _mm256_xor_si256(D0[3], D2[1]); + + C[0] = D0[0]; + C[1] = D0[1]; + C[2] = middle0 ^ D0[0] ^ D1[0]; + C[3] = middle1 ^ D0[1] ^ D1[1]; + C[4] = middle0 ^ D1[2] ^ D2[2]; + C[5] = middle1 ^ D1[3] ^ D2[3]; + C[6] = D2[2]; + C[7] = D2[3]; +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_8(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[8], D1[8], D2[8], SAA[4], SBB[4]; + + karat_mult_4( D0, A, B); + karat_mult_4(D2, A + 4, B + 4); + + for (int32_t i = 0 ; i < 4 ; i++) { + int is = i + 4; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_4(D1, SAA, SBB); + + for (int32_t i = 0 ; i < 4 ; i++) { + int32_t is = i + 4; + int32_t is2 = is + 4; + int32_t is3 = is2 + 4; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_16(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[16], D1[16], D2[16], SAA[8], SBB[8]; + + karat_mult_8( D0, A, B); + karat_mult_8(D2, A + 8, B + 8); + + for (int32_t i = 0 ; i < 8 ; i++) { + int32_t is = i + 8; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_8( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 8 ; i++) { + int32_t is = i + 8; + int32_t is2 = is + 8; + int32_t is3 = is2 + 8; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) + * + * This function computes A(x)*B(x) using Karatsuba + * A(x) and B(x) are stored in 256-bit registers + * @param[out] C Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +inline static void karat_mult_32(__m256i *C, __m256i *A, __m256i *B) { + __m256i D0[32], D1[32], D2[32], SAA[16], SBB[16]; + + karat_mult_16( D0, A, B); + karat_mult_16(D2, A + 16, B + 16); + + for (int32_t i = 0 ; i < 16 ; i++) { + int is = i + 16; + SAA[i] = A[i] ^ A[is]; + SBB[i] = B[i] ^ B[is]; + } + + karat_mult_16( D1, SAA, SBB); + + for (int32_t i = 0 ; i < 16 ; i++) { + int32_t is = i + 16; + int32_t is2 = is + 16; + int32_t is3 = is2 + 16; + + __m256i middle = _mm256_xor_si256(D0[is], D2[i]); + + C[i] = D0[i]; + C[is] = middle ^ D0[i] ^ D1[i]; + C[is2] = middle ^ D1[is] ^ D2[is]; + C[is3] = D2[is]; + } +} + + + +/** + * @brief Compute B(x) = A(x)/(x+1) + * + * This function computes A(x)/(x+1) using a Quercia like algorithm + * @param[out] out Pointer to the result + * @param[in] in Pointer to the polynomial A(x) + * @param[in] size used to define the number of coeeficients of A + */ +static inline void divByXplus1(__m256i *out, __m256i *in, int size) { + uint64_t *A = (uint64_t *) in; + uint64_t *B = (uint64_t *) out; + + B[0] = A[0]; + + for (int32_t i = 1 ; i < 2 * (size << 2) ; i++) { + B[i] = B[i - 1] ^ A[i]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) using TOOM3Mult + * + * This function computes A(x)*B(x) using TOOM-COOK3 Multiplication + * last multiplication are done using Karatsuba + * @param[out] Out Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +static void TOOM3Mult(uint64_t *Out, const uint64_t *A, const uint64_t *B) { + static __m256i U0[T_TM3_3W_256], V0[T_TM3_3W_256], U1[T_TM3_3W_256], V1[T_TM3_3W_256], U2[T_TM3_3W_256], V2[T_TM3_3W_256]; + static __m256i W0[2 * (T_TM3_3W_256)], W1[2 * (T_TM3_3W_256)], W2[2 * (T_TM3_3W_256)], W3[2 * (T_TM3_3W_256)], W4[2 * (T_TM3_3W_256)]; + static __m256i tmp[2 * (T_TM3_3W_256)]; + static __m256i ro256[6 * (T_TM3_3W_256)]; + const __m256i zero = (__m256i) { + 0ul, 0ul, 0ul, 0ul + }; + int32_t T2 = T_TM3_3W_64 << 1; + + for (int32_t i = 0 ; i < T_TM3_3W_256 - 1 ; i++) { + int32_t i4 = i << 2; + int32_t i42 = i4 - 2; + U0[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4])); + V0[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4])); + U1[i] = _mm256_lddqu_si256((__m256i const *)(& A[i42 + T_TM3_3W_64])); + V1[i] = _mm256_lddqu_si256((__m256i const *)(& B[i42 + T_TM3_3W_64])); + U2[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4 + T2 - 4])); + V2[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4 + T2 - 4])); + } + + for (int32_t i = T_TM3_3W_256 - 1 ; i < T_TM3_3W_256 ; i++) { + int32_t i4 = i << 2; + int32_t i41 = i4 + 1; + U0[i] = (__m256i) { + A[i4], A[i41], 0x0ul, 0x0ul + }; + V0[i] = (__m256i) { + B[i4], B[i41], 0x0ul, 0x0ul + }; + U1[i] = (__m256i) { + A[i4 + T_TM3_3W_64 - 2], A[i41 + T_TM3_3W_64 - 2], 0x0ul, 0x0ul + }; + V1[i] = (__m256i) { + B[i4 + T_TM3_3W_64 - 2], B[i41 + T_TM3_3W_64 - 2], 0x0ul, 0x0ul + }; + U2[i] = (__m256i) { + A[i4 - 4 + T2], A[i4 - 3 + T2], 0x0ul, 0x0ul + }; + V2[i] = (__m256i) { + B[i4 - 4 + T2], B[i4 - 3 + T2], 0x0ul, 0x0ul + }; + } + + // Evaluation phase : x= X^64 + // P(X): P0=(0); P1=(1); P2=(x); P3=(1+x); P4=(\infty) + // Evaluation: 5*2 add, 2*2 shift; 5 mul (n) + //W3 = U2 + U1 + U0 ; W2 = V2 + V1 + V0 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W3[i] = U0[i] ^ U1[i] ^ U2[i]; + W2[i] = V0[i] ^ V1[i] ^ V2[i]; + } + + //W1 = W2 * W3 + karat_mult_32( W1, W2, W3); + + //W0 =(U1 + U2*x)*x ; W4 =(V1 + V2*x)*x (SIZE = T_TM3_3W_256 !) + int64_t *U1_64 = ((int64_t *) U1); + int64_t *U2_64 = ((int64_t *) U2); + + int64_t *V1_64 = ((int64_t *) V1); + int64_t *V2_64 = ((int64_t *) V2); + + W0[0] = _mm256_set_epi64x(U1_64[2] ^ U2_64[1], U1_64[1] ^ U2_64[0], U1_64[0], 0); + W4[0] = _mm256_set_epi64x(V1_64[2] ^ V2_64[1], V1_64[1] ^ V2_64[0], V1_64[0], 0); + + U1_64 = ((int64_t *) U1); + U2_64 = ((int64_t *) U2); + + V1_64 = ((int64_t *) V1); + V2_64 = ((int64_t *) V2); + + for (int32_t i = 1 ; i < T_TM3_3W_256 ; i++) { + int i4 = i << 2; + W0[i] = _mm256_lddqu_si256((__m256i const *)(& U1_64[i4 - 1])); + W0[i] ^= _mm256_lddqu_si256((__m256i const *)(& U2_64[i4 - 2])); + + W4[i] = _mm256_lddqu_si256((__m256i const *)(& V1_64[i4 - 1])); + W4[i] ^= _mm256_lddqu_si256((__m256i const *)(& V2_64[i4 - 2])); + } + + //W3 = W3 + W0 ; W2 = W2 + W4 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W3[i] ^= W0[i]; + W2[i] ^= W4[i]; + } + + //W0 = W0 + U0 ; W4 = W4 + V0 + for (int32_t i = 0 ; i < T_TM3_3W_256 ; i++) { + W0[i] ^= U0[i]; + W4[i] ^= V0[i]; + } + + //W3 = W3 * W2 ; W2 = W0 * W4 + karat_mult_32(tmp, W3, W2); + + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W3[i] = tmp[i]; + } + + karat_mult_32(W2, W0, W4); + //W4 = U2 * V2 ; W0 = U0 * V0 + karat_mult_32(W4, U2, V2); + karat_mult_32(W0, U0, V0); + + // Interpolation phase + // 9 add, 1 shift, 1 Smul, 2 Sdiv (2n) + //W3 = W3 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W3[i] ^= W2[i]; + } + + //W1 = W1 + W0 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W1[i] ^= W0[i]; + } + + //W2 =(W2 + W0)/x -> x = X^64 + U1_64 = ((int64_t *) W2); + U2_64 = ((int64_t *) W0); + for (int32_t i = 0 ; i < (T_TM3_3W_256 << 1) ; i++) { + int32_t i4 = i << 2; + W2[i] = _mm256_lddqu_si256((__m256i const *)(& U1_64[i4 + 1])); + W2[i] ^= _mm256_lddqu_si256((__m256i const *)(& U2_64[i4 + 1])); + } + + //W2 =(W2 + W3 + W4*(x^3+1))/(x+1) + U1_64 = ((int64_t *) W4); + __m256i *U1_256 = (__m256i *) (U1_64 + 1); + tmp[0] = W2[0] ^ W3[0] ^ W4[0] ^ (__m256i) { + 0x0ul, 0x0ul, 0x0ul, U1_64[0] + }; + + for (int32_t i = 1 ; i < (T_TM3_3W_256 << 1) - 1 ; i++) { + tmp[i] = W2[i] ^ W3[i] ^ W4[i] ^ _mm256_lddqu_si256(&U1_256[i - 1]); + } + + divByXplus1(W2, tmp, T_TM3_3W_256); + W2[2 * (T_TM3_3W_256) - 1] = zero; + + //W3 =(W3 + W1)/(x*(x+1)) + U1_64 = (int64_t *) W3; + U1_256 = (__m256i *) (U1_64 + 1); + + U2_64 = (int64_t *) W1; + __m256i *U2_256 = (__m256i *) (U2_64 + 1); + + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) - 1 ; i++) { + tmp[i] = _mm256_lddqu_si256(&U1_256[i]) ^ _mm256_lddqu_si256(&U2_256[i]); + } + + divByXplus1(W3, tmp, T_TM3_3W_256); + W3[2 * (T_TM3_3W_256) - 1] = zero; + + //W1 = W1 + W4 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W1[i] ^= W2[i] ^ W4[i]; + } + + //W2 = W2 + W3 + for (int32_t i = 0 ; i < 2 * (T_TM3_3W_256) ; i++) { + W2[i] ^= W3[i]; + } + + // Recomposition + //W = W0+ W1*x+ W2*x^2+ W3*x^3 + W4*x^4 + //W0, W1, W4 of size 2*T_TM3_3W_256, W2 and W3 of size 2*(T_TM3_3W_256) + for (int32_t i = 0 ; i < (T_TM3_3W_256 << 1) - 1 ; i++) { + ro256[i] = W0[i]; + ro256[i + 2 * T_TM3_3W_256 - 1] = W2[i]; + ro256[i + 4 * T_TM3_3W_256 - 2] = W4[i]; + } + + ro256[(T_TM3_3W_256 << 1) - 1] = W0[(T_TM3_3W_256 << 1) - 1] ^ W2[0]; + ro256[(T_TM3_3W_256 << 2) - 2] = W2[(T_TM3_3W_256 << 1) - 1] ^ W4[0]; + ro256[(T_TM3_3W_256 * 6) - 3] = W4[(T_TM3_3W_256 << 1) - 1]; + + U1_64 = ((int64_t *) &ro256[T_TM3_3W_256]); + U1_256 = (__m256i *) (U1_64 - 2); + + U2_64 = ((int64_t *) &ro256[3 * T_TM3_3W_256 - 1]); + U2_256 = (__m256i *) (U2_64 - 2); + + for (int32_t i = 0 ; i < T_TM3_3W_256 << 1 ; i++) { + _mm256_storeu_si256(&U1_256[i], W1[i] ^ _mm256_lddqu_si256(&U1_256[i])); + _mm256_storeu_si256(&U2_256[i], W3[i] ^ _mm256_loadu_si256(&U2_256[i])); + } + + for (int32_t i = 0 ; i < 6 * T_TM3_3W_256 - 2 ; i++) { + uint64_t *out64 = Out + (i << 2); + _mm256_storeu_si256((__m256i *)out64, ro256[i]); + } +} + + + +/** + * @brief Compute B(x) = A(x)/(x+1) + * + * This function computes A(x)/(x+1) using a Quercia like algorithm + * @param[out] out Pointer to the result + * @param[in] in Pointer to the polynomial A(x) + * @param[in] size used to define the number of coeeficients of A + */ +static inline void divByXplus1_256(__m256i *out, __m256i *in, int32_t size) { + out[0] = in[0]; + for (int32_t i = 1 ; i < 2 * (size + 2) ; i++) { + out[i] = out[i - 1] ^ in[i]; + } +} + + + +/** + * @brief Compute C(x) = A(x)*B(x) using TOOM3Mult with recursive call + * + * This function computes A(x)*B(x) using recursive TOOM-COOK3 Multiplication + * @param[out] Out Pointer to the result + * @param[in] A Pointer to the polynomial A(x) + * @param[in] B Pointer to the polynomial B(x) + */ +static void TOOM3RecMult(uint64_t *Out, const uint64_t *A, const uint64_t *B) { + __m256i U0[T_TM3R_3W_256 + 2], V0[T_TM3R_3W_256 + 2], U1[T_TM3R_3W_256 + 2], V1[T_TM3R_3W_256 + 2], U2[T_TM3R_3W_256 + 2], V2[T_TM3R_3W_256 + 2]; + __m256i W0[2 * (T_TM3R_3W_256 + 2)], W1[2 * (T_TM3R_3W_256 + 2)], W2[2 * (T_TM3R_3W_256 + 2)], W3[2 * (T_TM3R_3W_256 + 2)], W4[2 * (T_TM3R_3W_256 + 2)]; + __m256i tmp[2 * (T_TM3R_3W_256 + 2) + 3]; + __m256i ro256[tTM3R / 2]; + const __m256i zero = (__m256i) { + 0ul, 0ul, 0ul, 0ul + }; + int32_t T2 = T_TM3R_3W_64 << 1; + + for (int32_t i = 0 ; i < T_TM3R_3W_256 ; i++) { + int32_t i4 = i << 2; + U0[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4])); + V0[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4])); + U1[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4 + T_TM3R_3W_64])); + V1[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4 + T_TM3R_3W_64])); + U2[i] = _mm256_lddqu_si256((__m256i const *)(& A[i4 + T2])); + V2[i] = _mm256_lddqu_si256((__m256i const *)(& B[i4 + T2])); + } + + for (int32_t i = T_TM3R_3W_256 ; i < T_TM3R_3W_256 + 2 ; i++) { + U0[i] = zero; + V0[i] = zero; + U1[i] = zero; + V1[i] = zero; + U2[i] = zero; + V2[i] = zero; + } + + // Evaluation phase : x= X^256 + // P(X): P0=(0); P1=(1); P2=(x); P3=(1+x); P4=(\infty) + // Evaluation: 5*2 add, 2*2 shift; 5 mul (n) + //W3 = U2 + U1 + U0 ; W2 = V2 + V1 + V0 + + for (int32_t i = 0 ; i < T_TM3R_3W_256 ; i++) { + W3[i] = U0[i] ^ U1[i] ^ U2[i]; + W2[i] = V0[i] ^ V1[i] ^ V2[i]; + } + + for (int32_t i = T_TM3R_3W_256 ; i < T_TM3R_3W_256 + 2 ; i++) { + W2[i] = zero; + W3[i] = zero; + } + + //W1 = W2 * W3 + TOOM3Mult((uint64_t *) W1, (uint64_t *) W2, (uint64_t *) W3); + //W0 =(U1 + U2*x)*x ; W4 =(V1 + V2*x)*x (SIZE = T_TM3_3W_256 + 2 !) + W0[0] = zero; + W4[0] = zero; + W0[1] = U1[0]; + W4[1] = V1[0]; + + for (int32_t i = 1 ; i < T_TM3R_3W_256 + 1 ; i++) { + W0[i + 1] = U1[i] ^ U2[i - 1]; + W4[i + 1] = V1[i] ^ V2[i - 1]; + } + + W0[T_TM3R_3W_256 + 1] = U2[T_TM3R_3W_256 - 1]; + W4[T_TM3R_3W_256 + 1] = V2[T_TM3R_3W_256 - 1]; + + //W3 = W3 + W0 ; W2 = W2 + W4 + for (int32_t i = 0 ; i < T_TM3R_3W_256 + 2 ; i++) { + W3[i] ^= W0[i]; + W2[i] ^= W4[i]; + } + + //W0 = W0 + U0 ; W4 = W4 + V0 + for (int32_t i = 0 ; i < T_TM3R_3W_256 + 2 ; i++) { + W0[i] ^= U0[i]; + W4[i] ^= V0[i]; + } + + //W3 = W3 * W2 ; W2 = W0 * W4 + TOOM3Mult((uint64_t *) tmp, (uint64_t *) W3, (uint64_t *) W2); + + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) ; i++) { + W3[i] = tmp[i]; + } + + TOOM3Mult((uint64_t *) W2, (uint64_t *) W0, (uint64_t *) W4); + + //W4 = U2 * V2 ; W0 = U0 * V0 + TOOM3Mult((uint64_t *) W4, (uint64_t *) U2, (uint64_t *) V2); + TOOM3Mult((uint64_t *) W0, (uint64_t *) U0, (uint64_t *) V0); + + //Interpolation phase + //9 add, 1 shift, 1 Smul, 2 Sdiv (2n) + + //W3 = W3 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) ; i++) { + W3[i] ^= W2[i]; + } + + //W1 = W1 + W0 + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256) ; i++) { + W1[i] ^= W0[i]; + } + + //W2 =(W2 + W0)/x + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) - 1 ; i++) { + int32_t i1 = i + 1; + W2[i] = W2[i1] ^ W0[i1]; + } + + W2[2 * (T_TM3R_3W_256 + 2) - 1] = zero; + + //W2 =(W2 + W3 + W4*(x^3+1))/(x+1) + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) ; i++) { + tmp[i] = W2[i] ^ W3[i] ^ W4[i]; + } + + tmp[2 * (T_TM3R_3W_256 + 2)] = zero; + tmp[2 * (T_TM3R_3W_256 + 2) + 1] = zero; + tmp[2 * (T_TM3R_3W_256 + 2) + 2] = zero; + + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256) ; i++) { + tmp[i + 3] ^= W4[i]; + } + + divByXplus1_256(W2, tmp, T_TM3R_3W_256); + + //W3 =(W3 + W1)/(x*(x+1)) + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) - 1 ; i++) { + int32_t i1 = i + 1; + tmp[i] = W3[i1] ^ W1[i1]; + } + + tmp[ 2 * (T_TM3R_3W_256 + 2) - 1] = zero; + divByXplus1_256(W3, tmp, T_TM3R_3W_256); + + //W1 = W1 + W4 + W2 + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) ; i++) { + W1[i] ^= W2[i] ^ W4[i]; + } + //W2 = W2 + W3 + for (int32_t i = 0 ; i < 2 * (T_TM3R_3W_256 + 2) ; i++) { + W2[i] ^= W3[i]; + } + + // Recomposition + //W = W0+ W1*x+ W2*x^2+ W3*x^3 + W4*x^4 + //W0, W1, W4 of size 2*T_TM3_3W_256, W2 and W3 of size 2*(T_TM3_3W_256+2) + for (int32_t i = 0 ; i < T_TM3R_3W_256 ; i++) { + ro256[i] = W0[i]; + ro256[i + T_TM3R_3W_256] = W0[i + T_TM3R_3W_256] ^ W1[i]; + ro256[i + 2 * T_TM3R_3W_256] = W1[i + T_TM3R_3W_256] ^ W2[i]; + ro256[i + 3 * T_TM3R_3W_256] = W2[i + T_TM3R_3W_256] ^ W3[i]; + ro256[i + 4 * T_TM3R_3W_256] = W3[i + T_TM3R_3W_256] ^ W4[i]; + ro256[i + 5 * T_TM3R_3W_256] = W4[i + T_TM3R_3W_256]; + } + + ro256[4 * T_TM3R_3W_256] ^= W2[2 * T_TM3R_3W_256]; + ro256[5 * T_TM3R_3W_256] ^= W3[2 * T_TM3R_3W_256]; + + ro256[1 + 4 * T_TM3R_3W_256] ^= W2[1 + 2 * T_TM3R_3W_256]; + ro256[1 + 5 * T_TM3R_3W_256] ^= W3[1 + 2 * T_TM3R_3W_256]; + + ro256[2 + 4 * T_TM3R_3W_256] ^= W2[2 + 2 * T_TM3R_3W_256]; + ro256[2 + 5 * T_TM3R_3W_256] ^= W3[2 + 2 * T_TM3R_3W_256]; + + ro256[3 + 4 * T_TM3R_3W_256] ^= W2[3 + 2 * T_TM3R_3W_256]; + ro256[3 + 5 * T_TM3R_3W_256] ^= W3[3 + 2 * T_TM3R_3W_256]; + + + for (int32_t i = 0 ; i < 6 * T_TM3R_3W_256 - 2 ; i++) { + uint64_t *out64 = Out + (i << 2); + _mm256_storeu_si256((__m256i *)out64, ro256[i]); + } +} + + + +/** + * @brief Multiply two polynomials modulo \f$ X^n - 1\f$. + * + * This functions multiplies a sparse polynomial a1 (of Hamming weight equal to weight) + * and a dense polynomial a2. The multiplication is done modulo \f$ X^n - 1\f$. + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to a polynomial + * @param[in] a2 Pointer to a polynomial + */ +void PQCLEAN_HQCRMRS256_AVX2_vect_mul(uint64_t *o, const uint64_t *a1, const uint64_t *a2) { + TOOM3RecMult(a1_times_a2, a1, a2); + reduce(o, a1_times_a2); + + // clear all + memset(a1_times_a2, 0, (VEC_N_SIZE_64 << 1) * sizeof(uint64_t)); +} diff --git a/crypto_kem/hqc-rmrs-256/avx2/gf2x.h b/crypto_kem/hqc-rmrs-256/avx2/gf2x.h new file mode 100644 index 00000000..3727e3ae --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/gf2x.h @@ -0,0 +1,17 @@ +#ifndef GF2X_H +#define GF2X_H + + +/** + * @file gf2x.h + * @brief Header file for gf2x.c + */ + +#include + +#include + +void PQCLEAN_HQCRMRS256_AVX2_vect_mul(uint64_t *o, const uint64_t *a1, const uint64_t *a2); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/avx2/hqc.c b/crypto_kem/hqc-rmrs-256/avx2/hqc.c new file mode 100644 index 00000000..bc67c912 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/hqc.c @@ -0,0 +1,138 @@ +#include "code.h" +#include "gf2x.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +/** + * @file hqc.c + * @brief Implementation of hqc.h + */ + + + +/** + * @brief Keygen of the HQC_PKE IND_CPA scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS256_AVX2_hqc_pke_keygen(unsigned char *pk, unsigned char *sk) { + AES_XOF_struct sk_seedexpander; + AES_XOF_struct pk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + uint8_t pk_seed[SEED_BYTES] = {0}; + uint64_t x[VEC_N_256_SIZE_64] = {0}; + uint64_t y[VEC_N_256_SIZE_64] = {0}; + uint64_t h[VEC_N_256_SIZE_64] = {0}; + uint64_t s[VEC_N_256_SIZE_64] = {0}; + + // Create seed_expanders for public key and secret key + randombytes(sk_seed, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + randombytes(pk_seed, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute secret key + PQCLEAN_HQCRMRS256_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQCRMRS256_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, y, PARAM_OMEGA); + + // Compute public key + PQCLEAN_HQCRMRS256_AVX2_vect_set_random(&pk_seedexpander, h); + PQCLEAN_HQCRMRS256_AVX2_vect_mul(s, y, h); + PQCLEAN_HQCRMRS256_AVX2_vect_add(s, x, s, VEC_N_256_SIZE_64); + + // Parse keys to string + PQCLEAN_HQCRMRS256_AVX2_hqc_public_key_to_string(pk, pk_seed, s); + PQCLEAN_HQCRMRS256_AVX2_hqc_secret_key_to_string(sk, sk_seed, pk); + +} + + + +/** + * @brief Encryption of the HQC_PKE IND_CPA scheme + * + * The cihertext is composed of vectors u and v. + * + * @param[out] u Vector u (first part of the ciphertext) + * @param[out] v Vector v (second part of the ciphertext) + * @param[in] m Vector representing the message to encrypt + * @param[in] theta Seed used to derive randomness required for encryption + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS256_AVX2_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk) { + AES_XOF_struct seedexpander; + uint64_t h[VEC_N_256_SIZE_64] = {0}; + uint64_t s[VEC_N_256_SIZE_64] = {0}; + uint64_t r1[VEC_N_256_SIZE_64] = {0}; + uint64_t r2[VEC_N_256_SIZE_64] = {0}; + uint64_t e[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp1[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_256_SIZE_64] = {0}; + + // Create seed_expander from theta + seedexpander_init(&seedexpander, theta, theta + 32, SEEDEXPANDER_MAX_LENGTH); + + // Retrieve h and s from public key + PQCLEAN_HQCRMRS256_AVX2_hqc_public_key_from_string(h, s, pk); + + // Generate r1, r2 and e + PQCLEAN_HQCRMRS256_AVX2_vect_set_random_fixed_weight(&seedexpander, r1, PARAM_OMEGA_R); + PQCLEAN_HQCRMRS256_AVX2_vect_set_random_fixed_weight(&seedexpander, r2, PARAM_OMEGA_R); + PQCLEAN_HQCRMRS256_AVX2_vect_set_random_fixed_weight(&seedexpander, e, PARAM_OMEGA_E); + + // Compute u = r1 + r2.h + PQCLEAN_HQCRMRS256_AVX2_vect_mul(u, r2, h); + PQCLEAN_HQCRMRS256_AVX2_vect_add(u, r1, u, VEC_N_256_SIZE_64); + + // Compute v = m.G by encoding the message + PQCLEAN_HQCRMRS256_AVX2_code_encode(v, m); + PQCLEAN_HQCRMRS256_AVX2_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + + // Compute v = m.G + s.r2 + e + PQCLEAN_HQCRMRS256_AVX2_vect_mul(tmp2, r2, s); + PQCLEAN_HQCRMRS256_AVX2_vect_add(tmp2, e, tmp2, VEC_N_256_SIZE_64); + PQCLEAN_HQCRMRS256_AVX2_vect_add(tmp2, tmp1, tmp2, VEC_N_256_SIZE_64); + PQCLEAN_HQCRMRS256_AVX2_vect_resize(v, PARAM_N1N2, tmp2, PARAM_N); + +} + + + +/** + * @brief Decryption of the HQC_PKE IND_CPA scheme + * + * @param[out] m Vector representing the decrypted message + * @param[in] u Vector u (first part of the ciphertext) + * @param[in] v Vector v (second part of the ciphertext) + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS256_AVX2_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk) { + uint64_t x[VEC_N_256_SIZE_64] = {0}; + uint64_t y[VEC_N_256_SIZE_64] = {0}; + uint8_t pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t tmp1[VEC_N_256_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_256_SIZE_64] = {0}; + + // Retrieve x, y, pk from secret key + PQCLEAN_HQCRMRS256_AVX2_hqc_secret_key_from_string(x, y, pk, sk); + + // Compute v - u.y + PQCLEAN_HQCRMRS256_AVX2_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + PQCLEAN_HQCRMRS256_AVX2_vect_mul(tmp2, y, u); + PQCLEAN_HQCRMRS256_AVX2_vect_add(tmp2, tmp1, tmp2, VEC_N_256_SIZE_64); + + + // Compute m by decoding v - u.y + PQCLEAN_HQCRMRS256_AVX2_code_decode(m, tmp2); +} diff --git a/crypto_kem/hqc-rmrs-256/avx2/hqc.h b/crypto_kem/hqc-rmrs-256/avx2/hqc.h new file mode 100644 index 00000000..b7e3bd8d --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/hqc.h @@ -0,0 +1,21 @@ +#ifndef HQC_H +#define HQC_H + + +/** + * @file hqc.h + * @brief Functions of the HQC_PKE IND_CPA scheme + */ + +#include + +#include + +void PQCLEAN_HQCRMRS256_AVX2_hqc_pke_keygen(unsigned char *pk, unsigned char *sk); + +void PQCLEAN_HQCRMRS256_AVX2_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk); + +void PQCLEAN_HQCRMRS256_AVX2_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/avx2/kem.c b/crypto_kem/hqc-rmrs-256/avx2/kem.c new file mode 100644 index 00000000..bc795aba --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/kem.c @@ -0,0 +1,138 @@ +#include "api.h" +#include "fips202.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "sha2.h" +#include "vector.h" +#include +#include +/** + * @file kem.c + * @brief Implementation of api.h + */ + + + +/** + * @brief Keygen of the HQC_KEM IND_CAA2 scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + * @returns 0 if keygen is successful + */ +int PQCLEAN_HQCRMRS256_AVX2_crypto_kem_keypair(unsigned char *pk, unsigned char *sk) { + + PQCLEAN_HQCRMRS256_AVX2_hqc_pke_keygen(pk, sk); + return 0; +} + + + +/** + * @brief Encapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ct String containing the ciphertext + * @param[out] ss String containing the shared secret + * @param[in] pk String containing the public key + * @returns 0 if encapsulation is successful + */ +int PQCLEAN_HQCRMRS256_AVX2_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk) { + + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint64_t u[VEC_N_256_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Computing m + PQCLEAN_HQCRMRS256_AVX2_vect_set_random_from_randombytes(m); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m + PQCLEAN_HQCRMRS256_AVX2_hqc_pke_encrypt(u, v, m, theta, pk); + + // Computing d + sha512(d, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Computing ciphertext + PQCLEAN_HQCRMRS256_AVX2_hqc_ciphertext_to_string(ct, u, v, d); + + + return 0; +} + + + +/** + * @brief Decapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ss String containing the shared secret + * @param[in] ct String containing the cipĥertext + * @param[in] sk String containing the secret key + * @returns 0 if decapsulation is successful, -1 otherwise + */ +int PQCLEAN_HQCRMRS256_AVX2_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk) { + + int8_t result = -1; + uint64_t u[VEC_N_256_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t u2[VEC_N_256_SIZE_64] = {0}; + uint64_t v2[VEC_N1N2_256_SIZE_64] = {0}; + unsigned char d2[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Retrieving u, v and d from ciphertext + PQCLEAN_HQCRMRS256_AVX2_hqc_ciphertext_from_string(u, v, d, ct); + + // Retrieving pk from sk + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); + + // Decryting + PQCLEAN_HQCRMRS256_AVX2_hqc_pke_decrypt(m, u, v, sk); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m' + PQCLEAN_HQCRMRS256_AVX2_hqc_pke_encrypt(u2, v2, m, theta, pk); + + // Computing d' + sha512(d2, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Abort if c != c' or d != d' + result = (PQCLEAN_HQCRMRS256_AVX2_vect_compare(u, u2, VEC_N_SIZE_BYTES) == 0 && PQCLEAN_HQCRMRS256_AVX2_vect_compare(v, v2, VEC_N1N2_SIZE_BYTES) == 0 && PQCLEAN_HQCRMRS256_AVX2_vect_compare((uint64_t *)d, (uint64_t *)d2, SHA512_BYTES) == 0); + for (size_t i = 0 ; i < SHARED_SECRET_BYTES ; i++) { + ss[i] = result * ss[i]; + } + result--; + + + return result; +} diff --git a/crypto_kem/hqc-rmrs-256/avx2/parameters.h b/crypto_kem/hqc-rmrs-256/avx2/parameters.h new file mode 100644 index 00000000..3f4a6085 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/parameters.h @@ -0,0 +1,109 @@ +#ifndef HQC_PARAMETERS_H +#define HQC_PARAMETERS_H + + +/** + * @file parameters.h + * @brief Parameters of the HQC_KEM IND-CCA2 scheme + */ + +#include "api.h" +#include "api.h" + + +#define CEIL_DIVIDE(a, b) (((a)/(b)) + ((a) % (b) == 0 ? 0 : 1)) /*!< Divide a by b and ceil the result*/ +#define BITMASK(a, size) ((1UL << ((a) % (size))) - 1) /*!< Create a mask*/ + + +/* + #define PARAM_N Define the parameter n of the scheme + #define PARAM_N1 Define the parameter n1 of the scheme (length of Reed-Solomon code) + #define PARAM_N2 Define the parameter n2 of the scheme (length of Duplicated Reed-Muller code) + #define PARAM_N1N2 Define the length in bits of the Concatenated code + #define PARAM_OMEGA Define the parameter omega of the scheme + #define PARAM_OMEGA_E Define the parameter omega_e of the scheme + #define PARAM_OMEGA_R Define the parameter omega_r of the scheme + #define PARAM_SECURITY Define the security level corresponding to the chosen parameters + #define PARAM_DFR_EXP Define the decryption failure rate corresponding to the chosen parameters + + #define SECRET_KEY_BYTES Define the size of the secret key in bytes + #define PUBLIC_KEY_BYTES Define the size of the public key in bytes + #define SHARED_SECRET_BYTES Define the size of the shared secret in bytes + #define CIPHERTEXT_BYTES Define the size of the ciphertext in bytes + + #define UTILS_REJECTION_THRESHOLD Define the rejection threshold used to generate given weight vectors (see vector_set_random_fixed_weight function) + #define VEC_N_SIZE_BYTES Define the size of the array used to store a PARAM_N sized vector in bytes + #define VEC_K_SIZE_BYTES Define the size of the array used to store a PARAM_K sized vector in bytes + #define VEC_N1Y_SIZE_BYTES Define the size of the array used to store a PARAM_N1 sized vector in bytes + #define VEC_N1N2_SIZE_BYTES Define the size of the array used to store a PARAM_N1N2 sized vector in bytes + + #define VEC_N_SIZE_64 Define the size of the array used to store a PARAM_N sized vector in 64 bits + #define VEC_K_SIZE_64 Define the size of the array used to store a PARAM_K sized vector in 64 bits + #define VEC_N1_SIZE_64 Define the size of the array used to store a PARAM_N1 sized vector in 64 bits + #define VEC_N1N2_SIZE_64 Define the size of the array used to store a PARAM_N1N2 sized vector in 64 bits + + #define VEC_N_256_SIZE_64 Define the size of the array of 64 bits elements used to store an array of size PARAM_N considered as elements of 256 bits + #define VEC_N1N2_256_SIZE_64 Define the size of the array of 64 bits elements used to store an array of size PARAM_N1N2 considered as elements of 256 bits + + #define PARAM_DELTA Define the parameter delta of the scheme (correcting capacity of the Reed-Solomon code) + #define PARAM_M Define a positive integer + #define PARAM_GF_POLY Generator polynomial of galois field GF(2^PARAM_M), represented in hexadecimial form + #define PARAM_GF_MUL_ORDER Define the size of the multiplicative group of GF(2^PARAM_M), i.e 2^PARAM_M -1 + #define PARAM_K Define the size of the information bits of the Reed-Solomon code + #define PARAM_G Define the size of the generator polynomial of Reed-Solomon code + #define PARAM_FFT The additive FFT takes a 2^PARAM_FFT polynomial as input + We use the FFT to compute the roots of sigma, whose degree if PARAM_DELTA=23 + The smallest power of 2 greater than 23+1 is 32=2^5 + #define RS_POLY_COEFS Coefficients of the generator polynomial of the Reed-Solomon code + + #define RED_MASK A mask fot the higher bits of a vector + #define SHA512_BYTES Define the size of SHA512 output in bytes + #define SEED_BYTES Define the size of the seed in bytes + #define SEEDEXPANDER_MAX_LENGTH Define the seed expander max length +*/ + +#define PARAM_N 59957 +#define PARAM_N1 78 +#define PARAM_N2 768 +#define PARAM_N1N2 59904 +#define PARAM_OMEGA 133 +#define PARAM_OMEGA_E 153 +#define PARAM_OMEGA_R 153 +#define PARAM_SECURITY 256 +#define PARAM_DFR_EXP 256 + +#define SECRET_KEY_BYTES PQCLEAN_HQCRMRS256_AVX2_CRYPTO_SECRETKEYBYTES +#define PUBLIC_KEY_BYTES PQCLEAN_HQCRMRS256_AVX2_CRYPTO_PUBLICKEYBYTES +#define SHARED_SECRET_BYTES PQCLEAN_HQCRMRS256_AVX2_CRYPTO_BYTES +#define CIPHERTEXT_BYTES PQCLEAN_HQCRMRS256_AVX2_CRYPTO_CIPHERTEXTBYTES + +#define UTILS_REJECTION_THRESHOLD 16728003 +#define VEC_N_SIZE_BYTES CEIL_DIVIDE(PARAM_N, 8) +#define VEC_K_SIZE_BYTES PARAM_K +#define VEC_N1_SIZE_BYTES PARAM_N1 +#define VEC_N1N2_SIZE_BYTES CEIL_DIVIDE(PARAM_N1N2, 8) + +#define VEC_N_SIZE_64 CEIL_DIVIDE(PARAM_N, 64) +#define VEC_K_SIZE_64 CEIL_DIVIDE(PARAM_K, 8) +#define VEC_N1_SIZE_64 CEIL_DIVIDE(PARAM_N1, 8) +#define VEC_N1N2_SIZE_64 CEIL_DIVIDE(PARAM_N1N2, 64) + +#define PARAM_N_MULT 71424 +#define VEC_N_256_SIZE_64 (CEIL_DIVIDE(PARAM_N_MULT, 256) << 2) +#define VEC_N1N2_256_SIZE_64 (CEIL_DIVIDE(PARAM_N1N2, 256) << 2) + +#define PARAM_DELTA 23 +#define PARAM_M 8 +#define PARAM_GF_POLY 0x11D +#define PARAM_GF_MUL_ORDER 255 +#define PARAM_K 32 +#define PARAM_G 47 +#define PARAM_FFT 5 +#define RS_POLY_COEFS 111,204,161,232,250,107,58,200,161,225,89,57,143,12,106,116,218,68,19,127,236,48,3,210,243,174,203,57,78,15,185,168,204,194,152,17,189,200,197,162,244,8,248,163,217,31,1 + +#define RED_MASK 0x1fffffffffffffUL +#define SHA512_BYTES 64 +#define SEED_BYTES 40 +#define SEEDEXPANDER_MAX_LENGTH 4294967295 + +#endif diff --git a/crypto_kem/hqc-rmrs-256/avx2/parsing.c b/crypto_kem/hqc-rmrs-256/avx2/parsing.c new file mode 100644 index 00000000..e5eca6ac --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/parsing.c @@ -0,0 +1,121 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file parsing.c + * @brief Functions to parse secret key, public key and ciphertext of the HQC scheme + */ + + + +/** + * @brief Parse a secret key into a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] sk String containing the secret key + * @param[in] sk_seed Seed used to generate the secret key + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS256_AVX2_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk) { + memcpy(sk, sk_seed, SEED_BYTES); + memcpy(sk + SEED_BYTES, pk, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a secret key from a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] x uint64_t representation of vector x + * @param[out] y uint64_t representation of vector y + * @param[out] pk String containing the public key + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS256_AVX2_hqc_secret_key_from_string(uint64_t *x, uint64_t *y, uint8_t *pk, const uint8_t *sk) { + AES_XOF_struct sk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + + memcpy(sk_seed, sk, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + PQCLEAN_HQCRMRS256_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQCRMRS256_AVX2_vect_set_random_fixed_weight(&sk_seedexpander, y, PARAM_OMEGA); + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a public key into a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] pk String containing the public key + * @param[in] pk_seed Seed used to generate the public key + * @param[in] s uint8_t representation of vector s + */ +void PQCLEAN_HQCRMRS256_AVX2_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s) { + memcpy(pk, pk_seed, SEED_BYTES); + memcpy(pk + SEED_BYTES, s, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Parse a public key from a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] h uint8_t representation of vector h + * @param[out] s uint8_t representation of vector s + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS256_AVX2_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk) { + AES_XOF_struct pk_seedexpander; + uint8_t pk_seed[SEED_BYTES] = {0}; + + memcpy(pk_seed, pk, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + PQCLEAN_HQCRMRS256_AVX2_vect_set_random(&pk_seedexpander, h); + + memcpy(s, pk + SEED_BYTES, VEC_N_SIZE_BYTES); +} + + +/** + * @brief Parse a ciphertext into a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] ct String containing the ciphertext + * @param[in] u uint8_t representation of vector u + * @param[in] v uint8_t representation of vector v + * @param[in] d String containing the hash d + */ +void PQCLEAN_HQCRMRS256_AVX2_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d) { + memcpy(ct, u, VEC_N_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, d, SHA512_BYTES); +} + + +/** + * @brief Parse a ciphertext from a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] u uint8_t representation of vector u + * @param[out] v uint8_t representation of vector v + * @param[out] d String containing the hash d + * @param[in] ct String containing the ciphertext + */ +void PQCLEAN_HQCRMRS256_AVX2_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct) { + memcpy(u, ct, VEC_N_SIZE_BYTES); + memcpy(v, ct + VEC_N_SIZE_BYTES, VEC_N1N2_SIZE_BYTES); + memcpy(d, ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, SHA512_BYTES); +} diff --git a/crypto_kem/hqc-rmrs-256/avx2/parsing.h b/crypto_kem/hqc-rmrs-256/avx2/parsing.h new file mode 100644 index 00000000..15bf5a64 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/parsing.h @@ -0,0 +1,29 @@ +#ifndef PARSING_H +#define PARSING_H + + +/** + * @file parsing.h + * @brief Header file for parsing.c + */ + +#include + +#include + +void PQCLEAN_HQCRMRS256_AVX2_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk); + +void PQCLEAN_HQCRMRS256_AVX2_hqc_secret_key_from_string(uint64_t *x, uint64_t *y, uint8_t *pk, const uint8_t *sk); + + +void PQCLEAN_HQCRMRS256_AVX2_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s); + +void PQCLEAN_HQCRMRS256_AVX2_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk); + + +void PQCLEAN_HQCRMRS256_AVX2_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d); + +void PQCLEAN_HQCRMRS256_AVX2_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/avx2/reed_muller.c b/crypto_kem/hqc-rmrs-256/avx2/reed_muller.c new file mode 100644 index 00000000..d2f7d729 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/reed_muller.c @@ -0,0 +1,376 @@ +#include "parameters.h" +#include "reed_muller.h" +#include +#include +#include +/** + * @file reed_muller.c + * Constant time implementation of Reed-Muller code RM(1,7) + */ + + +// number of repeated code words +#define MULTIPLICITY CEIL_DIVIDE(PARAM_N2, 128) + +// copy bit 0 into all bits of a 64 bit value +#define BIT0MASK(x) (int64_t)(-((x) & 1)) + +static void encode(uint64_t *word, uint32_t message); +static void expand_and_sum(__m256i *dst, const uint64_t *src); +static void hadamard(__m256i *src, __m256i *dst); +static int32_t find_peaks(__m256i *transform); + + + +/** + * @brief Encode a single byte into a single codeword using RM(1,7) + * + * Encoding matrix of this code: + * bit pattern (note that bits are numbered big endian) + * 0 aaaaaaaa aaaaaaaa aaaaaaaa aaaaaaaa + * 1 cccccccc cccccccc cccccccc cccccccc + * 2 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0 + * 3 ff00ff00 ff00ff00 ff00ff00 ff00ff00 + * 4 ffff0000 ffff0000 ffff0000 ffff0000 + * 5 00000000 ffffffff 00000000 ffffffff + * 6 00000000 00000000 ffffffff ffffffff + * 7 ffffffff ffffffff ffffffff ffffffff + * + * @param[out] word An RM(1,7) codeword + * @param[in] message A message to encode + */ +static void encode(uint64_t *word, uint32_t message) { + // the four parts of the word are identical + // except for encoding bits 5 and 6 + uint32_t first_word; + // bit 7 flips all the bits, do that first to save work + first_word = BIT0MASK(message >> 7); + // bits 0, 1, 2, 3, 4 are the same for all four longs + // (Warning: in the bit matrix above, low bits are at the left!) + first_word ^= BIT0MASK(message >> 0) & 0xaaaaaaaa; + first_word ^= BIT0MASK(message >> 1) & 0xcccccccc; + first_word ^= BIT0MASK(message >> 2) & 0xf0f0f0f0; + first_word ^= BIT0MASK(message >> 3) & 0xff00ff00; + first_word ^= BIT0MASK(message >> 4) & 0xffff0000; + // we can store this in the first quarter + ((uint32_t *) word)[0] = first_word; + // bit 5 flips entries 1 and 3; bit 6 flips 2 and 3 + first_word ^= BIT0MASK(message >> 5); + ((uint32_t *) word)[1] = first_word; + first_word ^= BIT0MASK(message >> 6); + ((uint32_t *) word)[3] = first_word; + first_word ^= BIT0MASK(message >> 5); + ((uint32_t *) word)[2] = first_word; +} + + + +/** + * @brief Add multiple codewords into expanded codeword + * + * Note: this does not write the codewords as -1 or +1 as the green machine does + * instead, just 0 and 1 is used. + * The resulting hadamard transform has: + * all values are halved + * the first entry is 64 too high + * + * @param[out] dst Structure that contain the expanded codeword + * @param[in] src Structure that contain the codeword + */ +inline void expand_and_sum(__m256i *dst, const uint64_t *src) { + uint16_t v[16]; + for (size_t part = 0 ; part < 8 ; part++) { + dst[part] = _mm256_setzero_si256(); + } + for (size_t copy = 0 ; copy < MULTIPLICITY ; copy++) { + for (size_t part = 0; part < 8; part++) { + for (size_t bit = 0; bit < 16; bit++) { + v[bit] = (((uint16_t *)(&src[2 * copy]))[part] >> bit) & 1; + } + dst[part] += _mm256_set_epi16(v[15], v[14], v[13], v[12], v[11], v[10], v[9], v[8], + v[7], v[6], v[5], v[4], v[3], v[2], v[1], v[0]); + } + } +} + + + +/** + * @brief Hadamard transform + * + * Perform hadamard transform of src and store result in dst + * src is overwritten: it is also used as intermediate buffer + * Method is best explained if we use H(3) instead of H(7): + * + * The routine multiplies by the matrix H(3): + * [1 1 1 1 1 1 1 1] + * [1 -1 1 -1 1 -1 1 -1] + * [1 1 -1 -1 1 1 -1 -1] + * [a b c d e f g h] * [1 -1 -1 1 1 -1 -1 1] = result of routine + * [1 1 1 1 -1 -1 -1 -1] + * [1 -1 1 -1 -1 1 -1 1] + * [1 1 -1 -1 -1 -1 1 1] + * [1 -1 -1 1 -1 1 1 -1] + * You can do this in three passes, where each pass does this: + * set lower half of buffer to pairwise sums, + * and upper half to differences + * index 0 1 2 3 4 5 6 7 + * input: a, b, c, d, e, f, g, h + * pass 1: a+b, c+d, e+f, g+h, a-b, c-d, e-f, g-h + * pass 2: a+b+c+d, e+f+g+h, a-b+c-d, e-f+g-h, a+b-c-d, e+f-g-h, a-b-c+d, e-f-g+h + * pass 3: a+b+c+d+e+f+g+h a+b-c-d+e+f-g-h a+b+c+d-e-f-g-h a+b-c-d-e+-f+g+h + * a-b+c-d+e-f+g-h a-b-c+d+e-f-g+h a-b+c-d-e+f-g+h a-b-c+d-e+f+g-h + * This order of computation is chosen because it vectorises well. + * Likewise, this routine multiplies by H(7) in seven passes. + * + * @param[out] src Structure that contain the expanded codeword + * @param[out] dst Structure that contain the expanded codeword + */ +inline void hadamard(__m256i *src, __m256i *dst) { + // the passes move data: + // src -> dst -> src -> dst -> src -> dst -> src -> dst + // using p1 and p2 alternately + __m256i *p1 = src; + __m256i *p2 = dst; + __m256i *p3; + for (size_t pass = 0 ; pass < 7 ; pass++) { + // warning: hadd works "within lanes" as Intel call it + // so you have to swap the middle 64 bit blocks of the result + for (size_t part = 0 ; part < 4 ; part++) { + p2[part] = _mm256_permute4x64_epi64(_mm256_hadd_epi16(p1[2 * part], p1[2 * part + 1]), 0xd8); + p2[part + 4] = _mm256_permute4x64_epi64(_mm256_hsub_epi16(p1[2 * part], p1[2 * part + 1]), 0xd8); + } + // swap p1, p2 for next round + p3 = p1; + p1 = p2; + p2 = p3; + } +} + + + +/** + * @brief Finding the location of the highest value + * + * This is the final step of the green machine: find the location of the highest value, + * and add 128 if the peak is positive + * Notes on decoding + * The standard "Green machine" decoder words as follows: + * if the received codeword is W, compute (2 * W - 1) * H7 + * The entries of the resulting vector are always even and vary from + * -128 (= the complement is a code word, add bit 7 to decode) + * via 0 (this is a different codeword) + * to 128 (this is the code word). + * + * Our decoding differs in two ways: + * - We take W instead of 2 * W - 1 (so the entries are 0,1 instead of -1,1) + * - We take the sum of the repititions (so the entries are 0..MULTIPLICITY) + * This implies that we have to subtract 64M (M=MULTIPLICITY) + * from the first entry to make sure the first codewords is handled properly + * and that the entries vary from -64M to 64M. + * -64M or 64M stands for a perfect codeword. + * If there are fewer than 32M errors, there is always a unique codeword + * which an entry with absolute value > 32M; + * this is because an error changes an entry by 1. + * The highest number that seem to be decodable is 50 errors, so that the + * highest entries in the hadamard transform can be as low as 12. + * But this is different for the repeated code. + * Because multiple codewords are added, this changes: the lowest value of the + * hadamard transform of the sum of six words is seen to be as low as 43 (!), + * which is way less than 12*6. + * + * It is possible that there are more errors, but the word is still uniquely + * decodable: we found a word with distance of 50 from the nearest codeword. + * That means that the highest entry can be as low as 14M. + * Since we have to do binary search, we search for the range 1-64M + * which can be done in 6+l2g(M) steps. + * The binary search is based on (values>32M are unique): + * M 32M min> max> firstStep #steps + * 2 64 1 64 33 +- 16 6 + * 4 128 1 128 65 +- 32 7 + * 6 192 1 192 129 +- 64 8 + * + * As a check, we run a sample for M=6 to see the peak value; it ranged + * from 43 to 147, so my analysis looks right. Also, it shows that decoding + * far beyond the bound of 32M is needed. + * + * For the vectors, it would be tempting to use 8 bit ints, + * because the values "almost" fit in there. + * We could use some trickery to fit it in 8 bits, like saturated add or + * division by 2 in a late step. + * Unfortunately, these instructions do not exist. + * the adds _mm512_adds_epi8 is available only on the latest processors, + * and division, shift, mulhi are not available at all for 8 bits. + * So, we use 16 bit ints. + * + * For the search of the optimal comparison value, + * remember the transform contains 64M-d, + * where d are the distances to the codewords. + * The highest value gives the most likely codeword. + * There is not fast vectorized way to find this value, so we search for the + * maximum value itself. + * In each pass, we collect a bit map of the transform values that are, + * say >bound. There are three cases: + * bit map = 0: all code words are further away than 64M-bound (decrease bound) + * bit map has one bit: one unique code word has distance < 64M-bound + * bit map has multiple bits: multiple words (increase bound) + * We will search for the lowest value of bound that gives a nonzero bit map. + * + * @param[in] transform Structure that contain the expanded codeword + */ +inline int32_t find_peaks(__m256i *transform) { + // a whole lot of vector variables + __m256i bitmap, abs_rows[8], bound, active_row, max_abs_rows; + __m256i peak_mask; + // compute absolute value of transform + for (size_t i = 0 ; i < 8 ; i++) { + abs_rows[i] = _mm256_abs_epi16(transform[i]); + } + // compute a vector of 16 elements which contains the maximum somewhere + // (later used to compute bits 0 through 3 of message) + max_abs_rows = abs_rows[0]; + for (size_t i = 1 ; i < 8 ; i++) { + max_abs_rows = _mm256_max_epi16(max_abs_rows, abs_rows[i]); + } + + // do binary search for the highest value that is lower than the maximum + // loop invariant: lower gives bit map = 0, lower + width gives bit map > 0 + int32_t lower = 1; + // this gives 64, 128 or 256 for MULTIPLICITY = 2, 4, 6 + int32_t width = 1 << (5 + MULTIPLICITY / 2); + // if you don't unroll this loop, it fits in the loop cache + // uncomment the line below to speeding up the program by a few percent + // #pragma GCC unroll 0 + while (width > 1) { + width >>= 1; + // compare with lower + width; put result in bitmap + // make vector from value of new bound + bound = _mm256_broadcastw_epi16(_mm_cvtsi32_si128(lower + width)); + bitmap = _mm256_cmpgt_epi16(max_abs_rows, bound); + // step up if there are any matches + // rely on compiler to use conditional move here + int32_t step_mask = _mm256_testz_si256(bitmap, bitmap) - 1; + lower += step_mask & width; + } + // lower+width contains the maximum value of the vector + // or less, if the maximum is very high (which is OK) + // normally, there is one maximum, but sometimes there are more + // find where the maxima occur in the maximum vector + // (each determines lower 4 bits of peak position) + // construct vector filled with bound-1 + bound = _mm256_broadcastw_epi16(_mm_cvtsi32_si128(lower + width - 1)); + + // find in which of the 8 groups a maximum occurs to compute bits 4, 5, 6 of message + // find lowest value by searching backwards skip first check to save time + size_t message = 0x70; + for (int32_t i = 7 ; i >= 0 ; i--) { + bitmap = _mm256_cmpgt_epi16(abs_rows[i], bound); + int message_mask = (-(int16_t)(_mm256_testz_si256(bitmap, bitmap) == 0)) >> 15; + message ^= message_mask & (message ^ (unsigned)i << 4); + } + // we decided which row of the matrix contains the lowest match + // select proper row + int8_t index = message >> 4; + __m256i res; + __m256i tmp = (__m256i) { + 0ULL, 0ULL, 0ULL, 0ULL + }; + + for (int8_t i = 0; i < 8; i++) { + int8_t abs_value = (int8_t)(index - i); + int8_t mask1 = abs_value >> 7; + abs_value ^= mask1; + abs_value -= mask1; + int8_t mask2 = ((uint8_t) - abs_value >> 7); + int64_t mask3 = (-1ULL) + mask2; + __m256i vect_mask = (__m256i) { + mask3, mask3, mask3, mask3 + }; + res = _mm256_and_si256(abs_rows[i], vect_mask); + tmp = _mm256_or_si256(tmp, res); + } + + active_row = tmp; + + // get the column number of the vector element + // by setting the bits corresponding to the columns + // and then adding elements within two groups of 8 + peak_mask = _mm256_cmpgt_epi16(active_row, bound); + peak_mask &= _mm256_set_epi16(-32768, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1); + for (int32_t i = 0 ; i < 3 ; i++) { + peak_mask = _mm256_hadd_epi16(peak_mask, peak_mask); + } + // add low 4 bits of message + message |= __tzcnt_u16(_mm256_extract_epi16(peak_mask, 0) + _mm256_extract_epi16(peak_mask, 8)); + + // set bit 7 if sign of biggest value is positive + // make sure a jump isn't generated by the compiler + tmp = (__m256i) { + 0ULL, 0ULL, 0ULL, 0ULL + }; + for (uint32_t i = 0; i < 8; i++) { + int64_t message_mask = (-(int64_t)(i == message / 16)) >> 63; + __m256i vect_mask = (__m256i) { + message_mask, message_mask, message_mask, message_mask + }; + tmp = _mm256_or_si256(tmp, _mm256_and_si256(vect_mask, transform[i])); + } + uint16_t result = 0; + for (uint32_t i = 0; i < 16; i++) { + uint16_t *ptr = (uint16_t *) &tmp; + int32_t message_mask = (-(int32_t)(i == message % 16)) >> (sizeof(int32_t) * 8 - 1); + result |= message_mask & ptr[i]; + } + message |= (0x8000 & ~result) >> 8; + return message; +} + + + +/** + * @brief Encodes the received word + * + * The message consists of N1 bytes each byte is encoded into PARAM_N2 bits, + * or MULTIPLICITY repeats of 128 bits + * + * @param[out] cdw Array of size VEC_N1N2_SIZE_64 receiving the encoded message + * @param[in] msg Array of size VEC_N1_SIZE_64 storing the message + */ +void PQCLEAN_HQCRMRS256_AVX2_reed_muller_encode(uint64_t *cdw, const uint64_t *msg) { + for (size_t i = 0 ; i < VEC_N1_SIZE_BYTES ; i++) { + // fill entries i * MULTIPLICITY to (i+1) * MULTIPLICITY + // encode first word + encode(&cdw[2 * i * MULTIPLICITY], ((uint8_t *)msg)[i]); + // copy to other identical codewords + for (size_t copy = 1 ; copy < MULTIPLICITY ; copy++) { + memcpy(&cdw[2 * (i * MULTIPLICITY + copy)], &cdw[2 * i * MULTIPLICITY], 2 * sizeof(uint64_t)); + } + } +} + + + +/** + * @brief Decodes the received word + * + * Decoding uses fast hadamard transform, for a more complete picture on Reed-Muller decoding, see MacWilliams, Florence Jessie, and Neil James Alexander Sloane. + * The theory of error-correcting codes codes @cite macwilliams1977theory + * + * @param[out] msg Array of size VEC_N1_SIZE_64 receiving the decoded message + * @param[in] cdw Array of size VEC_N1N2_SIZE_64 storing the received word + */ +void PQCLEAN_HQCRMRS256_AVX2_reed_muller_decode(uint64_t *msg, const uint64_t *cdw) { + __m256i expanded[8]; + __m256i transform[8]; + for (size_t i = 0 ; i < VEC_N1_SIZE_BYTES ; i++) { + // collect the codewords + expand_and_sum(expanded, &cdw[2 * i * MULTIPLICITY]); + // apply hadamard transform + hadamard(expanded, transform); + // fix the first entry to get the half Hadamard transform + transform[0] -= _mm256_set_epi16(0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 64 * MULTIPLICITY); + // finish the decoding + ((uint8_t *)msg)[i] = find_peaks(transform); + } +} diff --git a/crypto_kem/hqc-rmrs-256/avx2/reed_muller.h b/crypto_kem/hqc-rmrs-256/avx2/reed_muller.h new file mode 100644 index 00000000..d51aefdd --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/reed_muller.h @@ -0,0 +1,20 @@ +#ifndef REED_MULLER_H +#define REED_MULLER_H + + +/** + * @file reed_muller.h + * Header file of reed_muller.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS256_AVX2_reed_muller_encode(uint64_t *cdw, const uint64_t *msg); + +void PQCLEAN_HQCRMRS256_AVX2_reed_muller_decode(uint64_t *msg, const uint64_t *cdw); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/avx2/reed_solomon.c b/crypto_kem/hqc-rmrs-256/avx2/reed_solomon.c new file mode 100644 index 00000000..4fe0a19c --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/reed_solomon.c @@ -0,0 +1,340 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include "reed_solomon.h" +#include +#include +#include +/** + * @file reed_solomon.c + * Constant time implementation of Reed-Solomon codes + */ + + +static void compute_syndromes(uint16_t *syndromes, uint8_t *cdw); +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes); +static void compute_roots(uint8_t *error, uint16_t *sigma); +static void compute_z_poly(uint16_t *z, const uint16_t *sigma, uint8_t degree, const uint16_t *syndromes); +static void compute_error_values(uint16_t *error_values, const uint16_t *z, const uint8_t *error); +static void correct_errors(uint8_t *cdw, const uint16_t *error_values); + +static const uint16_t alpha_ij_pow [46][77] = {{2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60}, {4, 16, 64, 29, 116, 205, 19, 76, 45, 180, 234, 143, 6, 24, 96, 157, 78, 37, 148, 106, 181, 238, 159, 70, 5, 20, 80, 93, 105, 185, 222, 95, 97, 153, 94, 101, 137, 30, 120, 253, 211, 107, 177, 254, 223, 91, 113, 217, 67, 17, 68, 13, 52, 208, 103, 129, 62, 248, 199, 59, 236, 151, 102, 133, 46, 184, 218, 79, 33, 132, 42, 168, 154, 82, 85, 73, 57}, {8, 64, 58, 205, 38, 45, 117, 143, 12, 96, 39, 37, 53, 181, 193, 70, 10, 80, 186, 185, 161, 97, 47, 101, 15, 120, 231, 107, 127, 223, 182, 217, 134, 68, 26, 208, 206, 62, 237, 59, 197, 102, 23, 184, 169, 33, 21, 168, 41, 85, 146, 228, 115, 191, 145, 252, 179, 241, 219, 150, 196, 110, 87, 130, 100, 7, 56, 221, 166, 89, 242, 195, 86, 138, 36, 61, 245}, {16, 29, 205, 76, 180, 143, 24, 157, 37, 106, 238, 70, 20, 93, 185, 95, 153, 101, 30, 253, 107, 254, 91, 217, 17, 13, 208, 129, 248, 59, 151, 133, 184, 79, 132, 168, 82, 73, 228, 230, 198, 252, 123, 227, 150, 149, 165, 130, 200, 28, 221, 81, 121, 195, 172, 18, 61, 247, 203, 44, 250, 27, 173, 2, 32, 58, 135, 152, 117, 3, 48, 39, 74, 212, 193, 140, 40}, {32, 116, 38, 180, 3, 96, 156, 106, 193, 5, 160, 185, 190, 94, 15, 253, 214, 223, 226, 17, 26, 103, 124, 59, 51, 46, 169, 132, 77, 85, 114, 230, 145, 215, 255, 150, 55, 174, 100, 28, 167, 89, 239, 172, 36, 244, 235, 44, 233, 108, 1, 32, 116, 38, 180, 3, 96, 156, 106, 193, 5, 160, 185, 190, 94, 15, 253, 214, 223, 226, 17, 26, 103, 124, 59, 51, 46}, {64, 205, 45, 143, 96, 37, 181, 70, 80, 185, 97, 101, 120, 107, 223, 217, 68, 208, 62, 59, 102, 184, 33, 168, 85, 228, 191, 252, 241, 150, 110, 130, 7, 221, 89, 195, 138, 61, 251, 44, 207, 173, 8, 58, 38, 117, 12, 39, 53, 193, 10, 186, 161, 47, 15, 231, 127, 182, 134, 26, 206, 237, 197, 23, 169, 21, 41, 146, 115, 145, 179, 219, 196, 87, 100, 56, 166}, {128, 19, 117, 24, 156, 181, 140, 93, 161, 94, 60, 107, 163, 67, 26, 129, 147, 102, 109, 132, 41, 57, 209, 252, 255, 98, 87, 200, 224, 89, 155, 18, 245, 11, 233, 173, 16, 232, 45, 3, 157, 53, 159, 40, 185, 194, 137, 231, 254, 226, 68, 189, 248, 197, 46, 158, 168, 170, 183, 145, 123, 75, 110, 25, 28, 166, 249, 69, 61, 235, 176, 54, 2, 29, 38, 234, 48}, {29, 76, 143, 157, 106, 70, 93, 95, 101, 253, 254, 217, 13, 129, 59, 133, 79, 168, 73, 230, 252, 227, 149, 130, 28, 81, 195, 18, 247, 44, 27, 2, 58, 152, 3, 39, 212, 140, 186, 190, 202, 231, 225, 175, 26, 31, 118, 23, 158, 77, 146, 209, 229, 219, 55, 25, 56, 162, 155, 36, 243, 88, 54, 4, 116, 45, 6, 78, 181, 5, 105, 97, 137, 211, 223, 67, 52}, {58, 45, 12, 37, 193, 80, 161, 101, 231, 223, 134, 208, 237, 102, 169, 168, 146, 191, 179, 150, 87, 7, 166, 195, 36, 251, 125, 173, 64, 38, 143, 39, 181, 10, 185, 47, 120, 127, 217, 26, 62, 197, 184, 21, 85, 115, 252, 219, 110, 100, 221, 242, 138, 245, 44, 54, 8, 205, 117, 96, 53, 70, 186, 97, 15, 107, 182, 68, 206, 59, 23, 33, 41, 228, 145, 241, 196}, {116, 180, 96, 106, 5, 185, 94, 253, 223, 17, 103, 59, 46, 132, 85, 230, 215, 150, 174, 28, 89, 172, 244, 44, 108, 32, 38, 3, 156, 193, 160, 190, 15, 214, 226, 26, 124, 51, 169, 77, 114, 145, 255, 55, 100, 167, 239, 36, 235, 233, 1, 116, 180, 96, 106, 5, 185, 94, 253, 223, 17, 103, 59, 46, 132, 85, 230, 215, 150, 174, 28, 89, 172, 244, 44, 108, 32}, {232, 234, 39, 238, 160, 97, 60, 254, 134, 103, 118, 184, 84, 57, 145, 227, 220, 7, 162, 172, 245, 176, 71, 58, 180, 192, 181, 40, 95, 15, 177, 175, 208, 147, 46, 21, 73, 99, 241, 55, 200, 166, 43, 122, 44, 216, 128, 45, 48, 106, 10, 222, 202, 107, 226, 52, 237, 133, 66, 85, 209, 123, 196, 50, 167, 195, 144, 11, 54, 32, 76, 12, 148, 140, 185, 188, 211}, {205, 143, 37, 70, 185, 101, 107, 217, 208, 59, 184, 168, 228, 252, 150, 130, 221, 195, 61, 44, 173, 58, 117, 39, 193, 186, 47, 231, 182, 26, 237, 23, 21, 146, 145, 219, 87, 56, 242, 36, 139, 54, 64, 45, 96, 181, 80, 97, 120, 223, 68, 62, 102, 33, 85, 191, 241, 110, 7, 89, 138, 251, 207, 8, 38, 12, 53, 10, 161, 15, 127, 134, 206, 197, 169, 41, 115}, {135, 6, 53, 20, 190, 120, 163, 13, 237, 46, 84, 228, 229, 98, 100, 81, 69, 251, 131, 32, 45, 192, 238, 186, 94, 187, 217, 189, 236, 169, 82, 209, 241, 220, 28, 242, 72, 22, 173, 116, 201, 37, 140, 222, 15, 254, 34, 62, 204, 132, 146, 63, 75, 130, 167, 43, 245, 250, 4, 38, 24, 212, 80, 194, 253, 182, 52, 147, 184, 77, 183, 179, 149, 141, 89, 9, 203}, {19, 24, 181, 93, 94, 107, 67, 129, 102, 132, 57, 252, 98, 200, 89, 18, 11, 173, 232, 3, 53, 40, 194, 231, 226, 189, 197, 158, 170, 145, 75, 25, 166, 69, 235, 54, 29, 234, 37, 5, 95, 120, 91, 52, 59, 218, 82, 191, 227, 174, 221, 43, 247, 207, 32, 90, 39, 35, 111, 15, 225, 136, 237, 92, 77, 115, 246, 220, 56, 239, 122, 125, 4, 76, 96, 238, 105}, {38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169}, {76, 157, 70, 95, 253, 217, 129, 133, 168, 230, 227, 130, 81, 18, 44, 2, 152, 39, 140, 190, 231, 175, 31, 23, 77, 209, 219, 25, 162, 36, 88, 4, 45, 78, 5, 97, 211, 67, 62, 46, 154, 191, 171, 50, 89, 72, 176, 8, 90, 156, 10, 194, 187, 134, 124, 92, 41, 99, 75, 100, 178, 144, 125, 16, 180, 37, 20, 153, 107, 17, 248, 184, 82, 198, 150, 200, 121}, {152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78}, {45, 37, 80, 101, 223, 208, 102, 168, 191, 150, 7, 195, 251, 173, 38, 39, 10, 47, 127, 26, 197, 21, 115, 219, 100, 242, 245, 54, 205, 96, 70, 97, 107, 68, 59, 33, 228, 241, 130, 89, 61, 207, 58, 12, 193, 161, 231, 134, 237, 169, 146, 179, 87, 166, 36, 125, 64, 143, 181, 185, 120, 217, 62, 184, 85, 252, 110, 221, 138, 44, 8, 117, 53, 186, 15, 182, 206}, {90, 148, 186, 30, 226, 62, 109, 73, 179, 174, 162, 61, 131, 232, 96, 140, 153, 127, 52, 51, 168, 99, 98, 56, 172, 22, 8, 234, 212, 185, 240, 67, 237, 79, 114, 241, 25, 121, 245, 108, 19, 39, 20, 188, 223, 189, 133, 41, 63, 55, 221, 9, 176, 64, 3, 238, 161, 211, 34, 59, 66, 183, 219, 200, 239, 251, 71, 152, 37, 160, 137, 182, 129, 92, 85, 229, 165}, {180, 106, 185, 253, 17, 59, 132, 230, 150, 28, 172, 44, 32, 3, 193, 190, 214, 26, 51, 77, 145, 55, 167, 36, 233, 116, 96, 5, 94, 223, 103, 46, 85, 215, 174, 89, 244, 108, 38, 156, 160, 15, 226, 124, 169, 114, 255, 100, 239, 235, 1, 180, 106, 185, 253, 17, 59, 132, 230, 150, 28, 172, 44, 32, 3, 193, 190, 214, 26, 51, 77, 145, 55, 167, 36, 233, 116}, {117, 181, 161, 107, 26, 102, 41, 252, 87, 89, 245, 173, 45, 53, 185, 231, 68, 197, 168, 145, 110, 166, 61, 54, 38, 37, 186, 120, 134, 59, 21, 191, 196, 221, 36, 207, 205, 39, 80, 15, 217, 237, 33, 115, 150, 56, 138, 125, 58, 96, 10, 101, 182, 62, 169, 228, 219, 7, 86, 44, 64, 12, 70, 47, 223, 206, 184, 146, 241, 100, 195, 139, 8, 143, 193, 97, 127}, {234, 238, 97, 254, 103, 184, 57, 227, 7, 172, 176, 58, 192, 40, 15, 175, 147, 21, 99, 55, 166, 122, 216, 45, 106, 222, 107, 52, 133, 85, 123, 50, 195, 11, 32, 12, 140, 188, 182, 124, 158, 115, 49, 224, 36, 131, 19, 37, 105, 253, 68, 151, 154, 252, 174, 121, 251, 2, 201, 193, 194, 225, 206, 109, 114, 219, 14, 69, 125, 116, 157, 80, 30, 67, 59, 42, 198}, {201, 159, 47, 91, 124, 33, 209, 149, 166, 244, 71, 117, 238, 194, 223, 31, 79, 115, 98, 167, 61, 216, 90, 181, 190, 254, 206, 218, 213, 150, 224, 72, 54, 152, 106, 161, 177, 189, 184, 114, 171, 56, 18, 131, 38, 148, 111, 107, 104, 46, 146, 227, 14, 138, 233, 135, 37, 210, 211, 26, 133, 170, 241, 141, 172, 125, 232, 78, 186, 253, 136, 102, 164, 123, 100, 43, 88}, {143, 70, 101, 217, 59, 168, 252, 130, 195, 44, 58, 39, 186, 231, 26, 23, 146, 219, 56, 36, 54, 45, 181, 97, 223, 62, 33, 191, 110, 89, 251, 8, 12, 10, 15, 134, 197, 41, 179, 100, 86, 125, 205, 37, 185, 107, 208, 184, 228, 150, 221, 61, 173, 117, 193, 47, 182, 237, 21, 145, 87, 242, 139, 64, 96, 80, 120, 68, 102, 85, 241, 7, 138, 207, 38, 53, 161}, {3, 5, 15, 17, 51, 85, 255, 28, 36, 108, 180, 193, 94, 226, 59, 77, 215, 100, 172, 233, 38, 106, 190, 223, 124, 132, 145, 174, 239, 44, 116, 156, 185, 214, 103, 169, 230, 55, 89, 235, 32, 96, 160, 253, 26, 46, 114, 150, 167, 244, 1, 3, 5, 15, 17, 51, 85, 255, 28, 36, 108, 180, 193, 94, 226, 59, 77, 215, 100, 172, 233, 38, 106, 190, 223, 124, 132}, {6, 20, 120, 13, 46, 228, 98, 81, 251, 32, 192, 186, 187, 189, 169, 209, 220, 242, 22, 116, 37, 222, 254, 62, 132, 63, 130, 43, 250, 38, 212, 194, 182, 147, 77, 179, 141, 9, 54, 180, 159, 101, 67, 151, 85, 227, 112, 61, 142, 3, 10, 60, 136, 23, 114, 49, 166, 243, 16, 96, 93, 211, 208, 218, 230, 110, 121, 11, 58, 156, 111, 127, 31, 66, 145, 65, 155}, {12, 80, 231, 208, 169, 191, 87, 195, 125, 38, 181, 47, 217, 197, 85, 219, 221, 245, 8, 96, 186, 107, 206, 33, 145, 130, 86, 207, 45, 193, 101, 134, 102, 146, 150, 166, 251, 64, 39, 185, 127, 62, 21, 252, 100, 138, 54, 117, 70, 15, 68, 23, 228, 196, 89, 139, 58, 37, 161, 223, 237, 168, 179, 7, 36, 173, 143, 10, 120, 26, 184, 115, 110, 242, 44, 205, 53}, {24, 93, 107, 129, 132, 252, 200, 18, 173, 3, 40, 231, 189, 158, 145, 25, 69, 54, 234, 5, 120, 52, 218, 191, 174, 43, 207, 90, 35, 15, 136, 92, 115, 220, 239, 125, 76, 238, 101, 17, 133, 228, 149, 121, 44, 135, 212, 47, 175, 51, 146, 49, 162, 139, 116, 148, 97, 113, 236, 85, 171, 83, 251, 128, 156, 161, 163, 147, 41, 255, 224, 245, 16, 157, 185, 254, 248}, {48, 105, 127, 248, 77, 241, 224, 247, 64, 156, 95, 182, 236, 170, 150, 162, 11, 205, 212, 94, 134, 133, 213, 110, 239, 250, 45, 35, 30, 26, 218, 99, 130, 69, 108, 143, 40, 211, 206, 132, 229, 7, 144, 2, 96, 210, 254, 237, 154, 255, 221, 243, 128, 37, 190, 113, 197, 73, 49, 89, 22, 135, 181, 188, 17, 23, 183, 220, 195, 233, 90, 70, 60, 52, 169, 198, 25}, {96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38}, {192, 222, 182, 151, 114, 110, 155, 27, 143, 160, 177, 237, 82, 75, 89, 88, 152, 70, 240, 103, 21, 123, 224, 251, 116, 212, 101, 136, 218, 145, 200, 144, 8, 78, 190, 217, 204, 183, 87, 172, 216, 12, 105, 225, 59, 170, 98, 242, 250, 180, 10, 211, 31, 168, 255, 83, 139, 135, 238, 15, 52, 158, 252, 14, 244, 64, 74, 153, 134, 46, 209, 130, 9, 142, 96, 111, 91}, {157, 95, 217, 133, 230, 130, 18, 2, 39, 190, 175, 23, 209, 25, 36, 4, 78, 97, 67, 46, 191, 50, 72, 8, 156, 194, 134, 92, 99, 100, 144, 16, 37, 153, 17, 184, 198, 200, 61, 32, 74, 47, 34, 109, 145, 141, 122, 64, 148, 94, 68, 218, 63, 7, 244, 128, 53, 188, 136, 169, 126, 14, 245, 29, 106, 101, 13, 79, 252, 28, 247, 58, 212, 202, 26, 158, 229}, {39, 97, 134, 184, 145, 7, 245, 58, 181, 15, 208, 21, 241, 166, 44, 45, 10, 107, 237, 85, 196, 195, 54, 12, 185, 182, 102, 115, 130, 36, 8, 37, 47, 68, 169, 252, 56, 251, 205, 193, 120, 206, 168, 219, 89, 125, 117, 80, 127, 59, 146, 110, 86, 173, 96, 161, 217, 23, 191, 100, 61, 64, 53, 101, 26, 33, 179, 221, 139, 38, 70, 231, 62, 41, 150, 242, 207}, {78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153}, {156, 94, 26, 132, 255, 89, 233, 3, 185, 226, 46, 145, 28, 235, 38, 5, 214, 59, 114, 174, 36, 32, 106, 15, 103, 77, 150, 239, 108, 96, 190, 17, 169, 215, 167, 44, 180, 160, 223, 51, 230, 100, 244, 116, 193, 253, 124, 85, 55, 172, 1, 156, 94, 26, 132, 255, 89, 233, 3, 185, 226, 46, 145, 28, 235, 38, 5, 214, 59, 114, 174, 36, 32, 106, 15, 103, 77}, {37, 101, 208, 168, 150, 195, 173, 39, 47, 26, 21, 219, 242, 54, 96, 97, 68, 33, 241, 89, 207, 12, 161, 134, 169, 179, 166, 125, 143, 185, 217, 184, 252, 221, 44, 117, 186, 182, 23, 145, 56, 139, 45, 80, 223, 102, 191, 7, 251, 38, 10, 127, 197, 115, 100, 245, 205, 70, 107, 59, 228, 130, 61, 58, 193, 231, 237, 146, 87, 36, 64, 181, 120, 62, 85, 110, 138}, {74, 137, 206, 82, 55, 138, 16, 212, 120, 124, 73, 87, 72, 29, 193, 211, 147, 228, 25, 244, 205, 140, 177, 197, 230, 141, 251, 76, 40, 223, 204, 198, 56, 11, 180, 186, 113, 92, 252, 167, 176, 143, 111, 67, 169, 123, 162, 207, 24, 190, 68, 66, 227, 242, 108, 157, 47, 52, 84, 150, 155, 142, 37, 202, 103, 41, 149, 69, 8, 106, 60, 62, 170, 165, 36, 128, 238}, {148, 30, 62, 73, 174, 61, 232, 140, 127, 51, 99, 56, 22, 234, 185, 67, 79, 241, 121, 108, 39, 188, 189, 41, 55, 9, 64, 238, 211, 59, 183, 200, 251, 152, 160, 182, 92, 229, 166, 233, 24, 97, 13, 42, 150, 43, 2, 53, 60, 124, 146, 65, 122, 205, 5, 254, 102, 198, 112, 44, 201, 111, 134, 158, 255, 242, 216, 78, 101, 103, 82, 110, 18, 128, 193, 187, 118}, {53, 120, 237, 228, 100, 251, 45, 186, 217, 169, 241, 242, 173, 37, 15, 62, 146, 130, 245, 38, 80, 182, 184, 179, 89, 54, 39, 101, 206, 85, 87, 61, 205, 10, 223, 23, 252, 166, 207, 96, 47, 208, 41, 110, 36, 58, 70, 127, 102, 145, 221, 125, 12, 97, 26, 168, 196, 138, 64, 193, 107, 197, 191, 56, 44, 143, 161, 68, 21, 150, 86, 8, 181, 231, 59, 115, 7}, {106, 253, 59, 230, 28, 44, 3, 190, 26, 77, 55, 36, 116, 5, 223, 46, 215, 89, 108, 156, 15, 124, 114, 100, 235, 180, 185, 17, 132, 150, 172, 32, 193, 214, 51, 145, 167, 233, 96, 94, 103, 85, 174, 244, 38, 160, 226, 169, 255, 239, 1, 106, 253, 59, 230, 28, 44, 3, 190, 26, 77, 55, 36, 116, 5, 223, 46, 215, 89, 108, 156, 15, 124, 114, 100, 235, 180}, {212, 211, 197, 198, 167, 207, 157, 202, 62, 114, 200, 139, 201, 95, 26, 154, 220, 61, 19, 160, 217, 158, 171, 86, 32, 159, 127, 133, 229, 89, 216, 74, 120, 147, 230, 56, 176, 24, 47, 103, 170, 130, 243, 90, 185, 34, 42, 196, 18, 116, 10, 91, 109, 241, 239, 2, 181, 187, 151, 145, 83, 131, 39, 137, 124, 228, 141, 11, 143, 190, 52, 41, 165, 122, 38, 93, 175}, {181, 107, 102, 252, 89, 173, 53, 231, 197, 145, 166, 54, 37, 120, 59, 191, 221, 207, 39, 15, 237, 115, 56, 125, 96, 101, 62, 228, 7, 44, 12, 47, 206, 146, 100, 139, 143, 97, 208, 85, 130, 251, 117, 161, 26, 41, 87, 245, 45, 185, 68, 168, 110, 61, 38, 186, 134, 21, 196, 36, 205, 80, 217, 33, 150, 138, 58, 10, 182, 169, 219, 86, 64, 70, 223, 184, 241}, {119, 177, 23, 123, 239, 8, 159, 225, 184, 255, 43, 64, 140, 91, 169, 171, 69, 58, 20, 226, 33, 49, 18, 205, 160, 67, 21, 149, 144, 38, 105, 34, 168, 220, 244, 45, 111, 13, 41, 174, 243, 117, 95, 104, 85, 25, 203, 143, 194, 103, 146, 200, 22, 12, 94, 31, 228, 14, 176, 96, 202, 248, 115, 112, 233, 39, 30, 147, 191, 167, 27, 37, 240, 236, 145, 81, 216}, {238, 254, 184, 227, 172, 58, 40, 175, 21, 55, 122, 45, 222, 52, 85, 50, 11, 12, 188, 124, 115, 224, 131, 37, 253, 151, 252, 121, 2, 193, 225, 109, 219, 69, 116, 80, 67, 42, 110, 244, 90, 161, 104, 170, 100, 22, 24, 101, 248, 230, 221, 27, 74, 231, 51, 229, 242, 4, 159, 223, 218, 171, 138, 232, 160, 134, 84, 220, 245, 180, 95, 208, 73, 200, 44, 48, 202}, {193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85}, {159, 91, 33, 149, 244, 117, 194, 31, 115, 167, 216, 181, 254, 218, 150, 72, 152, 161, 189, 114, 56, 131, 148, 107, 46, 227, 138, 135, 210, 26, 170, 141, 125, 78, 253, 102, 123, 43, 58, 160, 34, 41, 25, 22, 96, 30, 236, 252, 249, 32, 10, 175, 84, 87, 235, 6, 101, 199, 198, 89, 2, 35, 182, 66, 55, 245, 234, 153, 62, 230, 83, 173, 119, 225, 169, 49, 144}}; + + + +/** + * @brief Encodes a message message of PARAM_K bits to a Reed-Solomon codeword codeword of PARAM_N1 bytes + * + * Following @cite lin1983error (Chapter 4 - Cyclic Codes), + * We perform a systematic encoding using a linear (PARAM_N1 - PARAM_K)-stage shift register + * with feedback connections based on the generator polynomial PARAM_RS_POLY of the Reed-Solomon code. + * + * @param[out] cdw Array of size VEC_N1_SIZE_64 receiving the encoded message + * @param[in] msg Array of size VEC_K_SIZE_64 storing the message + */ +void PQCLEAN_HQCRMRS256_AVX2_reed_solomon_encode(uint64_t *cdw, const uint64_t *msg) { + uint8_t gate_value = 0; + + uint16_t tmp[PARAM_G] = {0}; + uint16_t PARAM_RS_POLY [] = {RS_POLY_COEFS}; + + uint8_t msg_bytes[PARAM_K] = {0}; + uint8_t cdw_bytes[PARAM_N1] = {0}; + + for (size_t i = 0 ; i < VEC_K_SIZE_64 ; ++i) { + for (size_t j = 0 ; j < 8 ; ++j) { + msg_bytes[i * 8 + j] = (uint8_t) (msg[i] >> (j * 8)); + } + } + + for (int i = PARAM_K - 1 ; i >= 0 ; --i) { + gate_value = msg_bytes[i] ^ cdw_bytes[PARAM_N1 - PARAM_K - 1]; + + for (size_t j = 0 ; j < PARAM_G ; ++j) { + tmp[j] = PQCLEAN_HQCRMRS256_AVX2_gf_mul(gate_value, PARAM_RS_POLY[j]); + } + + for (size_t k = PARAM_N1 - PARAM_K - 1 ; k ; --k) { + cdw_bytes[k] = cdw_bytes[k - 1] ^ tmp[k]; + } + + cdw_bytes[0] = tmp[0]; + } + + memcpy(cdw_bytes + PARAM_N1 - PARAM_K, msg_bytes, PARAM_K); + memcpy(cdw, cdw_bytes, PARAM_N1); +} + + + +/** + * @brief Computes 2 * PARAM_DELTA syndromes + * + * @param[out] syndromes Array of size 2 * PARAM_DELTA receiving the computed syndromes + * @param[in] cdw Array of size PARAM_N1 storing the received vector + */ +void compute_syndromes(uint16_t *syndromes, uint8_t *cdw) { + for (size_t i = 0 ; i < 2 * PARAM_DELTA ; ++i) { + for (size_t j = 1 ; j < PARAM_N1 ; ++j) { + syndromes[i] ^= PQCLEAN_HQCRMRS256_AVX2_gf_mul(cdw[j], alpha_ij_pow[i][j - 1]); + } + syndromes[i] ^= cdw[0]; + } +} + + + +/** + * @brief Computes the error locator polynomial (ELP) sigma + * + * This is a constant time implementation of Berlekamp's simplified algorithm (see @cite lin1983error (Chapter 6 - BCH Codes).
+ * We use the letter p for rho which is initialized at -1.
+ * The array X_sigma_p represents the polynomial X^(mu-rho)*sigma_p(X).
+ * Instead of maintaining a list of sigmas, we update in place both sigma and X_sigma_p.
+ * sigma_copy serves as a temporary save of sigma in case X_sigma_p needs to be updated.
+ * We can properly correct only if the degree of sigma does not exceed PARAM_DELTA. + * This means only the first PARAM_DELTA + 1 coefficients of sigma are of value + * and we only need to save its first PARAM_DELTA - 1 coefficients. + * + * @returns the degree of the ELP sigma + * @param[out] sigma Array of size (at least) PARAM_DELTA receiving the ELP + * @param[in] syndromes Array of size (at least) 2*PARAM_DELTA storing the syndromes + */ +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes) { + sigma[0] = 1; + size_t deg_sigma = 0; + size_t deg_sigma_p = 0; + uint16_t sigma_copy[PARAM_DELTA + 1] = {0}; + size_t deg_sigma_copy = 0; + uint16_t X_sigma_p[PARAM_DELTA + 1] = {0, 1}; + int32_t pp = -1; // 2*rho + uint16_t d_p = 1; + uint16_t d = syndromes[0]; + + for (size_t mu = 0 ; (mu < (2 * PARAM_DELTA)) ; ++mu) { + // Save sigma in case we need it to update X_sigma_p + memcpy(sigma_copy, sigma, 2 * (PARAM_DELTA)); + deg_sigma_copy = deg_sigma; + + uint16_t dd = PQCLEAN_HQCRMRS256_AVX2_gf_mul(d, PQCLEAN_HQCRMRS256_AVX2_gf_inverse(d_p)); + + for (size_t i = 1 ; (i <= mu + 1) && (i <= PARAM_DELTA) ; ++i) { + sigma[i] ^= PQCLEAN_HQCRMRS256_AVX2_gf_mul(dd, X_sigma_p[i]); + } + + size_t deg_X = mu - pp; + size_t deg_X_sigma_p = deg_X + deg_sigma_p; + + // mask1 = 0xffff if(d != 0) and 0 otherwise + int16_t mask1 = -((uint16_t) - d >> 15); + + // mask2 = 0xffff if(deg_X_sigma_p > deg_sigma) and 0 otherwise + int16_t mask2 = -((uint16_t) (deg_sigma - deg_X_sigma_p) >> 15); + + // mask12 = 0xffff if the deg_sigma increased and 0 otherwise + int16_t mask12 = mask1 & mask2; + deg_sigma = (mask12 & deg_X_sigma_p) ^ (~mask12 & deg_sigma); + + if (mu == (2 * PARAM_DELTA - 1)) { + break; + } + + pp = (mask12 & mu) ^ (~mask12 & pp); + d_p = (mask12 & d) ^ (~mask12 & d_p); + for (size_t i = PARAM_DELTA ; i ; --i) { + X_sigma_p[i] = (mask12 & sigma_copy[i - 1]) ^ (~mask12 & X_sigma_p[i - 1]); + } + + deg_sigma_p = (mask12 & deg_sigma_copy) ^ (~mask12 & deg_sigma_p); + d = syndromes[mu + 1]; + + for (size_t i = 1 ; (i <= mu + 1) && (i <= PARAM_DELTA) ; ++i) { + d ^= PQCLEAN_HQCRMRS256_AVX2_gf_mul(sigma[i], syndromes[mu + 1 - i]); + } + } + + return deg_sigma; +} + + + +/** + * @brief Computes the error polynomial error from the error locator polynomial sigma + * + * See function PQCLEAN_HQCRMRS256_AVX2_fft for more details. + * + * @param[out] error Array of 2^PARAM_M elements receiving the error polynomial + * @param[out] error_compact Array of PARAM_DELTA + PARAM_N1 elements receiving a compact representation of the vector error + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + */ +static void compute_roots(uint8_t *error, uint16_t *sigma) { + uint16_t w[1 << PARAM_M] = {0}; + + PQCLEAN_HQCRMRS256_AVX2_fft(w, sigma, PARAM_DELTA + 1); + PQCLEAN_HQCRMRS256_AVX2_fft_retrieve_error_poly(error, w); +} + + + +/** + * @brief Computes the polynomial z(x) + * + * See @cite lin1983error (Chapter 6 - BCH Codes) for more details. + * + * @param[out] z Array of PARAM_DELTA + 1 elements receiving the polynomial z(x) + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + * @param[in] degree Integer that is the degree of polynomial sigma + * @param[in] syndromes Array of 2 * PARAM_DELTA storing the syndromes + */ +static void compute_z_poly(uint16_t *z, const uint16_t *sigma, uint8_t degree, const uint16_t *syndromes) { + z[0] = 1; + + for (size_t i = 1 ; i < PARAM_DELTA + 1 ; ++i) { + int16_t mask2 = -((uint16_t) (i - degree - 1) >> 15); + z[i] = ((uint16_t)mask2) & sigma[i]; + } + + z[1] ^= syndromes[0]; + + for (size_t i = 2 ; i <= PARAM_DELTA ; ++i) { + int16_t mask2 = -((uint16_t) (i - degree - 1) >> 15); + z[i] ^= ((uint16_t)mask2 & syndromes[i - 1]); + + for (size_t j = 1 ; j < i ; ++j) { + z[i] ^= ((uint16_t)mask2) & PQCLEAN_HQCRMRS256_AVX2_gf_mul(sigma[j], syndromes[i - j - 1]); + } + } +} + + + +/** + * @brief Computes the error values + * + * See @cite lin1983error (Chapter 6 - BCH Codes) for more details. + * + * @param[out] error_values Array of PARAM_DELTA elements receiving the error values + * @param[in] z Array of PARAM_DELTA + 1 elements storing the polynomial z(x) + * @param[in] z_degree Integer that is the degree of polynomial z(x) + * @param[in] error_compact Array of PARAM_DELTA + PARAM_N1 storing compact representation of the error + */ +static void compute_error_values(uint16_t *error_values, const uint16_t *z, const uint8_t *error) { + uint16_t beta_j[PARAM_DELTA] = {0}; + uint16_t e_j[PARAM_DELTA] = {0}; + + uint16_t delta_counter = 0; + uint16_t delta_real_value; + + // Compute the beta_{j_i} page 31 of the documentation + for (size_t i = 0 ; i < PARAM_N1 ; i++) { + uint16_t found = 0; + int16_t valuemask = ((int16_t) - (error[i] != 0)) >> 15; + for (size_t j = 0 ; j < PARAM_DELTA ; j++) { + int16_t indexmask = ((int16_t) - (j == delta_counter)) >> 15; + beta_j[j] += indexmask & valuemask & exp[i]; + found += indexmask & valuemask & 1; + } + delta_counter += found; + } + delta_real_value = delta_counter; + + // Compute the e_{j_i} page 31 of the documentation + for (size_t i = 0 ; i < PARAM_DELTA ; ++i) { + uint16_t tmp1 = 1; + uint16_t tmp2 = 1; + uint16_t inverse = PQCLEAN_HQCRMRS256_AVX2_gf_inverse(beta_j[i]); + uint16_t inverse_power_j = 1; + + for (size_t j = 1 ; j <= PARAM_DELTA ; ++j) { + inverse_power_j = PQCLEAN_HQCRMRS256_AVX2_gf_mul(inverse_power_j, inverse); + tmp1 ^= PQCLEAN_HQCRMRS256_AVX2_gf_mul(inverse_power_j, z[j]); + } + for (size_t k = 1 ; k < PARAM_DELTA ; ++k) { + tmp2 = PQCLEAN_HQCRMRS256_AVX2_gf_mul(tmp2, (1 ^ PQCLEAN_HQCRMRS256_AVX2_gf_mul(inverse, beta_j[(i + k) % PARAM_DELTA]))); + } + int16_t mask = ((int16_t) - (i < delta_real_value)) >> 15; + e_j[i] = mask & PQCLEAN_HQCRMRS256_AVX2_gf_mul(tmp1, PQCLEAN_HQCRMRS256_AVX2_gf_inverse(tmp2)); + } + + // Place the delta e_{j_i} values at the right coordinates of the output vector + delta_counter = 0; + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + uint16_t found = 0; + int16_t valuemask = ((int16_t) - (error[i] != 0)) >> 15; + for (size_t j = 0 ; j < PARAM_DELTA ; j++) { + int16_t indexmask = ((int16_t) - (j == delta_counter)) >> 15; + error_values[i] += indexmask & valuemask & e_j[j]; + found += indexmask & valuemask & 1; + } + delta_counter += found; + } +} + + + +/** + * @brief Correct the errors + * + * @param[out] cdw Array of PARAM_N1 elements receiving the corrected vector + * @param[in] error Array of the error vector + * @param[in] error_values Array of PARAM_DELTA elements storing the error values + */ +static void correct_errors(uint8_t *cdw, const uint16_t *error_values) { + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + cdw[i] ^= error_values[i]; + } +} + + + +/** + * @brief Decodes the received word + * + * This function relies on six steps: + *
    + *
  1. The first step, is the computation of the 2*PARAM_DELTA syndromes. + *
  2. The second step is the computation of the error-locator polynomial sigma. + *
  3. The third step, done by additive FFT, is finding the error-locator numbers by calculating the roots of the polynomial sigma and takings their inverses. + *
  4. The fourth step, is the polynomial z(x). + *
  5. The fifth step, is the computation of the error values. + *
  6. The sixth step is the correction of the errors in the received polynomial. + *
+ * For a more complete picture on Reed-Solomon decoding, see Shu. Lin and Daniel J. Costello in Error Control Coding: Fundamentals and Applications @cite lin1983error + * + * @param[out] msg Array of size VEC_K_SIZE_64 receiving the decoded message + * @param[in] cdw Array of size VEC_N1_SIZE_64 storing the received word + */ +void PQCLEAN_HQCRMRS256_AVX2_reed_solomon_decode(uint64_t *msg, uint64_t *cdw) { + uint8_t cdw_bytes[PARAM_N1] = {0}; + uint16_t syndromes[2 * PARAM_DELTA] = {0}; + uint16_t sigma[1 << PARAM_FFT] = {0}; + uint8_t error[1 << PARAM_M] = {0}; + uint16_t z[PARAM_N1] = {0}; + uint16_t error_values[PARAM_N1] = {0}; + + // Copy the vector in an array of bytes + memcpy(cdw_bytes, cdw, PARAM_N1); + + // Calculate the 2*PARAM_DELTA syndromes + compute_syndromes(syndromes, cdw_bytes); + + // Compute the error locator polynomial sigma + // Sigma's degree is at most PARAM_DELTA but the FFT requires the extra room + size_t deg = compute_elp(sigma, syndromes); + + // Compute the error polynomial error + compute_roots(error, sigma); + + // Compute the polynomial z(x) + compute_z_poly(z, sigma, deg, syndromes); + + // Compute the error values + compute_error_values(error_values, z, error); + + // Correct the errors + correct_errors(cdw_bytes, error_values); + + // Retrieve the message from the decoded codeword + memcpy(msg, cdw_bytes + (PARAM_G - 1), PARAM_K); + +} diff --git a/crypto_kem/hqc-rmrs-256/avx2/reed_solomon.h b/crypto_kem/hqc-rmrs-256/avx2/reed_solomon.h new file mode 100644 index 00000000..ba3af272 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/reed_solomon.h @@ -0,0 +1,20 @@ +#ifndef REED_SOLOMON_H +#define REED_SOLOMON_H + + +/** + * @file reed_solomon.h + * Header file of reed_solomon.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS256_AVX2_reed_solomon_encode(uint64_t *cdw, const uint64_t *msg); + +void PQCLEAN_HQCRMRS256_AVX2_reed_solomon_decode(uint64_t *msg, uint64_t *cdw); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/avx2/vector.c b/crypto_kem/hqc-rmrs-256/avx2/vector.c new file mode 100644 index 00000000..75c251c5 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/vector.c @@ -0,0 +1,200 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +#include +/** + * @file vector.c + * @brief Implementation of vectors sampling and some utilities for the HQC scheme + */ + + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS256_AVX2_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight) { + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; + uint32_t random_data = 0; + uint32_t tmp[PARAM_OMEGA_R] = {0}; + uint8_t exist = 0; + size_t j = 0; + __m256i bit256[PARAM_OMEGA_R]; + __m256i bloc256[PARAM_OMEGA_R]; + static __m256i posCmp256 = (__m256i) { + 0UL, 1UL, 2UL, 3UL + }; +#define LOOP_SIZE CEIL_DIVIDE(PARAM_N, 256) + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (tmp[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + tmp[i] = random_data; + } + } + + for (uint32_t i = 0 ; i < weight ; i++) { + // we store the bloc number and bit position of each vb[i] + uint64_t bloc = tmp[i] >> 6; + bloc256[i] = _mm256_set1_epi64x(bloc >> 2); + uint64_t pos = (bloc & 0x3UL); + __m256i pos256 = _mm256_set1_epi64x(pos); + __m256i mask256 = _mm256_cmpeq_epi64(pos256, posCmp256); + uint64_t bit64 = 1ULL << (tmp[i] & 0x3f); + __m256i bloc256 = _mm256_set1_epi64x(bit64); + bit256[i] = bloc256 & mask256; + } + + for (uint32_t i = 0 ; i < LOOP_SIZE ; i++) { + __m256i aux = _mm256_loadu_si256(((__m256i *)v) + i); + __m256i i256 = _mm256_set1_epi64x(i); + + for (uint32_t j = 0 ; j < weight ; j++) { + __m256i mask256 = _mm256_cmpeq_epi64(bloc256[j], i256); + aux ^= bit256[j] & mask256; + } + _mm256_storeu_si256(((__m256i *)v) + i, aux); + } + +#undef LOOP_SIZE +} + + + +/** + * @brief Generates a random vector of dimension PARAM_N + * + * This function generates a random binary vector of dimension PARAM_N. It generates a random + * array of bytes using the seedexpander function, and drop the extra bits using a mask. + * + * @param[in] v Pointer to an array + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS256_AVX2_vect_set_random(AES_XOF_struct *ctx, uint64_t *v) { + uint8_t rand_bytes[VEC_N_SIZE_BYTES] = {0}; + + seedexpander(ctx, rand_bytes, VEC_N_SIZE_BYTES); + + memcpy(v, rand_bytes, VEC_N_SIZE_BYTES); + v[VEC_N_SIZE_64 - 1] &= BITMASK(PARAM_N, 64); +} + + + +/** + * @brief Generates a random vector + * + * This function generates a random binary vector. It uses the the randombytes function. + * + * @param[in] v Pointer to an array + */ +void PQCLEAN_HQCRMRS256_AVX2_vect_set_random_from_randombytes(uint64_t *v) { + uint8_t rand_bytes [VEC_K_SIZE_BYTES] = {0}; + + randombytes(rand_bytes, VEC_K_SIZE_BYTES); + memcpy(v, rand_bytes, VEC_K_SIZE_BYTES); +} + + + +/** + * @brief Adds two vectors + * + * @param[out] o Pointer to an array that is the result + * @param[in] v1 Pointer to an array that is the first vector + * @param[in] v2 Pointer to an array that is the second vector + * @param[in] size Integer that is the size of the vectors + */ +void PQCLEAN_HQCRMRS256_AVX2_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size) { + for (uint32_t i = 0 ; i < size ; ++i) { + o[i] = v1[i] ^ v2[i]; + } +} + + + +/** + * @brief Compares two vectors + * + * @param[in] v1 Pointer to an array that is first vector + * @param[in] v2 Pointer to an array that is second vector + * @param[in] size Integer that is the size of the vectors + * @returns 0 if the vectors are equals and a negative/psotive value otherwise + */ +int PQCLEAN_HQCRMRS256_AVX2_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size) { + unsigned char diff = 0; + + for (uint32_t i = 0 ; i < size ; i++) { + diff |= ((uint8_t *) v1)[i] ^ ((uint8_t *) v2)[i]; + } + return diff != 0; +} + + + +/** + * @brief Resize a vector so that it contains size_o bits + * + * @param[out] o Pointer to the output vector + * @param[in] size_o Integer that is the size of the output vector in bits + * @param[in] v Pointer to the input vector + * @param[in] size_v Integer that is the size of the input vector in bits + */ +void PQCLEAN_HQCRMRS256_AVX2_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v) { + if (size_o < size_v) { + uint64_t mask = 0x7FFFFFFFFFFFFFFF; + int8_t val = 0; + + if (size_o % 64) { + val = 64 - (size_o % 64); + } + + memcpy(o, v, VEC_N1N2_SIZE_BYTES); + + for (int8_t i = 0 ; i < val ; ++i) { + o[VEC_N1N2_SIZE_64 - 1] &= (mask >> i); + } + } else { + memcpy(o, v, CEIL_DIVIDE(size_v, 8)); + } +} diff --git a/crypto_kem/hqc-rmrs-256/avx2/vector.h b/crypto_kem/hqc-rmrs-256/avx2/vector.h new file mode 100644 index 00000000..e58903c9 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/avx2/vector.h @@ -0,0 +1,29 @@ +#ifndef VECTOR_H +#define VECTOR_H + + +/** + * @file vector.h + * @brief Header file for vector.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQCRMRS256_AVX2_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight); + +void PQCLEAN_HQCRMRS256_AVX2_vect_set_random(AES_XOF_struct *ctx, uint64_t *v); + +void PQCLEAN_HQCRMRS256_AVX2_vect_set_random_from_randombytes(uint64_t *v); + + +void PQCLEAN_HQCRMRS256_AVX2_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size); + +int PQCLEAN_HQCRMRS256_AVX2_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size); + +void PQCLEAN_HQCRMRS256_AVX2_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/clean/LICENSE b/crypto_kem/hqc-rmrs-256/clean/LICENSE new file mode 100644 index 00000000..d5d21fff --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/LICENSE @@ -0,0 +1 @@ +Public Domain diff --git a/crypto_kem/hqc-rmrs-256/clean/Makefile b/crypto_kem/hqc-rmrs-256/clean/Makefile new file mode 100644 index 00000000..ee19437b --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/Makefile @@ -0,0 +1,19 @@ +# This Makefile can be used with GNU Make or BSD Make + +LIB=libhqc-rmrs-256_clean.a +HEADERS=api.h code.h fft.h gf2x.h gf.h hqc.h parameters.h parsing.h reed_muller.h reed_solomon.h vector.h +OBJECTS=code.o fft.o gf2x.o gf.o hqc.o kem.o parsing.o reed_muller.o reed_solomon.o vector.o + +CFLAGS=-O3 -Wall -Wextra -Wpedantic -Wvla -Werror -Wredundant-decls -Wmissing-prototypes -std=c99 -I../../../common $(EXTRAFLAGS) + +all: $(LIB) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +$(LIB): $(OBJECTS) + $(AR) -r $@ $(OBJECTS) + +clean: + $(RM) $(OBJECTS) + $(RM) $(LIB) diff --git a/crypto_kem/hqc-rmrs-256/clean/Makefile.Microsoft_nmake b/crypto_kem/hqc-rmrs-256/clean/Makefile.Microsoft_nmake new file mode 100644 index 00000000..2378a4f6 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/Makefile.Microsoft_nmake @@ -0,0 +1,19 @@ +# This Makefile can be used with Microsoft Visual Studio's nmake using the command: +# nmake /f Makefile.Microsoft_nmake + +LIBRARY=libhqc-rmrs-256_clean.lib +OBJECTS=code.obj fft.obj gf2x.obj gf.obj hqc.obj kem.obj parsing.obj reed_muller.obj reed_solomon.obj vector.obj + +CFLAGS=/nologo /O2 /I ..\..\..\common /W4 /WX + +all: $(LIBRARY) + +# Make sure objects are recompiled if headers change. +$(OBJECTS): *.h + +$(LIBRARY): $(OBJECTS) + LIB.EXE /NOLOGO /WX /OUT:$@ $** + +clean: + -DEL $(OBJECTS) + -DEL $(LIBRARY) diff --git a/crypto_kem/hqc-rmrs-256/clean/api.h b/crypto_kem/hqc-rmrs-256/clean/api.h new file mode 100644 index 00000000..cfc079d5 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/api.h @@ -0,0 +1,25 @@ +#ifndef PQCLEAN_HQCRMRS256_CLEAN_API_H +#define PQCLEAN_HQCRMRS256_CLEAN_API_H +/** + * @file api.h + * @brief NIST KEM API used by the HQC_KEM IND-CCA2 scheme + */ + +#define PQCLEAN_HQCRMRS256_CLEAN_CRYPTO_ALGNAME "HQC-RMRS-256" + +#define PQCLEAN_HQCRMRS256_CLEAN_CRYPTO_SECRETKEYBYTES 7575 +#define PQCLEAN_HQCRMRS256_CLEAN_CRYPTO_PUBLICKEYBYTES 7535 +#define PQCLEAN_HQCRMRS256_CLEAN_CRYPTO_BYTES 64 +#define PQCLEAN_HQCRMRS256_CLEAN_CRYPTO_CIPHERTEXTBYTES 15047 + +// As a technicality, the public key is appended to the secret key in order to respect the NIST API. +// Without this constraint, PQCLEAN_HQCRMRS256_CLEAN_CRYPTO_SECRETKEYBYTES would be defined as 32 + +int PQCLEAN_HQCRMRS256_CLEAN_crypto_kem_keypair(unsigned char *pk, unsigned char *sk); + +int PQCLEAN_HQCRMRS256_CLEAN_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk); + +int PQCLEAN_HQCRMRS256_CLEAN_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/clean/code.c b/crypto_kem/hqc-rmrs-256/clean/code.c new file mode 100644 index 00000000..5a73a1ed --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/code.c @@ -0,0 +1,47 @@ +#include "code.h" +#include "parameters.h" +#include "reed_muller.h" +#include "reed_solomon.h" +#include +#include +/** + * @file code.c + * @brief Implementation of concatenated code + */ + + + +/** + * + * @brief Encoding the message m to a code word em using the concatenated code + * + * First we encode the message using the Reed-Solomon code, then with the duplicated Reed-Muller code we obtain + * a concatenated code word. + * + * @param[out] em Pointer to an array that is the tensor code word + * @param[in] m Pointer to an array that is the message + */ +void PQCLEAN_HQCRMRS256_CLEAN_code_encode(uint64_t *em, const uint64_t *m) { + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQCRMRS256_CLEAN_reed_solomon_encode(tmp, m); + PQCLEAN_HQCRMRS256_CLEAN_reed_muller_encode(em, tmp); + +} + + + +/** + * @brief Decoding the code word em to a message m using the concatenated code + * + * @param[out] m Pointer to an array that is the message + * @param[in] em Pointer to an array that is the code word + */ +void PQCLEAN_HQCRMRS256_CLEAN_code_decode(uint64_t *m, const uint64_t *em) { + uint64_t tmp[VEC_N1_SIZE_64] = {0}; + + PQCLEAN_HQCRMRS256_CLEAN_reed_muller_decode(tmp, em); + PQCLEAN_HQCRMRS256_CLEAN_reed_solomon_decode(m, tmp); + + +} diff --git a/crypto_kem/hqc-rmrs-256/clean/code.h b/crypto_kem/hqc-rmrs-256/clean/code.h new file mode 100644 index 00000000..68f0ca9a --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/code.h @@ -0,0 +1,20 @@ +#ifndef CODE_H +#define CODE_H + + +/** + * @file code.h + * Header file of code.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS256_CLEAN_code_encode(uint64_t *em, const uint64_t *message); + +void PQCLEAN_HQCRMRS256_CLEAN_code_decode(uint64_t *m, const uint64_t *em); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/clean/fft.c b/crypto_kem/hqc-rmrs-256/clean/fft.c new file mode 100644 index 00000000..9631d529 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/fft.c @@ -0,0 +1,331 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include +#include +/** + * @file fft.c + * Implementation of the additive FFT and its transpose. + * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf + */ + + +static void compute_fft_betas(uint16_t *betas); +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size); +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f); +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas); + + +/** + * @brief Computes the basis of betas (omitting 1) used in the additive FFT and its transpose + * + * @param[out] betas Array of size PARAM_M-1 + */ +static void compute_fft_betas(uint16_t *betas) { + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + betas[i] = 1 << (PARAM_M - 1 - i); + } +} + + + +/** + * @brief Computes the subset sums of the given set + * + * The array subset_sums is such that its ith element is + * the subset sum of the set elements given by the binary form of i. + * + * @param[out] subset_sums Array of size 2^set_size receiving the subset sums + * @param[in] set Array of set_size elements + * @param[in] set_size Size of the array set + */ +static void compute_subset_sums(uint16_t *subset_sums, const uint16_t *set, size_t set_size) { + subset_sums[0] = 0; + + for (size_t i = 0 ; i < set_size ; ++i) { + for (size_t j = 0 ; j < (1U << i) ; ++j) { + subset_sums[(1 << i) + j] = set[i] ^ subset_sums[j]; + } + } +} + + + +/** + * @brief Computes the radix conversion of a polynomial f in GF(2^m)[x] + * + * Computes f0 and f1 such that f(x) = f0(x^2-x) + x.f1(x^2-x) + * as proposed by Bernstein, Chou and Schwabe: + * https://binary.cr.yp.to/mcbits-20130616.pdf + * + * @param[out] f0 Array half the size of f + * @param[out] f1 Array half the size of f + * @param[in] f Array of size a power of 2 + * @param[in] m_f 2^{m_f} is the smallest power of 2 greater or equal to the number of coefficients of f + */ +static void radix(uint16_t *f0, uint16_t *f1, const uint16_t *f, uint32_t m_f) { + switch (m_f) { + case 4: + f0[4] = f[8] ^ f[12]; + f0[6] = f[12] ^ f[14]; + f0[7] = f[14] ^ f[15]; + f1[5] = f[11] ^ f[13]; + f1[6] = f[13] ^ f[14]; + f1[7] = f[15]; + f0[5] = f[10] ^ f[12] ^ f1[5]; + f1[4] = f[9] ^ f[13] ^ f0[5]; + + f0[0] = f[0]; + f1[3] = f[7] ^ f[11] ^ f[15]; + f0[3] = f[6] ^ f[10] ^ f[14] ^ f1[3]; + f0[2] = f[4] ^ f0[4] ^ f0[3] ^ f1[3]; + f1[1] = f[3] ^ f[5] ^ f[9] ^ f[13] ^ f1[3]; + f1[2] = f[3] ^ f1[1] ^ f0[3]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 3: + f0[0] = f[0]; + f0[2] = f[4] ^ f[6]; + f0[3] = f[6] ^ f[7]; + f1[1] = f[3] ^ f[5] ^ f[7]; + f1[2] = f[5] ^ f[6]; + f1[3] = f[7]; + f0[1] = f[2] ^ f0[2] ^ f1[1]; + f1[0] = f[1] ^ f0[1]; + return; + + case 2: + f0[0] = f[0]; + f0[1] = f[2] ^ f[3]; + f1[0] = f[1] ^ f0[1]; + f1[1] = f[3]; + return; + + case 1: + f0[0] = f[0]; + f1[0] = f[1]; + return; + + default: + ; + size_t n = 1 << (m_f - 2); + + uint16_t Q[2 * (1 << (PARAM_FFT - 2))]; + uint16_t R[2 * (1 << (PARAM_FFT - 2))]; + + uint16_t Q0[1 << (PARAM_FFT - 2)]; + uint16_t Q1[1 << (PARAM_FFT - 2)]; + uint16_t R0[1 << (PARAM_FFT - 2)]; + uint16_t R1[1 << (PARAM_FFT - 2)]; + + memcpy(Q, f + 3 * n, 2 * n); + memcpy(Q + n, f + 3 * n, 2 * n); + memcpy(R, f, 4 * n); + + for (size_t i = 0 ; i < n ; ++i) { + Q[i] ^= f[2 * n + i]; + R[n + i] ^= Q[i]; + } + + radix(Q0, Q1, Q, m_f - 1); + radix(R0, R1, R, m_f - 1); + + memcpy(f0, R0, 2 * n); + memcpy(f0 + n, Q0, 2 * n); + memcpy(f1, R1, 2 * n); + memcpy(f1 + n, Q1, 2 * n); + } +} + + + +/** + * @brief Evaluates f at all subset sums of a given set + * + * This function is a subroutine of the function fft. + * + * @param[out] w Array + * @param[in] f Array + * @param[in] f_coeffs Number of coefficients of f + * @param[in] m Number of betas + * @param[in] m_f Number of coefficients of f (one more than its degree) + * @param[in] betas FFT constants + */ +static void fft_rec(uint16_t *w, uint16_t *f, size_t f_coeffs, uint8_t m, uint32_t m_f, const uint16_t *betas) { + uint16_t f0[1 << (PARAM_FFT - 2)]; + uint16_t f1[1 << (PARAM_FFT - 2)]; + uint16_t gammas[PARAM_M - 2]; + uint16_t deltas[PARAM_M - 2]; + size_t k = 1 << (m - 1); + uint16_t gammas_sums[1 << (PARAM_M - 2)]; + uint16_t u[1 << (PARAM_M - 2)] = {0}; + uint16_t v[1 << (PARAM_M - 2)] = {0}; + + // Step 1 + if (m_f == 1) { + uint16_t tmp[PARAM_M - (PARAM_FFT - 1)]; + for (size_t i = 0 ; i < m ; ++i) { + tmp[i] = PQCLEAN_HQCRMRS256_CLEAN_gf_mul(betas[i], f[1]); + } + + w[0] = f[0]; + for (size_t j = 0 ; j < m ; ++j) { + for (size_t k = 0 ; k < (1U << j) ; ++k) { + w[(1 << j) + k] = w[k] ^ tmp[j]; + } + } + + return; + } + + // Step 2: compute g + if (betas[m - 1] != 1) { + uint16_t beta_m_pow = 1; + for (size_t i = 1 ; i < (1U << m_f) ; ++i) { + beta_m_pow = PQCLEAN_HQCRMRS256_CLEAN_gf_mul(beta_m_pow, betas[m - 1]); + f[i] = PQCLEAN_HQCRMRS256_CLEAN_gf_mul(beta_m_pow, f[i]); + } + } + + // Step 3 + radix(f0, f1, f, m_f); + + // Step 4: compute gammas and deltas + for (uint8_t i = 0 ; i < m - 1 ; ++i) { + gammas[i] = PQCLEAN_HQCRMRS256_CLEAN_gf_mul(betas[i], PQCLEAN_HQCRMRS256_CLEAN_gf_inverse(betas[m - 1])); + deltas[i] = PQCLEAN_HQCRMRS256_CLEAN_gf_square(gammas[i]) ^ gammas[i]; + } + + // Compute gammas sums + compute_subset_sums(gammas_sums, gammas, m - 1); + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, m - 1, m_f - 1, deltas); + + if (f_coeffs <= 3) { // 3-coefficient polynomial f case: f1 is constant + w[0] = u[0]; + w[k] = u[0] ^ f1[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS256_CLEAN_gf_mul(gammas_sums[i], f1[0]); + w[k + i] = w[i] ^ f1[0]; + } + } else { + fft_rec(v, f1, f_coeffs / 2, m - 1, m_f - 1, deltas); + + // Step 6 + memcpy(w + k, v, 2 * k); + w[0] = u[0]; + w[k] ^= u[0]; + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS256_CLEAN_gf_mul(gammas_sums[i], v[i]); + w[k + i] ^= w[i]; + } + } +} + + + +/** + * @brief Evaluates f on all fields elements using an additive FFT algorithm + * + * f_coeffs is the number of coefficients of f (one less than its degree).
+ * The FFT proceeds recursively to evaluate f at all subset sums of a basis B.
+ * This implementation is based on the paper from Gao and Mateer:
+ * Shuhong Gao and Todd Mateer, Additive Fast Fourier Transforms over Finite Fields, + * IEEE Transactions on Information Theory 56 (2010), 6265--6272. + * http://www.math.clemson.edu/~sgao/papers/GM10.pdf
+ * and includes improvements proposed by Bernstein, Chou and Schwabe here: + * https://binary.cr.yp.to/mcbits-20130616.pdf
+ * Note that on this first call (as opposed to the recursive calls to fft_rec), gammas are equal to betas, + * meaning the first gammas subset sums are actually the subset sums of betas (except 1).
+ * Also note that f is altered during computation (twisted at each level). + * + * @param[out] w Array + * @param[in] f Array of 2^PARAM_FFT elements + * @param[in] f_coeffs Number coefficients of f (i.e. deg(f)+1) + */ +void PQCLEAN_HQCRMRS256_CLEAN_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs) { + uint16_t betas[PARAM_M - 1]; + uint16_t betas_sums[1 << (PARAM_M - 1)]; + uint16_t f0[1 << (PARAM_FFT - 1)]; + uint16_t f1[1 << (PARAM_FFT - 1)]; + uint16_t deltas[PARAM_M - 1]; + size_t k = 1 << (PARAM_M - 1); + uint16_t u[1 << (PARAM_M - 1)]; + uint16_t v[1 << (PARAM_M - 1)]; + + // Follows Gao and Mateer algorithm + compute_fft_betas(betas); + + // Step 1: PARAM_FFT > 1, nothing to do + + // Compute gammas sums + compute_subset_sums(betas_sums, betas, PARAM_M - 1); + + // Step 2: beta_m = 1, nothing to do + + // Step 3 + radix(f0, f1, f, PARAM_FFT); + + // Step 4: Compute deltas + for (size_t i = 0 ; i < PARAM_M - 1 ; ++i) { + deltas[i] = PQCLEAN_HQCRMRS256_CLEAN_gf_square(betas[i]) ^ betas[i]; + } + + // Step 5 + fft_rec(u, f0, (f_coeffs + 1) / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + fft_rec(v, f1, f_coeffs / 2, PARAM_M - 1, PARAM_FFT - 1, deltas); + + // Step 6, 7 and error polynomial computation + memcpy(w + k, v, 2 * k); + + // Check if 0 is root + w[0] = u[0]; + + // Check if 1 is root + w[k] ^= u[0]; + + // Find other roots + for (size_t i = 1 ; i < k ; ++i) { + w[i] = u[i] ^ PQCLEAN_HQCRMRS256_CLEAN_gf_mul(betas_sums[i], v[i]); + w[k + i] ^= w[i]; + } +} + + + +/** + * @brief Retrieves the error polynomial error from the evaluations w of the ELP (Error Locator Polynomial) on all field elements. + * + * @param[out] error Array with the error + * @param[out] error_compact Array with the error in a compact form + * @param[in] w Array of size 2^PARAM_M + */ +void PQCLEAN_HQCRMRS256_CLEAN_fft_retrieve_error_poly(uint8_t *error, const uint16_t *w) { + uint16_t gammas[PARAM_M - 1] = {0}; + uint16_t gammas_sums[1 << (PARAM_M - 1)] = {0}; + size_t k = 1 << (PARAM_M - 1); + + compute_fft_betas(gammas); + compute_subset_sums(gammas_sums, gammas, PARAM_M - 1); + + error[0] ^= 1 ^ ((uint16_t) - w[0] >> 15); + error[0] ^= 1 ^ ((uint16_t) - w[k] >> 15); + + size_t index = PARAM_GF_MUL_ORDER; + + for (size_t i = 1 ; i < k ; ++i) { + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQCRMRS256_CLEAN_gf_log(gammas_sums[i]); + error[index] ^= 1 ^ ((uint16_t) - w[i] >> 15); + + index = PARAM_GF_MUL_ORDER - PQCLEAN_HQCRMRS256_CLEAN_gf_log(gammas_sums[i] ^ 1); + error[index] ^= 1 ^ ((uint16_t) - w[k + i] >> 15); + } +} diff --git a/crypto_kem/hqc-rmrs-256/clean/fft.h b/crypto_kem/hqc-rmrs-256/clean/fft.h new file mode 100644 index 00000000..dc9cbe19 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/fft.h @@ -0,0 +1,21 @@ +#ifndef FFT_H +#define FFT_H + + +/** + * @file fft.h + * Header file of fft.c + */ + + +#include + +#include +#include + +void PQCLEAN_HQCRMRS256_CLEAN_fft(uint16_t *w, const uint16_t *f, size_t f_coeffs); + +void PQCLEAN_HQCRMRS256_CLEAN_fft_retrieve_error_poly(uint8_t *error, const uint16_t *w); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/clean/gf.c b/crypto_kem/hqc-rmrs-256/clean/gf.c new file mode 100644 index 00000000..06f47f6d --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/gf.c @@ -0,0 +1,116 @@ +#include "gf.h" +#include "parameters.h" +#include +/** + * @file gf.c + * Galois field implementation with multiplication using lookup tables + */ + + + +/** + * Generates exp and log lookup tables of GF(2^m). + * The logarithm of 0 is defined as 2^PARAM_M by convention.
+ * The last two elements of the exp table are needed by the PQCLEAN_HQCRMRS256_CLEAN_gf_mul function. + * (for example if both elements to multiply are zero). + * @param[out] exp Array of size 2^PARAM_M + 2 receiving the powers of the primitive element + * @param[out] log Array of size 2^PARAM_M receiving the logarithms of the elements of GF(2^m) + * @param[in] m Parameter of Galois field GF(2^m) + */ +void PQCLEAN_HQCRMRS256_CLEAN_gf_generate(uint16_t *exp, uint16_t *log, int16_t m) { + uint16_t elt = 1; + uint16_t alpha = 2; // primitive element of GF(2^PARAM_M) + uint16_t gf_poly = PARAM_GF_POLY; + + for (size_t i = 0 ; i < (1U << m) - 1 ; ++i) { + exp[i] = elt; + log[elt] = i; + + elt *= alpha; + if (elt >= 1 << m) { + elt ^= gf_poly; + } + } + + exp[(1 << m) - 1] = 1; + exp[1 << m] = 2; + exp[(1 << m) + 1] = 4; + log[0] = 1 << m; // by convention +} + + + +/** + * Returns the requested power of the primitive element of GF(2^PARAM_M). + * @returns a^i + */ +uint16_t PQCLEAN_HQCRMRS256_CLEAN_gf_exp(uint16_t i) { + return exp[i]; +} + + + +/** + * Returns the integer i such that elt = a^i + * where a is the primitive element of GF(2^PARAM_M). + * @returns the logarithm of the given element + */ +uint16_t PQCLEAN_HQCRMRS256_CLEAN_gf_log(uint16_t elt) { + return log[elt]; +} + + + +/** + * Multiplies nonzero element 'a' by element 'b'. + * @returns the product a*b + * @param[in] a First element of GF(2^PARAM_M) to multiply (cannot be zero) + * @param[in] b Second element of GF(2^PARAM_M) to multiply (cannot be zero) + */ +uint16_t PQCLEAN_HQCRMRS256_CLEAN_gf_mul(uint16_t a, uint16_t b) { + // mask = 0xffff if neither a nor b is zero. Otherwise mask is 0. + // mask = 0xffff si ni a ni b n'est nul. sinon mask = 0 + int16_t mask = ((log[a] | log[b]) >> PARAM_M) - 1; + return mask & exp[PQCLEAN_HQCRMRS256_CLEAN_gf_mod(log[a] + log[b])]; +} + + + +/** + * Squares an element of GF(2^PARAM_M). + * @returns a^2 + * @param[in] a Element of GF(2^PARAM_M) + */ +uint16_t PQCLEAN_HQCRMRS256_CLEAN_gf_square(uint16_t a) { + int16_t mask = (log[a] >> PARAM_M) - 1; + return mask & exp[PQCLEAN_HQCRMRS256_CLEAN_gf_mod(2 * log[a])]; +} + + + +/** + * Computes the inverse of an element of GF(2^PARAM_M). + * @returns the inverse of a + * @param[in] a Element of GF(2^PARAM_M) + */ +uint16_t PQCLEAN_HQCRMRS256_CLEAN_gf_inverse(uint16_t a) { + return exp[PARAM_GF_MUL_ORDER - log[a]]; +} + + + +/** + * Returns i modulo 2^PARAM_M-1. + * i must be less than 2*(2^PARAM_M-1). + * Therefore, the return value is either i or i-2^PARAM_M+1. + * @returns i mod (2^PARAM_M-1) + * @param[in] i The integer whose modulo is taken + */ +uint16_t PQCLEAN_HQCRMRS256_CLEAN_gf_mod(uint16_t i) { + uint16_t tmp = (uint16_t) (i - PARAM_GF_MUL_ORDER); + + // mask = 0xffff if(i < PARAM_GF_MUL_ORDER) + uint16_t mask = ~(tmp >> 15) + 1; + + return tmp + (mask & PARAM_GF_MUL_ORDER); +} diff --git a/crypto_kem/hqc-rmrs-256/clean/gf.h b/crypto_kem/hqc-rmrs-256/clean/gf.h new file mode 100644 index 00000000..fafe89b4 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/gf.h @@ -0,0 +1,48 @@ +#ifndef GF_H +#define GF_H + + +/** + * @file gf.h + * Header file of gf.c + */ + +#include + +#include +#include + + +/** + * Powers of the root alpha of 1 + x^2 + x^3 + x^4 + x^8. + * The last two elements are needed by the PQCLEAN_HQCRMRS256_CLEAN_gf_mul function + * (for example if both elements to multiply are zero). + */ +static const uint16_t exp [258] = { 1, 2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240, 253, 231, 211, 187, 107, 214, 177, 127, 254, 225, 223, 163, 91, 182, 113, 226, 217, 175, 67, 134, 17, 34, 68, 136, 13, 26, 52, 104, 208, 189, 103, 206, 129, 31, 62, 124, 248, 237, 199, 147, 59, 118, 236, 197, 151, 51, 102, 204, 133, 23, 46, 92, 184, 109, 218, 169, 79, 158, 33, 66, 132, 21, 42, 84, 168, 77, 154, 41, 82, 164, 85, 170, 73, 146, 57, 114, 228, 213, 183, 115, 230, 209, 191, 99, 198, 145, 63, 126, 252, 229, 215, 179, 123, 246, 241, 255, 227, 219, 171, 75, 150, 49, 98, 196, 149, 55, 110, 220, 165, 87, 174, 65, 130, 25, 50, 100, 200, 141, 7, 14, 28, 56, 112, 224, 221, 167, 83, 166, 81, 162, 89, 178, 121, 242, 249, 239, 195, 155, 43, 86, 172, 69, 138, 9, 18, 36, 72, 144, 61, 122, 244, 245, 247, 243, 251, 235, 203, 139, 11, 22, 44, 88, 176, 125, 250, 233, 207, 131, 27, 54, 108, 216, 173, 71, 142, 1, 2, 4 }; + + + +/** + * Logarithm of elements of GF(2^8) to the base alpha (root of 1 + x^2 + x^3 + x^4 + x^8). + * The logarithm of 0 is set to 0 by convention. + */ +static const uint16_t log [256] = { 0, 0, 1, 25, 2, 50, 26, 198, 3, 223, 51, 238, 27, 104, 199, 75, 4, 100, 224, 14, 52, 141, 239, 129, 28, 193, 105, 248, 200, 8, 76, 113, 5, 138, 101, 47, 225, 36, 15, 33, 53, 147, 142, 218, 240, 18, 130, 69, 29, 181, 194, 125, 106, 39, 249, 185, 201, 154, 9, 120, 77, 228, 114, 166, 6, 191, 139, 98, 102, 221, 48, 253, 226, 152, 37, 179, 16, 145, 34, 136, 54, 208, 148, 206, 143, 150, 219, 189, 241, 210, 19, 92, 131, 56, 70, 64, 30, 66, 182, 163, 195, 72, 126, 110, 107, 58, 40, 84, 250, 133, 186, 61, 202, 94, 155, 159, 10, 21, 121, 43, 78, 212, 229, 172, 115, 243, 167, 87, 7, 112, 192, 247, 140, 128, 99, 13, 103, 74, 222, 237, 49, 197, 254, 24, 227, 165, 153, 119, 38, 184, 180, 124, 17, 68, 146, 217, 35, 32, 137, 46, 55, 63, 209, 91, 149, 188, 207, 205, 144, 135, 151, 178, 220, 252, 190, 97, 242, 86, 211, 171, 20, 42, 93, 158, 132, 60, 57, 83, 71, 109, 65, 162, 31, 45, 67, 216, 183, 123, 164, 118, 196, 23, 73, 236, 127, 12, 111, 246, 108, 161, 59, 82, 41, 157, 85, 170, 251, 96, 134, 177, 187, 204, 62, 90, 203, 89, 95, 176, 156, 169, 160, 81, 11, 245, 22, 235, 122, 117, 44, 215, 79, 174, 213, 233, 230, 231, 173, 232, 116, 214, 244, 234, 168, 80, 88, 175 }; + + +void PQCLEAN_HQCRMRS256_CLEAN_gf_generate(uint16_t *exp, uint16_t *log, int16_t m); + + +uint16_t PQCLEAN_HQCRMRS256_CLEAN_gf_log(uint16_t elt); + +uint16_t PQCLEAN_HQCRMRS256_CLEAN_gf_exp(uint16_t i); + +uint16_t PQCLEAN_HQCRMRS256_CLEAN_gf_mul(uint16_t a, uint16_t b); + +uint16_t PQCLEAN_HQCRMRS256_CLEAN_gf_square(uint16_t a); + +uint16_t PQCLEAN_HQCRMRS256_CLEAN_gf_inverse(uint16_t a); + +uint16_t PQCLEAN_HQCRMRS256_CLEAN_gf_mod(uint16_t i); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/clean/gf2x.c b/crypto_kem/hqc-rmrs-256/clean/gf2x.c new file mode 100644 index 00000000..1866700e --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/gf2x.c @@ -0,0 +1,155 @@ +#include "gf2x.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include +#include +#include +/** + * \file gf2x.c + * \brief Implementation of multiplication of two polynomials + */ + + +static inline void swap(uint16_t *tab, uint16_t elt1, uint16_t elt2); +static void reduce(uint64_t *o, const uint64_t *a); +static void fast_convolution_mult(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx); + +/** + * @brief swap two elements in a table + * + * This function exchanges tab[elt1] with tab[elt2] + * + * @param[in] tab Pointer to the table + * @param[in] elt1 Index of the first element + * @param[in] elt2 Index of the second element + */ +static inline void swap(uint16_t *tab, uint16_t elt1, uint16_t elt2) { + uint16_t tmp = tab[elt1]; + + tab[elt1] = tab[elt2]; + tab[elt2] = tmp; +} + + + +/** + * @brief Compute o(x) = a(x) mod \f$ X^n - 1\f$ + * + * This function computes the modular reduction of the polynomial a(x) + * + * @param[in] a Pointer to the polynomial a(x) + * @param[out] o Pointer to the result + */ +static void reduce(uint64_t *o, const uint64_t *a) { + uint64_t r; + uint64_t carry; + + for (uint32_t i = 0 ; i < VEC_N_SIZE_64 ; i++) { + r = a[i + VEC_N_SIZE_64 - 1] >> (PARAM_N & 63); + carry = (uint64_t) (a[i + VEC_N_SIZE_64] << (64 - (PARAM_N & 63))); + o[i] = a[i] ^ r ^ carry; + } + + o[VEC_N_SIZE_64 - 1] &= RED_MASK; +} + + + +/** + * @brief computes product of the polynomial a1(x) with the sparse polynomial a2 + * + * o(x) = a1(x)a2(x) + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to the sparse polynomial a2 (list of degrees of the monomials which appear in a2) + * @param[in] a2 Pointer to the polynomial a1(x) + * @param[in] weight Hamming wifht of the sparse polynomial a2 + * @param[in] ctx Pointer to a seed expander used to randomize the multiplication process + */ +static void fast_convolution_mult(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx) { +//static uint32_t fast_convolution_mult(const uint64_t *A, const uint32_t *vB, uint64_t *C, const uint16_t w, AES_XOF_struct *ctx) + uint64_t carry; + uint32_t dec, s; + uint64_t table[16 * (VEC_N_SIZE_64 + 1)]; + uint16_t permuted_table[16]; + uint16_t permutation_table[16]; + uint16_t permuted_sparse_vect[PARAM_OMEGA_E]; + uint16_t permutation_sparse_vect[PARAM_OMEGA_E]; + uint64_t *pt; + uint16_t *res_16; + + for (uint32_t i = 0 ; i < 16; i++) { + permuted_table[i] = i; + } + + seedexpander(ctx, (uint8_t *) permutation_table, 16 * sizeof(uint16_t)); + + for (uint32_t i = 0 ; i < 15 ; i++) { + swap(permuted_table + i, 0, permutation_table[i] % (16 - i)); + } + + pt = table + (permuted_table[0] * (VEC_N_SIZE_64 + 1)); + for (int32_t j = 0 ; j < VEC_N_SIZE_64 ; j++) { + pt[j] = a2[j]; + } + pt[VEC_N_SIZE_64] = 0x0; + + for (uint32_t i = 1 ; i < 16 ; i++) { + carry = 0; + pt = table + (permuted_table[i] * (VEC_N_SIZE_64 + 1)); + for (uint32_t j = 0 ; j < VEC_N_SIZE_64 ; j++) { + pt[j] = (a2[j] << i) ^ carry; + carry = (a2[j] >> ((64 - i))); + } + pt[VEC_N_SIZE_64] = carry; + } + + for (uint32_t i = 0 ; i < weight ; i++) { + permuted_sparse_vect[i] = i; + } + + seedexpander(ctx, (uint8_t *) permutation_sparse_vect, weight * sizeof(uint16_t)); + + for (uint32_t i = 0 ; i + 1 < weight ; i++) { + swap(permuted_sparse_vect + i, 0, permutation_sparse_vect[i] % (weight - i)); + } + + for (uint32_t i = 0 ; i < weight ; i++) { + dec = a1[permuted_sparse_vect[i]] & 0xf; + s = a1[permuted_sparse_vect[i]] >> 4; + res_16 = ((uint16_t *) o) + s; + pt = table + (permuted_table[dec] * (VEC_N_SIZE_64 + 1)); + + for (uint32_t j = 0 ; j < VEC_N_SIZE_64 + 1 ; j++) { + *res_16++ ^= (uint16_t) pt[j]; + *res_16++ ^= (uint16_t) (pt[j] >> 16); + *res_16++ ^= (uint16_t) (pt[j] >> 32); + *res_16++ ^= (uint16_t) (pt[j] >> 48); + } + } +} + + + +/** + * @brief Multiply two polynomials modulo \f$ X^n - 1\f$. + * + * This functions multiplies a sparse polynomial a1 (of Hamming weight equal to weight) + * and a dense polynomial a2. The multiplication is done modulo \f$ X^n - 1\f$. + * + * @param[out] o Pointer to the result + * @param[in] a1 Pointer to the sparse polynomial + * @param[in] a2 Pointer to the dense polynomial + * @param[in] weight Integer that is the weigt of the sparse polynomial + * @param[in] ctx Pointer to the randomness context + */ +void PQCLEAN_HQCRMRS256_CLEAN_vect_mul(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx) { + uint64_t tmp[2 * VEC_N_SIZE_64 + 1]; + for (uint32_t j = 0 ; j < 2 * VEC_N_SIZE_64 + 1 ; j++) { + tmp[j] = 0; + } + + fast_convolution_mult(tmp, a1, a2, weight, ctx); + reduce(o, tmp); +} diff --git a/crypto_kem/hqc-rmrs-256/clean/gf2x.h b/crypto_kem/hqc-rmrs-256/clean/gf2x.h new file mode 100644 index 00000000..0a94690c --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/gf2x.h @@ -0,0 +1,18 @@ +#ifndef GF2X_H +#define GF2X_H + + +/** + * @file gf2x.h + * @brief Header file for gf2x.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQCRMRS256_CLEAN_vect_mul(uint64_t *o, const uint32_t *a1, const uint64_t *a2, uint16_t weight, AES_XOF_struct *ctx); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/clean/hqc.c b/crypto_kem/hqc-rmrs-256/clean/hqc.c new file mode 100644 index 00000000..2b0af350 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/hqc.c @@ -0,0 +1,143 @@ +#include "code.h" +#include "gf2x.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +/** + * @file hqc.c + * @brief Implementation of hqc.h + */ + + + +/** + * @brief Keygen of the HQC_PKE IND_CPA scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS256_CLEAN_hqc_pke_keygen(unsigned char *pk, unsigned char *sk) { + AES_XOF_struct sk_seedexpander; + AES_XOF_struct pk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + uint8_t pk_seed[SEED_BYTES] = {0}; + uint64_t x[VEC_N_SIZE_64] = {0}; + uint32_t y[PARAM_OMEGA] = {0}; + uint64_t h[VEC_N_SIZE_64] = {0}; + uint64_t s[VEC_N_SIZE_64] = {0}; + + // Create seed_expanders for public key and secret key + randombytes(sk_seed, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + randombytes(pk_seed, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute secret key + PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_fixed_weight_by_coordinates(&sk_seedexpander, y, PARAM_OMEGA); + + // Compute public key + PQCLEAN_HQCRMRS256_CLEAN_vect_set_random(&pk_seedexpander, h); + PQCLEAN_HQCRMRS256_CLEAN_vect_mul(s, y, h, PARAM_OMEGA, &sk_seedexpander); + PQCLEAN_HQCRMRS256_CLEAN_vect_add(s, x, s, VEC_N_SIZE_64); + + // Parse keys to string + PQCLEAN_HQCRMRS256_CLEAN_hqc_public_key_to_string(pk, pk_seed, s); + PQCLEAN_HQCRMRS256_CLEAN_hqc_secret_key_to_string(sk, sk_seed, pk); + +} + + + +/** + * @brief Encryption of the HQC_PKE IND_CPA scheme + * + * The cihertext is composed of vectors u and v. + * + * @param[out] u Vector u (first part of the ciphertext) + * @param[out] v Vector v (second part of the ciphertext) + * @param[in] m Vector representing the message to encrypt + * @param[in] theta Seed used to derive randomness required for encryption + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS256_CLEAN_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk) { + AES_XOF_struct seedexpander; + uint64_t h[VEC_N_SIZE_64] = {0}; + uint64_t s[VEC_N_SIZE_64] = {0}; + uint64_t r1[VEC_N_SIZE_64] = {0}; + uint32_t r2[PARAM_OMEGA_R] = {0}; + uint64_t e[VEC_N_SIZE_64] = {0}; + uint64_t tmp1[VEC_N_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_SIZE_64] = {0}; + + // Create seed_expander from theta + seedexpander_init(&seedexpander, theta, theta + 32, SEEDEXPANDER_MAX_LENGTH); + + // Retrieve h and s from public key + PQCLEAN_HQCRMRS256_CLEAN_hqc_public_key_from_string(h, s, pk); + + // Generate r1, r2 and e + PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_fixed_weight(&seedexpander, r1, PARAM_OMEGA_R); + PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_fixed_weight_by_coordinates(&seedexpander, r2, PARAM_OMEGA_R); + PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_fixed_weight(&seedexpander, e, PARAM_OMEGA_E); + + // Compute u = r1 + r2.h + PQCLEAN_HQCRMRS256_CLEAN_vect_mul(u, r2, h, PARAM_OMEGA_R, &seedexpander); + PQCLEAN_HQCRMRS256_CLEAN_vect_add(u, r1, u, VEC_N_SIZE_64); + + // Compute v = m.G by encoding the message + PQCLEAN_HQCRMRS256_CLEAN_code_encode(v, m); + PQCLEAN_HQCRMRS256_CLEAN_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + + // Compute v = m.G + s.r2 + e + PQCLEAN_HQCRMRS256_CLEAN_vect_mul(tmp2, r2, s, PARAM_OMEGA_R, &seedexpander); + PQCLEAN_HQCRMRS256_CLEAN_vect_add(tmp2, e, tmp2, VEC_N_SIZE_64); + PQCLEAN_HQCRMRS256_CLEAN_vect_add(tmp2, tmp1, tmp2, VEC_N_SIZE_64); + PQCLEAN_HQCRMRS256_CLEAN_vect_resize(v, PARAM_N1N2, tmp2, PARAM_N); + +} + + + +/** + * @brief Decryption of the HQC_PKE IND_CPA scheme + * + * @param[out] m Vector representing the decrypted message + * @param[in] u Vector u (first part of the ciphertext) + * @param[in] v Vector v (second part of the ciphertext) + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS256_CLEAN_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk) { + uint64_t x[VEC_N_SIZE_64] = {0}; + uint32_t y[PARAM_OMEGA] = {0}; + uint8_t pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t tmp1[VEC_N_SIZE_64] = {0}; + uint64_t tmp2[VEC_N_SIZE_64] = {0}; + AES_XOF_struct perm_seedexpander; + uint8_t perm_seed[SEED_BYTES] = {0}; + + // Retrieve x, y, pk from secret key + PQCLEAN_HQCRMRS256_CLEAN_hqc_secret_key_from_string(x, y, pk, sk); + + randombytes(perm_seed, SEED_BYTES); + seedexpander_init(&perm_seedexpander, perm_seed, perm_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + // Compute v - u.y + PQCLEAN_HQCRMRS256_CLEAN_vect_resize(tmp1, PARAM_N, v, PARAM_N1N2); + PQCLEAN_HQCRMRS256_CLEAN_vect_mul(tmp2, y, u, PARAM_OMEGA, &perm_seedexpander); + PQCLEAN_HQCRMRS256_CLEAN_vect_add(tmp2, tmp1, tmp2, VEC_N_SIZE_64); + + + // Compute m by decoding v - u.y + PQCLEAN_HQCRMRS256_CLEAN_code_decode(m, tmp2); +} diff --git a/crypto_kem/hqc-rmrs-256/clean/hqc.h b/crypto_kem/hqc-rmrs-256/clean/hqc.h new file mode 100644 index 00000000..bb9bfcbd --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/hqc.h @@ -0,0 +1,21 @@ +#ifndef HQC_H +#define HQC_H + + +/** + * @file hqc.h + * @brief Functions of the HQC_PKE IND_CPA scheme + */ + +#include + +#include + +void PQCLEAN_HQCRMRS256_CLEAN_hqc_pke_keygen(unsigned char *pk, unsigned char *sk); + +void PQCLEAN_HQCRMRS256_CLEAN_hqc_pke_encrypt(uint64_t *u, uint64_t *v, uint64_t *m, unsigned char *theta, const unsigned char *pk); + +void PQCLEAN_HQCRMRS256_CLEAN_hqc_pke_decrypt(uint64_t *m, const uint64_t *u, const uint64_t *v, const unsigned char *sk); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/clean/kem.c b/crypto_kem/hqc-rmrs-256/clean/kem.c new file mode 100644 index 00000000..c79c7534 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/kem.c @@ -0,0 +1,138 @@ +#include "api.h" +#include "fips202.h" +#include "hqc.h" +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "sha2.h" +#include "vector.h" +#include +#include +/** + * @file kem.c + * @brief Implementation of api.h + */ + + + +/** + * @brief Keygen of the HQC_KEM IND_CAA2 scheme + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h. + * + * The secret key is composed of the seed used to generate vectors x and y. + * As a technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] pk String containing the public key + * @param[out] sk String containing the secret key + * @returns 0 if keygen is successful + */ +int PQCLEAN_HQCRMRS256_CLEAN_crypto_kem_keypair(unsigned char *pk, unsigned char *sk) { + + PQCLEAN_HQCRMRS256_CLEAN_hqc_pke_keygen(pk, sk); + return 0; +} + + + +/** + * @brief Encapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ct String containing the ciphertext + * @param[out] ss String containing the shared secret + * @param[in] pk String containing the public key + * @returns 0 if encapsulation is successful + */ +int PQCLEAN_HQCRMRS256_CLEAN_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk) { + + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint64_t u[VEC_N_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Computing m + PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_from_randombytes(m); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m + PQCLEAN_HQCRMRS256_CLEAN_hqc_pke_encrypt(u, v, m, theta, pk); + + // Computing d + sha512(d, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Computing ciphertext + PQCLEAN_HQCRMRS256_CLEAN_hqc_ciphertext_to_string(ct, u, v, d); + + + return 0; +} + + + +/** + * @brief Decapsulation of the HQC_KEM IND_CAA2 scheme + * + * @param[out] ss String containing the shared secret + * @param[in] ct String containing the cipĥertext + * @param[in] sk String containing the secret key + * @returns 0 if decapsulation is successful, -1 otherwise + */ +int PQCLEAN_HQCRMRS256_CLEAN_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk) { + + int8_t result = -1; + uint64_t u[VEC_N_SIZE_64] = {0}; + uint64_t v[VEC_N1N2_SIZE_64] = {0}; + unsigned char d[SHA512_BYTES] = {0}; + unsigned char pk[PUBLIC_KEY_BYTES] = {0}; + uint64_t m[VEC_K_SIZE_64] = {0}; + uint8_t theta[SHA512_BYTES] = {0}; + uint64_t u2[VEC_N_SIZE_64] = {0}; + uint64_t v2[VEC_N1N2_SIZE_64] = {0}; + unsigned char d2[SHA512_BYTES] = {0}; + unsigned char mc[VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES] = {0}; + + // Retrieving u, v and d from ciphertext + PQCLEAN_HQCRMRS256_CLEAN_hqc_ciphertext_from_string(u, v, d, ct); + + // Retrieving pk from sk + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); + + // Decryting + PQCLEAN_HQCRMRS256_CLEAN_hqc_pke_decrypt(m, u, v, sk); + + // Computing theta + sha3_512(theta, (uint8_t *) m, VEC_K_SIZE_BYTES); + + // Encrypting m' + PQCLEAN_HQCRMRS256_CLEAN_hqc_pke_encrypt(u2, v2, m, theta, pk); + + // Computing d' + sha512(d2, (unsigned char *) m, VEC_K_SIZE_BYTES); + + // Computing shared secret + memcpy(mc, m, VEC_K_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES, u, VEC_N_SIZE_BYTES); + memcpy(mc + VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + sha512(ss, mc, VEC_K_SIZE_BYTES + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES); + + // Abort if c != c' or d != d' + result = (PQCLEAN_HQCRMRS256_CLEAN_vect_compare(u, u2, VEC_N_SIZE_BYTES) == 0 && PQCLEAN_HQCRMRS256_CLEAN_vect_compare(v, v2, VEC_N1N2_SIZE_BYTES) == 0 && memcmp(d, d2, SHA512_BYTES) == 0); + for (size_t i = 0 ; i < SHARED_SECRET_BYTES ; i++) { + ss[i] = result * ss[i]; + } + result--; + + + return result; +} diff --git a/crypto_kem/hqc-rmrs-256/clean/parameters.h b/crypto_kem/hqc-rmrs-256/clean/parameters.h new file mode 100644 index 00000000..4732b419 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/parameters.h @@ -0,0 +1,102 @@ +#ifndef HQC_PARAMETERS_H +#define HQC_PARAMETERS_H + + +/** + * @file parameters.h + * @brief Parameters of the HQC_KEM IND-CCA2 scheme + */ + +#include "api.h" +#include "api.h" + + +#define CEIL_DIVIDE(a, b) (((a)/(b)) + ((a) % (b) == 0 ? 0 : 1)) /*!< Divide a by b and ceil the result*/ +#define BITMASK(a, size) ((1UL << ((a) % (size))) - 1) /*!< Create a mask*/ + + +/* + #define PARAM_N Define the parameter n of the scheme + #define PARAM_N1 Define the parameter n1 of the scheme (length of Reed-Solomon code) + #define PARAM_N2 Define the parameter n2 of the scheme (length of Duplicated Reed-Muller code) + #define PARAM_N1N2 Define the length in bits of the Concatenated code + #define PARAM_OMEGA Define the parameter omega of the scheme + #define PARAM_OMEGA_E Define the parameter omega_e of the scheme + #define PARAM_OMEGA_R Define the parameter omega_r of the scheme + #define PARAM_SECURITY Define the security level corresponding to the chosen parameters + #define PARAM_DFR_EXP Define the decryption failure rate corresponding to the chosen parameters + + #define SECRET_KEY_BYTES Define the size of the secret key in bytes + #define PUBLIC_KEY_BYTES Define the size of the public key in bytes + #define SHARED_SECRET_BYTES Define the size of the shared secret in bytes + #define CIPHERTEXT_BYTES Define the size of the ciphertext in bytes + + #define UTILS_REJECTION_THRESHOLD Define the rejection threshold used to generate given weight vectors (see vector_set_random_fixed_weight function) + #define VEC_N_SIZE_BYTES Define the size of the array used to store a PARAM_N sized vector in bytes + #define VEC_K_SIZE_BYTES Define the size of the array used to store a PARAM_K sized vector in bytes + #define VEC_N1Y_SIZE_BYTES Define the size of the array used to store a PARAM_N1 sized vector in bytes + #define VEC_N1N2_SIZE_BYTES Define the size of the array used to store a PARAM_N1N2 sized vector in bytes + + #define VEC_N_SIZE_64 Define the size of the array used to store a PARAM_N sized vector in 64 bits + #define VEC_K_SIZE_64 Define the size of the array used to store a PARAM_K sized vector in 64 bits + #define VEC_N1_SIZE_64 Define the size of the array used to store a PARAM_N1 sized vector in 64 bits + #define VEC_N1N2_SIZE_64 Define the size of the array used to store a PARAM_N1N2 sized vector in 64 bits + + #define PARAM_DELTA Define the parameter delta of the scheme (correcting capacity of the Reed-Solomon code) + #define PARAM_M Define a positive integer + #define PARAM_GF_POLY Generator polynomial of galois field GF(2^PARAM_M), represented in hexadecimial form + #define PARAM_GF_MUL_ORDER Define the size of the multiplicative group of GF(2^PARAM_M), i.e 2^PARAM_M -1 + #define PARAM_K Define the size of the information bits of the Reed-Solomon code + #define PARAM_G Define the size of the generator polynomial of Reed-Solomon code + #define PARAM_FFT The additive FFT takes a 2^PARAM_FFT polynomial as input + We use the FFT to compute the roots of sigma, whose degree if PARAM_DELTA=23 + The smallest power of 2 greater than 23+1 is 32=2^5 + #define RS_POLY_COEFS Coefficients of the generator polynomial of the Reed-Solomon code + + #define RED_MASK A mask fot the higher bits of a vector + #define SHA512_BYTES Define the size of SHA512 output in bytes + #define SEED_BYTES Define the size of the seed in bytes + #define SEEDEXPANDER_MAX_LENGTH Define the seed expander max length +*/ + +#define PARAM_N 59957 +#define PARAM_N1 78 +#define PARAM_N2 768 +#define PARAM_N1N2 59904 +#define PARAM_OMEGA 133 +#define PARAM_OMEGA_E 153 +#define PARAM_OMEGA_R 153 +#define PARAM_SECURITY 256 +#define PARAM_DFR_EXP 256 + +#define SECRET_KEY_BYTES PQCLEAN_HQCRMRS256_CLEAN_CRYPTO_SECRETKEYBYTES +#define PUBLIC_KEY_BYTES PQCLEAN_HQCRMRS256_CLEAN_CRYPTO_PUBLICKEYBYTES +#define SHARED_SECRET_BYTES PQCLEAN_HQCRMRS256_CLEAN_CRYPTO_BYTES +#define CIPHERTEXT_BYTES PQCLEAN_HQCRMRS256_CLEAN_CRYPTO_CIPHERTEXTBYTES + +#define UTILS_REJECTION_THRESHOLD 16728003 +#define VEC_N_SIZE_BYTES CEIL_DIVIDE(PARAM_N, 8) +#define VEC_K_SIZE_BYTES PARAM_K +#define VEC_N1_SIZE_BYTES PARAM_N1 +#define VEC_N1N2_SIZE_BYTES CEIL_DIVIDE(PARAM_N1N2, 8) + +#define VEC_N_SIZE_64 CEIL_DIVIDE(PARAM_N, 64) +#define VEC_K_SIZE_64 CEIL_DIVIDE(PARAM_K, 8) +#define VEC_N1_SIZE_64 CEIL_DIVIDE(PARAM_N1, 8) +#define VEC_N1N2_SIZE_64 CEIL_DIVIDE(PARAM_N1N2, 64) + +#define PARAM_DELTA 23 +#define PARAM_M 8 +#define PARAM_GF_POLY 0x11D +#define PARAM_GF_MUL_ORDER 255 +#define PARAM_K 32 +#define PARAM_G 47 +#define PARAM_FFT 5 +#define RS_POLY_COEFS 111,204,161,232,250,107,58,200,161,225,89,57,143,12,106,116,218,68,19,127,236,48,3,210,243,174,203,57,78,15,185,168,204,194,152,17,189,200,197,162,244,8,248,163,217,31,1 + +#define RED_MASK 0x1fffffffffffffUL +#define SHA512_BYTES 64 +#define SEED_BYTES 40 +#define SEEDEXPANDER_MAX_LENGTH 4294967295 + +#endif diff --git a/crypto_kem/hqc-rmrs-256/clean/parsing.c b/crypto_kem/hqc-rmrs-256/clean/parsing.c new file mode 100644 index 00000000..a003f484 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/parsing.c @@ -0,0 +1,121 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "parsing.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file parsing.c + * @brief Functions to parse secret key, public key and ciphertext of the HQC scheme + */ + + + +/** + * @brief Parse a secret key into a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] sk String containing the secret key + * @param[in] sk_seed Seed used to generate the secret key + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS256_CLEAN_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk) { + memcpy(sk, sk_seed, SEED_BYTES); + memcpy(sk + SEED_BYTES, pk, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a secret key from a string + * + * The secret key is composed of the seed used to generate vectors x and y. + * As technicality, the public key is appended to the secret key in order to respect NIST API. + * + * @param[out] x uint64_t representation of vector x + * @param[out] y uint32_t representation of vector y + * @param[out] pk String containing the public key + * @param[in] sk String containing the secret key + */ +void PQCLEAN_HQCRMRS256_CLEAN_hqc_secret_key_from_string(uint64_t *x, uint32_t *y, uint8_t *pk, const uint8_t *sk) { + AES_XOF_struct sk_seedexpander; + uint8_t sk_seed[SEED_BYTES] = {0}; + + memcpy(sk_seed, sk, SEED_BYTES); + seedexpander_init(&sk_seedexpander, sk_seed, sk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + + PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_fixed_weight(&sk_seedexpander, x, PARAM_OMEGA); + PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_fixed_weight_by_coordinates(&sk_seedexpander, y, PARAM_OMEGA); + memcpy(pk, sk + SEED_BYTES, PUBLIC_KEY_BYTES); +} + +/** + * @brief Parse a public key into a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] pk String containing the public key + * @param[in] pk_seed Seed used to generate the public key + * @param[in] s uint8_t representation of vector s + */ +void PQCLEAN_HQCRMRS256_CLEAN_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s) { + memcpy(pk, pk_seed, SEED_BYTES); + memcpy(pk + SEED_BYTES, s, VEC_N_SIZE_BYTES); +} + + + +/** + * @brief Parse a public key from a string + * + * The public key is composed of the syndrome s as well as the seed used to generate the vector h + * + * @param[out] h uint8_t representation of vector h + * @param[out] s uint8_t representation of vector s + * @param[in] pk String containing the public key + */ +void PQCLEAN_HQCRMRS256_CLEAN_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk) { + AES_XOF_struct pk_seedexpander; + uint8_t pk_seed[SEED_BYTES] = {0}; + + memcpy(pk_seed, pk, SEED_BYTES); + seedexpander_init(&pk_seedexpander, pk_seed, pk_seed + 32, SEEDEXPANDER_MAX_LENGTH); + PQCLEAN_HQCRMRS256_CLEAN_vect_set_random(&pk_seedexpander, h); + + memcpy(s, pk + SEED_BYTES, VEC_N_SIZE_BYTES); +} + + +/** + * @brief Parse a ciphertext into a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] ct String containing the ciphertext + * @param[in] u uint8_t representation of vector u + * @param[in] v uint8_t representation of vector v + * @param[in] d String containing the hash d + */ +void PQCLEAN_HQCRMRS256_CLEAN_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d) { + memcpy(ct, u, VEC_N_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES, v, VEC_N1N2_SIZE_BYTES); + memcpy(ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, d, SHA512_BYTES); +} + + +/** + * @brief Parse a ciphertext from a string + * + * The ciphertext is composed of vectors u, v and hash d. + * + * @param[out] u uint8_t representation of vector u + * @param[out] v uint8_t representation of vector v + * @param[out] d String containing the hash d + * @param[in] ct String containing the ciphertext + */ +void PQCLEAN_HQCRMRS256_CLEAN_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct) { + memcpy(u, ct, VEC_N_SIZE_BYTES); + memcpy(v, ct + VEC_N_SIZE_BYTES, VEC_N1N2_SIZE_BYTES); + memcpy(d, ct + VEC_N_SIZE_BYTES + VEC_N1N2_SIZE_BYTES, SHA512_BYTES); +} diff --git a/crypto_kem/hqc-rmrs-256/clean/parsing.h b/crypto_kem/hqc-rmrs-256/clean/parsing.h new file mode 100644 index 00000000..3da34dd2 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/parsing.h @@ -0,0 +1,29 @@ +#ifndef PARSING_H +#define PARSING_H + + +/** + * @file parsing.h + * @brief Header file for parsing.c + */ + +#include + +#include + +void PQCLEAN_HQCRMRS256_CLEAN_hqc_secret_key_to_string(uint8_t *sk, const uint8_t *sk_seed, const uint8_t *pk); + +void PQCLEAN_HQCRMRS256_CLEAN_hqc_secret_key_from_string(uint64_t *x, uint32_t *y, uint8_t *pk, const uint8_t *sk); + + +void PQCLEAN_HQCRMRS256_CLEAN_hqc_public_key_to_string(uint8_t *pk, const uint8_t *pk_seed, const uint64_t *s); + +void PQCLEAN_HQCRMRS256_CLEAN_hqc_public_key_from_string(uint64_t *h, uint64_t *s, const uint8_t *pk); + + +void PQCLEAN_HQCRMRS256_CLEAN_hqc_ciphertext_to_string(uint8_t *ct, const uint64_t *u, const uint64_t *v, const uint8_t *d); + +void PQCLEAN_HQCRMRS256_CLEAN_hqc_ciphertext_from_string(uint64_t *u, uint64_t *v, uint8_t *d, const uint8_t *ct); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/clean/reed_muller.c b/crypto_kem/hqc-rmrs-256/clean/reed_muller.c new file mode 100644 index 00000000..d8cfde2e --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/reed_muller.c @@ -0,0 +1,246 @@ +#include "parameters.h" +#include "reed_muller.h" +#include +#include +/** + * @file reed_muller.c + * Constant time implementation of Reed-Muller code RM(1,7) + */ + +// setting this will help the compiler with auto vectorization +#undef ALIGNVECTORS + + + +// number of repeated code words +#define MULTIPLICITY CEIL_DIVIDE(PARAM_N2, 128) + +// codeword is 128 bits, seen multiple ways +typedef union { + uint8_t u8[16]; + uint32_t u32[4]; +} codeword +; + +// Expanded codeword has a short for every bit, for internal calculations +typedef int16_t expandedCodeword[128] +; + +// copy bit 0 into all bits of a 32 bit value +#define BIT0MASK(x) (int32_t)(-((x) & 1)) + + +static void encode(codeword *word, int32_t message); +static void hadamard(expandedCodeword *src, expandedCodeword *dst); +static void expand_and_sum(expandedCodeword *dest, codeword src[]); +static int32_t find_peaks(expandedCodeword *transform); + + + +/** + * @brief Encode a single byte into a single codeword using RM(1,7) + * + * Encoding matrix of this code: + * bit pattern (note that bits are numbered big endian) + * 0 aaaaaaaa aaaaaaaa aaaaaaaa aaaaaaaa + * 1 cccccccc cccccccc cccccccc cccccccc + * 2 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0 + * 3 ff00ff00 ff00ff00 ff00ff00 ff00ff00 + * 4 ffff0000 ffff0000 ffff0000 ffff0000 + * 5 ffffffff 00000000 ffffffff 00000000 + * 6 ffffffff ffffffff 00000000 00000000 + * 7 ffffffff ffffffff ffffffff ffffffff + * + * @param[out] word An RM(1,7) codeword + * @param[in] message A message + */ +static void encode(codeword *word, int32_t message) { + // the four parts of the word are identical + // except for encoding bits 5 and 6 + int32_t first_word; + // bit 7 flips all the bits, do that first to save work + first_word = BIT0MASK(message >> 7); + // bits 0, 1, 2, 3, 4 are the same for all four longs + // (Warning: in the bit matrix above, low bits are at the left!) + first_word ^= BIT0MASK(message >> 0) & 0xaaaaaaaa; + first_word ^= BIT0MASK(message >> 1) & 0xcccccccc; + first_word ^= BIT0MASK(message >> 2) & 0xf0f0f0f0; + first_word ^= BIT0MASK(message >> 3) & 0xff00ff00; + first_word ^= BIT0MASK(message >> 4) & 0xffff0000; + // we can store this in the first quarter + word->u32[0] = first_word; + // bit 5 flips entries 1 and 3; bit 6 flips 2 and 3 + first_word ^= BIT0MASK(message >> 5); + word->u32[1] = first_word; + first_word ^= BIT0MASK(message >> 6); + word->u32[3] = first_word; + first_word ^= BIT0MASK(message >> 5); + word->u32[2] = first_word; +} + + + +/** + * @brief Hadamard transform + * + * Perform hadamard transform of src and store result in dst + * src is overwritten: it is also used as intermediate buffer + * Method is best explained if we use H(3) instead of H(7): + * + * The routine multiplies by the matrix H(3): + * [1 1 1 1 1 1 1 1] + * [1 -1 1 -1 1 -1 1 -1] + * [1 1 -1 -1 1 1 -1 -1] + * [a b c d e f g h] * [1 -1 -1 1 1 -1 -1 1] = result of routine + * [1 1 1 1 -1 -1 -1 -1] + * [1 -1 1 -1 -1 1 -1 1] + * [1 1 -1 -1 -1 -1 1 1] + * [1 -1 -1 1 -1 1 1 -1] + * You can do this in three passes, where each pass does this: + * set lower half of buffer to pairwise sums, + * and upper half to differences + * index 0 1 2 3 4 5 6 7 + * input: a, b, c, d, e, f, g, h + * pass 1: a+b, c+d, e+f, g+h, a-b, c-d, e-f, g-h + * pass 2: a+b+c+d, e+f+g+h, a-b+c-d, e-f+g-h, a+b-c-d, e+f-g-h, a-b-c+d, e-f-g+h + * pass 3: a+b+c+d+e+f+g+h a+b-c-d+e+f-g-h a+b+c+d-e-f-g-h a+b-c-d-e+-f+g+h + * a-b+c-d+e-f+g-h a-b-c+d+e-f-g+h a-b+c-d-e+f-g+h a-b-c+d-e+f+g-h + * This order of computation is chosen because it vectorises well. + * Likewise, this routine multiplies by H(7) in seven passes. + * + * @param[out] src Structure that contain the expanded codeword + * @param[out] dst Structure that contain the expanded codeword + */ +static void hadamard(expandedCodeword *src, expandedCodeword *dst) { + // the passes move data: + // src -> dst -> src -> dst -> src -> dst -> src -> dst + // using p1 and p2 alternately + expandedCodeword *p1 = src; + expandedCodeword *p2 = dst; + for (int32_t pass = 0 ; pass < 7 ; pass++) { + for (int32_t i = 0 ; i < 64 ; i++) { + (*p2)[i] = (*p1)[2 * i] + (*p1)[2 * i + 1]; + (*p2)[i + 64] = (*p1)[2 * i] - (*p1)[2 * i + 1]; + } + // swap p1, p2 for next round + expandedCodeword *p3 = p1; + p1 = p2; + p2 = p3; + } +} + + + +/** + * @brief Add multiple codewords into expanded codeword + * + * Accesses memory in order + * Note: this does not write the codewords as -1 or +1 as the green machine does + * instead, just 0 and 1 is used. + * The resulting hadamard transform has: + * all values are halved + * the first entry is 64 too high + * + * @param[out] dest Structure that contain the expanded codeword + * @param[in] src Structure that contain the codeword + */ +static void expand_and_sum(expandedCodeword *dest, codeword src[]) { + // start with the first copy + for (int32_t part = 0 ; part < 4 ; part++) { + for (int32_t bit = 0 ; bit < 32 ; bit++) { + (*dest)[part * 32 + bit] = src[0].u32[part] >> bit & 1; + } + } + // sum the rest of the copies + for (int32_t copy = 1 ; copy < MULTIPLICITY ; copy++) { + for (int32_t part = 0 ; part < 4 ; part++) { + for (int32_t bit = 0 ; bit < 32 ; bit++) { + (*dest)[part * 32 + bit] += src[copy].u32[part] >> bit & 1; + } + } + } +} + + + +/** + * @brief Finding the location of the highest value + * + * This is the final step of the green machine: find the location of the highest value, + * and add 128 if the peak is positive + * if there are two identical peaks, the peak with smallest value + * in the lowest 7 bits it taken + * @param[in] transform Structure that contain the expanded codeword + */ +static int32_t find_peaks(expandedCodeword *transform) { + int32_t peak_abs_value = 0; + int32_t peak_value = 0; + int32_t peak_pos = 0; + for (int32_t i = 0 ; i < 128 ; i++) { + // get absolute value + int32_t t = (*transform)[i]; + int32_t pos_mask = -(t > 0); + int32_t absolute = (pos_mask & t) | (~pos_mask & -t); + // all compilers nowadays compile with a conditional move + peak_value = absolute > peak_abs_value ? t : peak_value; + peak_pos = absolute > peak_abs_value ? i : peak_pos; + peak_abs_value = absolute > peak_abs_value ? absolute : peak_abs_value; + } + // set bit 7 + peak_pos |= 128 * (peak_value > 0); + return peak_pos; +} + + + +/** + * @brief Encodes the received word + * + * The message consists of N1 bytes each byte is encoded into PARAM_N2 bits, + * or MULTIPLICITY repeats of 128 bits + * + * @param[out] cdw Array of size VEC_N1N2_SIZE_64 receiving the encoded message + * @param[in] msg Array of size VEC_N1_SIZE_64 storing the message + */ +void PQCLEAN_HQCRMRS256_CLEAN_reed_muller_encode(uint64_t *cdw, const uint64_t *msg) { + uint8_t *message_array = (uint8_t *) msg; + codeword *codeArray = (codeword *) cdw; + for (size_t i = 0 ; i < VEC_N1_SIZE_BYTES ; i++) { + // fill entries i * MULTIPLICITY to (i+1) * MULTIPLICITY + int32_t pos = i * MULTIPLICITY; + // encode first word + encode(&codeArray[pos], message_array[i]); + // copy to other identical codewords + for (size_t copy = 1 ; copy < MULTIPLICITY ; copy++) { + memcpy(&codeArray[pos + copy], &codeArray[pos], sizeof(codeword)); + } + } +} + + + +/** + * @brief Decodes the received word + * + * Decoding uses fast hadamard transform, for a more complete picture on Reed-Muller decoding, see MacWilliams, Florence Jessie, and Neil James Alexander Sloane. + * The theory of error-correcting codes codes @cite macwilliams1977theory + * + * @param[out] msg Array of size VEC_N1_SIZE_64 receiving the decoded message + * @param[in] cdw Array of size VEC_N1N2_SIZE_64 storing the received word + */ +void PQCLEAN_HQCRMRS256_CLEAN_reed_muller_decode(uint64_t *msg, const uint64_t *cdw) { + uint8_t *message_array = (uint8_t *) msg; + codeword *codeArray = (codeword *) cdw; + expandedCodeword expanded; + for (size_t i = 0 ; i < VEC_N1_SIZE_BYTES ; i++) { + // collect the codewords + expand_and_sum(&expanded, &codeArray[i * MULTIPLICITY]); + // apply hadamard transform + expandedCodeword transform; + hadamard(&expanded, &transform); + // fix the first entry to get the half Hadamard transform + transform[0] -= 64 * MULTIPLICITY; + // finish the decoding + message_array[i] = find_peaks(&transform); + } +} diff --git a/crypto_kem/hqc-rmrs-256/clean/reed_muller.h b/crypto_kem/hqc-rmrs-256/clean/reed_muller.h new file mode 100644 index 00000000..1f201e91 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/reed_muller.h @@ -0,0 +1,20 @@ +#ifndef REED_MULLER_H +#define REED_MULLER_H + + +/** + * @file reed_muller.h + * Header file of reed_muller.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS256_CLEAN_reed_muller_encode(uint64_t *cdw, const uint64_t *msg); + +void PQCLEAN_HQCRMRS256_CLEAN_reed_muller_decode(uint64_t *msg, const uint64_t *cdw); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/clean/reed_solomon.c b/crypto_kem/hqc-rmrs-256/clean/reed_solomon.c new file mode 100644 index 00000000..7022698f --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/reed_solomon.c @@ -0,0 +1,340 @@ +#include "fft.h" +#include "gf.h" +#include "parameters.h" +#include "reed_solomon.h" +#include +#include +#include +/** + * @file reed_solomon.c + * Constant time implementation of Reed-Solomon codes + */ + + +static void compute_syndromes(uint16_t *syndromes, uint8_t *cdw); +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes); +static void compute_roots(uint8_t *error, uint16_t *sigma); +static void compute_z_poly(uint16_t *z, const uint16_t *sigma, uint8_t degree, const uint16_t *syndromes); +static void compute_error_values(uint16_t *error_values, const uint16_t *z, const uint8_t *error); +static void correct_errors(uint8_t *cdw, const uint16_t *error_values); + +static const uint16_t alpha_ij_pow [46][77] = {{2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60}, {4, 16, 64, 29, 116, 205, 19, 76, 45, 180, 234, 143, 6, 24, 96, 157, 78, 37, 148, 106, 181, 238, 159, 70, 5, 20, 80, 93, 105, 185, 222, 95, 97, 153, 94, 101, 137, 30, 120, 253, 211, 107, 177, 254, 223, 91, 113, 217, 67, 17, 68, 13, 52, 208, 103, 129, 62, 248, 199, 59, 236, 151, 102, 133, 46, 184, 218, 79, 33, 132, 42, 168, 154, 82, 85, 73, 57}, {8, 64, 58, 205, 38, 45, 117, 143, 12, 96, 39, 37, 53, 181, 193, 70, 10, 80, 186, 185, 161, 97, 47, 101, 15, 120, 231, 107, 127, 223, 182, 217, 134, 68, 26, 208, 206, 62, 237, 59, 197, 102, 23, 184, 169, 33, 21, 168, 41, 85, 146, 228, 115, 191, 145, 252, 179, 241, 219, 150, 196, 110, 87, 130, 100, 7, 56, 221, 166, 89, 242, 195, 86, 138, 36, 61, 245}, {16, 29, 205, 76, 180, 143, 24, 157, 37, 106, 238, 70, 20, 93, 185, 95, 153, 101, 30, 253, 107, 254, 91, 217, 17, 13, 208, 129, 248, 59, 151, 133, 184, 79, 132, 168, 82, 73, 228, 230, 198, 252, 123, 227, 150, 149, 165, 130, 200, 28, 221, 81, 121, 195, 172, 18, 61, 247, 203, 44, 250, 27, 173, 2, 32, 58, 135, 152, 117, 3, 48, 39, 74, 212, 193, 140, 40}, {32, 116, 38, 180, 3, 96, 156, 106, 193, 5, 160, 185, 190, 94, 15, 253, 214, 223, 226, 17, 26, 103, 124, 59, 51, 46, 169, 132, 77, 85, 114, 230, 145, 215, 255, 150, 55, 174, 100, 28, 167, 89, 239, 172, 36, 244, 235, 44, 233, 108, 1, 32, 116, 38, 180, 3, 96, 156, 106, 193, 5, 160, 185, 190, 94, 15, 253, 214, 223, 226, 17, 26, 103, 124, 59, 51, 46}, {64, 205, 45, 143, 96, 37, 181, 70, 80, 185, 97, 101, 120, 107, 223, 217, 68, 208, 62, 59, 102, 184, 33, 168, 85, 228, 191, 252, 241, 150, 110, 130, 7, 221, 89, 195, 138, 61, 251, 44, 207, 173, 8, 58, 38, 117, 12, 39, 53, 193, 10, 186, 161, 47, 15, 231, 127, 182, 134, 26, 206, 237, 197, 23, 169, 21, 41, 146, 115, 145, 179, 219, 196, 87, 100, 56, 166}, {128, 19, 117, 24, 156, 181, 140, 93, 161, 94, 60, 107, 163, 67, 26, 129, 147, 102, 109, 132, 41, 57, 209, 252, 255, 98, 87, 200, 224, 89, 155, 18, 245, 11, 233, 173, 16, 232, 45, 3, 157, 53, 159, 40, 185, 194, 137, 231, 254, 226, 68, 189, 248, 197, 46, 158, 168, 170, 183, 145, 123, 75, 110, 25, 28, 166, 249, 69, 61, 235, 176, 54, 2, 29, 38, 234, 48}, {29, 76, 143, 157, 106, 70, 93, 95, 101, 253, 254, 217, 13, 129, 59, 133, 79, 168, 73, 230, 252, 227, 149, 130, 28, 81, 195, 18, 247, 44, 27, 2, 58, 152, 3, 39, 212, 140, 186, 190, 202, 231, 225, 175, 26, 31, 118, 23, 158, 77, 146, 209, 229, 219, 55, 25, 56, 162, 155, 36, 243, 88, 54, 4, 116, 45, 6, 78, 181, 5, 105, 97, 137, 211, 223, 67, 52}, {58, 45, 12, 37, 193, 80, 161, 101, 231, 223, 134, 208, 237, 102, 169, 168, 146, 191, 179, 150, 87, 7, 166, 195, 36, 251, 125, 173, 64, 38, 143, 39, 181, 10, 185, 47, 120, 127, 217, 26, 62, 197, 184, 21, 85, 115, 252, 219, 110, 100, 221, 242, 138, 245, 44, 54, 8, 205, 117, 96, 53, 70, 186, 97, 15, 107, 182, 68, 206, 59, 23, 33, 41, 228, 145, 241, 196}, {116, 180, 96, 106, 5, 185, 94, 253, 223, 17, 103, 59, 46, 132, 85, 230, 215, 150, 174, 28, 89, 172, 244, 44, 108, 32, 38, 3, 156, 193, 160, 190, 15, 214, 226, 26, 124, 51, 169, 77, 114, 145, 255, 55, 100, 167, 239, 36, 235, 233, 1, 116, 180, 96, 106, 5, 185, 94, 253, 223, 17, 103, 59, 46, 132, 85, 230, 215, 150, 174, 28, 89, 172, 244, 44, 108, 32}, {232, 234, 39, 238, 160, 97, 60, 254, 134, 103, 118, 184, 84, 57, 145, 227, 220, 7, 162, 172, 245, 176, 71, 58, 180, 192, 181, 40, 95, 15, 177, 175, 208, 147, 46, 21, 73, 99, 241, 55, 200, 166, 43, 122, 44, 216, 128, 45, 48, 106, 10, 222, 202, 107, 226, 52, 237, 133, 66, 85, 209, 123, 196, 50, 167, 195, 144, 11, 54, 32, 76, 12, 148, 140, 185, 188, 211}, {205, 143, 37, 70, 185, 101, 107, 217, 208, 59, 184, 168, 228, 252, 150, 130, 221, 195, 61, 44, 173, 58, 117, 39, 193, 186, 47, 231, 182, 26, 237, 23, 21, 146, 145, 219, 87, 56, 242, 36, 139, 54, 64, 45, 96, 181, 80, 97, 120, 223, 68, 62, 102, 33, 85, 191, 241, 110, 7, 89, 138, 251, 207, 8, 38, 12, 53, 10, 161, 15, 127, 134, 206, 197, 169, 41, 115}, {135, 6, 53, 20, 190, 120, 163, 13, 237, 46, 84, 228, 229, 98, 100, 81, 69, 251, 131, 32, 45, 192, 238, 186, 94, 187, 217, 189, 236, 169, 82, 209, 241, 220, 28, 242, 72, 22, 173, 116, 201, 37, 140, 222, 15, 254, 34, 62, 204, 132, 146, 63, 75, 130, 167, 43, 245, 250, 4, 38, 24, 212, 80, 194, 253, 182, 52, 147, 184, 77, 183, 179, 149, 141, 89, 9, 203}, {19, 24, 181, 93, 94, 107, 67, 129, 102, 132, 57, 252, 98, 200, 89, 18, 11, 173, 232, 3, 53, 40, 194, 231, 226, 189, 197, 158, 170, 145, 75, 25, 166, 69, 235, 54, 29, 234, 37, 5, 95, 120, 91, 52, 59, 218, 82, 191, 227, 174, 221, 43, 247, 207, 32, 90, 39, 35, 111, 15, 225, 136, 237, 92, 77, 115, 246, 220, 56, 239, 122, 125, 4, 76, 96, 238, 105}, {38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169, 85, 145, 150, 100, 89, 36, 44, 1, 38, 96, 193, 185, 15, 223, 26, 59, 169}, {76, 157, 70, 95, 253, 217, 129, 133, 168, 230, 227, 130, 81, 18, 44, 2, 152, 39, 140, 190, 231, 175, 31, 23, 77, 209, 219, 25, 162, 36, 88, 4, 45, 78, 5, 97, 211, 67, 62, 46, 154, 191, 171, 50, 89, 72, 176, 8, 90, 156, 10, 194, 187, 134, 124, 92, 41, 99, 75, 100, 178, 144, 125, 16, 180, 37, 20, 153, 107, 17, 248, 184, 82, 198, 150, 200, 121}, {152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78, 10, 153, 214, 68, 147, 79, 146, 215, 220, 221, 69, 11, 1, 152, 78}, {45, 37, 80, 101, 223, 208, 102, 168, 191, 150, 7, 195, 251, 173, 38, 39, 10, 47, 127, 26, 197, 21, 115, 219, 100, 242, 245, 54, 205, 96, 70, 97, 107, 68, 59, 33, 228, 241, 130, 89, 61, 207, 58, 12, 193, 161, 231, 134, 237, 169, 146, 179, 87, 166, 36, 125, 64, 143, 181, 185, 120, 217, 62, 184, 85, 252, 110, 221, 138, 44, 8, 117, 53, 186, 15, 182, 206}, {90, 148, 186, 30, 226, 62, 109, 73, 179, 174, 162, 61, 131, 232, 96, 140, 153, 127, 52, 51, 168, 99, 98, 56, 172, 22, 8, 234, 212, 185, 240, 67, 237, 79, 114, 241, 25, 121, 245, 108, 19, 39, 20, 188, 223, 189, 133, 41, 63, 55, 221, 9, 176, 64, 3, 238, 161, 211, 34, 59, 66, 183, 219, 200, 239, 251, 71, 152, 37, 160, 137, 182, 129, 92, 85, 229, 165}, {180, 106, 185, 253, 17, 59, 132, 230, 150, 28, 172, 44, 32, 3, 193, 190, 214, 26, 51, 77, 145, 55, 167, 36, 233, 116, 96, 5, 94, 223, 103, 46, 85, 215, 174, 89, 244, 108, 38, 156, 160, 15, 226, 124, 169, 114, 255, 100, 239, 235, 1, 180, 106, 185, 253, 17, 59, 132, 230, 150, 28, 172, 44, 32, 3, 193, 190, 214, 26, 51, 77, 145, 55, 167, 36, 233, 116}, {117, 181, 161, 107, 26, 102, 41, 252, 87, 89, 245, 173, 45, 53, 185, 231, 68, 197, 168, 145, 110, 166, 61, 54, 38, 37, 186, 120, 134, 59, 21, 191, 196, 221, 36, 207, 205, 39, 80, 15, 217, 237, 33, 115, 150, 56, 138, 125, 58, 96, 10, 101, 182, 62, 169, 228, 219, 7, 86, 44, 64, 12, 70, 47, 223, 206, 184, 146, 241, 100, 195, 139, 8, 143, 193, 97, 127}, {234, 238, 97, 254, 103, 184, 57, 227, 7, 172, 176, 58, 192, 40, 15, 175, 147, 21, 99, 55, 166, 122, 216, 45, 106, 222, 107, 52, 133, 85, 123, 50, 195, 11, 32, 12, 140, 188, 182, 124, 158, 115, 49, 224, 36, 131, 19, 37, 105, 253, 68, 151, 154, 252, 174, 121, 251, 2, 201, 193, 194, 225, 206, 109, 114, 219, 14, 69, 125, 116, 157, 80, 30, 67, 59, 42, 198}, {201, 159, 47, 91, 124, 33, 209, 149, 166, 244, 71, 117, 238, 194, 223, 31, 79, 115, 98, 167, 61, 216, 90, 181, 190, 254, 206, 218, 213, 150, 224, 72, 54, 152, 106, 161, 177, 189, 184, 114, 171, 56, 18, 131, 38, 148, 111, 107, 104, 46, 146, 227, 14, 138, 233, 135, 37, 210, 211, 26, 133, 170, 241, 141, 172, 125, 232, 78, 186, 253, 136, 102, 164, 123, 100, 43, 88}, {143, 70, 101, 217, 59, 168, 252, 130, 195, 44, 58, 39, 186, 231, 26, 23, 146, 219, 56, 36, 54, 45, 181, 97, 223, 62, 33, 191, 110, 89, 251, 8, 12, 10, 15, 134, 197, 41, 179, 100, 86, 125, 205, 37, 185, 107, 208, 184, 228, 150, 221, 61, 173, 117, 193, 47, 182, 237, 21, 145, 87, 242, 139, 64, 96, 80, 120, 68, 102, 85, 241, 7, 138, 207, 38, 53, 161}, {3, 5, 15, 17, 51, 85, 255, 28, 36, 108, 180, 193, 94, 226, 59, 77, 215, 100, 172, 233, 38, 106, 190, 223, 124, 132, 145, 174, 239, 44, 116, 156, 185, 214, 103, 169, 230, 55, 89, 235, 32, 96, 160, 253, 26, 46, 114, 150, 167, 244, 1, 3, 5, 15, 17, 51, 85, 255, 28, 36, 108, 180, 193, 94, 226, 59, 77, 215, 100, 172, 233, 38, 106, 190, 223, 124, 132}, {6, 20, 120, 13, 46, 228, 98, 81, 251, 32, 192, 186, 187, 189, 169, 209, 220, 242, 22, 116, 37, 222, 254, 62, 132, 63, 130, 43, 250, 38, 212, 194, 182, 147, 77, 179, 141, 9, 54, 180, 159, 101, 67, 151, 85, 227, 112, 61, 142, 3, 10, 60, 136, 23, 114, 49, 166, 243, 16, 96, 93, 211, 208, 218, 230, 110, 121, 11, 58, 156, 111, 127, 31, 66, 145, 65, 155}, {12, 80, 231, 208, 169, 191, 87, 195, 125, 38, 181, 47, 217, 197, 85, 219, 221, 245, 8, 96, 186, 107, 206, 33, 145, 130, 86, 207, 45, 193, 101, 134, 102, 146, 150, 166, 251, 64, 39, 185, 127, 62, 21, 252, 100, 138, 54, 117, 70, 15, 68, 23, 228, 196, 89, 139, 58, 37, 161, 223, 237, 168, 179, 7, 36, 173, 143, 10, 120, 26, 184, 115, 110, 242, 44, 205, 53}, {24, 93, 107, 129, 132, 252, 200, 18, 173, 3, 40, 231, 189, 158, 145, 25, 69, 54, 234, 5, 120, 52, 218, 191, 174, 43, 207, 90, 35, 15, 136, 92, 115, 220, 239, 125, 76, 238, 101, 17, 133, 228, 149, 121, 44, 135, 212, 47, 175, 51, 146, 49, 162, 139, 116, 148, 97, 113, 236, 85, 171, 83, 251, 128, 156, 161, 163, 147, 41, 255, 224, 245, 16, 157, 185, 254, 248}, {48, 105, 127, 248, 77, 241, 224, 247, 64, 156, 95, 182, 236, 170, 150, 162, 11, 205, 212, 94, 134, 133, 213, 110, 239, 250, 45, 35, 30, 26, 218, 99, 130, 69, 108, 143, 40, 211, 206, 132, 229, 7, 144, 2, 96, 210, 254, 237, 154, 255, 221, 243, 128, 37, 190, 113, 197, 73, 49, 89, 22, 135, 181, 188, 17, 23, 183, 220, 195, 233, 90, 70, 60, 52, 169, 198, 25}, {96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38, 193, 15, 26, 169, 145, 100, 36, 1, 96, 185, 223, 59, 85, 150, 89, 44, 38}, {192, 222, 182, 151, 114, 110, 155, 27, 143, 160, 177, 237, 82, 75, 89, 88, 152, 70, 240, 103, 21, 123, 224, 251, 116, 212, 101, 136, 218, 145, 200, 144, 8, 78, 190, 217, 204, 183, 87, 172, 216, 12, 105, 225, 59, 170, 98, 242, 250, 180, 10, 211, 31, 168, 255, 83, 139, 135, 238, 15, 52, 158, 252, 14, 244, 64, 74, 153, 134, 46, 209, 130, 9, 142, 96, 111, 91}, {157, 95, 217, 133, 230, 130, 18, 2, 39, 190, 175, 23, 209, 25, 36, 4, 78, 97, 67, 46, 191, 50, 72, 8, 156, 194, 134, 92, 99, 100, 144, 16, 37, 153, 17, 184, 198, 200, 61, 32, 74, 47, 34, 109, 145, 141, 122, 64, 148, 94, 68, 218, 63, 7, 244, 128, 53, 188, 136, 169, 126, 14, 245, 29, 106, 101, 13, 79, 252, 28, 247, 58, 212, 202, 26, 158, 229}, {39, 97, 134, 184, 145, 7, 245, 58, 181, 15, 208, 21, 241, 166, 44, 45, 10, 107, 237, 85, 196, 195, 54, 12, 185, 182, 102, 115, 130, 36, 8, 37, 47, 68, 169, 252, 56, 251, 205, 193, 120, 206, 168, 219, 89, 125, 117, 80, 127, 59, 146, 110, 86, 173, 96, 161, 217, 23, 191, 100, 61, 64, 53, 101, 26, 33, 179, 221, 139, 38, 70, 231, 62, 41, 150, 242, 207}, {78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153, 68, 79, 215, 221, 11, 152, 10, 214, 147, 146, 220, 69, 1, 78, 153}, {156, 94, 26, 132, 255, 89, 233, 3, 185, 226, 46, 145, 28, 235, 38, 5, 214, 59, 114, 174, 36, 32, 106, 15, 103, 77, 150, 239, 108, 96, 190, 17, 169, 215, 167, 44, 180, 160, 223, 51, 230, 100, 244, 116, 193, 253, 124, 85, 55, 172, 1, 156, 94, 26, 132, 255, 89, 233, 3, 185, 226, 46, 145, 28, 235, 38, 5, 214, 59, 114, 174, 36, 32, 106, 15, 103, 77}, {37, 101, 208, 168, 150, 195, 173, 39, 47, 26, 21, 219, 242, 54, 96, 97, 68, 33, 241, 89, 207, 12, 161, 134, 169, 179, 166, 125, 143, 185, 217, 184, 252, 221, 44, 117, 186, 182, 23, 145, 56, 139, 45, 80, 223, 102, 191, 7, 251, 38, 10, 127, 197, 115, 100, 245, 205, 70, 107, 59, 228, 130, 61, 58, 193, 231, 237, 146, 87, 36, 64, 181, 120, 62, 85, 110, 138}, {74, 137, 206, 82, 55, 138, 16, 212, 120, 124, 73, 87, 72, 29, 193, 211, 147, 228, 25, 244, 205, 140, 177, 197, 230, 141, 251, 76, 40, 223, 204, 198, 56, 11, 180, 186, 113, 92, 252, 167, 176, 143, 111, 67, 169, 123, 162, 207, 24, 190, 68, 66, 227, 242, 108, 157, 47, 52, 84, 150, 155, 142, 37, 202, 103, 41, 149, 69, 8, 106, 60, 62, 170, 165, 36, 128, 238}, {148, 30, 62, 73, 174, 61, 232, 140, 127, 51, 99, 56, 22, 234, 185, 67, 79, 241, 121, 108, 39, 188, 189, 41, 55, 9, 64, 238, 211, 59, 183, 200, 251, 152, 160, 182, 92, 229, 166, 233, 24, 97, 13, 42, 150, 43, 2, 53, 60, 124, 146, 65, 122, 205, 5, 254, 102, 198, 112, 44, 201, 111, 134, 158, 255, 242, 216, 78, 101, 103, 82, 110, 18, 128, 193, 187, 118}, {53, 120, 237, 228, 100, 251, 45, 186, 217, 169, 241, 242, 173, 37, 15, 62, 146, 130, 245, 38, 80, 182, 184, 179, 89, 54, 39, 101, 206, 85, 87, 61, 205, 10, 223, 23, 252, 166, 207, 96, 47, 208, 41, 110, 36, 58, 70, 127, 102, 145, 221, 125, 12, 97, 26, 168, 196, 138, 64, 193, 107, 197, 191, 56, 44, 143, 161, 68, 21, 150, 86, 8, 181, 231, 59, 115, 7}, {106, 253, 59, 230, 28, 44, 3, 190, 26, 77, 55, 36, 116, 5, 223, 46, 215, 89, 108, 156, 15, 124, 114, 100, 235, 180, 185, 17, 132, 150, 172, 32, 193, 214, 51, 145, 167, 233, 96, 94, 103, 85, 174, 244, 38, 160, 226, 169, 255, 239, 1, 106, 253, 59, 230, 28, 44, 3, 190, 26, 77, 55, 36, 116, 5, 223, 46, 215, 89, 108, 156, 15, 124, 114, 100, 235, 180}, {212, 211, 197, 198, 167, 207, 157, 202, 62, 114, 200, 139, 201, 95, 26, 154, 220, 61, 19, 160, 217, 158, 171, 86, 32, 159, 127, 133, 229, 89, 216, 74, 120, 147, 230, 56, 176, 24, 47, 103, 170, 130, 243, 90, 185, 34, 42, 196, 18, 116, 10, 91, 109, 241, 239, 2, 181, 187, 151, 145, 83, 131, 39, 137, 124, 228, 141, 11, 143, 190, 52, 41, 165, 122, 38, 93, 175}, {181, 107, 102, 252, 89, 173, 53, 231, 197, 145, 166, 54, 37, 120, 59, 191, 221, 207, 39, 15, 237, 115, 56, 125, 96, 101, 62, 228, 7, 44, 12, 47, 206, 146, 100, 139, 143, 97, 208, 85, 130, 251, 117, 161, 26, 41, 87, 245, 45, 185, 68, 168, 110, 61, 38, 186, 134, 21, 196, 36, 205, 80, 217, 33, 150, 138, 58, 10, 182, 169, 219, 86, 64, 70, 223, 184, 241}, {119, 177, 23, 123, 239, 8, 159, 225, 184, 255, 43, 64, 140, 91, 169, 171, 69, 58, 20, 226, 33, 49, 18, 205, 160, 67, 21, 149, 144, 38, 105, 34, 168, 220, 244, 45, 111, 13, 41, 174, 243, 117, 95, 104, 85, 25, 203, 143, 194, 103, 146, 200, 22, 12, 94, 31, 228, 14, 176, 96, 202, 248, 115, 112, 233, 39, 30, 147, 191, 167, 27, 37, 240, 236, 145, 81, 216}, {238, 254, 184, 227, 172, 58, 40, 175, 21, 55, 122, 45, 222, 52, 85, 50, 11, 12, 188, 124, 115, 224, 131, 37, 253, 151, 252, 121, 2, 193, 225, 109, 219, 69, 116, 80, 67, 42, 110, 244, 90, 161, 104, 170, 100, 22, 24, 101, 248, 230, 221, 27, 74, 231, 51, 229, 242, 4, 159, 223, 218, 171, 138, 232, 160, 134, 84, 220, 245, 180, 95, 208, 73, 200, 44, 48, 202}, {193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85, 100, 44, 96, 15, 59, 145, 89, 1, 193, 223, 169, 150, 36, 38, 185, 26, 85}, {159, 91, 33, 149, 244, 117, 194, 31, 115, 167, 216, 181, 254, 218, 150, 72, 152, 161, 189, 114, 56, 131, 148, 107, 46, 227, 138, 135, 210, 26, 170, 141, 125, 78, 253, 102, 123, 43, 58, 160, 34, 41, 25, 22, 96, 30, 236, 252, 249, 32, 10, 175, 84, 87, 235, 6, 101, 199, 198, 89, 2, 35, 182, 66, 55, 245, 234, 153, 62, 230, 83, 173, 119, 225, 169, 49, 144}}; + + + +/** + * @brief Encodes a message message of PARAM_K bits to a Reed-Solomon codeword codeword of PARAM_N1 bytes + * + * Following @cite lin1983error (Chapter 4 - Cyclic Codes), + * We perform a systematic encoding using a linear (PARAM_N1 - PARAM_K)-stage shift register + * with feedback connections based on the generator polynomial PARAM_RS_POLY of the Reed-Solomon code. + * + * @param[out] cdw Array of size VEC_N1_SIZE_64 receiving the encoded message + * @param[in] msg Array of size VEC_K_SIZE_64 storing the message + */ +void PQCLEAN_HQCRMRS256_CLEAN_reed_solomon_encode(uint64_t *cdw, const uint64_t *msg) { + uint8_t gate_value = 0; + + uint16_t tmp[PARAM_G] = {0}; + uint16_t PARAM_RS_POLY [] = {RS_POLY_COEFS}; + + uint8_t msg_bytes[PARAM_K] = {0}; + uint8_t cdw_bytes[PARAM_N1] = {0}; + + for (size_t i = 0 ; i < VEC_K_SIZE_64 ; ++i) { + for (size_t j = 0 ; j < 8 ; ++j) { + msg_bytes[i * 8 + j] = (uint8_t) (msg[i] >> (j * 8)); + } + } + + for (int i = PARAM_K - 1 ; i >= 0 ; --i) { + gate_value = msg_bytes[i] ^ cdw_bytes[PARAM_N1 - PARAM_K - 1]; + + for (size_t j = 0 ; j < PARAM_G ; ++j) { + tmp[j] = PQCLEAN_HQCRMRS256_CLEAN_gf_mul(gate_value, PARAM_RS_POLY[j]); + } + + for (size_t k = PARAM_N1 - PARAM_K - 1 ; k ; --k) { + cdw_bytes[k] = cdw_bytes[k - 1] ^ tmp[k]; + } + + cdw_bytes[0] = tmp[0]; + } + + memcpy(cdw_bytes + PARAM_N1 - PARAM_K, msg_bytes, PARAM_K); + memcpy(cdw, cdw_bytes, PARAM_N1); +} + + + +/** + * @brief Computes 2 * PARAM_DELTA syndromes + * + * @param[out] syndromes Array of size 2 * PARAM_DELTA receiving the computed syndromes + * @param[in] cdw Array of size PARAM_N1 storing the received vector + */ +void compute_syndromes(uint16_t *syndromes, uint8_t *cdw) { + for (size_t i = 0 ; i < 2 * PARAM_DELTA ; ++i) { + for (size_t j = 1 ; j < PARAM_N1 ; ++j) { + syndromes[i] ^= PQCLEAN_HQCRMRS256_CLEAN_gf_mul(cdw[j], alpha_ij_pow[i][j - 1]); + } + syndromes[i] ^= cdw[0]; + } +} + + + +/** + * @brief Computes the error locator polynomial (ELP) sigma + * + * This is a constant time implementation of Berlekamp's simplified algorithm (see @cite lin1983error (Chapter 6 - BCH Codes).
+ * We use the letter p for rho which is initialized at -1.
+ * The array X_sigma_p represents the polynomial X^(mu-rho)*sigma_p(X).
+ * Instead of maintaining a list of sigmas, we update in place both sigma and X_sigma_p.
+ * sigma_copy serves as a temporary save of sigma in case X_sigma_p needs to be updated.
+ * We can properly correct only if the degree of sigma does not exceed PARAM_DELTA. + * This means only the first PARAM_DELTA + 1 coefficients of sigma are of value + * and we only need to save its first PARAM_DELTA - 1 coefficients. + * + * @returns the degree of the ELP sigma + * @param[out] sigma Array of size (at least) PARAM_DELTA receiving the ELP + * @param[in] syndromes Array of size (at least) 2*PARAM_DELTA storing the syndromes + */ +static size_t compute_elp(uint16_t *sigma, const uint16_t *syndromes) { + sigma[0] = 1; + size_t deg_sigma = 0; + size_t deg_sigma_p = 0; + uint16_t sigma_copy[PARAM_DELTA + 1] = {0}; + size_t deg_sigma_copy = 0; + uint16_t X_sigma_p[PARAM_DELTA + 1] = {0, 1}; + int32_t pp = -1; // 2*rho + uint16_t d_p = 1; + uint16_t d = syndromes[0]; + + for (size_t mu = 0 ; (mu < (2 * PARAM_DELTA)) ; ++mu) { + // Save sigma in case we need it to update X_sigma_p + memcpy(sigma_copy, sigma, 2 * (PARAM_DELTA)); + deg_sigma_copy = deg_sigma; + + uint16_t dd = PQCLEAN_HQCRMRS256_CLEAN_gf_mul(d, PQCLEAN_HQCRMRS256_CLEAN_gf_inverse(d_p)); + + for (size_t i = 1 ; (i <= mu + 1) && (i <= PARAM_DELTA) ; ++i) { + sigma[i] ^= PQCLEAN_HQCRMRS256_CLEAN_gf_mul(dd, X_sigma_p[i]); + } + + size_t deg_X = mu - pp; + size_t deg_X_sigma_p = deg_X + deg_sigma_p; + + // mask1 = 0xffff if(d != 0) and 0 otherwise + int16_t mask1 = -((uint16_t) - d >> 15); + + // mask2 = 0xffff if(deg_X_sigma_p > deg_sigma) and 0 otherwise + int16_t mask2 = -((uint16_t) (deg_sigma - deg_X_sigma_p) >> 15); + + // mask12 = 0xffff if the deg_sigma increased and 0 otherwise + int16_t mask12 = mask1 & mask2; + deg_sigma = (mask12 & deg_X_sigma_p) ^ (~mask12 & deg_sigma); + + if (mu == (2 * PARAM_DELTA - 1)) { + break; + } + + pp = (mask12 & mu) ^ (~mask12 & pp); + d_p = (mask12 & d) ^ (~mask12 & d_p); + for (size_t i = PARAM_DELTA ; i ; --i) { + X_sigma_p[i] = (mask12 & sigma_copy[i - 1]) ^ (~mask12 & X_sigma_p[i - 1]); + } + + deg_sigma_p = (mask12 & deg_sigma_copy) ^ (~mask12 & deg_sigma_p); + d = syndromes[mu + 1]; + + for (size_t i = 1 ; (i <= mu + 1) && (i <= PARAM_DELTA) ; ++i) { + d ^= PQCLEAN_HQCRMRS256_CLEAN_gf_mul(sigma[i], syndromes[mu + 1 - i]); + } + } + + return deg_sigma; +} + + + +/** + * @brief Computes the error polynomial error from the error locator polynomial sigma + * + * See function PQCLEAN_HQCRMRS256_CLEAN_fft for more details. + * + * @param[out] error Array of 2^PARAM_M elements receiving the error polynomial + * @param[out] error_compact Array of PARAM_DELTA + PARAM_N1 elements receiving a compact representation of the vector error + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + */ +static void compute_roots(uint8_t *error, uint16_t *sigma) { + uint16_t w[1 << PARAM_M] = {0}; + + PQCLEAN_HQCRMRS256_CLEAN_fft(w, sigma, PARAM_DELTA + 1); + PQCLEAN_HQCRMRS256_CLEAN_fft_retrieve_error_poly(error, w); +} + + + +/** + * @brief Computes the polynomial z(x) + * + * See @cite lin1983error (Chapter 6 - BCH Codes) for more details. + * + * @param[out] z Array of PARAM_DELTA + 1 elements receiving the polynomial z(x) + * @param[in] sigma Array of 2^PARAM_FFT elements storing the error locator polynomial + * @param[in] degree Integer that is the degree of polynomial sigma + * @param[in] syndromes Array of 2 * PARAM_DELTA storing the syndromes + */ +static void compute_z_poly(uint16_t *z, const uint16_t *sigma, uint8_t degree, const uint16_t *syndromes) { + z[0] = 1; + + for (size_t i = 1 ; i < PARAM_DELTA + 1 ; ++i) { + int16_t mask2 = -((uint16_t) (i - degree - 1) >> 15); + z[i] = ((uint16_t)mask2) & sigma[i]; + } + + z[1] ^= syndromes[0]; + + for (size_t i = 2 ; i <= PARAM_DELTA ; ++i) { + int16_t mask2 = -((uint16_t) (i - degree - 1) >> 15); + z[i] ^= ((uint16_t)mask2 & syndromes[i - 1]); + + for (size_t j = 1 ; j < i ; ++j) { + z[i] ^= ((uint16_t)mask2) & PQCLEAN_HQCRMRS256_CLEAN_gf_mul(sigma[j], syndromes[i - j - 1]); + } + } +} + + + +/** + * @brief Computes the error values + * + * See @cite lin1983error (Chapter 6 - BCH Codes) for more details. + * + * @param[out] error_values Array of PARAM_DELTA elements receiving the error values + * @param[in] z Array of PARAM_DELTA + 1 elements storing the polynomial z(x) + * @param[in] z_degree Integer that is the degree of polynomial z(x) + * @param[in] error_compact Array of PARAM_DELTA + PARAM_N1 storing compact representation of the error + */ +static void compute_error_values(uint16_t *error_values, const uint16_t *z, const uint8_t *error) { + uint16_t beta_j[PARAM_DELTA] = {0}; + uint16_t e_j[PARAM_DELTA] = {0}; + + uint16_t delta_counter = 0; + uint16_t delta_real_value; + + // Compute the beta_{j_i} page 31 of the documentation + for (size_t i = 0 ; i < PARAM_N1 ; i++) { + uint16_t found = 0; + int16_t valuemask = ((int16_t) - (error[i] != 0)) >> 15; + for (size_t j = 0 ; j < PARAM_DELTA ; j++) { + int16_t indexmask = ((int16_t) - (j == delta_counter)) >> 15; + beta_j[j] += indexmask & valuemask & exp[i]; + found += indexmask & valuemask & 1; + } + delta_counter += found; + } + delta_real_value = delta_counter; + + // Compute the e_{j_i} page 31 of the documentation + for (size_t i = 0 ; i < PARAM_DELTA ; ++i) { + uint16_t tmp1 = 1; + uint16_t tmp2 = 1; + uint16_t inverse = PQCLEAN_HQCRMRS256_CLEAN_gf_inverse(beta_j[i]); + uint16_t inverse_power_j = 1; + + for (size_t j = 1 ; j <= PARAM_DELTA ; ++j) { + inverse_power_j = PQCLEAN_HQCRMRS256_CLEAN_gf_mul(inverse_power_j, inverse); + tmp1 ^= PQCLEAN_HQCRMRS256_CLEAN_gf_mul(inverse_power_j, z[j]); + } + for (size_t k = 1 ; k < PARAM_DELTA ; ++k) { + tmp2 = PQCLEAN_HQCRMRS256_CLEAN_gf_mul(tmp2, (1 ^ PQCLEAN_HQCRMRS256_CLEAN_gf_mul(inverse, beta_j[(i + k) % PARAM_DELTA]))); + } + int16_t mask = ((int16_t) - (i < delta_real_value)) >> 15; + e_j[i] = mask & PQCLEAN_HQCRMRS256_CLEAN_gf_mul(tmp1, PQCLEAN_HQCRMRS256_CLEAN_gf_inverse(tmp2)); + } + + // Place the delta e_{j_i} values at the right coordinates of the output vector + delta_counter = 0; + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + uint16_t found = 0; + int16_t valuemask = ((int16_t) - (error[i] != 0)) >> 15; + for (size_t j = 0 ; j < PARAM_DELTA ; j++) { + int16_t indexmask = ((int16_t) - (j == delta_counter)) >> 15; + error_values[i] += indexmask & valuemask & e_j[j]; + found += indexmask & valuemask & 1; + } + delta_counter += found; + } +} + + + +/** + * @brief Correct the errors + * + * @param[out] cdw Array of PARAM_N1 elements receiving the corrected vector + * @param[in] error Array of the error vector + * @param[in] error_values Array of PARAM_DELTA elements storing the error values + */ +static void correct_errors(uint8_t *cdw, const uint16_t *error_values) { + for (size_t i = 0 ; i < PARAM_N1 ; ++i) { + cdw[i] ^= error_values[i]; + } +} + + + +/** + * @brief Decodes the received word + * + * This function relies on six steps: + *
    + *
  1. The first step, is the computation of the 2*PARAM_DELTA syndromes. + *
  2. The second step is the computation of the error-locator polynomial sigma. + *
  3. The third step, done by additive FFT, is finding the error-locator numbers by calculating the roots of the polynomial sigma and takings their inverses. + *
  4. The fourth step, is the polynomial z(x). + *
  5. The fifth step, is the computation of the error values. + *
  6. The sixth step is the correction of the errors in the received polynomial. + *
+ * For a more complete picture on Reed-Solomon decoding, see Shu. Lin and Daniel J. Costello in Error Control Coding: Fundamentals and Applications @cite lin1983error + * + * @param[out] msg Array of size VEC_K_SIZE_64 receiving the decoded message + * @param[in] cdw Array of size VEC_N1_SIZE_64 storing the received word + */ +void PQCLEAN_HQCRMRS256_CLEAN_reed_solomon_decode(uint64_t *msg, uint64_t *cdw) { + uint8_t cdw_bytes[PARAM_N1] = {0}; + uint16_t syndromes[2 * PARAM_DELTA] = {0}; + uint16_t sigma[1 << PARAM_FFT] = {0}; + uint8_t error[1 << PARAM_M] = {0}; + uint16_t z[PARAM_N1] = {0}; + uint16_t error_values[PARAM_N1] = {0}; + + // Copy the vector in an array of bytes + memcpy(cdw_bytes, cdw, PARAM_N1); + + // Calculate the 2*PARAM_DELTA syndromes + compute_syndromes(syndromes, cdw_bytes); + + // Compute the error locator polynomial sigma + // Sigma's degree is at most PARAM_DELTA but the FFT requires the extra room + size_t deg = compute_elp(sigma, syndromes); + + // Compute the error polynomial error + compute_roots(error, sigma); + + // Compute the polynomial z(x) + compute_z_poly(z, sigma, deg, syndromes); + + // Compute the error values + compute_error_values(error_values, z, error); + + // Correct the errors + correct_errors(cdw_bytes, error_values); + + // Retrieve the message from the decoded codeword + memcpy(msg, cdw_bytes + (PARAM_G - 1), PARAM_K); + +} diff --git a/crypto_kem/hqc-rmrs-256/clean/reed_solomon.h b/crypto_kem/hqc-rmrs-256/clean/reed_solomon.h new file mode 100644 index 00000000..cb18b843 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/reed_solomon.h @@ -0,0 +1,20 @@ +#ifndef REED_SOLOMON_H +#define REED_SOLOMON_H + + +/** + * @file reed_solomon.h + * Header file of reed_solomon.c + */ + +#include "parameters.h" +#include "parameters.h" +#include +#include + +void PQCLEAN_HQCRMRS256_CLEAN_reed_solomon_encode(uint64_t *cdw, const uint64_t *msg); + +void PQCLEAN_HQCRMRS256_CLEAN_reed_solomon_decode(uint64_t *msg, uint64_t *cdw); + + +#endif diff --git a/crypto_kem/hqc-rmrs-256/clean/vector.c b/crypto_kem/hqc-rmrs-256/clean/vector.c new file mode 100644 index 00000000..94ee03f3 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/vector.c @@ -0,0 +1,226 @@ +#include "nistseedexpander.h" +#include "parameters.h" +#include "randombytes.h" +#include "vector.h" +#include +#include +/** + * @file vector.c + * @brief Implementation of vectors sampling and some utilities for the HQC scheme + */ + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. The vector + * is stored by position. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_fixed_weight_by_coordinates(AES_XOF_struct *ctx, uint32_t *v, uint16_t weight) { + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; // weight is expected to be <= PARAM_OMEGA_R + uint32_t random_data = 0; + uint8_t exist = 0; + size_t j = 0; + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (v[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + v[i] = random_data; + } + } +} + + + +/** + * @brief Generates a vector of a given Hamming weight + * + * This function generates uniformly at random a binary vector of a Hamming weight equal to the parameter weight. + * To generate the vector we have to sample uniformly at random values in the interval [0, PARAM_N -1]. Suppose the PARAM_N is equal to \f$ 70853 \f$, to select a position \f$ r\f$ the function works as follow: + * 1. It makes a call to the seedexpander function to obtain a random number \f$ x\f$ in \f$ [0, 2^{24}[ \f$. + * 2. Let \f$ t = \lfloor {2^{24} \over 70853} \rfloor \times 70853\f$ + * 3. If \f$ x \geq t\f$, go to 1 + * 4. It return \f$ r = x \mod 70853\f$ + * + * The parameter \f$ t \f$ is precomputed and it's denoted by UTILS_REJECTION_THRESHOLD (see the file parameters.h). + * + * @param[in] v Pointer to an array + * @param[in] weight Integer that is the Hamming weight + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight) { + + size_t random_bytes_size = 3 * weight; + uint8_t rand_bytes[3 * PARAM_OMEGA_R] = {0}; // weight is expected to be <= PARAM_OMEGA_R + uint32_t random_data = 0; + uint32_t tmp[PARAM_OMEGA_R] = {0}; + uint8_t exist = 0; + size_t j = 0; + + seedexpander(ctx, rand_bytes, random_bytes_size); + + for (uint32_t i = 0 ; i < weight ; ++i) { + exist = 0; + do { + if (j == random_bytes_size) { + seedexpander(ctx, rand_bytes, random_bytes_size); + j = 0; + } + + random_data = ((uint32_t) rand_bytes[j++]) << 16; + random_data |= ((uint32_t) rand_bytes[j++]) << 8; + random_data |= rand_bytes[j++]; + + } while (random_data >= UTILS_REJECTION_THRESHOLD); + + random_data = random_data % PARAM_N; + + for (uint32_t k = 0 ; k < i ; k++) { + if (tmp[k] == random_data) { + exist = 1; + } + } + + if (exist == 1) { + i--; + } else { + tmp[i] = random_data; + } + } + + for (uint16_t i = 0 ; i < weight ; ++i) { + int32_t index = tmp[i] / 64; + int32_t pos = tmp[i] % 64; + v[index] |= ((uint64_t) 1) << pos; + } +} + + + +/** + * @brief Generates a random vector of dimension PARAM_N + * + * This function generates a random binary vector of dimension PARAM_N. It generates a random + * array of bytes using the seedexpander function, and drop the extra bits using a mask. + * + * @param[in] v Pointer to an array + * @param[in] ctx Pointer to the context of the seed expander + */ +void PQCLEAN_HQCRMRS256_CLEAN_vect_set_random(AES_XOF_struct *ctx, uint64_t *v) { + uint8_t rand_bytes[VEC_N_SIZE_BYTES] = {0}; + + seedexpander(ctx, rand_bytes, VEC_N_SIZE_BYTES); + + memcpy(v, rand_bytes, VEC_N_SIZE_BYTES); + v[VEC_N_SIZE_64 - 1] &= BITMASK(PARAM_N, 64); +} + + + +/** + * @brief Generates a random vector + * + * This function generates a random binary vector. It uses the the randombytes function. + * + * @param[in] v Pointer to an array + */ +void PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_from_randombytes(uint64_t *v) { + uint8_t rand_bytes [VEC_K_SIZE_BYTES] = {0}; + + randombytes(rand_bytes, VEC_K_SIZE_BYTES); + memcpy(v, rand_bytes, VEC_K_SIZE_BYTES); +} + + + +/** + * @brief Adds two vectors + * + * @param[out] o Pointer to an array that is the result + * @param[in] v1 Pointer to an array that is the first vector + * @param[in] v2 Pointer to an array that is the second vector + * @param[in] size Integer that is the size of the vectors + */ +void PQCLEAN_HQCRMRS256_CLEAN_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size) { + for (uint32_t i = 0 ; i < size ; ++i) { + o[i] = v1[i] ^ v2[i]; + } +} + + +/** + * @brief Compares two vectors + * + * @param[in] v1 Pointer to an array that is first vector + * @param[in] v2 Pointer to an array that is second vector + * @param[in] size Integer that is the size of the vectors + * @returns 0 if the vectors are equals and a negative/psotive value otherwise + */ +int PQCLEAN_HQCRMRS256_CLEAN_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size) { + return memcmp(v1, v2, size); +} + + + +/** + * @brief Resize a vector so that it contains size_o bits + * + * @param[out] o Pointer to the output vector + * @param[in] size_o Integer that is the size of the output vector in bits + * @param[in] v Pointer to the input vector + * @param[in] size_v Integer that is the size of the input vector in bits + */ +void PQCLEAN_HQCRMRS256_CLEAN_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v) { + if (size_o < size_v) { + uint64_t mask = 0x7FFFFFFFFFFFFFFF; + int8_t val = 0; + + if (size_o % 64) { + val = 64 - (size_o % 64); + } + + memcpy(o, v, VEC_N1N2_SIZE_BYTES); + + for (int8_t i = 0 ; i < val ; ++i) { + o[VEC_N1N2_SIZE_64 - 1] &= (mask >> i); + } + } else { + memcpy(o, v, CEIL_DIVIDE(size_v, 8)); + } +} diff --git a/crypto_kem/hqc-rmrs-256/clean/vector.h b/crypto_kem/hqc-rmrs-256/clean/vector.h new file mode 100644 index 00000000..2724cba1 --- /dev/null +++ b/crypto_kem/hqc-rmrs-256/clean/vector.h @@ -0,0 +1,31 @@ +#ifndef VECTOR_H +#define VECTOR_H + + +/** + * @file vector.h + * @brief Header file for vector.c + */ + +#include "nistseedexpander.h" +#include "nistseedexpander.h" +#include "randombytes.h" +#include + +void PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_fixed_weight_by_coordinates(AES_XOF_struct *ctx, uint32_t *v, uint16_t weight); + +void PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_fixed_weight(AES_XOF_struct *ctx, uint64_t *v, uint16_t weight); + +void PQCLEAN_HQCRMRS256_CLEAN_vect_set_random(AES_XOF_struct *ctx, uint64_t *v); + +void PQCLEAN_HQCRMRS256_CLEAN_vect_set_random_from_randombytes(uint64_t *v); + + +void PQCLEAN_HQCRMRS256_CLEAN_vect_add(uint64_t *o, const uint64_t *v1, const uint64_t *v2, uint32_t size); + +int PQCLEAN_HQCRMRS256_CLEAN_vect_compare(const uint64_t *v1, const uint64_t *v2, uint32_t size); + +void PQCLEAN_HQCRMRS256_CLEAN_vect_resize(uint64_t *o, uint32_t size_o, const uint64_t *v, uint32_t size_v); + + +#endif diff --git a/test/duplicate_consistency/hqc-128_avx2.yml b/test/duplicate_consistency/hqc-128_avx2.yml new file mode 100644 index 00000000..00012332 --- /dev/null +++ b/test/duplicate_consistency/hqc-128_avx2.yml @@ -0,0 +1,124 @@ +consistency_checks: +- source: + scheme: hqc-128 + implementation: clean + files: + - api.h + - code.h + - gf.h + - hqc.h +- source: + scheme: hqc-192 + implementation: clean + files: + - code.h + - gf.h + - hqc.h +- source: + scheme: hqc-192 + implementation: avx2 + files: + - alpha_table.h + - bch.h + - code.h + - fft.h + - gen_matrix.h + - gf2x.h + - gf.h + - hqc.h + - parsing.h + - repetition.h + - vector.h + - bch.c + - fft.c + - gf.c + - hqc.c + - kem.c + - parsing.c + - repetition.c + - vector.c +- source: + scheme: hqc-256 + implementation: clean + files: + - code.h + - gf.h + - hqc.h +- source: + scheme: hqc-256 + implementation: avx2 + files: + - bch.h + - code.h + - fft.h + - gf2x.h + - gf.h + - hqc.h + - parsing.h + - repetition.h + - vector.h + - bch.c + - fft.c + - gf.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-128 + implementation: clean + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-128 + implementation: avx2 + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - gf2x.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-192 + implementation: clean + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-192 + implementation: avx2 + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-256 + implementation: clean + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-256 + implementation: avx2 + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - hqc.c + - kem.c + - parsing.c + - vector.c diff --git a/test/duplicate_consistency/hqc-128_clean.yml b/test/duplicate_consistency/hqc-128_clean.yml new file mode 100644 index 00000000..6abc98d3 --- /dev/null +++ b/test/duplicate_consistency/hqc-128_clean.yml @@ -0,0 +1,127 @@ +consistency_checks: +- source: + scheme: hqc-128 + implementation: avx2 + files: + - api.h + - code.h + - gf.h + - hqc.h +- source: + scheme: hqc-192 + implementation: clean + files: + - bch.h + - code.h + - fft.h + - gf2x.h + - gf.h + - hqc.h + - parsing.h + - repetition.h + - vector.h + - bch.c + - code.c + - fft.c + - gf2x.c + - gf.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-192 + implementation: avx2 + files: + - code.h + - gf.h + - hqc.h +- source: + scheme: hqc-256 + implementation: clean + files: + - bch.h + - code.h + - fft.h + - gf2x.h + - gf.h + - hqc.h + - parsing.h + - repetition.h + - vector.h + - bch.c + - code.c + - fft.c + - gf2x.c + - gf.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-256 + implementation: avx2 + files: + - code.h + - gf.h + - hqc.h +- source: + scheme: hqc-rmrs-128 + implementation: clean + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - gf2x.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-128 + implementation: avx2 + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-192 + implementation: clean + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - gf2x.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-192 + implementation: avx2 + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-256 + implementation: clean + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - gf2x.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-256 + implementation: avx2 + files: + - code.h + - hqc.h diff --git a/test/duplicate_consistency/hqc-192_avx2.yml b/test/duplicate_consistency/hqc-192_avx2.yml new file mode 100644 index 00000000..6c2b5158 --- /dev/null +++ b/test/duplicate_consistency/hqc-192_avx2.yml @@ -0,0 +1,93 @@ +consistency_checks: +- source: + scheme: hqc-192 + implementation: clean + files: + - api.h + - code.h + - gf.h + - hqc.h +- source: + scheme: hqc-256 + implementation: clean + files: + - code.h + - gf.h + - hqc.h +- source: + scheme: hqc-256 + implementation: avx2 + files: + - bch.h + - code.h + - fft.h + - gf2x.h + - gf.h + - hqc.h + - parsing.h + - repetition.h + - vector.h + - bch.c + - fft.c + - gf.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-128 + implementation: clean + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-128 + implementation: avx2 + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-192 + implementation: clean + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-192 + implementation: avx2 + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-256 + implementation: clean + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-256 + implementation: avx2 + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - hqc.c + - kem.c + - parsing.c + - vector.c diff --git a/test/duplicate_consistency/hqc-192_clean.yml b/test/duplicate_consistency/hqc-192_clean.yml new file mode 100644 index 00000000..945bef3b --- /dev/null +++ b/test/duplicate_consistency/hqc-192_clean.yml @@ -0,0 +1,98 @@ +consistency_checks: +- source: + scheme: hqc-192 + implementation: avx2 + files: + - api.h + - code.h + - gf.h + - hqc.h +- source: + scheme: hqc-256 + implementation: clean + files: + - bch.h + - code.h + - fft.h + - gf2x.h + - gf.h + - hqc.h + - parsing.h + - repetition.h + - vector.h + - bch.c + - code.c + - fft.c + - gf2x.c + - gf.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-256 + implementation: avx2 + files: + - code.h + - gf.h + - hqc.h +- source: + scheme: hqc-rmrs-128 + implementation: clean + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - gf2x.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-128 + implementation: avx2 + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-192 + implementation: clean + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - gf2x.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-192 + implementation: avx2 + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-256 + implementation: clean + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - gf2x.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-256 + implementation: avx2 + files: + - code.h + - hqc.h diff --git a/test/duplicate_consistency/hqc-256_avx2.yml b/test/duplicate_consistency/hqc-256_avx2.yml new file mode 100644 index 00000000..78de7336 --- /dev/null +++ b/test/duplicate_consistency/hqc-256_avx2.yml @@ -0,0 +1,67 @@ +consistency_checks: +- source: + scheme: hqc-256 + implementation: clean + files: + - api.h + - code.h + - gf.h + - hqc.h +- source: + scheme: hqc-rmrs-128 + implementation: clean + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-128 + implementation: avx2 + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-192 + implementation: clean + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-192 + implementation: avx2 + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-256 + implementation: clean + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-256 + implementation: avx2 + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - gf2x.c + - hqc.c + - kem.c + - parsing.c + - vector.c diff --git a/test/duplicate_consistency/hqc-256_clean.yml b/test/duplicate_consistency/hqc-256_clean.yml new file mode 100644 index 00000000..68f688b8 --- /dev/null +++ b/test/duplicate_consistency/hqc-256_clean.yml @@ -0,0 +1,69 @@ +consistency_checks: +- source: + scheme: hqc-256 + implementation: avx2 + files: + - api.h + - code.h + - gf.h + - hqc.h +- source: + scheme: hqc-rmrs-128 + implementation: clean + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - gf2x.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-128 + implementation: avx2 + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-192 + implementation: clean + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - gf2x.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-192 + implementation: avx2 + files: + - code.h + - hqc.h +- source: + scheme: hqc-rmrs-256 + implementation: clean + files: + - code.h + - gf2x.h + - hqc.h + - parsing.h + - vector.h + - gf2x.c + - hqc.c + - kem.c + - parsing.c + - vector.c +- source: + scheme: hqc-rmrs-256 + implementation: avx2 + files: + - code.h + - hqc.h diff --git a/test/duplicate_consistency/hqc-rmrs-128_avx2.yml b/test/duplicate_consistency/hqc-rmrs-128_avx2.yml new file mode 100644 index 00000000..907f0594 --- /dev/null +++ b/test/duplicate_consistency/hqc-rmrs-128_avx2.yml @@ -0,0 +1,78 @@ +consistency_checks: +- source: + scheme: hqc-rmrs-128 + implementation: clean + files: + - api.h + - code.h + - fft.h + - hqc.h + - reed_muller.h + - reed_solomon.h + - code.c + - fft.c + - reed_solomon.c +- source: + scheme: hqc-rmrs-192 + implementation: clean + files: + - code.h + - fft.h + - hqc.h + - reed_muller.h + - reed_solomon.h + - code.c + - fft.c +- source: + scheme: hqc-rmrs-192 + implementation: avx2 + files: + - code.h + - fft.h + - gf2x.h + - gf.h + - hqc.h + - parsing.h + - reed_muller.h + - reed_solomon.h + - vector.h + - code.c + - fft.c + - gf.c + - hqc.c + - kem.c + - parsing.c + - reed_muller.c + - vector.c +- source: + scheme: hqc-rmrs-256 + implementation: clean + files: + - code.h + - fft.h + - hqc.h + - reed_muller.h + - reed_solomon.h + - code.c + - fft.c +- source: + scheme: hqc-rmrs-256 + implementation: avx2 + files: + - code.h + - fft.h + - gf2x.h + - gf.h + - hqc.h + - parsing.h + - reed_muller.h + - reed_solomon.h + - vector.h + - code.c + - fft.c + - gf.c + - hqc.c + - kem.c + - parsing.c + - reed_muller.c + - vector.c diff --git a/test/duplicate_consistency/hqc-rmrs-128_clean.yml b/test/duplicate_consistency/hqc-rmrs-128_clean.yml new file mode 100644 index 00000000..49d2e43f --- /dev/null +++ b/test/duplicate_consistency/hqc-rmrs-128_clean.yml @@ -0,0 +1,80 @@ +consistency_checks: +- source: + scheme: hqc-rmrs-128 + implementation: avx2 + files: + - api.h + - code.h + - fft.h + - hqc.h + - reed_muller.h + - reed_solomon.h + - code.c + - fft.c + - reed_solomon.c +- source: + scheme: hqc-rmrs-192 + implementation: clean + files: + - code.h + - fft.h + - gf2x.h + - gf.h + - hqc.h + - parsing.h + - reed_muller.h + - reed_solomon.h + - vector.h + - code.c + - fft.c + - gf2x.c + - gf.c + - hqc.c + - kem.c + - parsing.c + - reed_muller.c + - vector.c +- source: + scheme: hqc-rmrs-192 + implementation: avx2 + files: + - code.h + - fft.h + - hqc.h + - reed_muller.h + - reed_solomon.h + - code.c + - fft.c +- source: + scheme: hqc-rmrs-256 + implementation: clean + files: + - code.h + - fft.h + - gf2x.h + - gf.h + - hqc.h + - parsing.h + - reed_muller.h + - reed_solomon.h + - vector.h + - code.c + - fft.c + - gf2x.c + - gf.c + - hqc.c + - kem.c + - parsing.c + - reed_muller.c + - vector.c +- source: + scheme: hqc-rmrs-256 + implementation: avx2 + files: + - code.h + - fft.h + - hqc.h + - reed_muller.h + - reed_solomon.h + - code.c + - fft.c diff --git a/test/duplicate_consistency/hqc-rmrs-192_avx2.yml b/test/duplicate_consistency/hqc-rmrs-192_avx2.yml new file mode 100644 index 00000000..01ad8699 --- /dev/null +++ b/test/duplicate_consistency/hqc-rmrs-192_avx2.yml @@ -0,0 +1,46 @@ +consistency_checks: +- source: + scheme: hqc-rmrs-192 + implementation: clean + files: + - api.h + - code.h + - fft.h + - hqc.h + - reed_muller.h + - reed_solomon.h + - code.c + - fft.c + - reed_solomon.c +- source: + scheme: hqc-rmrs-256 + implementation: clean + files: + - code.h + - fft.h + - hqc.h + - reed_muller.h + - reed_solomon.h + - code.c + - fft.c +- source: + scheme: hqc-rmrs-256 + implementation: avx2 + files: + - code.h + - fft.h + - gf2x.h + - gf.h + - hqc.h + - parsing.h + - reed_muller.h + - reed_solomon.h + - vector.h + - code.c + - fft.c + - gf.c + - hqc.c + - kem.c + - parsing.c + - reed_muller.c + - vector.c diff --git a/test/duplicate_consistency/hqc-rmrs-192_clean.yml b/test/duplicate_consistency/hqc-rmrs-192_clean.yml new file mode 100644 index 00000000..26a40de5 --- /dev/null +++ b/test/duplicate_consistency/hqc-rmrs-192_clean.yml @@ -0,0 +1,47 @@ +consistency_checks: +- source: + scheme: hqc-rmrs-192 + implementation: avx2 + files: + - api.h + - code.h + - fft.h + - hqc.h + - reed_muller.h + - reed_solomon.h + - code.c + - fft.c + - reed_solomon.c +- source: + scheme: hqc-rmrs-256 + implementation: clean + files: + - code.h + - fft.h + - gf2x.h + - gf.h + - hqc.h + - parsing.h + - reed_muller.h + - reed_solomon.h + - vector.h + - code.c + - fft.c + - gf2x.c + - gf.c + - hqc.c + - kem.c + - parsing.c + - reed_muller.c + - vector.c +- source: + scheme: hqc-rmrs-256 + implementation: avx2 + files: + - code.h + - fft.h + - hqc.h + - reed_muller.h + - reed_solomon.h + - code.c + - fft.c diff --git a/test/duplicate_consistency/hqc-rmrs-256_avx2.yml b/test/duplicate_consistency/hqc-rmrs-256_avx2.yml new file mode 100644 index 00000000..ff1c3f6d --- /dev/null +++ b/test/duplicate_consistency/hqc-rmrs-256_avx2.yml @@ -0,0 +1,14 @@ +consistency_checks: +- source: + scheme: hqc-rmrs-256 + implementation: clean + files: + - api.h + - code.h + - fft.h + - hqc.h + - reed_muller.h + - reed_solomon.h + - code.c + - fft.c + - reed_solomon.c diff --git a/test/duplicate_consistency/hqc-rmrs-256_clean.yml b/test/duplicate_consistency/hqc-rmrs-256_clean.yml new file mode 100644 index 00000000..44afbb9d --- /dev/null +++ b/test/duplicate_consistency/hqc-rmrs-256_clean.yml @@ -0,0 +1,14 @@ +consistency_checks: +- source: + scheme: hqc-rmrs-256 + implementation: avx2 + files: + - api.h + - code.h + - fft.h + - hqc.h + - reed_muller.h + - reed_solomon.h + - code.c + - fft.c + - reed_solomon.c