diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml new file mode 100644 index 00000000..81bc0b71 --- /dev/null +++ b/.github/workflows/action.yml @@ -0,0 +1,52 @@ +name: Proof of Passport CI/CD +on: + push: + branches: + - dev + - main + pull_request: + branches: + - dev + - main +jobs: + run_circuit_tests: + runs-on: ubuntu-latest + environment: development + steps: + - uses: actions/checkout@v3 + + # Circom installation from https://github.com/erhant/circomkit/blob/main/.github/workflows/tests.yml + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install --yes \ + build-essential \ + libgmp-dev \ + libsodium-dev \ + nasm \ + nlohmann-json3-dev + + - name: Set Node.js 18.x + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Download Circom Binary v2.1.8 + run: | + wget -qO /home/runner/work/circom https://github.com/iden3/circom/releases/download/v2.1.8/circom-linux-amd64 + chmod +x /home/runner/work/circom + sudo mv /home/runner/work/circom /bin/circom + + - name: Print Circom version + run: circom --version + + - name: Install Yarn dependencies + working-directory: ./circuits + run: yarn install-circuits --immutable + + - name: Run Tests + working-directory: ./circuits + run: yarn test diff --git a/circuits/circuits/disclose.circom b/circuits/circuits/disclose/disclose.circom similarity index 97% rename from circuits/circuits/disclose.circom rename to circuits/circuits/disclose/disclose.circom index ef9134c8..c1882682 100644 --- a/circuits/circuits/disclose.circom +++ b/circuits/circuits/disclose/disclose.circom @@ -2,8 +2,8 @@ pragma circom 2.1.5; include "circomlib/circuits/poseidon.circom"; include "@zk-email/circuits/utils/bytes.circom"; -include "./utils/isOlderThan.circom"; -include "./utils/isValid.circom"; +include "../utils/isOlderThan.circom"; +include "../utils/isValid.circom"; include "binary-merkle-root.circom"; template Disclose(nLevels) { diff --git a/circuits/circuits/dsc/dsc_sha1_rsa.circom b/circuits/circuits/dsc/dsc_sha1_rsa.circom new file mode 100644 index 00000000..50891fbf --- /dev/null +++ b/circuits/circuits/dsc/dsc_sha1_rsa.circom @@ -0,0 +1,75 @@ +pragma circom 2.1.5; +include "circomlib/circuits/bitify.circom"; +include "circomlib/circuits/poseidon.circom"; +include "circomlib/circuits/comparators.circom"; +include "binary-merkle-root.circom"; +include "../utils/splitBytesToWords.circom"; +include "../utils/splitSignalsToWords.circom"; +include "../utils/Sha1Bytes.circom"; +include "../utils/leafHasher.circom"; +include "../utils/rsaPkcs1.circom"; + +template DSC_SHA1_RSA(max_cert_bytes, n_dsc, k_dsc, n_csca, k_csca, dsc_mod_len, nLevels ) { + signal input raw_dsc_cert[max_cert_bytes]; + signal input raw_dsc_cert_padded_bytes; + signal input csca_modulus[k_csca]; + signal input dsc_signature[k_csca]; + signal input dsc_modulus[k_dsc]; + signal input start_index; + signal input secret; + + signal input merkle_root; + signal input path[nLevels]; + signal input siblings[nLevels]; + + signal output blinded_dsc_commitment; + + //verify the leaf + component leafHasher = LeafHasher(n_csca,k_csca); + leafHasher.in <== csca_modulus; + signal leaf <== leafHasher.out; + + + signal computed_merkle_root <== BinaryMerkleRoot(nLevels)(leaf, nLevels, path, siblings); + merkle_root === computed_merkle_root; + + // variables verification + assert(max_cert_bytes % 64 == 0); + assert(n_csca * k_csca > max_cert_bytes); + assert(n_csca <= (255 \ 2)); + + // hash raw TBS certificate + signal sha[160] <== Sha1Bytes(max_cert_bytes)(raw_dsc_cert, raw_dsc_cert_padded_bytes); + component sstw_1 = SplitSignalsToWords(1,160, n_csca, k_csca); + for (var i = 0; i < 160; i++) { + sstw_1.in[i] <== sha[159 - i]; + } + + //verify RSA dsc_signature + component rsa = RSAVerify65537(n_csca, k_csca); + for (var i = 0; i < k_csca; i++) { + rsa.base_message[i] <== sstw_1.out[i]; + rsa.modulus[i] <== csca_modulus[i]; + rsa.signature[i] <== dsc_signature[i]; + } + + // verify DSC csca_modulus + component shiftLeft = VarShiftLeft(max_cert_bytes, dsc_mod_len); + shiftLeft.in <== raw_dsc_cert; + shiftLeft.shift <== start_index; + component spbt_1 = SplitBytesToWords(dsc_mod_len, n_dsc, k_dsc); + spbt_1.in <== shiftLeft.out; + for (var i = 0; i < k_dsc; i++) { + dsc_modulus[i] === spbt_1.out[i]; + } + // generate blinded commitment + component sstw_2 = SplitSignalsToWords(n_dsc,k_dsc, 230, 9); + sstw_2.in <== dsc_modulus; + component poseidon = Poseidon(10); + poseidon.inputs[0] <== secret; + for (var i = 0; i < 9; i++) { + poseidon.inputs[i+1] <== sstw_2.out[i]; + } + blinded_dsc_commitment <== poseidon.out; +} + diff --git a/circuits/circuits/dsc.circom b/circuits/circuits/dsc/dsc_sha256_rsa.circom similarity index 61% rename from circuits/circuits/dsc.circom rename to circuits/circuits/dsc/dsc_sha256_rsa.circom index 8fb75bd2..0e7791b3 100644 --- a/circuits/circuits/dsc.circom +++ b/circuits/circuits/dsc/dsc_sha256_rsa.circom @@ -6,12 +6,12 @@ include "circomlib/circuits/comparators.circom"; include "@zk-email/circuits/lib/sha.circom"; include "@zk-email/circuits/lib/rsa.circom"; include "binary-merkle-root.circom"; -include "./utils/splitBytesToWords.circom"; -include "./utils/splitSignalsToWords.circom"; -include "./utils/leafHasher.circom"; -include "./utils/leafHasher2.circom"; +include "../utils/splitBytesToWords.circom"; +include "../utils/splitSignalsToWords.circom"; +include "../utils/leafHasher.circom"; +include "../utils/leafHasher.circom"; -template DSC(max_cert_bytes, n_dsc, k_dsc, n_csca, k_csca, dsc_mod_len, nLevels ) { +template DSC_SHA256_RSA(max_cert_bytes, n_dsc, k_dsc, n_csca, k_csca, dsc_mod_len, nLevels ) { signal input raw_dsc_cert[max_cert_bytes]; signal input raw_dsc_cert_padded_bytes; signal input csca_modulus[k_csca]; @@ -26,13 +26,9 @@ template DSC(max_cert_bytes, n_dsc, k_dsc, n_csca, k_csca, dsc_mod_len, nLevels signal output blinded_dsc_commitment; - // verify the leaf - // component leafHasher = LeafHasher(k_csca); - // leafHasher.in <== csca_modulus; - // signal leaf <== leafHasher.out; - component leafHasher2 = LeafHasher2(n_csca,k_csca); - leafHasher2.in <== csca_modulus; - signal leaf <== leafHasher2.out; + component leafHasher = LeafHasher(n_csca,k_csca); + leafHasher.in <== csca_modulus; + signal leaf <== leafHasher.out; signal computed_merkle_root <== BinaryMerkleRoot(nLevels)(leaf, nLevels, path, siblings); @@ -45,31 +41,16 @@ template DSC(max_cert_bytes, n_dsc, k_dsc, n_csca, k_csca, dsc_mod_len, nLevels // hash raw TBS certificate signal sha[256] <== Sha256Bytes(max_cert_bytes)(raw_dsc_cert, raw_dsc_cert_padded_bytes); - - var msg_len = (256+n_csca)\n_csca; - component base_msg[msg_len]; - for (var i = 0; i < msg_len; i++) { - base_msg[i] = Bits2Num(n_csca); - } + component sstw_1 = SplitSignalsToWords(1,256, n_csca, k_csca); for (var i = 0; i < 256; i++) { - base_msg[i\n_csca].in[i%n_csca] <== sha[255 - i]; - } - for (var i = 256; i < n_csca*msg_len; i++) { - base_msg[i\n_csca].in[i%n_csca] <== 0; + sstw_1.in[i] <== sha[255 - i]; } // verify RSA dsc_signature component rsa = RSAVerifier65537(n_csca, k_csca); - for (var i = 0; i < msg_len; i++) { - rsa.message[i] <== base_msg[i].out; - } - for (var i = msg_len; i < k_csca; i++) { - rsa.message[i] <== 0; - } for (var i = 0; i < k_csca; i++) { + rsa.message[i] <== sstw_1.out[i]; rsa.modulus[i] <== csca_modulus[i]; - } - for (var i = 0; i < k_csca; i++) { rsa.signature[i] <== dsc_signature[i]; } @@ -83,12 +64,12 @@ template DSC(max_cert_bytes, n_dsc, k_dsc, n_csca, k_csca, dsc_mod_len, nLevels dsc_modulus[i] === spbt_1.out[i]; } // generate blinded commitment - component spbt_2 = SplitSignalsToWords(n_dsc,k_dsc, 230, 9); - spbt_2.in <== dsc_modulus; + component sstw_2 = SplitSignalsToWords(n_dsc,k_dsc, 230, 9); + sstw_2.in <== dsc_modulus; component poseidon = Poseidon(10); poseidon.inputs[0] <== secret; for (var i = 0; i < 9; i++) { - poseidon.inputs[i+1] <== spbt_2.out[i]; + poseidon.inputs[i+1] <== sstw_2.out[i]; } blinded_dsc_commitment <== poseidon.out; } diff --git a/circuits/circuits/dsc_sha256WithRSASSAPSS.circom b/circuits/circuits/dsc/dsc_sha256_rsapss.circom similarity index 60% rename from circuits/circuits/dsc_sha256WithRSASSAPSS.circom rename to circuits/circuits/dsc/dsc_sha256_rsapss.circom index 752bae74..a3d43bea 100644 --- a/circuits/circuits/dsc_sha256WithRSASSAPSS.circom +++ b/circuits/circuits/dsc/dsc_sha256_rsapss.circom @@ -4,12 +4,14 @@ include "circomlib/circuits/bitify.circom"; include "circomlib/circuits/poseidon.circom"; include "circomlib/circuits/comparators.circom"; include "@zk-email/circuits/lib/sha.circom"; -include "./utils/RSASSAPSS_padded.circom"; include "binary-merkle-root.circom"; -include "./utils/splitBytesToWords.circom"; -include "./utils/splitSignalsToWords.circom"; +include "../utils/splitBytesToWords.circom"; +include "../utils/splitSignalsToWords.circom"; +include "../utils/RSASSAPSS_padded.circom"; +include "../utils/leafHasher.circom"; -template DSC(max_cert_bytes, n_dsc, k_dsc, n_csca, k_csca, dsc_mod_len, nLevels ) { + +template DSC_SHA256_RSAPSS(max_cert_bytes, n_dsc, k_dsc, n_csca, k_csca, dsc_mod_len, nLevels ) { signal input raw_dsc_cert[max_cert_bytes]; signal input raw_dsc_cert_padded_bytes; signal input csca_modulus[k_csca]; @@ -25,33 +27,19 @@ template DSC(max_cert_bytes, n_dsc, k_dsc, n_csca, k_csca, dsc_mod_len, nLevels signal output blinded_dsc_commitment; // verify the leaf + component leafHasher = LeafHasher(n_csca,k_csca); + leafHasher.in <== csca_modulus; + signal leaf <== leafHasher.out; - - // component poseidon16first = Poseidon(16); - // component poseidon16next = Poseidon(16); - // component poseidon2last = Poseidon(2); - // component poseidonfinal = Poseidon(3); - // for (var i = 0; i < 16; i++) { - // poseidon16first.inputs[i] <== csca_modulus[i]; - // poseidon16next.inputs[i] <== csca_modulus[i+16]; - // } - // poseidon2last.inputs[0] <== csca_modulus[32]; - // poseidon2last.inputs[1] <== csca_modulus[33]; - // poseidonfinal.inputs[0] <== poseidon16first.out; - // poseidonfinal.inputs[1] <== poseidon16next.out; - // poseidonfinal.inputs[2] <== poseidon2last.out; - // signal leaf <== poseidonfinal.out; - - - // signal computed_merkle_root <== BinaryMerkleRoot(nLevels)(leaf, nLevels, path, siblings); - // merkle_root === computed_merkle_root; + signal computed_merkle_root <== BinaryMerkleRoot(nLevels)(leaf, nLevels, path, siblings); + merkle_root === computed_merkle_root; // variables verification assert(max_cert_bytes % 64 == 0); assert(n_csca * k_csca > max_cert_bytes); assert(n_csca <= (255 \ 2)); - // decode signature to get encoded message + // decode signature to get encoded message component rsaDecode = RSASSAPSS_Decode(n_csca, k_csca); rsaDecode.signature <== dsc_signature; rsaDecode.modulus <== csca_modulus; @@ -73,12 +61,12 @@ template DSC(max_cert_bytes, n_dsc, k_dsc, n_csca, k_csca, dsc_mod_len, nLevels dsc_modulus[i] === spbt_1.out[i]; } // generate blinded commitment - component spbt_2 = SplitSignalsToWords(n_dsc,k_dsc, 230, 9); - spbt_2.in <== dsc_modulus; + component sstw_1 = SplitSignalsToWords(n_dsc,k_dsc, 230, 9); + sstw_1.in <== dsc_modulus; component poseidon = Poseidon(10); poseidon.inputs[0] <== secret; for (var i = 0; i < 9; i++) { - poseidon.inputs[i+1] <== spbt_2.out[i]; + poseidon.inputs[i+1] <== sstw_1.out[i]; } blinded_dsc_commitment <== poseidon.out; } diff --git a/circuits/circuits/dsc_sha1WithRSAEncryption.circom b/circuits/circuits/dsc_sha1WithRSAEncryption.circom deleted file mode 100644 index 41455c95..00000000 --- a/circuits/circuits/dsc_sha1WithRSAEncryption.circom +++ /dev/null @@ -1,112 +0,0 @@ -pragma circom 2.1.5; - -include "circomlib/circuits/bitify.circom"; -include "circomlib/circuits/poseidon.circom"; -include "circomlib/circuits/comparators.circom"; -include "@zk-email/circuits/lib/rsa.circom"; -include "binary-merkle-root.circom"; -include "./utils/splitBytesToWords.circom"; -include "./utils/splitSignalsToWords.circom"; -include "./utils/Sha1Bytes.circom"; - - -template DSC_sha1WithRSAEncryption(max_cert_bytes, n_dsc, k_dsc, n_csca, k_csca, dsc_mod_len, nLevels ) { - signal input raw_dsc_cert[max_cert_bytes]; - signal input raw_dsc_cert_padded_bytes; - signal input csca_modulus[k_csca]; - signal input dsc_signature[k_csca]; - signal input dsc_modulus[k_dsc]; - signal input start_index; - signal input secret; - - signal input merkle_root; - signal input path[nLevels]; - signal input siblings[nLevels]; - - signal output blinded_dsc_commitment; - - verify the leaf - component poseidon16first = Poseidon(16); - component poseidon16next = Poseidon(16); - component poseidon2last = Poseidon(2); - component poseidonfinal = Poseidon(3); - for (var i = 0; i < 16; i++) { - poseidon16first.inputs[i] <== csca_modulus[i]; - poseidon16next.inputs[i] <== csca_modulus[i+16]; - } - poseidon2last.inputs[0] <== csca_modulus[32]; - poseidon2last.inputs[1] <== csca_modulus[33]; - poseidonfinal.inputs[0] <== poseidon16first.out; - poseidonfinal.inputs[1] <== poseidon16next.out; - poseidonfinal.inputs[2] <== poseidon2last.out; - signal leaf <== poseidonfinal.out; - - - signal computed_merkle_root <== BinaryMerkleRoot(nLevels)(leaf, nLevels, path, siblings); - merkle_root === computed_merkle_root; - - // variables verification - assert(max_cert_bytes % 64 == 0); - assert(n_csca * k_csca > max_cert_bytes); - assert(n_csca <= (255 \ 2)); - - // hash raw TBS certificate - signal sha[160] <== Sha1Bytes(max_cert_bytes)(raw_dsc_cert, raw_dsc_cert_padded_bytes); - component b2n = Bits2Num(160); - for (var i = 0; i < 160; i++) { - b2n.in[i] <== sha[159-i]; - } - - signal sha_bigint <== b2n.out; - log("sha_bigint", sha_bigint); - - - var msg_len = (160 + n_csca)\n_csca; - log("msg_len", msg_len); - - component base_msg[msg_len]; - for (var i = 0; i < msg_len; i++) { - base_msg[i] = Bits2Num(n_csca); - } - for (var i = 0; i < 160; i++) { - base_msg[i\n_csca].in[i%n_csca] <== sha[160 - 1 - i]; - } - for (var i = 160; i < n_csca*msg_len; i++) { - base_msg[i\n_csca].in[i%n_csca] <== 0; - } - - //verify RSA dsc_signature - component rsa = RSAVerifier65537(n_csca, k_csca); - for (var i = 0; i < msg_len; i++) { - rsa.message[i] <== base_msg[i].out; - } - for (var i = msg_len; i < k_csca; i++) { - rsa.message[i] <== 0; - } - for (var i = 0; i < k_csca; i++) { - rsa.modulus[i] <== csca_modulus[i]; - } - for (var i = 0; i < k_csca; i++) { - rsa.signature[i] <== dsc_signature[i]; - } - - // verify DSC csca_modulus - component shiftLeft = VarShiftLeft(max_cert_bytes, dsc_mod_len); - shiftLeft.in <== raw_dsc_cert; - shiftLeft.shift <== start_index; - component spbt_1 = SplitBytesToWords(dsc_mod_len, n_dsc, k_dsc); - spbt_1.in <== shiftLeft.out; - for (var i = 0; i < k_dsc; i++) { - dsc_modulus[i] === spbt_1.out[i]; - } - // generate blinded commitment - component spbt_2 = SplitSignalsToWords(n_dsc,k_dsc, 230, 9); - spbt_2.in <== dsc_modulus; - component poseidon = Poseidon(10); - poseidon.inputs[0] <== secret; - for (var i = 0; i < 9; i++) { - poseidon.inputs[i+1] <== spbt_2.out[i]; - } - blinded_dsc_commitment <== poseidon.out; -} - diff --git a/circuits/circuits/register_sha1WithRSAEncryption_65537.circom b/circuits/circuits/register/register_sha1WithRSAEncryption_65537.circom similarity index 95% rename from circuits/circuits/register_sha1WithRSAEncryption_65537.circom rename to circuits/circuits/register/register_sha1WithRSAEncryption_65537.circom index 8082f0aa..19d7859a 100644 --- a/circuits/circuits/register_sha1WithRSAEncryption_65537.circom +++ b/circuits/circuits/register/register_sha1WithRSAEncryption_65537.circom @@ -2,9 +2,9 @@ pragma circom 2.1.5; include "circomlib/circuits/poseidon.circom"; include "@zk-email/circuits/utils/bytes.circom"; -include "./passport_verifier_sha1WithRSAEncryption_65537.circom"; +include "./verifier/passport_verifier_sha1WithRSAEncryption_65537.circom"; include "binary-merkle-root.circom"; -include "./utils/splitSignalsToWords.circom"; +include "../utils/splitSignalsToWords.circom"; template Register_sha1WithRSAEncryption_65537(n, k, max_datahashes_bytes, nLevels, signatureAlgorithm) { signal input secret; diff --git a/circuits/circuits/register_sha256WithRSAEncryption_65537.circom b/circuits/circuits/register/register_sha256WithRSAEncryption_65537.circom similarity index 95% rename from circuits/circuits/register_sha256WithRSAEncryption_65537.circom rename to circuits/circuits/register/register_sha256WithRSAEncryption_65537.circom index 52541f31..320bec05 100644 --- a/circuits/circuits/register_sha256WithRSAEncryption_65537.circom +++ b/circuits/circuits/register/register_sha256WithRSAEncryption_65537.circom @@ -2,9 +2,9 @@ pragma circom 2.1.5; include "circomlib/circuits/poseidon.circom"; include "@zk-email/circuits/utils/bytes.circom"; -include "./passport_verifier_sha256WithRSAEncryption_65537.circom"; +include "./verifier/passport_verifier_sha256WithRSAEncryption_65537.circom"; include "binary-merkle-root.circom"; -include "./utils/splitSignalsToWords.circom"; +include "../utils/splitSignalsToWords.circom"; template Register_sha256WithRSAEncryption_65537(n, k, max_datahashes_bytes, nLevels, signatureAlgorithm) { signal input secret; diff --git a/circuits/circuits/register_sha256WithRSASSAPSS_65537.circom b/circuits/circuits/register/register_sha256WithRSASSAPSS_65537.circom similarity index 95% rename from circuits/circuits/register_sha256WithRSASSAPSS_65537.circom rename to circuits/circuits/register/register_sha256WithRSASSAPSS_65537.circom index 5c9e05ad..6d93ad5e 100644 --- a/circuits/circuits/register_sha256WithRSASSAPSS_65537.circom +++ b/circuits/circuits/register/register_sha256WithRSASSAPSS_65537.circom @@ -2,9 +2,9 @@ pragma circom 2.1.5; include "circomlib/circuits/poseidon.circom"; include "@zk-email/circuits/utils/bytes.circom"; -include "./passport_verifier_sha256WithRSASSAPSS_65537.circom"; +include "./verifier/passport_verifier_sha256WithRSASSAPSS_65537.circom"; include "binary-merkle-root.circom"; -include "./utils/splitSignalsToWords.circom"; +include "../utils/splitSignalsToWords.circom"; template register_sha256WithRSASSAPSS_65537(n, k, max_datahashes_bytes, nLevels, signatureAlgorithm) { signal input secret; diff --git a/circuits/circuits/register_sha256WithRSASSAPSS_65537.circom.save b/circuits/circuits/register/register_sha256WithRSASSAPSS_65537.circom.save similarity index 93% rename from circuits/circuits/register_sha256WithRSASSAPSS_65537.circom.save rename to circuits/circuits/register/register_sha256WithRSASSAPSS_65537.circom.save index 778eb6c9..f04560d4 100644 --- a/circuits/circuits/register_sha256WithRSASSAPSS_65537.circom.save +++ b/circuits/circuits/register/register_sha256WithRSASSAPSS_65537.circom.save @@ -2,9 +2,9 @@ pragma circom 2.1.5; include "circomlib/circuits/poseidon.circom"; include "@zk-email/circuits/utils/bytes.circom"; -include "./passport_verifier_sha256WithRSASSAPSS_65537.circom"; -include "./utils/chunk_data.circom"; -include "./utils/compute_pubkey_leaf.circom"; +include "./verifier/passport_verifier_sha256WithRSASSAPSS_65537.circom"; +include "../utils/chunk_data.circom"; +include "../utils/compute_pubkey_leaf.circom"; include "binary-merkle-root.circom"; template register_sha256WithRSASSAPSS_65537(n, k, max_datahashes_bytes, nLevels, signatureAlgorithm) { diff --git a/circuits/circuits/passport_verifier_sha1WithRSAEncryption_65537.circom b/circuits/circuits/register/verifier/passport_verifier_sha1WithRSAEncryption_65537.circom similarity index 96% rename from circuits/circuits/passport_verifier_sha1WithRSAEncryption_65537.circom rename to circuits/circuits/register/verifier/passport_verifier_sha1WithRSAEncryption_65537.circom index 4d954de3..55cdcfc6 100644 --- a/circuits/circuits/passport_verifier_sha1WithRSAEncryption_65537.circom +++ b/circuits/circuits/register/verifier/passport_verifier_sha1WithRSAEncryption_65537.circom @@ -1,9 +1,9 @@ pragma circom 2.1.5; -include "./utils/rsaPkcs1.circom"; include "@zk-email/circuits/utils/bytes.circom"; -include "./utils/Sha1BytesStatic.circom"; -include "./utils/Sha1Bytes.circom"; +include "../../utils/Sha1BytesStatic.circom"; +include "../../utils/Sha1Bytes.circom"; +include "../../utils/rsaPkcs1.circom"; include "dmpierre/sha1-circom/circuits/sha1.circom"; template PassportVerifier_sha1WithRSAEncryption_65537(n, k, max_datahashes_bytes) { diff --git a/circuits/circuits/passport_verifier_sha256WithRSAEncryption_65537.circom b/circuits/circuits/register/verifier/passport_verifier_sha256WithRSAEncryption_65537.circom similarity index 98% rename from circuits/circuits/passport_verifier_sha256WithRSAEncryption_65537.circom rename to circuits/circuits/register/verifier/passport_verifier_sha256WithRSAEncryption_65537.circom index 91010968..78e710be 100644 --- a/circuits/circuits/passport_verifier_sha256WithRSAEncryption_65537.circom +++ b/circuits/circuits/register/verifier/passport_verifier_sha256WithRSAEncryption_65537.circom @@ -4,7 +4,7 @@ include "@zk-email/circuits/lib/rsa.circom"; include "@zk-email/circuits/utils/bytes.circom"; include "@zk-email/circuits/lib/sha.circom"; include "@zk-email/circuits/utils/array.circom"; -include "./utils/Sha256BytesStatic.circom"; +include "../../utils/Sha256BytesStatic.circom"; template PassportVerifier_sha256WithRSAEncryption_65537(n, k, max_datahashes_bytes) { var hashLen = 32; diff --git a/circuits/circuits/passport_verifier_sha256WithRSASSAPSS_65537.circom b/circuits/circuits/register/verifier/passport_verifier_sha256WithRSASSAPSS_65537.circom similarity index 96% rename from circuits/circuits/passport_verifier_sha256WithRSASSAPSS_65537.circom rename to circuits/circuits/register/verifier/passport_verifier_sha256WithRSASSAPSS_65537.circom index 35e391f1..2919605b 100644 --- a/circuits/circuits/passport_verifier_sha256WithRSASSAPSS_65537.circom +++ b/circuits/circuits/register/verifier/passport_verifier_sha256WithRSASSAPSS_65537.circom @@ -4,8 +4,8 @@ pragma circom 2.1.5; include "@zk-email/circuits/utils/bytes.circom"; include "@zk-email/circuits/lib/sha.circom"; include "@zk-email/circuits/utils/array.circom"; -include "./utils/Sha256BytesStatic.circom"; -include "./utils/RSASSAPSS.circom"; +include "../../utils/Sha256BytesStatic.circom"; +include "../../utils/RSASSAPSS.circom"; include "@zk-email/circuits/lib/fp.circom"; template PassportVerifier_sha256WithRSASSAPSS_65537(n, k, max_datahashes_bytes) { diff --git a/circuits/circuits/tests/certificates/dsc_sha1_rsa_2048.circom b/circuits/circuits/tests/certificates/dsc_sha1_rsa_2048.circom deleted file mode 100644 index 7c5a617e..00000000 --- a/circuits/circuits/tests/certificates/dsc_sha1_rsa_2048.circom +++ /dev/null @@ -1,5 +0,0 @@ -pragma circom 2.1.6; - -include "../../dsc_sha1WithRSAEncryption.circom"; - -component main { public [ merkle_root ] } = DSC_sha1WithRSAEncryption(1664,121 ,17 ,121, 17, 256, 12); \ No newline at end of file diff --git a/circuits/circuits/tests/certificates/dsc_sha256_rsa_2048.circom b/circuits/circuits/tests/certificates/dsc_sha256_rsa_2048.circom deleted file mode 100644 index 4f711c22..00000000 --- a/circuits/circuits/tests/certificates/dsc_sha256_rsa_2048.circom +++ /dev/null @@ -1,5 +0,0 @@ -pragma circom 2.1.6; - -include "../../dsc.circom"; - -component main { public [ merkle_root ] } = DSC(1664,64 ,32 ,64, 32, 256, 12); \ No newline at end of file diff --git a/circuits/circuits/tests/certificates/dsc_sha256_rsapss_2048.circom b/circuits/circuits/tests/certificates/dsc_sha256_rsapss_2048.circom deleted file mode 100644 index bf1974f6..00000000 --- a/circuits/circuits/tests/certificates/dsc_sha256_rsapss_2048.circom +++ /dev/null @@ -1,5 +0,0 @@ -pragma circom 2.1.6; - -include "../../dsc_sha256WithRSASSAPSS.circom"; - -component main { public [ merkle_root ] } = DSC(1664,64 ,32 ,64, 32, 256, 12); \ No newline at end of file diff --git a/circuits/circuits/tests/certificates/dsc_4096.circom b/circuits/circuits/tests/dsc/dsc_4096.circom similarity index 100% rename from circuits/circuits/tests/certificates/dsc_4096.circom rename to circuits/circuits/tests/dsc/dsc_4096.circom diff --git a/circuits/circuits/tests/dsc/dsc_sha1_rsa_2048.circom b/circuits/circuits/tests/dsc/dsc_sha1_rsa_2048.circom new file mode 100644 index 00000000..980e92f6 --- /dev/null +++ b/circuits/circuits/tests/dsc/dsc_sha1_rsa_2048.circom @@ -0,0 +1,5 @@ +pragma circom 2.1.6; + +include "../../dsc/dsc_sha1_rsa.circom"; + +component main { public [ merkle_root ] } = DSC_SHA1_RSA(960,121 ,17 ,121, 17, 256, 12); \ No newline at end of file diff --git a/circuits/circuits/tests/certificates/dsc_sha1_rsa_4096.circom b/circuits/circuits/tests/dsc/dsc_sha1_rsa_4096.circom similarity index 100% rename from circuits/circuits/tests/certificates/dsc_sha1_rsa_4096.circom rename to circuits/circuits/tests/dsc/dsc_sha1_rsa_4096.circom diff --git a/circuits/circuits/tests/dsc/dsc_sha256_rsa_2048.circom b/circuits/circuits/tests/dsc/dsc_sha256_rsa_2048.circom new file mode 100644 index 00000000..275d2581 --- /dev/null +++ b/circuits/circuits/tests/dsc/dsc_sha256_rsa_2048.circom @@ -0,0 +1,5 @@ +pragma circom 2.1.6; + +include "../../dsc/dsc_sha256_rsa.circom"; + +component main { public [ merkle_root ] } = DSC_SHA256_RSA(960,121 ,17 ,121, 17, 256, 12); \ No newline at end of file diff --git a/circuits/circuits/tests/dsc/dsc_sha256_rsapss_2048.circom b/circuits/circuits/tests/dsc/dsc_sha256_rsapss_2048.circom new file mode 100644 index 00000000..215143e5 --- /dev/null +++ b/circuits/circuits/tests/dsc/dsc_sha256_rsapss_2048.circom @@ -0,0 +1,5 @@ +pragma circom 2.1.6; + +include "../../dsc/dsc_sha256_rsapss.circom"; + +component main { public [ merkle_root ] } = DSC_SHA256_RSAPSS(960,64 ,32 ,64, 32, 256, 12); \ No newline at end of file diff --git a/circuits/circuits/tests/isOlderThan_tester.circom b/circuits/circuits/tests/utils/isOlderThan_tester.circom similarity index 91% rename from circuits/circuits/tests/isOlderThan_tester.circom rename to circuits/circuits/tests/utils/isOlderThan_tester.circom index 083fbf95..26629d22 100644 --- a/circuits/circuits/tests/isOlderThan_tester.circom +++ b/circuits/circuits/tests/utils/isOlderThan_tester.circom @@ -1,6 +1,6 @@ pragma circom 2.1.6; -include "../utils/isOlderThan.circom"; +include "../../utils/isOlderThan.circom"; template isOlderThan_tester() { diff --git a/circuits/circuits/tests/isValid_tester.circom b/circuits/circuits/tests/utils/isValid_tester.circom similarity index 89% rename from circuits/circuits/tests/isValid_tester.circom rename to circuits/circuits/tests/utils/isValid_tester.circom index 85ad84a8..cbed326b 100644 --- a/circuits/circuits/tests/isValid_tester.circom +++ b/circuits/circuits/tests/utils/isValid_tester.circom @@ -1,6 +1,6 @@ pragma circom 2.1.6; -include "../utils/IsValid.circom"; +include "../../utils/isValid.circom"; template IsValid_tester() { diff --git a/circuits/circuits/tests/leafHasher_tester.circom b/circuits/circuits/tests/utils/leafHasher_tester.circom similarity index 57% rename from circuits/circuits/tests/leafHasher_tester.circom rename to circuits/circuits/tests/utils/leafHasher_tester.circom index c6b09652..949d8009 100644 --- a/circuits/circuits/tests/leafHasher_tester.circom +++ b/circuits/circuits/tests/utils/leafHasher_tester.circom @@ -1,5 +1,5 @@ pragma circom 2.1.6; -include "../utils/leafHasher.circom"; +include "../../utils/leafHasher.circom"; component main = LeafHasher(32); \ No newline at end of file diff --git a/circuits/circuits/tests/utils/rsa_verifier.circom b/circuits/circuits/tests/utils/rsa_verifier.circom new file mode 100644 index 00000000..d9ad7060 --- /dev/null +++ b/circuits/circuits/tests/utils/rsa_verifier.circom @@ -0,0 +1,3 @@ +include "@zk-email/circuits/lib/rsa.circom"; + +component main = RSAVerifier65537(64, 32); \ No newline at end of file diff --git a/circuits/circuits/utils/leafHasher.circom b/circuits/circuits/utils/leafHasher.circom index 508a0657..36cacadc 100644 --- a/circuits/circuits/utils/leafHasher.circom +++ b/circuits/circuits/utils/leafHasher.circom @@ -2,25 +2,23 @@ pragma circom 2.1.6; include "circomlib/circuits/poseidon.circom"; -template LeafHasher (k) { +template LeafHasher (n,k) { signal input in[k]; signal output out; + + component splitSignalsToWords = SplitSignalsToWords(n,k,64,64); + splitSignalsToWords.in <== in; + component hash[4]; for (var i = 0; i < 4 ; i ++){ hash[i] = Poseidon(16); } for (var i = 0; i < 64 ; i ++){ - if (i < k ){ - hash[ i % 4 ].inputs[ i \ 4 ] <== in[i]; - } - else{ - hash[ i % 4 ].inputs[ i \ 4 ] <== 0; - } + hash[ i % 4 ].inputs[ i \ 4 ] <== splitSignalsToWords.out[i]; } component finalHash = Poseidon(4); for (var i = 0 ; i < 4 ; i++){ finalHash.inputs[i] <== hash[i].out; } - log(finalHash.out); out <== finalHash.out; } diff --git a/circuits/circuits/utils/leafHasher2.circom b/circuits/circuits/utils/leafHasher.circom.save similarity index 57% rename from circuits/circuits/utils/leafHasher2.circom rename to circuits/circuits/utils/leafHasher.circom.save index b106b0d7..508a0657 100644 --- a/circuits/circuits/utils/leafHasher2.circom +++ b/circuits/circuits/utils/leafHasher.circom.save @@ -2,24 +2,20 @@ pragma circom 2.1.6; include "circomlib/circuits/poseidon.circom"; -template LeafHasher2 (n,k) { +template LeafHasher (k) { signal input in[k]; signal output out; - - component splitSignalsToWords = SplitSignalsToWords(n,k,64,64); - splitSignalsToWords.in <== in; - component hash[4]; for (var i = 0; i < 4 ; i ++){ hash[i] = Poseidon(16); } for (var i = 0; i < 64 ; i ++){ - // if (i < k ){ - hash[ i % 4 ].inputs[ i \ 4 ] <== splitSignalsToWords.out[i]; - // } - // else{ - // hash[ i % 4 ].inputs[ i \ 4 ] <== 0; - // } + if (i < k ){ + hash[ i % 4 ].inputs[ i \ 4 ] <== in[i]; + } + else{ + hash[ i % 4 ].inputs[ i \ 4 ] <== 0; + } } component finalHash = Poseidon(4); for (var i = 0 ; i < 4 ; i++){ diff --git a/circuits/package.json b/circuits/package.json index 3fd28076..f451c7d0 100644 --- a/circuits/package.json +++ b/circuits/package.json @@ -4,7 +4,7 @@ "author": "", "license": "MIT", "scripts": { - "test": "yarn ts-mocha test/**/*.test.ts --exit", + "test": "yarn ts-mocha tests/**/*.test.ts --exit", "install-circuits": "cd ../common && yarn && cd ../circuits && yarn" }, "dependencies": { @@ -18,6 +18,8 @@ "@zk-kit/circuits": "^1.0.0-beta", "@zk-kit/imt": "https://gitpkg.now.sh/0xturboblitz/zk-kit/packages/imt?6d417675", "@zk-kit/lean-imt": "^2.0.1", + "asn1": "^0.2.6", + "asn1js": "^3.0.5", "chai-as-promised": "^7.1.1", "circom_tester": "github:Atomic-Buy/circom_tester#main", "circomlib": "^2.0.5", @@ -26,7 +28,8 @@ "elliptic": "^6.5.5", "js-sha256": "^0.10.1", "jsrsasign": "^11.1.0", - "node-forge": "^1.3.1", + "modpow": "^1.0.0", + "node-forge": "https://github.com/remicolin/forge", "poseidon-lite": "^0.2.0", "snarkjs": "^0.7.1", "typescript": "^5.3.3" @@ -40,4 +43,4 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.2" } -} +} \ No newline at end of file diff --git a/circuits/scripts/build_circuits.sh b/circuits/scripts/build_circuits.sh index 4f05c5ab..64b37159 100755 --- a/circuits/scripts/build_circuits.sh +++ b/circuits/scripts/build_circuits.sh @@ -4,10 +4,11 @@ source "scripts/download_ptau.sh" build_circuit() { local CIRCUIT_NAME=$1 + local CIRCUIT_TYPE=$2 local START_TIME=$(date +%s) echo "compiling circuit: $CIRCUIT_NAME" - circom circuits/${CIRCUIT_NAME}.circom -l node_modules -l ./node_modules/@zk-kit/binary-merkle-root.circom/src -l ./node_modules/circomlib/circuits --r1cs --O1 --wasm -c --output build + circom circuits/${CIRCUIT_TYPE}/${CIRCUIT_NAME}.circom -l node_modules -l ./node_modules/@zk-kit/binary-merkle-root.circom/src -l ./node_modules/circomlib/circuits --r1cs --O1 --wasm -c --output build echo "building zkey" yarn snarkjs groth16 setup build/${CIRCUIT_NAME}.r1cs build/powersOfTau28_hez_final_20.ptau build/${CIRCUIT_NAME}.zkey @@ -27,11 +28,23 @@ build_circuit() { echo "Size of ${CIRCUIT_NAME}_final.zkey: $(wc -c { - circuit = await wasm_tester( - path.join(__dirname, '../circuits/tests/certificates/dsc_sha1_rsa_2048.circom'), - { - include: [ - "node_modules", - "./node_modules/@zk-kit/binary-merkle-root.circom/src", - "./node_modules/circomlib/circuits" - ] - } - ); - }); - - it('should compile and load the circuit', () => { - expect(circuit).to.not.be.undefined; - }) - - it('should compute the correct output', async () => { - console.log("Inputs:", inputs); - const witness = await circuit.calculateWitness(inputs, true); - console.log(witness); - }) - -}) \ No newline at end of file diff --git a/circuits/test/dsc_sha1_rsa_4096.test.ts b/circuits/test/dsc_sha1_rsa_4096.test.ts deleted file mode 100644 index 49f337ef..00000000 --- a/circuits/test/dsc_sha1_rsa_4096.test.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { assert, expect } from 'chai' -import fs from 'fs' -const forge = require('node-forge'); -import path from 'path'; -const wasm_tester = require("circom_tester").wasm; -import { splitToWords } from '../../common/src/utils/utils'; -import { sha256Pad } from '../../common/src/utils/shaPad'; -import { computeLeafFromModulus, findStartIndex, getCSCAInputs } from '../../common/src/utils/cscasha1'; - -describe('DSC chain certificate', function () { - this.timeout(0); // Disable timeout - let circuit; - const n_dsc = 121; - const k_dsc = 17; - const n_csca = 121; - const k_csca = 34; - const max_cert_bytes = 1664; - const dsc = fs.readFileSync('../common/src/mock_certificates/sha1_rsa_4096/mock_dsc.crt', 'utf8'); - const csca = fs.readFileSync('../common/src/mock_certificates/sha1_rsa_4096/mock_csca.crt', 'utf8'); - const dscCert = forge.pki.certificateFromPem(dsc); - const cscaCert = forge.pki.certificateFromPem(csca); - console.log('DSC Issuer:', dscCert.issuer.getField('CN').value); - console.log('CSCA Subject:', cscaCert.subject.getField('CN').value); - console.log('TBS Certificate length:', forge.asn1.toDer(dscCert.tbsCertificate).getBytes().length); - console.log('DSC Signature length:', dscCert.signature.length); - console.log('CSCA Public Key length:', cscaCert.publicKey.n.toString(16).length * 4); - - describe('DSC chain certificate', () => { - describe('DSC chain certificate', () => { - it('should verify that the DSC is signed by the CSCA', () => { - // Method 1: Using verifyCertificateChain - const caStore = forge.pki.createCaStore([cscaCert]); - try { - const verified = forge.pki.verifyCertificateChain(caStore, [dscCert]); - console.log('Certificate chain verified:', verified); - expect(verified).to.be.true; - } catch (error) { - console.error('Certificate chain verification failed:', error); - throw error; - } - - // Method 2: Manual verification - const tbsCertificate = forge.asn1.toDer(dscCert.tbsCertificate).getBytes(); - const signature = dscCert.signature; - - const md = forge.md.sha1.create(); - md.update(tbsCertificate, 'raw'); - - const publicKey = cscaCert.publicKey; - const digestBytes = md.digest().getBytes(); - const digestBigInt = BigInt('0x' + Buffer.from(digestBytes, 'binary').toString('hex')); - console.log('Digest as BigInt:', digestBigInt); - try { - const verified = publicKey.verify(md.digest().getBytes(), signature); - console.log('Manual signature verification:', verified); - expect(verified).to.be.true; - } catch (error) { - console.error('Manual signature verification failed:', error); - throw error; - } - }); - }); - - - const inputs = getCSCAInputs(BigInt(0).toString(), dscCert, cscaCert, n_dsc, k_dsc, n_csca, k_csca, max_cert_bytes, true); - - //console.log("inputs:", JSON.stringify(inputs, null, 2)); - fs.writeFileSync('inputs.json', JSON.stringify(inputs, null, 2)); - - before(async () => { - circuit = await wasm_tester( - path.join(__dirname, '../circuits/tests/certificates/dsc_sha1_rsa_4096.circom'), - { - include: [ - "node_modules", - "./node_modules/@zk-kit/binary-merkle-root.circom/src", - "./node_modules/circomlib/circuits" - ] - } - ); - }); - - it('should compile and load the circuit', () => { - expect(circuit).to.not.be.undefined; - }) - - it('should compute the correct output', async () => { - //console.log("Inputs:", inputs); - const witness = await circuit.calculateWitness(inputs, true); - const blinded_dsc_commitment = (await circuit.getOutput(witness, ["blinded_dsc_commitment"])).blinded_dsc_commitment; - console.log("blinded_dsc_commitment", blinded_dsc_commitment) - }) - - }); -}); \ No newline at end of file diff --git a/circuits/test/dsc_sha256_rsa_2048.test.ts b/circuits/test/dsc_sha256_rsa_2048.test.ts deleted file mode 100644 index 5ceb0720..00000000 --- a/circuits/test/dsc_sha256_rsa_2048.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { assert, expect } from 'chai' -import fs from 'fs' -const forge = require('node-forge'); -import path from 'path'; -const wasm_tester = require("circom_tester").wasm; -import { splitToWords } from '../../common/src/utils/utils'; -import { sha256Pad } from '../../common/src/utils/shaPad'; -import { findStartIndex, getCSCAInputs } from '../../common/src/utils/csca'; - -describe('DSC chain certificate', function () { - this.timeout(0); // Disable timeout - let circuit; - const n_dsc = 64; - const k_dsc = 32; - const n_csca = 64; - const k_csca = 32; - const max_cert_bytes = 1664; - const dsc = fs.readFileSync('../common/src/mock_certificates/sha256_rsa_2048/mock_dsc.crt', 'utf8'); - const csca = fs.readFileSync('../common/src/mock_certificates/sha256_rsa_2048/mock_csca.crt', 'utf8'); - const dscCert = forge.pki.certificateFromPem(dsc); - const cscaCert = forge.pki.certificateFromPem(csca); - - - const inputs = getCSCAInputs(BigInt(0).toString(), dscCert, cscaCert, n_dsc, k_dsc, n_csca, k_csca, max_cert_bytes, true); - console.log("inputs:", inputs); - - before(async () => { - circuit = await wasm_tester( - path.join(__dirname, '../circuits/tests/certificates/dsc_sha256_rsa_2048.circom'), - { - include: [ - "node_modules", - "./node_modules/@zk-kit/binary-merkle-root.circom/src", - "./node_modules/circomlib/circuits" - ] - } - ); - }); - - before(async () => { - circuit = await wasm_tester( - path.join(__dirname, '../circuits/tests/certificates/dsc_sha256_rsa_2048.circom'), - { - include: [ - "node_modules", - "./node_modules/@zk-kit/binary-merkle-root.circom/src", - "./node_modules/circomlib/circuits" - ] - } - ); - }); - - it('should compile and load the circuit', () => { - expect(circuit).to.not.be.undefined; - }) - - it('should compute the correct output', async () => { - console.log("Inputs:", inputs); - const witness = await circuit.calculateWitness(inputs, true); - console.log(witness); - }) - -}) \ No newline at end of file diff --git a/circuits/test/dsc_sha256_rsa_4096.test.ts b/circuits/test/dsc_sha256_rsa_4096.test.ts deleted file mode 100644 index 578abcc2..00000000 --- a/circuits/test/dsc_sha256_rsa_4096.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { assert, expect } from 'chai' -import fs from 'fs' -const forge = require('node-forge'); -import path from 'path'; -const wasm_tester = require("circom_tester").wasm; -import { getCSCAInputs } from '../../common/src/utils/csca'; - -describe('DSC chain certificate', function () { - this.timeout(0); // Disable timeout - let circuit; - const n_dsc = 121; - const k_dsc = 17; - const n_csca = 121; - const k_csca = 34; - const max_cert_bytes = 1664; - const dsc = fs.readFileSync('../common/src/mock_certificates/sha256_rsa_4096/mock_dsc.crt', 'utf8'); - const csca = fs.readFileSync('../common/src/mock_certificates/sha256_rsa_4096/mock_csca.crt', 'utf8'); - const dscCert = forge.pki.certificateFromPem(dsc); - const cscaCert = forge.pki.certificateFromPem(csca); - const inputs = getCSCAInputs(BigInt(0).toString(), dscCert, cscaCert, n_dsc, k_dsc, n_csca, k_csca, max_cert_bytes, true); - - console.log("inputs:", JSON.stringify(inputs, null, 2)); - fs.writeFileSync('inputs.json', JSON.stringify(inputs, null, 2)); - - before(async () => { - circuit = await wasm_tester( - path.join(__dirname, '../circuits/tests/certificates/dsc_sha256_rsa_4096.circom'), - { - include: [ - "node_modules", - "./node_modules/@zk-kit/binary-merkle-root.circom/src", - "./node_modules/circomlib/circuits" - ] - } - ); - }); - - // it('should compile and load the circuit', () => { - // expect(circuit).to.not.be.undefined; - // }) - - it('should compute the correct output', async () => { - //console.log("Inputs:", inputs); - const witness = await circuit.calculateWitness(inputs, true); - const blinded_dsc_commitment = (await circuit.getOutput(witness, ["blinded_dsc_commitment"])).blinded_dsc_commitment; - console.log("blinded_dsc_commitment", blinded_dsc_commitment) - }) - -}) \ No newline at end of file diff --git a/circuits/test/dsc_sha256_rsapss_2048.test.ts b/circuits/test/dsc_sha256_rsapss_2048.test.ts deleted file mode 100644 index bb9c4b4a..00000000 --- a/circuits/test/dsc_sha256_rsapss_2048.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { assert, expect } from 'chai' -import fs from 'fs' -import jsrsasign from 'jsrsasign'; -import path from 'path'; -const wasm_tester = require("circom_tester").wasm; -import { splitToWords } from '../../common/src/utils/utils'; -import { sha256Pad } from '../../common/src/utils/shaPad'; -import { findStartIndex, getCSCAInputs } from '../../common/src/utils/csca'; -import { readCertificate } from '../../common/src/utils/certificates'; - -describe('DSC chain certificate', function () { - this.timeout(0); // Disable timeout - let circuit; - const n_dsc = 64; - const k_dsc = 32; - const n_csca = 64; - const k_csca = 32; - const max_cert_bytes = 1664; - const dsc_path = path.join(__dirname, '../../common/src/mock_certificates/sha256_rsapss_2048/mock_dsc.pem'); - const csca_path = path.join(__dirname, '../../common/src/mock_certificates/sha256_rsapss_2048/mock_csca.pem'); - - - - const dscCert = readCertificate(dsc_path); - const cscaCert = readCertificate(csca_path); - - - const inputs = getCSCAInputs(BigInt(0).toString(), dscCert, cscaCert, n_dsc, k_dsc, n_csca, k_csca, max_cert_bytes, true); - console.log("inputs:", inputs); - - before(async () => { - circuit = await wasm_tester( - path.join(__dirname, '../circuits/tests/certificates/dsc_sha256_rsapss_2048.circom'), - { - include: [ - "node_modules", - "./node_modules/@zk-kit/binary-merkle-root.circom/src", - "./node_modules/circomlib/circuits" - ] - } - ); - }); - - it('should compile and load the circuit', () => { - expect(circuit).to.not.be.undefined; - }) - - it('should compute the correct output', async () => { - console.log("Inputs:", inputs); - const witness = await circuit.calculateWitness(inputs, true); - console.log(witness); - }) - -}) \ No newline at end of file diff --git a/circuits/test/disclose.test.ts b/circuits/tests/disclose/disclose.test.ts similarity index 87% rename from circuits/test/disclose.test.ts rename to circuits/tests/disclose/disclose.test.ts index 5b9a8620..08fa80aa 100644 --- a/circuits/test/disclose.test.ts +++ b/circuits/tests/disclose/disclose.test.ts @@ -1,26 +1,27 @@ import { assert, expect } from 'chai' import path from "path"; const wasm_tester = require("circom_tester").wasm; -import { mockPassportData_sha256WithRSAEncryption_65537 } from '../../common/src/utils/mockPassportData'; -import { formatMrz, packBytes } from '../../common/src/utils/utils'; -import { attributeToPosition, COMMITMENT_TREE_DEPTH } from "../../common/src/constants/constants"; +import { mockPassportData_sha256_rsa_65537 } from '../../../common/src/constants/mockPassportData'; +import { formatMrz, packBytes } from '../../../common/src/utils/utils'; +import { attributeToPosition, COMMITMENT_TREE_DEPTH } from "../../../common/src/constants/constants"; import { poseidon1, poseidon2, poseidon6 } from "poseidon-lite"; import { LeanIMT } from "@zk-kit/lean-imt"; -import { getLeaf } from '../../common/src/utils/pubkeyTree'; -import { generateCircuitInputsDisclose } from '../../common/src/utils/generateInputs'; -import { unpackReveal } from '../../common/src/utils/revealBitmap'; +import { getLeaf } from '../../../common/src/utils/pubkeyTree'; +import { generateCircuitInputsDisclose } from '../../../common/src/utils/generateInputs'; +import { unpackReveal } from '../../../common/src/utils/revealBitmap'; -describe("start testing disclose.circom", function () { +describe("Disclose", function () { this.timeout(0); let inputs: any; let circuit: any; let w: any; - let passportData = mockPassportData_sha256WithRSAEncryption_65537; + let passportData = mockPassportData_sha256_rsa_65537; let attestation_id: string; let tree: any; + const attestation_name = "E-PASSPORT"; before(async () => { - circuit = await wasm_tester(path.join(__dirname, "../circuits/disclose.circom"), + circuit = await wasm_tester(path.join(__dirname, "../../circuits/disclose/disclose.circom"), { include: [ "node_modules", @@ -31,7 +32,6 @@ describe("start testing disclose.circom", function () { ); const secret = BigInt(Math.floor(Math.random() * Math.pow(2, 254))).toString(); - const attestation_name = "E-PASSPORT"; attestation_id = poseidon1([ BigInt(Buffer.from(attestation_name).readUIntBE(0, 6)) ]).toString(); @@ -82,8 +82,8 @@ describe("start testing disclose.circom", function () { const nullifier_js = poseidon2([inputs.secret, inputs.scope]).toString(); const nullifier_circom = (await circuit.getOutput(w, ["nullifier"])).nullifier; - console.log("nullifier_circom", nullifier_circom); - console.log("nullifier_js", nullifier_js); + //console.log("nullifier_circom", nullifier_circom); + //console.log("nullifier_js", nullifier_js); expect(nullifier_circom).to.equal(nullifier_js); }); @@ -174,7 +174,7 @@ describe("start testing disclose.circom", function () { const revealedData_packed = await circuit.getOutput(w, ["revealedData_packed[3]"]) const reveal_unpacked = unpackReveal(revealedData_packed); - console.log("reveal_unpacked", reveal_unpacked) + //console.log("reveal_unpacked", reveal_unpacked) expect(reveal_unpacked[88]).to.equal("1"); expect(reveal_unpacked[89]).to.equal("8"); @@ -194,7 +194,7 @@ describe("start testing disclose.circom", function () { const revealedData_packed = await circuit.getOutput(w, ["revealedData_packed[3]"]) const reveal_unpacked = unpackReveal(revealedData_packed); - console.log("reveal_unpacked", reveal_unpacked) + //console.log("reveal_unpacked", reveal_unpacked) expect(reveal_unpacked[88]).to.equal("\x00"); expect(reveal_unpacked[89]).to.equal("\x00"); diff --git a/circuits/tests/dsc/dsc_sha1_rsa_2048.test.ts b/circuits/tests/dsc/dsc_sha1_rsa_2048.test.ts new file mode 100644 index 00000000..0daeba70 --- /dev/null +++ b/circuits/tests/dsc/dsc_sha1_rsa_2048.test.ts @@ -0,0 +1,57 @@ +import { assert, expect } from 'chai' +import fs from 'fs' +const forge = require('node-forge'); +import path from 'path'; +const wasm_tester = require("circom_tester").wasm; +import { getCSCAInputs } from '../../../common/src/utils/csca'; +import { mock_dsc_sha1_rsa_2048, mock_csca_sha1_rsa_2048 } from '../../../common/src/constants/mockCertificates'; + +describe('DSC chain certificate - SHA1 RSA', function () { + this.timeout(0); // Disable timeout + let circuit; + const n_dsc = 121; + const k_dsc = 17; + const n_csca = 121; + const k_csca = 17; + const max_cert_bytes = 960; + const dscCert = forge.pki.certificateFromPem(mock_dsc_sha1_rsa_2048); + const cscaCert = forge.pki.certificateFromPem(mock_csca_sha1_rsa_2048); + + const inputs = getCSCAInputs(BigInt(0).toString(), dscCert, cscaCert, n_dsc, k_dsc, n_csca, k_csca, max_cert_bytes, true); + + before(async () => { + const circuitPath = path.resolve(__dirname, '../../circuits/tests/dsc/dsc_sha1_rsa_2048.circom'); + circuit = await wasm_tester( + circuitPath, + { + include: [ + "node_modules", + "./node_modules/@zk-kit/binary-merkle-root.circom/src", + "./node_modules/circomlib/circuits" + ] + } + ); + }); + + it('verify dsc has been signed by the csca', () => { + const tbsCertAsn1 = forge.pki.getTBSCertificate(dscCert); + const tbsCertDer = forge.asn1.toDer(tbsCertAsn1).getBytes(); + const md = forge.md.sha1.create(); + md.update(tbsCertDer); + const tbsHash = md.digest().getBytes(); + const signature = dscCert.signature; + const cscaCert = forge.pki.certificateFromPem(mock_csca_sha1_rsa_2048); + const publicKey = cscaCert.publicKey; + const verified = publicKey.verify(tbsHash, signature); + expect(verified).to.be.true; + }) + + it('should compile and load the circuit', () => { + expect(circuit).to.not.be.undefined; + }) + + it('should compute the correct output', async () => { + const witness = await circuit.calculateWitness(inputs, true); + }) + +}) \ No newline at end of file diff --git a/circuits/tests/dsc/dsc_sha256_rsa_2048.test.ts b/circuits/tests/dsc/dsc_sha256_rsa_2048.test.ts new file mode 100644 index 00000000..9e93e314 --- /dev/null +++ b/circuits/tests/dsc/dsc_sha256_rsa_2048.test.ts @@ -0,0 +1,56 @@ +import { assert, expect } from 'chai' +import fs from 'fs' +const forge = require('node-forge'); +import path from 'path'; +const wasm_tester = require("circom_tester").wasm; +import { getCSCAInputs } from '../../../common/src/utils/csca'; +import { mock_dsc_sha256_rsa_2048, mock_csca_sha256_rsa_2048 } from '../../../common/src/constants/mockCertificates'; + +describe('DSC chain certificate - SHA256 RSA', function () { + this.timeout(0); // Disable timeout + let circuit; + const n_dsc = 121; + const k_dsc = 17; + const n_csca = 121; + const k_csca = 17; + const max_cert_bytes = 960; + const dscCert = forge.pki.certificateFromPem(mock_dsc_sha256_rsa_2048); + const cscaCert = forge.pki.certificateFromPem(mock_csca_sha256_rsa_2048); + + const inputs = getCSCAInputs(BigInt(0).toString(), dscCert, cscaCert, n_dsc, k_dsc, n_csca, k_csca, max_cert_bytes, true); + + before(async () => { + const circuitPath = path.resolve(__dirname, '../../circuits/tests/dsc/dsc_sha256_rsa_2048.circom'); + circuit = await wasm_tester( + circuitPath, + { + include: [ + "node_modules", + "./node_modules/@zk-kit/binary-merkle-root.circom/src", + "./node_modules/circomlib/circuits" + ] + } + ); + }); + + it('verify dsc has been signed by the csca', () => { + const tbsCertAsn1 = forge.pki.getTBSCertificate(dscCert); + const tbsCertDer = forge.asn1.toDer(tbsCertAsn1).getBytes(); + const md = forge.md.sha256.create(); + md.update(tbsCertDer); + const tbsHash = md.digest().getBytes(); + const signature = dscCert.signature; + const publicKey = cscaCert.publicKey; + const verified = publicKey.verify(tbsHash, signature); + expect(verified).to.be.true; + }) + + it('should compile and load the circuit', () => { + expect(circuit).to.not.be.undefined; + }) + + it('should compute the correct output', async () => { + const witness = await circuit.calculateWitness(inputs, true); + }) + +}) \ No newline at end of file diff --git a/circuits/tests/dsc/dsc_sha256_rsapss_2048.test.ts b/circuits/tests/dsc/dsc_sha256_rsapss_2048.test.ts new file mode 100644 index 00000000..036f5e98 --- /dev/null +++ b/circuits/tests/dsc/dsc_sha256_rsapss_2048.test.ts @@ -0,0 +1,87 @@ +import { assert, expect } from 'chai' +import fs from 'fs' +const forge = require('node-forge'); +import path from 'path'; +const wasm_tester = require("circom_tester").wasm; +import { getCSCAInputs } from '../../../common/src/utils/csca'; +import crypto from 'crypto'; +import { mock_dsc_sha256_rsapss_2048, mock_csca_sha256_rsapss_2048 } from '../../../common/src/constants/mockCertificates'; + +describe('DSC chain certificate - SHA256 RSA-PSS', function () { + this.timeout(0); // Disable timeout + let circuit; + const n_dsc = 64; + const k_dsc = 32; + const n_csca = 64; + const k_csca = 32; + const max_cert_bytes = 960; + const dscCert = forge.pki.certificateFromPem(mock_dsc_sha256_rsapss_2048); + const cscaCert = forge.pki.certificateFromPem(mock_csca_sha256_rsapss_2048); + + const inputs = getCSCAInputs(BigInt(0).toString(), dscCert, cscaCert, n_dsc, k_dsc, n_csca, k_csca, max_cert_bytes, true); + + before(async () => { + const circuitPath = path.resolve(__dirname, '../../circuits/tests/dsc/dsc_sha256_rsapss_2048.circom'); + circuit = await wasm_tester( + circuitPath, + { + include: [ + "node_modules", + "./node_modules/@zk-kit/binary-merkle-root.circom/src", + "./node_modules/circomlib/circuits" + ] + } + ); + }); + // TODO: Verify the certificate chain in ts too. + // it('verify dsc has been signed by the csca using RSA-PSS', () => { + // // Extract TBS (To Be Signed) certificate + // const tbsCertAsn1 = forge.pki.getTBSCertificate(dscCert); + // const tbsCertDer = forge.asn1.toDer(tbsCertAsn1).getBytes(); + + // // Create SHA-256 hash of the TBS certificate + // const tbsHash = crypto.createHash('sha256').update(Buffer.from(tbsCertDer, 'binary')).digest(); + + // // Extract signature from DSC certificate + // const signature = Buffer.from(dscCert.signature, 'binary'); + + // // Get public key from CSCA certificate + // const publicKeyPem = forge.pki.publicKeyToPem(cscaCert.publicKey); + // const publicKey = crypto.createPublicKey(publicKeyPem); + + // // Verify signature + // const pssOptions = { + // saltLength: 32, + // mgf1Hash: 'sha256' + // }; + + // try { + // const verifier = crypto.createVerify('RSA-SHA256'); + // verifier.update(tbsHash); + // const isValid = verifier.verify({ + // key: publicKey, + // padding: crypto.constants.RSA_PKCS1_PSS_PADDING, + // saltLength: pssOptions.saltLength + // }, signature); + + // console.log('TBS Hash:', tbsHash.toString('hex')); + // console.log('Signature:', signature.toString('hex')); + // console.log('Public Key:', publicKeyPem); + // console.log('Verification result:', isValid); + + // expect(isValid).to.be.true; + // } catch (error) { + // console.error('Verification error:', error); + // throw error; + // } + // }) + + it('should compile and load the circuit', () => { + expect(circuit).to.not.be.undefined; + }) + + it('should compute the correct output', async () => { + const witness = await circuit.calculateWitness(inputs, true); + }) + +}) \ No newline at end of file diff --git a/circuits/test/register_sha1_rsa.test.ts b/circuits/tests/register/register_sha1_rsa.test.ts similarity index 70% rename from circuits/test/register_sha1_rsa.test.ts rename to circuits/tests/register/register_sha1_rsa.test.ts index 1e88c5bb..ff25ba59 100644 --- a/circuits/test/register_sha1_rsa.test.ts +++ b/circuits/tests/register/register_sha1_rsa.test.ts @@ -3,22 +3,24 @@ import { assert, expect } from 'chai' import path from "path"; const wasm_tester = require("circom_tester").wasm; import { poseidon1, poseidon6 } from "poseidon-lite"; -import { mockPassportData_sha1WithRSAEncryption_65537 } from "../../common/src/utils/mockPassportData"; -import { generateCircuitInputsRegister } from '../../common/src/utils/generateInputs'; -import { getLeaf } from '../../common/src/utils/pubkeyTree'; -import { packBytes } from '../../common/src/utils/utils'; -import { k_csca, k_dsc, n_csca, n_dsc } from '../../common/src/constants/constants'; +import { mockPassportData_sha1_rsa_65537 } from "../../../common/src/constants/mockPassportData"; +import { generateCircuitInputsRegister } from '../../../common/src/utils/generateInputs'; +import { getLeaf } from '../../../common/src/utils/pubkeyTree'; +import { packBytes } from '../../../common/src/utils/utils'; -describe("Circuits - sha1WithRSAEncryption_65537 Register flow", function () { +describe("Register - SHA1 RSA", function () { this.timeout(0); let inputs: any; let circuit: any; - let passportData = mockPassportData_sha1WithRSAEncryption_65537; + let passportData = mockPassportData_sha1_rsa_65537; let attestation_id: string; + const attestation_name = "E-PASSPORT"; + const n_dsc = 121; + const k_dsc = 17; before(async () => { circuit = await wasm_tester( - path.join(__dirname, "../circuits/register_sha1WithRSAEncryption_65537.circom"), + path.join(__dirname, "../../circuits/register/register_sha1WithRSAEncryption_65537.circom"), { include: [ "node_modules", @@ -30,16 +32,15 @@ describe("Circuits - sha1WithRSAEncryption_65537 Register flow", function () { ); const secret = BigInt(Math.floor(Math.random() * Math.pow(2, 254))).toString(); - console.log("secret", secret); + const dscSecret = BigInt(Math.floor(Math.random() * Math.pow(2, 254))).toString(); - const attestation_name = "E-PASSPORT"; attestation_id = poseidon1([ BigInt(Buffer.from(attestation_name).readUIntBE(0, 6)) ]).toString(); inputs = generateCircuitInputsRegister( secret, - BigInt(0).toString(), + dscSecret, attestation_id, passportData, n_dsc, @@ -55,9 +56,13 @@ describe("Circuits - sha1WithRSAEncryption_65537 Register flow", function () { const w = await circuit.calculateWitness(inputs); await circuit.checkConstraints(w); - console.log("nullifier", (await circuit.getOutput(w, ["nullifier"])).nullifier); - + const nullifier = (await circuit.getOutput(w, ["nullifier"])).nullifier; + console.log("\x1b[34m%s\x1b[0m", "nullifier", nullifier); const commitment_circom = (await circuit.getOutput(w, ["commitment"])).commitment; + console.log("\x1b[34m%s\x1b[0m", "commitment", commitment_circom); + const blinded_dsc_commitment = (await circuit.getOutput(w, ["blinded_dsc_commitment"])).blinded_dsc_commitment; + console.log("\x1b[34m%s\x1b[0m", "blinded_dsc_commitment", blinded_dsc_commitment); + const mrz_bytes = packBytes(inputs.mrz); const commitment_bytes = poseidon6([ inputs.secret[0], @@ -72,8 +77,8 @@ describe("Circuits - sha1WithRSAEncryption_65537 Register flow", function () { mrz_bytes[2] ]); const commitment_js = commitment_bytes.toString(); - console.log('commitment_js', commitment_js) - console.log('commitment_circom', commitment_circom) + //console.log('commitment_js', commitment_js) + //console.log('commitment_circom', commitment_circom) expect(commitment_circom).to.be.equal(commitment_js); }); @@ -116,17 +121,4 @@ describe("Circuits - sha1WithRSAEncryption_65537 Register flow", function () { } }); - // it("should fail to calculate witness with invalid merkle root", async function () { - // try { - // const invalidInputs = { - // ...inputs, - // merkle_root: inputs.merkle_root.map((byte: string) => String((parseInt(byte, 10) + 1) % 256)), - // } - // await circuit.calculateWitness(invalidInputs); - // expect.fail("Expected an error but none was thrown."); - // } catch (error) { - // expect(error.message).to.include("Assert Failed"); - // } - // }); - }); \ No newline at end of file diff --git a/circuits/test/register_sha256_rsa.test.ts b/circuits/tests/register/register_sha256_rsa.test.ts similarity index 66% rename from circuits/test/register_sha256_rsa.test.ts rename to circuits/tests/register/register_sha256_rsa.test.ts index 23cadc0b..fdc7aa38 100644 --- a/circuits/test/register_sha256_rsa.test.ts +++ b/circuits/tests/register/register_sha256_rsa.test.ts @@ -3,23 +3,24 @@ import { assert, expect } from 'chai' import path from "path"; const wasm_tester = require("circom_tester").wasm; import { poseidon1, poseidon6 } from "poseidon-lite"; -import { mockPassportData_sha256WithRSAEncryption_65537 } from "../../common/src/utils/mockPassportData"; -import { generateCircuitInputsRegister } from '../../common/src/utils/generateInputs'; -import { getLeaf } from '../../common/src/utils/pubkeyTree'; -import { packBytes } from '../../common/src/utils/utils'; +import { mockPassportData_sha256_rsa_65537 } from "../../../common/src/constants/mockPassportData"; +import { generateCircuitInputsRegister } from '../../../common/src/utils/generateInputs'; +import { getLeaf } from '../../../common/src/utils/pubkeyTree'; +import { packBytes } from '../../../common/src/utils/utils'; -describe("Circuits - sha256WithRSAEncryption_65537 Register flow", function () { +describe("Register - SHA256 RSA", function () { this.timeout(0); let inputs: any; let circuit: any; - let passportData = mockPassportData_sha256WithRSAEncryption_65537; + let passportData = mockPassportData_sha256_rsa_65537; let attestation_id: string; + const attestation_name = "E-PASSPORT"; const n_dsc = 121; const k_dsc = 17; before(async () => { circuit = await wasm_tester( - path.join(__dirname, "../circuits/register_sha256WithRSAEncryption_65537.circom"), + path.join(__dirname, "../../circuits/register/register_sha256WithRSAEncryption_65537.circom"), { include: [ "node_modules", @@ -29,23 +30,18 @@ describe("Circuits - sha256WithRSAEncryption_65537 Register flow", function () { }, ); - //const secret = BigInt(Math.floor(Math.random() * Math.pow(2, 254))).toString(); - const secret = BigInt(0).toString(); - console.log("secret", secret); - - const attestation_name = "E-PASSPORT"; + const secret = BigInt(Math.floor(Math.random() * Math.pow(2, 254))).toString(); + const dscSecret = BigInt(Math.floor(Math.random() * Math.pow(2, 254))).toString(); attestation_id = poseidon1([ BigInt(Buffer.from(attestation_name).readUIntBE(0, 6)) ]).toString(); - inputs = generateCircuitInputsRegister( secret, - BigInt(0).toString(), + dscSecret, attestation_id, passportData, n_dsc, - k_dsc, - [mockPassportData_sha256WithRSAEncryption_65537] + k_dsc ); }); @@ -57,12 +53,12 @@ describe("Circuits - sha256WithRSAEncryption_65537 Register flow", function () { const w = await circuit.calculateWitness(inputs); await circuit.checkConstraints(w); - console.log("nullifier", (await circuit.getOutput(w, ["nullifier"])).nullifier); - + const nullifier = (await circuit.getOutput(w, ["nullifier"])).nullifier; + console.log("\x1b[34m%s\x1b[0m", "nullifier", nullifier); const commitment_circom = (await circuit.getOutput(w, ["commitment"])).commitment; - console.log("commitment_circom", commitment_circom) + console.log("\x1b[34m%s\x1b[0m", "commitment", commitment_circom); const blinded_dsc_commitment = (await circuit.getOutput(w, ["blinded_dsc_commitment"])).blinded_dsc_commitment; - console.log("blinded_dsc_commitment", blinded_dsc_commitment) + console.log("\x1b[34m%s\x1b[0m", "blinded_dsc_commitment", blinded_dsc_commitment); const mrz_bytes = packBytes(inputs.mrz); const commitment_bytes = poseidon6([ @@ -78,8 +74,8 @@ describe("Circuits - sha256WithRSAEncryption_65537 Register flow", function () { mrz_bytes[2] ]); const commitment_js = commitment_bytes.toString(); - console.log('commitment_js', commitment_js) - console.log('commitment_circom', commitment_circom) + //console.log('commitment_js', commitment_js) + //console.log('commitment_circom', commitment_circom) expect(commitment_circom).to.be.equal(commitment_js); }); @@ -122,17 +118,4 @@ describe("Circuits - sha256WithRSAEncryption_65537 Register flow", function () { } }); - // it("should fail to calculate witness with invalid merkle root", async function () { - // try { - // const invalidInputs = { - // ...inputs, - // merkle_root: inputs.merkle_root.map((byte: string) => String((parseInt(byte, 10) + 1) % 256)), - // } - // await circuit.calculateWitness(invalidInputs); - // expect.fail("Expected an error but none was thrown."); - // } catch (error) { - // expect(error.message).to.include("Assert Failed"); - // } - // }); - }); \ No newline at end of file diff --git a/circuits/test/register_sha256_rsassapss.test.ts b/circuits/tests/register/register_sha256_rsapss.test.ts similarity index 70% rename from circuits/test/register_sha256_rsassapss.test.ts rename to circuits/tests/register/register_sha256_rsapss.test.ts index e478cdaf..5db56231 100644 --- a/circuits/test/register_sha256_rsassapss.test.ts +++ b/circuits/tests/register/register_sha256_rsapss.test.ts @@ -3,22 +3,24 @@ import { assert, expect } from 'chai' import path from "path"; const wasm_tester = require("circom_tester").wasm; import { poseidon1, poseidon6 } from "poseidon-lite"; -import { mockPassportData_sha256WithRSASSAPSS_65537 } from "../../common/src/utils/mockPassportData"; -import { generateCircuitInputsRegister } from '../../common/src/utils/generateInputs'; -import { getLeaf } from '../../common/src/utils/pubkeyTree'; -import { packBytes } from '../../common/src/utils/utils'; -import { k_dsc, n_dsc } from '../../common/src/constants/constants'; +import { mockPassportData_sha256_rsapss_65537 } from "../../../common/src/constants/mockPassportData"; +import { generateCircuitInputsRegister } from '../../../common/src/utils/generateInputs'; +import { getLeaf } from '../../../common/src/utils/pubkeyTree'; +import { packBytes } from '../../../common/src/utils/utils'; -describe("Proof of Passport - Circuits - RSASSAPSS", function () { +describe("Register - SHA256 RSASSAPSS", function () { this.timeout(0); let inputs: any; let circuit: any; - let passportData = mockPassportData_sha256WithRSASSAPSS_65537; + let passportData = mockPassportData_sha256_rsapss_65537; + const attestation_name = "E-PASSPORT"; let attestation_id: string; + const n_dsc = 64; + const k_dsc = 32; before(async () => { circuit = await wasm_tester( - path.join(__dirname, "../circuits/register_sha256WithRSASSAPSS_65537.circom"), + path.join(__dirname, "../../circuits/register/register_sha256WithRSASSAPSS_65537.circom"), { include: [ "node_modules", @@ -30,21 +32,18 @@ describe("Proof of Passport - Circuits - RSASSAPSS", function () { ); const secret = BigInt(Math.floor(Math.random() * Math.pow(2, 254))).toString(); - console.log("secret", secret); - - const attestation_name = "E-PASSPORT"; + const dscSecret = BigInt(Math.floor(Math.random() * Math.pow(2, 254))).toString(); attestation_id = poseidon1([ BigInt(Buffer.from(attestation_name).readUIntBE(0, 6)) ]).toString(); inputs = generateCircuitInputsRegister( secret, - BigInt(0).toString(), + dscSecret, attestation_id, passportData, - 64, - 32, - [passportData], + n_dsc, + k_dsc ); }); @@ -59,9 +58,12 @@ describe("Proof of Passport - Circuits - RSASSAPSS", function () { console.timeEnd('calculateWitness') await circuit.checkConstraints(w); - console.log("nullifier", (await circuit.getOutput(w, ["nullifier"])).nullifier); - + const nullifier = (await circuit.getOutput(w, ["nullifier"])).nullifier; + console.log("\x1b[34m%s\x1b[0m", "nullifier", nullifier); const commitment_circom = (await circuit.getOutput(w, ["commitment"])).commitment; + console.log("\x1b[34m%s\x1b[0m", "commitment", commitment_circom); + const blinded_dsc_commitment = (await circuit.getOutput(w, ["blinded_dsc_commitment"])).blinded_dsc_commitment; + console.log("\x1b[34m%s\x1b[0m", "blinded_dsc_commitment", blinded_dsc_commitment); const mrz_bytes = packBytes(inputs.mrz); const commitment_bytes = poseidon6([ @@ -77,8 +79,8 @@ describe("Proof of Passport - Circuits - RSASSAPSS", function () { mrz_bytes[2] ]); const commitment_js = commitment_bytes.toString(); - console.log('commitment_js', commitment_js) - console.log('commitment_circom', commitment_circom) + //console.log('commitment_js', commitment_js) + //console.log('commitment_circom', commitment_circom) expect(commitment_circom).to.be.equal(commitment_js); }); @@ -121,17 +123,4 @@ describe("Proof of Passport - Circuits - RSASSAPSS", function () { } }); - it("should fail to calculate witness with invalid merkle root", async function () { - try { - const invalidInputs = { - ...inputs, - merkle_root: inputs.merkle_root.map((byte: string) => String((parseInt(byte, 10) + 1) % 256)), - } - await circuit.calculateWitness(invalidInputs); - expect.fail("Expected an error but none was thrown."); - } catch (error) { - expect(error.message).to.include("Assert Failed"); - } - }); - }); \ No newline at end of file diff --git a/circuits/test/Mgf1_sha256.test.ts b/circuits/tests/utils/Mgf1_sha256.test.ts similarity index 100% rename from circuits/test/Mgf1_sha256.test.ts rename to circuits/tests/utils/Mgf1_sha256.test.ts diff --git a/circuits/test/is_older_than.test.ts b/circuits/tests/utils/is_older_than.test.ts similarity index 98% rename from circuits/test/is_older_than.test.ts rename to circuits/tests/utils/is_older_than.test.ts index 80f26a72..7926a418 100644 --- a/circuits/test/is_older_than.test.ts +++ b/circuits/tests/utils/is_older_than.test.ts @@ -65,7 +65,7 @@ describe('DateIsLessChecker Circuit Test', function () { before(async () => { circuit = await wasm_tester( - path.join(__dirname, '../circuits/tests/isOlderThan_tester.circom'), + path.join(__dirname, '../../circuits/tests/utils/isOlderThan_tester.circom'), { include: [ "node_modules", diff --git a/circuits/test/is_valid.test.ts b/circuits/tests/utils/is_valid.test.ts similarity index 98% rename from circuits/test/is_valid.test.ts rename to circuits/tests/utils/is_valid.test.ts index 1509bf78..06bf78a1 100644 --- a/circuits/test/is_valid.test.ts +++ b/circuits/tests/utils/is_valid.test.ts @@ -64,7 +64,7 @@ describe('DateIsLessChecker Circuit Test', function () { before(async () => { circuit = await wasm_tester( - path.join(__dirname, '../circuits/tests/isValid_tester.circom'), + path.join(__dirname, '../../circuits/tests/utils/isValid_tester.circom'), { include: [ "node_modules", diff --git a/circuits/tests/utils/rsa_verifier.test.ts b/circuits/tests/utils/rsa_verifier.test.ts new file mode 100644 index 00000000..ed10a952 --- /dev/null +++ b/circuits/tests/utils/rsa_verifier.test.ts @@ -0,0 +1,87 @@ +import { expect } from 'chai'; +import { X509Certificate } from 'crypto'; +import path from 'path'; +import { getCSCAInputs, getTBSHash } from '../../../common/src/utils/csca'; +const wasm_tester = require("circom_tester").wasm; +import forge from 'node-forge'; + +import { mock_dsc_sha256_rsa_2048, mock_csca_sha256_rsa_2048, mock_dsc_sha1_rsa_2048, mock_csca_sha1_rsa_2048 } from '../../../common/src/constants/mockCertificates'; + +function loadCertificates(dscCertContent: string, cscaCertContent: string) { + const dscCert = new X509Certificate(dscCertContent); + const cscaCert = new X509Certificate(cscaCertContent); + const dscCert_forge = forge.pki.certificateFromPem(dscCertContent); + const cscaCert_forge = forge.pki.certificateFromPem(cscaCertContent); + + return { dscCert, cscaCert, dscCert_forge, cscaCert_forge }; +} + +describe('RSA Verifier', function () { + this.timeout(0); + let circuit; + + this.beforeAll(async () => { + const circuitPath = path.resolve(__dirname, '../../circuits/tests/utils/rsa_verifier.circom'); + circuit = await wasm_tester( + circuitPath, + { + include: [ + "node_modules", + "./node_modules/@zk-kit/binary-merkle-root.circom/src", + "./node_modules/circomlib/circuits" + ] + } + ); + }); + describe('Circuit', () => { + it('should compile and load the circuit', () => { + expect(circuit).not.to.be.undefined; + }); + }); + + describe('SHA-256 certificates', async () => { + const { dscCert, cscaCert, dscCert_forge, cscaCert_forge } = loadCertificates(mock_dsc_sha256_rsa_2048, mock_csca_sha256_rsa_2048); + + it('should verify DSC has been signed by the CSCA', () => { + const isVerified = dscCert.verify(cscaCert.publicKey); + console.log(`SHA-256 DSC certificate verification result: ${isVerified}`); + expect(isVerified).to.be.true; + }); + + it('should extract and log certificate information', async () => { + const csca_inputs = getCSCAInputs("0", dscCert_forge, cscaCert_forge, 64, 32, 64, 32, 2048, true); + const tbsCertificateHashFormatted = getTBSHash(dscCert_forge, 'sha256'); + + const inputs = { + "message": tbsCertificateHashFormatted, + "signature": csca_inputs.dsc_signature, + "modulus": csca_inputs.csca_modulus + } + const witness = await circuit.calculateWitness(inputs, true); + }); + }); + + describe('SHA-1 certificates', () => { + const { dscCert, cscaCert, dscCert_forge, cscaCert_forge } = loadCertificates(mock_dsc_sha1_rsa_2048, mock_csca_sha1_rsa_2048); + + it('should verify DSC has been signed by the CSCA', () => { + const isVerified = dscCert.verify(cscaCert.publicKey); + console.log(`SHA-1 DSC certificate verification result: ${isVerified}`); + expect(isVerified).to.be.true; + }); + /// TODO: Use SHA1RSA verifier circuit (won't work either case because of padding) + // it('should extract and log certificate information', async () => { + // const csca_inputs = getCSCAInputs("0", dscCert_forge, cscaCert_forge, 64, 32, 64, 32, 2048, true); + // const tbsCertificateHashFormatted = getTBSHash(dscCert_forge, 'sha1'); + + // const inputs = { + // "message": tbsCertificateHashFormatted, + // "signature": csca_inputs.dsc_signature, + // "modulus": csca_inputs.csca_modulus + // } + // console.log("final inputs: ", inputs); + // const witness = await circuit.calculateWitness(inputs, true); + // console.log(witness); + // }); + }); +}); \ No newline at end of file diff --git a/circuits/yarn.lock b/circuits/yarn.lock index 45e177ea..e96c0586 100644 --- a/circuits/yarn.lock +++ b/circuits/yarn.lock @@ -584,6 +584,22 @@ arrify@^1.0.0: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +asn1@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +asn1js@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" + integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== + dependencies: + pvtsutils "^1.3.2" + pvutils "^1.1.3" + tslib "^2.4.0" + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -1435,6 +1451,11 @@ js-yaml@4.1.0: dependencies: argparse "^2.0.1" +jsbn@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -1599,6 +1620,13 @@ mocha@^10.3.0: yargs-parser "20.2.4" yargs-unparser "2.0.0" +modpow@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/modpow/-/modpow-1.0.0.tgz#377e5541472e855c82d733c551294da74ecfe73d" + integrity sha512-ohpGZH3RvdiZ6BPmjbMa1jqnDjwS0s+u0a6Tb2CiJUPkOR5cNIZRdhwmUwxqaOp2GTDJmO4OIsBqm553PfQo3w== + dependencies: + jsbn "^0.1.0" + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -1624,6 +1652,10 @@ node-forge@^1.3.1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== +"node-forge@https://github.com/remicolin/forge": + version "1.3.2-0" + resolved "https://github.com/remicolin/forge#17a11a632dd0e50343b3b8393245a2696f78afbb" + node-gyp-build@^4.2.2: version "4.8.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" @@ -1712,6 +1744,18 @@ psl@^1.9.0: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +pvtsutils@^1.3.2: + version "1.3.5" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910" + integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== + dependencies: + tslib "^2.6.1" + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== + r1csfile@0.0.41, r1csfile@^0.0.41: version "0.0.41" resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.41.tgz#e3d2709d36923156dd1fc2db9858987b30c92948" @@ -1772,7 +1816,7 @@ safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -1978,6 +2022,11 @@ tsconfig-paths@^3.5.0: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@^2.4.0, tslib@^2.6.1: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" diff --git a/common/package.json b/common/package.json index 84173875..cb206776 100644 --- a/common/package.json +++ b/common/package.json @@ -4,16 +4,19 @@ "@zk-kit/imt": "https://gitpkg.now.sh/0xturboblitz/zk-kit/packages/imt?6d417675", "@zk-kit/lean-imt": "^2.0.1", "asn1.js": "^5.4.1", + "elliptic": "^6.5.5", "fs": "^0.0.1-security", "js-sha1": "^0.7.0", "js-sha256": "^0.10.1", "js-sha512": "^0.9.0", + "json-to-ts": "^2.1.0", "jsrsasign": "^11.1.0", - "node-forge": "^1.3.1", + "node-forge": "https://github.com/remicolin/forge", "path": "^0.12.7", - "poseidon-lite": "^0.2.0" + "poseidon-lite": "^0.2.0", + "typescript-parser": "^2.6.1" }, "devDependencies": { "@types/node-forge": "^1.3.10" } -} +} \ No newline at end of file diff --git a/common/pubkeys/serialized_csca_tree.json b/common/pubkeys/serialized_csca_tree.json index 094e5a8c..65f47c67 100644 --- a/common/pubkeys/serialized_csca_tree.json +++ b/common/pubkeys/serialized_csca_tree.json @@ -1 +1 @@ -[["8691474413369666750892234614358820289658368726857552974633024543804680298964","17496320222604434917256246718514403734235740171188912286919341525891256570713","20717661531343094401419404535005724208121214979487601078059038701197331043233","8338161038189752845969324086767343943203808400163733790574844916777622907526","2244871586170865025448272825497968057027141766617969218599365252909572535577","3608626711809097355394527544415447989465407554113965209630262872975367728702","15123415314399351471075303556718608687323785898137080424470982286311735782352","712912966757927878965693240425422971881715436008090497769457122872348343952","3196185115626403769090812264110127828126981872545481387659039004737077237629","20852945694892786589706882486760988740184637230152727898060254427102399724085","663438552256433061576054140809160443818506164632349621099807794702352080693","18682912995789016595436882433435139159334702280353629213700041190405671371221","954361121666374676317512516553835448496801654442662842741750447529976221096","15976568257028838086904371689993285445196617581672212770040719579976951713437","1689709601556268020419125248006910470935068691712645256591639741945971733744","1644637032401895183536122531980635414363418149797237304436572320773189961342","10530161321691746280687450853188873346740398773252979676317929677235626245235","2628389834360132333366589026387003814868457686372552787974500759887369913155","20551785199765572414957755636883446606643894289625551996383687264006196444272","14647299140966795168634863382011786101084247791740654785196548451662948086183","17547875379231708590555723879540779728666475590929028917859771769395698401715","4087977103445290602464010775212316926483391914870441578758042979308767270230","6714269803293029270909153658663808588557387497502190042744619007611526657435","21829614378897985584789450465826668649930021698690579364831443823904306431333","7532552732354833964818948844447124010555621930545046129036742684162649680796","3085746588958121678695340573755073635811671969466202529706243909144419544906","15358264232435244032159222413023294519420811338021914047216004862176094578703","274618135907332659550125464790981847888019268634834758638296553463810383811","3145275707337847188939353064357731848534516166917140907835781738084777990262","712912966757927878965693240425422971881715436008090497769457122872348343952","21219905789358323534478545279193723251420616841556623254711235028135342626157","9798324625310926002331408522163043190724749435063160272808536376189654148756","13582411668238263333995209483029305625601807569534701653376051071840372484093","15950000082544045394526115523741159615348156864031044224172890462894241606231","5992148578777868893458748144399130666011631987544731979896999269126511048457","5001232371587577350490476563931715794477203224577970619789108259266886603950","17806353473562524209419921489674020711603878477377228029846764687154796899291","4781857348503260904895922377303003708601361291248025972804843818012461675526","19725005896671978040083076043827582994250733273969992727037910840857608608713","6771553323761092017375937072638415166675529808942268574147258168001934888920","6072598916249169136908315542430764263321939399814654522032874918790340778554","17174337625009122870708859925793325997946378966416309900853757797594910229791","2191847811950210640312799119786838991241770048511678287834866005381831304252","5556089667073477529764323892046529774877491089381310117639628299653468438238","5512523756717871023776497641942984346783337720501449614794308618170512394669","12964734676293244153748554238028206801414195417901916061140401142888712380451","2972653442760058165486608510571475869094354178867521177094553776876904654370","19617883112060216036437373002520931262578741557295904537678304364166866283129","1175039218798484980072399121924972057008410392367959450703939688306902524054","10396745429499812151132429056797671842807735536621273702194009800176056286117","21829614378897985584789450465826668649930021698690579364831443823904306431333","232738545482017472261496633286350972128632187612854220178426602649221258372","12964734676293244153748554238028206801414195417901916061140401142888712380451","3085746588958121678695340573755073635811671969466202529706243909144419544906","19569641468295105160418177740024945517842897645468872356974690513927041995987","13682529409340978640466595260264374070197250456280851982310079893206859446095","5864324965287761028896843934748795289028753931353130557439328109628025948300","18638025629280224617790168906173435277703684091772827588468099812026035539738","2194543658437125198357587946021311492689377172643668551084193961108304747785","21593921076086949669297200034323757069358367209393924460563276537349356681008","15613087414575084731294247924061147534041250959429049604445183368849211416480","21876658378266334569964380224531738829113969654886515172706825001082187941302","17603178439634188462056825952489860474722953595745235452510670608903852152095","18820995668034441064481786413532066855976405414499761311120499699159123037823","6071932171386993614931179655729818150534845046202199448265558256519848482826","10847231218503195759517071138679051602730407167074172266742227045164609231885","14506356872966117174131859847846372170262756655915924664237877294288585233653","5157851077382368258831146921235005863841873179959407293372390317913027109941","17215740096130814160671394963439750791336311297216240493968557475671940055057","7236783279316083836339480995960834633270959028443867776543135480683166923869","11398194787838497782166425813926171378663319996243937443066049287231892201563","8461890310516914992976016102786941165050457592527945955052989873762315959085","20131832673266427475769741534309108541338301173662948074665588100934145363162","13025268118387164480802803485697296266258675734062176433653116451463846209082","2959389974566411083204235326117036516979963119227951085034972251184734179290","9377958456884255467194088716477119239642797045077236472356953540022684583149","16698515797824680501871676266202253211872118899888285886412000454073141450701","15798767315325760489132964686987872692994717940925570238047784420230331193585","4781857348503260904895922377303003708601361291248025972804843818012461675526","12671050201903040870132377617509218353339866159494336831034048382615639662347","16118914885963834916174025584295786549597018616252080891215345608189775067017","1287880180407310800601651110405671450334122951893361316992545024696018620127","11275609334870619778800915975797190217946752952900097800029716348347769743557","4549806302643127256376053744839835469729529127535077121646524402308295761124","12385792108167898834965686312817629786971321080122734283967136719015404659574","19645303799442917520263849382981918648525479954858046014781621457535223129139","13079036262723496487062341719232498854721623596427562123822257284722043022380","7815052247860712154170106628650576750781240048309328607812510735568644480099","4224433012242275812105292037318388809660019851311870694425205064696802439276","20769202337427957655670745571969974320407145254685594108329805885177108459406","5864324965287761028896843934748795289028753931353130557439328109628025948300","1194604146042048350003512364693260099917768421477389239935129766419846021985","20342168169457748695802149508674862964537074611245094862559628187033717475867","9612640678039527906483661330640693201947160578570955411180830848021191312999","20227979332701217082249100988795416872480735366357703927751699407575642930935","5568143431214976639464768845659406494667053581733825380813024891527928235568","3208479846365475237410989805061539106045403260781956346764317556860566259416","1533174095932179741832085722978096451211273368734335528806856805965059178550","15214427790517490141925325587797963249335567355213168373025412405634050937481","13602826144456356860284419687170541618185281374064216815711251835821492025702","946455194947827940337729236114480813870835673647234481151109602462556270766","10530161321691746280687450853188873346740398773252979676317929677235626245235","20551785199765572414957755636883446606643894289625551996383687264006196444272","17492490034871188503809070393464727304143828491765350693224566925126105199911","5627116488283442946557217209333347313412518163016066550539282920861053074060","7628458932936495764524142429747955579001667142208907050372858225989514457008","13545244560072730176162896504690392106112168077747273393293519829141026712654","9197800054380533439556389025741028642781611147489934915217537670356117734985","19725005896671978040083076043827582994250733273969992727037910840857608608713","13597601271430461916896612582648919742272715556061113046784825140314498905478","13382473425074121858735590469120000769886230357897236331156422982819803288928","12439760546784082202871583401234733990044187602943315324169379543365738178519","5758137506105103459826998865197780898444584232351877574052188955203596737799","8370264878441063630462671051957262849187564367781659467838460782939804026447","17368028902269277465024746642764987612414033705161996149238721534130490186941","946455194947827940337729236114480813870835673647234481151109602462556270766","10782746953492500078751030180163064462657489179646951793154413574373371915628","4574759938850684302328171377919788556520857555728298495027674689330859913909","712912966757927878965693240425422971881715436008090497769457122872348343952","2483126835964394240864276692792992171095811055349556498083468949709404323305","2235150263865959136421726440400433738501848129328010009098035293276672220717","5469955587383559828097756439479681402770241102946573149636380518729022833750","9612640678039527906483661330640693201947160578570955411180830848021191312999","7135473937218111453151804646361837547205712024569546168416088861245626015030","9197800054380533439556389025741028642781611147489934915217537670356117734985","8177887533556223950928671845738575508418213402039951309409853690924708882619","1644637032401895183536122531980635414363418149797237304436572320773189961342","2235150263865959136421726440400433738501848129328010009098035293276672220717","19402903568454754777700416991856190103205898202952506192755702018138164903780","663438552256433061576054140809160443818506164632349621099807794702352080693","15776280343411227095808521568994471614057167432416502119979098996603887292938","12313143896208759390351526641510039095883815550699902043061685514584813600074","1218928037268356033769144531312651840516937586618523437511091378414585873142","9011100725723069477052917523444280437831907181043987084639300263089606956420","8082817983718546987105551276971252463934917335856558917892075900846966350585","17744796207881002836361754172345756972108243302293817629307470887005013537965","10909054529489265328197617859427892180031815470826676417637937142527343355023","20551785199765572414957755636883446606643894289625551996383687264006196444272","2676613676733015431959147577385543530164186971614056775227705172064306807928","15776564956440002895136116449299582951656581983212117550232796150916571692055","11412740120827044021870096407623293808851105071188140591919788265312361814171","3885925135313023686150115977607110368258492435636819989794778250027419367343","1440944398068243290019815197893325790869382856018839453050014183551865062018","18707594353877082516395132272698629627555807696619350634836774054442394671010","19750715061039895092288075649509657235159241403400837501090850293666251108617","16411233008444850443854175483761516668813055344878151975436424201109266465436","966676739412114459004685599806372707037105104204243310754946364190002350899","17496320222604434917256246718514403734235740171188912286919341525891256570713","4224433012242275812105292037318388809660019851311870694425205064696802439276","15976978918004336355901319629352200911328902990447017277673724626919242812955","16226984168490080400263373201570728966749962184950889718917387268203884202372","1071564318326244075341980988866027669737011601498674724527637774926288977632","20769202337427957655670745571969974320407145254685594108329805885177108459406","2967213245998332384543885104754783540899439580884490432048984202068901705944","20769202337427957655670745571969974320407145254685594108329805885177108459406","1828058457773990843551157525432867662470301272599690050907371698799750907039","21451388112829145060821974036366132513327328641208732802166144524686108831760","21219905789358323534478545279193723251420616841556623254711235028135342626157","5001232371587577350490476563931715794477203224577970619789108259266886603950","6540725658063818695836967143056666761434297658403942276316050979804587769432","9377958456884255467194088716477119239642797045077236472356953540022684583149","4224433012242275812105292037318388809660019851311870694425205064696802439276","20452154666799846638117791929900707763485919083101449648262816499313176812803","2191847811950210640312799119786838991241770048511678287834866005381831304252","8491224372742742395086082981236389730604525807576141462195229766319454932167","5512523756717871023776497641942984346783337720501449614794308618170512394669","20717661531343094401419404535005724208121214979487601078059038701197331043233","2476324937951789382181944025361875851099988750579823474754609765481889757439","19356492332655108003949429792555441845806681675195402015185308983898801715851","2967213245998332384543885104754783540899439580884490432048984202068901705944","5055315503098445594062335518727177962919913361908453398984787599226169183337","17492490034871188503809070393464727304143828491765350693224566925126105199911","14027649325388708488081280969586205626278814303627295953445422182588276435572","13465227484584385300386574818824135648806878577862587385005638292079537592144","12385792108167898834965686312817629786971321080122734283967136719015404659574","21267939098918134027395634942102971885281982111723141238850772621986256662900","17496320222604434917256246718514403734235740171188912286919341525891256570713","11433874323428772158013095381623924200138375055456955808189877801771380225552","15618359152517208456698312197785172766694127619077536561902714697931530755106","2628389834360132333366589026387003814868457686372552787974500759887369913155","2027121307515028227361803453971004574835283397634149795685942874063731877044","1758371485945815703876679445382538767819559386912271388124907980130004330353","712912966757927878965693240425422971881715436008090497769457122872348343952","9296362220804925104551234752226384203979024033236205671428676015277866160513","3099260939107709193833554073787772569345965287506676970762153917208260772189","21219905789358323534478545279193723251420616841556623254711235028135342626157","3099260939107709193833554073787772569345965287506676970762153917208260772189","15976568257028838086904371689993285445196617581672212770040719579976951713437","6540725658063818695836967143056666761434297658403942276316050979804587769432","663438552256433061576054140809160443818506164632349621099807794702352080693","8140644209065967749731539711645757673629321017919126168806710308878873241272","4655594634855844188499094340496759182976213206849235604185854128079411962453","13216746424486872049443607565713997095923431379037310625593547838968801990450","5512523756717871023776497641942984346783337720501449614794308618170512394669","10286727453332438406648583236643277009562092681643525436851770105870834802875","5835554999819330558954089066526405560740259616473885793288693915684399039377","2235150263865959136421726440400433738501848129328010009098035293276672220717","13602826144456356860284419687170541618185281374064216815711251835821492025702","3117586190657126472592128104269081184451127080527182054370687640020932637738","16961794929940055505618937273665830834556517799613603503371462732255229717698","20717661531343094401419404535005724208121214979487601078059038701197331043233","3054509086575963631520633315863182977708152785332183337259997415160907095845","15718330550508436908559701395606414201668068552693146421627683872153427960853","4363738634465882118172307854104596042899685656091037340905869811610138317347","3295533384340596604465346018013602551881861893498794970313069368600968766409","4549806302643127256376053744839835469729529127535077121646524402308295761124","5836322900178474894684749559174625794931606932780001961547616477680042620058","7986666009024332686676662864413304092722307894727965157582073398188685188596","8332725882597643046230446607227878580859441724564830732217655474732342787381","13605376995820845471499102796322549845207296468035227481017989756087418839900","12155172322986237416023663042004942352608253176870958535098713267207721181883","18703989514997223432661641229861332310348080898339160493229575272467603319271","12144047841603136900258834238679736103499067068658592153906655837799171705427","11964978685770609938104516880584559743324134082109819132572992701951308097934","1336458066220344521262880797524303149688311982013949559764047883761889898074","7567096820715495523465831195561335361495276610103173418515651874250913956034","16698515797824680501871676266202253211872118899888285886412000454073141450701","760526239526750316156895532664638087659951808341490670841188720735038667373","17806353473562524209419921489674020711603878477377228029846764687154796899291","13605376995820845471499102796322549845207296468035227481017989756087418839900","663438552256433061576054140809160443818506164632349621099807794702352080693","14057612694744022955506885004102834629754310001978602939456750538201073114431","21536244638197709025858135955699906074571886472797743044193407266270319669578","10940448732886105987570056589646710210974129839416224393729741337643229924295","2483126835964394240864276692792992171095811055349556498083468949709404323305","9612640678039527906483661330640693201947160578570955411180830848021191312999","15613087414575084731294247924061147534041250959429049604445183368849211416480","16411233008444850443854175483761516668813055344878151975436424201109266465436","20350757034998523187334178209550008366903662221355109911310833181698841320621","4574759938850684302328171377919788556520857555728298495027674689330859913909","1346980346605447755534859795013475283788975200653900831883060614677761712111","14662264414119036690282405601089929177544253624404097884734013101529582623919","5469955587383559828097756439479681402770241102946573149636380518729022833750","17421378063295915427159454374242321672486103038225921418122357124853338152435","11412740120827044021870096407623293808851105071188140591919788265312361814171","7471975174935772955134792946513424637999023861300940920934522552454330255354","13246300932955054699896499534663439333337260302838301416472718244977767210668","1703815020768376381115674913114725195497281256588197804868422201697152023777","3085746588958121678695340573755073635811671969466202529706243909144419544906","7236783279316083836339480995960834633270959028443867776543135480683166923869","13582411668238263333995209483029305625601807569534701653376051071840372484093","4754713757431627318482916888231215818599754770670360377946229107868340173565","4224433012242275812105292037318388809660019851311870694425205064696802439276","3196185115626403769090812264110127828126981872545481387659039004737077237629","3449083258780223991632112868061903902820017044757095982070790181182597682266","6398900866082970916513845909030912477768318655743785125093873617319711480497","1175039218798484980072399121924972057008410392367959450703939688306902524054","5210257615122466358421406540799898540909863599743777249997433762286779163631","143871243170896096761286538359612900806921859208087130133106251324625818743","7825186589955157383712635126647794282971185739134506671734682703198205174921","19356492332655108003949429792555441845806681675195402015185308983898801715851","5469955587383559828097756439479681402770241102946573149636380518729022833750","9301724904566173478342992350770203303162818770127169929361533578664506545066","14144040826170485243395777956417332299961240009335454448818306795274079743482","15106671954584442557442200864211260493785606980074399349847632055753054483078","18869217976653672070772236404509215919650604056214055814018794444287298958040","11645420524832783721170737438334136629636818531954268745339783028025385754950","13439261978972035796996150244149252173133297973805089227133789936712760569803","15106671954584442557442200864211260493785606980074399349847632055753054483078","5512523756717871023776497641942984346783337720501449614794308618170512394669","5835554999819330558954089066526405560740259616473885793288693915684399039377","8863131691935358314236967173935315033413820679736774627121405457433895003795","17806353473562524209419921489674020711603878477377228029846764687154796899291","12688265548305129213524123982283433383136772509110047948234368697335124109577","18207961221628464226564927736506330628717051411055463190287553801949660581016","14776577580296682191308190812580888360497977691535016054206068797647787496417","2716120769329705626706313807317151735273953258897025678161053651818357382993","946455194947827940337729236114480813870835673647234481151109602462556270766","614966471251760438899692967903400348852862620490339206898848861882544111046","4116036656616283014460785251860209028828407967565755603300238819653622156901","10847231218503195759517071138679051602730407167074172266742227045164609231885","20895602419903453398196391913478058693274453903342785067983129839552891433864","15689970856593006158259892732288646993746887463514406392254922588756401796606","7408129850262826909244224402840856032373035919586685754734550738382550518934","16954193412688439955632320517883969169462813275902648614432177779074490622129","10822341224343704549832157601167511762192217681493597414750548578356092990059","18869217976653672070772236404509215919650604056214055814018794444287298958040","12998359993404137434826050598531205936631009536891015167391276398139095697469","712912966757927878965693240425422971881715436008090497769457122872348343952","12439760546784082202871583401234733990044187602943315324169379543365738178519","4933182101183318250560018811514844142859815227384938275570441539742336262480","5519776064110123180759081312729047106292930891845193268609251880658830705433","11964978685770609938104516880584559743324134082109819132572992701951308097934","20852945694892786589706882486760988740184637230152727898060254427102399724085","5157851077382368258831146921235005863841873179959407293372390317913027109941","3885925135313023686150115977607110368258492435636819989794778250027419367343","1632500423430879870300869265124598190896358768919584266600939773214617936900","16480089772180635258030461748402564771495064968752027484874049433567638476934","946455194947827940337729236114480813870835673647234481151109602462556270766","15718330550508436908559701395606414201668068552693146421627683872153427960853","10646102197739219326084794742182482777338903912449154661603058840745258963379","1570274245034538183221128634382794417097801245857820047802724595210806628688","9147263785534267636687968913589685560505104267741632426978703854622278136991","614966471251760438899692967903400348852862620490339206898848861882544111046","5566832184094895187524267067093217754199394279599836592480486864883149893031","7135473937218111453151804646361837547205712024569546168416088861245626015030","946455194947827940337729236114480813870835673647234481151109602462556270766","4087977103445290602464010775212316926483391914870441578758042979308767270230","16137218824867518993112176330612823176216439366022687220615937652371635085247","1703815020768376381115674913114725195497281256588197804868422201697152023777","1175039218798484980072399121924972057008410392367959450703939688306902524054","11412740120827044021870096407623293808851105071188140591919788265312361814171","12271983753113042626833634560364485293486763667349863253834100408006012012338","954361121666374676317512516553835448496801654442662842741750447529976221096","5519776064110123180759081312729047106292930891845193268609251880658830705433","19645303799442917520263849382981918648525479954858046014781621457535223129139","15546540006815490057793129658556841909859473017172875226825092156274503806084","16664225501027310427143425928031114680302400010653769373062555871803572912785","12964734676293244153748554238028206801414195417901916061140401142888712380451","1644637032401895183536122531980635414363418149797237304436572320773189961342","14588408860702774403040643085023102427643318176411097113905533342239652444746","17806353473562524209419921489674020711603878477377228029846764687154796899291","3401355104414210656254289265060762447824858847649022703190474278352208416173","15455768567639248552871867295320669874358209402041404093780654826364925510661","18869217976653672070772236404509215919650604056214055814018794444287298958040","13605376995820845471499102796322549845207296468035227481017989756087418839900","20663699746183765412904432768074062935933374627665221119822945660203712880745","1454875708970600335304126262767303975870655905960512436254375545925577328692","16954193412688439955632320517883969169462813275902648614432177779074490622129","20895602419903453398196391913478058693274453903342785067983129839552891433864","4933182101183318250560018811514844142859815227384938275570441539742336262480","1336458066220344521262880797524303149688311982013949559764047883761889898074","12984040983088595314698866307930588700679289984810017049345447973409490678089","10847231218503195759517071138679051602730407167074172266742227045164609231885","7236783279316083836339480995960834633270959028443867776543135480683166923869","12180564838572574785577178844314834812952191421495899999848160514539788519817","12600480540100512777695577363859185402126112711196993279255107913533806514345","18207961221628464226564927736506330628717051411055463190287553801949660581016","3401355104414210656254289265060762447824858847649022703190474278352208416173","4116036656616283014460785251860209028828407967565755603300238819653622156901","12863950582730082046148154608075135240263800483912187224256340414612337617318","3054509086575963631520633315863182977708152785332183337259997415160907095845","6714269803293029270909153658663808588557387497502190042744619007611526657435","163072371065782787415009910882963726380729563508259100978084406744617596229","18124161608764573031181181091746932116602343523449108232131693108002812215595","17698177298685528128465298198488735273578406532961103401549266592203987353446","1071564318326244075341980988866027669737011601498674724527637774926288977632","19883029896859112110244432872192403645617916717981765942483639413786774824574","12155172322986237416023663042004942352608253176870958535098713267207721181883","19375155383395696510967115781488322005907183312666977471331313827828265655931","12863950582730082046148154608075135240263800483912187224256340414612337617318","19470438559791413810807322334940256814752303267756345670901343982529444306002","4754713757431627318482916888231215818599754770670360377946229107868340173565","3196185115626403769090812264110127828126981872545481387659039004737077237629","11412740120827044021870096407623293808851105071188140591919788265312361814171","21876658378266334569964380224531738829113969654886515172706825001082187941302","9888239978634522925223196837194242311545989047209631150312165940305433080157","20342168169457748695802149508674862964537074611245094862559628187033717475867","6267275553024510648754807709238333654138152587130901210611391956543755030870","14535184095124950892028872912364622595212286520594227957147431032075397154266","2244871586170865025448272825497968057027141766617969218599365252909572535577","3117586190657126472592128104269081184451127080527182054370687640020932637738","18638025629280224617790168906173435277703684091772827588468099812026035539738","13602826144456356860284419687170541618185281374064216815711251835821492025702","19136646515076729474266957823959601106059804333394786210644361751043819130428","4006308849281273792274000957432061207143923231283130218997109288816872164471","4866442763557448299456393930665252678199356968867077785577776954873671002076","5523494911625033531158591406744208675721214018061290251579858790908546943321","14262959519701291686797273506458134133352406025405884284959025726384935370757","15798767315325760489132964686987872692994717940925570238047784420230331193585","6585682031650501777630925238370902100450071127640040426788913175433490518990","19569641468295105160418177740024945517842897645468872356974690513927041995987","19617883112060216036437373002520931262578741557295904537678304364166866283129","20717661531343094401419404535005724208121214979487601078059038701197331043233","15356303677036047765901840442430056519915375782726231750029051083606835464886","18869217976653672070772236404509215919650604056214055814018794444287298958040","19645303799442917520263849382981918648525479954858046014781621457535223129139","16614048991075038030789399956909315351324595917053714063050624141460033937444","614966471251760438899692967903400348852862620490339206898848861882544111046","4099531615762313645664270695169451400067010667159453849071079869270467331430","1336458066220344521262880797524303149688311982013949559764047883761889898074","374196098865630209786313311346578647643865900042267366994874073365518434467","9141525190254519952022341797682038597679704914972221193906068133244136674784","12964734676293244153748554238028206801414195417901916061140401142888712380451","3449083258780223991632112868061903902820017044757095982070790181182597682266","1218928037268356033769144531312651840516937586618523437511091378414585873142","17639609723574756459891329821328819780244585917274648474440537044036944455741","1533174095932179741832085722978096451211273368734335528806856805965059178550","1440944398068243290019815197893325790869382856018839453050014183551865062018","13004204931687393626720102454766944489147659600561337392365246286815729618336","12325315597559743752230693830058397065789541158772176272664764348470516075554","2972653442760058165486608510571475869094354178867521177094553776876904654370","8370264878441063630462671051957262849187564367781659467838460782939804026447","2959389974566411083204235326117036516979963119227951085034972251184734179290","20551785199765572414957755636883446606643894289625551996383687264006196444272","4087977103445290602464010775212316926483391914870441578758042979308767270230","15356303677036047765901840442430056519915375782726231750029051083606835464886","2683741289082249638876005424728100137356381224531970040303109182897410726686","7809308148717690892433475015444256746265555654600319391230796066961179227754","1440944398068243290019815197893325790869382856018839453050014183551865062018","14027649325388708488081280969586205626278814303627295953445422182588276435572","18594403705196476767375145654138028270042663039914897358747063340477738248585","16336411977121389060651610820631824246361165054986934015236391565811657107740","4478906216357891733779320532575007598672127166034590483003103843151770821805","15776564956440002895136116449299582951656581983212117550232796150916571692055","10593196891529840628734555040366549092907275204600028371924840487850448911826","13602826144456356860284419687170541618185281374064216815711251835821492025702","13183232877692246822590812126633640676351230654681431401704678854597307073741","1143725056710957642097279233815583467630238769694555684003566733048000751701","21536244638197709025858135955699906074571886472797743044193407266270319669578","16118914885963834916174025584295786549597018616252080891215345608189775067017","3085746588958121678695340573755073635811671969466202529706243909144419544906","7471975174935772955134792946513424637999023861300940920934522552454330255354","16651609932326344885003930002640274787869059718257297617745634674345809614067","8863131691935358314236967173935315033413820679736774627121405457433895003795","12233333935383563259381899984287101540154684128978249282626058445737562030151","7057969325794614252651980473201258184026879446024353453586952048006174273183","8177887533556223950928671845738575508418213402039951309409853690924708882619","16336411977121389060651610820631824246361165054986934015236391565811657107740","16391403911439019484448973048634108295486984765667310507956782776900193019857","16632434695136893331490691565954322107706581064802120383393065446949358038261","7532552732354833964818948844447124010555621930545046129036742684162649680796","2959389974566411083204235326117036516979963119227951085034972251184734179290","19375155383395696510967115781488322005907183312666977471331313827828265655931","2683741289082249638876005424728100137356381224531970040303109182897410726686","1071564318326244075341980988866027669737011601498674724527637774926288977632","4688608777744900238376640178893120441686955058686461498962807904713059186065","14862128476161472318832207576059761644997238747584253112211006461966427732368","14057612694744022955506885004102834629754310001978602939456750538201073114431","1570274245034538183221128634382794417097801245857820047802724595210806628688","13748763105074593620013986383045781773296715695306976461248290420913969610259","13079036262723496487062341719232498854721623596427562123822257284722043022380","15106671954584442557442200864211260493785606980074399349847632055753054483078","1143725056710957642097279233815583467630238769694555684003566733048000751701","12271983753113042626833634560364485293486763667349863253834100408006012012338","16651609932326344885003930002640274787869059718257297617745634674345809614067","6267275553024510648754807709238333654138152587130901210611391956543755030870","17018828663094797750757032992805443165559600645338019797634595027047317699068","13826842810792073443336072469158777368557028423710280480746021228332338112849","17539019008906665692358401403758991639375357012882690788487548831749474497244","19750715061039895092288075649509657235159241403400837501090850293666251108617","15776280343411227095808521568994471614057167432416502119979098996603887292938","19356492332655108003949429792555441845806681675195402015185308983898801715851","16118914885963834916174025584295786549597018616252080891215345608189775067017","4224433012242275812105292037318388809660019851311870694425205064696802439276","6311168126082531220851145980238852866031091078497507817682388947599504858069","12439760546784082202871583401234733990044187602943315324169379543365738178519","12385792108167898834965686312817629786971321080122734283967136719015404659574","712912966757927878965693240425422971881715436008090497769457122872348343952","14506356872966117174131859847846372170262756655915924664237877294288585233653","7135473937218111453151804646361837547205712024569546168416088861245626015030","13183232877692246822590812126633640676351230654681431401704678854597307073741","7033259621441273379090690993518324745190856903793390519675567591730089293401","16954193412688439955632320517883969169462813275902648614432177779074490622129","18638025629280224617790168906173435277703684091772827588468099812026035539738","12180564838572574785577178844314834812952191421495899999848160514539788519817","13582411668238263333995209483029305625601807569534701653376051071840372484093","4655594634855844188499094340496759182976213206849235604185854128079411962453","8370264878441063630462671051957262849187564367781659467838460782939804026447","17496320222604434917256246718514403734235740171188912286919341525891256570713","9141525190254519952022341797682038597679704914972221193906068133244136674784","21570485471295626790395474884741704872769989979943302238757938053634431270592","14214179218791945815971672263715227174014095422524111075841145981660259478464","5992148578777868893458748144399130666011631987544731979896999269126511048457","11275609334870619778800915975797190217946752952900097800029716348347769743557","6714269803293029270909153658663808588557387497502190042744619007611526657435","6221105771699561812227612915438412791747103897962033448670914370271924677164","12249836732564745436903455221618799619493605772253570453747572839223832061488","1493819599258016045339110999235422917168609982262840449866816239257578013153","13682529409340978640466595260264374070197250456280851982310079893206859446095","5568143431214976639464768845659406494667053581733825380813024891527928235568","13216746424486872049443607565713997095923431379037310625593547838968801990450","12180564838572574785577178844314834812952191421495899999848160514539788519817","1346980346605447755534859795013475283788975200653900831883060614677761712111","10782746953492500078751030180163064462657489179646951793154413574373371915628","1570274245034538183221128634382794417097801245857820047802724595210806628688","11118678586223256967063779327106075185044005359468107273605978537625172540996","9957269699849018786420105364721112375750180716923816099920663920684273075720","10286727453332438406648583236643277009562092681643525436851770105870834802875","7986666009024332686676662864413304092722307894727965157582073398188685188596","274618135907332659550125464790981847888019268634834758638296553463810383811","20131832673266427475769741534309108541338301173662948074665588100934145363162","19750715061039895092288075649509657235159241403400837501090850293666251108617","11545919418828350367784519368633485476721293708396219560182357280822873453096","143871243170896096761286538359612900806921859208087130133106251324625818743","10593196891529840628734555040366549092907275204600028371924840487850448911826","3005814121577142321238773726823845968144595752898226988876012545652019094241","9798324625310926002331408522163043190724749435063160272808536376189654148756","11964978685770609938104516880584559743324134082109819132572992701951308097934","12519200710540274443987348735978102700747472530155480989464845837532354722845","9679676316674197446267516028449539668288990002440917773972518794977810420407","12519200710540274443987348735978102700747472530155480989464845837532354722845","9957269699849018786420105364721112375750180716923816099920663920684273075720","13602826144456356860284419687170541618185281374064216815711251835821492025702","17603178439634188462056825952489860474722953595745235452510670608903852152095","16651609932326344885003930002640274787869059718257297617745634674345809614067","15950000082544045394526115523741159615348156864031044224172890462894241606231","18451742809683626507365133121132299935287207259245734910631591678742738573305","15214427790517490141925325587797963249335567355213168373025412405634050937481","12600480540100512777695577363859185402126112711196993279255107913533806514345","20895602419903453398196391913478058693274453903342785067983129839552891433864","9306117694572387027262464048290209213167312534461525812720869427821619086590","10690633522035360601031737428400068881001718255130638825096194976708724866144","4866442763557448299456393930665252678199356968867077785577776954873671002076","19108128352145842008548048053308217665383455218276209300064989051535526150757","954361121666374676317512516553835448496801654442662842741750447529976221096","6714269803293029270909153658663808588557387497502190042744619007611526657435","19265929620982371511819161020399302006822082297986006761385196152068883496437","7532552732354833964818948844447124010555621930545046129036742684162649680796","5649801951154791837665343131813310668539151217466670556566164087328114632489","4866442763557448299456393930665252678199356968867077785577776954873671002076","18003950806500496937907532373283544753235688820907806692295042001546833965033","12155172322986237416023663042004942352608253176870958535098713267207721181883","6071932171386993614931179655729818150534845046202199448265558256519848482826","3099260939107709193833554073787772569345965287506676970762153917208260772189","6072598916249169136908315542430764263321939399814654522032874918790340778554","19569641468295105160418177740024945517842897645468872356974690513927041995987","17018828663094797750757032992805443165559600645338019797634595027047317699068","15776564956440002895136116449299582951656581983212117550232796150916571692055","12042091411871087770321928117714696325647592163332119499975682262951606830326","8177887533556223950928671845738575508418213402039951309409853690924708882619","11433874323428772158013095381623924200138375055456955808189877801771380225552","14535184095124950892028872912364622595212286520594227957147431032075397154266","20046290436659560311648463454245918246036175981027749522810979896203323505017","5627116488283442946557217209333347313412518163016066550539282920861053074060","16480089772180635258030461748402564771495064968752027484874049433567638476934","1194604146042048350003512364693260099917768421477389239935129766419846021985","1218928037268356033769144531312651840516937586618523437511091378414585873142","13202400967998975804928062759810694884158416475176357116907186595278657876313","6311168126082531220851145980238852866031091078497507817682388947599504858069","6795208382791933114735572030062093331533051902721517159934364925403853532318","19936787863437503780283518973149089110020946214555834613795208847908690099190","9377958456884255467194088716477119239642797045077236472356953540022684583149","15123415314399351471075303556718608687323785898137080424470982286311735782352","13370115598260167633113987566372148589924273398862423406100474476922447871102","7135473937218111453151804646361837547205712024569546168416088861245626015030","14262959519701291686797273506458134133352406025405884284959025726384935370757","13025268118387164480802803485697296266258675734062176433653116451463846209082","4624094547626164902101572852723507795056700722159656748629760282341508155551","4224433012242275812105292037318388809660019851311870694425205064696802439276","5836322900178474894684749559174625794931606932780001961547616477680042620058","13908465977240917608897406492241943260778588976320614277228337961237626209809","2628389834360132333366589026387003814868457686372552787974500759887369913155","11183511759577952361572566673527592434184886344484272921682811575415051015276","12863950582730082046148154608075135240263800483912187224256340414612337617318","14262959519701291686797273506458134133352406025405884284959025726384935370757","16137218824867518993112176330612823176216439366022687220615937652371635085247","18707594353877082516395132272698629627555807696619350634836774054442394671010","15413262379943851680637741226631729175616759345996754775627005612359539596292","4116036656616283014460785251860209028828407967565755603300238819653622156901","3099260939107709193833554073787772569345965287506676970762153917208260772189","4624094547626164902101572852723507795056700722159656748629760282341508155551","4420985155765749198917158320211243542858248750314567273670169360313609199220","4781857348503260904895922377303003708601361291248025972804843818012461675526","16698515797824680501871676266202253211872118899888285886412000454073141450701","5519776064110123180759081312729047106292930891845193268609251880658830705433","6540725658063818695836967143056666761434297658403942276316050979804587769432","19215132962371868093445083227022064420405266792249240035116240824526740725800","19375155383395696510967115781488322005907183312666977471331313827828265655931","1175039218798484980072399121924972057008410392367959450703939688306902524054","13748763105074593620013986383045781773296715695306976461248290420913969610259","15976568257028838086904371689993285445196617581672212770040719579976951713437","2731702758715001559265750806008384495080551892515362156357977538139860974530","3133838166556165943824029176542597440374447246137252468511956694712122940530","1354299594199717859606388533670792913672908168692420372657948698842311093857","10822341224343704549832157601167511762192217681493597414750548578356092990059","17018828663094797750757032992805443165559600645338019797634595027047317699068","14776577580296682191308190812580888360497977691535016054206068797647787496417","18693317710730212151208513181186966573996077028828882441479768956833225751022","17492490034871188503809070393464727304143828491765350693224566925126105199911","14172013427642179266386805494272960512005525394680301845681753498295255309908","3607534072804388173311745844584795163913258697339304886139614455491456047872","4420985155765749198917158320211243542858248750314567273670169360313609199220","7815052247860712154170106628650576750781240048309328607812510735568644480099","9277147365456707051192593343809527681573500829831413326738310307567850123829","8863131691935358314236967173935315033413820679736774627121405457433895003795","13439261978972035796996150244149252173133297973805089227133789936712760569803","13051815778936294959186188778209982533089138172215506637927986094620164817648","3835902309964760173432611751283380612399529168609044921165087497368685977916","13202400967998975804928062759810694884158416475176357116907186595278657876313","15214427790517490141925325587797963249335567355213168373025412405634050937481","2666549942988803296757576401723478920911340699174408059253220554211642279978","16122380779106962898741444352984715606386470429041317890034930229550324363289","18594403705196476767375145654138028270042663039914897358747063340477738248585","7796937569050271278342402836188937027242003149541526098037517748511185180620","8140644209065967749731539711645757673629321017919126168806710308878873241272","5992148578777868893458748144399130666011631987544731979896999269126511048457","3348432210747515061385037490620056224077503064341935527160366063098820102327","18566222379922364157274850150988399654533738702075332376935729247934165563869","2476324937951789382181944025361875851099988750579823474754609765481889757439","18637620888308371607611642373870554933712342468791368368498810637591710912686","2959389974566411083204235326117036516979963119227951085034972251184734179290","20227979332701217082249100988795416872480735366357703927751699407575642930935","17368028902269277465024746642764987612414033705161996149238721534130490186941","16653103879864200321986465966316889764620013245316877484022986374603264725648","16118914885963834916174025584295786549597018616252080891215345608189775067017","5568143431214976639464768845659406494667053581733825380813024891527928235568","13641582444261924898950561772071287900110836262790950814969623169365632502460","15546540006815490057793129658556841909859473017172875226825092156274503806084","16961794929940055505618937273665830834556517799613603503371462732255229717698","11964978685770609938104516880584559743324134082109819132572992701951308097934","14216993731814681619137662595321398279415990565678023063177228088649900891505","7815052247860712154170106628650576750781240048309328607812510735568644480099","20350757034998523187334178209550008366903662221355109911310833181698841320621","15045123937812306625997417665247004551483049589009168687548501235926225142020","16632434695136893331490691565954322107706581064802120383393065446949358038261","20838188000013629937954971368567014585342187321412629930028751871743338652961","13545244560072730176162896504690392106112168077747273393293519829141026712654","6765546767316775630226434304243025099044057869188929458111914505605517807492","17018828663094797750757032992805443165559600645338019797634595027047317699068","18820995668034441064481786413532066855976405414499761311120499699159123037823","614966471251760438899692967903400348852862620490339206898848861882544111046","17496320222604434917256246718514403734235740171188912286919341525891256570713","18637620888308371607611642373870554933712342468791368368498810637591710912686","6540725658063818695836967143056666761434297658403942276316050979804587769432","1644637032401895183536122531980635414363418149797237304436572320773189961342","8461890310516914992976016102786941165050457592527945955052989873762315959085","21591247897428723764785205441739843186077784027717063974489303352320972773514","9277147365456707051192593343809527681573500829831413326738310307567850123829","13004204931687393626720102454766944489147659600561337392365246286815729618336","11398194787838497782166425813926171378663319996243937443066049287231892201563","4006308849281273792274000957432061207143923231283130218997109288816872164471","3885925135313023686150115977607110368258492435636819989794778250027419367343","3054509086575963631520633315863182977708152785332183337259997415160907095845","5055315503098445594062335518727177962919913361908453398984787599226169183337","8491224372742742395086082981236389730604525807576141462195229766319454932167","10593196891529840628734555040366549092907275204600028371924840487850448911826","5519776064110123180759081312729047106292930891845193268609251880658830705433","20750786466099303558578845860831937634908544617912415565480052280769840150510","15798767315325760489132964686987872692994717940925570238047784420230331193585","567433434521112381841206540791234080742279927287516260853551410281774875712","16391403911439019484448973048634108295486984765667310507956782776900193019857","14057612694744022955506885004102834629754310001978602939456750538201073114431","17698177298685528128465298198488735273578406532961103401549266592203987353446","14506356872966117174131859847846372170262756655915924664237877294288585233653","11889745823596890789749077573846619853793479538535474896498174482741572852641","15976568257028838086904371689993285445196617581672212770040719579976951713437","4624094547626164902101572852723507795056700722159656748629760282341508155551","15022199219678996727354667799147374096361570599067734481207390034887749042083","8461890310516914992976016102786941165050457592527945955052989873762315959085","3054509086575963631520633315863182977708152785332183337259997415160907095845","14506356872966117174131859847846372170262756655915924664237877294288585233653","9296362220804925104551234752226384203979024033236205671428676015277866160513","12688265548305129213524123982283433383136772509110047948234368697335124109577","2903328500810487887284040113540254258409278773721503335380406605532748782645","12271983753113042626833634560364485293486763667349863253834100408006012012338","17744796207881002836361754172345756972108243302293817629307470887005013537965","16954193412688439955632320517883969169462813275902648614432177779074490622129","2666549942988803296757576401723478920911340699174408059253220554211642279978","15689970856593006158259892732288646993746887463514406392254922588756401796606","2666549942988803296757576401723478920911340699174408059253220554211642279978","6307025001981604557276095751477581176989559254288853588059732891819079685284","15106671954584442557442200864211260493785606980074399349847632055753054483078","6795208382791933114735572030062093331533051902721517159934364925403853532318","8082817983718546987105551276971252463934917335856558917892075900846966350585","3607534072804388173311745844584795163913258697339304886139614455491456047872","19108128352145842008548048053308217665383455218276209300064989051535526150757","17603223305375528970110710410175592504507901335489871100398461389444688509102","15950000082544045394526115523741159615348156864031044224172890462894241606231","17603178439634188462056825952489860474722953595745235452510670608903852152095","13079036262723496487062341719232498854721623596427562123822257284722043022380","4574759938850684302328171377919788556520857555728298495027674689330859913909","5836322900178474894684749559174625794931606932780001961547616477680042620058","18682912995789016595436882433435139159334702280353629213700041190405671371221","18682912995789016595436882433435139159334702280353629213700041190405671371221","14647299140966795168634863382011786101084247791740654785196548451662948086183","19265929620982371511819161020399302006822082297986006761385196152068883496437","13051815778936294959186188778209982533089138172215506637927986094620164817648","16226984168490080400263373201570728966749962184950889718917387268203884202372","12688265548305129213524123982283433383136772509110047948234368697335124109577","4592739379790743343042028868384342794596363702987579215937879797639357089011","4933182101183318250560018811514844142859815227384938275570441539742336262480","12519200710540274443987348735978102700747472530155480989464845837532354722845","17547875379231708590555723879540779728666475590929028917859771769395698401715","21219905789358323534478545279193723251420616841556623254711235028135342626157","18682912995789016595436882433435139159334702280353629213700041190405671371221","19617883112060216036437373002520931262578741557295904537678304364166866283129","20342168169457748695802149508674862964537074611245094862559628187033717475867","4420985155765749198917158320211243542858248750314567273670169360313609199220","3608626711809097355394527544415447989465407554113965209630262872975367728702","7986666009024332686676662864413304092722307894727965157582073398188685188596","17539019008906665692358401403758991639375357012882690788487548831749474497244","17496320222604434917256246718514403734235740171188912286919341525891256570713","4655594634855844188499094340496759182976213206849235604185854128079411962453","15618359152517208456698312197785172766694127619077536561902714697931530755106","13748763105074593620013986383045781773296715695306976461248290420913969610259","20131832673266427475769741534309108541338301173662948074665588100934145363162","10690633522035360601031737428400068881001718255130638825096194976708724866144","18594403705196476767375145654138028270042663039914897358747063340477738248585","12998359993404137434826050598531205936631009536891015167391276398139095697469","9141525190254519952022341797682038597679704914972221193906068133244136674784","14144040826170485243395777956417332299961240009335454448818306795274079743482","1570274245034538183221128634382794417097801245857820047802724595210806628688","13597601271430461916896612582648919742272715556061113046784825140314498905478","10286727453332438406648583236643277009562092681643525436851770105870834802875","15710422838883679733600834907476906094570753444844580151730513642276654631674","8082817983718546987105551276971252463934917335856558917892075900846966350585","18703989514997223432661641229861332310348080898339160493229575272467603319271","16480089772180635258030461748402564771495064968752027484874049433567638476934","2967213245998332384543885104754783540899439580884490432048984202068901705944","4655594634855844188499094340496759182976213206849235604185854128079411962453","18637620888308371607611642373870554933712342468791368368498810637591710912686","15776564956440002895136116449299582951656581983212117550232796150916571692055","5210257615122466358421406540799898540909863599743777249997433762286779163631","8691474413369666750892234614358820289658368726857552974633024543804680298964","13605376995820845471499102796322549845207296468035227481017989756087418839900","3196185115626403769090812264110127828126981872545481387659039004737077237629","21591247897428723764785205441739843186077784027717063974489303352320972773514","1194604146042048350003512364693260099917768421477389239935129766419846021985","10782746953492500078751030180163064462657489179646951793154413574373371915628","3885925135313023686150115977607110368258492435636819989794778250027419367343","20521411631300308681277111693281832014010918653298260542960102164696238242229","17582818757173661762314072926867802933652214827993395929831324522299049413904","21780456150575058339898563710498965468972448244984833163147655946608027181634","21591247897428723764785205441739843186077784027717063974489303352320972773514","8491224372742742395086082981236389730604525807576141462195229766319454932167","156542953578700199190349883532041470160708612831113224539973504251955528744","12519200710540274443987348735978102700747472530155480989464845837532354722845","2544185200680176111354240446924889864706979425265095363625611785655132613870","14897910390493117493085561230943786488745018480007968413736887385270447651383","13051815778936294959186188778209982533089138172215506637927986094620164817648","8370264878441063630462671051957262849187564367781659467838460782939804026447","3986804060834622107770115616180027696529168594693106325651227138002220680218","10782746953492500078751030180163064462657489179646951793154413574373371915628","15976978918004336355901319629352200911328902990447017277673724626919242812955","8328030641700015547962729319084004225083584314272156382022742953974692359024","2476324937951789382181944025361875851099988750579823474754609765481889757439","2476324937951789382181944025361875851099988750579823474754609765481889757439","12155172322986237416023663042004942352608253176870958535098713267207721181883","17603178439634188462056825952489860474722953595745235452510670608903852152095","20342168169457748695802149508674862964537074611245094862559628187033717475867","4688608777744900238376640178893120441686955058686461498962807904713059186065","4420985155765749198917158320211243542858248750314567273670169360313609199220","3145275707337847188939353064357731848534516166917140907835781738084777990262","17603178439634188462056825952489860474722953595745235452510670608903852152095","2235150263865959136421726440400433738501848129328010009098035293276672220717","4549806302643127256376053744839835469729529127535077121646524402308295761124","17492490034871188503809070393464727304143828491765350693224566925126105199911","18729388765252309558574413425774793050225406365031444286319123071733886008203","16480089772180635258030461748402564771495064968752027484874049433567638476934","19883029896859112110244432872192403645617916717981765942483639413786774824574","5836322900178474894684749559174625794931606932780001961547616477680042620058","16653103879864200321986465966316889764620013245316877484022986374603264725648","16698515797824680501871676266202253211872118899888285886412000454073141450701","12233333935383563259381899984287101540154684128978249282626058445737562030151","274144820678452421379816557330510579317549145397331786233749585417771792945","15776280343411227095808521568994471614057167432416502119979098996603887292938","4006308849281273792274000957432061207143923231283130218997109288816872164471","15435596047717285113986137313550661564381864970285528104339022986255133148722","20838188000013629937954971368567014585342187321412629930028751871743338652961","11433874323428772158013095381623924200138375055456955808189877801771380225552","20131832673266427475769741534309108541338301173662948074665588100934145363162","18820995668034441064481786413532066855976405414499761311120499699159123037823","10599184745355055122827201680284382421384308407491311763734067519190170881017","12876212902112174796123067808109407354255021515914362771981709565057633093870","16122380779106962898741444352984715606386470429041317890034930229550324363289","6836865286311343609694524245159119133769123287741705285044672797797129131253","21591247897428723764785205441739843186077784027717063974489303352320972773514","12385792108167898834965686312817629786971321080122734283967136719015404659574","2027121307515028227361803453971004574835283397634149795685942874063731877044","3005814121577142321238773726823845968144595752898226988876012545652019094241","4866442763557448299456393930665252678199356968867077785577776954873671002076","20046290436659560311648463454245918246036175981027749522810979896203323505017","1336458066220344521262880797524303149688311982013949559764047883761889898074","8491224372742742395086082981236389730604525807576141462195229766319454932167","16653103879864200321986465966316889764620013245316877484022986374603264725648","5988689769882991468528359729958078604149342871940113378259733314892811441673","3005814121577142321238773726823845968144595752898226988876012545652019094241","3133838166556165943824029176542597440374447246137252468511956694712122940530","11183511759577952361572566673527592434184886344484272921682811575415051015276","15613087414575084731294247924061147534041250959429049604445183368849211416480","4549806302643127256376053744839835469729529127535077121646524402308295761124","16632434695136893331490691565954322107706581064802120383393065446949358038261","4933182101183318250560018811514844142859815227384938275570441539742336262480","19750715061039895092288075649509657235159241403400837501090850293666251108617","6049121453084659222825489908739822792694774158293989229260853547616301268692","4549806302643127256376053744839835469729529127535077121646524402308295761124","13370115598260167633113987566372148589924273398862423406100474476922447871102","5469955587383559828097756439479681402770241102946573149636380518729022833750","1632500423430879870300869265124598190896358768919584266600939773214617936900","1071564318326244075341980988866027669737011601498674724527637774926288977632","1493819599258016045339110999235422917168609982262840449866816239257578013153","12998359993404137434826050598531205936631009536891015167391276398139095697469","14057612694744022955506885004102834629754310001978602939456750538201073114431","12863950582730082046148154608075135240263800483912187224256340414612337617318","21451388112829145060821974036366132513327328641208732802166144524686108831760","13004204931687393626720102454766944489147659600561337392365246286815729618336","18159717335881315589645032086713288496782632932867903491586009514211947568031","6307025001981604557276095751477581176989559254288853588059732891819079685284","1440944398068243290019815197893325790869382856018839453050014183551865062018","21780456150575058339898563710498965468972448244984833163147655946608027181634","6836865286311343609694524245159119133769123287741705285044672797797129131253","12233333935383563259381899984287101540154684128978249282626058445737562030151","20895602419903453398196391913478058693274453903342785067983129839552891433864","18207961221628464226564927736506330628717051411055463190287553801949660581016","16226984168490080400263373201570728966749962184950889718917387268203884202372","9141525190254519952022341797682038597679704914972221193906068133244136674784","11433874323428772158013095381623924200138375055456955808189877801771380225552","6585682031650501777630925238370902100450071127640040426788913175433490518990","11645420524832783721170737438334136629636818531954268745339783028025385754950","12313143896208759390351526641510039095883815550699902043061685514584813600074","9888239978634522925223196837194242311545989047209631150312165940305433080157","9306117694572387027262464048290209213167312534461525812720869427821619086590","7800856132048238285999367318239374829634076893379031119745654756621815300429","8328030641700015547962729319084004225083584314272156382022742953974692359024","19569641468295105160418177740024945517842897645468872356974690513927041995987","18703989514997223432661641229861332310348080898339160493229575272467603319271","4006308849281273792274000957432061207143923231283130218997109288816872164471","4754713757431627318482916888231215818599754770670360377946229107868340173565","8863131691935358314236967173935315033413820679736774627121405457433895003795","12616472237712801953990641170786430111219637655930398736307229893389737211053","14799475491656615059372780774624370709464328674979516248659286482744107230446","12600480540100512777695577363859185402126112711196993279255107913533806514345","7033259621441273379090690993518324745190856903793390519675567591730089293401","17603178439634188462056825952489860474722953595745235452510670608903852152095","18693317710730212151208513181186966573996077028828882441479768956833225751022","13641582444261924898950561772071287900110836262790950814969623169365632502460","6585682031650501777630925238370902100450071127640040426788913175433490518990","12006531986840408977918622834986049589872827010469069694616415380752223757192","7471975174935772955134792946513424637999023861300940920934522552454330255354","15950000082544045394526115523741159615348156864031044224172890462894241606231","14262959519701291686797273506458134133352406025405884284959025726384935370757","1758371485945815703876679445382538767819559386912271388124907980130004330353","18707594353877082516395132272698629627555807696619350634836774054442394671010","4116036656616283014460785251860209028828407967565755603300238819653622156901","18594403705196476767375145654138028270042663039914897358747063340477738248585","9377958456884255467194088716477119239642797045077236472356953540022684583149","14841990498171696915559636042318167569437811173944889089519208821758196118572","20006509131408258657369129395045362318044780385983476979717124299339121586377","6049121453084659222825489908739822792694774158293989229260853547616301268692","5568143431214976639464768845659406494667053581733825380813024891527928235568","3117586190657126472592128104269081184451127080527182054370687640020932637738","8691474413369666750892234614358820289658368726857552974633024543804680298964","17582818757173661762314072926867802933652214827993395929831324522299049413904","21267939098918134027395634942102971885281982111723141238850772621986256662900","12600480540100512777695577363859185402126112711196993279255107913533806514345","274144820678452421379816557330510579317549145397331786233749585417771792945","20663699746183765412904432768074062935933374627665221119822945660203712880745","2628389834360132333366589026387003814868457686372552787974500759887369913155","15613087414575084731294247924061147534041250959429049604445183368849211416480","17174337625009122870708859925793325997946378966416309900853757797594910229791","2967213245998332384543885104754783540899439580884490432048984202068901705944","10593196891529840628734555040366549092907275204600028371924840487850448911826","1218928037268356033769144531312651840516937586618523437511091378414585873142","19645303799442917520263849382981918648525479954858046014781621457535223129139","1218928037268356033769144531312651840516937586618523437511091378414585873142","18638025629280224617790168906173435277703684091772827588468099812026035539738","4087977103445290602464010775212316926483391914870441578758042979308767270230","8461890310516914992976016102786941165050457592527945955052989873762315959085","5568143431214976639464768845659406494667053581733825380813024891527928235568","3005814121577142321238773726823845968144595752898226988876012545652019094241","17603223305375528970110710410175592504507901335489871100398461389444688509102","2544185200680176111354240446924889864706979425265095363625611785655132613870","15718330550508436908559701395606414201668068552693146421627683872153427960853","8140644209065967749731539711645757673629321017919126168806710308878873241272","14799475491656615059372780774624370709464328674979516248659286482744107230446","374196098865630209786313311346578647643865900042267366994874073365518434467","13648236315809483800741231329158534760283476979282874649596812220944412887454","19356492332655108003949429792555441845806681675195402015185308983898801715851","1118279149946874054339337226256428104508684927524794373040609290637664978199","15045123937812306625997417665247004551483049589009168687548501235926225142020","1689709601556268020419125248006910470935068691712645256591639741945971733744","17089513984383051444012804212344078898491877698852637641465487102929365695051","3835902309964760173432611751283380612399529168609044921165087497368685977916","2544185200680176111354240446924889864706979425265095363625611785655132613870","3348432210747515061385037490620056224077503064341935527160366063098820102327","7986666009024332686676662864413304092722307894727965157582073398188685188596","7567096820715495523465831195561335361495276610103173418515651874250913956034","7800856132048238285999367318239374829634076893379031119745654756621815300429","21451388112829145060821974036366132513327328641208732802166144524686108831760","12042091411871087770321928117714696325647592163332119499975682262951606830326","19569641468295105160418177740024945517842897645468872356974690513927041995987","7532552732354833964818948844447124010555621930545046129036742684162649680796","4624094547626164902101572852723507795056700722159656748629760282341508155551","2666549942988803296757576401723478920911340699174408059253220554211642279978","9888239978634522925223196837194242311545989047209631150312165940305433080157","21267939098918134027395634942102971885281982111723141238850772621986256662900","17080170896205579351487820867879098448749980844566584779831865641843648559954","4781857348503260904895922377303003708601361291248025972804843818012461675526","5001232371587577350490476563931715794477203224577970619789108259266886603950","1194604146042048350003512364693260099917768421477389239935129766419846021985","21267939098918134027395634942102971885281982111723141238850772621986256662900","18707594353877082516395132272698629627555807696619350634836774054442394671010","7236783279316083836339480995960834633270959028443867776543135480683166923869","21570485471295626790395474884741704872769989979943302238757938053634431270592","16632434695136893331490691565954322107706581064802120383393065446949358038261","954361121666374676317512516553835448496801654442662842741750447529976221096","12998359993404137434826050598531205936631009536891015167391276398139095697469","13004204931687393626720102454766944489147659600561337392365246286815729618336","15776280343411227095808521568994471614057167432416502119979098996603887292938","7057969325794614252651980473201258184026879446024353453586952048006174273183","6994664438597925475223705340624595897260559921645516609558922687274714825714","4363738634465882118172307854104596042899685656091037340905869811610138317347","12180564838572574785577178844314834812952191421495899999848160514539788519817","13079036262723496487062341719232498854721623596427562123822257284722043022380","17496320222604434917256246718514403734235740171188912286919341525891256570713","12271983753113042626833634560364485293486763667349863253834100408006012012338","3117586190657126472592128104269081184451127080527182054370687640020932637738","14841990498171696915559636042318167569437811173944889089519208821758196118572","3814718729516245467542823378722292629370285860606484341016365565551107845022","15718330550508436908559701395606414201668068552693146421627683872153427960853","4574759938850684302328171377919788556520857555728298495027674689330859913909","9612640678039527906483661330640693201947160578570955411180830848021191312999","12172459979594272836158443334993722622077942972483988133675801482944682547814","18729388765252309558574413425774793050225406365031444286319123071733886008203","12233333935383563259381899984287101540154684128978249282626058445737562030151","19375155383395696510967115781488322005907183312666977471331313827828265655931","18207961221628464226564927736506330628717051411055463190287553801949660581016","1377808171643922006954160722747273091529243940371945604197417602736009363523","14889586175325483443041813226686357400339931463122742842745317460691290784136","9770821889969753026439714135746557936968725073065412883354694679382717123968","3768167068773898722568469507920346701450511503268567897292049941704582796136","1899628457317453197426768456858589983666227401303606152877725712904770786388","4491805913328638367373022803345382207852016585780535879187833668803311933436"],["19444847062288131493943706784497406601211185688116273754131863169092610576967","6756357644703883372382000235355183123582254014035599689202182239604052730084","5834963883005519863277737060862183242422193207910302638450418995361988638650","14630532141997277216138304497310196564144668507296424668904559464853731825529","276005601789737429160222670723919227435048289882730462426149086438071032420","8155169592408501114771949260607780658108674298838155446397409772814142490986","8496173005628286226067567535490313700679832176191507650779467185231469190908","18522758669123103820765651383058550163152440728027329605661881000152433829894","20717160396907128742447930491661507548527901200271695593644376944470624644874","6783400954785427443777419190369959791457729235323837312105292689987925420262","15793588416019429949037560428655750893129153960665891892058368228751095545231","13047857333849170739650468523722679452310178134682835736334331719537030864403","13702952651241896077447912135262631109194634993417767336774463460551430174591","16771524083619709591205953781761522848915592462004352344297444083327000335914","18362879251176766534772404056399418613362042401782184697324682721000341441514","1921169374568757279790536398590170773520268712196928601546829626342058380013","18007271086827148118702779138045717036566051534448069739899858280155274498416","11677788058520437899562086139134738123234096436757857524455227202665943485909","18567835086166004190967610331516651777840850520761110277224875363942309193033","12549862092815494374468253271773435129600234325866279388210551065809722236154","12545772019827878627361160408311538713526252988913811675565306764418681013019","17790976380038280976988246085058593967622099860594622912213483950365513994179","295342049608542310001266607810723788606908957088698225682924285077522343374","6042881253538576878797032051936765585731381049990189646390895524714385119979","16177540255744097871521288192447267851650838298325801002101754584177258351542","689944521090171958642896246746378107452915085681977844021127122085860793418","21806600652809306442934150151527166374544123717499224666056071691980718320158","10687999924804520822721645773635035131067056997636998429204051086244451458352","2919688173439697460443732931955910957668633676232388974155373692008001074942","2088428214431812495479622929730813017014992498691761094277448089379469403302","3415582465565312695281321795946675901044043725583982633056443485871119407177","11432629911071490835626964427117253752817170646912779324491272989814675105631","7810232533291842805873821935461788355487026463002760576510838277131727012637","15850563248943823248196314184730972664098169701487536058299754250660946727661","8728976634161630217358665668742559554087067616326533741880426574160431347132","15547734297253509235806418165603020662298589957875421913304005171944398984391","3158249123091915580481792507317767452027547932247936126792366337689584842781","8993351209143960585970304728524607023340419549878051384852055190939357644360","4916077676642951295302597643655156805863813630504586598619800437364856520347","15052050566960149294362189709830107098243646295893587902102267385191499441867","7150859141970623502564908412249208973629105197031357581428846816632024424773","5659463774436746876994077967866722465283824187257515817896446525143503038229","19464498962894958485813692012599931383997188482601571850575384753467351286244","15817240123388522852498302303406312726664688503153075471764110095076928497826","5302571205101485049626764959256598947375033298608344128379324163720645334410","20692740934715863051898617710088924214854286115389280275696778859743980624203","16121180084056885385768374518937623712121773918849607938195591718986083243748","17449335744171334550114352347521422770517337704382637045934115518315313519219","10253291411916249149409944484940846312189907495150544356013969086126665142627","1075989933051112270479502705317054499580865741297076182284940703542006602757","17496779585745191468575660181265060269367274078653980290860692264179679950345","3538122871871015265597356999511771252266082849566808379976323073541018816059","7579486643564421792498711360748450541290817800587156287997063934548078067430","12729453322089802294380978481733715584931031070971499485676879773953031357372","6694633370369966210102257937726749959486994134264582443016638266185985910723","17623873916481672691654892260114036685248130649477279788335331445450611897752","6307701910454308121209261684131709903162842155523511946468120801525808144713","2490437230848135899340146974626841790838141435966177610519877944111227880794","5017798776934405523649599878486720454877889960063314088092139283965398786505","20817420597532209277094254254011796300596270364114901508622090395551862021369","15258825807346731106480585334099109914680431439052544107298794895009458789849","436207735379833515948816288186396517305806158675320799296446691642166338508","13294452063087597313135368572465579195169503832488496277864688043228247847885","5281958238296057162541008015360609066403026130630047672176591872125940281371","386042965256259984981370670464051577241496612285005807238429392957903257172","10942243549318138624734474054079356060390652679206672396911330609350570685574","270406167611514320681193466529653886068620721651325372569688862100531780060","21769039780368018587024190597032828628077779629457595552733479023564952366755","14257848362862950978758226475754708328366569815134458955450406250786029562719","20675103741730086975536120126603499078928196755869920413190380095671818551245","4092670173605738716451085900386063604788602581706203170812942738120506696245","15831649561312402734198126328637255008767394666669354210368241338558776960189","8773460264964044836577029971056134181700063958452992767868071607709089255261","15969366571969091014788118571658462634361656562903319995975427897452380798450","9090539943906640916226800382217696518430261301435146060171359093957899579442","12598966212710420863490627175550230608849032996842656735190850410879434661800","5082369006304868528209185647948375467679404699238424225315402327829344882479","21232583620520875935273928036429179339733541639648304803699206026350761939727","15216028261411784444168994831958830734443664066057913354546359559245244924050","20503252723414965832541668822746284724979697942657467137170476075965669970069","7028702238870184282283447120220627544268950018331505390418179769944671024747","13914367585327187338201419330215996326176015243409712364994147816309186215349","11972191955486214659980933122765802430687113190375208665981572404973523390750","14164313126758634946487037847698512982901341175183925669745949763512995563823","19643507624196854874403818379994773749775871114166053756059820550045254990949","6253019705251155387518897830821875987387745060770031720935150387804561656767","12614772411624778073372124421221342091038200351899023491707175227213282820386","12799054234177807811763785306399761459507163662627299853945472202258817984059","16298413623883813223145205496435140924571599757753789623615680953320915107823","8610548149652073334956208860269106926096928271670836846827000353008597438642","9836284514785177186880347525497271134591015465315721313213772552563703130511","9784976878800158500585413974169708349867742257336666799769685612736807878718","470868555320390516869442830897247668225662850353632628471628589894687191840","17307217182098561598390477407238405653820260056045707641305128326328073989247","4674116504957384653684422429847190124325067762798863539680591567775099711828","4731805738765155173300706694658606612354279416357285157979268772012947617710","19408369527037425408359080120949793991326211819391999900817736764475384891087","18547195232973238597820755220571190923184148106985108846845816471997990813451","20764687130261902672266922992036714570336508922412884145266283492627732623055","19892377301785347591650272014822981146836631795074611861111907754644416903635","6413734757240628076834626843107147847105076965920897092716625820251267566099","20860174097442586122448303694433017965295045714190140568637973811484764859101","9976157929114087350046280965312715789783677114993652036414680945525100911346","20443284379975649347549376624760041838634895555678719470752881701519661070489","18893870838626114784034800186442840105625315290994458907142980368089948593544","11133903488642571617254269414928956946413436570602781254462926700298981057101","19260150650655385130131812830419214817760729375303617428649411135535896978281","13461732242206018780892854302161037532643049992617159415492401398338285247555","17102228736482758300705766391088892608834968842141194901502696136509842518851","12272871719359531993455999114365256014273629799700014768301209571123981371707","3594207022562239110254525411112455614396088633713917231917804057840385838433","11285761004669862352633286679979731173931391709324275439550892089674658948897","16102568806633415123079332012340754062427981513856504035688871887957095441264","19519597368641109872437527694712863032289967186787139583473763662663666076515","7850893600020675091200117628857569397261111640016750677979107965392238148005","571603306174340121900401663556670083480079944829773014219141824601049859366","13417234230361968064652407531174824869916389080577175614370178295183391972896","6339479905118967532949951465214069151191196402217454265147854834540663125252","5960266217431370639351267159124277446305252772759082083832329486288316249467","4827913422416492916492150995943144270796495141536283583210133173575222257256","505835591148323979694388175613018554712950286622892296281531129078833207836","13430162365250371418058587486919957187505271111954906160838200205517866181347","11791683213979729551370231161842890041856917089671010365556092948261209641299","13878734884084908403388117942446409924859492948402374543903835601747661416301","7914593516489852442626571171726775738811006144753811688169867990351813492226","10797302146436138655457419302923103882636832085380740614686862737265867963715","4394985227939438982168027081286727479189710464482074036154622396987481104200","17846370028727001276602920123596000650348888091372292752624526729964991577650","1399592710245988806733110276286400825565557403052909106157835149189269504885","4480510739831473990116609789595044875609739639498651344219709760264319707941","11004586942348048001456673131635437257298168527005870798189423435197580585412","17257016484028305690607802548970527681899034872857606356645268286697823560745","15880272219577681239503657424149468083362971750716603748729669119492924589385","15904554418638709990040031800946465318235842277305545433558322594469065553553","15434974732418275887764997429917488815499533240877756132902224733577879415473","21820168018779047045619488779286049910110834277003434094980989418536264599715","7749008375218427634588074063863812252051333204096406815453992945864441895362","3839511695466461913195739285494941868041132999203534272477982111080050006523","11192270025434739945085840100702117964637847488690757055208388489558083138446","7139432526479835672329459147861644569732921891281014828670035430783917357856","13194122716181797306702591509497059325803038795351433491511874742185743961578","12249486681620499703064189091192752491339675300250225642057366857872815164391","12751753758565217613271991442671268614075299410246481820732282132452214741118","14152899301351110068123785825973380466012981712532341785578761964446295185434","13188569584536274764354182121465196242988977215787135260110602036659203482271","8583058680448359031190112033511783279444748692566437598204669389441269594527","20739303906393962278673616858161941640788810322708163071371214143202505636285","1180296912375731347768428538731067445729945471280254724677426248781662325181","6017789428689615319791053684659036780814847053654130311712769439159937889609","2173620618321392312337995148079704379859037528218619197239932038613399941589","19342061241883725191788390495410721837582278801952815468188667976311290962368","11961293118976486325969636275124778155072321144934089356127319435440178254418","15003950077727351663111929517428911404929041518452601562597474042673134378445","11722551667664037124885783671627704449310149868015743702657377612966423359961","1589112258505679428520003152962075989895613700798393982576451871741579895537","10237533647542628466819493835368797714803583017400048476478599541985305410468","5633483783935945421681172594360251312787053845387155338966168908591309720937","11524348046498741796559712688153551628725965921178062387194745025875547122301","4119351785672815550070213600551390224338330329829235301635622400744195777997","8220379217788713766164367196730350016648232008308605440647920160713746282775","13638223826667319442473592100092923906983786522766094318050487349717540347281","12855479012377423286653672887817339438150952573187773204679381183748640361953","18366449890796594374544459463322936541588534912307972856193862784267127118823","14831494193189198695462931146064274924011201974477576494408974317628024686185","11093306658789847420019060296285299107442543903230107282402432370912267955583","5231748467324162438135669634394990945005973450791245562369389835255116288637","20334409444101673859585989946641575861192600463100161126574009339834336019122","10942950770398062877133838468616134250348068685639337507689939414774241938827","21031737058468102950077505705229155312762606827754507238965327181803396985398","14995690437383350976947687078631429818437217746718268679299515186473891812908","1173662311857265316234231482479000224594910385121353149729453581304925842874","16317128331316988904656774031136187679889289360179612223631661201288928381507","18022252460738403017955303125247197991330411362748880642725885324976196166640","8288649066280936236016549066415276935462595711048345269972110782845103139499","8101426167425842649552999897331966976546505505184628823541554176858292445739","19821753079400865197220037270302986474791903810187177911888698563958948917390","2784180484916863460671428583402451895733388047312540417328482549247889132480","4344349451137697568800756375175722014382670587070900626206184353193889614535","17108052563527778392492084240217991568486546407558042288984049724593379381422","7485356603493015640805315156078413547503227090809875264979461763636775540173","20116242746183168873263923842229951811573923370432089711294380935911814240419","9858039399154443683907425505646969133966670338173331647839576035520625125303","5936033307217133264257041597188115964457637953718647112906870372504454763103","10340607376355789386185133452696959378680344963374631186204861558290387937896","15143103911463403933694713744901214045515642353696764687126063928209653789192","12568011130622849006768060215361376856516151918301278020507921479894858098922","7111521666440256973246253704702100762492860379595157618666729636714922588085","7580486685427227006299614937862983316144183764347073757169003614550356572325","12502519505884004909911681176131189323239621629488138970782034914590014092043","9863581385421851101081385563919847832922036616162751380834430385700096059476","17089158809476144094792821264939338147530021791726877719480271708166652703326","7026088105062704237034940019476526637397741963002343232018356066556664336014","994845445499189024937804545514312797076696078022167307949339617575675546961","15876781382035467218016033046055811573116707790724628548144881416519229111730","14689809674274247318241891219567086413796397509459798242967892601162783903120","16802092988897859361455231737511996509109485446405679231988222489773597130923","11709594647859446002857187914237272532186051520048442968950936220950857315304","4759519183626534098537305899218615829180752782224491547499330146161396795604","12571776796240659864426729857318456609425220646299460273766246547672790642171","2769573858251324685257310553432601557929569520156842199955099014544291860073","21350702766688879701309742399569256840528276777122627878991656869575644945880","2526626063522996270964234050318417686046098564667525063669005074312714302888","18423969495073310328067310084757878116209975357377687351451039175700497833267","21531220091658777616686839660258285747325371338144374109694041768891457998130","8427394214275103558108677503145255849560869946329377312496236014365158589665","17828380319195981604154858938823367276654533109286377267191125673334432160668","19783211215983774081961805533835609388239392763346884852979216953198247940356","3727051737154131506128614318795547682671073691116653628343563309169975365047","4119083313708678127132222977172109489163864264438306707583540610970422311783","6252287104931155232025872198136217318428623125187576197254682957610815437724","16710755249167084189102639360502018827510499697025984202991420112604257385843","18110033746887190005442882808977635890410904404891461118841516946874175301218","2918227864528514910093363913084628926376993023173539111767698239437487745517","13157904629518409143900661589841979526819718227397509343138754500932973967009","15465984474345304234742186236252931608183011971272680663570940465290570424186","11878026413156941826685108652791732794881788651335612324490880949402660131765","21741112052399478281259924033664983472268352228185898315463068813827126161518","4747527944432994412143611227692094864627491876083414817086093654783041623806","10277509022239901860432140475301792168394200477149266436561100920061205891272","20754999404087624192417155025756386217241070628838846889103117636133597080130","1227483547193673052804267071643209335283088310397022289984033072158054393499","16307552232859454034882961446345138774643318545424496725987397798274178077698","11567226711210341061121984162541681925200952470462920272949521200488251321412","15424227904345959422619063085953205567698592752523587527109367016932522520639","16823401920568234413742595921287817924794689336332341371093680173736681497958","17178500371576477554985292834973399172166544093847768566487624429998590283954","1102400953040339496875839457489553861844373351305506415352858751913370587559","13080464865068812038556558702873972281884160558346383435106169788680033625409","17566439771637037764512551735908097926933863312105991588803956078424179421422","16017589041969736678541292248300058552736340849527861225476737351214952910390","17523132608433278488363705847003860425511874430394165130941513353774134550203","8092883253891793587844758644260299541045067550613025971974356731243569159353","12321254675263434305822776900976243546292614577867012315420304293383073504807","19531149435917118867843015828825849821207961709742362361864708921630704500355","15354576088842604762866949406584165222230700080158133636047990454918586008294","21332421319707262576917441034633152814114387620450650854230219273363255599523","8015272434831541996001880872358562207725683343073706305494326975486227960571","12801191151888372376060502552634956842440004908360922421581803464085063730700","8694104440224692716427888474719601394171838580385724406065092424387979527599","4765509078609181892846277022626232660521104569272055934150322254832843470212","1707661917588143644633891057877135790850785409331274025620234613394143277776","10787008015387605260759430860865388187745278282497799140302256368934199376144","18194756507120382377518900347608092311408202948025495396169941673887229961968","11810263163672173278046828506977243322053551737568215505161953008771538087012","10172831874213234727939155250453684259406380736682460492997296249444174287647","17213618752642545792657024676808752714343165784509075154710334645425090992985","9518819925372898218456223308202739688600409921430244215353056882744779318092","17131123136661624080110214353958082369854888444117983370276647495116278598167","19754012921975586054359731668325890866854753884616461552066225420294483351377","7462008052105461259399778705587223745964230591131678540554526750478109055926","5484333959594514705555581721735095833500903297285196545219921231872772537173","2557226013119092043233815190178143918872697500327638257441826698928999698503","1507054359686440154418474816353859974171432117437965276706552855449701554081","2909679213050550436618171367293366253775019191659100521218714623421006853461","10665116922568564616606427374948039957862979916786672099258153181783312457007","7437027687262241094771256075741913500475069050164092161144508657935421667697","9967053963569379718319069707565959289787419857073584408604810513462532221521","15718982984756021542737562070818004660368251058309053869841344798298950796472","8594575682392663586907570362979165880675434255219238535736457340406406145184","9849370649402433736350811470041391602601158790752692132296227692446786080869","9624482408802253671341983829498637676172459849241801149966973606965080480613","13354161934013526849172225712805307512472349171765307613219141825881166556129","7119937145734334389233313270329538489802620576999159113776679378225285195305","1344157477128478949987376865221983316869875771654805484027433189770507053978","2436371520942165567892833442377818872689562318523120379398949725464297140490","4640506731710423220152475272336202432209747972077657499961644265967270381722","8134111173406553366062271384030182464082652625519520524317327080426662707160","18835504434223507510706711065799771244448550952615072290009282262161978175311","14077721328629763505638231073434724231382773989965313645642436166756183358663","19436373778921499805072424422947303671456441758269542721598857156355476127485","12568904822717093384930952712937445754376237421200202440659283713620770814211","20314955959257660560921000685610824477917159776697875155847298772747329300768","11405801816929456032970782505841034689257844102373121701727764117532089184356","15371647220804665136508666928297419442325993974748904907636841654537146688325","1655879953669995298671229751452904731600368401825229264959225234155007235923","13666140938671349359494215404645073043195359971495797664882691221640390995273","12550904050297885561370934024413826444188941904477880730238385153385367165600","14073644402192665599906362483011583221003958995020521977339575317519946136820","16127269466493498734385715523881795251511197745525351003593964386278292404389","14837032480553715504482333167436817124130071726116661830299825705998767715604","3157996448090083717095242716808677272509143175022438801158190773708431950360","9715473676333570416382435678725993563514140964778059556896984581776706520887","256184547541958273285404071642922907436096112735647965196154201025022277333","5146840525622632106780932715431071405921695127146286279740961056077516621929","18384530045422033192575749482772861619638670180561846412064951946020645182188","11372273308168053261873108888838115723774928158127953375858579798875763228181","833683215294780236385091047137868434268111079744466678646701850123603485156","7089521065433622137186726201244536967699813557477580528539264131550132846173","18389315271722108026135864703744658330872185858220834005947924896718372293177","5273779548466102910604406559710961194676307482240757707576993583088923382766","10978849613552770174834059773211945346561256353926504281930385060310161512588","2025512406735026708082790073002703032266582308582294674172511260928159182091","4504468100864789788585048558923081175827147016553914221993821395902410226580","14522713701686086398049669439257754726056815369755592306901430082418783986888","1172467899506707275500621151748833545282318904665709759177855581577968013027","4017285937828459403753883561608416496086703957918951620827271391321529059987","11864471167080016922573162728545364451553961508840493342354739707638549565971","15395434394935126648016086405692837721115704686064641372105542066627038311542","4122633947230663267544557410467288252271224090277013257161493137456223809532","12367035182954332461724293253434245043112564579380915260333747415793763231827","11865369149265328070561952780930053440760117444614610585601990621600973752433","21203992229059334721432650225967073448947553069874953360114881444016046128212","4447062027498500706657516396155423649120105266695738260082288656873877775154","9768914556161785389033236087454305484803915332998751645480448064781057341482","20108322604990560980160877548004215957204376010054104051873159423654202752320","9595509101896597349796523888856236119720835531243000900720041097386819336414","14587725319883470075206520097311394112137459424358160384009848233555406814065","5457101278978742540891941392855879387574924402835776693411461549501000663895","12113841369063820983468698918538182086204397742190461968800698674517428421051","16068938140317889943118931947504964857830114253819180369876235993296869951694","13406404344690547712656422177528636282657567373508751252664435506615272243163","11920541176421075939593055125523895823398130674849391046727892158235384625698","18352551139579012013897403430987382961093216812627912973277904518956583676698","10674676651948544879371283545502930890187181335773388262215810803244237530411","17792652617465281251634086173304934915478757132116004782258567349353652661413","14095161285749055405609690234399476131633768997386366652456808192371657539278","14644418417880601716605432589809764539302677626964586647781758014634427301961","12682826801878685279471965670138908278972084615404951130397921689553252275917","16521811006308378802185018489472310864659177006048843323237150403797976462809","7587334525407307163363028377898856862752809539521418102406305044826227081231","2908188489370783835450675853612280861255988950722158120607386028475371765438","5768335837479629879988785208318290476463727379450480334123633739596865462597","18397687037462833823572912519678833347435022340840883701032875748539812458303","2064051903495281633275569322215038029852745445612015454511944780242997049313","20703062910303292827787302109557408114919292642975918255062370581536946280279","5192613644883731002587556312741958983910430944297172298315082126198947618654","313995112743011376940466097068957324809905301874096868794869587134429900695","6100583804412559896713857626556992976882930387670359810813986481223803866656","7568477784584193520555596651137331005687926377144262826447525559308115017859","11965816735476149301106556132754318298248490433423691841191513590415182681067","14207753099541107589311100328670316235529404246579031740240567057338780037783","8175181231439895653513458924728919160206799108112661960299471181538010485894","591574950925877159318533535833931322303268506486282492008424162963779338055","6291500295969425140209019573620316970493238770424073159034492473203273747991","21323803361917137983608045653271447127437985941865950514234012867420827584203","3099253561554789805581090448570743201416121773155589506816603655098155495780","1839714309313076287091568541152080485292267125822172679972972462776530418282","2558200175908531709047812372022758109817946983415270005672004724309427120260","19741248350058279216600684476328478604110692693351318658499898211265333707610","20513396347684804966709449761679280054940274793206626286808671260812749605107","21199395741845301585097008478390085111700771593140616012257190707415683678475","1193295440609646713499404272654104228852330502286294623055524015452275511910","20305220021223370039849959575983199996369990375922681857965899850450967281896","17820107252376141054638728180510570702321859107787033667301953883945482820393","8562102223756709272478881672945718062091524608141507453584726675060317232047","12729866889854088213825002226835767386413454298567413984333803695815667483218","2114069176086645971772669409791461648578645286643393688006056656185576536095","10328720387192484120632500167812311141771979930211632623234748092781923576473","19538747176808583509408758149278829047639151822592778264069763723986282915906","21566485228448007978934061238916445477820075682293291063348941039309377547117","16512874118663027529632973954247179090732712450359926425594828287754653354014","19513474361159315670934532641131225842686472304714306461918568972038209446632","17955660451558996091453589881731410953454580996956628370387347653903874484464","20207812711298497695792679093438648102083829229107494830848501937376854876915","2421660685500283805427163525391537853360580630525738399011621278281378880490","21220637208096207115274223617089911838806190587185640536543744119096826805827","11835649411559295031133501496374511598555615522238237687109557873710817042117","21845843315206305464060299008256175893069927481104540219951750648498803200926","20631059480895873966832525659452814534529673650140538889746811436460301724612","14931947145214186450366175386309608636198382084457683854282076180248650112954","11269118025480001613427470548591071135727829235390508347983385837123112634632","1605115028499197336856195103688387642848510242987640636183693756727845197451","14793151932068045192821467479293563014237700538215102580962654003247886510086","4775792479749631121184048728741675916968972636777338242957201950342436979106","11924757182338412396519976020707321303982941838080766083060365440475015697923","8793012126741532580270517228948233516584291822980201382325016017213162919448","12947791384548987120483288495488647496188362270092208812080516723498086541311","12431577747633669956276147567242529475925082219146607091004191516701144136626","21295609310519517439106939049470380075664847294017743131672693330232031255386","17805136075624551692961527907699002356636158441633111730604045300707846396897","15278588475566957386556949449930796412080383857587931690843946622004601690164","15086592550570758313718621320890905171205067149643603272496296451366320734641","8699916934544892971206820107825237806538121069002198874248662615835467665756","20478102917550226644126628799218539559581625330717095591690828406489686677387","21734112019017835960392215716550916739517609682150258078062175843229766012777","5622924154085488629989980934517712826380247658471643194906695701678873126248","5037675567259013572001419121301772828485815086531243296178132779054418101400","7879292516618887859296404288004569598567284522338026817864475104197386629625","18997982317212461405999296872279110480053417447725407290297221773473330565737","12867218521408319698642020263791067688553778005223894447782779145063273233968","391334649391830733165647799040269744369307545998620269291478209889127672130","19779172617188671507005003625727124894180457774396709811826326667504496286059","12596925142329235973535723979633472987429833026727663225071980844189781139909","5235665914291793592826849798922237619782905021482837663102032574231117695660","10378176145885707882180864408618732566825397818692038984901565060499728433797","5518777162814311292774945630117311095162296059457944243049863006066284885289","6383788836915296003887453192037395923957940433745589146468108910773431172608","18378980065351051303468356542903949047413878986601754325664070607662174625406","802964496357962027925228076554616050639951769911983531162733260026242452057","1151228765048898930945562930707044057686831938340081500592865256952516058143","1057436684897434830336559210204558056100073281195987707544574829513988277752","8304361322956656858271430255521912446914654094029272611293726480015886358258","18082138547469240768624686868284933205246517716350185535250166506919729036297","18560642658541340224573113670515696181164007817863242462644028839037653788889","21433948922232169473983994578762336789729720241688838555383992306060546089653","4345962888225785406562575377774464692418146638460124795786215785539658204204","18491683482553522621865105209782725705891560836095563832524693063541469370996","1595153957006911891245805177782994356237108154065736758857668165866836749177","12745465492150069776755940532782158049428554675034493241223264612067325589020","21068300037504263522637352854045908904548431623139252516417402783919558466524","21379848283598466733133277088729802150576242926281401193376016094883753111574","9100400045517145192842796463728001529189981626709973391364198878834790401311","761526173875414323215606081295741956635544790572881984169167052547500162094","4523944348324037435946042315903741390453752174721180782503374766412842506857","12826905798159813196098719614569295407483904515869413174592666343625127014683","21298301889175245346300576454864405649687317534182187998123555815790664451812","10466120407875459863164008656471249355019715662927569351006572823820953788770","18765634104736621669847916286108860226531877076283270686539673115026794951054","18029301674050837995501532337862434439785535856508206309403192619917393036618","8656248943628007700842555256812779240721861558942157285882333517421090859241","909124445964415430289446157964020522347064797918541903582383763270622833065","20322508313744566548149933895745626560811233314858699012656697985674387463552","11473133631180469596497273861714489893486108521245550300092095833600832127254","13886897454587288170317041019583091209557063660075562594238782502591880617730","1388351321374629053594529120028798986653727606192516406127733531956260217411","10820498967321126905058350631999655366739224197864958698259285565142810221774","9047437255774003551209946810681504440615180683867384529725252909718397576529","17682412621232111800652746737073732995871115754692913515596320621857114840713","17459249118412305865677329263167949944924745890546683445077681421571205578033","11260954622870514070117395143161679907416702369566601131920841166642078224652","21311356397831915997286783986273772284683252550215836267508561431199821451048","11763136682097804856942897773203126982150872911828688544623632129427460812219","21842630190420364126017236966197050216368815810409077092920252710858332802605","10278342550043948522301945276707570006673669578955262430508437722137975686347","13669836394181980472800926591849938243993826306313038236968977604089281032142","18982534836139734957526305655442344936227781958587358112416788951995174742854","924143300713476371714205215173483600456664902950245170837265326237374786123","648653927285053636997438895046220979749796246169864485502279639829145629278","5468004955461336959690612122600291068806333434489556112046051739596943193825","8198966717021290997043372415176306737647953294267526104476290516107668308327","6330635298670709263682446486509049538654774571294109306447884201740681314492","15801944407747674095773310676934626868427752390875620230089308747846331256404","3507827835726968508794483439124475369701726928422484362860421123326683863238","19859419638162971296535544182202685481010250129955481751622623103942606817204","2670989291504532792325900963509629466753053370545313281400138104314529277740","20601648770014328601409368128706235447141623327602444994362138629813091391329","9020250281221486894014346959707974240825231024554709686306581193571046947004","19448071090920013487075559489904268747031170350571103602007176116016451645384","9855626424064670213123764401317371994977710260418114099460019043585303617049","273960241475408299521801713993986326049831910833352543450619250235219034159","15178055939386630045266985854218396695095661921662396071305063121158729338683","16418360709708558514136044760916389529230612136576500765316577679946210432608","4221665154001721396448157482529680285294859819946962645592731760300169936774","15928426927240248300966353802918564700528184618416199798406399357144022404431","16641721098080574825584685806515290482647504340255838968877260490026580761685","5043328033043791709396469989853970276607353659738086803538716424273826786751","2365847136059064646235805353745790884320090296651246286300639444304747972170","4041703631909032338305847932603086185355677713004583954544688331535508848539","18955336159113062251133387111166001228674233452447804151061756635904896062707","9901364682511638439145386800139126568286116168499773668656609155268493975894","11850476168601990118767540453922551640834371441287882635558900147928082262216","8857437780894568467707096644244374183076362042327783482111667874668631632981"],["6147626315983398599623828701433547333453673391438677577603594265593492970579","17373941468853383126219105459190068607050821581808945666945628085762579781113","18675852993023932535703943048744467387004823435670327290887021721028261389122","2852369548793040881968762533784361230628321032910817596034076837353628838943","5808467217603839720723505746949026082419372220269554685256079561191978282423","881630969072083868970336367377553654445065403827225682564307597561668597575","19544569990585406772407871178492435999506060638507114401323899877313464549579","14878267709748128552530883948142489440260354911618515434884876633626486579649","17343819805602859300805807767921021643427945275478160475923718327955601493598","3147144316923493090898234228150076463075245015934615180699926751367408060422","20836727665349317544574927486063082355196001294246787527562129483352381083452","96317145595907405996130011904544599751055402678957605793377422485629255379","20396399042769838623280415410496555539316767877730329966640626730926403538050","16544170913650251958438511948437422304220931730646181712426172729311415616383","6584506727240961509162532209184300869090704109605569344599278616387977422824","19590566998868166131570194251669644997762427398843457301697274732261028743482","5370939348013017640853545726351872135226117514092676042183078550348501472430","3811261164977684952917850156691783437850828453502434535632153500394919711066","2749726461932787493809872269818342486261987625587896664994441378571818459053","11383915573983550688310113375653707661251254539665869167504588473259548645124","9916838988690774667483310481489200062268225403498599116738660259134492019394","19136188641055168463315034876725446731284472265583750601248498822680260653971","15887516977805743066217960044189842288305843582510102551810703206237207936575","17786336987824848955338515695131540821733411380051551383014609903313869530398","21005051851388306179077283769904047735509863101513109127654074489561708676041","16280781107126745125834716140922874326275066681906520932680370323147962007407","18273950651435988187072089200354144803354368518942337504978631619058165888339","18614652687185018380961130295677654222896772969195870105326190888698032468947","4648922361007933120465784894534004676668545278891300743738784783083164272952","11310213903650223937806708987912823331078563035902775716617057417534768150412","7092536296444781034677326999670539648216791129534729748520186653858607985630","16270772820615792622649247387660453356874032254909236504742474628472692028293","385367092325849782070593441039432083386681944665738979932466043995962540397","17805827342754632514390359424735316390746977081512834158806889154912559417928","20024907198154552436345245141243452270494636033297743549316539293869591409833","9234215646545489320069965310786583269490329356796444977441184167452078293345","17108590030314435824853432467901019859333457116609928515585181187173490423143","15910315900966077593714516016038233988218165769429475135456816210775619893043","6195529693120591346695405780440805718170994701745792651233817614742815203519","4245441012583870678188242646630412070966678757506494973612671283946354025495","2304903496039614013605109532969224328136162284873560250803845559468196156250","11693016457541736187220331042599070447664888658389150771534133194896638661901","1776517450185237199728116828598779967801038886584334689860313819128919908981","7806153986794341965459846938333081037827814782827885300996474222107928077822","17940588722606126928451685498548023407258873216558463377906081460549591575057","10371799193925909119136931769852410380947084603350351962123549948328327267702","20122148120685258769574029387408965700271219988052875651388434729616831444683","15035551217063457270042973549639483148607470023686796059163084647483242309786","16489878967514620362925449612730416514860426946012382948452004149598402083056","14240790414988975854386511568244923807338302009634523655466832132581555975516","15133406953007414531549110172748354779664260706851670137432180705639417343549","10690705590498820694610024170434557617847607229814360354839513194179728718523","13827979863066172786489124156769882364122124730007514470708895273478430314352","10710843232017112245199417697882565131311711949064640083364964016238583286376","16219821984152229456789841617124740176636143790533787306195214918183002289404","4443945405253668151711239889811682417722099787812699348882165569376836194505","13374936606384334329293205906352917858363668730599007422148591620583177873052","3130547537528629940846669185730749089538439536961954499553850136295109479545","4303969243784057034508123321715648667535372719281283244828773166674886261201","5989216789074209153873415762140487008397424300536017420337913939751018987680","3029463357835799909868216943346697078874683636588794683737453399576373478011","10476618143678752746465404417470443166809882491668311058666046570010751632186","9994925982779240617159890198100947662001398642389912929229658664058421436627","10176970544481288451346462511134758722164701220782536015402174118877826889800","18424158448523814893964414770095134832293892346615425373638250882224929431363","19366956079105748480886421061443145211970920795004384777659195934741753207944","11091181874846694774338090174372100116252530248564050096856395252568163657858","17353128656714558089667149499397061301594727975663152036301560017860428071020","13238006665653699249266914212871756817371819001645951476708047899463834219655","17055039311662343661955654211226746040465401123503635116898702099310815674177","5286666690003794895264449438418387547354350464287559511315554292024950176939","21392902555527188320634786446573898587249542929111262797890644582493861156962","12406681026512063332827308700529401005255127889048956231922878327520360845401","15434870710485794945517495742061260302820776556272580983813299352075013239869","4411491701113234064838089923553395617470727028121925035608993460932615875057","21024748108044825160048785654599582463761474190244764788874831807499478838044","7680978131380729207527636139131932637240489018432030824029067562073349627035","3408321867876643922057696479500927118853015770099176846426613051383968395111","4044017192507961081067569272422827731313648032811501750491406776829097444161","18331703123531329496821809270389173567173788148638525857133489033465163738374","8581985490532916637196455609081483082508040719164880448426655573293277467062","17097175177088407223987763609523437237317521418906500697394784959942004837183","17283357547543881822643982373752501634581207450744975027579424701697125768519","3114289317415665754315257515672327794564766886045727889771094589828045932059","4121982161232138234296918278643894219608247208937391244623132656218561035287","18319708437247829803403759962528832876979834741757230504257542910042917362674","264107059990458404050537285229935399100000658138987761233089330774579905414","19245962424630901799103732912445198554851301611802664729994835041984045352647","21481268955474162972538912477676302548213221412224453884623843567742457980931","13054652880944215100409957427046741206809909544801248923065995115092723867125","17445423482926512875731005227671884579111686501047535297579963992185600838705","13989585853109988062633188826244755875692853006739238542727480592170337647991","17644249062718367051707138555752661559694857297122633537358146305277959197700","11213280149118368264941616591024002649789370846345639214204202104395949573001","2479430738743447865220578715093732023607362497809812709721841147273010985071","19170346831324042064260292435651736023454774283928671114965428783767444651501","2249773762348190221814627264878686106981051077241650380763848925904895399587","15785155470883637875946431544967116475458109417323663711972510236612352559606","946428851254816645126686470157531364802207503637938152327774118754374664228","18081301874601965299421330559019912584730626502654796906499991148349725577704","13638831153633382373670579690567703064487867416124713117627597359296662910776","15731178958324434544665473314389188985713105014648908423598119023855377917080","9917979824441332180713189841520827682801122499780827932105321535841262104099","4477218349911392146745102565364781587379138332203307397011323331851070628289","4196116502992100152382226026767611298689212092096205622483116328361954387479","4125553640263062687363595819368491141976517437635820252286742313008508733408","1260916008238883369640783899703958869740490511938805562587993523697780059646","12030453507844788085837941465326991051577705323179782129621819752109773617130","1616729892142733988881271632334115354383082667129246299673207948969677972419","17790116243542925627055862896879089936668179540204703569058484177080937502249","4916826165840990844304507037890792549751849160422839689006410477257882391042","11584213073802412059271369957747279514114648193038035041611261743642554198283","16719835981206947895865946283283198567714807826433642746085372541538665338476","6699399511839905674805128446395397180664778802443708408977716737554091911123","21780850712707430600781028241084903375323034847472170705641134914367959985053","19650714630255045094059400839309517919992981015448837327702161504806266186096","17728935862560672332557173079197586635912056977568426093575277173589712551874","18218981656817542290354649557423542606221103516149396438505913482628491393745","16173320918545320350179263895050487620415753262311467001135680573821491660778","18749132839734280672991763462021231851140006460544549438336391357928762150912","19804729718734886506325561935920047752142654855830698311803656972478290268053","19852022811935550911202582188078555585552613695164681730307677046973334627440","1599238738915787308523391744992048319751794205228407988676015490331611074242","2730284211443506246137882698953449192620036180418562865041025043475273902148","16642697364423389759779785009909902509686802244536597340124664260693547218575","7030277536951152393489269782340459687632322761209815510891507421842401544976","2645282365316576153620189595563363498245471716604607785997545100954415436532","11836599958145463724978298325224948617075734206019980907941992318726742885090","9379836389594058052193342143605994573576860036693790984289698770005233003816","4936097975532856331587608856145453431462626157074390483327785374648647979182","14261272621177565679908729509467309781957277604700789847167775203637724156588","14384042993612223493091843709687195745753711205656098174358380328322622785674","7602522474780883033451932042024754309460846024406091409064496525413778743895","19284327179747355275744653991040577201544689654594363414180160712801683063400","8732420760226712172720096817390921487059254890223844820526135811172306039693","8736871804423236893739486045277613796724214967823222024310614732306446417478","10122727759967140400011531456417357002819799283827520027869345304850304243508","19600428976911158591758195579983230165311737010182255016349431988452518779459","21412640599888310728963227806182550957212529173812561818872357742782768708282","3382834884251505446697465695665888436600985771748054896175510070178943176799","5424268238511504833112942792546766462909191487396278645494904715254618246619","4984721874344265817742647345247970905833992888391940986059043485748528986042","2022573256442159494507968677656879636847262260354573370537255737091303819556","11258631584671172573229663590119520723468593511856614616016550772001845679866","14324740608597503028071282210876807343017578554502044501781245297161562860956","7445577371344670075033666971816988473049110374105172758569837792031494150228","13265606669106939823865364576315756612847139875689786156097851279279751433679","15238598484646922414421482495816633433705816808586791968083189157308379106115","10725523252426841374788275651734494325010706400301821980153464968050696737279","2633265364932628352793223988839752923311811166605503408947317749518744833456","7861175100418742846275793570757956123670007434573183352685296812332256704932","20999935414216903738941146789202104744586510072221252339001858617626303789982","5977614056432951814585414112421531222403223146602229861429936680581955055431","5931860876714797492092042112133640002267237452913723501691750002357001804830","14562008797185891958620443495496757871981918350581241703926621633158489195321","3505336021898609386263210131367635622704109853221241394942451388531030669769","16578235706824809523014538640948495588856893463000137040801413215727773380083","19375742803446681387195879499847072356772969941415230923234757010947456367191","6255367488637769736903949293980465723272271368601658401735079096147956784460","5906589694839922614995302078445158282424694339180630855015083500482196538868","13065708825279387211110931433757563977807644647530652721233367802469448976082","18232288076160370323511493082329108072058465477630759182903324408872159664436","9270542950868120082380674008791159538242222696005636916635750372888607203828","19388836984681019018462719709134421248793536992065958947499056787254258751682","17644385837318767408448645196495912141788591335975890639327420146901601072885","6455842021230030087723301679631006132297894313543816349547744163571857006938","12651647178446817886752319997848206955275956948340732199496215365053869535220","2038361690839579121638674254611449047008451768255542263231913955112979412052","14552505619309469592330707557293319610565413217299690813565239349254723939882","21809351305961289002997783583503461155560460938189863591461820286363980258154","19881244303935038444446962795728167560499810309912834473138514895445137175717","6434629727222395907353855634693221759145469065378967099211977918254204835433","11036466183244547002625933810655331358597012489081560653011525594219740881518","8696860013373675168559529464941134452066614743853560004905114221628099326183","6286610834190704195966860183541611347543876431770635371755207708407012119352","13785489482270739528894668899177561091226326813787695987264179185340645885448","8810497353129284320787428455370522511595657262006456870793996863971532676464","5950943845893271397160198360810800783099372758072046372020789345881371710825","5530915356962172707660737783638532094011201648224151382306028119770642279776","11091512250862371871604003187867080726528592592629078709401778342108977650047","15783644080397148510988340229704570796603281391084254749002543719002855287616","8763200105989369123326685776257599315907057694736599355967140415031996938110","16265670810206356417408073001772331032782360202117620221162260100178521648170","1060900582879546587300450314779603179547289174918628695451776494250751383469","14744516682282904590256322734403856848450648676567397632124016636373922693953","7963533020284370085512706609272793180113190314656815518091154379468342864360","21847103720496839760484939812661124697765074217247378137013246709106995512794","1653069435316409742759195996639155716495640457841657992745920070999323194315","1779277606640375903995595532406543892084224209567520378547237815999026067520","6995080044923736291442893376098805495068105284761180709673883412002971316831","10811321648124662138091377293526509914253637698173706332138689100382399963395","9601406465257748919110853775299124310985215012739412476110920449990474867354","18028141367193319054744440498619071967828221741281699864949191934036691507436","4607466430137542836150125749612147456128085309366797118935148996775246273855","15800640783457285335285505218287458944442721123666981076610926748598613636214","2112321293659869964303812620622373297871082794056351093537916002098854382120","14996631991733135844452595251336653836804943981827712201258451368176439511645","17520271953040754474711528844729345396665279637573303317828245745304573322797","15992472430004058554983936761614313471735664568983200231292353554082612221","13077407987480601704167238541689096961866209332906459397795676348552772889230","21534253000075971492923776155947583634689953016934976887823337792522221291547","819226293199784195154719767176522957736326171336737610132796013897711980028","17185725409385154522175797801720017361441550294043891637734656472407970636529","9575382583490973064980234314462577435416346301295239026337973844317720284455","21099851176254120774822574655588411581847669663738341957209759249291625898415","1966484535215911127324696991190082306993935247312211830919486710094847788468","1995818881696667008089141246304344453132036271634824321961354608938484533959","4667743157901207120637051668285562840191620616648732757926088699083644960980","13962937901967387497010877515712463400252815508150832310185443339350530772930","2629021746995755463136649506818480652912581474323117052162602164762321198516","20573270882617293078262572083653232250462469010594696343790004182829624161934","1913490321993231846954575139695345554332784169136285969356154414660735431290","13795292839631007915139444096743217376580091875142459105510805605582305270567","4058572558281095474323972096333621226798264350365788595026405775805372802770","17437029543151462415223319777679469646123927413521446735086712751233557753685","10258511040614960594008243736815460042536086782694789106787660436697233524699","1776622678963964166858973922665602162169906575558986124356721214967791324096","11475130909983164952012365599635166276537668089861700179995433713710298426958","2952755446410776844254499627216453159408235799061277085887851310752744265074","6624935776718778024845266788797012050011811870823913061539098756037591400653","19954266552453778490807092047530964172323837367905505645486543751921896349997","17616005977353868961299963148697997608390148348790301665790470529963563572688","900786527730568780236819563509871137970324714801299371788326143178262067587","6401534704731549429505440687499634640537230220192633410570095781266996282430","6061080980122679361349022326493404370004932185085913345491175616560373782007","17387786301877646594936351298720257531176301875267218947760820554848082721424"],["3543030996690731296144302074945644993940503512381940281158340485163553427782","14456582958634399729802605390122513015002601504508513170013909507149932778448","3126860645246915297044088167326588591680242124427769024481453610883810108674","20914220112711669635932871895638920862036110651562335932445860492773410166435","13898153337128326598294681972575411161373345548074764167063930702810085143283","11494816488079691563548948406211866308670367580609805045470273810278613528125","9265075386546133998992345241270235168672960377452999502776312567277548502287","20021949048926785450343828102540178861758398598932480397004304243016805279702","17919773090671305519402481279400246318283722142600928508878399512593964809604","9080338876332324361560940283287671152943529212088083669332838878892426421176","6966820873041565099335541093832581518388062131217364208125082807748337444442","4754959170441683519515036606259037626662671578099964081061043425010850133820","3217229650060400896792673270994784175046872440086333007152127029946297106503","21816481050785200027931285072395469615096302360347994694687269782499273734112","12807928427670068278917234235986720684636259679372568354055432889409054949297","13826913883258807838903404263173315859327388859817776690782622774806719577704","14715508594618229304924912287879458078786871554183488309385936868120900302162","4765885366156640574773808467306355912882165708339460440950145437341404320482","16722014012556015216650093088291583395944348552124898992216581531958560404280","7431786809665367144168808343099306354449102161270140701698145535166533004774","12514561575784459520302508925923482055587171874031496440739369331861774361144","13630926037601951290173737881839381432349720276436508871257961452732302249954","2416414043521570830938077478600484585162353864423849325238559208774076695812","3198391645352142061735535711335633217975113436438561010475922095171958777605","11503289488153380408852849064024910165225110948930885911379465054522594126035","17945548492985099414247885601087617115151464172983108926121249791371051519441","15206458584403956760846691261964236163202625304606621285728526159502456182565","18664803356744505916174195454562184678127127391413155379212300226736271965412","1932464282660454008791502282337362663506272754054933505791400845588414354525","7431131941001012844762212013511267729079957740244748755865134237672902463955","12260867654103631227135400757666859922137135589157019044994170609009605682612","3497692461171356958628408153056941313451942465631342687440123894946322982488","3611582236581069332046877419478476119433460345326857976137560691859450607136","16701563436812072022168694511067148429443045594144653838644405459857156283101","888833699088042159861509113185468788045755593715062347382548583028812466468","13027606106406728601332828518562058143615794059325398484231721019790789708383","16867560818956321945646006921505320613308271522776810400640826749438161909114","974286375063546693308153673073274687620807584704373288927095698770718355705","17164647015779775003667370039927920124381231953899936293739647389770842412636","13812735556582478046467982121127334513466404260587580530663067858201550350225","5555318749169933689829489127869820565736743958465695916577439219460828287201","15147736958519110413798327221058929792029254870817672304916259386717996218939","9093783603898735286753718269047404518944180735024302663202149030626421747264","19663528847623587912647904265815395529695410641548007238438947661221514322542","16050486874392688445392573281672864106952702475626854763551538209147588502217","13643154410219745091259394207881994403403664040943113504535042199360092675026","9994393341493081364074783836589113425357957616742680978059011711076524628096","6066727222812778846340829491283999369997291912496005263368499243410295288304","10275229946760815401870389679607490963497978883421730792100185293724085428674","21497546743120095993008732541489604895508606688714374565152084984414487943856","5410109209131659429652823371440397074564204322815773631417855000087652072422","4656718504694933743607748372708327104619579523407806362780445055109254730221","1535539668205688554612129122232712967981273484635206844376645263794510776905","6014624793218490271238764434773189318958730916196905789497853281972696671247","11664508187375558355195352743803150107793615135540732262825506318914225480618","6116179866134076212901873972162049629714787777774217125320617831147732712881","7156436421089505705028328573278072913507065296883146744244791316222380266201","12054467471426975647973340270599475277601084936967912793090659824480359129081","17043004725271027910538237148402068222835120116965638237871055913672994258597","16220455773823909794014715905765711732985616219607584706690711330413977988212","15859369801752308916251957941263160908672747781155852511743194995283478080957","479331876385459584849230762033048956240784621757125043523833547932336732021","17371898586803558805199285151576387708548132346602797103748639637481352576986","1669923098731048999410343513821846398616602374717981505074961546289337325891","5901847159215544530876581081126932589094431032258157198770582781864841878766","18964305080922802950293327616531540488576734432289534207487783803133028591534","21391565661610588080023857012644286006317523285224244461722350412865334901788","13859979526703965599946512832991648449058108364323767375822622250546827051763","14178842945330354151475041451258011251506932092165564803585149961516102229203","9732424347816228834779162921453357383035314691484039491038526173776392679930","2916484128690250908814196431868649363158004790333481812642864057335419267559","7496978836980754621750472326738269854937130487021159668865319635184235054270","15732272029544135687655369960610276709515477689734952583097488077854605780691","7867892378505499328367956370534010327619068595759860677931756173774607866661","2645389195137857175751801166613941761522924817957359363234922821861168369453","5428648673026825822348517069964588690890711938310863981949251926666891252998","5673097051473314160057127163079470500502486665904121175631085109229208920764","12213227243584803853178095425113463791275833583767127368163587230364245722339","18715899303501270934030638370927875241328470260353347061222955717933916891297","7978266080893459514342371863321441749862125749732741901595103595919695778835","11533864861650024617087550487008450420153395602349453386165533302160941562372","18450601439501348601530433257154147113861051704608419841682905432642513197835","9138792247850488245323412019837764753108822692897704202690513828206269873276","8780651517909025350948438820147097471614889914797642770395848326995230079810","16579891454742806064187509751513819282821430255175477305656819644332932757991","20749300053175474642021908869135322928369734326957417903553033361402813233282","14678025512968401250174091062539364192699965591711957564050835184613969981470","14500401299150087749352814234198057059984606531881272078945247743949487640486","5724620856479473091459642481591597298179650010639060800177645976144733457925","19112197370309313151147636092745145521877228675251700148292900136536916932170","13357726589469288818869234910529301323312513752019046957819344054565360588780","13374527560449258023689134260026613122339366365792290373325534211336697566956","4598648858165437260062263715423329175562992143452805065351481409276538133334","11350678282945894657287678422643168089297300739501707849993226500027831816754","3542838338928314843109276018513499150692851830271985332322006221768875867536","6915887598932201892744110121624584826388348577566708154030055143862948900209","3341372370459299156322218222512239866891612731698279185818379265788352168797","5465946929360194216023533683821008640072612018293683841488258245599905867230","12877035916601231664263696261369822574055329194451355438105731392920430333083","7152734772764736233496355792907418897029921786094807846499854978916041968421","3637783930300588858775792406146355117532464453208333425534311131944943620570","10014356913431431526174931647710822588072509765911348937997695830388503275168","1363032458635298325605180167581231122362341661979419469148204786413525015450","14749299418008156951304417344478297351805724111421271311859650072310778072387","17861121930186335338650720704614114161379448007421588691026444381264236189922","13982875176693656046913549248129840458651715264391216676392378240291122094805","17013986540180225001522806840753604869987807622757849834876725452904460718718","2388488441230564305487777723403725189663618052806260479803532470400273033483","13894658705595595767938737767669216953233363697170846839350285544511007008320","14405479371656690634733468702992982854989857716365066876824883028890686397274","5463406390085573883494999080478626961053571243436142083968477629350392248406","21534264698621976459797752593999005975042601484874798974898661774235315370253","19194802163911368935896093977713617556434585040373562667919688000266385189018"],["4674163295886668713721676554153485700383365415679648095685497378991889125957","20352935218386204728405947862710237635292695166913064017138871016474654829503","2592327317691286673995570769733690864734110983311652649344857955817901667605","16569965928578428536982359762305442141555631314673045263042967399169881481663","19131088716759828804870846683575351419567519624591961034686838811980854480317","9445249257154711404997904018575649485936923216724833070474435497562129184354","10263849450559453197266643809044161235269801564997177723771131710603406794657","3056222600207721353960552490330912452663290310028010792283928265227487578173","21790657388633280199755703552074152351760568814499175261713202273123354393653","15632854714111805599199016548148074406028161048345800202040891852724322865404","21055196030884358213128268053901624878656900226499964686210806947320487929084","20870802314656988415071187255580018825359148840256346431540367835816283233663","15616534517743330594960982114818869275309504871292088154595951649532209497803","5784776489399338538186111556208328817680916221272560662302058618935625424664","11524199340075899550845010989583353304937552835400935278913693430093835145958","6111955760150452509644281780032815573756917600365327410927439475076299492518","21618401442204665104986329854020260011488532608326424508093871089299201575674","9730498374695391045394700114591114475449040690008311140197590770638012506878","12450960556188662662174828467496697802873664968238345232698790724056489477852","19541588514194638760835578386391719199522674962225668709200961614811726952776","19932293326229311363288454122969308710212293893428838866879338848665668402397","604198849257174504677551552215661304343812986564057281411653401089383990287","4837206815765999838881694117090048237839208060322594233335602777738216787530","18830045323524997434973757449753199597597645181672539201484808179922595941767","597272048657162684432562166735615322949355566201513589220267457713801638231","1259257565303313693691585589383644773076852691198301937638112297241050998906","4299692760889064110427645653486657433003877634188292107545657115443318790741","18761514049733775183377076664698188376895721558935093039415023511830645880571","6365188664980535830887561182548117129128384651566127038255166094869781288138","10908245784622543297925944831880222108262707146660606570412640969461860215559","2993018118327211849601365308091689105225779815146751382435760912693815943525","17866549521241267273147593454540911294575012954137157106386791620196686306843","7588028284719211287685446874927984833830446870565937360743716093239510828705","2090750922500787060241285930607243134795297756000749701326291975063085030442","9457072070171052855412092923825503562704627349932867548368158306053472163269","21350677681867862863958401218481076613811347308327323704598795557647506601048","20770451808866000075425992751709612657492582152945338552610276408968142282748","2745159125861577162208805239818265210821612624943688815260513025855030451876","4978242409993988630548589666160972377966237165841561311622261456963266093585","8957122665158680185632585169710175898594503225351167444908975902379752039529","19785721977895675912077792966249940018620743361119818565517998582038530845572","11861870201391731884519245957624651537058767900307989639229586431063741762358","17255005338003805991070153748300808006158858491831332904540491356269058934807","20968613871554279013641220706303052278063770382104154194145614761598803229320","17088772914095596168232405755085581150280602134464528873794740219829997655905","17762875723381349883234521669486732244273741572046761163213388126273123976716","15757253055041927933508930441807290266967740722748969628910267606081057123247","9296526004150722607881458789952527402293389026976957647013649334875654666846","3258056648875256712165532481568505756954239103970575560653877933695716301019","10077274438511253450890613064192766199813655931242373841397350705759494726833","2485034538638996467225599076052442891342629898657527900536984935467064278829","20576592492040545165717975426556128169364393232969413514916564746364553078536","4404702101406694105795814505550144493036964326057335262710910677583726782302","4390438145706544373827946112868446908872103380251483996161316711096059314249","9320005299875600545246395152752248247569867819827474604280747799854851456406","15328920202400920589852925898624698939637026854484346389158880426029840472715","19444529705654982261781611244830441964336126547310756977478168188912080964036"],["9752260370971488270527045586368300736990068930727356612443733058936980331181","17861152003533815607258975980932083069070125130602569693881058150421024162425","5478494136231859826920266196710092163036570975555566533890278380032436251008","10470663114025860164205954011633511602249334550961664618144343510421485102643","8584166711424171940897653413099916249371028337527773813210106792825433993045","480687478798944972518402568634409857315487979030618520260560257514160422118","19050370281780858565019483243537472514353065987940901395981643695477442070526","7909886408711298712459179052698439249376302724729633721254586660282875932937","3422546743310933069772687665765317843579486790338039447423961278453066592006","13742327444822703543525245712246928813767223841816014893394911139318645136377","19985290653818527520481099040857204751957970313061971657480471856178364435734","5113623454243607312202962083851358306245672221703960790609797677771133546193","14116233721356660472284501740073810322785672551591291061323721256009346455878","4926155427866587734566793124447479446126808496458547974505225385766449054331","18737837843661096774737022603512579127563955418171470936320273353744942252119","10488727327274145721487028816083558148874702222936756843781953611817021479453","7430416809625816246215887987474320468895157902878142604273583498117862871629","15362958033781690751249945980799034135612747452438262501485459571192039957761","7971998013662637796977575957753688748657729947937463070177130208011037377134","6181181645748233273792885809633370176374365207286274393529265842466407115861","5314629852576387633630556100168250725317801821478381622914586992960199366","4515888460995791866096611222708075397170126060611423125117883548580281554338","74545133806554228861741049751398547087539129543232065265760967657668834985","7620596223797793424148158028949488299269254840309986200826069272117699745990","6891523215930979790200291579163513136440547056829176430750166726452304949371","16099728065410135581098672343255205185915801569430121937096121254451019507098","6557913779080084600620474619010501057622990909691220199506246579366751973182","629939504373643127852968084066404538738439068647901008271397818529825932208","16099832468946902732124320171948452597322634043778818748638339267108275446697"],["4703464382863044657879311175544785995557811809566957314411289057472490527020","3843782899730931149066837823855957195082814690023486343961650216093340265958","19753920348283277126115182030019993058097502466641468039307766133748654311731","6387046033771728790683513731756820363186884656538206941762539587100790793303","6083333704170189791347928946890269084686281072760260996461982250183813813455","3601362179840050473869565367769437889028980382089846018464370888724390080742","15027638961056161803405095516489512786991681560756640705495942526018791294016","19710873932029592796622363789856158433724106192219625427302644279655507023367","15638024414045421488677288694998914769438007035716986615640454221215106257457","15226555011982219477858209163809404309053286511808301742968320176656943221415","5370110265920942801753988420413217249900497386077178581974767910364898916037","16446764745477539410117561326613320146727869338745239407663387010432667098744","6928924323713233714997990198973637030825419323916177069979007639608046912970","19348991226118506958152269076463657327287453752172685562174237622786490116354","16666475864651184183551914965752229050329084262331348559694804883919620875345"],["18812969291333960246714927634541285791301021530654461980802056598587931445724","4704875114419935020350178682811140808616028527479657778061958964369984912380","15617352465980977810710937287156471405834630169023818314675251313292328425896","16144221017969671721449460332127347762820423413386277478456163956038616567891","3380797458259597109673995325806610244842743962089650531774414197031119011667","10808087229606934664635917926735817482378681653152030112405462220077698611677","1126944913887516904289476884314188784817875835019645183711270186623300417204","13585977120008359172676716020499921148287788176902665318875005382858023049126"],["3181021621803672270534191685279668265378151263688297096626662902385759927090","5364058324337084345210724157442488646258495950496398875849562278111691871665","10224931444631296256306111997023259115908040230658265780895445976301767844798","9285325465358827477019037630792435617232378052797681942227278264801019284121"],["18616110284164381247048792467749872996052606923771839554448275315790271733321","12572153507187626417608946244065205064434867662196802627032530966507417762503"],["18126106310786725129428640777676658837637478243988854333395464759337247819902"],["18989861085019751010373715058404980337683128058696554620480532863042272162529"],["11406887179192998141316434121926377942525639172220901846038964800699077034561"]] \ No newline at end of file +[["8691474413369666750892234614358820289658368726857552974633024543804680298964","17496320222604434917256246718514403734235740171188912286919341525891256570713","20717661531343094401419404535005724208121214979487601078059038701197331043233","8338161038189752845969324086767343943203808400163733790574844916777622907526","2244871586170865025448272825497968057027141766617969218599365252909572535577","3608626711809097355394527544415447989465407554113965209630262872975367728702","15123415314399351471075303556718608687323785898137080424470982286311735782352","712912966757927878965693240425422971881715436008090497769457122872348343952","3196185115626403769090812264110127828126981872545481387659039004737077237629","20852945694892786589706882486760988740184637230152727898060254427102399724085","663438552256433061576054140809160443818506164632349621099807794702352080693","18682912995789016595436882433435139159334702280353629213700041190405671371221","954361121666374676317512516553835448496801654442662842741750447529976221096","15976568257028838086904371689993285445196617581672212770040719579976951713437","1689709601556268020419125248006910470935068691712645256591639741945971733744","1644637032401895183536122531980635414363418149797237304436572320773189961342","10530161321691746280687450853188873346740398773252979676317929677235626245235","2628389834360132333366589026387003814868457686372552787974500759887369913155","20551785199765572414957755636883446606643894289625551996383687264006196444272","14647299140966795168634863382011786101084247791740654785196548451662948086183","17547875379231708590555723879540779728666475590929028917859771769395698401715","4087977103445290602464010775212316926483391914870441578758042979308767270230","6714269803293029270909153658663808588557387497502190042744619007611526657435","21829614378897985584789450465826668649930021698690579364831443823904306431333","7532552732354833964818948844447124010555621930545046129036742684162649680796","3085746588958121678695340573755073635811671969466202529706243909144419544906","15358264232435244032159222413023294519420811338021914047216004862176094578703","274618135907332659550125464790981847888019268634834758638296553463810383811","3145275707337847188939353064357731848534516166917140907835781738084777990262","712912966757927878965693240425422971881715436008090497769457122872348343952","21219905789358323534478545279193723251420616841556623254711235028135342626157","9798324625310926002331408522163043190724749435063160272808536376189654148756","13582411668238263333995209483029305625601807569534701653376051071840372484093","15950000082544045394526115523741159615348156864031044224172890462894241606231","5992148578777868893458748144399130666011631987544731979896999269126511048457","5001232371587577350490476563931715794477203224577970619789108259266886603950","17806353473562524209419921489674020711603878477377228029846764687154796899291","4781857348503260904895922377303003708601361291248025972804843818012461675526","19725005896671978040083076043827582994250733273969992727037910840857608608713","6771553323761092017375937072638415166675529808942268574147258168001934888920","6072598916249169136908315542430764263321939399814654522032874918790340778554","17174337625009122870708859925793325997946378966416309900853757797594910229791","2191847811950210640312799119786838991241770048511678287834866005381831304252","5556089667073477529764323892046529774877491089381310117639628299653468438238","5512523756717871023776497641942984346783337720501449614794308618170512394669","12964734676293244153748554238028206801414195417901916061140401142888712380451","2972653442760058165486608510571475869094354178867521177094553776876904654370","19617883112060216036437373002520931262578741557295904537678304364166866283129","1175039218798484980072399121924972057008410392367959450703939688306902524054","10396745429499812151132429056797671842807735536621273702194009800176056286117","21829614378897985584789450465826668649930021698690579364831443823904306431333","232738545482017472261496633286350972128632187612854220178426602649221258372","12964734676293244153748554238028206801414195417901916061140401142888712380451","3085746588958121678695340573755073635811671969466202529706243909144419544906","19569641468295105160418177740024945517842897645468872356974690513927041995987","13682529409340978640466595260264374070197250456280851982310079893206859446095","5864324965287761028896843934748795289028753931353130557439328109628025948300","18638025629280224617790168906173435277703684091772827588468099812026035539738","2194543658437125198357587946021311492689377172643668551084193961108304747785","21593921076086949669297200034323757069358367209393924460563276537349356681008","15613087414575084731294247924061147534041250959429049604445183368849211416480","21876658378266334569964380224531738829113969654886515172706825001082187941302","17603178439634188462056825952489860474722953595745235452510670608903852152095","18820995668034441064481786413532066855976405414499761311120499699159123037823","6071932171386993614931179655729818150534845046202199448265558256519848482826","10847231218503195759517071138679051602730407167074172266742227045164609231885","14506356872966117174131859847846372170262756655915924664237877294288585233653","5157851077382368258831146921235005863841873179959407293372390317913027109941","17215740096130814160671394963439750791336311297216240493968557475671940055057","7236783279316083836339480995960834633270959028443867776543135480683166923869","11398194787838497782166425813926171378663319996243937443066049287231892201563","8461890310516914992976016102786941165050457592527945955052989873762315959085","20131832673266427475769741534309108541338301173662948074665588100934145363162","13025268118387164480802803485697296266258675734062176433653116451463846209082","2959389974566411083204235326117036516979963119227951085034972251184734179290","9377958456884255467194088716477119239642797045077236472356953540022684583149","16698515797824680501871676266202253211872118899888285886412000454073141450701","15798767315325760489132964686987872692994717940925570238047784420230331193585","4781857348503260904895922377303003708601361291248025972804843818012461675526","12671050201903040870132377617509218353339866159494336831034048382615639662347","16118914885963834916174025584295786549597018616252080891215345608189775067017","1287880180407310800601651110405671450334122951893361316992545024696018620127","11275609334870619778800915975797190217946752952900097800029716348347769743557","4549806302643127256376053744839835469729529127535077121646524402308295761124","12385792108167898834965686312817629786971321080122734283967136719015404659574","19645303799442917520263849382981918648525479954858046014781621457535223129139","13079036262723496487062341719232498854721623596427562123822257284722043022380","7815052247860712154170106628650576750781240048309328607812510735568644480099","4224433012242275812105292037318388809660019851311870694425205064696802439276","20769202337427957655670745571969974320407145254685594108329805885177108459406","5864324965287761028896843934748795289028753931353130557439328109628025948300","1194604146042048350003512364693260099917768421477389239935129766419846021985","20342168169457748695802149508674862964537074611245094862559628187033717475867","9612640678039527906483661330640693201947160578570955411180830848021191312999","20227979332701217082249100988795416872480735366357703927751699407575642930935","5568143431214976639464768845659406494667053581733825380813024891527928235568","3208479846365475237410989805061539106045403260781956346764317556860566259416","1533174095932179741832085722978096451211273368734335528806856805965059178550","15214427790517490141925325587797963249335567355213168373025412405634050937481","13602826144456356860284419687170541618185281374064216815711251835821492025702","946455194947827940337729236114480813870835673647234481151109602462556270766","10530161321691746280687450853188873346740398773252979676317929677235626245235","20551785199765572414957755636883446606643894289625551996383687264006196444272","17492490034871188503809070393464727304143828491765350693224566925126105199911","5627116488283442946557217209333347313412518163016066550539282920861053074060","7628458932936495764524142429747955579001667142208907050372858225989514457008","13545244560072730176162896504690392106112168077747273393293519829141026712654","9197800054380533439556389025741028642781611147489934915217537670356117734985","19725005896671978040083076043827582994250733273969992727037910840857608608713","13597601271430461916896612582648919742272715556061113046784825140314498905478","13382473425074121858735590469120000769886230357897236331156422982819803288928","12439760546784082202871583401234733990044187602943315324169379543365738178519","5758137506105103459826998865197780898444584232351877574052188955203596737799","8370264878441063630462671051957262849187564367781659467838460782939804026447","17368028902269277465024746642764987612414033705161996149238721534130490186941","946455194947827940337729236114480813870835673647234481151109602462556270766","10782746953492500078751030180163064462657489179646951793154413574373371915628","4574759938850684302328171377919788556520857555728298495027674689330859913909","712912966757927878965693240425422971881715436008090497769457122872348343952","2483126835964394240864276692792992171095811055349556498083468949709404323305","2235150263865959136421726440400433738501848129328010009098035293276672220717","5469955587383559828097756439479681402770241102946573149636380518729022833750","9612640678039527906483661330640693201947160578570955411180830848021191312999","7135473937218111453151804646361837547205712024569546168416088861245626015030","9197800054380533439556389025741028642781611147489934915217537670356117734985","8177887533556223950928671845738575508418213402039951309409853690924708882619","1644637032401895183536122531980635414363418149797237304436572320773189961342","2235150263865959136421726440400433738501848129328010009098035293276672220717","19402903568454754777700416991856190103205898202952506192755702018138164903780","663438552256433061576054140809160443818506164632349621099807794702352080693","15776280343411227095808521568994471614057167432416502119979098996603887292938","12313143896208759390351526641510039095883815550699902043061685514584813600074","1218928037268356033769144531312651840516937586618523437511091378414585873142","9011100725723069477052917523444280437831907181043987084639300263089606956420","8082817983718546987105551276971252463934917335856558917892075900846966350585","17744796207881002836361754172345756972108243302293817629307470887005013537965","10909054529489265328197617859427892180031815470826676417637937142527343355023","20551785199765572414957755636883446606643894289625551996383687264006196444272","2676613676733015431959147577385543530164186971614056775227705172064306807928","15776564956440002895136116449299582951656581983212117550232796150916571692055","11412740120827044021870096407623293808851105071188140591919788265312361814171","3885925135313023686150115977607110368258492435636819989794778250027419367343","1440944398068243290019815197893325790869382856018839453050014183551865062018","18707594353877082516395132272698629627555807696619350634836774054442394671010","19750715061039895092288075649509657235159241403400837501090850293666251108617","16411233008444850443854175483761516668813055344878151975436424201109266465436","966676739412114459004685599806372707037105104204243310754946364190002350899","17496320222604434917256246718514403734235740171188912286919341525891256570713","4224433012242275812105292037318388809660019851311870694425205064696802439276","15976978918004336355901319629352200911328902990447017277673724626919242812955","16226984168490080400263373201570728966749962184950889718917387268203884202372","1071564318326244075341980988866027669737011601498674724527637774926288977632","20769202337427957655670745571969974320407145254685594108329805885177108459406","2967213245998332384543885104754783540899439580884490432048984202068901705944","20769202337427957655670745571969974320407145254685594108329805885177108459406","1828058457773990843551157525432867662470301272599690050907371698799750907039","21451388112829145060821974036366132513327328641208732802166144524686108831760","21219905789358323534478545279193723251420616841556623254711235028135342626157","5001232371587577350490476563931715794477203224577970619789108259266886603950","6540725658063818695836967143056666761434297658403942276316050979804587769432","9377958456884255467194088716477119239642797045077236472356953540022684583149","4224433012242275812105292037318388809660019851311870694425205064696802439276","20452154666799846638117791929900707763485919083101449648262816499313176812803","2191847811950210640312799119786838991241770048511678287834866005381831304252","8491224372742742395086082981236389730604525807576141462195229766319454932167","5512523756717871023776497641942984346783337720501449614794308618170512394669","20717661531343094401419404535005724208121214979487601078059038701197331043233","2476324937951789382181944025361875851099988750579823474754609765481889757439","19356492332655108003949429792555441845806681675195402015185308983898801715851","2967213245998332384543885104754783540899439580884490432048984202068901705944","5055315503098445594062335518727177962919913361908453398984787599226169183337","17492490034871188503809070393464727304143828491765350693224566925126105199911","14027649325388708488081280969586205626278814303627295953445422182588276435572","13465227484584385300386574818824135648806878577862587385005638292079537592144","12385792108167898834965686312817629786971321080122734283967136719015404659574","21267939098918134027395634942102971885281982111723141238850772621986256662900","17496320222604434917256246718514403734235740171188912286919341525891256570713","11433874323428772158013095381623924200138375055456955808189877801771380225552","15618359152517208456698312197785172766694127619077536561902714697931530755106","2628389834360132333366589026387003814868457686372552787974500759887369913155","2027121307515028227361803453971004574835283397634149795685942874063731877044","1758371485945815703876679445382538767819559386912271388124907980130004330353","712912966757927878965693240425422971881715436008090497769457122872348343952","9296362220804925104551234752226384203979024033236205671428676015277866160513","3099260939107709193833554073787772569345965287506676970762153917208260772189","21219905789358323534478545279193723251420616841556623254711235028135342626157","3099260939107709193833554073787772569345965287506676970762153917208260772189","15976568257028838086904371689993285445196617581672212770040719579976951713437","6540725658063818695836967143056666761434297658403942276316050979804587769432","663438552256433061576054140809160443818506164632349621099807794702352080693","8140644209065967749731539711645757673629321017919126168806710308878873241272","4655594634855844188499094340496759182976213206849235604185854128079411962453","13216746424486872049443607565713997095923431379037310625593547838968801990450","5512523756717871023776497641942984346783337720501449614794308618170512394669","10286727453332438406648583236643277009562092681643525436851770105870834802875","5835554999819330558954089066526405560740259616473885793288693915684399039377","2235150263865959136421726440400433738501848129328010009098035293276672220717","13602826144456356860284419687170541618185281374064216815711251835821492025702","3117586190657126472592128104269081184451127080527182054370687640020932637738","16961794929940055505618937273665830834556517799613603503371462732255229717698","20717661531343094401419404535005724208121214979487601078059038701197331043233","3054509086575963631520633315863182977708152785332183337259997415160907095845","15718330550508436908559701395606414201668068552693146421627683872153427960853","4363738634465882118172307854104596042899685656091037340905869811610138317347","3295533384340596604465346018013602551881861893498794970313069368600968766409","4549806302643127256376053744839835469729529127535077121646524402308295761124","5836322900178474894684749559174625794931606932780001961547616477680042620058","7986666009024332686676662864413304092722307894727965157582073398188685188596","8332725882597643046230446607227878580859441724564830732217655474732342787381","13605376995820845471499102796322549845207296468035227481017989756087418839900","12155172322986237416023663042004942352608253176870958535098713267207721181883","18703989514997223432661641229861332310348080898339160493229575272467603319271","12144047841603136900258834238679736103499067068658592153906655837799171705427","11964978685770609938104516880584559743324134082109819132572992701951308097934","1336458066220344521262880797524303149688311982013949559764047883761889898074","7567096820715495523465831195561335361495276610103173418515651874250913956034","16698515797824680501871676266202253211872118899888285886412000454073141450701","760526239526750316156895532664638087659951808341490670841188720735038667373","17806353473562524209419921489674020711603878477377228029846764687154796899291","13605376995820845471499102796322549845207296468035227481017989756087418839900","663438552256433061576054140809160443818506164632349621099807794702352080693","14057612694744022955506885004102834629754310001978602939456750538201073114431","21536244638197709025858135955699906074571886472797743044193407266270319669578","10940448732886105987570056589646710210974129839416224393729741337643229924295","2483126835964394240864276692792992171095811055349556498083468949709404323305","9612640678039527906483661330640693201947160578570955411180830848021191312999","15613087414575084731294247924061147534041250959429049604445183368849211416480","16411233008444850443854175483761516668813055344878151975436424201109266465436","20350757034998523187334178209550008366903662221355109911310833181698841320621","4574759938850684302328171377919788556520857555728298495027674689330859913909","1346980346605447755534859795013475283788975200653900831883060614677761712111","14662264414119036690282405601089929177544253624404097884734013101529582623919","5469955587383559828097756439479681402770241102946573149636380518729022833750","17421378063295915427159454374242321672486103038225921418122357124853338152435","11412740120827044021870096407623293808851105071188140591919788265312361814171","7471975174935772955134792946513424637999023861300940920934522552454330255354","13246300932955054699896499534663439333337260302838301416472718244977767210668","1703815020768376381115674913114725195497281256588197804868422201697152023777","3085746588958121678695340573755073635811671969466202529706243909144419544906","7236783279316083836339480995960834633270959028443867776543135480683166923869","13582411668238263333995209483029305625601807569534701653376051071840372484093","4754713757431627318482916888231215818599754770670360377946229107868340173565","4224433012242275812105292037318388809660019851311870694425205064696802439276","3196185115626403769090812264110127828126981872545481387659039004737077237629","3449083258780223991632112868061903902820017044757095982070790181182597682266","6398900866082970916513845909030912477768318655743785125093873617319711480497","1175039218798484980072399121924972057008410392367959450703939688306902524054","5210257615122466358421406540799898540909863599743777249997433762286779163631","143871243170896096761286538359612900806921859208087130133106251324625818743","7825186589955157383712635126647794282971185739134506671734682703198205174921","19356492332655108003949429792555441845806681675195402015185308983898801715851","5469955587383559828097756439479681402770241102946573149636380518729022833750","9301724904566173478342992350770203303162818770127169929361533578664506545066","14144040826170485243395777956417332299961240009335454448818306795274079743482","15106671954584442557442200864211260493785606980074399349847632055753054483078","18869217976653672070772236404509215919650604056214055814018794444287298958040","11645420524832783721170737438334136629636818531954268745339783028025385754950","13439261978972035796996150244149252173133297973805089227133789936712760569803","15106671954584442557442200864211260493785606980074399349847632055753054483078","5512523756717871023776497641942984346783337720501449614794308618170512394669","5835554999819330558954089066526405560740259616473885793288693915684399039377","8863131691935358314236967173935315033413820679736774627121405457433895003795","17806353473562524209419921489674020711603878477377228029846764687154796899291","12688265548305129213524123982283433383136772509110047948234368697335124109577","18207961221628464226564927736506330628717051411055463190287553801949660581016","14776577580296682191308190812580888360497977691535016054206068797647787496417","2716120769329705626706313807317151735273953258897025678161053651818357382993","946455194947827940337729236114480813870835673647234481151109602462556270766","614966471251760438899692967903400348852862620490339206898848861882544111046","4116036656616283014460785251860209028828407967565755603300238819653622156901","10847231218503195759517071138679051602730407167074172266742227045164609231885","20895602419903453398196391913478058693274453903342785067983129839552891433864","15689970856593006158259892732288646993746887463514406392254922588756401796606","7408129850262826909244224402840856032373035919586685754734550738382550518934","16954193412688439955632320517883969169462813275902648614432177779074490622129","10822341224343704549832157601167511762192217681493597414750548578356092990059","18869217976653672070772236404509215919650604056214055814018794444287298958040","12998359993404137434826050598531205936631009536891015167391276398139095697469","712912966757927878965693240425422971881715436008090497769457122872348343952","12439760546784082202871583401234733990044187602943315324169379543365738178519","4933182101183318250560018811514844142859815227384938275570441539742336262480","5519776064110123180759081312729047106292930891845193268609251880658830705433","11964978685770609938104516880584559743324134082109819132572992701951308097934","20852945694892786589706882486760988740184637230152727898060254427102399724085","5157851077382368258831146921235005863841873179959407293372390317913027109941","3885925135313023686150115977607110368258492435636819989794778250027419367343","1632500423430879870300869265124598190896358768919584266600939773214617936900","16480089772180635258030461748402564771495064968752027484874049433567638476934","946455194947827940337729236114480813870835673647234481151109602462556270766","15718330550508436908559701395606414201668068552693146421627683872153427960853","10646102197739219326084794742182482777338903912449154661603058840745258963379","1570274245034538183221128634382794417097801245857820047802724595210806628688","9147263785534267636687968913589685560505104267741632426978703854622278136991","614966471251760438899692967903400348852862620490339206898848861882544111046","5566832184094895187524267067093217754199394279599836592480486864883149893031","7135473937218111453151804646361837547205712024569546168416088861245626015030","946455194947827940337729236114480813870835673647234481151109602462556270766","4087977103445290602464010775212316926483391914870441578758042979308767270230","16137218824867518993112176330612823176216439366022687220615937652371635085247","1703815020768376381115674913114725195497281256588197804868422201697152023777","1175039218798484980072399121924972057008410392367959450703939688306902524054","11412740120827044021870096407623293808851105071188140591919788265312361814171","12271983753113042626833634560364485293486763667349863253834100408006012012338","954361121666374676317512516553835448496801654442662842741750447529976221096","5519776064110123180759081312729047106292930891845193268609251880658830705433","19645303799442917520263849382981918648525479954858046014781621457535223129139","15546540006815490057793129658556841909859473017172875226825092156274503806084","16664225501027310427143425928031114680302400010653769373062555871803572912785","12964734676293244153748554238028206801414195417901916061140401142888712380451","1644637032401895183536122531980635414363418149797237304436572320773189961342","14588408860702774403040643085023102427643318176411097113905533342239652444746","17806353473562524209419921489674020711603878477377228029846764687154796899291","3401355104414210656254289265060762447824858847649022703190474278352208416173","15455768567639248552871867295320669874358209402041404093780654826364925510661","18869217976653672070772236404509215919650604056214055814018794444287298958040","13605376995820845471499102796322549845207296468035227481017989756087418839900","20663699746183765412904432768074062935933374627665221119822945660203712880745","1454875708970600335304126262767303975870655905960512436254375545925577328692","16954193412688439955632320517883969169462813275902648614432177779074490622129","20895602419903453398196391913478058693274453903342785067983129839552891433864","4933182101183318250560018811514844142859815227384938275570441539742336262480","1336458066220344521262880797524303149688311982013949559764047883761889898074","12984040983088595314698866307930588700679289984810017049345447973409490678089","10847231218503195759517071138679051602730407167074172266742227045164609231885","7236783279316083836339480995960834633270959028443867776543135480683166923869","12180564838572574785577178844314834812952191421495899999848160514539788519817","12600480540100512777695577363859185402126112711196993279255107913533806514345","18207961221628464226564927736506330628717051411055463190287553801949660581016","3401355104414210656254289265060762447824858847649022703190474278352208416173","4116036656616283014460785251860209028828407967565755603300238819653622156901","12863950582730082046148154608075135240263800483912187224256340414612337617318","3054509086575963631520633315863182977708152785332183337259997415160907095845","6714269803293029270909153658663808588557387497502190042744619007611526657435","163072371065782787415009910882963726380729563508259100978084406744617596229","18124161608764573031181181091746932116602343523449108232131693108002812215595","17698177298685528128465298198488735273578406532961103401549266592203987353446","1071564318326244075341980988866027669737011601498674724527637774926288977632","19883029896859112110244432872192403645617916717981765942483639413786774824574","12155172322986237416023663042004942352608253176870958535098713267207721181883","19375155383395696510967115781488322005907183312666977471331313827828265655931","12863950582730082046148154608075135240263800483912187224256340414612337617318","19470438559791413810807322334940256814752303267756345670901343982529444306002","4754713757431627318482916888231215818599754770670360377946229107868340173565","3196185115626403769090812264110127828126981872545481387659039004737077237629","11412740120827044021870096407623293808851105071188140591919788265312361814171","21876658378266334569964380224531738829113969654886515172706825001082187941302","9888239978634522925223196837194242311545989047209631150312165940305433080157","20342168169457748695802149508674862964537074611245094862559628187033717475867","6267275553024510648754807709238333654138152587130901210611391956543755030870","14535184095124950892028872912364622595212286520594227957147431032075397154266","2244871586170865025448272825497968057027141766617969218599365252909572535577","3117586190657126472592128104269081184451127080527182054370687640020932637738","18638025629280224617790168906173435277703684091772827588468099812026035539738","13602826144456356860284419687170541618185281374064216815711251835821492025702","19136646515076729474266957823959601106059804333394786210644361751043819130428","4006308849281273792274000957432061207143923231283130218997109288816872164471","4866442763557448299456393930665252678199356968867077785577776954873671002076","5523494911625033531158591406744208675721214018061290251579858790908546943321","14262959519701291686797273506458134133352406025405884284959025726384935370757","15798767315325760489132964686987872692994717940925570238047784420230331193585","6585682031650501777630925238370902100450071127640040426788913175433490518990","19569641468295105160418177740024945517842897645468872356974690513927041995987","19617883112060216036437373002520931262578741557295904537678304364166866283129","20717661531343094401419404535005724208121214979487601078059038701197331043233","15356303677036047765901840442430056519915375782726231750029051083606835464886","18869217976653672070772236404509215919650604056214055814018794444287298958040","19645303799442917520263849382981918648525479954858046014781621457535223129139","16614048991075038030789399956909315351324595917053714063050624141460033937444","614966471251760438899692967903400348852862620490339206898848861882544111046","4099531615762313645664270695169451400067010667159453849071079869270467331430","1336458066220344521262880797524303149688311982013949559764047883761889898074","374196098865630209786313311346578647643865900042267366994874073365518434467","9141525190254519952022341797682038597679704914972221193906068133244136674784","12964734676293244153748554238028206801414195417901916061140401142888712380451","3449083258780223991632112868061903902820017044757095982070790181182597682266","1218928037268356033769144531312651840516937586618523437511091378414585873142","17639609723574756459891329821328819780244585917274648474440537044036944455741","1533174095932179741832085722978096451211273368734335528806856805965059178550","1440944398068243290019815197893325790869382856018839453050014183551865062018","13004204931687393626720102454766944489147659600561337392365246286815729618336","12325315597559743752230693830058397065789541158772176272664764348470516075554","2972653442760058165486608510571475869094354178867521177094553776876904654370","8370264878441063630462671051957262849187564367781659467838460782939804026447","2959389974566411083204235326117036516979963119227951085034972251184734179290","20551785199765572414957755636883446606643894289625551996383687264006196444272","4087977103445290602464010775212316926483391914870441578758042979308767270230","15356303677036047765901840442430056519915375782726231750029051083606835464886","2683741289082249638876005424728100137356381224531970040303109182897410726686","7809308148717690892433475015444256746265555654600319391230796066961179227754","1440944398068243290019815197893325790869382856018839453050014183551865062018","14027649325388708488081280969586205626278814303627295953445422182588276435572","18594403705196476767375145654138028270042663039914897358747063340477738248585","16336411977121389060651610820631824246361165054986934015236391565811657107740","4478906216357891733779320532575007598672127166034590483003103843151770821805","15776564956440002895136116449299582951656581983212117550232796150916571692055","10593196891529840628734555040366549092907275204600028371924840487850448911826","13602826144456356860284419687170541618185281374064216815711251835821492025702","13183232877692246822590812126633640676351230654681431401704678854597307073741","1143725056710957642097279233815583467630238769694555684003566733048000751701","21536244638197709025858135955699906074571886472797743044193407266270319669578","16118914885963834916174025584295786549597018616252080891215345608189775067017","3085746588958121678695340573755073635811671969466202529706243909144419544906","7471975174935772955134792946513424637999023861300940920934522552454330255354","16651609932326344885003930002640274787869059718257297617745634674345809614067","8863131691935358314236967173935315033413820679736774627121405457433895003795","12233333935383563259381899984287101540154684128978249282626058445737562030151","7057969325794614252651980473201258184026879446024353453586952048006174273183","8177887533556223950928671845738575508418213402039951309409853690924708882619","16336411977121389060651610820631824246361165054986934015236391565811657107740","16391403911439019484448973048634108295486984765667310507956782776900193019857","16632434695136893331490691565954322107706581064802120383393065446949358038261","7532552732354833964818948844447124010555621930545046129036742684162649680796","2959389974566411083204235326117036516979963119227951085034972251184734179290","19375155383395696510967115781488322005907183312666977471331313827828265655931","2683741289082249638876005424728100137356381224531970040303109182897410726686","1071564318326244075341980988866027669737011601498674724527637774926288977632","4688608777744900238376640178893120441686955058686461498962807904713059186065","14862128476161472318832207576059761644997238747584253112211006461966427732368","14057612694744022955506885004102834629754310001978602939456750538201073114431","1570274245034538183221128634382794417097801245857820047802724595210806628688","13748763105074593620013986383045781773296715695306976461248290420913969610259","13079036262723496487062341719232498854721623596427562123822257284722043022380","15106671954584442557442200864211260493785606980074399349847632055753054483078","1143725056710957642097279233815583467630238769694555684003566733048000751701","12271983753113042626833634560364485293486763667349863253834100408006012012338","16651609932326344885003930002640274787869059718257297617745634674345809614067","6267275553024510648754807709238333654138152587130901210611391956543755030870","17018828663094797750757032992805443165559600645338019797634595027047317699068","13826842810792073443336072469158777368557028423710280480746021228332338112849","17539019008906665692358401403758991639375357012882690788487548831749474497244","19750715061039895092288075649509657235159241403400837501090850293666251108617","15776280343411227095808521568994471614057167432416502119979098996603887292938","19356492332655108003949429792555441845806681675195402015185308983898801715851","16118914885963834916174025584295786549597018616252080891215345608189775067017","4224433012242275812105292037318388809660019851311870694425205064696802439276","6311168126082531220851145980238852866031091078497507817682388947599504858069","12439760546784082202871583401234733990044187602943315324169379543365738178519","12385792108167898834965686312817629786971321080122734283967136719015404659574","712912966757927878965693240425422971881715436008090497769457122872348343952","14506356872966117174131859847846372170262756655915924664237877294288585233653","7135473937218111453151804646361837547205712024569546168416088861245626015030","13183232877692246822590812126633640676351230654681431401704678854597307073741","7033259621441273379090690993518324745190856903793390519675567591730089293401","16954193412688439955632320517883969169462813275902648614432177779074490622129","18638025629280224617790168906173435277703684091772827588468099812026035539738","12180564838572574785577178844314834812952191421495899999848160514539788519817","13582411668238263333995209483029305625601807569534701653376051071840372484093","4655594634855844188499094340496759182976213206849235604185854128079411962453","8370264878441063630462671051957262849187564367781659467838460782939804026447","17496320222604434917256246718514403734235740171188912286919341525891256570713","9141525190254519952022341797682038597679704914972221193906068133244136674784","21570485471295626790395474884741704872769989979943302238757938053634431270592","14214179218791945815971672263715227174014095422524111075841145981660259478464","5992148578777868893458748144399130666011631987544731979896999269126511048457","11275609334870619778800915975797190217946752952900097800029716348347769743557","6714269803293029270909153658663808588557387497502190042744619007611526657435","6221105771699561812227612915438412791747103897962033448670914370271924677164","12249836732564745436903455221618799619493605772253570453747572839223832061488","1493819599258016045339110999235422917168609982262840449866816239257578013153","13682529409340978640466595260264374070197250456280851982310079893206859446095","5568143431214976639464768845659406494667053581733825380813024891527928235568","13216746424486872049443607565713997095923431379037310625593547838968801990450","12180564838572574785577178844314834812952191421495899999848160514539788519817","1346980346605447755534859795013475283788975200653900831883060614677761712111","10782746953492500078751030180163064462657489179646951793154413574373371915628","1570274245034538183221128634382794417097801245857820047802724595210806628688","11118678586223256967063779327106075185044005359468107273605978537625172540996","9957269699849018786420105364721112375750180716923816099920663920684273075720","10286727453332438406648583236643277009562092681643525436851770105870834802875","7986666009024332686676662864413304092722307894727965157582073398188685188596","274618135907332659550125464790981847888019268634834758638296553463810383811","20131832673266427475769741534309108541338301173662948074665588100934145363162","19750715061039895092288075649509657235159241403400837501090850293666251108617","11545919418828350367784519368633485476721293708396219560182357280822873453096","143871243170896096761286538359612900806921859208087130133106251324625818743","10593196891529840628734555040366549092907275204600028371924840487850448911826","3005814121577142321238773726823845968144595752898226988876012545652019094241","9798324625310926002331408522163043190724749435063160272808536376189654148756","11964978685770609938104516880584559743324134082109819132572992701951308097934","12519200710540274443987348735978102700747472530155480989464845837532354722845","9679676316674197446267516028449539668288990002440917773972518794977810420407","12519200710540274443987348735978102700747472530155480989464845837532354722845","9957269699849018786420105364721112375750180716923816099920663920684273075720","13602826144456356860284419687170541618185281374064216815711251835821492025702","17603178439634188462056825952489860474722953595745235452510670608903852152095","16651609932326344885003930002640274787869059718257297617745634674345809614067","15950000082544045394526115523741159615348156864031044224172890462894241606231","18451742809683626507365133121132299935287207259245734910631591678742738573305","15214427790517490141925325587797963249335567355213168373025412405634050937481","12600480540100512777695577363859185402126112711196993279255107913533806514345","20895602419903453398196391913478058693274453903342785067983129839552891433864","9306117694572387027262464048290209213167312534461525812720869427821619086590","10690633522035360601031737428400068881001718255130638825096194976708724866144","4866442763557448299456393930665252678199356968867077785577776954873671002076","19108128352145842008548048053308217665383455218276209300064989051535526150757","954361121666374676317512516553835448496801654442662842741750447529976221096","6714269803293029270909153658663808588557387497502190042744619007611526657435","19265929620982371511819161020399302006822082297986006761385196152068883496437","7532552732354833964818948844447124010555621930545046129036742684162649680796","5649801951154791837665343131813310668539151217466670556566164087328114632489","4866442763557448299456393930665252678199356968867077785577776954873671002076","18003950806500496937907532373283544753235688820907806692295042001546833965033","12155172322986237416023663042004942352608253176870958535098713267207721181883","6071932171386993614931179655729818150534845046202199448265558256519848482826","3099260939107709193833554073787772569345965287506676970762153917208260772189","6072598916249169136908315542430764263321939399814654522032874918790340778554","19569641468295105160418177740024945517842897645468872356974690513927041995987","17018828663094797750757032992805443165559600645338019797634595027047317699068","15776564956440002895136116449299582951656581983212117550232796150916571692055","12042091411871087770321928117714696325647592163332119499975682262951606830326","8177887533556223950928671845738575508418213402039951309409853690924708882619","11433874323428772158013095381623924200138375055456955808189877801771380225552","14535184095124950892028872912364622595212286520594227957147431032075397154266","20046290436659560311648463454245918246036175981027749522810979896203323505017","5627116488283442946557217209333347313412518163016066550539282920861053074060","16480089772180635258030461748402564771495064968752027484874049433567638476934","1194604146042048350003512364693260099917768421477389239935129766419846021985","1218928037268356033769144531312651840516937586618523437511091378414585873142","13202400967998975804928062759810694884158416475176357116907186595278657876313","6311168126082531220851145980238852866031091078497507817682388947599504858069","6795208382791933114735572030062093331533051902721517159934364925403853532318","19936787863437503780283518973149089110020946214555834613795208847908690099190","9377958456884255467194088716477119239642797045077236472356953540022684583149","15123415314399351471075303556718608687323785898137080424470982286311735782352","13370115598260167633113987566372148589924273398862423406100474476922447871102","7135473937218111453151804646361837547205712024569546168416088861245626015030","14262959519701291686797273506458134133352406025405884284959025726384935370757","13025268118387164480802803485697296266258675734062176433653116451463846209082","4624094547626164902101572852723507795056700722159656748629760282341508155551","4224433012242275812105292037318388809660019851311870694425205064696802439276","5836322900178474894684749559174625794931606932780001961547616477680042620058","13908465977240917608897406492241943260778588976320614277228337961237626209809","2628389834360132333366589026387003814868457686372552787974500759887369913155","11183511759577952361572566673527592434184886344484272921682811575415051015276","12863950582730082046148154608075135240263800483912187224256340414612337617318","14262959519701291686797273506458134133352406025405884284959025726384935370757","16137218824867518993112176330612823176216439366022687220615937652371635085247","18707594353877082516395132272698629627555807696619350634836774054442394671010","15413262379943851680637741226631729175616759345996754775627005612359539596292","4116036656616283014460785251860209028828407967565755603300238819653622156901","3099260939107709193833554073787772569345965287506676970762153917208260772189","4624094547626164902101572852723507795056700722159656748629760282341508155551","4420985155765749198917158320211243542858248750314567273670169360313609199220","4781857348503260904895922377303003708601361291248025972804843818012461675526","16698515797824680501871676266202253211872118899888285886412000454073141450701","5519776064110123180759081312729047106292930891845193268609251880658830705433","6540725658063818695836967143056666761434297658403942276316050979804587769432","19215132962371868093445083227022064420405266792249240035116240824526740725800","19375155383395696510967115781488322005907183312666977471331313827828265655931","1175039218798484980072399121924972057008410392367959450703939688306902524054","13748763105074593620013986383045781773296715695306976461248290420913969610259","15976568257028838086904371689993285445196617581672212770040719579976951713437","2731702758715001559265750806008384495080551892515362156357977538139860974530","3133838166556165943824029176542597440374447246137252468511956694712122940530","1354299594199717859606388533670792913672908168692420372657948698842311093857","10822341224343704549832157601167511762192217681493597414750548578356092990059","17018828663094797750757032992805443165559600645338019797634595027047317699068","14776577580296682191308190812580888360497977691535016054206068797647787496417","18693317710730212151208513181186966573996077028828882441479768956833225751022","17492490034871188503809070393464727304143828491765350693224566925126105199911","14172013427642179266386805494272960512005525394680301845681753498295255309908","3607534072804388173311745844584795163913258697339304886139614455491456047872","4420985155765749198917158320211243542858248750314567273670169360313609199220","7815052247860712154170106628650576750781240048309328607812510735568644480099","9277147365456707051192593343809527681573500829831413326738310307567850123829","8863131691935358314236967173935315033413820679736774627121405457433895003795","13439261978972035796996150244149252173133297973805089227133789936712760569803","13051815778936294959186188778209982533089138172215506637927986094620164817648","3835902309964760173432611751283380612399529168609044921165087497368685977916","13202400967998975804928062759810694884158416475176357116907186595278657876313","15214427790517490141925325587797963249335567355213168373025412405634050937481","2666549942988803296757576401723478920911340699174408059253220554211642279978","16122380779106962898741444352984715606386470429041317890034930229550324363289","18594403705196476767375145654138028270042663039914897358747063340477738248585","7796937569050271278342402836188937027242003149541526098037517748511185180620","8140644209065967749731539711645757673629321017919126168806710308878873241272","5992148578777868893458748144399130666011631987544731979896999269126511048457","3348432210747515061385037490620056224077503064341935527160366063098820102327","18566222379922364157274850150988399654533738702075332376935729247934165563869","2476324937951789382181944025361875851099988750579823474754609765481889757439","18637620888308371607611642373870554933712342468791368368498810637591710912686","2959389974566411083204235326117036516979963119227951085034972251184734179290","20227979332701217082249100988795416872480735366357703927751699407575642930935","17368028902269277465024746642764987612414033705161996149238721534130490186941","16653103879864200321986465966316889764620013245316877484022986374603264725648","16118914885963834916174025584295786549597018616252080891215345608189775067017","5568143431214976639464768845659406494667053581733825380813024891527928235568","13641582444261924898950561772071287900110836262790950814969623169365632502460","15546540006815490057793129658556841909859473017172875226825092156274503806084","16961794929940055505618937273665830834556517799613603503371462732255229717698","11964978685770609938104516880584559743324134082109819132572992701951308097934","14216993731814681619137662595321398279415990565678023063177228088649900891505","7815052247860712154170106628650576750781240048309328607812510735568644480099","20350757034998523187334178209550008366903662221355109911310833181698841320621","15045123937812306625997417665247004551483049589009168687548501235926225142020","16632434695136893331490691565954322107706581064802120383393065446949358038261","20838188000013629937954971368567014585342187321412629930028751871743338652961","13545244560072730176162896504690392106112168077747273393293519829141026712654","6765546767316775630226434304243025099044057869188929458111914505605517807492","17018828663094797750757032992805443165559600645338019797634595027047317699068","18820995668034441064481786413532066855976405414499761311120499699159123037823","614966471251760438899692967903400348852862620490339206898848861882544111046","17496320222604434917256246718514403734235740171188912286919341525891256570713","18637620888308371607611642373870554933712342468791368368498810637591710912686","6540725658063818695836967143056666761434297658403942276316050979804587769432","1644637032401895183536122531980635414363418149797237304436572320773189961342","8461890310516914992976016102786941165050457592527945955052989873762315959085","21591247897428723764785205441739843186077784027717063974489303352320972773514","9277147365456707051192593343809527681573500829831413326738310307567850123829","13004204931687393626720102454766944489147659600561337392365246286815729618336","11398194787838497782166425813926171378663319996243937443066049287231892201563","4006308849281273792274000957432061207143923231283130218997109288816872164471","3885925135313023686150115977607110368258492435636819989794778250027419367343","3054509086575963631520633315863182977708152785332183337259997415160907095845","5055315503098445594062335518727177962919913361908453398984787599226169183337","8491224372742742395086082981236389730604525807576141462195229766319454932167","10593196891529840628734555040366549092907275204600028371924840487850448911826","5519776064110123180759081312729047106292930891845193268609251880658830705433","20750786466099303558578845860831937634908544617912415565480052280769840150510","15798767315325760489132964686987872692994717940925570238047784420230331193585","567433434521112381841206540791234080742279927287516260853551410281774875712","16391403911439019484448973048634108295486984765667310507956782776900193019857","14057612694744022955506885004102834629754310001978602939456750538201073114431","17698177298685528128465298198488735273578406532961103401549266592203987353446","14506356872966117174131859847846372170262756655915924664237877294288585233653","11889745823596890789749077573846619853793479538535474896498174482741572852641","15976568257028838086904371689993285445196617581672212770040719579976951713437","4624094547626164902101572852723507795056700722159656748629760282341508155551","15022199219678996727354667799147374096361570599067734481207390034887749042083","8461890310516914992976016102786941165050457592527945955052989873762315959085","3054509086575963631520633315863182977708152785332183337259997415160907095845","14506356872966117174131859847846372170262756655915924664237877294288585233653","9296362220804925104551234752226384203979024033236205671428676015277866160513","12688265548305129213524123982283433383136772509110047948234368697335124109577","2903328500810487887284040113540254258409278773721503335380406605532748782645","12271983753113042626833634560364485293486763667349863253834100408006012012338","17744796207881002836361754172345756972108243302293817629307470887005013537965","16954193412688439955632320517883969169462813275902648614432177779074490622129","2666549942988803296757576401723478920911340699174408059253220554211642279978","15689970856593006158259892732288646993746887463514406392254922588756401796606","2666549942988803296757576401723478920911340699174408059253220554211642279978","6307025001981604557276095751477581176989559254288853588059732891819079685284","15106671954584442557442200864211260493785606980074399349847632055753054483078","6795208382791933114735572030062093331533051902721517159934364925403853532318","8082817983718546987105551276971252463934917335856558917892075900846966350585","3607534072804388173311745844584795163913258697339304886139614455491456047872","19108128352145842008548048053308217665383455218276209300064989051535526150757","17603223305375528970110710410175592504507901335489871100398461389444688509102","15950000082544045394526115523741159615348156864031044224172890462894241606231","17603178439634188462056825952489860474722953595745235452510670608903852152095","13079036262723496487062341719232498854721623596427562123822257284722043022380","4574759938850684302328171377919788556520857555728298495027674689330859913909","5836322900178474894684749559174625794931606932780001961547616477680042620058","18682912995789016595436882433435139159334702280353629213700041190405671371221","18682912995789016595436882433435139159334702280353629213700041190405671371221","14647299140966795168634863382011786101084247791740654785196548451662948086183","19265929620982371511819161020399302006822082297986006761385196152068883496437","13051815778936294959186188778209982533089138172215506637927986094620164817648","16226984168490080400263373201570728966749962184950889718917387268203884202372","12688265548305129213524123982283433383136772509110047948234368697335124109577","4592739379790743343042028868384342794596363702987579215937879797639357089011","4933182101183318250560018811514844142859815227384938275570441539742336262480","12519200710540274443987348735978102700747472530155480989464845837532354722845","17547875379231708590555723879540779728666475590929028917859771769395698401715","21219905789358323534478545279193723251420616841556623254711235028135342626157","18682912995789016595436882433435139159334702280353629213700041190405671371221","19617883112060216036437373002520931262578741557295904537678304364166866283129","20342168169457748695802149508674862964537074611245094862559628187033717475867","4420985155765749198917158320211243542858248750314567273670169360313609199220","3608626711809097355394527544415447989465407554113965209630262872975367728702","7986666009024332686676662864413304092722307894727965157582073398188685188596","17539019008906665692358401403758991639375357012882690788487548831749474497244","17496320222604434917256246718514403734235740171188912286919341525891256570713","4655594634855844188499094340496759182976213206849235604185854128079411962453","15618359152517208456698312197785172766694127619077536561902714697931530755106","13748763105074593620013986383045781773296715695306976461248290420913969610259","20131832673266427475769741534309108541338301173662948074665588100934145363162","10690633522035360601031737428400068881001718255130638825096194976708724866144","18594403705196476767375145654138028270042663039914897358747063340477738248585","12998359993404137434826050598531205936631009536891015167391276398139095697469","9141525190254519952022341797682038597679704914972221193906068133244136674784","14144040826170485243395777956417332299961240009335454448818306795274079743482","1570274245034538183221128634382794417097801245857820047802724595210806628688","13597601271430461916896612582648919742272715556061113046784825140314498905478","10286727453332438406648583236643277009562092681643525436851770105870834802875","15710422838883679733600834907476906094570753444844580151730513642276654631674","8082817983718546987105551276971252463934917335856558917892075900846966350585","18703989514997223432661641229861332310348080898339160493229575272467603319271","16480089772180635258030461748402564771495064968752027484874049433567638476934","2967213245998332384543885104754783540899439580884490432048984202068901705944","4655594634855844188499094340496759182976213206849235604185854128079411962453","18637620888308371607611642373870554933712342468791368368498810637591710912686","15776564956440002895136116449299582951656581983212117550232796150916571692055","5210257615122466358421406540799898540909863599743777249997433762286779163631","8691474413369666750892234614358820289658368726857552974633024543804680298964","13605376995820845471499102796322549845207296468035227481017989756087418839900","3196185115626403769090812264110127828126981872545481387659039004737077237629","21591247897428723764785205441739843186077784027717063974489303352320972773514","1194604146042048350003512364693260099917768421477389239935129766419846021985","10782746953492500078751030180163064462657489179646951793154413574373371915628","3885925135313023686150115977607110368258492435636819989794778250027419367343","20521411631300308681277111693281832014010918653298260542960102164696238242229","17582818757173661762314072926867802933652214827993395929831324522299049413904","21780456150575058339898563710498965468972448244984833163147655946608027181634","21591247897428723764785205441739843186077784027717063974489303352320972773514","8491224372742742395086082981236389730604525807576141462195229766319454932167","156542953578700199190349883532041470160708612831113224539973504251955528744","12519200710540274443987348735978102700747472530155480989464845837532354722845","2544185200680176111354240446924889864706979425265095363625611785655132613870","14897910390493117493085561230943786488745018480007968413736887385270447651383","13051815778936294959186188778209982533089138172215506637927986094620164817648","8370264878441063630462671051957262849187564367781659467838460782939804026447","3986804060834622107770115616180027696529168594693106325651227138002220680218","10782746953492500078751030180163064462657489179646951793154413574373371915628","15976978918004336355901319629352200911328902990447017277673724626919242812955","8328030641700015547962729319084004225083584314272156382022742953974692359024","2476324937951789382181944025361875851099988750579823474754609765481889757439","2476324937951789382181944025361875851099988750579823474754609765481889757439","12155172322986237416023663042004942352608253176870958535098713267207721181883","17603178439634188462056825952489860474722953595745235452510670608903852152095","20342168169457748695802149508674862964537074611245094862559628187033717475867","4688608777744900238376640178893120441686955058686461498962807904713059186065","4420985155765749198917158320211243542858248750314567273670169360313609199220","3145275707337847188939353064357731848534516166917140907835781738084777990262","17603178439634188462056825952489860474722953595745235452510670608903852152095","2235150263865959136421726440400433738501848129328010009098035293276672220717","4549806302643127256376053744839835469729529127535077121646524402308295761124","17492490034871188503809070393464727304143828491765350693224566925126105199911","18729388765252309558574413425774793050225406365031444286319123071733886008203","16480089772180635258030461748402564771495064968752027484874049433567638476934","19883029896859112110244432872192403645617916717981765942483639413786774824574","5836322900178474894684749559174625794931606932780001961547616477680042620058","16653103879864200321986465966316889764620013245316877484022986374603264725648","16698515797824680501871676266202253211872118899888285886412000454073141450701","12233333935383563259381899984287101540154684128978249282626058445737562030151","274144820678452421379816557330510579317549145397331786233749585417771792945","15776280343411227095808521568994471614057167432416502119979098996603887292938","4006308849281273792274000957432061207143923231283130218997109288816872164471","15435596047717285113986137313550661564381864970285528104339022986255133148722","20838188000013629937954971368567014585342187321412629930028751871743338652961","11433874323428772158013095381623924200138375055456955808189877801771380225552","20131832673266427475769741534309108541338301173662948074665588100934145363162","18820995668034441064481786413532066855976405414499761311120499699159123037823","10599184745355055122827201680284382421384308407491311763734067519190170881017","12876212902112174796123067808109407354255021515914362771981709565057633093870","16122380779106962898741444352984715606386470429041317890034930229550324363289","6836865286311343609694524245159119133769123287741705285044672797797129131253","21591247897428723764785205441739843186077784027717063974489303352320972773514","12385792108167898834965686312817629786971321080122734283967136719015404659574","2027121307515028227361803453971004574835283397634149795685942874063731877044","3005814121577142321238773726823845968144595752898226988876012545652019094241","4866442763557448299456393930665252678199356968867077785577776954873671002076","20046290436659560311648463454245918246036175981027749522810979896203323505017","1336458066220344521262880797524303149688311982013949559764047883761889898074","8491224372742742395086082981236389730604525807576141462195229766319454932167","16653103879864200321986465966316889764620013245316877484022986374603264725648","5988689769882991468528359729958078604149342871940113378259733314892811441673","3005814121577142321238773726823845968144595752898226988876012545652019094241","3133838166556165943824029176542597440374447246137252468511956694712122940530","11183511759577952361572566673527592434184886344484272921682811575415051015276","15613087414575084731294247924061147534041250959429049604445183368849211416480","4549806302643127256376053744839835469729529127535077121646524402308295761124","16632434695136893331490691565954322107706581064802120383393065446949358038261","4933182101183318250560018811514844142859815227384938275570441539742336262480","19750715061039895092288075649509657235159241403400837501090850293666251108617","6049121453084659222825489908739822792694774158293989229260853547616301268692","4549806302643127256376053744839835469729529127535077121646524402308295761124","13370115598260167633113987566372148589924273398862423406100474476922447871102","5469955587383559828097756439479681402770241102946573149636380518729022833750","1632500423430879870300869265124598190896358768919584266600939773214617936900","1071564318326244075341980988866027669737011601498674724527637774926288977632","1493819599258016045339110999235422917168609982262840449866816239257578013153","12998359993404137434826050598531205936631009536891015167391276398139095697469","14057612694744022955506885004102834629754310001978602939456750538201073114431","12863950582730082046148154608075135240263800483912187224256340414612337617318","21451388112829145060821974036366132513327328641208732802166144524686108831760","13004204931687393626720102454766944489147659600561337392365246286815729618336","18159717335881315589645032086713288496782632932867903491586009514211947568031","6307025001981604557276095751477581176989559254288853588059732891819079685284","1440944398068243290019815197893325790869382856018839453050014183551865062018","21780456150575058339898563710498965468972448244984833163147655946608027181634","6836865286311343609694524245159119133769123287741705285044672797797129131253","12233333935383563259381899984287101540154684128978249282626058445737562030151","20895602419903453398196391913478058693274453903342785067983129839552891433864","18207961221628464226564927736506330628717051411055463190287553801949660581016","16226984168490080400263373201570728966749962184950889718917387268203884202372","9141525190254519952022341797682038597679704914972221193906068133244136674784","11433874323428772158013095381623924200138375055456955808189877801771380225552","6585682031650501777630925238370902100450071127640040426788913175433490518990","11645420524832783721170737438334136629636818531954268745339783028025385754950","12313143896208759390351526641510039095883815550699902043061685514584813600074","9888239978634522925223196837194242311545989047209631150312165940305433080157","9306117694572387027262464048290209213167312534461525812720869427821619086590","7800856132048238285999367318239374829634076893379031119745654756621815300429","8328030641700015547962729319084004225083584314272156382022742953974692359024","19569641468295105160418177740024945517842897645468872356974690513927041995987","18703989514997223432661641229861332310348080898339160493229575272467603319271","4006308849281273792274000957432061207143923231283130218997109288816872164471","4754713757431627318482916888231215818599754770670360377946229107868340173565","8863131691935358314236967173935315033413820679736774627121405457433895003795","12616472237712801953990641170786430111219637655930398736307229893389737211053","14799475491656615059372780774624370709464328674979516248659286482744107230446","12600480540100512777695577363859185402126112711196993279255107913533806514345","7033259621441273379090690993518324745190856903793390519675567591730089293401","17603178439634188462056825952489860474722953595745235452510670608903852152095","18693317710730212151208513181186966573996077028828882441479768956833225751022","13641582444261924898950561772071287900110836262790950814969623169365632502460","6585682031650501777630925238370902100450071127640040426788913175433490518990","12006531986840408977918622834986049589872827010469069694616415380752223757192","7471975174935772955134792946513424637999023861300940920934522552454330255354","15950000082544045394526115523741159615348156864031044224172890462894241606231","14262959519701291686797273506458134133352406025405884284959025726384935370757","1758371485945815703876679445382538767819559386912271388124907980130004330353","18707594353877082516395132272698629627555807696619350634836774054442394671010","4116036656616283014460785251860209028828407967565755603300238819653622156901","18594403705196476767375145654138028270042663039914897358747063340477738248585","9377958456884255467194088716477119239642797045077236472356953540022684583149","14841990498171696915559636042318167569437811173944889089519208821758196118572","20006509131408258657369129395045362318044780385983476979717124299339121586377","6049121453084659222825489908739822792694774158293989229260853547616301268692","5568143431214976639464768845659406494667053581733825380813024891527928235568","3117586190657126472592128104269081184451127080527182054370687640020932637738","8691474413369666750892234614358820289658368726857552974633024543804680298964","17582818757173661762314072926867802933652214827993395929831324522299049413904","21267939098918134027395634942102971885281982111723141238850772621986256662900","12600480540100512777695577363859185402126112711196993279255107913533806514345","274144820678452421379816557330510579317549145397331786233749585417771792945","20663699746183765412904432768074062935933374627665221119822945660203712880745","2628389834360132333366589026387003814868457686372552787974500759887369913155","15613087414575084731294247924061147534041250959429049604445183368849211416480","17174337625009122870708859925793325997946378966416309900853757797594910229791","2967213245998332384543885104754783540899439580884490432048984202068901705944","10593196891529840628734555040366549092907275204600028371924840487850448911826","1218928037268356033769144531312651840516937586618523437511091378414585873142","19645303799442917520263849382981918648525479954858046014781621457535223129139","1218928037268356033769144531312651840516937586618523437511091378414585873142","18638025629280224617790168906173435277703684091772827588468099812026035539738","4087977103445290602464010775212316926483391914870441578758042979308767270230","8461890310516914992976016102786941165050457592527945955052989873762315959085","5568143431214976639464768845659406494667053581733825380813024891527928235568","3005814121577142321238773726823845968144595752898226988876012545652019094241","17603223305375528970110710410175592504507901335489871100398461389444688509102","2544185200680176111354240446924889864706979425265095363625611785655132613870","15718330550508436908559701395606414201668068552693146421627683872153427960853","8140644209065967749731539711645757673629321017919126168806710308878873241272","14799475491656615059372780774624370709464328674979516248659286482744107230446","374196098865630209786313311346578647643865900042267366994874073365518434467","13648236315809483800741231329158534760283476979282874649596812220944412887454","19356492332655108003949429792555441845806681675195402015185308983898801715851","1118279149946874054339337226256428104508684927524794373040609290637664978199","15045123937812306625997417665247004551483049589009168687548501235926225142020","1689709601556268020419125248006910470935068691712645256591639741945971733744","17089513984383051444012804212344078898491877698852637641465487102929365695051","3835902309964760173432611751283380612399529168609044921165087497368685977916","2544185200680176111354240446924889864706979425265095363625611785655132613870","3348432210747515061385037490620056224077503064341935527160366063098820102327","7986666009024332686676662864413304092722307894727965157582073398188685188596","7567096820715495523465831195561335361495276610103173418515651874250913956034","7800856132048238285999367318239374829634076893379031119745654756621815300429","21451388112829145060821974036366132513327328641208732802166144524686108831760","12042091411871087770321928117714696325647592163332119499975682262951606830326","19569641468295105160418177740024945517842897645468872356974690513927041995987","7532552732354833964818948844447124010555621930545046129036742684162649680796","4624094547626164902101572852723507795056700722159656748629760282341508155551","2666549942988803296757576401723478920911340699174408059253220554211642279978","9888239978634522925223196837194242311545989047209631150312165940305433080157","21267939098918134027395634942102971885281982111723141238850772621986256662900","17080170896205579351487820867879098448749980844566584779831865641843648559954","4781857348503260904895922377303003708601361291248025972804843818012461675526","5001232371587577350490476563931715794477203224577970619789108259266886603950","1194604146042048350003512364693260099917768421477389239935129766419846021985","21267939098918134027395634942102971885281982111723141238850772621986256662900","18707594353877082516395132272698629627555807696619350634836774054442394671010","7236783279316083836339480995960834633270959028443867776543135480683166923869","21570485471295626790395474884741704872769989979943302238757938053634431270592","16632434695136893331490691565954322107706581064802120383393065446949358038261","954361121666374676317512516553835448496801654442662842741750447529976221096","12998359993404137434826050598531205936631009536891015167391276398139095697469","13004204931687393626720102454766944489147659600561337392365246286815729618336","15776280343411227095808521568994471614057167432416502119979098996603887292938","7057969325794614252651980473201258184026879446024353453586952048006174273183","6994664438597925475223705340624595897260559921645516609558922687274714825714","4363738634465882118172307854104596042899685656091037340905869811610138317347","12180564838572574785577178844314834812952191421495899999848160514539788519817","13079036262723496487062341719232498854721623596427562123822257284722043022380","17496320222604434917256246718514403734235740171188912286919341525891256570713","12271983753113042626833634560364485293486763667349863253834100408006012012338","3117586190657126472592128104269081184451127080527182054370687640020932637738","14841990498171696915559636042318167569437811173944889089519208821758196118572","3814718729516245467542823378722292629370285860606484341016365565551107845022","15718330550508436908559701395606414201668068552693146421627683872153427960853","4574759938850684302328171377919788556520857555728298495027674689330859913909","9612640678039527906483661330640693201947160578570955411180830848021191312999","12172459979594272836158443334993722622077942972483988133675801482944682547814","18729388765252309558574413425774793050225406365031444286319123071733886008203","12233333935383563259381899984287101540154684128978249282626058445737562030151","19375155383395696510967115781488322005907183312666977471331313827828265655931","18207961221628464226564927736506330628717051411055463190287553801949660581016","14889586175325483443041813226686357400339931463122742842745317460691290784136","9770821889969753026439714135746557936968725073065412883354694679382717123968","3768167068773898722568469507920346701450511503268567897292049941704582796136","1899628457317453197426768456858589983666227401303606152877725712904770786388","20236454182607023448722579291892888454656044680186829166675261973593187415963"],["19444847062288131493943706784497406601211185688116273754131863169092610576967","6756357644703883372382000235355183123582254014035599689202182239604052730084","5834963883005519863277737060862183242422193207910302638450418995361988638650","14630532141997277216138304497310196564144668507296424668904559464853731825529","276005601789737429160222670723919227435048289882730462426149086438071032420","8155169592408501114771949260607780658108674298838155446397409772814142490986","8496173005628286226067567535490313700679832176191507650779467185231469190908","18522758669123103820765651383058550163152440728027329605661881000152433829894","20717160396907128742447930491661507548527901200271695593644376944470624644874","6783400954785427443777419190369959791457729235323837312105292689987925420262","15793588416019429949037560428655750893129153960665891892058368228751095545231","13047857333849170739650468523722679452310178134682835736334331719537030864403","13702952651241896077447912135262631109194634993417767336774463460551430174591","16771524083619709591205953781761522848915592462004352344297444083327000335914","18362879251176766534772404056399418613362042401782184697324682721000341441514","1921169374568757279790536398590170773520268712196928601546829626342058380013","18007271086827148118702779138045717036566051534448069739899858280155274498416","11677788058520437899562086139134738123234096436757857524455227202665943485909","18567835086166004190967610331516651777840850520761110277224875363942309193033","12549862092815494374468253271773435129600234325866279388210551065809722236154","12545772019827878627361160408311538713526252988913811675565306764418681013019","17790976380038280976988246085058593967622099860594622912213483950365513994179","295342049608542310001266607810723788606908957088698225682924285077522343374","6042881253538576878797032051936765585731381049990189646390895524714385119979","16177540255744097871521288192447267851650838298325801002101754584177258351542","689944521090171958642896246746378107452915085681977844021127122085860793418","21806600652809306442934150151527166374544123717499224666056071691980718320158","10687999924804520822721645773635035131067056997636998429204051086244451458352","2919688173439697460443732931955910957668633676232388974155373692008001074942","2088428214431812495479622929730813017014992498691761094277448089379469403302","3415582465565312695281321795946675901044043725583982633056443485871119407177","11432629911071490835626964427117253752817170646912779324491272989814675105631","7810232533291842805873821935461788355487026463002760576510838277131727012637","15850563248943823248196314184730972664098169701487536058299754250660946727661","8728976634161630217358665668742559554087067616326533741880426574160431347132","15547734297253509235806418165603020662298589957875421913304005171944398984391","3158249123091915580481792507317767452027547932247936126792366337689584842781","8993351209143960585970304728524607023340419549878051384852055190939357644360","4916077676642951295302597643655156805863813630504586598619800437364856520347","15052050566960149294362189709830107098243646295893587902102267385191499441867","7150859141970623502564908412249208973629105197031357581428846816632024424773","5659463774436746876994077967866722465283824187257515817896446525143503038229","19464498962894958485813692012599931383997188482601571850575384753467351286244","15817240123388522852498302303406312726664688503153075471764110095076928497826","5302571205101485049626764959256598947375033298608344128379324163720645334410","20692740934715863051898617710088924214854286115389280275696778859743980624203","16121180084056885385768374518937623712121773918849607938195591718986083243748","17449335744171334550114352347521422770517337704382637045934115518315313519219","10253291411916249149409944484940846312189907495150544356013969086126665142627","1075989933051112270479502705317054499580865741297076182284940703542006602757","17496779585745191468575660181265060269367274078653980290860692264179679950345","3538122871871015265597356999511771252266082849566808379976323073541018816059","7579486643564421792498711360748450541290817800587156287997063934548078067430","12729453322089802294380978481733715584931031070971499485676879773953031357372","6694633370369966210102257937726749959486994134264582443016638266185985910723","17623873916481672691654892260114036685248130649477279788335331445450611897752","6307701910454308121209261684131709903162842155523511946468120801525808144713","2490437230848135899340146974626841790838141435966177610519877944111227880794","5017798776934405523649599878486720454877889960063314088092139283965398786505","20817420597532209277094254254011796300596270364114901508622090395551862021369","15258825807346731106480585334099109914680431439052544107298794895009458789849","436207735379833515948816288186396517305806158675320799296446691642166338508","13294452063087597313135368572465579195169503832488496277864688043228247847885","5281958238296057162541008015360609066403026130630047672176591872125940281371","386042965256259984981370670464051577241496612285005807238429392957903257172","10942243549318138624734474054079356060390652679206672396911330609350570685574","270406167611514320681193466529653886068620721651325372569688862100531780060","21769039780368018587024190597032828628077779629457595552733479023564952366755","14257848362862950978758226475754708328366569815134458955450406250786029562719","20675103741730086975536120126603499078928196755869920413190380095671818551245","4092670173605738716451085900386063604788602581706203170812942738120506696245","15831649561312402734198126328637255008767394666669354210368241338558776960189","8773460264964044836577029971056134181700063958452992767868071607709089255261","15969366571969091014788118571658462634361656562903319995975427897452380798450","9090539943906640916226800382217696518430261301435146060171359093957899579442","12598966212710420863490627175550230608849032996842656735190850410879434661800","5082369006304868528209185647948375467679404699238424225315402327829344882479","21232583620520875935273928036429179339733541639648304803699206026350761939727","15216028261411784444168994831958830734443664066057913354546359559245244924050","20503252723414965832541668822746284724979697942657467137170476075965669970069","7028702238870184282283447120220627544268950018331505390418179769944671024747","13914367585327187338201419330215996326176015243409712364994147816309186215349","11972191955486214659980933122765802430687113190375208665981572404973523390750","14164313126758634946487037847698512982901341175183925669745949763512995563823","19643507624196854874403818379994773749775871114166053756059820550045254990949","6253019705251155387518897830821875987387745060770031720935150387804561656767","12614772411624778073372124421221342091038200351899023491707175227213282820386","12799054234177807811763785306399761459507163662627299853945472202258817984059","16298413623883813223145205496435140924571599757753789623615680953320915107823","8610548149652073334956208860269106926096928271670836846827000353008597438642","9836284514785177186880347525497271134591015465315721313213772552563703130511","9784976878800158500585413974169708349867742257336666799769685612736807878718","470868555320390516869442830897247668225662850353632628471628589894687191840","17307217182098561598390477407238405653820260056045707641305128326328073989247","4674116504957384653684422429847190124325067762798863539680591567775099711828","4731805738765155173300706694658606612354279416357285157979268772012947617710","19408369527037425408359080120949793991326211819391999900817736764475384891087","18547195232973238597820755220571190923184148106985108846845816471997990813451","20764687130261902672266922992036714570336508922412884145266283492627732623055","19892377301785347591650272014822981146836631795074611861111907754644416903635","6413734757240628076834626843107147847105076965920897092716625820251267566099","20860174097442586122448303694433017965295045714190140568637973811484764859101","9976157929114087350046280965312715789783677114993652036414680945525100911346","20443284379975649347549376624760041838634895555678719470752881701519661070489","18893870838626114784034800186442840105625315290994458907142980368089948593544","11133903488642571617254269414928956946413436570602781254462926700298981057101","19260150650655385130131812830419214817760729375303617428649411135535896978281","13461732242206018780892854302161037532643049992617159415492401398338285247555","17102228736482758300705766391088892608834968842141194901502696136509842518851","12272871719359531993455999114365256014273629799700014768301209571123981371707","3594207022562239110254525411112455614396088633713917231917804057840385838433","11285761004669862352633286679979731173931391709324275439550892089674658948897","16102568806633415123079332012340754062427981513856504035688871887957095441264","19519597368641109872437527694712863032289967186787139583473763662663666076515","7850893600020675091200117628857569397261111640016750677979107965392238148005","571603306174340121900401663556670083480079944829773014219141824601049859366","13417234230361968064652407531174824869916389080577175614370178295183391972896","6339479905118967532949951465214069151191196402217454265147854834540663125252","5960266217431370639351267159124277446305252772759082083832329486288316249467","4827913422416492916492150995943144270796495141536283583210133173575222257256","505835591148323979694388175613018554712950286622892296281531129078833207836","13430162365250371418058587486919957187505271111954906160838200205517866181347","11791683213979729551370231161842890041856917089671010365556092948261209641299","13878734884084908403388117942446409924859492948402374543903835601747661416301","7914593516489852442626571171726775738811006144753811688169867990351813492226","10797302146436138655457419302923103882636832085380740614686862737265867963715","4394985227939438982168027081286727479189710464482074036154622396987481104200","17846370028727001276602920123596000650348888091372292752624526729964991577650","1399592710245988806733110276286400825565557403052909106157835149189269504885","4480510739831473990116609789595044875609739639498651344219709760264319707941","11004586942348048001456673131635437257298168527005870798189423435197580585412","17257016484028305690607802548970527681899034872857606356645268286697823560745","15880272219577681239503657424149468083362971750716603748729669119492924589385","15904554418638709990040031800946465318235842277305545433558322594469065553553","15434974732418275887764997429917488815499533240877756132902224733577879415473","21820168018779047045619488779286049910110834277003434094980989418536264599715","7749008375218427634588074063863812252051333204096406815453992945864441895362","3839511695466461913195739285494941868041132999203534272477982111080050006523","11192270025434739945085840100702117964637847488690757055208388489558083138446","7139432526479835672329459147861644569732921891281014828670035430783917357856","13194122716181797306702591509497059325803038795351433491511874742185743961578","12249486681620499703064189091192752491339675300250225642057366857872815164391","12751753758565217613271991442671268614075299410246481820732282132452214741118","14152899301351110068123785825973380466012981712532341785578761964446295185434","13188569584536274764354182121465196242988977215787135260110602036659203482271","8583058680448359031190112033511783279444748692566437598204669389441269594527","20739303906393962278673616858161941640788810322708163071371214143202505636285","1180296912375731347768428538731067445729945471280254724677426248781662325181","6017789428689615319791053684659036780814847053654130311712769439159937889609","2173620618321392312337995148079704379859037528218619197239932038613399941589","19342061241883725191788390495410721837582278801952815468188667976311290962368","11961293118976486325969636275124778155072321144934089356127319435440178254418","15003950077727351663111929517428911404929041518452601562597474042673134378445","11722551667664037124885783671627704449310149868015743702657377612966423359961","1589112258505679428520003152962075989895613700798393982576451871741579895537","10237533647542628466819493835368797714803583017400048476478599541985305410468","5633483783935945421681172594360251312787053845387155338966168908591309720937","11524348046498741796559712688153551628725965921178062387194745025875547122301","4119351785672815550070213600551390224338330329829235301635622400744195777997","8220379217788713766164367196730350016648232008308605440647920160713746282775","13638223826667319442473592100092923906983786522766094318050487349717540347281","12855479012377423286653672887817339438150952573187773204679381183748640361953","18366449890796594374544459463322936541588534912307972856193862784267127118823","14831494193189198695462931146064274924011201974477576494408974317628024686185","11093306658789847420019060296285299107442543903230107282402432370912267955583","5231748467324162438135669634394990945005973450791245562369389835255116288637","20334409444101673859585989946641575861192600463100161126574009339834336019122","10942950770398062877133838468616134250348068685639337507689939414774241938827","21031737058468102950077505705229155312762606827754507238965327181803396985398","14995690437383350976947687078631429818437217746718268679299515186473891812908","1173662311857265316234231482479000224594910385121353149729453581304925842874","16317128331316988904656774031136187679889289360179612223631661201288928381507","18022252460738403017955303125247197991330411362748880642725885324976196166640","8288649066280936236016549066415276935462595711048345269972110782845103139499","8101426167425842649552999897331966976546505505184628823541554176858292445739","19821753079400865197220037270302986474791903810187177911888698563958948917390","2784180484916863460671428583402451895733388047312540417328482549247889132480","4344349451137697568800756375175722014382670587070900626206184353193889614535","17108052563527778392492084240217991568486546407558042288984049724593379381422","7485356603493015640805315156078413547503227090809875264979461763636775540173","20116242746183168873263923842229951811573923370432089711294380935911814240419","9858039399154443683907425505646969133966670338173331647839576035520625125303","5936033307217133264257041597188115964457637953718647112906870372504454763103","10340607376355789386185133452696959378680344963374631186204861558290387937896","15143103911463403933694713744901214045515642353696764687126063928209653789192","12568011130622849006768060215361376856516151918301278020507921479894858098922","7111521666440256973246253704702100762492860379595157618666729636714922588085","7580486685427227006299614937862983316144183764347073757169003614550356572325","12502519505884004909911681176131189323239621629488138970782034914590014092043","9863581385421851101081385563919847832922036616162751380834430385700096059476","17089158809476144094792821264939338147530021791726877719480271708166652703326","7026088105062704237034940019476526637397741963002343232018356066556664336014","994845445499189024937804545514312797076696078022167307949339617575675546961","15876781382035467218016033046055811573116707790724628548144881416519229111730","14689809674274247318241891219567086413796397509459798242967892601162783903120","16802092988897859361455231737511996509109485446405679231988222489773597130923","11709594647859446002857187914237272532186051520048442968950936220950857315304","4759519183626534098537305899218615829180752782224491547499330146161396795604","12571776796240659864426729857318456609425220646299460273766246547672790642171","2769573858251324685257310553432601557929569520156842199955099014544291860073","21350702766688879701309742399569256840528276777122627878991656869575644945880","2526626063522996270964234050318417686046098564667525063669005074312714302888","18423969495073310328067310084757878116209975357377687351451039175700497833267","21531220091658777616686839660258285747325371338144374109694041768891457998130","8427394214275103558108677503145255849560869946329377312496236014365158589665","17828380319195981604154858938823367276654533109286377267191125673334432160668","19783211215983774081961805533835609388239392763346884852979216953198247940356","3727051737154131506128614318795547682671073691116653628343563309169975365047","4119083313708678127132222977172109489163864264438306707583540610970422311783","6252287104931155232025872198136217318428623125187576197254682957610815437724","16710755249167084189102639360502018827510499697025984202991420112604257385843","18110033746887190005442882808977635890410904404891461118841516946874175301218","2918227864528514910093363913084628926376993023173539111767698239437487745517","13157904629518409143900661589841979526819718227397509343138754500932973967009","15465984474345304234742186236252931608183011971272680663570940465290570424186","11878026413156941826685108652791732794881788651335612324490880949402660131765","21741112052399478281259924033664983472268352228185898315463068813827126161518","4747527944432994412143611227692094864627491876083414817086093654783041623806","10277509022239901860432140475301792168394200477149266436561100920061205891272","20754999404087624192417155025756386217241070628838846889103117636133597080130","1227483547193673052804267071643209335283088310397022289984033072158054393499","16307552232859454034882961446345138774643318545424496725987397798274178077698","11567226711210341061121984162541681925200952470462920272949521200488251321412","15424227904345959422619063085953205567698592752523587527109367016932522520639","16823401920568234413742595921287817924794689336332341371093680173736681497958","17178500371576477554985292834973399172166544093847768566487624429998590283954","1102400953040339496875839457489553861844373351305506415352858751913370587559","13080464865068812038556558702873972281884160558346383435106169788680033625409","17566439771637037764512551735908097926933863312105991588803956078424179421422","16017589041969736678541292248300058552736340849527861225476737351214952910390","17523132608433278488363705847003860425511874430394165130941513353774134550203","8092883253891793587844758644260299541045067550613025971974356731243569159353","12321254675263434305822776900976243546292614577867012315420304293383073504807","19531149435917118867843015828825849821207961709742362361864708921630704500355","15354576088842604762866949406584165222230700080158133636047990454918586008294","21332421319707262576917441034633152814114387620450650854230219273363255599523","8015272434831541996001880872358562207725683343073706305494326975486227960571","12801191151888372376060502552634956842440004908360922421581803464085063730700","8694104440224692716427888474719601394171838580385724406065092424387979527599","4765509078609181892846277022626232660521104569272055934150322254832843470212","1707661917588143644633891057877135790850785409331274025620234613394143277776","10787008015387605260759430860865388187745278282497799140302256368934199376144","18194756507120382377518900347608092311408202948025495396169941673887229961968","11810263163672173278046828506977243322053551737568215505161953008771538087012","10172831874213234727939155250453684259406380736682460492997296249444174287647","17213618752642545792657024676808752714343165784509075154710334645425090992985","9518819925372898218456223308202739688600409921430244215353056882744779318092","17131123136661624080110214353958082369854888444117983370276647495116278598167","19754012921975586054359731668325890866854753884616461552066225420294483351377","7462008052105461259399778705587223745964230591131678540554526750478109055926","5484333959594514705555581721735095833500903297285196545219921231872772537173","2557226013119092043233815190178143918872697500327638257441826698928999698503","1507054359686440154418474816353859974171432117437965276706552855449701554081","2909679213050550436618171367293366253775019191659100521218714623421006853461","10665116922568564616606427374948039957862979916786672099258153181783312457007","7437027687262241094771256075741913500475069050164092161144508657935421667697","9967053963569379718319069707565959289787419857073584408604810513462532221521","15718982984756021542737562070818004660368251058309053869841344798298950796472","8594575682392663586907570362979165880675434255219238535736457340406406145184","9849370649402433736350811470041391602601158790752692132296227692446786080869","9624482408802253671341983829498637676172459849241801149966973606965080480613","13354161934013526849172225712805307512472349171765307613219141825881166556129","7119937145734334389233313270329538489802620576999159113776679378225285195305","1344157477128478949987376865221983316869875771654805484027433189770507053978","2436371520942165567892833442377818872689562318523120379398949725464297140490","4640506731710423220152475272336202432209747972077657499961644265967270381722","8134111173406553366062271384030182464082652625519520524317327080426662707160","18835504434223507510706711065799771244448550952615072290009282262161978175311","14077721328629763505638231073434724231382773989965313645642436166756183358663","19436373778921499805072424422947303671456441758269542721598857156355476127485","12568904822717093384930952712937445754376237421200202440659283713620770814211","20314955959257660560921000685610824477917159776697875155847298772747329300768","11405801816929456032970782505841034689257844102373121701727764117532089184356","15371647220804665136508666928297419442325993974748904907636841654537146688325","1655879953669995298671229751452904731600368401825229264959225234155007235923","13666140938671349359494215404645073043195359971495797664882691221640390995273","12550904050297885561370934024413826444188941904477880730238385153385367165600","14073644402192665599906362483011583221003958995020521977339575317519946136820","16127269466493498734385715523881795251511197745525351003593964386278292404389","14837032480553715504482333167436817124130071726116661830299825705998767715604","3157996448090083717095242716808677272509143175022438801158190773708431950360","9715473676333570416382435678725993563514140964778059556896984581776706520887","256184547541958273285404071642922907436096112735647965196154201025022277333","5146840525622632106780932715431071405921695127146286279740961056077516621929","18384530045422033192575749482772861619638670180561846412064951946020645182188","11372273308168053261873108888838115723774928158127953375858579798875763228181","833683215294780236385091047137868434268111079744466678646701850123603485156","7089521065433622137186726201244536967699813557477580528539264131550132846173","18389315271722108026135864703744658330872185858220834005947924896718372293177","5273779548466102910604406559710961194676307482240757707576993583088923382766","10978849613552770174834059773211945346561256353926504281930385060310161512588","2025512406735026708082790073002703032266582308582294674172511260928159182091","4504468100864789788585048558923081175827147016553914221993821395902410226580","14522713701686086398049669439257754726056815369755592306901430082418783986888","1172467899506707275500621151748833545282318904665709759177855581577968013027","4017285937828459403753883561608416496086703957918951620827271391321529059987","11864471167080016922573162728545364451553961508840493342354739707638549565971","15395434394935126648016086405692837721115704686064641372105542066627038311542","4122633947230663267544557410467288252271224090277013257161493137456223809532","12367035182954332461724293253434245043112564579380915260333747415793763231827","11865369149265328070561952780930053440760117444614610585601990621600973752433","21203992229059334721432650225967073448947553069874953360114881444016046128212","4447062027498500706657516396155423649120105266695738260082288656873877775154","9768914556161785389033236087454305484803915332998751645480448064781057341482","20108322604990560980160877548004215957204376010054104051873159423654202752320","9595509101896597349796523888856236119720835531243000900720041097386819336414","14587725319883470075206520097311394112137459424358160384009848233555406814065","5457101278978742540891941392855879387574924402835776693411461549501000663895","12113841369063820983468698918538182086204397742190461968800698674517428421051","16068938140317889943118931947504964857830114253819180369876235993296869951694","13406404344690547712656422177528636282657567373508751252664435506615272243163","11920541176421075939593055125523895823398130674849391046727892158235384625698","18352551139579012013897403430987382961093216812627912973277904518956583676698","10674676651948544879371283545502930890187181335773388262215810803244237530411","17792652617465281251634086173304934915478757132116004782258567349353652661413","14095161285749055405609690234399476131633768997386366652456808192371657539278","14644418417880601716605432589809764539302677626964586647781758014634427301961","12682826801878685279471965670138908278972084615404951130397921689553252275917","16521811006308378802185018489472310864659177006048843323237150403797976462809","7587334525407307163363028377898856862752809539521418102406305044826227081231","2908188489370783835450675853612280861255988950722158120607386028475371765438","5768335837479629879988785208318290476463727379450480334123633739596865462597","18397687037462833823572912519678833347435022340840883701032875748539812458303","2064051903495281633275569322215038029852745445612015454511944780242997049313","20703062910303292827787302109557408114919292642975918255062370581536946280279","5192613644883731002587556312741958983910430944297172298315082126198947618654","313995112743011376940466097068957324809905301874096868794869587134429900695","6100583804412559896713857626556992976882930387670359810813986481223803866656","7568477784584193520555596651137331005687926377144262826447525559308115017859","11965816735476149301106556132754318298248490433423691841191513590415182681067","14207753099541107589311100328670316235529404246579031740240567057338780037783","8175181231439895653513458924728919160206799108112661960299471181538010485894","591574950925877159318533535833931322303268506486282492008424162963779338055","6291500295969425140209019573620316970493238770424073159034492473203273747991","21323803361917137983608045653271447127437985941865950514234012867420827584203","3099253561554789805581090448570743201416121773155589506816603655098155495780","1839714309313076287091568541152080485292267125822172679972972462776530418282","2558200175908531709047812372022758109817946983415270005672004724309427120260","19741248350058279216600684476328478604110692693351318658499898211265333707610","20513396347684804966709449761679280054940274793206626286808671260812749605107","21199395741845301585097008478390085111700771593140616012257190707415683678475","1193295440609646713499404272654104228852330502286294623055524015452275511910","20305220021223370039849959575983199996369990375922681857965899850450967281896","17820107252376141054638728180510570702321859107787033667301953883945482820393","8562102223756709272478881672945718062091524608141507453584726675060317232047","12729866889854088213825002226835767386413454298567413984333803695815667483218","2114069176086645971772669409791461648578645286643393688006056656185576536095","10328720387192484120632500167812311141771979930211632623234748092781923576473","19538747176808583509408758149278829047639151822592778264069763723986282915906","21566485228448007978934061238916445477820075682293291063348941039309377547117","16512874118663027529632973954247179090732712450359926425594828287754653354014","19513474361159315670934532641131225842686472304714306461918568972038209446632","17955660451558996091453589881731410953454580996956628370387347653903874484464","20207812711298497695792679093438648102083829229107494830848501937376854876915","2421660685500283805427163525391537853360580630525738399011621278281378880490","21220637208096207115274223617089911838806190587185640536543744119096826805827","11835649411559295031133501496374511598555615522238237687109557873710817042117","21845843315206305464060299008256175893069927481104540219951750648498803200926","20631059480895873966832525659452814534529673650140538889746811436460301724612","14931947145214186450366175386309608636198382084457683854282076180248650112954","11269118025480001613427470548591071135727829235390508347983385837123112634632","1605115028499197336856195103688387642848510242987640636183693756727845197451","14793151932068045192821467479293563014237700538215102580962654003247886510086","4775792479749631121184048728741675916968972636777338242957201950342436979106","11924757182338412396519976020707321303982941838080766083060365440475015697923","8793012126741532580270517228948233516584291822980201382325016017213162919448","12947791384548987120483288495488647496188362270092208812080516723498086541311","12431577747633669956276147567242529475925082219146607091004191516701144136626","21295609310519517439106939049470380075664847294017743131672693330232031255386","17805136075624551692961527907699002356636158441633111730604045300707846396897","15278588475566957386556949449930796412080383857587931690843946622004601690164","15086592550570758313718621320890905171205067149643603272496296451366320734641","8699916934544892971206820107825237806538121069002198874248662615835467665756","20478102917550226644126628799218539559581625330717095591690828406489686677387","21734112019017835960392215716550916739517609682150258078062175843229766012777","5622924154085488629989980934517712826380247658471643194906695701678873126248","5037675567259013572001419121301772828485815086531243296178132779054418101400","7879292516618887859296404288004569598567284522338026817864475104197386629625","18997982317212461405999296872279110480053417447725407290297221773473330565737","12867218521408319698642020263791067688553778005223894447782779145063273233968","391334649391830733165647799040269744369307545998620269291478209889127672130","19779172617188671507005003625727124894180457774396709811826326667504496286059","12596925142329235973535723979633472987429833026727663225071980844189781139909","5235665914291793592826849798922237619782905021482837663102032574231117695660","10378176145885707882180864408618732566825397818692038984901565060499728433797","5518777162814311292774945630117311095162296059457944243049863006066284885289","6383788836915296003887453192037395923957940433745589146468108910773431172608","18378980065351051303468356542903949047413878986601754325664070607662174625406","802964496357962027925228076554616050639951769911983531162733260026242452057","1151228765048898930945562930707044057686831938340081500592865256952516058143","1057436684897434830336559210204558056100073281195987707544574829513988277752","8304361322956656858271430255521912446914654094029272611293726480015886358258","18082138547469240768624686868284933205246517716350185535250166506919729036297","18560642658541340224573113670515696181164007817863242462644028839037653788889","21433948922232169473983994578762336789729720241688838555383992306060546089653","4345962888225785406562575377774464692418146638460124795786215785539658204204","18491683482553522621865105209782725705891560836095563832524693063541469370996","1595153957006911891245805177782994356237108154065736758857668165866836749177","12745465492150069776755940532782158049428554675034493241223264612067325589020","21068300037504263522637352854045908904548431623139252516417402783919558466524","21379848283598466733133277088729802150576242926281401193376016094883753111574","9100400045517145192842796463728001529189981626709973391364198878834790401311","761526173875414323215606081295741956635544790572881984169167052547500162094","4523944348324037435946042315903741390453752174721180782503374766412842506857","12826905798159813196098719614569295407483904515869413174592666343625127014683","21298301889175245346300576454864405649687317534182187998123555815790664451812","10466120407875459863164008656471249355019715662927569351006572823820953788770","18765634104736621669847916286108860226531877076283270686539673115026794951054","18029301674050837995501532337862434439785535856508206309403192619917393036618","8656248943628007700842555256812779240721861558942157285882333517421090859241","909124445964415430289446157964020522347064797918541903582383763270622833065","20322508313744566548149933895745626560811233314858699012656697985674387463552","11473133631180469596497273861714489893486108521245550300092095833600832127254","13886897454587288170317041019583091209557063660075562594238782502591880617730","1388351321374629053594529120028798986653727606192516406127733531956260217411","10820498967321126905058350631999655366739224197864958698259285565142810221774","9047437255774003551209946810681504440615180683867384529725252909718397576529","17682412621232111800652746737073732995871115754692913515596320621857114840713","17459249118412305865677329263167949944924745890546683445077681421571205578033","11260954622870514070117395143161679907416702369566601131920841166642078224652","21311356397831915997286783986273772284683252550215836267508561431199821451048","11763136682097804856942897773203126982150872911828688544623632129427460812219","21842630190420364126017236966197050216368815810409077092920252710858332802605","10278342550043948522301945276707570006673669578955262430508437722137975686347","13669836394181980472800926591849938243993826306313038236968977604089281032142","18982534836139734957526305655442344936227781958587358112416788951995174742854","924143300713476371714205215173483600456664902950245170837265326237374786123","648653927285053636997438895046220979749796246169864485502279639829145629278","5468004955461336959690612122600291068806333434489556112046051739596943193825","8198966717021290997043372415176306737647953294267526104476290516107668308327","6330635298670709263682446486509049538654774571294109306447884201740681314492","15801944407747674095773310676934626868427752390875620230089308747846331256404","3507827835726968508794483439124475369701726928422484362860421123326683863238","19859419638162971296535544182202685481010250129955481751622623103942606817204","2670989291504532792325900963509629466753053370545313281400138104314529277740","20601648770014328601409368128706235447141623327602444994362138629813091391329","9020250281221486894014346959707974240825231024554709686306581193571046947004","19448071090920013487075559489904268747031170350571103602007176116016451645384","9855626424064670213123764401317371994977710260418114099460019043585303617049","273960241475408299521801713993986326049831910833352543450619250235219034159","15178055939386630045266985854218396695095661921662396071305063121158729338683","16418360709708558514136044760916389529230612136576500765316577679946210432608","4221665154001721396448157482529680285294859819946962645592731760300169936774","15928426927240248300966353802918564700528184618416199798406399357144022404431","16641721098080574825584685806515290482647504340255838968877260490026580761685","5043328033043791709396469989853970276607353659738086803538716424273826786751","2365847136059064646235805353745790884320090296651246286300639444304747972170","4041703631909032338305847932603086185355677713004583954544688331535508848539","18955336159113062251133387111166001228674233452447804151061756635904896062707","3453019952400738475973808782556481687694637205204259443905142749926960789869","11524127246411615839928909719208083192110266130517385283239210402864059917695","7492331547692183757175642328113627423098873931750301487361682365924780296700"],["6147626315983398599623828701433547333453673391438677577603594265593492970579","17373941468853383126219105459190068607050821581808945666945628085762579781113","18675852993023932535703943048744467387004823435670327290887021721028261389122","2852369548793040881968762533784361230628321032910817596034076837353628838943","5808467217603839720723505746949026082419372220269554685256079561191978282423","881630969072083868970336367377553654445065403827225682564307597561668597575","19544569990585406772407871178492435999506060638507114401323899877313464549579","14878267709748128552530883948142489440260354911618515434884876633626486579649","17343819805602859300805807767921021643427945275478160475923718327955601493598","3147144316923493090898234228150076463075245015934615180699926751367408060422","20836727665349317544574927486063082355196001294246787527562129483352381083452","96317145595907405996130011904544599751055402678957605793377422485629255379","20396399042769838623280415410496555539316767877730329966640626730926403538050","16544170913650251958438511948437422304220931730646181712426172729311415616383","6584506727240961509162532209184300869090704109605569344599278616387977422824","19590566998868166131570194251669644997762427398843457301697274732261028743482","5370939348013017640853545726351872135226117514092676042183078550348501472430","3811261164977684952917850156691783437850828453502434535632153500394919711066","2749726461932787493809872269818342486261987625587896664994441378571818459053","11383915573983550688310113375653707661251254539665869167504588473259548645124","9916838988690774667483310481489200062268225403498599116738660259134492019394","19136188641055168463315034876725446731284472265583750601248498822680260653971","15887516977805743066217960044189842288305843582510102551810703206237207936575","17786336987824848955338515695131540821733411380051551383014609903313869530398","21005051851388306179077283769904047735509863101513109127654074489561708676041","16280781107126745125834716140922874326275066681906520932680370323147962007407","18273950651435988187072089200354144803354368518942337504978631619058165888339","18614652687185018380961130295677654222896772969195870105326190888698032468947","4648922361007933120465784894534004676668545278891300743738784783083164272952","11310213903650223937806708987912823331078563035902775716617057417534768150412","7092536296444781034677326999670539648216791129534729748520186653858607985630","16270772820615792622649247387660453356874032254909236504742474628472692028293","385367092325849782070593441039432083386681944665738979932466043995962540397","17805827342754632514390359424735316390746977081512834158806889154912559417928","20024907198154552436345245141243452270494636033297743549316539293869591409833","9234215646545489320069965310786583269490329356796444977441184167452078293345","17108590030314435824853432467901019859333457116609928515585181187173490423143","15910315900966077593714516016038233988218165769429475135456816210775619893043","6195529693120591346695405780440805718170994701745792651233817614742815203519","4245441012583870678188242646630412070966678757506494973612671283946354025495","2304903496039614013605109532969224328136162284873560250803845559468196156250","11693016457541736187220331042599070447664888658389150771534133194896638661901","1776517450185237199728116828598779967801038886584334689860313819128919908981","7806153986794341965459846938333081037827814782827885300996474222107928077822","17940588722606126928451685498548023407258873216558463377906081460549591575057","10371799193925909119136931769852410380947084603350351962123549948328327267702","20122148120685258769574029387408965700271219988052875651388434729616831444683","15035551217063457270042973549639483148607470023686796059163084647483242309786","16489878967514620362925449612730416514860426946012382948452004149598402083056","14240790414988975854386511568244923807338302009634523655466832132581555975516","15133406953007414531549110172748354779664260706851670137432180705639417343549","10690705590498820694610024170434557617847607229814360354839513194179728718523","13827979863066172786489124156769882364122124730007514470708895273478430314352","10710843232017112245199417697882565131311711949064640083364964016238583286376","16219821984152229456789841617124740176636143790533787306195214918183002289404","4443945405253668151711239889811682417722099787812699348882165569376836194505","13374936606384334329293205906352917858363668730599007422148591620583177873052","3130547537528629940846669185730749089538439536961954499553850136295109479545","4303969243784057034508123321715648667535372719281283244828773166674886261201","5989216789074209153873415762140487008397424300536017420337913939751018987680","3029463357835799909868216943346697078874683636588794683737453399576373478011","10476618143678752746465404417470443166809882491668311058666046570010751632186","9994925982779240617159890198100947662001398642389912929229658664058421436627","10176970544481288451346462511134758722164701220782536015402174118877826889800","18424158448523814893964414770095134832293892346615425373638250882224929431363","19366956079105748480886421061443145211970920795004384777659195934741753207944","11091181874846694774338090174372100116252530248564050096856395252568163657858","17353128656714558089667149499397061301594727975663152036301560017860428071020","13238006665653699249266914212871756817371819001645951476708047899463834219655","17055039311662343661955654211226746040465401123503635116898702099310815674177","5286666690003794895264449438418387547354350464287559511315554292024950176939","21392902555527188320634786446573898587249542929111262797890644582493861156962","12406681026512063332827308700529401005255127889048956231922878327520360845401","15434870710485794945517495742061260302820776556272580983813299352075013239869","4411491701113234064838089923553395617470727028121925035608993460932615875057","21024748108044825160048785654599582463761474190244764788874831807499478838044","7680978131380729207527636139131932637240489018432030824029067562073349627035","3408321867876643922057696479500927118853015770099176846426613051383968395111","4044017192507961081067569272422827731313648032811501750491406776829097444161","18331703123531329496821809270389173567173788148638525857133489033465163738374","8581985490532916637196455609081483082508040719164880448426655573293277467062","17097175177088407223987763609523437237317521418906500697394784959942004837183","17283357547543881822643982373752501634581207450744975027579424701697125768519","3114289317415665754315257515672327794564766886045727889771094589828045932059","4121982161232138234296918278643894219608247208937391244623132656218561035287","18319708437247829803403759962528832876979834741757230504257542910042917362674","264107059990458404050537285229935399100000658138987761233089330774579905414","19245962424630901799103732912445198554851301611802664729994835041984045352647","21481268955474162972538912477676302548213221412224453884623843567742457980931","13054652880944215100409957427046741206809909544801248923065995115092723867125","17445423482926512875731005227671884579111686501047535297579963992185600838705","13989585853109988062633188826244755875692853006739238542727480592170337647991","17644249062718367051707138555752661559694857297122633537358146305277959197700","11213280149118368264941616591024002649789370846345639214204202104395949573001","2479430738743447865220578715093732023607362497809812709721841147273010985071","19170346831324042064260292435651736023454774283928671114965428783767444651501","2249773762348190221814627264878686106981051077241650380763848925904895399587","15785155470883637875946431544967116475458109417323663711972510236612352559606","946428851254816645126686470157531364802207503637938152327774118754374664228","18081301874601965299421330559019912584730626502654796906499991148349725577704","13638831153633382373670579690567703064487867416124713117627597359296662910776","15731178958324434544665473314389188985713105014648908423598119023855377917080","9917979824441332180713189841520827682801122499780827932105321535841262104099","4477218349911392146745102565364781587379138332203307397011323331851070628289","4196116502992100152382226026767611298689212092096205622483116328361954387479","4125553640263062687363595819368491141976517437635820252286742313008508733408","1260916008238883369640783899703958869740490511938805562587993523697780059646","12030453507844788085837941465326991051577705323179782129621819752109773617130","1616729892142733988881271632334115354383082667129246299673207948969677972419","17790116243542925627055862896879089936668179540204703569058484177080937502249","4916826165840990844304507037890792549751849160422839689006410477257882391042","11584213073802412059271369957747279514114648193038035041611261743642554198283","16719835981206947895865946283283198567714807826433642746085372541538665338476","6699399511839905674805128446395397180664778802443708408977716737554091911123","21780850712707430600781028241084903375323034847472170705641134914367959985053","19650714630255045094059400839309517919992981015448837327702161504806266186096","17728935862560672332557173079197586635912056977568426093575277173589712551874","18218981656817542290354649557423542606221103516149396438505913482628491393745","16173320918545320350179263895050487620415753262311467001135680573821491660778","18749132839734280672991763462021231851140006460544549438336391357928762150912","19804729718734886506325561935920047752142654855830698311803656972478290268053","19852022811935550911202582188078555585552613695164681730307677046973334627440","1599238738915787308523391744992048319751794205228407988676015490331611074242","2730284211443506246137882698953449192620036180418562865041025043475273902148","16642697364423389759779785009909902509686802244536597340124664260693547218575","7030277536951152393489269782340459687632322761209815510891507421842401544976","2645282365316576153620189595563363498245471716604607785997545100954415436532","11836599958145463724978298325224948617075734206019980907941992318726742885090","9379836389594058052193342143605994573576860036693790984289698770005233003816","4936097975532856331587608856145453431462626157074390483327785374648647979182","14261272621177565679908729509467309781957277604700789847167775203637724156588","14384042993612223493091843709687195745753711205656098174358380328322622785674","7602522474780883033451932042024754309460846024406091409064496525413778743895","19284327179747355275744653991040577201544689654594363414180160712801683063400","8732420760226712172720096817390921487059254890223844820526135811172306039693","8736871804423236893739486045277613796724214967823222024310614732306446417478","10122727759967140400011531456417357002819799283827520027869345304850304243508","19600428976911158591758195579983230165311737010182255016349431988452518779459","21412640599888310728963227806182550957212529173812561818872357742782768708282","3382834884251505446697465695665888436600985771748054896175510070178943176799","5424268238511504833112942792546766462909191487396278645494904715254618246619","4984721874344265817742647345247970905833992888391940986059043485748528986042","2022573256442159494507968677656879636847262260354573370537255737091303819556","11258631584671172573229663590119520723468593511856614616016550772001845679866","14324740608597503028071282210876807343017578554502044501781245297161562860956","7445577371344670075033666971816988473049110374105172758569837792031494150228","13265606669106939823865364576315756612847139875689786156097851279279751433679","15238598484646922414421482495816633433705816808586791968083189157308379106115","10725523252426841374788275651734494325010706400301821980153464968050696737279","2633265364932628352793223988839752923311811166605503408947317749518744833456","7861175100418742846275793570757956123670007434573183352685296812332256704932","20999935414216903738941146789202104744586510072221252339001858617626303789982","5977614056432951814585414112421531222403223146602229861429936680581955055431","5931860876714797492092042112133640002267237452913723501691750002357001804830","14562008797185891958620443495496757871981918350581241703926621633158489195321","3505336021898609386263210131367635622704109853221241394942451388531030669769","16578235706824809523014538640948495588856893463000137040801413215727773380083","19375742803446681387195879499847072356772969941415230923234757010947456367191","6255367488637769736903949293980465723272271368601658401735079096147956784460","5906589694839922614995302078445158282424694339180630855015083500482196538868","13065708825279387211110931433757563977807644647530652721233367802469448976082","18232288076160370323511493082329108072058465477630759182903324408872159664436","9270542950868120082380674008791159538242222696005636916635750372888607203828","19388836984681019018462719709134421248793536992065958947499056787254258751682","17644385837318767408448645196495912141788591335975890639327420146901601072885","6455842021230030087723301679631006132297894313543816349547744163571857006938","12651647178446817886752319997848206955275956948340732199496215365053869535220","2038361690839579121638674254611449047008451768255542263231913955112979412052","14552505619309469592330707557293319610565413217299690813565239349254723939882","21809351305961289002997783583503461155560460938189863591461820286363980258154","19881244303935038444446962795728167560499810309912834473138514895445137175717","6434629727222395907353855634693221759145469065378967099211977918254204835433","11036466183244547002625933810655331358597012489081560653011525594219740881518","8696860013373675168559529464941134452066614743853560004905114221628099326183","6286610834190704195966860183541611347543876431770635371755207708407012119352","13785489482270739528894668899177561091226326813787695987264179185340645885448","8810497353129284320787428455370522511595657262006456870793996863971532676464","5950943845893271397160198360810800783099372758072046372020789345881371710825","5530915356962172707660737783638532094011201648224151382306028119770642279776","11091512250862371871604003187867080726528592592629078709401778342108977650047","15783644080397148510988340229704570796603281391084254749002543719002855287616","8763200105989369123326685776257599315907057694736599355967140415031996938110","16265670810206356417408073001772331032782360202117620221162260100178521648170","1060900582879546587300450314779603179547289174918628695451776494250751383469","14744516682282904590256322734403856848450648676567397632124016636373922693953","7963533020284370085512706609272793180113190314656815518091154379468342864360","21847103720496839760484939812661124697765074217247378137013246709106995512794","1653069435316409742759195996639155716495640457841657992745920070999323194315","1779277606640375903995595532406543892084224209567520378547237815999026067520","6995080044923736291442893376098805495068105284761180709673883412002971316831","10811321648124662138091377293526509914253637698173706332138689100382399963395","9601406465257748919110853775299124310985215012739412476110920449990474867354","18028141367193319054744440498619071967828221741281699864949191934036691507436","4607466430137542836150125749612147456128085309366797118935148996775246273855","15800640783457285335285505218287458944442721123666981076610926748598613636214","2112321293659869964303812620622373297871082794056351093537916002098854382120","14996631991733135844452595251336653836804943981827712201258451368176439511645","17520271953040754474711528844729345396665279637573303317828245745304573322797","15992472430004058554983936761614313471735664568983200231292353554082612221","13077407987480601704167238541689096961866209332906459397795676348552772889230","21534253000075971492923776155947583634689953016934976887823337792522221291547","819226293199784195154719767176522957736326171336737610132796013897711980028","17185725409385154522175797801720017361441550294043891637734656472407970636529","9575382583490973064980234314462577435416346301295239026337973844317720284455","21099851176254120774822574655588411581847669663738341957209759249291625898415","1966484535215911127324696991190082306993935247312211830919486710094847788468","1995818881696667008089141246304344453132036271634824321961354608938484533959","4667743157901207120637051668285562840191620616648732757926088699083644960980","13962937901967387497010877515712463400252815508150832310185443339350530772930","2629021746995755463136649506818480652912581474323117052162602164762321198516","20573270882617293078262572083653232250462469010594696343790004182829624161934","1913490321993231846954575139695345554332784169136285969356154414660735431290","13795292839631007915139444096743217376580091875142459105510805605582305270567","4058572558281095474323972096333621226798264350365788595026405775805372802770","17437029543151462415223319777679469646123927413521446735086712751233557753685","10258511040614960594008243736815460042536086782694789106787660436697233524699","1776622678963964166858973922665602162169906575558986124356721214967791324096","11475130909983164952012365599635166276537668089861700179995433713710298426958","2952755446410776844254499627216453159408235799061277085887851310752744265074","6624935776718778024845266788797012050011811870823913061539098756037591400653","19954266552453778490807092047530964172323837367905505645486543751921896349997","17616005977353868961299963148697997608390148348790301665790470529963563572688","900786527730568780236819563509871137970324714801299371788326143178262067587","6401534704731549429505440687499634640537230220192633410570095781266996282430","13802560372833568212943129492681934904640344932457172709836721179397658071966","20720041579842235677356944193781809019573930260321940911086044513868740779772"],["3543030996690731296144302074945644993940503512381940281158340485163553427782","14456582958634399729802605390122513015002601504508513170013909507149932778448","3126860645246915297044088167326588591680242124427769024481453610883810108674","20914220112711669635932871895638920862036110651562335932445860492773410166435","13898153337128326598294681972575411161373345548074764167063930702810085143283","11494816488079691563548948406211866308670367580609805045470273810278613528125","9265075386546133998992345241270235168672960377452999502776312567277548502287","20021949048926785450343828102540178861758398598932480397004304243016805279702","17919773090671305519402481279400246318283722142600928508878399512593964809604","9080338876332324361560940283287671152943529212088083669332838878892426421176","6966820873041565099335541093832581518388062131217364208125082807748337444442","4754959170441683519515036606259037626662671578099964081061043425010850133820","3217229650060400896792673270994784175046872440086333007152127029946297106503","21816481050785200027931285072395469615096302360347994694687269782499273734112","12807928427670068278917234235986720684636259679372568354055432889409054949297","13826913883258807838903404263173315859327388859817776690782622774806719577704","14715508594618229304924912287879458078786871554183488309385936868120900302162","4765885366156640574773808467306355912882165708339460440950145437341404320482","16722014012556015216650093088291583395944348552124898992216581531958560404280","7431786809665367144168808343099306354449102161270140701698145535166533004774","12514561575784459520302508925923482055587171874031496440739369331861774361144","13630926037601951290173737881839381432349720276436508871257961452732302249954","2416414043521570830938077478600484585162353864423849325238559208774076695812","3198391645352142061735535711335633217975113436438561010475922095171958777605","11503289488153380408852849064024910165225110948930885911379465054522594126035","17945548492985099414247885601087617115151464172983108926121249791371051519441","15206458584403956760846691261964236163202625304606621285728526159502456182565","18664803356744505916174195454562184678127127391413155379212300226736271965412","1932464282660454008791502282337362663506272754054933505791400845588414354525","7431131941001012844762212013511267729079957740244748755865134237672902463955","12260867654103631227135400757666859922137135589157019044994170609009605682612","3497692461171356958628408153056941313451942465631342687440123894946322982488","3611582236581069332046877419478476119433460345326857976137560691859450607136","16701563436812072022168694511067148429443045594144653838644405459857156283101","888833699088042159861509113185468788045755593715062347382548583028812466468","13027606106406728601332828518562058143615794059325398484231721019790789708383","16867560818956321945646006921505320613308271522776810400640826749438161909114","974286375063546693308153673073274687620807584704373288927095698770718355705","17164647015779775003667370039927920124381231953899936293739647389770842412636","13812735556582478046467982121127334513466404260587580530663067858201550350225","5555318749169933689829489127869820565736743958465695916577439219460828287201","15147736958519110413798327221058929792029254870817672304916259386717996218939","9093783603898735286753718269047404518944180735024302663202149030626421747264","19663528847623587912647904265815395529695410641548007238438947661221514322542","16050486874392688445392573281672864106952702475626854763551538209147588502217","13643154410219745091259394207881994403403664040943113504535042199360092675026","9994393341493081364074783836589113425357957616742680978059011711076524628096","6066727222812778846340829491283999369997291912496005263368499243410295288304","10275229946760815401870389679607490963497978883421730792100185293724085428674","21497546743120095993008732541489604895508606688714374565152084984414487943856","5410109209131659429652823371440397074564204322815773631417855000087652072422","4656718504694933743607748372708327104619579523407806362780445055109254730221","1535539668205688554612129122232712967981273484635206844376645263794510776905","6014624793218490271238764434773189318958730916196905789497853281972696671247","11664508187375558355195352743803150107793615135540732262825506318914225480618","6116179866134076212901873972162049629714787777774217125320617831147732712881","7156436421089505705028328573278072913507065296883146744244791316222380266201","12054467471426975647973340270599475277601084936967912793090659824480359129081","17043004725271027910538237148402068222835120116965638237871055913672994258597","16220455773823909794014715905765711732985616219607584706690711330413977988212","15859369801752308916251957941263160908672747781155852511743194995283478080957","479331876385459584849230762033048956240784621757125043523833547932336732021","17371898586803558805199285151576387708548132346602797103748639637481352576986","1669923098731048999410343513821846398616602374717981505074961546289337325891","5901847159215544530876581081126932589094431032258157198770582781864841878766","18964305080922802950293327616531540488576734432289534207487783803133028591534","21391565661610588080023857012644286006317523285224244461722350412865334901788","13859979526703965599946512832991648449058108364323767375822622250546827051763","14178842945330354151475041451258011251506932092165564803585149961516102229203","9732424347816228834779162921453357383035314691484039491038526173776392679930","2916484128690250908814196431868649363158004790333481812642864057335419267559","7496978836980754621750472326738269854937130487021159668865319635184235054270","15732272029544135687655369960610276709515477689734952583097488077854605780691","7867892378505499328367956370534010327619068595759860677931756173774607866661","2645389195137857175751801166613941761522924817957359363234922821861168369453","5428648673026825822348517069964588690890711938310863981949251926666891252998","5673097051473314160057127163079470500502486665904121175631085109229208920764","12213227243584803853178095425113463791275833583767127368163587230364245722339","18715899303501270934030638370927875241328470260353347061222955717933916891297","7978266080893459514342371863321441749862125749732741901595103595919695778835","11533864861650024617087550487008450420153395602349453386165533302160941562372","18450601439501348601530433257154147113861051704608419841682905432642513197835","9138792247850488245323412019837764753108822692897704202690513828206269873276","8780651517909025350948438820147097471614889914797642770395848326995230079810","16579891454742806064187509751513819282821430255175477305656819644332932757991","20749300053175474642021908869135322928369734326957417903553033361402813233282","14678025512968401250174091062539364192699965591711957564050835184613969981470","14500401299150087749352814234198057059984606531881272078945247743949487640486","5724620856479473091459642481591597298179650010639060800177645976144733457925","19112197370309313151147636092745145521877228675251700148292900136536916932170","13357726589469288818869234910529301323312513752019046957819344054565360588780","13374527560449258023689134260026613122339366365792290373325534211336697566956","4598648858165437260062263715423329175562992143452805065351481409276538133334","11350678282945894657287678422643168089297300739501707849993226500027831816754","3542838338928314843109276018513499150692851830271985332322006221768875867536","6915887598932201892744110121624584826388348577566708154030055143862948900209","3341372370459299156322218222512239866891612731698279185818379265788352168797","5465946929360194216023533683821008640072612018293683841488258245599905867230","12877035916601231664263696261369822574055329194451355438105731392920430333083","7152734772764736233496355792907418897029921786094807846499854978916041968421","3637783930300588858775792406146355117532464453208333425534311131944943620570","10014356913431431526174931647710822588072509765911348937997695830388503275168","1363032458635298325605180167581231122362341661979419469148204786413525015450","14749299418008156951304417344478297351805724111421271311859650072310778072387","17861121930186335338650720704614114161379448007421588691026444381264236189922","13982875176693656046913549248129840458651715264391216676392378240291122094805","17013986540180225001522806840753604869987807622757849834876725452904460718718","2388488441230564305487777723403725189663618052806260479803532470400273033483","13894658705595595767938737767669216953233363697170846839350285544511007008320","14405479371656690634733468702992982854989857716365066876824883028890686397274","5463406390085573883494999080478626961053571243436142083968477629350392248406","21534264698621976459797752593999005975042601484874798974898661774235315370253","21799224364206948450546005628308365004329457058279954233217003747009751813980"],["4674163295886668713721676554153485700383365415679648095685497378991889125957","20352935218386204728405947862710237635292695166913064017138871016474654829503","2592327317691286673995570769733690864734110983311652649344857955817901667605","16569965928578428536982359762305442141555631314673045263042967399169881481663","19131088716759828804870846683575351419567519624591961034686838811980854480317","9445249257154711404997904018575649485936923216724833070474435497562129184354","10263849450559453197266643809044161235269801564997177723771131710603406794657","3056222600207721353960552490330912452663290310028010792283928265227487578173","21790657388633280199755703552074152351760568814499175261713202273123354393653","15632854714111805599199016548148074406028161048345800202040891852724322865404","21055196030884358213128268053901624878656900226499964686210806947320487929084","20870802314656988415071187255580018825359148840256346431540367835816283233663","15616534517743330594960982114818869275309504871292088154595951649532209497803","5784776489399338538186111556208328817680916221272560662302058618935625424664","11524199340075899550845010989583353304937552835400935278913693430093835145958","6111955760150452509644281780032815573756917600365327410927439475076299492518","21618401442204665104986329854020260011488532608326424508093871089299201575674","9730498374695391045394700114591114475449040690008311140197590770638012506878","12450960556188662662174828467496697802873664968238345232698790724056489477852","19541588514194638760835578386391719199522674962225668709200961614811726952776","19932293326229311363288454122969308710212293893428838866879338848665668402397","604198849257174504677551552215661304343812986564057281411653401089383990287","4837206815765999838881694117090048237839208060322594233335602777738216787530","18830045323524997434973757449753199597597645181672539201484808179922595941767","597272048657162684432562166735615322949355566201513589220267457713801638231","1259257565303313693691585589383644773076852691198301937638112297241050998906","4299692760889064110427645653486657433003877634188292107545657115443318790741","18761514049733775183377076664698188376895721558935093039415023511830645880571","6365188664980535830887561182548117129128384651566127038255166094869781288138","10908245784622543297925944831880222108262707146660606570412640969461860215559","2993018118327211849601365308091689105225779815146751382435760912693815943525","17866549521241267273147593454540911294575012954137157106386791620196686306843","7588028284719211287685446874927984833830446870565937360743716093239510828705","2090750922500787060241285930607243134795297756000749701326291975063085030442","9457072070171052855412092923825503562704627349932867548368158306053472163269","21350677681867862863958401218481076613811347308327323704598795557647506601048","20770451808866000075425992751709612657492582152945338552610276408968142282748","2745159125861577162208805239818265210821612624943688815260513025855030451876","4978242409993988630548589666160972377966237165841561311622261456963266093585","8957122665158680185632585169710175898594503225351167444908975902379752039529","19785721977895675912077792966249940018620743361119818565517998582038530845572","11861870201391731884519245957624651537058767900307989639229586431063741762358","17255005338003805991070153748300808006158858491831332904540491356269058934807","20968613871554279013641220706303052278063770382104154194145614761598803229320","17088772914095596168232405755085581150280602134464528873794740219829997655905","17762875723381349883234521669486732244273741572046761163213388126273123976716","15757253055041927933508930441807290266967740722748969628910267606081057123247","9296526004150722607881458789952527402293389026976957647013649334875654666846","3258056648875256712165532481568505756954239103970575560653877933695716301019","10077274438511253450890613064192766199813655931242373841397350705759494726833","2485034538638996467225599076052442891342629898657527900536984935467064278829","20576592492040545165717975426556128169364393232969413514916564746364553078536","4404702101406694105795814505550144493036964326057335262710910677583726782302","4390438145706544373827946112868446908872103380251483996161316711096059314249","9320005299875600545246395152752248247569867819827474604280747799854851456406","15328920202400920589852925898624698939637026854484346389158880426029840472715","8486599295438187080584450525760735526614520025443333533944573774263533673664"],["9752260370971488270527045586368300736990068930727356612443733058936980331181","17861152003533815607258975980932083069070125130602569693881058150421024162425","5478494136231859826920266196710092163036570975555566533890278380032436251008","10470663114025860164205954011633511602249334550961664618144343510421485102643","8584166711424171940897653413099916249371028337527773813210106792825433993045","480687478798944972518402568634409857315487979030618520260560257514160422118","19050370281780858565019483243537472514353065987940901395981643695477442070526","7909886408711298712459179052698439249376302724729633721254586660282875932937","3422546743310933069772687665765317843579486790338039447423961278453066592006","13742327444822703543525245712246928813767223841816014893394911139318645136377","19985290653818527520481099040857204751957970313061971657480471856178364435734","5113623454243607312202962083851358306245672221703960790609797677771133546193","14116233721356660472284501740073810322785672551591291061323721256009346455878","4926155427866587734566793124447479446126808496458547974505225385766449054331","18737837843661096774737022603512579127563955418171470936320273353744942252119","10488727327274145721487028816083558148874702222936756843781953611817021479453","7430416809625816246215887987474320468895157902878142604273583498117862871629","15362958033781690751249945980799034135612747452438262501485459571192039957761","7971998013662637796977575957753688748657729947937463070177130208011037377134","6181181645748233273792885809633370176374365207286274393529265842466407115861","5314629852576387633630556100168250725317801821478381622914586992960199366","4515888460995791866096611222708075397170126060611423125117883548580281554338","74545133806554228861741049751398547087539129543232065265760967657668834985","7620596223797793424148158028949488299269254840309986200826069272117699745990","6891523215930979790200291579163513136440547056829176430750166726452304949371","16099728065410135581098672343255205185915801569430121937096121254451019507098","6557913779080084600620474619010501057622990909691220199506246579366751973182","629939504373643127852968084066404538738439068647901008271397818529825932208","5796770995540012470043939162278308205112680750304267555647836542430331213784"],["4703464382863044657879311175544785995557811809566957314411289057472490527020","3843782899730931149066837823855957195082814690023486343961650216093340265958","19753920348283277126115182030019993058097502466641468039307766133748654311731","6387046033771728790683513731756820363186884656538206941762539587100790793303","6083333704170189791347928946890269084686281072760260996461982250183813813455","3601362179840050473869565367769437889028980382089846018464370888724390080742","15027638961056161803405095516489512786991681560756640705495942526018791294016","19710873932029592796622363789856158433724106192219625427302644279655507023367","15638024414045421488677288694998914769438007035716986615640454221215106257457","15226555011982219477858209163809404309053286511808301742968320176656943221415","5370110265920942801753988420413217249900497386077178581974767910364898916037","16446764745477539410117561326613320146727869338745239407663387010432667098744","6928924323713233714997990198973637030825419323916177069979007639608046912970","19348991226118506958152269076463657327287453752172685562174237622786490116354","21178915382594959890862250421664826278642329218140824648593071449397586077827"],["18812969291333960246714927634541285791301021530654461980802056598587931445724","4704875114419935020350178682811140808616028527479657778061958964369984912380","15617352465980977810710937287156471405834630169023818314675251313292328425896","16144221017969671721449460332127347762820423413386277478456163956038616567891","3380797458259597109673995325806610244842743962089650531774414197031119011667","10808087229606934664635917926735817482378681653152030112405462220077698611677","1126944913887516904289476884314188784817875835019645183711270186623300417204","20609978924050961475538640091972585785684055653239864923325305755133104228398"],["3181021621803672270534191685279668265378151263688297096626662902385759927090","5364058324337084345210724157442488646258495950496398875849562278111691871665","10224931444631296256306111997023259115908040230658265780895445976301767844798","20055030782188110989536830175323576726230381937229123278716473657223724370336"],["18616110284164381247048792467749872996052606923771839554448275315790271733321","17002469466029637665184131373008982287414758016642465974888037480292593544214"],["11346070196295785031787810283571557481180538196916691520680083623303153751974"],["3034324305272075327174876945100357924965739483119222533766727614603826015314"],["18143860073808067122797584013450218026827477676919083077141968823765109364047"]] \ No newline at end of file diff --git a/common/scripts/certificates/concatCertificates.ts b/common/scripts/certificates/concatCertificates.ts new file mode 100644 index 00000000..e963113b --- /dev/null +++ b/common/scripts/certificates/concatCertificates.ts @@ -0,0 +1,47 @@ +import * as fs from 'fs'; +import * as path from 'path'; + +const srcDir = path.join(__dirname, '..', '..', 'src', 'mock_certificates'); +const outputFile = path.join(__dirname, '..', '..', 'src', 'constants', 'mockCertificates.ts'); + +const algorithms = [ + 'sha1_rsa_2048', + 'sha1_rsa_4096', + 'sha256_rsa_2048', + 'sha256_rsa_4096', + 'sha256_rsapss_2048', + 'sha256_rsapss_4096', +]; + +function readFile(dir: string, filename: string): string | null { + const filePath = path.join(dir, filename); + if (fs.existsSync(filePath)) { + return fs.readFileSync(filePath, 'utf-8').trim(); + } + return null; +} + +let output = ''; + +algorithms.forEach((algo) => { + const algoDir = path.join(srcDir, algo); + + const cscaCert = readFile(algoDir, 'mock_csca.crt') || readFile(algoDir, 'mock_csca.pem'); + const dscCert = readFile(algoDir, 'mock_dsc.crt') || readFile(algoDir, 'mock_dsc.pem'); + const dscKey = readFile(algoDir, 'mock_dsc.key'); + + if (cscaCert) { + output += `export const mock_csca_${algo} = \`${cscaCert}\`\n\n`; + } + + if (dscCert) { + output += `export const mock_dsc_${algo} = \`${dscCert}\`\n\n`; + } + + if (dscKey) { + output += `export const mock_dsc_key_${algo} = \`${dscKey}\`\n\n`; + } +}); + +fs.writeFileSync(outputFile, output); +console.log(`Certificates and keys have been written to ${outputFile}`); \ No newline at end of file diff --git a/common/scripts/certificates/gen_certificates.sh b/common/scripts/certificates/gen_certificates.sh new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/common/scripts/certificates/gen_certificates.sh @@ -0,0 +1 @@ + diff --git a/circuits/scripts/genMockPassportData/README.md b/common/scripts/passportData/README.md similarity index 100% rename from circuits/scripts/genMockPassportData/README.md rename to common/scripts/passportData/README.md diff --git a/common/scripts/passportData/passportData.json b/common/scripts/passportData/passportData.json new file mode 100644 index 00000000..0ebd3b53 --- /dev/null +++ b/common/scripts/passportData/passportData.json @@ -0,0 +1,629 @@ +{ + "mrz": "P byte < 128 ? byte : byte - 256); return { diff --git a/circuits/scripts/genMockPassportData/rsassaPss_65537_full_form.ts b/common/scripts/passportData/sha256_rsapss_65537_full_form.ts similarity index 97% rename from circuits/scripts/genMockPassportData/rsassaPss_65537_full_form.ts rename to common/scripts/passportData/sha256_rsapss_65537_full_form.ts index 933b9a8d..b622f1e3 100644 --- a/circuits/scripts/genMockPassportData/rsassaPss_65537_full_form.ts +++ b/common/scripts/passportData/sha256_rsapss_65537_full_form.ts @@ -3,8 +3,8 @@ // It is currently broken so the line that errors is commented import assert from "assert"; -import { PassportData } from "../../../common/src/utils/types"; -import { hash, assembleEContent, formatAndConcatenateDataHashes, formatMrz, arraysAreEqual, findSubarrayIndex } from "../../../common/src/utils/utils"; +import { PassportData } from "../../src/utils/types"; +import { hash, assembleEContent, formatAndConcatenateDataHashes, formatMrz, arraysAreEqual, findSubarrayIndex } from "../../src/utils/utils"; import * as forge from 'node-forge'; import crypto from 'crypto'; import { writeFileSync } from "fs"; @@ -62,7 +62,7 @@ export function genMockPassportData_sha256WithRSASSAPSS_65537(): PassportData { const keylen = 2048; const hash_algorithm = 'sha256'; const emBits = keylen - 1; - const emLen = Math.ceil(emBits/8); + const emLen = Math.ceil(emBits / 8); const hLen = 32; console.log('my_message:', my_message); diff --git a/circuits/scripts/genMockPassportData/SHA384withECDSA.ts b/common/scripts/passportData/sha384_ecdsa.ts similarity index 96% rename from circuits/scripts/genMockPassportData/SHA384withECDSA.ts rename to common/scripts/passportData/sha384_ecdsa.ts index 65be1208..403dfcd6 100644 --- a/circuits/scripts/genMockPassportData/SHA384withECDSA.ts +++ b/common/scripts/passportData/sha384_ecdsa.ts @@ -1,6 +1,6 @@ import assert from "assert"; -import { PassportData } from "../../../common/src/utils/types"; -import { hash, assembleEContent, formatAndConcatenateDataHashes, formatMrz, arraysAreEqual, findSubarrayIndex } from "../../../common/src/utils/utils"; +import { PassportData } from "../../src/utils/types"; +import { hash, assembleEContent, formatAndConcatenateDataHashes, formatMrz, arraysAreEqual, findSubarrayIndex } from "../../src/utils/utils"; import * as forge from 'node-forge'; import { writeFileSync } from "fs"; import elliptic from 'elliptic'; @@ -45,19 +45,19 @@ export function genMockPassportData_SHA384withECDSA(): PassportData { 33 ); const eContent = assembleEContent(hash(signatureAlgorithm, concatenatedDataHashes)); - + const ec = new elliptic.ec('p384'); const keyPair = ec.genKeyPair(); const pubKey = keyPair.getPublic(); - + const md = forge.md.sha384.create(); md.update(forge.util.binary.raw.encode(new Uint8Array(eContent))); const signature = keyPair.sign(md.digest().toHex(), 'hex'); const signatureBytes = Array.from(Buffer.from(signature.toDER(), 'hex')); - + const Qx = pubKey.getX().toString(16); const Qy = pubKey.getY().toString(16); - + return { mrz: sampleMRZ, signatureAlgorithm: signatureAlgorithm, diff --git a/common/src/constants/mockCertificates.ts b/common/src/constants/mockCertificates.ts index 9dc0eb05..fafdc0bb 100644 --- a/common/src/constants/mockCertificates.ts +++ b/common/src/constants/mockCertificates.ts @@ -1,31 +1,201 @@ -export const mock_dsc_sha256_rsa_4096 = `-----BEGIN CERTIFICATE----- -MIIEkDCCAnigAwIBAgIUVWuy5jJJ5sj+QZfD5gWs3rESlFswDQYJKoZIhvcNAQEL -BQAwYzELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCU1vY2tTdGF0ZTERMA8GA1UEBwwI -TW9ja0NpdHkxGTAXBgNVBAoMEE1vY2tPcmdhbml6YXRpb24xEjAQBgNVBAMMCW1v -Y2tfY3NjYTAeFw0yNDA2MTgxOTA4NTRaFw0yNTA2MTgxOTA4NTRaMF0xCzAJBgNV -BAYTAlhYMRIwEAYDVQQIDAlNb2NrU3RhdGUxETAPBgNVBAcMCE1vY2tDaXR5MRkw -FwYDVQQKDBBNb2NrT3JnYW5pemF0aW9uMQwwCgYDVQQDDANkc2MwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDbmfvDt6mQHKcWF2mkPjF1BPS0Tggh6Gdt -/A6DCsxrb60ktxMlFm1EOkMwwf7GO2vJ/VThYqHKP+1jf8l327PNSawsZrM86dai -d8yMpim+5YMtWQfCrSzpdszusD3SSPpkUzRnYSUa5M1nywktnosYCFBQmFoS47Ya -0j6xnPp0tXEldGXqUMUF4RJRxF17u46yy4UIEk2KfJQP3aHfKaB6PRkseRw9g5Pu -RPDYTdz9KKpLeTC8YCibwKULn5oAmyz38Li099FrofAD5fbg+3b18v5l4k95bIIq -DmpeyA1Pzgr+XsdzCjL0vYMmE0xaZ4b/HWiL2Ogoy1NBH4JGmPovAgMBAAGjQjBA -MB0GA1UdDgQWBBQvTV8qsxZT6yjcGTfPp/G1g+eQkDAfBgNVHSMEGDAWgBRUaGBM -XQcIm9LEq0TQG9W1A0y3RzANBgkqhkiG9w0BAQsFAAOCAgEADYR3J1O45bTBx73a -o45qJJQAJhHAe3VhajphGPm3hpBeM2VewEZU0NIMon0Ov1dHvYudFniYiFdZMefe -CuqE9Deb39egDO1lCd2dGjybRbhg4Zr8vLqRwsG3bjdYGl6PXwyg0OsB0QbdKpm4 -tVRT970BF2LefC5vdlQpeCuLas7gkxL469+LJicXotYlO3Le+CknMYEdALjvEapc -1u7jlJFlD2xx3l8+Exkon3EzgRokp3fu9ztU4Y2j3KGdieSDJ4rYfPoyDR7HCcEd -HDYCsjBAYi6Zrjz5M0Nm99/O+4vCma7MnGkBtA63ABTDjjxIv6eeu5JxhrI8PXwE -VQ9CAmM6Wh52QebRMx1adxUqTe/rwCAwuA4v1jXSlb1BTfL+7ra1k7PYYczmnskc -jVscaxnKBVq12Pg1D03LkeMPQiqWTQ7pOPz1AKQ3TIlhsuf/jXner4cYQbeIpGwf -WatGH8+eROdlpTfF/xaAUbCJ2UYjRUupGkrpU5KkS9FxrJSVS44PO3xuJwQJN1fC -x2clYiqOEhyESrTp6c5XAGK78S0dwBP2R9o7GqY5xNI+kXBJakqyVpwIPRDq4HVo -y9QRS1jM1G/2Y1XAE9pMdMjdhfYCCp/lO48swOQDty137gzfffo0Bn0039VKzhgi -nUCb8Z7CclWppvFAVjnJruJbGp4= ------END CERTIFICATE----- -` +export const mock_csca_sha1_rsa_2048 = `-----BEGIN CERTIFICATE----- +MIIC1zCCAb+gAwIBAgIUZipRXztCv63+iMkCt+ivpxwkAOAwDQYJKoZIhvcNAQEF +BQAwFDESMBAGA1UEAwwJTW9jayBDU0NBMB4XDTI0MDcxMjE3NDIxNVoXDTM0MDcx +MDE3NDIxNVowFDESMBAGA1UEAwwJTW9jayBDU0NBMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAvFuQiNhHOcXS8LMz8Tp76BIo6+ZZtythhcDaEVsroBWG +K63OqD89PTgg4d90To6TcMGXZXJZe+JifWsB5Fo+sUfwdOoWQ3hNKfWadKrkZs4x +dh/V05hJ4VAuaj9e2m937GQEsK9obG9MQnYZSlcODCYtIynM/IVmNr27I+s5fspP +0mZM+8X3mgjpQSwUob5zMkl8ZzskJau2oY6ImhI6fLNxAisS3wu/akpEVtKI3K8i +we99oPDO6xuHeuOQh0L6DbBdpYpF7jPOkah8zBQNfuENaCcjTxI2twrSN0YLuIsQ +fiEKbUq8DO5aRng9sws1DTNlf9AyvSPYfkizNtNHWwIDAQABoyEwHzAdBgNVHQ4E +FgQU16zJPs8xurwLQAoHiDOuUr+OmnQwDQYJKoZIhvcNAQEFBQADggEBAA6sMfoQ +1y42gg4/XNh6SOxHhT2z3u0lHq5+BxVORx5QcIi3rh1sgTocRBkl+4tzXFxDOzGt +RpVEOnM4VqbxgvuTLYPbZ3jnoS9S62w2if7xaOWexLO+3hsOtMIUrBfrfBax03/S +Tg9gkA98zvV1jbokPL23UXRWufv7L44HIFr3bLeikdOmpf6Lvp1ORiUXjbMi9o+c +ty+gWrxsV+825W3LGD/71DFSD4yS8wK9M9KLZb/21bt6tq4D/E3njnYbXID+1dTL +WC/4nCtzhd5n6cq1wKl6VnZ6bcyYb8MSQ6Kd6vbew1UnRae8KmFsjr2tJ50ESTj4 +jQwzIZELkOP+EAE= +-----END CERTIFICATE-----` + +export const mock_dsc_sha1_rsa_2048 = `-----BEGIN CERTIFICATE----- +MIIC9zCCAd+gAwIBAgIUTwHaCSG0zF1Qc7zH9crP0SpqSIMwDQYJKoZIhvcNAQEF +BQAwFDESMBAGA1UEAwwJTW9jayBDU0NBMB4XDTI0MDcxMjE3NDIyM1oXDTI5MDcx +MTE3NDIyM1owEzERMA8GA1UEAwwITW9jayBEU0MwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQDNAbRAvBrCOUcQpP7wrJ5faC7qxNq14sBfP6K2G7Tpj4Bg +eTkCgMAcOl4Ue1M+zhtYRo3pTnidLOvcy07lX1QMV1jwo/RLZYCVQoyqW/Lqm8Kv +VXOOJrAzkdowcyOaOLxFyWIoaWj9ZSuPuzVntWA5n7u5MT1mYVO1sq27pXpp1Cwg +DYifSLIcn3uKXGPy1CxlxUj/B3/3T0IrOEQkXqXJe7BMg1ijbjbJYoPK2Zoc10vP +bgdOXY/MwE6YxhpVo8Lzzq9E31kIq7Ovjrb6xT+kktSbXINX/3Htu8ELe6OuxAw+ +27CwaS/aCK/MJnHtRFzLyKvhsBf6BEq6ZgUSUfTVAgMBAAGjQjBAMB0GA1UdDgQW +BBQ5+4AMcFOfsD0ucPu3LnUceyEJhjAfBgNVHSMEGDAWgBTXrMk+zzG6vAtACgeI +M65Sv46adDANBgkqhkiG9w0BAQUFAAOCAQEAMh6doVDMhOZObgKi9bgJibZuOks7 +fYWu1Zi4zOc2e5Q593Yq/+NSPB65qRixOaFSS/G1ZO6VxAu0n6redn7Ia0NLpohd +ZOL+iNt1vNugU2Ur8FbdpbaMrNDkabWSnOiXVKJ6exXYTvdghaF3P4LkZoiutMXz +/VJ+tmeWZzhVhTQnrN0FBxvh0wfdbbdbosVaJsyB0xTD6C3aBlUTVtxdLdf3B2CA +N0/RDh6kwOOv9mcyF9u/z/YxiZB23csSJyLMmUl9WV2xPCgSZi3A1sZqOU5IIqO3 +U4o97Nxcwj51Bm6x5Km/6/CbnXXRo+x+nHgAgYwMn42r4BrLFoDLUn9YRw== +-----END CERTIFICATE-----` + +export const mock_dsc_key_sha1_rsa_2048 = `-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDNAbRAvBrCOUcQ +pP7wrJ5faC7qxNq14sBfP6K2G7Tpj4BgeTkCgMAcOl4Ue1M+zhtYRo3pTnidLOvc +y07lX1QMV1jwo/RLZYCVQoyqW/Lqm8KvVXOOJrAzkdowcyOaOLxFyWIoaWj9ZSuP +uzVntWA5n7u5MT1mYVO1sq27pXpp1CwgDYifSLIcn3uKXGPy1CxlxUj/B3/3T0Ir +OEQkXqXJe7BMg1ijbjbJYoPK2Zoc10vPbgdOXY/MwE6YxhpVo8Lzzq9E31kIq7Ov +jrb6xT+kktSbXINX/3Htu8ELe6OuxAw+27CwaS/aCK/MJnHtRFzLyKvhsBf6BEq6 +ZgUSUfTVAgMBAAECggEAGlxMvEIzwqOw0qAUtAfOOYBhAAkeAmNMzzKUjowTgDDW +lhEgVoUNrtOGg2W0N5AzDe/MkaJoefVrwrFVzMKsQQX+RrseT4+WsBqlkcZO/wHW +T8tSF4Y8A/WOM8qqWktPUj3p5D5hpKucpVeyL0qwO9ihP9foCEEdjXCTTFyj1/WY +O7IdsKNDY+srTK73xWIEnyH+ffEKIaSu9wrntYASudllLO/PrxpxJ4M+/4/I5Cep +PzklQhEdv/5ler0uzHGc/RtVfibjpdEDVgsere9Nq+cXf0k4JrZZ8ySy3WHgAPWG +zWj3sduFW37Dsb/XvzuQ7oRg4v6lofaJSlaLxA2ExQKBgQD3eE75vjVQdTkKpFMQ +c//0nLRne09VbOqPHhpkyZC9FJJ+UkIRvlNbkBtHhhNTj/u6FnkaJGS3RONeDe0o +Q0fe16zY38q70HlulNo6h069ckhWrIA8qbrKntqxc2bVL5LDUoA/VmY5nk76L5Tu +7b22+ipcdij2ibU+r10T5X5/0wKBgQDUErJVj/dm52QI039VPyl1wMjGDeUvWZxs +8iT9FT58Kp/E/+fiZ8JbFqJyWSpEm5rZyK5P40USN1r/B2EdxHSyete52sko8Huh +Jku4DVStyIzq63d3gEpIqfb2rmMUlc707bNqdgOX4IZ8RYxFgnp2AB5X8e/LyHZR +nSFdADD3twKBgHw8PMGqGM/UmZdbGYxH//ZIeVT+FbzYGgVRYoS4oF4cJtMd7qdD +uktcVCWbDLbFsOUiBRf3r0xGXDLKoQW2iS05bz/NUdTp+xxlxAzgAsqexewlW5eY +yfqQt0+glL5vzKkcEOA7OsSwUgvNuWIdnkFu47dZZoUmawQWO48ShmgbAoGBAKlz +3wc7J8YTsfzTcfUdqPUr+8E1LSGuiq0Ktr96kBkKverdR93CZqv95ANWd82mQA8w +qQewY2pwzMbmkJUGevB585HP3dhWf5J+VRZVoInTq7WyPB1CZxi0pl7pbMXwBhPz +Mt8oOSrL/umhcLnBzjQnWBeRe7frD4+a7COxmW71AoGBAO0yhYXOeHpGTnHzDzTs +qu3rNhvQKy/8f25wvqn/xR5NfbcQv/Z63PgmDoq9VLrmeektwY4zTE9wO+n7WPQU +D2BiW2DQjX4OJsOPNs63+wCE71xj08ZxipFuxFWhbjtO/A82h6QMXYwfj9do1WGD +oouEG7wJwn8++cuiivyeTWf1 +-----END PRIVATE KEY-----` + +export const mock_csca_sha1_rsa_4096 = `-----BEGIN CERTIFICATE----- +MIIFCTCCAvGgAwIBAgIUPfIaBL/H++x5cwbWjRnVae1VV3owDQYJKoZIhvcNAQEF +BQAwFDESMBAGA1UEAwwJbW9ja19jc2NhMB4XDTI0MDYyNzA4NDgyN1oXDTI1MDYy +NzA4NDgyN1owFDESMBAGA1UEAwwJbW9ja19jc2NhMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEAt/py0nO8yiepfYAslsLv5zF9/YXSsrdQ9qdhb4rL0GAO +eM/vp6yBCp8ie/qP8/y8xidtjCZmyRTa+QWxCpwW+5s+QA36hJvDW0b7v0t1diA1 +LJNwr1SwmmAxteZ81ZPA/D+3uwgRbBcolwQNzqT0s0gLQn8uwpLNsJro/Da3APkl +Ovuz76uc7LIojeWBQUHcUXO/jAcKnV0GBhmo6W+RlNUMGpcO1n6m3qAR6psekyJ9 +WrsDZVUAFH7uZTI5HY5bJxu0UexHpXnNHkgjWdws9Drk6MF7UDGR5TegnvaWgII8 ++pgwx8kweRMarNm8rM0uIIM/6woWo8rggz8ivHOHwH0unzd4MEeSx7huILZcW2Td +wv5TD2RUxtU4AbrFgAlnKkfq18MIlQCU8Yx+dWRvyUGPJ2BhziS1tlC3Ei6AMrSw +nqxpZz8EhaYDU6tx1jw/SnjbXHgsdQpnD7epuwSUOG91Yqq8fRS2C1imkMrgu1a5 +KQ3w9azXWVONQ1wdl16fV9Z9qd0zWUmeOwLapwu7RVO0t3ashzM33eDrmXkl0Z5a +Oh3yPM2KC45iYP/5kEjdqbhXFnThEHcdR8Zu2a7svKRQFefqbq6mRuuPYNBN+hnK +d0jUbwpjdl+FAPney5ev7nAqk6OoP/8645Uqo41UMWRGOwZQcNmEJ0L8/WFqTVUC +AwEAAaNTMFEwHQYDVR0OBBYEFNI6y5wUKPRc1FiuuzeWOpWCf3fDMB8GA1UdIwQY +MBaAFNI6y5wUKPRc1FiuuzeWOpWCf3fDMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQEFBQADggIBAGFjqs5dSQkjCHEOkd1lbXeQvG2MMLhwMS29jOyu2pk97IS2 +ah2cZepC3ww48STjQ+uXYZI5Ob2vKUs0KbvQm1ZkrfF41TSkyBG/13aZLiPsPMcb +7Eu9L+xN5vjO2gUEifjuu5oU1FQIZqVGaO7mttgLDSWwj+mVp+nk1u1rnf8ttFDJ +EVVIppJ7k/uoM/5V+cV2a9vbCqd1a0nxGN8JAppHS0Mc2NX3nN6rpmdaTTcPmidm +0JPAJPsyNi1KtLDiR1N2WKakXTjmF97oyxM2uIkVJSGDUYmzRW5Qg5eTy3Adbzpk +9ErTcrQvKw5znDeDntaupx6f/0Izzbsla9J16c4ATNPsdU6DRysv+HTmHQmlirH/ +tPqB4TaD+joV6LdxyGcMv/FOkgeyllxKUzdFoh8QyJZAPxOiJJhYud8/cNBhCGWg +uMGxRcwP+pPD0lApldU1uEq317cE1gtnZVjNRiZRuVTzaOA0PH98ExjZrmNgbf5o +iIUrC81FHCcvGJmzJdHosAOLRkFZMZS+7ZQ6+dTE4sQwrmSdSVWxNQTRMDjlHgXR +Nqlr+Uj3X+gds1fa0UO6QvCQUmEnRZxXv57HPKobdPJxGtHBUS+2s/3CdFy0KSHB +DeNeFcCggkhoeQqG9D3EXjGz4gre+XjGaH1wPVW0oQoV5BvKsBsMBz2oaZEX +-----END CERTIFICATE-----` + +export const mock_dsc_sha1_rsa_4096 = `-----BEGIN CERTIFICATE----- +MIID9zCCAd+gAwIBAgIUOUB6xleW+ZGTlubYVAXbnjcaBWkwDQYJKoZIhvcNAQEF +BQAwFDESMBAGA1UEAwwJbW9ja19jc2NhMB4XDTI0MDYyNzA4NDgzMVoXDTI1MDYy +NzA4NDgzMVowEzERMA8GA1UEAwwIbW9ja19kc2MwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCyFWWOPc09c5/tOYYR78hx6VPGFYoap/3g3WTrPInzQyNC +KccAjM9Rwl8oXUzu+ZleKlgX4Z5Q7S3XcTdO5dhuQ5Fd0AKK3dF3HskFe+jkexYP +ISdVMvKHJI8r7d9GicFkrGi2robKWTCdwcaRuGnqJrTS+TuNdAAcHpB7egUm2QEO +dDJVQB8l5Z8kLen8bUteTFoK5eB2Bp8O3TPjX2jS8p79Ii6xJR4D6eUWrkH1rcbe +AIZAVRKLvKWFE4D08OyCp/rQJo/JjNxhknRbsNoSzFpTkXcNsma8VMDrYaLne0eZ +NN7ya2m2e2Fl+ShgMB6KDDDy6K72l0pCrNMph23DAgMBAAGjQjBAMB0GA1UdDgQW +BBQJ+GbaGRiD0cFB9hbhgEkCS77bCDAfBgNVHSMEGDAWgBTSOsucFCj0XNRYrrs3 +ljqVgn93wzANBgkqhkiG9w0BAQUFAAOCAgEAipAXJXh2zCrUSRccb6ZspCAQWIYX +3UZ3tIBV7htcSHxlsiPYR5Z89Rj0iS2iMzqYcWJbRAOLG9B2oJPnEvcf2oggZoGf +hxD0NS1lmDbVDkjWsxcED5y4AYd5r0CiM2/JRxqn9+jiWUrJpyCs2idoMzo6wID1 ++bTn+/h0Fnyru2aEaTA19ZbD58alkSSQ6ow00W20Kl6ZVVmAggPR3KLXs9vtwq3U +v1MCQQhbUeB76Ju+69K77+yxeTMTpevWSgeOmmc3T+NkKoLi0EcJ/4aTGhdiEcZF +bjgyc2vO2LsBPzNiXpcb/cNm+BOx8STD03xqtQA3sL8Ipgpx9bdOvj+uZtirM6Bm +1VR6W4WaYD0rh6pRgeQCs3Sudd4ZI+ErfP+hhC/CmLk+a+jHuxkMMtZeX+NOQuvc +nOjVlbxXDSOlBK3D6RuVswHGWmq9NDumopGg2WWuizq+BphQQWC0rKdF21um9OaC +hi2vmJ/bxS/Ka3mTbaM/3N3T1pLJnSn3vX4IrRH+wb6iQXzGu0Kc7zdYhWBJsv1e +vK/Cc6gkv9LGCBE4m3qfuK0FTuTUTjq2cZgJObDii3oK36Is9MdOPlGhWU1mamlI +wneTF59va2XHfVHmfEv9nPCDBD7YIOxYiQADJ+CJlbq/oe/l0vXvNq+5ikbUus2E +VeMUAwXpTAUekrk= +-----END CERTIFICATE-----` + +export const mock_dsc_key_sha1_rsa_4096 = `-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyFWWOPc09c5/t +OYYR78hx6VPGFYoap/3g3WTrPInzQyNCKccAjM9Rwl8oXUzu+ZleKlgX4Z5Q7S3X +cTdO5dhuQ5Fd0AKK3dF3HskFe+jkexYPISdVMvKHJI8r7d9GicFkrGi2robKWTCd +wcaRuGnqJrTS+TuNdAAcHpB7egUm2QEOdDJVQB8l5Z8kLen8bUteTFoK5eB2Bp8O +3TPjX2jS8p79Ii6xJR4D6eUWrkH1rcbeAIZAVRKLvKWFE4D08OyCp/rQJo/JjNxh +knRbsNoSzFpTkXcNsma8VMDrYaLne0eZNN7ya2m2e2Fl+ShgMB6KDDDy6K72l0pC +rNMph23DAgMBAAECggEAHQazyN116IBCHu5zVdUZfMelKfI00mdzUAWF/3mcmpPk +2VHp58MLv63IyNF8Sq9QOjL4rNvPbC1cfXMsqqV4A3Dr7riK0YuaKqpP5Z7utN8D +F3A18wMc2L4yv9xDukGVzgzz/GKyAaVL8Uq2TOYcDVhFvOV2uXWg1vR8ZEPdNxl9 +j/9RfLYuJiQHlJ+6xT60/JFLN9AVNRD5vukZXLSIdy3El0mEsevLlZcUmzz+dJ+F +WaVKOKRir6coAn+gNBbp7haQ6ecnucQyIADDMO05R36IzD64H9aifuvZJ4z6/lbd +DlezZ4zPL7N7CVogn+nBDjioD+iFVpqUa+CINwbacQKBgQDypn9Qetp3G+4pwWze +ivWuhPjA/UYw0jabizqi0yTqPmRkNhuf/AL5xgPMNmH0pq+4XuzdJEtLtHjv7vpT +l26Djxwb/B2CqQUTNdjFWq2aAWGBt0L7zl/5z3R/ogj0KVrfz1RqPmE7zgpERY/8 +Iiz7fIjg9ceBpFVyfDuhuicjBQKBgQC74YlimGdowx7Eyruw4MaY++DO2nM6wZ8O +fj8aZAO6pRYSZOh1B6iyLjWcMyHwMAeMMRPbAea1Drl77vipwNgDsmVn2h729fgv +1Z6rdunLPiQ8k3+ypHA7CidVxHppvPrLQ79Xb3H6/i/EGT2/cAsR/Wo82cpYDIT4 +QvG9+sg4JwKBgQCKrj31cUGK8Zucob/nMORZagYBxr9nB73OCDTq+mIOvroBzCrd +tNq+hj2FaU9y1BF5/kbB3QxrqCm2d476V4ICDriyBdWX56HO6OeLY9f0PPXNfT/7 +SmfwDnE2wRT89uXJJGXKkvxfgdK8UkWIhL/Qu8w/RjlQDuwHEpnCRPI5QQKBgGom +E7vbxVkAHIssy3w0kp/uduYHr+C7cgT7OOXNKfoyuVStJFSyfhIlX26fyQXt7OW8 ++K3c1h7ncc5ehqlJ5gG4sehJ6QK4l39XHu1bIt4MfuamoxgoJayFoRGpD0xcVAmx +fhKFSY14PT560FMvl2GTnolAtzyl3h5xnCks3iAzAoGBAO432byCx+qpdPST9/Vc +T6d6bpNA4Ozcs0nFSfuBbHyUXP2M7j26QrEVOlPqdnp7oHRUIqJTNEiQK2avSSgl +kA4pOhZnWoSso9huxc2ookVVvuWWSZeOhqheOVL4cxTwTjLXQzUa+cjVuVaE1+iD +hxoG8r16SNNAZudx/NDpx1hO +-----END PRIVATE KEY-----` + +export const mock_csca_sha256_rsa_2048 = `-----BEGIN CERTIFICATE----- +MIID2TCCAsGgAwIBAgIUZJXTESdl0B2qGCUUzv50dNl4VwEwDQYJKoZIhvcNAQEL +BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQswCQYDVQQHDAJTRjEaMBgG +A1UECgwRUHJvb2Ygb2YgUGFzc3BvcnQxGTAXBgNVBAsMEG1vZHVsdXMgZGl2aXNp +b24xHDAaBgNVBAMME3R1cm5vZmZ0aGlzY29tcHV0ZXIwHhcNMjQwNjE1MTkwNzM5 +WhcNMjUwNjE1MTkwNzM5WjB8MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExCzAJ +BgNVBAcMAlNGMRowGAYDVQQKDBFQcm9vZiBvZiBQYXNzcG9ydDEZMBcGA1UECwwQ +bW9kdWx1cyBkaXZpc2lvbjEcMBoGA1UEAwwTdHVybm9mZnRoaXNjb21wdXRlcjCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKtZGeGlIfA++frmdS4u4YtP +hgY44in+fg23OL8OvTGzBZlGLYTfMHoOswCu2n25qQKXOMyGflLLaNcsSp2pFxta +WEem4iigvxKLpzLSj9K724yN9Zx7BT+3PCIDdi9YpD7h3PA0thVrJVw6N9kPfq1D +n1MqL6SVkcTgjYtT2zTsjmCJhMmNZhogepuUHfAsvexkedCgXts9xZeyvwlC4/r2 +WzHqJtorV9yHDwfAYktQXCpXyR7K1rzaVyqzOpmqN772CkaZ05ryIhIVTHHNYx1C +cHXWlj3Y5XDEu6dkCRr4aYowUOyKW9/4KY6ubdTTsjY+9ZuXlaGMDG+Fi/i3a48C +AwEAAaNTMFEwHQYDVR0OBBYEFBJbmiiOdIiv7SWL8DYQ41D+qbkyMB8GA1UdIwQY +MBaAFBJbmiiOdIiv7SWL8DYQ41D+qbkyMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggEBAIoHhFao/9ubVRk5Uw/oW9rOTWSG+6yVXD4dYsrzxGGP+gXb +ftgfk4IvkTi1zGZMgN6e3eDIg6/xpoKDGNgKX9Bqa3vdeKgIyyWYlSqRJhsRnmMP +em+yZOTcNKaebx7h6Zokw7+dFKcDV5TjbkB7WYNoejp1bbCo0kNcd6C5N+WmTJkI +0rcRlUErjhIhL3DweERauQnkIltElAwV7Hiwei2cpVl6tLiWO4GydliwxxFod8AW +h88UCDvQ5BjuDnIEW1pER9MbEa5TcQa97D1ads0Unt16E86QIelLxAgdBFvd+4ip +BgA3N9B0gIhmwTvjrGT3WSG+GpQmmokIx+1bRNI= +-----END CERTIFICATE-----` + +export const mock_dsc_sha256_rsa_2048 = `-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIURN604AIW+1RhbYMsyVJsuzSSrqkwDQYJKoZIhvcNAQEL +BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQswCQYDVQQHDAJTRjEaMBgG +A1UECgwRUHJvb2Ygb2YgUGFzc3BvcnQxGTAXBgNVBAsMEG1vZHVsdXMgZGl2aXNp +b24xHDAaBgNVBAMME3R1cm5vZmZ0aGlzY29tcHV0ZXIwHhcNMjQwNjE1MTkyMDIz +WhcNMjUwNjE1MTkyMDIzWjCBgjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQsw +CQYDVQQHDAJTRjEaMBgGA1UECgwRUHJvb2Ygb2YgUGFzc3BvcnQxHzAdBgNVBAsM +Fm1vZHVsdXMgZGl2aXNpb24gLSBkc2MxHDAaBgNVBAMME3R1cm5vZmZ0aGlzY29t +cHV0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVhMyL99jHB5Q3 +qqo3UR2e1aI/CarEYmafllEh3qVQ1aNJ2FKixrm8wvLgenDlpsjpnEwElpHJwFvl +pWBKf3a1KXB7uV0SBlXep7sFNbjnzfl9Zr0CbrokjWjHPAzQ0xb14HPZ1TEydHge +B0k/ZlAjUWiGV/ecOm7IFZEA6dYca5gj4D5AP/oCS2dt24rjqvnL0xF868V/Jxui +lLQR92jg1NimYIkB3huqqb8tn5wa/was8EnUYyvb1lTWEvarBkFHXpeUB1/iB3tB +aoNHm/blH3PpFjsx5eZKRvhT7I03EnvZ7HEMHvWSPHG3CY70kGjfJ6jqP1gg2nwT +ZJOwsszNAgMBAAGjQjBAMB0GA1UdDgQWBBTsFOiOCA5VDLRUCHKX5kXXFLWsODAf +BgNVHSMEGDAWgBQSW5oojnSIr+0li/A2EONQ/qm5MjANBgkqhkiG9w0BAQsFAAOC +AQEAaP7Xvj2gC4/mL7FvroObicJU2ziFs1VCtUvJSqkqFR592QpWWGsyjZ6PJz3o +ghU2sSEFk2toI3s8Gv0q1NbkafOqPjk0dwuWWQ8dguDmjp7T+Sltu4f9VQJizVBF +LkYTkJCu1UhFWM08NS/JCyjoNEN7JUHD46MzV1Q8yf8UB55jlvRpfqXM+0wUkWtO +Fv00AEvS6Tdui1MbZ/HJAkFsV83ZkYb+wOZAqmh0+Ea46dzMlwuYweKl596fwozo +ZFFNG/h2wwkcakWW1fW980jyvj+Gm6k45YworZ+bT8uoWZTloo1MUFMjdsVRI8FL +M68d6u5tbDtdO8mMPeMIRMq/ug== +-----END CERTIFICATE-----` export const mock_csca_sha256_rsa_4096 = `-----BEGIN CERTIFICATE----- MIIFpzCCA4+gAwIBAgIUVGoAk38qsh7YYIE2eANMIeZkr+IwDQYJKoZIhvcNAQEL @@ -59,5 +229,224 @@ v9tNSlP4Tyzr2b1VoQcgmpQ987afINJG39lq2OsSrlK87p9bB4yoFSZwOfqok0nM IICRxBuTUHLqP3Nhvo+tAl+iK848LDJVf87ZVQHl72JX4lkVvOo5LCXnOQPyowaP D++J2c6tUj6gs9HAKVX7fH06m/2T5fJHae/OYx36O242yBXPQdHx6qloF/DNvGyM EHC3NCCjLG5m6G0= ------END CERTIFICATE----- -` \ No newline at end of file +-----END CERTIFICATE-----` + +export const mock_dsc_sha256_rsa_4096 = `-----BEGIN CERTIFICATE----- +MIIEkDCCAnigAwIBAgIUVWuy5jJJ5sj+QZfD5gWs3rESlFswDQYJKoZIhvcNAQEL +BQAwYzELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCU1vY2tTdGF0ZTERMA8GA1UEBwwI +TW9ja0NpdHkxGTAXBgNVBAoMEE1vY2tPcmdhbml6YXRpb24xEjAQBgNVBAMMCW1v +Y2tfY3NjYTAeFw0yNDA2MTgxOTA4NTRaFw0yNTA2MTgxOTA4NTRaMF0xCzAJBgNV +BAYTAlhYMRIwEAYDVQQIDAlNb2NrU3RhdGUxETAPBgNVBAcMCE1vY2tDaXR5MRkw +FwYDVQQKDBBNb2NrT3JnYW5pemF0aW9uMQwwCgYDVQQDDANkc2MwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDbmfvDt6mQHKcWF2mkPjF1BPS0Tggh6Gdt +/A6DCsxrb60ktxMlFm1EOkMwwf7GO2vJ/VThYqHKP+1jf8l327PNSawsZrM86dai +d8yMpim+5YMtWQfCrSzpdszusD3SSPpkUzRnYSUa5M1nywktnosYCFBQmFoS47Ya +0j6xnPp0tXEldGXqUMUF4RJRxF17u46yy4UIEk2KfJQP3aHfKaB6PRkseRw9g5Pu +RPDYTdz9KKpLeTC8YCibwKULn5oAmyz38Li099FrofAD5fbg+3b18v5l4k95bIIq +DmpeyA1Pzgr+XsdzCjL0vYMmE0xaZ4b/HWiL2Ogoy1NBH4JGmPovAgMBAAGjQjBA +MB0GA1UdDgQWBBQvTV8qsxZT6yjcGTfPp/G1g+eQkDAfBgNVHSMEGDAWgBRUaGBM +XQcIm9LEq0TQG9W1A0y3RzANBgkqhkiG9w0BAQsFAAOCAgEADYR3J1O45bTBx73a +o45qJJQAJhHAe3VhajphGPm3hpBeM2VewEZU0NIMon0Ov1dHvYudFniYiFdZMefe +CuqE9Deb39egDO1lCd2dGjybRbhg4Zr8vLqRwsG3bjdYGl6PXwyg0OsB0QbdKpm4 +tVRT970BF2LefC5vdlQpeCuLas7gkxL469+LJicXotYlO3Le+CknMYEdALjvEapc +1u7jlJFlD2xx3l8+Exkon3EzgRokp3fu9ztU4Y2j3KGdieSDJ4rYfPoyDR7HCcEd +HDYCsjBAYi6Zrjz5M0Nm99/O+4vCma7MnGkBtA63ABTDjjxIv6eeu5JxhrI8PXwE +VQ9CAmM6Wh52QebRMx1adxUqTe/rwCAwuA4v1jXSlb1BTfL+7ra1k7PYYczmnskc +jVscaxnKBVq12Pg1D03LkeMPQiqWTQ7pOPz1AKQ3TIlhsuf/jXner4cYQbeIpGwf +WatGH8+eROdlpTfF/xaAUbCJ2UYjRUupGkrpU5KkS9FxrJSVS44PO3xuJwQJN1fC +x2clYiqOEhyESrTp6c5XAGK78S0dwBP2R9o7GqY5xNI+kXBJakqyVpwIPRDq4HVo +y9QRS1jM1G/2Y1XAE9pMdMjdhfYCCp/lO48swOQDty137gzfffo0Bn0039VKzhgi +nUCb8Z7CclWppvFAVjnJruJbGp4= +-----END CERTIFICATE-----` + +export const mock_dsc_key_sha256_rsa_4096 = `-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDbmfvDt6mQHKcW +F2mkPjF1BPS0Tggh6Gdt/A6DCsxrb60ktxMlFm1EOkMwwf7GO2vJ/VThYqHKP+1j +f8l327PNSawsZrM86daid8yMpim+5YMtWQfCrSzpdszusD3SSPpkUzRnYSUa5M1n +ywktnosYCFBQmFoS47Ya0j6xnPp0tXEldGXqUMUF4RJRxF17u46yy4UIEk2KfJQP +3aHfKaB6PRkseRw9g5PuRPDYTdz9KKpLeTC8YCibwKULn5oAmyz38Li099FrofAD +5fbg+3b18v5l4k95bIIqDmpeyA1Pzgr+XsdzCjL0vYMmE0xaZ4b/HWiL2Ogoy1NB +H4JGmPovAgMBAAECggEAEBJ2gy4DenkmX28KO8uTehGJSVL2tGiafUm31C5rpKdR +QEEn5Qx9pcMv3LcuCtsZefiRCEfcOH2yRZh6KcwKHkm4kK1Zi+k/XLew4FBe+Mo6 +bgy4jS54fYPE3ulGNQhDTylpyfEpsoyxXdnVy6FxY6pkGmn0GbLRxqfBj+VBzV3B +euHX+XYgRlBnbEye3I89dvITK5gk/rYwy3N3ja8B9lb4pAkdp7RGnood/5KqbV3h +DhhFWsXnYF36DGx6Q45P20XxQvQpxiagu4NZQ6ooMZaCU0w271tdmXTdhkYYdIvV +elR6D9djY6aO9Ec/fvAjCsXJAhkIkDFuXI+tayUqCQKBgQDwiOnhrpUGbaEv6OpF +ukfAhnGKJv8vhEU5fKsHNx7NzbeUSy4dqkFZQRu46dfWyyY6moz8OeWBeQ8Sdqgp +Inh34UV6X8pPWDmB22fVxuy4/qLNaZayhKUr756mLppfpHxw1kz92UtX8LcxPFir +eeaCGJ1dDVDEDIO39dv6EOg3hwKBgQDpuIR+PUabQ/cZQ/FT7Fu03Wls0eZwoCHD +rx/Dc5L3v8QLsq9uSv8R1G4sZJd9FI7xYxaqWm+mdDNuiMUFUiLYcXBs59JxYVYu +54+e326vrQjxq28sXRQkTtp1YGuodTXmk6ucspD4QvrkiQjN3B7QtQiHiaGJo5r4 +naRMCr+CGQKBgQC2uLs61r2ckYFl/MCi0XyaU0dDFJa8CPXxUrQ1mfjLjF/NxkK1 +BFX6MIyXrwRoxhA3app5LJ4c+dKqSvs5rFbpcnauHMB5/+JHtF2vtxqy+bTA6Foz +KLK0qqXRRgu9Zh2mNhVsrTogBtuTCm2tbb/eykYYnvngxET3ZUyDLX7KVwKBgQCC +vfJ3/+Ugc/ulSYmVTdHbMkSIWD7VX+6jXbKiDmP3bXHIrXNPemqHWdMryDWqBbcU +tz51m1N7xOMEgUPdfx35ADRI58GkJTQl1ulTkV+ErIIlVqZBJexfhzDTmlV/DdpS +GudUJ9vK1QUulK21It6mF68mysnvifLmAqFm3FhW+QKBgQDVSCw1x3QAtkSswJRX +NFGvIdBSeGBqPpyn4XVU8eQav/uZcjcrB77AemaCG/BwGDQA/nU0eUam0cJn3MP2 +NDxMDWR56waCH8Ug/iC0ickLaev1lwj9FvwRpmDLxbmJM4aQgbQw/I1KkSP4ZOAO +2+/QeO6/dvQ2u8OvYn6l0Ls41g== +-----END PRIVATE KEY-----` + +export const mock_csca_sha256_rsapss_2048 = `-----BEGIN CERTIFICATE----- +MIIDbzCCAiOgAwIBAgIUOXPStXBBfo+yy5ooXC8RB8EeoXMwQQYJKoZIhvcNAQEK +MDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEF +AKIDAgEgMBQxEjAQBgNVBAMMCU1vY2sgQ1NDQTAeFw0yNDA2MjkxNTI1MjJaFw0z +NDA2MjcxNTI1MjJaMBQxEjAQBgNVBAMMCU1vY2sgQ1NDQTCCASAwCwYJKoZIhvcN +AQEKA4IBDwAwggEKAoIBAQCrA2pH2+JptsgXVKIwjLSFD2YeNMjKxhzpPPRmDxI+ +wI7CoHE2OrpC8egastg7zn8YSjmq0WG+bSbokGATZ3v6klmK/IUsIEsFBNdT3Srm +knqSsOq+dUNbFj4LZqvb1UIU0m6/LFSTVNmF/tXps84AZNr10t8CyQ4/DWPMdGhR +56J36eTg46ZNuf+wdI8o9qMuFs0MBhH1tjGUD3jcNa9y8I+A8r7KkwuIntytNkU+ +3jPVgzH5OT5WUyloXf6ixRmE+wNEGKRnM8VVIQTimXHeLzvTkoJ0ZutkG5Xty3eB +pFrZKrtIpomUKYQceTacCRoMBaYx7psBFIm0BFRnealBAgMBAAGjUzBRMB0GA1Ud +DgQWBBQYPvmGrUQIKMOQCtgR0WPfr8zuVzAfBgNVHSMEGDAWgBQYPvmGrUQIKMOQ +CtgR0WPfr8zuVzAPBgNVHRMBAf8EBTADAQH/MEEGCSqGSIb3DQEBCjA0oA8wDQYJ +YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC +AQEAjqa/umDzAFrm9RoQnv9/RwEo5u92Mx8PDU18/tbRM9ZhGHRCnqn0kftFBAXb +40kyFxThOVv5gyMd0hcJYlZhzLRqymN11Qry4cEWp9YSGXB7rfst+YvoFYa+W/kD +Mh6+zaJVfiWJoaW/G43j6b4Iarzhiu+hl4WXiQJFQ6Ya3o/MwEQmBV/RnmKHcEq4 +tmmZDfBnFxY3RfSPliR81niP0EWD0pxIDI6CzuuqmI+vXnRRob3MAa8mfefof34T +rA0kQqEcklmJFh95bOODC7UjOZlDDTEt7Mxg8CGKwrBxaEN79XCfpDH6kPnNqnfl +W3IkvjmEJJY6dZOOrjyYZ+2ReA== +-----END CERTIFICATE-----` + +export const mock_dsc_sha256_rsapss_2048 = `-----BEGIN CERTIFICATE----- +MIIDXTCCAhGgAwIBAgIUbOJrpiPFgnwWkNUmues/B8JMbf8wQQYJKoZIhvcNAQEK +MDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEF +AKIDAgEgMBQxEjAQBgNVBAMMCU1vY2sgQ1NDQTAeFw0yNDA2MjkxNTI1MjJaFw0y +OTA2MjgxNTI1MjJaMBMxETAPBgNVBAMMCE1vY2sgRFNDMIIBIDALBgkqhkiG9w0B +AQoDggEPADCCAQoCggEBAMHHISQWwp1DwHjEriD/xxOUZXkvsEiLRFV+brQSzFhX +dAo4BvVo8FeDR+YNFxxC9aO2IZDKGiMIzNvECvL+sPnzaF21tr1I6gleWqlAW+VT +oivtpUDR9iBmg1zj2+a2R/09YSS8EN/j1X3zq9brEXCv9Mt2iOUis3oAanRr43Jr +pRSViaeVt8TpDf5V/Wj7kOnYtCgzfAQErP7zOARPSC2+zI1v0Uma7EVoGgzwbG+D +jYQITwBDrNL8bQWXDJvKkdY7s2uRRSdTbhOCvQyAZM1xXxiTxMkO8E/IUXTfPA67 +dR3D/fgc8W7DrzF+cKnrtPeIjhfmM0sDFAKUZCi09RECAwEAAaNCMEAwHQYDVR0O +BBYEFNMfaLhjl1+bostxDIB2HKAT53DVMB8GA1UdIwQYMBaAFBg++YatRAgow5AK +2BHRY9+vzO5XMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkq +hkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAQEApZ8ZoneEw8gYQ+gsGjxi +xE2om6hf9dfFt5Ui86HPIfRd3y2CMvoAnmpFd8ZLjTugbetYq9S5TlLlTK/gD7bR +FdkU88m8mVwJISyWappsH6HuEaZiMjThAtcPfBP4iE+RT74uNAp70UJubvsap7FW +CgJQjLO9n2Ek7IWj1yy0BBTl5UWCsCBdv8CSDorBI+UlOyzbFMvl2wxp8MMOw8oZ +Z3WWH5U/MDtSFDQFTJLRTIlPHl5wtoqCLgZC+fqqmnY1oHPj7KCv2lIFHuTdCbrD +QVmOLpEmz/j8CpSgXpMqBp9A5KTjfZaW5FvBw4O3I7JapyZold9gt50G33ky35S0 +gQ== +-----END CERTIFICATE-----` + +export const mock_dsc_key_sha256_rsapss_2048 = `-----BEGIN PRIVATE KEY----- +MIIEvAIBADALBgkqhkiG9w0BAQoEggSoMIIEpAIBAAKCAQEAwcchJBbCnUPAeMSu +IP/HE5RleS+wSItEVX5utBLMWFd0CjgG9WjwV4NH5g0XHEL1o7YhkMoaIwjM28QK +8v6w+fNoXbW2vUjqCV5aqUBb5VOiK+2lQNH2IGaDXOPb5rZH/T1hJLwQ3+PVffOr +1usRcK/0y3aI5SKzegBqdGvjcmulFJWJp5W3xOkN/lX9aPuQ6di0KDN8BASs/vM4 +BE9ILb7MjW/RSZrsRWgaDPBsb4ONhAhPAEOs0vxtBZcMm8qR1juza5FFJ1NuE4K9 +DIBkzXFfGJPEyQ7wT8hRdN88Drt1HcP9+BzxbsOvMX5wqeu094iOF+YzSwMUApRk +KLT1EQIDAQABAoIBACv85RQJKqKCh8WieBi7l1hlfmd1IOJG4vs5WS39em+vYoMT +VtkMukpTXdXmMNHUjWhdZt80UZyUWdSlewrQMCJ9U7q6DkKHs8Dur0vudS3ov06T +gsjlIKcYPkeu3fNQe6UL8upg2r/IO2V9FAwUjn/zIXGydb72EqHmSEQnXZlSWp1y +UyRVLRpvgP9q+wuUbI1eJowPM5UwOpJo/8GiyWQ6B9TWn6FBTX2VpeTl2GTm7t4m +yXsuHExwXbElSmdxiSWWoCIpV36f++1F1zgRGBpf+DJrgbbDfidyQklImP5dYc8w +/TnWJQwNqMh/0bRpGPE4cnC50F0FS/f++ZLyZbECgYEA9uz7ACbzuemApzXmXPe1 +NTKaMZPRqHL38amSd05KUG0NTOTqJVXrvmwXMi0TLRRJZ+xExfdqNhyL/kMJ25iT +1ryjz1y3P2p6d9w8BkFsi6A471Odn2dNg3XVMU4FjHOZ70mDgS5zZZEY+dgeifYc +2Aozfbv+NJKkh8L9UF/XwCUCgYEAyOYldmhhrb6OoTRl4RCyXoHNTTb3KWACxcjr +FUsh8fh9qvj17VfwG7+NuhwPv0zr/jy5MyJKIcho7YVTmtPkucXY1newvzQfn+W3 +JCIOs0bteD8BDa6efq3+c/G7YNi+2bUF9OamqE6ScsCX+lC2P/PLszpCuuPXjZXn +wTS0p30CgYEAhcAp2ZQ/0sU7jdcxV8xJWG53fUFPgIn96eXrUzqSIGxhlvQsLFsV +HglYqzIlP/bMKEGfowf4fSULY4eWkF9ePSPjK1BSZkRb4A7oaI8Jp7v6+w/0wkJn +hzzNZS6Y7NI1YJsWY2Pw1+Q3fiXlrN8mEpO7/nBVKs7/1hX1tpKjwA0CgYA6Lo0C +8c/4JYvhG++1csR1oln21shV7zxeU4XhsNSv4yth7KAskJ81KhC9qYrV+E0QYD2y +lWeqyQO6ZjaETIGdW7MkyZ0igtH12O1lRYfEW/JCNNz1PXEhdvqOUZ/WuG7tVgPX +nUT+0WKQYT6ie+WMN+ryiRjyTzIKCzQHPGBlcQKBgQDFP00AGgLW8yQYj5rxNdif +ok4FOnU5hQHaDwDGqc51Xpl1SqTUc8sNYDqauMIupoq9c37lCzljUakLpFra1DK1 +i4UYRl1inWp3BqGVE5V0GN/NYAtQiKUNM5iXf+10UUNrlsJujD6DQL0tttnAFsWl +gR8ctVfp/DLstUdwl54qiQ== +-----END PRIVATE KEY-----` + +export const mock_csca_sha256_rsapss_4096 = `-----BEGIN CERTIFICATE----- +MIIFbzCCAyOgAwIBAgIUcPyz9NNu9cv8bmvhreKdo5w6JhcwQQYJKoZIhvcNAQEK +MDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEF +AKIDAgEgMBQxEjAQBgNVBAMMCU1vY2sgQ1NDQTAeFw0yNDA2MjkxNTQzNTBaFw0z +NDA2MjcxNTQzNTBaMBQxEjAQBgNVBAMMCU1vY2sgQ1NDQTCCAiAwCwYJKoZIhvcN +AQEKA4ICDwAwggIKAoICAQDHnCloSc6AwW4YfCOBdKp0PbsGy3bykmWYHakCjGPb +GeaKIrHIuJBjJb0QF0wmGgtkgTKLQtRwClDxKg9y9vru90gZzZ/o729McC7xGLq7 +S137By1hRPMqtJjYQTDrC33Wq0IwI+c3U11+TcS3fosJ9mLBmGkT69eO9nZ4wAHo +0oyK0x/OxpEsVimJFyWiYBFmHK/rxwFP0cybpg1U0If8TGf5R0fBTpGzUxbtqf1F +RDMPSOYwF+hvCyyqC7uIe9mB/0HAAHx6DxcXoxiOQFFvFJ855aTIB+lNngLjA+AV +8qiA7TIBbSJNYQIrNxoKO570t8UkvQ1gMJKbzuZZqCxxYHYs88/l27BQ4Et8yVis +zMLVLljtIIK1falI96iXavoIJwzu26skb0B4koTzhISQNiqrcq3ZGmR8Q4YBOOjt +gHsmZnvFiTq6XmbUVsGECLNvQj9Afflt/KY200bLpumVVtMshW30tT4lUPOCyKEM +bGPR2znowm8qlS7heQ0MK//mpz2CcYn/OsXiWti/6pLmfgCy/k48NCUX5jOVpuoQ +Cm6dLp5Rxe+cHSw/btcI3yu4FxuunSh9OQF6dYd+dZAvEahrD23O/+g68B92Y/Gd +d3H/6/nYZdL2VbT5CAA4F/GMBlqSXaIp/I8zMjkbrMgIBbFXAwmSS++rEu03ldtS +IQIDAQABo1MwUTAdBgNVHQ4EFgQUPKXfRIsfGKkfqmZMJiHriBUBfbswHwYDVR0j +BBgwFoAUPKXfRIsfGKkfqmZMJiHriBUBfbswDwYDVR0TAQH/BAUwAwEB/zBBBgkq +hkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCG +SAFlAwQCAQUAogMCASADggIBABZ/KiLl6XqJugAXXFrsOQ0DKsa/Hc1oQO2thZWl +k5zr7/i8OH1Jh+uPdOFAYEx0Oa/w0xVYfn7j/QR+VDdlycAQ5tdStP8nUp5QZwG9 +x90SUZ7jl2Cab+qGHNH+cZFQve+ArH3l+vc2aMYgzYEmk5GokRWXVcIb/2m2vD4Z +2S86RRhyfpb1M7Oo1OrdySdLJdTa9DVlOwfwlnHBfI1/Vqx/Jt8EZ+GMVHXj41IZ +TedFFKiSpe37mWBEEHG+h/fFgi2Txh8OIEZoUDJWynatFJbRwsVdwZnXlbhnLB4g +68L9fIrwpTdDjV+y02pgyKkGojxvhduV279Det9G+vH+i+qicIbJAbj7hJ6LmYdt +xPnlMfH3dcSxAvUoreNC4xhCKArhySgjHNI5gJ6Yk5XNxLrj7N4+N2wx4z35NkAR +nY63+meescNm8peF6pNYsJjFAbKuAyIuw8rAUC8hr75xGdnBgBgjD71m5AMnogbf +JrurbPjiZ+f+ie/WAI730Mo3OOKnv6z+6qIPr4KqM9MOpECp9u8J0VcWhIDCrYhe +ZOhjTvvbwLrq4Smh8iH6C20IZFK5Je//SOkolBvsRh6ToQoJerR1lWGVlX4ljN8o +9g5hp1KC7Fe25/7Ga14YFAjrXIeRp59zpNCkX4swvUQiSYM4BQTsaNmBEvQQnlT+ +9OCw +-----END CERTIFICATE-----` + +export const mock_dsc_sha256_rsapss_4096 = `-----BEGIN CERTIFICATE----- +MIIEXTCCAhGgAwIBAgIUdS5K/Y5Ty0C8hDFibjmvBeQr4SgwQQYJKoZIhvcNAQEK +MDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEF +AKIDAgEgMBQxEjAQBgNVBAMMCU1vY2sgQ1NDQTAeFw0yNDA2MjkxNTQzNTBaFw0y +OTA2MjgxNTQzNTBaMBMxETAPBgNVBAMMCE1vY2sgRFNDMIIBIDALBgkqhkiG9w0B +AQoDggEPADCCAQoCggEBAPA3vVaGvzo4jKssVHzb/Ocel+K2TRnwUTtWMedwPj6c +xaiAdx/QpBPDV7lDIAVwWGERCJkrKF6mzDcGR+c+ANbmMY9sW+lSrSSK0VycRKmq +iSiOAYLGf70Owq+lqxEu3oFeXLLJ7C6oXWaYyDUEB8lqs8s8cNxb/uUcqYkuGayu +/pu5f2LxXM2/ieaYdfULQPlkWAhkbs4gERVWNfnUFRK4gYFLEWaT6fAHIaHnnRSO +Jt7xQl94FpuFCLzB7agg/jwuOmfVQS8ISda2O8uDaIDdA2536Hf89vDZXZ0EboPq +JoDYT3BGjoOYROariywgJc1B3JHxDdX4w5FKgY03PIcCAwEAAaNCMEAwHQYDVR0O +BBYEFKFL3WvKxngqdWX909QLsr4d/JDVMB8GA1UdIwQYMBaAFDyl30SLHxipH6pm +TCYh64gVAX27MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkq +hkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAgEACyyjRAoe1d8hzMtNS+wv +Tu0oKQ2TbI1dpYKMqEdTxN+BIxKxblieCDTkx2c3VmlBQFjpf4c6RqpG0SqihtPa +6XP9ZUiYjrHgTGebeQ/aXS824vCAosCt45sEqTSIV5uBvBqKDNdwL1NP8lxinuNG +Lr+7m0wZ1soLQh53tP/G7SU8q1Z/ZIhuYMBX90LsDlR4h8diPAvYJhFkb6//rx3n +gLGmSiQdbtY9EhkNhsPx2tOj8eCKcgWh1TEYllwXCcfW+fs9wLD0l87eRUW5bzuB +H9jozpEbd2HCn7xLsLn8sjmO4P8Qczx00X+eY4FkjMk4w+HDwokPXPTVyBX5ZX4p +qsHHRz+6uLSSY/q6HTcdHFCacs1VETI4i9UG0YjY4A3EPAUNvgz/GIn7Lja/JxSH +wvJoPVJzopzyZsUUeD1GpUE6yVgA31/E1+diJ5S/ZKHHmyl8nf/H1hzUl9o/Sz/7 +pCrZG4WfUY8ifggReHLoLWSFF8S4JqBKykRu67fbkXLe52VgnYSv6GVxvf1N7mhD +O50iFYNDXId0SgL+adTylqIsr5l5BQw84vf2m+PO8xX2PPFTO6kUsivr9d5cUgVh +duDfJWPas4d3FKdmuSqnUUh7tGWZctzXnA0kBVXa1j5OtU5w+1qp9pbtv/kci2OH +FnvLWs1nzkj58FcjpVG0+ZM= +-----END CERTIFICATE-----` + +export const mock_dsc_key_sha256_rsapss_4096 = `-----BEGIN PRIVATE KEY----- +MIIEvAIBADALBgkqhkiG9w0BAQoEggSoMIIEpAIBAAKCAQEA8De9Voa/OjiMqyxU +fNv85x6X4rZNGfBRO1Yx53A+PpzFqIB3H9CkE8NXuUMgBXBYYREImSsoXqbMNwZH +5z4A1uYxj2xb6VKtJIrRXJxEqaqJKI4BgsZ/vQ7Cr6WrES7egV5cssnsLqhdZpjI +NQQHyWqzyzxw3Fv+5RypiS4ZrK7+m7l/YvFczb+J5ph19QtA+WRYCGRuziARFVY1 ++dQVEriBgUsRZpPp8AchoeedFI4m3vFCX3gWm4UIvMHtqCD+PC46Z9VBLwhJ1rY7 +y4NogN0Dbnfod/z28NldnQRug+omgNhPcEaOg5hE5quLLCAlzUHckfEN1fjDkUqB +jTc8hwIDAQABAoIBAHEoULCp2Pr8GIep4kLO/luBNds+NSO66QkimW+EmE22XAX8 +PiFmj2Qf6PsEe9kUCw3ukDZW9jVgLWLeOpDbzFlvJnmBeep3X8iO/AC8PDwQcXwB +KQUJrLLKeTt0txjpEzet080FAZUZCqaB4g3XUDO5Z+idGC01yOT0k4hjhwSooPQh +Bh6Ufi5ENMORLyyDD9MVlVZVHFIeGD7zmoo+HobeSdhBTHoe0L/ppwN8UABpRH5n +mFzVixE7xqJoPFY5zpkV/gecYgPFVFfG+1ALyp2s6moWyExxOl30zF5WjerTGfRl +Tbo0irz/fb8CPFmvO28FF9y4qby/wC4VUxfAa4ECgYEA+V6BWaI6sWLro5i8/Gpo +kZy+sVowqjhhc0DSaIXJTHL5Z8EjwE7C7rbMTcHAZUDuq7zC0t3lqdljaiCg8EQz +douLsjbbkypfILyUjEWE5PuDPWV0LrIIwJuXz37o8hDl/1fC2JPB8Z9SKzlZlswQ +4ur3ksOudtOaAj9Xu4zXI58CgYEA9prwar9/b8GUH45a9Fpjj6rhrxKvRJ/f1R1S +kStlZUYmUTi7FF1xwwuip/u470eScB/CYWfZm1aKPIKqDi/NHewrMk2MEz/XENig +w7LHsjYDiGpBu3ioMsHs41YjnEfBT3+YZhT0BTqxvqxTQOWzq/p/1SruOF2jtMzT +6pQD/hkCgYEAp9m99WhmW1o7RD4eD0VMp567GMOdeCZFKf/a4PIUofnN+NGfT+Vz +/pxafohJCZ6gSEbhWHB2E1K5QQk/axptDYE2gbm9KJzftThaQOTWZA8Lsrrkbj31 ++DeDAu7ou282cR5Qj9k9NXdJJsEOlZs8TpFcHZTLjT43LwYV9q8BbP8CgYATzceG +2xAR2nrZueXl/6hFLlTnaVm36hrgk3VBATooUuTa2vJzJTnwjuumD9n/JUFGTdaf +Weaoyd9aEqgzcXVIdOHXLVEVbqgHy03FyYKt9hZ8iwPyWTMwuFAcxZsgfsawaq/D +auVZ0ifaBx68dHXkVr6TUNpGnoZ6C4TtLqvPaQKBgQDm66dlLxat1KDfEMXmpOMq +MNaFmxLFgtNngCKgGxHcjOtaMYonPGXVO1uBn+aM4Bcj3Kx21zm8DJBLQmUyIzjc +bUTICRnwWI2dWQz/K5VQuMdEDhxpzDw4uhBun97HlwEZnQnMxrf4whDby1yEnMrk +jXtnkq7Exo0bOsVwH7VNkw== +-----END PRIVATE KEY-----` + diff --git a/common/src/utils/mockPassportData.ts b/common/src/constants/mockPassportData.ts similarity index 80% rename from common/src/utils/mockPassportData.ts rename to common/src/constants/mockPassportData.ts index 05ebce37..82aabda4 100644 --- a/common/src/utils/mockPassportData.ts +++ b/common/src/constants/mockPassportData.ts @@ -1,5 +1,5 @@ // Sample passport data used for testing -export const mockPassportData_sha256WithRSAEncryption_65537 = { +export const mockPassportData_sha256_rsa_65537 = { "mrz": "P x.toString()) - console.log('dsc_message_padded_formatted', dsc_message_padded_formatted); + // console.log('dsc_message_padded_formatted', dsc_message_padded_formatted); const dsc_messagePaddedLen_formatted = BigInt(dsc_messagePaddedLen).toString() - console.log('dsc_messagePaddedLen_formatted', dsc_messagePaddedLen_formatted); + // console.log('dsc_messagePaddedLen_formatted', dsc_messagePaddedLen_formatted); // merkle tree saga const leaf = computeLeafFromModulusBigInt(csca_modulus_bigint); @@ -186,7 +196,7 @@ export function computeLeafFromModulusBigInt(modulus_bigint: bigint) { hashInputs[i] = poseidon16(hashInputs[i].map(input => input.toString())); } const finalHash = poseidon4(hashInputs.map(h => h)); - console.log(finalHash); + //console.log(finalHash); return finalHash.toString(); } else { @@ -206,5 +216,18 @@ export function getCSCAModulusProof(leaf, n, k) { return [tree.root, proof]; } +export function getTBSHash(cert: forge.pki.Certificate, hashAlgorithm: 'sha1' | 'sha256'): string[] { + const tbsCertAsn1 = forge.pki.certificateToAsn1(cert).value[0]; + const tbsCertDer = forge.asn1.toDer(tbsCertAsn1 as any).getBytes(); + const md = hashAlgorithm === 'sha256' ? forge.md.sha256.create() : forge.md.sha1.create(); + md.update(tbsCertDer); + const tbsCertificateHash = md.digest(); + const tbsCertificateHashString = tbsCertificateHash.data; + const tbsCertificateHashHex = Buffer.from(tbsCertificateHashString, 'binary').toString('hex'); + const tbsCertificateHashBigint = BigInt(`0x${tbsCertificateHashHex}`); + console.log('tbsCertificateHashBigint', tbsCertificateHashBigint); + return splitToWords(tbsCertificateHashBigint, BigInt(64), BigInt(32)); +} + diff --git a/common/src/utils/generateInputs.ts b/common/src/utils/generateInputs.ts index 6a90446c..9482eaa1 100644 --- a/common/src/utils/generateInputs.ts +++ b/common/src/utils/generateInputs.ts @@ -14,7 +14,7 @@ import { packBytes } from "../utils/utils"; import { getCSCAModulusMerkleTree } from "./csca"; import { mockPassportDatas, -} from "./mockPassportData"; +} from "../constants/mockPassportData"; export function generateCircuitInputsRegister( secret: string, @@ -137,7 +137,7 @@ export function generateCircuitInputsDisclose( mrz_bytes[2] ]); - console.log('commitment', commitment.toString()); + //console.log('commitment', commitment.toString()); const index = findIndexInTree(merkletree, commitment); @@ -171,7 +171,7 @@ export function findIndexInTree(tree: LeanIMT, commitment: bigint): number { if (index === -1) { throw new Error("This commitment was not found in the tree"); } else { - console.log(`Index of commitment in the registry: ${index}`); + // console.log(`Index of commitment in the registry: ${index}`); } return index; } \ No newline at end of file diff --git a/common/yarn.lock b/common/yarn.lock index 93904708..e35b988d 100644 --- a/common/yarn.lock +++ b/common/yarn.lock @@ -41,6 +41,53 @@ dependencies: buffer "^6.0.3" +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-includes@^3.0.2: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array.prototype.reduce@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz#6aadc2f995af29cb887eb866d981dc85ab6f7dc7" + integrity sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-array-method-boxes-properly "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + is-string "^1.0.7" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + asn1.js@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" @@ -51,16 +98,28 @@ asn1.js@^5.4.1: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -bn.js@^4.0.0: +bn.js@^4.0.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -69,11 +128,304 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +elliptic@^6.5.5: + version "6.5.5" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +es-abstract@^1.17.0-next.1, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es7-shim@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/es7-shim/-/es7-shim-6.0.0.tgz#0c430b40b8505ad15570721a8d8dd4eb0c553155" + integrity sha512-aiQ/QyJBVJbabtsSediM1S4qI+P3p8F5J5YR5o/bH003BCnnclzxK9pi5Qd2Hg01ktAtZCaQBdejHrkOBGwf5Q== + dependencies: + array-includes "^3.0.2" + object.entries "^1.0.3" + object.getownpropertydescriptors "^2.0.2" + object.values "^1.0.3" + string-at "^1.0.1" + string.prototype.padend "^3.0.0" + string.prototype.padstart "^3.0.0" + string.prototype.trimleft "^2.0.0" + string.prototype.trimright "^2.0.0" + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + fs@^0.0.1-security: version "0.0.1-security" resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4" integrity sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -84,11 +436,122 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -inherits@^2.0.1: +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + js-sha1@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/js-sha1/-/js-sha1-0.7.0.tgz#fecaf5f36bb09a51b01da46b43a207c8452c9c1e" @@ -104,20 +567,94 @@ js-sha512@^0.9.0: resolved "https://registry.yarnpkg.com/js-sha512/-/js-sha512-0.9.0.tgz#ed569aa1e4bdaf0b83363c29db1ab87b1192d9ae" integrity sha512-mirki9WS/SUahm+1TbAPkqvbCiCfOAAsyXeHxK1UkullnJVVqoJG2pL9ObvT05CN+tM7fxhfYm0NbXn+1hWoZg== +json-to-ts@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json-to-ts/-/json-to-ts-2.1.0.tgz#c68c0b210a811e8dccbe2752e68efbc0ca62bfc5" + integrity sha512-JeScjtIGYAxQVxEYgQUKROU0329eS+rsTSviGtuKiwKuXpcIU7DxhDYm2tey0vcBetwc9kD0+YHDI5KvEexMew== + dependencies: + es7-shim "^6.0.0" + hash.js "^1.0.3" + pluralize "^3.1.0" + jsrsasign@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/jsrsasign/-/jsrsasign-11.1.0.tgz#195e788102731102fbf3e36b33fde28936f4bf57" integrity sha512-Ov74K9GihaK9/9WncTe1mPmvrO7Py665TUfUKvraXBpu+xcTWitrtuOwcjf4KMU9maPaYn0OuaWy0HOzy/GBXg== -minimalistic-assert@^1.0.0: +lodash-es@^4.17.10: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash@^4.17.10: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -node-forge@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +"node-forge@https://github.com/remicolin/forge": + version "1.3.2-0" + resolved "https://github.com/remicolin/forge#17a11a632dd0e50343b3b8393245a2696f78afbb" + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.0.3: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.getownpropertydescriptors@^2.0.2: + version "2.1.8" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz#2f1fe0606ec1a7658154ccd4f728504f69667923" + integrity sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A== + dependencies: + array.prototype.reduce "^1.0.6" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + gopd "^1.0.1" + safe-array-concat "^1.1.2" + +object.values@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" path@^0.12.7: version "0.12.7" @@ -127,11 +664,21 @@ path@^0.12.7: process "^0.11.1" util "^0.10.3" +pluralize@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-3.1.0.tgz#84213d0a12356069daa84060c559242633161368" + integrity sha512-2wcybwjwXOzGI1rlxWtlcs0/nSYK0OzNPqsg35TKxJFQlGhFu3cZ1x7EHS4r4bubQlhzyF4YxxlJqQnIhkUQCw== + poseidon-lite@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/poseidon-lite/-/poseidon-lite-0.2.0.tgz#dbc242ebd9c10c32d507a533fa497231d168fd72" integrity sha512-vivDZnGmz8W4G/GzVA72PXkfYStjilu83rjjUfpL4PueKcC8nfX6hCPh2XhoC5FBgC6y0TA3YuUeUo5YCcNoig== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + process@^0.11.1: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -142,11 +689,220 @@ regenerator-runtime@^0.14.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +string-at@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/string-at/-/string-at-1.1.0.tgz#332e090c5724418266a27a09394924b9fad41275" + integrity sha512-jCpPowWKBn0NFdvtmK2qxK40Ol4jPcgCt8qYnKpPx6B5eDwHMDhRvq9MCsDEgsOTNtbXY6beAMHMRT2qPJXllA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +string.prototype.padend@^3.0.0: + version "3.1.6" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz#ba79cf8992609a91c872daa47c6bb144ee7f62a5" + integrity sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +string.prototype.padstart@^3.0.0: + version "3.1.6" + resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.1.6.tgz#bda3b28098270e1e285e08318e47ad53bc601ffd" + integrity sha512-1y15lz7otgfRTAVK5qbp3eHIga+w8j7+jIH+7HpUrOfnLVl6n0hbspi4EXf4tR+PNOpBjPstltemkx0SvViOCg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.3, string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimleft@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.3.tgz#dee305118117d0a1843c1fc0d38d5d0754d83c60" + integrity sha512-699Ibssmj/awVzvdNk4g83/Iu8U9vDohzmA/ly2BrQWGhamuY4Tlvs5XKmKliDt3ky6SKbE1bzPhASKCFlx9Sg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + string.prototype.trimstart "^1.0.3" + +string.prototype.trimright@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.3.tgz#dc16a21d7456cbc8b2c54d47fe01f06d9efe94eb" + integrity sha512-hoOq56oRFnnfDuXNy2lGHiwT77MehHv9d0zGfRZ8QdC+4zjrkFB9vd5i/zYTd/ymFBd4YxtbdgHt3U6ksGeuBw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + string.prototype.trimend "^1.0.3" + +string.prototype.trimstart@^1.0.3, string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typescript-parser@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/typescript-parser/-/typescript-parser-2.6.1.tgz#b5f86e3f9d35ad46a346a32068cab61bbd96f803" + integrity sha512-p4ZC10pu67KO8+WJALsJWhbAq4pRBIcP+ls8Bhl+V8KvzYQDwxw/P5hJhn3rBdLnfS5aGLflfh7WiZpN6yi+5g== + dependencies: + lodash "^4.17.10" + lodash-es "^4.17.10" + tslib "^1.9.3" + typescript "^3.0.3" + +typescript@^3.0.3: + version "3.9.10" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" + integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" @@ -158,3 +914,25 @@ util@^0.10.3: integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== dependencies: inherits "2.0.3" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" diff --git a/registry/outputs/serialized_csca_tree.json b/registry/outputs/serialized_csca_tree.json index 094e5a8c..65f47c67 100644 --- a/registry/outputs/serialized_csca_tree.json +++ b/registry/outputs/serialized_csca_tree.json @@ -1 +1 @@ -[["8691474413369666750892234614358820289658368726857552974633024543804680298964","17496320222604434917256246718514403734235740171188912286919341525891256570713","20717661531343094401419404535005724208121214979487601078059038701197331043233","8338161038189752845969324086767343943203808400163733790574844916777622907526","2244871586170865025448272825497968057027141766617969218599365252909572535577","3608626711809097355394527544415447989465407554113965209630262872975367728702","15123415314399351471075303556718608687323785898137080424470982286311735782352","712912966757927878965693240425422971881715436008090497769457122872348343952","3196185115626403769090812264110127828126981872545481387659039004737077237629","20852945694892786589706882486760988740184637230152727898060254427102399724085","663438552256433061576054140809160443818506164632349621099807794702352080693","18682912995789016595436882433435139159334702280353629213700041190405671371221","954361121666374676317512516553835448496801654442662842741750447529976221096","15976568257028838086904371689993285445196617581672212770040719579976951713437","1689709601556268020419125248006910470935068691712645256591639741945971733744","1644637032401895183536122531980635414363418149797237304436572320773189961342","10530161321691746280687450853188873346740398773252979676317929677235626245235","2628389834360132333366589026387003814868457686372552787974500759887369913155","20551785199765572414957755636883446606643894289625551996383687264006196444272","14647299140966795168634863382011786101084247791740654785196548451662948086183","17547875379231708590555723879540779728666475590929028917859771769395698401715","4087977103445290602464010775212316926483391914870441578758042979308767270230","6714269803293029270909153658663808588557387497502190042744619007611526657435","21829614378897985584789450465826668649930021698690579364831443823904306431333","7532552732354833964818948844447124010555621930545046129036742684162649680796","3085746588958121678695340573755073635811671969466202529706243909144419544906","15358264232435244032159222413023294519420811338021914047216004862176094578703","274618135907332659550125464790981847888019268634834758638296553463810383811","3145275707337847188939353064357731848534516166917140907835781738084777990262","712912966757927878965693240425422971881715436008090497769457122872348343952","21219905789358323534478545279193723251420616841556623254711235028135342626157","9798324625310926002331408522163043190724749435063160272808536376189654148756","13582411668238263333995209483029305625601807569534701653376051071840372484093","15950000082544045394526115523741159615348156864031044224172890462894241606231","5992148578777868893458748144399130666011631987544731979896999269126511048457","5001232371587577350490476563931715794477203224577970619789108259266886603950","17806353473562524209419921489674020711603878477377228029846764687154796899291","4781857348503260904895922377303003708601361291248025972804843818012461675526","19725005896671978040083076043827582994250733273969992727037910840857608608713","6771553323761092017375937072638415166675529808942268574147258168001934888920","6072598916249169136908315542430764263321939399814654522032874918790340778554","17174337625009122870708859925793325997946378966416309900853757797594910229791","2191847811950210640312799119786838991241770048511678287834866005381831304252","5556089667073477529764323892046529774877491089381310117639628299653468438238","5512523756717871023776497641942984346783337720501449614794308618170512394669","12964734676293244153748554238028206801414195417901916061140401142888712380451","2972653442760058165486608510571475869094354178867521177094553776876904654370","19617883112060216036437373002520931262578741557295904537678304364166866283129","1175039218798484980072399121924972057008410392367959450703939688306902524054","10396745429499812151132429056797671842807735536621273702194009800176056286117","21829614378897985584789450465826668649930021698690579364831443823904306431333","232738545482017472261496633286350972128632187612854220178426602649221258372","12964734676293244153748554238028206801414195417901916061140401142888712380451","3085746588958121678695340573755073635811671969466202529706243909144419544906","19569641468295105160418177740024945517842897645468872356974690513927041995987","13682529409340978640466595260264374070197250456280851982310079893206859446095","5864324965287761028896843934748795289028753931353130557439328109628025948300","18638025629280224617790168906173435277703684091772827588468099812026035539738","2194543658437125198357587946021311492689377172643668551084193961108304747785","21593921076086949669297200034323757069358367209393924460563276537349356681008","15613087414575084731294247924061147534041250959429049604445183368849211416480","21876658378266334569964380224531738829113969654886515172706825001082187941302","17603178439634188462056825952489860474722953595745235452510670608903852152095","18820995668034441064481786413532066855976405414499761311120499699159123037823","6071932171386993614931179655729818150534845046202199448265558256519848482826","10847231218503195759517071138679051602730407167074172266742227045164609231885","14506356872966117174131859847846372170262756655915924664237877294288585233653","5157851077382368258831146921235005863841873179959407293372390317913027109941","17215740096130814160671394963439750791336311297216240493968557475671940055057","7236783279316083836339480995960834633270959028443867776543135480683166923869","11398194787838497782166425813926171378663319996243937443066049287231892201563","8461890310516914992976016102786941165050457592527945955052989873762315959085","20131832673266427475769741534309108541338301173662948074665588100934145363162","13025268118387164480802803485697296266258675734062176433653116451463846209082","2959389974566411083204235326117036516979963119227951085034972251184734179290","9377958456884255467194088716477119239642797045077236472356953540022684583149","16698515797824680501871676266202253211872118899888285886412000454073141450701","15798767315325760489132964686987872692994717940925570238047784420230331193585","4781857348503260904895922377303003708601361291248025972804843818012461675526","12671050201903040870132377617509218353339866159494336831034048382615639662347","16118914885963834916174025584295786549597018616252080891215345608189775067017","1287880180407310800601651110405671450334122951893361316992545024696018620127","11275609334870619778800915975797190217946752952900097800029716348347769743557","4549806302643127256376053744839835469729529127535077121646524402308295761124","12385792108167898834965686312817629786971321080122734283967136719015404659574","19645303799442917520263849382981918648525479954858046014781621457535223129139","13079036262723496487062341719232498854721623596427562123822257284722043022380","7815052247860712154170106628650576750781240048309328607812510735568644480099","4224433012242275812105292037318388809660019851311870694425205064696802439276","20769202337427957655670745571969974320407145254685594108329805885177108459406","5864324965287761028896843934748795289028753931353130557439328109628025948300","1194604146042048350003512364693260099917768421477389239935129766419846021985","20342168169457748695802149508674862964537074611245094862559628187033717475867","9612640678039527906483661330640693201947160578570955411180830848021191312999","20227979332701217082249100988795416872480735366357703927751699407575642930935","5568143431214976639464768845659406494667053581733825380813024891527928235568","3208479846365475237410989805061539106045403260781956346764317556860566259416","1533174095932179741832085722978096451211273368734335528806856805965059178550","15214427790517490141925325587797963249335567355213168373025412405634050937481","13602826144456356860284419687170541618185281374064216815711251835821492025702","946455194947827940337729236114480813870835673647234481151109602462556270766","10530161321691746280687450853188873346740398773252979676317929677235626245235","20551785199765572414957755636883446606643894289625551996383687264006196444272","17492490034871188503809070393464727304143828491765350693224566925126105199911","5627116488283442946557217209333347313412518163016066550539282920861053074060","7628458932936495764524142429747955579001667142208907050372858225989514457008","13545244560072730176162896504690392106112168077747273393293519829141026712654","9197800054380533439556389025741028642781611147489934915217537670356117734985","19725005896671978040083076043827582994250733273969992727037910840857608608713","13597601271430461916896612582648919742272715556061113046784825140314498905478","13382473425074121858735590469120000769886230357897236331156422982819803288928","12439760546784082202871583401234733990044187602943315324169379543365738178519","5758137506105103459826998865197780898444584232351877574052188955203596737799","8370264878441063630462671051957262849187564367781659467838460782939804026447","17368028902269277465024746642764987612414033705161996149238721534130490186941","946455194947827940337729236114480813870835673647234481151109602462556270766","10782746953492500078751030180163064462657489179646951793154413574373371915628","4574759938850684302328171377919788556520857555728298495027674689330859913909","712912966757927878965693240425422971881715436008090497769457122872348343952","2483126835964394240864276692792992171095811055349556498083468949709404323305","2235150263865959136421726440400433738501848129328010009098035293276672220717","5469955587383559828097756439479681402770241102946573149636380518729022833750","9612640678039527906483661330640693201947160578570955411180830848021191312999","7135473937218111453151804646361837547205712024569546168416088861245626015030","9197800054380533439556389025741028642781611147489934915217537670356117734985","8177887533556223950928671845738575508418213402039951309409853690924708882619","1644637032401895183536122531980635414363418149797237304436572320773189961342","2235150263865959136421726440400433738501848129328010009098035293276672220717","19402903568454754777700416991856190103205898202952506192755702018138164903780","663438552256433061576054140809160443818506164632349621099807794702352080693","15776280343411227095808521568994471614057167432416502119979098996603887292938","12313143896208759390351526641510039095883815550699902043061685514584813600074","1218928037268356033769144531312651840516937586618523437511091378414585873142","9011100725723069477052917523444280437831907181043987084639300263089606956420","8082817983718546987105551276971252463934917335856558917892075900846966350585","17744796207881002836361754172345756972108243302293817629307470887005013537965","10909054529489265328197617859427892180031815470826676417637937142527343355023","20551785199765572414957755636883446606643894289625551996383687264006196444272","2676613676733015431959147577385543530164186971614056775227705172064306807928","15776564956440002895136116449299582951656581983212117550232796150916571692055","11412740120827044021870096407623293808851105071188140591919788265312361814171","3885925135313023686150115977607110368258492435636819989794778250027419367343","1440944398068243290019815197893325790869382856018839453050014183551865062018","18707594353877082516395132272698629627555807696619350634836774054442394671010","19750715061039895092288075649509657235159241403400837501090850293666251108617","16411233008444850443854175483761516668813055344878151975436424201109266465436","966676739412114459004685599806372707037105104204243310754946364190002350899","17496320222604434917256246718514403734235740171188912286919341525891256570713","4224433012242275812105292037318388809660019851311870694425205064696802439276","15976978918004336355901319629352200911328902990447017277673724626919242812955","16226984168490080400263373201570728966749962184950889718917387268203884202372","1071564318326244075341980988866027669737011601498674724527637774926288977632","20769202337427957655670745571969974320407145254685594108329805885177108459406","2967213245998332384543885104754783540899439580884490432048984202068901705944","20769202337427957655670745571969974320407145254685594108329805885177108459406","1828058457773990843551157525432867662470301272599690050907371698799750907039","21451388112829145060821974036366132513327328641208732802166144524686108831760","21219905789358323534478545279193723251420616841556623254711235028135342626157","5001232371587577350490476563931715794477203224577970619789108259266886603950","6540725658063818695836967143056666761434297658403942276316050979804587769432","9377958456884255467194088716477119239642797045077236472356953540022684583149","4224433012242275812105292037318388809660019851311870694425205064696802439276","20452154666799846638117791929900707763485919083101449648262816499313176812803","2191847811950210640312799119786838991241770048511678287834866005381831304252","8491224372742742395086082981236389730604525807576141462195229766319454932167","5512523756717871023776497641942984346783337720501449614794308618170512394669","20717661531343094401419404535005724208121214979487601078059038701197331043233","2476324937951789382181944025361875851099988750579823474754609765481889757439","19356492332655108003949429792555441845806681675195402015185308983898801715851","2967213245998332384543885104754783540899439580884490432048984202068901705944","5055315503098445594062335518727177962919913361908453398984787599226169183337","17492490034871188503809070393464727304143828491765350693224566925126105199911","14027649325388708488081280969586205626278814303627295953445422182588276435572","13465227484584385300386574818824135648806878577862587385005638292079537592144","12385792108167898834965686312817629786971321080122734283967136719015404659574","21267939098918134027395634942102971885281982111723141238850772621986256662900","17496320222604434917256246718514403734235740171188912286919341525891256570713","11433874323428772158013095381623924200138375055456955808189877801771380225552","15618359152517208456698312197785172766694127619077536561902714697931530755106","2628389834360132333366589026387003814868457686372552787974500759887369913155","2027121307515028227361803453971004574835283397634149795685942874063731877044","1758371485945815703876679445382538767819559386912271388124907980130004330353","712912966757927878965693240425422971881715436008090497769457122872348343952","9296362220804925104551234752226384203979024033236205671428676015277866160513","3099260939107709193833554073787772569345965287506676970762153917208260772189","21219905789358323534478545279193723251420616841556623254711235028135342626157","3099260939107709193833554073787772569345965287506676970762153917208260772189","15976568257028838086904371689993285445196617581672212770040719579976951713437","6540725658063818695836967143056666761434297658403942276316050979804587769432","663438552256433061576054140809160443818506164632349621099807794702352080693","8140644209065967749731539711645757673629321017919126168806710308878873241272","4655594634855844188499094340496759182976213206849235604185854128079411962453","13216746424486872049443607565713997095923431379037310625593547838968801990450","5512523756717871023776497641942984346783337720501449614794308618170512394669","10286727453332438406648583236643277009562092681643525436851770105870834802875","5835554999819330558954089066526405560740259616473885793288693915684399039377","2235150263865959136421726440400433738501848129328010009098035293276672220717","13602826144456356860284419687170541618185281374064216815711251835821492025702","3117586190657126472592128104269081184451127080527182054370687640020932637738","16961794929940055505618937273665830834556517799613603503371462732255229717698","20717661531343094401419404535005724208121214979487601078059038701197331043233","3054509086575963631520633315863182977708152785332183337259997415160907095845","15718330550508436908559701395606414201668068552693146421627683872153427960853","4363738634465882118172307854104596042899685656091037340905869811610138317347","3295533384340596604465346018013602551881861893498794970313069368600968766409","4549806302643127256376053744839835469729529127535077121646524402308295761124","5836322900178474894684749559174625794931606932780001961547616477680042620058","7986666009024332686676662864413304092722307894727965157582073398188685188596","8332725882597643046230446607227878580859441724564830732217655474732342787381","13605376995820845471499102796322549845207296468035227481017989756087418839900","12155172322986237416023663042004942352608253176870958535098713267207721181883","18703989514997223432661641229861332310348080898339160493229575272467603319271","12144047841603136900258834238679736103499067068658592153906655837799171705427","11964978685770609938104516880584559743324134082109819132572992701951308097934","1336458066220344521262880797524303149688311982013949559764047883761889898074","7567096820715495523465831195561335361495276610103173418515651874250913956034","16698515797824680501871676266202253211872118899888285886412000454073141450701","760526239526750316156895532664638087659951808341490670841188720735038667373","17806353473562524209419921489674020711603878477377228029846764687154796899291","13605376995820845471499102796322549845207296468035227481017989756087418839900","663438552256433061576054140809160443818506164632349621099807794702352080693","14057612694744022955506885004102834629754310001978602939456750538201073114431","21536244638197709025858135955699906074571886472797743044193407266270319669578","10940448732886105987570056589646710210974129839416224393729741337643229924295","2483126835964394240864276692792992171095811055349556498083468949709404323305","9612640678039527906483661330640693201947160578570955411180830848021191312999","15613087414575084731294247924061147534041250959429049604445183368849211416480","16411233008444850443854175483761516668813055344878151975436424201109266465436","20350757034998523187334178209550008366903662221355109911310833181698841320621","4574759938850684302328171377919788556520857555728298495027674689330859913909","1346980346605447755534859795013475283788975200653900831883060614677761712111","14662264414119036690282405601089929177544253624404097884734013101529582623919","5469955587383559828097756439479681402770241102946573149636380518729022833750","17421378063295915427159454374242321672486103038225921418122357124853338152435","11412740120827044021870096407623293808851105071188140591919788265312361814171","7471975174935772955134792946513424637999023861300940920934522552454330255354","13246300932955054699896499534663439333337260302838301416472718244977767210668","1703815020768376381115674913114725195497281256588197804868422201697152023777","3085746588958121678695340573755073635811671969466202529706243909144419544906","7236783279316083836339480995960834633270959028443867776543135480683166923869","13582411668238263333995209483029305625601807569534701653376051071840372484093","4754713757431627318482916888231215818599754770670360377946229107868340173565","4224433012242275812105292037318388809660019851311870694425205064696802439276","3196185115626403769090812264110127828126981872545481387659039004737077237629","3449083258780223991632112868061903902820017044757095982070790181182597682266","6398900866082970916513845909030912477768318655743785125093873617319711480497","1175039218798484980072399121924972057008410392367959450703939688306902524054","5210257615122466358421406540799898540909863599743777249997433762286779163631","143871243170896096761286538359612900806921859208087130133106251324625818743","7825186589955157383712635126647794282971185739134506671734682703198205174921","19356492332655108003949429792555441845806681675195402015185308983898801715851","5469955587383559828097756439479681402770241102946573149636380518729022833750","9301724904566173478342992350770203303162818770127169929361533578664506545066","14144040826170485243395777956417332299961240009335454448818306795274079743482","15106671954584442557442200864211260493785606980074399349847632055753054483078","18869217976653672070772236404509215919650604056214055814018794444287298958040","11645420524832783721170737438334136629636818531954268745339783028025385754950","13439261978972035796996150244149252173133297973805089227133789936712760569803","15106671954584442557442200864211260493785606980074399349847632055753054483078","5512523756717871023776497641942984346783337720501449614794308618170512394669","5835554999819330558954089066526405560740259616473885793288693915684399039377","8863131691935358314236967173935315033413820679736774627121405457433895003795","17806353473562524209419921489674020711603878477377228029846764687154796899291","12688265548305129213524123982283433383136772509110047948234368697335124109577","18207961221628464226564927736506330628717051411055463190287553801949660581016","14776577580296682191308190812580888360497977691535016054206068797647787496417","2716120769329705626706313807317151735273953258897025678161053651818357382993","946455194947827940337729236114480813870835673647234481151109602462556270766","614966471251760438899692967903400348852862620490339206898848861882544111046","4116036656616283014460785251860209028828407967565755603300238819653622156901","10847231218503195759517071138679051602730407167074172266742227045164609231885","20895602419903453398196391913478058693274453903342785067983129839552891433864","15689970856593006158259892732288646993746887463514406392254922588756401796606","7408129850262826909244224402840856032373035919586685754734550738382550518934","16954193412688439955632320517883969169462813275902648614432177779074490622129","10822341224343704549832157601167511762192217681493597414750548578356092990059","18869217976653672070772236404509215919650604056214055814018794444287298958040","12998359993404137434826050598531205936631009536891015167391276398139095697469","712912966757927878965693240425422971881715436008090497769457122872348343952","12439760546784082202871583401234733990044187602943315324169379543365738178519","4933182101183318250560018811514844142859815227384938275570441539742336262480","5519776064110123180759081312729047106292930891845193268609251880658830705433","11964978685770609938104516880584559743324134082109819132572992701951308097934","20852945694892786589706882486760988740184637230152727898060254427102399724085","5157851077382368258831146921235005863841873179959407293372390317913027109941","3885925135313023686150115977607110368258492435636819989794778250027419367343","1632500423430879870300869265124598190896358768919584266600939773214617936900","16480089772180635258030461748402564771495064968752027484874049433567638476934","946455194947827940337729236114480813870835673647234481151109602462556270766","15718330550508436908559701395606414201668068552693146421627683872153427960853","10646102197739219326084794742182482777338903912449154661603058840745258963379","1570274245034538183221128634382794417097801245857820047802724595210806628688","9147263785534267636687968913589685560505104267741632426978703854622278136991","614966471251760438899692967903400348852862620490339206898848861882544111046","5566832184094895187524267067093217754199394279599836592480486864883149893031","7135473937218111453151804646361837547205712024569546168416088861245626015030","946455194947827940337729236114480813870835673647234481151109602462556270766","4087977103445290602464010775212316926483391914870441578758042979308767270230","16137218824867518993112176330612823176216439366022687220615937652371635085247","1703815020768376381115674913114725195497281256588197804868422201697152023777","1175039218798484980072399121924972057008410392367959450703939688306902524054","11412740120827044021870096407623293808851105071188140591919788265312361814171","12271983753113042626833634560364485293486763667349863253834100408006012012338","954361121666374676317512516553835448496801654442662842741750447529976221096","5519776064110123180759081312729047106292930891845193268609251880658830705433","19645303799442917520263849382981918648525479954858046014781621457535223129139","15546540006815490057793129658556841909859473017172875226825092156274503806084","16664225501027310427143425928031114680302400010653769373062555871803572912785","12964734676293244153748554238028206801414195417901916061140401142888712380451","1644637032401895183536122531980635414363418149797237304436572320773189961342","14588408860702774403040643085023102427643318176411097113905533342239652444746","17806353473562524209419921489674020711603878477377228029846764687154796899291","3401355104414210656254289265060762447824858847649022703190474278352208416173","15455768567639248552871867295320669874358209402041404093780654826364925510661","18869217976653672070772236404509215919650604056214055814018794444287298958040","13605376995820845471499102796322549845207296468035227481017989756087418839900","20663699746183765412904432768074062935933374627665221119822945660203712880745","1454875708970600335304126262767303975870655905960512436254375545925577328692","16954193412688439955632320517883969169462813275902648614432177779074490622129","20895602419903453398196391913478058693274453903342785067983129839552891433864","4933182101183318250560018811514844142859815227384938275570441539742336262480","1336458066220344521262880797524303149688311982013949559764047883761889898074","12984040983088595314698866307930588700679289984810017049345447973409490678089","10847231218503195759517071138679051602730407167074172266742227045164609231885","7236783279316083836339480995960834633270959028443867776543135480683166923869","12180564838572574785577178844314834812952191421495899999848160514539788519817","12600480540100512777695577363859185402126112711196993279255107913533806514345","18207961221628464226564927736506330628717051411055463190287553801949660581016","3401355104414210656254289265060762447824858847649022703190474278352208416173","4116036656616283014460785251860209028828407967565755603300238819653622156901","12863950582730082046148154608075135240263800483912187224256340414612337617318","3054509086575963631520633315863182977708152785332183337259997415160907095845","6714269803293029270909153658663808588557387497502190042744619007611526657435","163072371065782787415009910882963726380729563508259100978084406744617596229","18124161608764573031181181091746932116602343523449108232131693108002812215595","17698177298685528128465298198488735273578406532961103401549266592203987353446","1071564318326244075341980988866027669737011601498674724527637774926288977632","19883029896859112110244432872192403645617916717981765942483639413786774824574","12155172322986237416023663042004942352608253176870958535098713267207721181883","19375155383395696510967115781488322005907183312666977471331313827828265655931","12863950582730082046148154608075135240263800483912187224256340414612337617318","19470438559791413810807322334940256814752303267756345670901343982529444306002","4754713757431627318482916888231215818599754770670360377946229107868340173565","3196185115626403769090812264110127828126981872545481387659039004737077237629","11412740120827044021870096407623293808851105071188140591919788265312361814171","21876658378266334569964380224531738829113969654886515172706825001082187941302","9888239978634522925223196837194242311545989047209631150312165940305433080157","20342168169457748695802149508674862964537074611245094862559628187033717475867","6267275553024510648754807709238333654138152587130901210611391956543755030870","14535184095124950892028872912364622595212286520594227957147431032075397154266","2244871586170865025448272825497968057027141766617969218599365252909572535577","3117586190657126472592128104269081184451127080527182054370687640020932637738","18638025629280224617790168906173435277703684091772827588468099812026035539738","13602826144456356860284419687170541618185281374064216815711251835821492025702","19136646515076729474266957823959601106059804333394786210644361751043819130428","4006308849281273792274000957432061207143923231283130218997109288816872164471","4866442763557448299456393930665252678199356968867077785577776954873671002076","5523494911625033531158591406744208675721214018061290251579858790908546943321","14262959519701291686797273506458134133352406025405884284959025726384935370757","15798767315325760489132964686987872692994717940925570238047784420230331193585","6585682031650501777630925238370902100450071127640040426788913175433490518990","19569641468295105160418177740024945517842897645468872356974690513927041995987","19617883112060216036437373002520931262578741557295904537678304364166866283129","20717661531343094401419404535005724208121214979487601078059038701197331043233","15356303677036047765901840442430056519915375782726231750029051083606835464886","18869217976653672070772236404509215919650604056214055814018794444287298958040","19645303799442917520263849382981918648525479954858046014781621457535223129139","16614048991075038030789399956909315351324595917053714063050624141460033937444","614966471251760438899692967903400348852862620490339206898848861882544111046","4099531615762313645664270695169451400067010667159453849071079869270467331430","1336458066220344521262880797524303149688311982013949559764047883761889898074","374196098865630209786313311346578647643865900042267366994874073365518434467","9141525190254519952022341797682038597679704914972221193906068133244136674784","12964734676293244153748554238028206801414195417901916061140401142888712380451","3449083258780223991632112868061903902820017044757095982070790181182597682266","1218928037268356033769144531312651840516937586618523437511091378414585873142","17639609723574756459891329821328819780244585917274648474440537044036944455741","1533174095932179741832085722978096451211273368734335528806856805965059178550","1440944398068243290019815197893325790869382856018839453050014183551865062018","13004204931687393626720102454766944489147659600561337392365246286815729618336","12325315597559743752230693830058397065789541158772176272664764348470516075554","2972653442760058165486608510571475869094354178867521177094553776876904654370","8370264878441063630462671051957262849187564367781659467838460782939804026447","2959389974566411083204235326117036516979963119227951085034972251184734179290","20551785199765572414957755636883446606643894289625551996383687264006196444272","4087977103445290602464010775212316926483391914870441578758042979308767270230","15356303677036047765901840442430056519915375782726231750029051083606835464886","2683741289082249638876005424728100137356381224531970040303109182897410726686","7809308148717690892433475015444256746265555654600319391230796066961179227754","1440944398068243290019815197893325790869382856018839453050014183551865062018","14027649325388708488081280969586205626278814303627295953445422182588276435572","18594403705196476767375145654138028270042663039914897358747063340477738248585","16336411977121389060651610820631824246361165054986934015236391565811657107740","4478906216357891733779320532575007598672127166034590483003103843151770821805","15776564956440002895136116449299582951656581983212117550232796150916571692055","10593196891529840628734555040366549092907275204600028371924840487850448911826","13602826144456356860284419687170541618185281374064216815711251835821492025702","13183232877692246822590812126633640676351230654681431401704678854597307073741","1143725056710957642097279233815583467630238769694555684003566733048000751701","21536244638197709025858135955699906074571886472797743044193407266270319669578","16118914885963834916174025584295786549597018616252080891215345608189775067017","3085746588958121678695340573755073635811671969466202529706243909144419544906","7471975174935772955134792946513424637999023861300940920934522552454330255354","16651609932326344885003930002640274787869059718257297617745634674345809614067","8863131691935358314236967173935315033413820679736774627121405457433895003795","12233333935383563259381899984287101540154684128978249282626058445737562030151","7057969325794614252651980473201258184026879446024353453586952048006174273183","8177887533556223950928671845738575508418213402039951309409853690924708882619","16336411977121389060651610820631824246361165054986934015236391565811657107740","16391403911439019484448973048634108295486984765667310507956782776900193019857","16632434695136893331490691565954322107706581064802120383393065446949358038261","7532552732354833964818948844447124010555621930545046129036742684162649680796","2959389974566411083204235326117036516979963119227951085034972251184734179290","19375155383395696510967115781488322005907183312666977471331313827828265655931","2683741289082249638876005424728100137356381224531970040303109182897410726686","1071564318326244075341980988866027669737011601498674724527637774926288977632","4688608777744900238376640178893120441686955058686461498962807904713059186065","14862128476161472318832207576059761644997238747584253112211006461966427732368","14057612694744022955506885004102834629754310001978602939456750538201073114431","1570274245034538183221128634382794417097801245857820047802724595210806628688","13748763105074593620013986383045781773296715695306976461248290420913969610259","13079036262723496487062341719232498854721623596427562123822257284722043022380","15106671954584442557442200864211260493785606980074399349847632055753054483078","1143725056710957642097279233815583467630238769694555684003566733048000751701","12271983753113042626833634560364485293486763667349863253834100408006012012338","16651609932326344885003930002640274787869059718257297617745634674345809614067","6267275553024510648754807709238333654138152587130901210611391956543755030870","17018828663094797750757032992805443165559600645338019797634595027047317699068","13826842810792073443336072469158777368557028423710280480746021228332338112849","17539019008906665692358401403758991639375357012882690788487548831749474497244","19750715061039895092288075649509657235159241403400837501090850293666251108617","15776280343411227095808521568994471614057167432416502119979098996603887292938","19356492332655108003949429792555441845806681675195402015185308983898801715851","16118914885963834916174025584295786549597018616252080891215345608189775067017","4224433012242275812105292037318388809660019851311870694425205064696802439276","6311168126082531220851145980238852866031091078497507817682388947599504858069","12439760546784082202871583401234733990044187602943315324169379543365738178519","12385792108167898834965686312817629786971321080122734283967136719015404659574","712912966757927878965693240425422971881715436008090497769457122872348343952","14506356872966117174131859847846372170262756655915924664237877294288585233653","7135473937218111453151804646361837547205712024569546168416088861245626015030","13183232877692246822590812126633640676351230654681431401704678854597307073741","7033259621441273379090690993518324745190856903793390519675567591730089293401","16954193412688439955632320517883969169462813275902648614432177779074490622129","18638025629280224617790168906173435277703684091772827588468099812026035539738","12180564838572574785577178844314834812952191421495899999848160514539788519817","13582411668238263333995209483029305625601807569534701653376051071840372484093","4655594634855844188499094340496759182976213206849235604185854128079411962453","8370264878441063630462671051957262849187564367781659467838460782939804026447","17496320222604434917256246718514403734235740171188912286919341525891256570713","9141525190254519952022341797682038597679704914972221193906068133244136674784","21570485471295626790395474884741704872769989979943302238757938053634431270592","14214179218791945815971672263715227174014095422524111075841145981660259478464","5992148578777868893458748144399130666011631987544731979896999269126511048457","11275609334870619778800915975797190217946752952900097800029716348347769743557","6714269803293029270909153658663808588557387497502190042744619007611526657435","6221105771699561812227612915438412791747103897962033448670914370271924677164","12249836732564745436903455221618799619493605772253570453747572839223832061488","1493819599258016045339110999235422917168609982262840449866816239257578013153","13682529409340978640466595260264374070197250456280851982310079893206859446095","5568143431214976639464768845659406494667053581733825380813024891527928235568","13216746424486872049443607565713997095923431379037310625593547838968801990450","12180564838572574785577178844314834812952191421495899999848160514539788519817","1346980346605447755534859795013475283788975200653900831883060614677761712111","10782746953492500078751030180163064462657489179646951793154413574373371915628","1570274245034538183221128634382794417097801245857820047802724595210806628688","11118678586223256967063779327106075185044005359468107273605978537625172540996","9957269699849018786420105364721112375750180716923816099920663920684273075720","10286727453332438406648583236643277009562092681643525436851770105870834802875","7986666009024332686676662864413304092722307894727965157582073398188685188596","274618135907332659550125464790981847888019268634834758638296553463810383811","20131832673266427475769741534309108541338301173662948074665588100934145363162","19750715061039895092288075649509657235159241403400837501090850293666251108617","11545919418828350367784519368633485476721293708396219560182357280822873453096","143871243170896096761286538359612900806921859208087130133106251324625818743","10593196891529840628734555040366549092907275204600028371924840487850448911826","3005814121577142321238773726823845968144595752898226988876012545652019094241","9798324625310926002331408522163043190724749435063160272808536376189654148756","11964978685770609938104516880584559743324134082109819132572992701951308097934","12519200710540274443987348735978102700747472530155480989464845837532354722845","9679676316674197446267516028449539668288990002440917773972518794977810420407","12519200710540274443987348735978102700747472530155480989464845837532354722845","9957269699849018786420105364721112375750180716923816099920663920684273075720","13602826144456356860284419687170541618185281374064216815711251835821492025702","17603178439634188462056825952489860474722953595745235452510670608903852152095","16651609932326344885003930002640274787869059718257297617745634674345809614067","15950000082544045394526115523741159615348156864031044224172890462894241606231","18451742809683626507365133121132299935287207259245734910631591678742738573305","15214427790517490141925325587797963249335567355213168373025412405634050937481","12600480540100512777695577363859185402126112711196993279255107913533806514345","20895602419903453398196391913478058693274453903342785067983129839552891433864","9306117694572387027262464048290209213167312534461525812720869427821619086590","10690633522035360601031737428400068881001718255130638825096194976708724866144","4866442763557448299456393930665252678199356968867077785577776954873671002076","19108128352145842008548048053308217665383455218276209300064989051535526150757","954361121666374676317512516553835448496801654442662842741750447529976221096","6714269803293029270909153658663808588557387497502190042744619007611526657435","19265929620982371511819161020399302006822082297986006761385196152068883496437","7532552732354833964818948844447124010555621930545046129036742684162649680796","5649801951154791837665343131813310668539151217466670556566164087328114632489","4866442763557448299456393930665252678199356968867077785577776954873671002076","18003950806500496937907532373283544753235688820907806692295042001546833965033","12155172322986237416023663042004942352608253176870958535098713267207721181883","6071932171386993614931179655729818150534845046202199448265558256519848482826","3099260939107709193833554073787772569345965287506676970762153917208260772189","6072598916249169136908315542430764263321939399814654522032874918790340778554","19569641468295105160418177740024945517842897645468872356974690513927041995987","17018828663094797750757032992805443165559600645338019797634595027047317699068","15776564956440002895136116449299582951656581983212117550232796150916571692055","12042091411871087770321928117714696325647592163332119499975682262951606830326","8177887533556223950928671845738575508418213402039951309409853690924708882619","11433874323428772158013095381623924200138375055456955808189877801771380225552","14535184095124950892028872912364622595212286520594227957147431032075397154266","20046290436659560311648463454245918246036175981027749522810979896203323505017","5627116488283442946557217209333347313412518163016066550539282920861053074060","16480089772180635258030461748402564771495064968752027484874049433567638476934","1194604146042048350003512364693260099917768421477389239935129766419846021985","1218928037268356033769144531312651840516937586618523437511091378414585873142","13202400967998975804928062759810694884158416475176357116907186595278657876313","6311168126082531220851145980238852866031091078497507817682388947599504858069","6795208382791933114735572030062093331533051902721517159934364925403853532318","19936787863437503780283518973149089110020946214555834613795208847908690099190","9377958456884255467194088716477119239642797045077236472356953540022684583149","15123415314399351471075303556718608687323785898137080424470982286311735782352","13370115598260167633113987566372148589924273398862423406100474476922447871102","7135473937218111453151804646361837547205712024569546168416088861245626015030","14262959519701291686797273506458134133352406025405884284959025726384935370757","13025268118387164480802803485697296266258675734062176433653116451463846209082","4624094547626164902101572852723507795056700722159656748629760282341508155551","4224433012242275812105292037318388809660019851311870694425205064696802439276","5836322900178474894684749559174625794931606932780001961547616477680042620058","13908465977240917608897406492241943260778588976320614277228337961237626209809","2628389834360132333366589026387003814868457686372552787974500759887369913155","11183511759577952361572566673527592434184886344484272921682811575415051015276","12863950582730082046148154608075135240263800483912187224256340414612337617318","14262959519701291686797273506458134133352406025405884284959025726384935370757","16137218824867518993112176330612823176216439366022687220615937652371635085247","18707594353877082516395132272698629627555807696619350634836774054442394671010","15413262379943851680637741226631729175616759345996754775627005612359539596292","4116036656616283014460785251860209028828407967565755603300238819653622156901","3099260939107709193833554073787772569345965287506676970762153917208260772189","4624094547626164902101572852723507795056700722159656748629760282341508155551","4420985155765749198917158320211243542858248750314567273670169360313609199220","4781857348503260904895922377303003708601361291248025972804843818012461675526","16698515797824680501871676266202253211872118899888285886412000454073141450701","5519776064110123180759081312729047106292930891845193268609251880658830705433","6540725658063818695836967143056666761434297658403942276316050979804587769432","19215132962371868093445083227022064420405266792249240035116240824526740725800","19375155383395696510967115781488322005907183312666977471331313827828265655931","1175039218798484980072399121924972057008410392367959450703939688306902524054","13748763105074593620013986383045781773296715695306976461248290420913969610259","15976568257028838086904371689993285445196617581672212770040719579976951713437","2731702758715001559265750806008384495080551892515362156357977538139860974530","3133838166556165943824029176542597440374447246137252468511956694712122940530","1354299594199717859606388533670792913672908168692420372657948698842311093857","10822341224343704549832157601167511762192217681493597414750548578356092990059","17018828663094797750757032992805443165559600645338019797634595027047317699068","14776577580296682191308190812580888360497977691535016054206068797647787496417","18693317710730212151208513181186966573996077028828882441479768956833225751022","17492490034871188503809070393464727304143828491765350693224566925126105199911","14172013427642179266386805494272960512005525394680301845681753498295255309908","3607534072804388173311745844584795163913258697339304886139614455491456047872","4420985155765749198917158320211243542858248750314567273670169360313609199220","7815052247860712154170106628650576750781240048309328607812510735568644480099","9277147365456707051192593343809527681573500829831413326738310307567850123829","8863131691935358314236967173935315033413820679736774627121405457433895003795","13439261978972035796996150244149252173133297973805089227133789936712760569803","13051815778936294959186188778209982533089138172215506637927986094620164817648","3835902309964760173432611751283380612399529168609044921165087497368685977916","13202400967998975804928062759810694884158416475176357116907186595278657876313","15214427790517490141925325587797963249335567355213168373025412405634050937481","2666549942988803296757576401723478920911340699174408059253220554211642279978","16122380779106962898741444352984715606386470429041317890034930229550324363289","18594403705196476767375145654138028270042663039914897358747063340477738248585","7796937569050271278342402836188937027242003149541526098037517748511185180620","8140644209065967749731539711645757673629321017919126168806710308878873241272","5992148578777868893458748144399130666011631987544731979896999269126511048457","3348432210747515061385037490620056224077503064341935527160366063098820102327","18566222379922364157274850150988399654533738702075332376935729247934165563869","2476324937951789382181944025361875851099988750579823474754609765481889757439","18637620888308371607611642373870554933712342468791368368498810637591710912686","2959389974566411083204235326117036516979963119227951085034972251184734179290","20227979332701217082249100988795416872480735366357703927751699407575642930935","17368028902269277465024746642764987612414033705161996149238721534130490186941","16653103879864200321986465966316889764620013245316877484022986374603264725648","16118914885963834916174025584295786549597018616252080891215345608189775067017","5568143431214976639464768845659406494667053581733825380813024891527928235568","13641582444261924898950561772071287900110836262790950814969623169365632502460","15546540006815490057793129658556841909859473017172875226825092156274503806084","16961794929940055505618937273665830834556517799613603503371462732255229717698","11964978685770609938104516880584559743324134082109819132572992701951308097934","14216993731814681619137662595321398279415990565678023063177228088649900891505","7815052247860712154170106628650576750781240048309328607812510735568644480099","20350757034998523187334178209550008366903662221355109911310833181698841320621","15045123937812306625997417665247004551483049589009168687548501235926225142020","16632434695136893331490691565954322107706581064802120383393065446949358038261","20838188000013629937954971368567014585342187321412629930028751871743338652961","13545244560072730176162896504690392106112168077747273393293519829141026712654","6765546767316775630226434304243025099044057869188929458111914505605517807492","17018828663094797750757032992805443165559600645338019797634595027047317699068","18820995668034441064481786413532066855976405414499761311120499699159123037823","614966471251760438899692967903400348852862620490339206898848861882544111046","17496320222604434917256246718514403734235740171188912286919341525891256570713","18637620888308371607611642373870554933712342468791368368498810637591710912686","6540725658063818695836967143056666761434297658403942276316050979804587769432","1644637032401895183536122531980635414363418149797237304436572320773189961342","8461890310516914992976016102786941165050457592527945955052989873762315959085","21591247897428723764785205441739843186077784027717063974489303352320972773514","9277147365456707051192593343809527681573500829831413326738310307567850123829","13004204931687393626720102454766944489147659600561337392365246286815729618336","11398194787838497782166425813926171378663319996243937443066049287231892201563","4006308849281273792274000957432061207143923231283130218997109288816872164471","3885925135313023686150115977607110368258492435636819989794778250027419367343","3054509086575963631520633315863182977708152785332183337259997415160907095845","5055315503098445594062335518727177962919913361908453398984787599226169183337","8491224372742742395086082981236389730604525807576141462195229766319454932167","10593196891529840628734555040366549092907275204600028371924840487850448911826","5519776064110123180759081312729047106292930891845193268609251880658830705433","20750786466099303558578845860831937634908544617912415565480052280769840150510","15798767315325760489132964686987872692994717940925570238047784420230331193585","567433434521112381841206540791234080742279927287516260853551410281774875712","16391403911439019484448973048634108295486984765667310507956782776900193019857","14057612694744022955506885004102834629754310001978602939456750538201073114431","17698177298685528128465298198488735273578406532961103401549266592203987353446","14506356872966117174131859847846372170262756655915924664237877294288585233653","11889745823596890789749077573846619853793479538535474896498174482741572852641","15976568257028838086904371689993285445196617581672212770040719579976951713437","4624094547626164902101572852723507795056700722159656748629760282341508155551","15022199219678996727354667799147374096361570599067734481207390034887749042083","8461890310516914992976016102786941165050457592527945955052989873762315959085","3054509086575963631520633315863182977708152785332183337259997415160907095845","14506356872966117174131859847846372170262756655915924664237877294288585233653","9296362220804925104551234752226384203979024033236205671428676015277866160513","12688265548305129213524123982283433383136772509110047948234368697335124109577","2903328500810487887284040113540254258409278773721503335380406605532748782645","12271983753113042626833634560364485293486763667349863253834100408006012012338","17744796207881002836361754172345756972108243302293817629307470887005013537965","16954193412688439955632320517883969169462813275902648614432177779074490622129","2666549942988803296757576401723478920911340699174408059253220554211642279978","15689970856593006158259892732288646993746887463514406392254922588756401796606","2666549942988803296757576401723478920911340699174408059253220554211642279978","6307025001981604557276095751477581176989559254288853588059732891819079685284","15106671954584442557442200864211260493785606980074399349847632055753054483078","6795208382791933114735572030062093331533051902721517159934364925403853532318","8082817983718546987105551276971252463934917335856558917892075900846966350585","3607534072804388173311745844584795163913258697339304886139614455491456047872","19108128352145842008548048053308217665383455218276209300064989051535526150757","17603223305375528970110710410175592504507901335489871100398461389444688509102","15950000082544045394526115523741159615348156864031044224172890462894241606231","17603178439634188462056825952489860474722953595745235452510670608903852152095","13079036262723496487062341719232498854721623596427562123822257284722043022380","4574759938850684302328171377919788556520857555728298495027674689330859913909","5836322900178474894684749559174625794931606932780001961547616477680042620058","18682912995789016595436882433435139159334702280353629213700041190405671371221","18682912995789016595436882433435139159334702280353629213700041190405671371221","14647299140966795168634863382011786101084247791740654785196548451662948086183","19265929620982371511819161020399302006822082297986006761385196152068883496437","13051815778936294959186188778209982533089138172215506637927986094620164817648","16226984168490080400263373201570728966749962184950889718917387268203884202372","12688265548305129213524123982283433383136772509110047948234368697335124109577","4592739379790743343042028868384342794596363702987579215937879797639357089011","4933182101183318250560018811514844142859815227384938275570441539742336262480","12519200710540274443987348735978102700747472530155480989464845837532354722845","17547875379231708590555723879540779728666475590929028917859771769395698401715","21219905789358323534478545279193723251420616841556623254711235028135342626157","18682912995789016595436882433435139159334702280353629213700041190405671371221","19617883112060216036437373002520931262578741557295904537678304364166866283129","20342168169457748695802149508674862964537074611245094862559628187033717475867","4420985155765749198917158320211243542858248750314567273670169360313609199220","3608626711809097355394527544415447989465407554113965209630262872975367728702","7986666009024332686676662864413304092722307894727965157582073398188685188596","17539019008906665692358401403758991639375357012882690788487548831749474497244","17496320222604434917256246718514403734235740171188912286919341525891256570713","4655594634855844188499094340496759182976213206849235604185854128079411962453","15618359152517208456698312197785172766694127619077536561902714697931530755106","13748763105074593620013986383045781773296715695306976461248290420913969610259","20131832673266427475769741534309108541338301173662948074665588100934145363162","10690633522035360601031737428400068881001718255130638825096194976708724866144","18594403705196476767375145654138028270042663039914897358747063340477738248585","12998359993404137434826050598531205936631009536891015167391276398139095697469","9141525190254519952022341797682038597679704914972221193906068133244136674784","14144040826170485243395777956417332299961240009335454448818306795274079743482","1570274245034538183221128634382794417097801245857820047802724595210806628688","13597601271430461916896612582648919742272715556061113046784825140314498905478","10286727453332438406648583236643277009562092681643525436851770105870834802875","15710422838883679733600834907476906094570753444844580151730513642276654631674","8082817983718546987105551276971252463934917335856558917892075900846966350585","18703989514997223432661641229861332310348080898339160493229575272467603319271","16480089772180635258030461748402564771495064968752027484874049433567638476934","2967213245998332384543885104754783540899439580884490432048984202068901705944","4655594634855844188499094340496759182976213206849235604185854128079411962453","18637620888308371607611642373870554933712342468791368368498810637591710912686","15776564956440002895136116449299582951656581983212117550232796150916571692055","5210257615122466358421406540799898540909863599743777249997433762286779163631","8691474413369666750892234614358820289658368726857552974633024543804680298964","13605376995820845471499102796322549845207296468035227481017989756087418839900","3196185115626403769090812264110127828126981872545481387659039004737077237629","21591247897428723764785205441739843186077784027717063974489303352320972773514","1194604146042048350003512364693260099917768421477389239935129766419846021985","10782746953492500078751030180163064462657489179646951793154413574373371915628","3885925135313023686150115977607110368258492435636819989794778250027419367343","20521411631300308681277111693281832014010918653298260542960102164696238242229","17582818757173661762314072926867802933652214827993395929831324522299049413904","21780456150575058339898563710498965468972448244984833163147655946608027181634","21591247897428723764785205441739843186077784027717063974489303352320972773514","8491224372742742395086082981236389730604525807576141462195229766319454932167","156542953578700199190349883532041470160708612831113224539973504251955528744","12519200710540274443987348735978102700747472530155480989464845837532354722845","2544185200680176111354240446924889864706979425265095363625611785655132613870","14897910390493117493085561230943786488745018480007968413736887385270447651383","13051815778936294959186188778209982533089138172215506637927986094620164817648","8370264878441063630462671051957262849187564367781659467838460782939804026447","3986804060834622107770115616180027696529168594693106325651227138002220680218","10782746953492500078751030180163064462657489179646951793154413574373371915628","15976978918004336355901319629352200911328902990447017277673724626919242812955","8328030641700015547962729319084004225083584314272156382022742953974692359024","2476324937951789382181944025361875851099988750579823474754609765481889757439","2476324937951789382181944025361875851099988750579823474754609765481889757439","12155172322986237416023663042004942352608253176870958535098713267207721181883","17603178439634188462056825952489860474722953595745235452510670608903852152095","20342168169457748695802149508674862964537074611245094862559628187033717475867","4688608777744900238376640178893120441686955058686461498962807904713059186065","4420985155765749198917158320211243542858248750314567273670169360313609199220","3145275707337847188939353064357731848534516166917140907835781738084777990262","17603178439634188462056825952489860474722953595745235452510670608903852152095","2235150263865959136421726440400433738501848129328010009098035293276672220717","4549806302643127256376053744839835469729529127535077121646524402308295761124","17492490034871188503809070393464727304143828491765350693224566925126105199911","18729388765252309558574413425774793050225406365031444286319123071733886008203","16480089772180635258030461748402564771495064968752027484874049433567638476934","19883029896859112110244432872192403645617916717981765942483639413786774824574","5836322900178474894684749559174625794931606932780001961547616477680042620058","16653103879864200321986465966316889764620013245316877484022986374603264725648","16698515797824680501871676266202253211872118899888285886412000454073141450701","12233333935383563259381899984287101540154684128978249282626058445737562030151","274144820678452421379816557330510579317549145397331786233749585417771792945","15776280343411227095808521568994471614057167432416502119979098996603887292938","4006308849281273792274000957432061207143923231283130218997109288816872164471","15435596047717285113986137313550661564381864970285528104339022986255133148722","20838188000013629937954971368567014585342187321412629930028751871743338652961","11433874323428772158013095381623924200138375055456955808189877801771380225552","20131832673266427475769741534309108541338301173662948074665588100934145363162","18820995668034441064481786413532066855976405414499761311120499699159123037823","10599184745355055122827201680284382421384308407491311763734067519190170881017","12876212902112174796123067808109407354255021515914362771981709565057633093870","16122380779106962898741444352984715606386470429041317890034930229550324363289","6836865286311343609694524245159119133769123287741705285044672797797129131253","21591247897428723764785205441739843186077784027717063974489303352320972773514","12385792108167898834965686312817629786971321080122734283967136719015404659574","2027121307515028227361803453971004574835283397634149795685942874063731877044","3005814121577142321238773726823845968144595752898226988876012545652019094241","4866442763557448299456393930665252678199356968867077785577776954873671002076","20046290436659560311648463454245918246036175981027749522810979896203323505017","1336458066220344521262880797524303149688311982013949559764047883761889898074","8491224372742742395086082981236389730604525807576141462195229766319454932167","16653103879864200321986465966316889764620013245316877484022986374603264725648","5988689769882991468528359729958078604149342871940113378259733314892811441673","3005814121577142321238773726823845968144595752898226988876012545652019094241","3133838166556165943824029176542597440374447246137252468511956694712122940530","11183511759577952361572566673527592434184886344484272921682811575415051015276","15613087414575084731294247924061147534041250959429049604445183368849211416480","4549806302643127256376053744839835469729529127535077121646524402308295761124","16632434695136893331490691565954322107706581064802120383393065446949358038261","4933182101183318250560018811514844142859815227384938275570441539742336262480","19750715061039895092288075649509657235159241403400837501090850293666251108617","6049121453084659222825489908739822792694774158293989229260853547616301268692","4549806302643127256376053744839835469729529127535077121646524402308295761124","13370115598260167633113987566372148589924273398862423406100474476922447871102","5469955587383559828097756439479681402770241102946573149636380518729022833750","1632500423430879870300869265124598190896358768919584266600939773214617936900","1071564318326244075341980988866027669737011601498674724527637774926288977632","1493819599258016045339110999235422917168609982262840449866816239257578013153","12998359993404137434826050598531205936631009536891015167391276398139095697469","14057612694744022955506885004102834629754310001978602939456750538201073114431","12863950582730082046148154608075135240263800483912187224256340414612337617318","21451388112829145060821974036366132513327328641208732802166144524686108831760","13004204931687393626720102454766944489147659600561337392365246286815729618336","18159717335881315589645032086713288496782632932867903491586009514211947568031","6307025001981604557276095751477581176989559254288853588059732891819079685284","1440944398068243290019815197893325790869382856018839453050014183551865062018","21780456150575058339898563710498965468972448244984833163147655946608027181634","6836865286311343609694524245159119133769123287741705285044672797797129131253","12233333935383563259381899984287101540154684128978249282626058445737562030151","20895602419903453398196391913478058693274453903342785067983129839552891433864","18207961221628464226564927736506330628717051411055463190287553801949660581016","16226984168490080400263373201570728966749962184950889718917387268203884202372","9141525190254519952022341797682038597679704914972221193906068133244136674784","11433874323428772158013095381623924200138375055456955808189877801771380225552","6585682031650501777630925238370902100450071127640040426788913175433490518990","11645420524832783721170737438334136629636818531954268745339783028025385754950","12313143896208759390351526641510039095883815550699902043061685514584813600074","9888239978634522925223196837194242311545989047209631150312165940305433080157","9306117694572387027262464048290209213167312534461525812720869427821619086590","7800856132048238285999367318239374829634076893379031119745654756621815300429","8328030641700015547962729319084004225083584314272156382022742953974692359024","19569641468295105160418177740024945517842897645468872356974690513927041995987","18703989514997223432661641229861332310348080898339160493229575272467603319271","4006308849281273792274000957432061207143923231283130218997109288816872164471","4754713757431627318482916888231215818599754770670360377946229107868340173565","8863131691935358314236967173935315033413820679736774627121405457433895003795","12616472237712801953990641170786430111219637655930398736307229893389737211053","14799475491656615059372780774624370709464328674979516248659286482744107230446","12600480540100512777695577363859185402126112711196993279255107913533806514345","7033259621441273379090690993518324745190856903793390519675567591730089293401","17603178439634188462056825952489860474722953595745235452510670608903852152095","18693317710730212151208513181186966573996077028828882441479768956833225751022","13641582444261924898950561772071287900110836262790950814969623169365632502460","6585682031650501777630925238370902100450071127640040426788913175433490518990","12006531986840408977918622834986049589872827010469069694616415380752223757192","7471975174935772955134792946513424637999023861300940920934522552454330255354","15950000082544045394526115523741159615348156864031044224172890462894241606231","14262959519701291686797273506458134133352406025405884284959025726384935370757","1758371485945815703876679445382538767819559386912271388124907980130004330353","18707594353877082516395132272698629627555807696619350634836774054442394671010","4116036656616283014460785251860209028828407967565755603300238819653622156901","18594403705196476767375145654138028270042663039914897358747063340477738248585","9377958456884255467194088716477119239642797045077236472356953540022684583149","14841990498171696915559636042318167569437811173944889089519208821758196118572","20006509131408258657369129395045362318044780385983476979717124299339121586377","6049121453084659222825489908739822792694774158293989229260853547616301268692","5568143431214976639464768845659406494667053581733825380813024891527928235568","3117586190657126472592128104269081184451127080527182054370687640020932637738","8691474413369666750892234614358820289658368726857552974633024543804680298964","17582818757173661762314072926867802933652214827993395929831324522299049413904","21267939098918134027395634942102971885281982111723141238850772621986256662900","12600480540100512777695577363859185402126112711196993279255107913533806514345","274144820678452421379816557330510579317549145397331786233749585417771792945","20663699746183765412904432768074062935933374627665221119822945660203712880745","2628389834360132333366589026387003814868457686372552787974500759887369913155","15613087414575084731294247924061147534041250959429049604445183368849211416480","17174337625009122870708859925793325997946378966416309900853757797594910229791","2967213245998332384543885104754783540899439580884490432048984202068901705944","10593196891529840628734555040366549092907275204600028371924840487850448911826","1218928037268356033769144531312651840516937586618523437511091378414585873142","19645303799442917520263849382981918648525479954858046014781621457535223129139","1218928037268356033769144531312651840516937586618523437511091378414585873142","18638025629280224617790168906173435277703684091772827588468099812026035539738","4087977103445290602464010775212316926483391914870441578758042979308767270230","8461890310516914992976016102786941165050457592527945955052989873762315959085","5568143431214976639464768845659406494667053581733825380813024891527928235568","3005814121577142321238773726823845968144595752898226988876012545652019094241","17603223305375528970110710410175592504507901335489871100398461389444688509102","2544185200680176111354240446924889864706979425265095363625611785655132613870","15718330550508436908559701395606414201668068552693146421627683872153427960853","8140644209065967749731539711645757673629321017919126168806710308878873241272","14799475491656615059372780774624370709464328674979516248659286482744107230446","374196098865630209786313311346578647643865900042267366994874073365518434467","13648236315809483800741231329158534760283476979282874649596812220944412887454","19356492332655108003949429792555441845806681675195402015185308983898801715851","1118279149946874054339337226256428104508684927524794373040609290637664978199","15045123937812306625997417665247004551483049589009168687548501235926225142020","1689709601556268020419125248006910470935068691712645256591639741945971733744","17089513984383051444012804212344078898491877698852637641465487102929365695051","3835902309964760173432611751283380612399529168609044921165087497368685977916","2544185200680176111354240446924889864706979425265095363625611785655132613870","3348432210747515061385037490620056224077503064341935527160366063098820102327","7986666009024332686676662864413304092722307894727965157582073398188685188596","7567096820715495523465831195561335361495276610103173418515651874250913956034","7800856132048238285999367318239374829634076893379031119745654756621815300429","21451388112829145060821974036366132513327328641208732802166144524686108831760","12042091411871087770321928117714696325647592163332119499975682262951606830326","19569641468295105160418177740024945517842897645468872356974690513927041995987","7532552732354833964818948844447124010555621930545046129036742684162649680796","4624094547626164902101572852723507795056700722159656748629760282341508155551","2666549942988803296757576401723478920911340699174408059253220554211642279978","9888239978634522925223196837194242311545989047209631150312165940305433080157","21267939098918134027395634942102971885281982111723141238850772621986256662900","17080170896205579351487820867879098448749980844566584779831865641843648559954","4781857348503260904895922377303003708601361291248025972804843818012461675526","5001232371587577350490476563931715794477203224577970619789108259266886603950","1194604146042048350003512364693260099917768421477389239935129766419846021985","21267939098918134027395634942102971885281982111723141238850772621986256662900","18707594353877082516395132272698629627555807696619350634836774054442394671010","7236783279316083836339480995960834633270959028443867776543135480683166923869","21570485471295626790395474884741704872769989979943302238757938053634431270592","16632434695136893331490691565954322107706581064802120383393065446949358038261","954361121666374676317512516553835448496801654442662842741750447529976221096","12998359993404137434826050598531205936631009536891015167391276398139095697469","13004204931687393626720102454766944489147659600561337392365246286815729618336","15776280343411227095808521568994471614057167432416502119979098996603887292938","7057969325794614252651980473201258184026879446024353453586952048006174273183","6994664438597925475223705340624595897260559921645516609558922687274714825714","4363738634465882118172307854104596042899685656091037340905869811610138317347","12180564838572574785577178844314834812952191421495899999848160514539788519817","13079036262723496487062341719232498854721623596427562123822257284722043022380","17496320222604434917256246718514403734235740171188912286919341525891256570713","12271983753113042626833634560364485293486763667349863253834100408006012012338","3117586190657126472592128104269081184451127080527182054370687640020932637738","14841990498171696915559636042318167569437811173944889089519208821758196118572","3814718729516245467542823378722292629370285860606484341016365565551107845022","15718330550508436908559701395606414201668068552693146421627683872153427960853","4574759938850684302328171377919788556520857555728298495027674689330859913909","9612640678039527906483661330640693201947160578570955411180830848021191312999","12172459979594272836158443334993722622077942972483988133675801482944682547814","18729388765252309558574413425774793050225406365031444286319123071733886008203","12233333935383563259381899984287101540154684128978249282626058445737562030151","19375155383395696510967115781488322005907183312666977471331313827828265655931","18207961221628464226564927736506330628717051411055463190287553801949660581016","1377808171643922006954160722747273091529243940371945604197417602736009363523","14889586175325483443041813226686357400339931463122742842745317460691290784136","9770821889969753026439714135746557936968725073065412883354694679382717123968","3768167068773898722568469507920346701450511503268567897292049941704582796136","1899628457317453197426768456858589983666227401303606152877725712904770786388","4491805913328638367373022803345382207852016585780535879187833668803311933436"],["19444847062288131493943706784497406601211185688116273754131863169092610576967","6756357644703883372382000235355183123582254014035599689202182239604052730084","5834963883005519863277737060862183242422193207910302638450418995361988638650","14630532141997277216138304497310196564144668507296424668904559464853731825529","276005601789737429160222670723919227435048289882730462426149086438071032420","8155169592408501114771949260607780658108674298838155446397409772814142490986","8496173005628286226067567535490313700679832176191507650779467185231469190908","18522758669123103820765651383058550163152440728027329605661881000152433829894","20717160396907128742447930491661507548527901200271695593644376944470624644874","6783400954785427443777419190369959791457729235323837312105292689987925420262","15793588416019429949037560428655750893129153960665891892058368228751095545231","13047857333849170739650468523722679452310178134682835736334331719537030864403","13702952651241896077447912135262631109194634993417767336774463460551430174591","16771524083619709591205953781761522848915592462004352344297444083327000335914","18362879251176766534772404056399418613362042401782184697324682721000341441514","1921169374568757279790536398590170773520268712196928601546829626342058380013","18007271086827148118702779138045717036566051534448069739899858280155274498416","11677788058520437899562086139134738123234096436757857524455227202665943485909","18567835086166004190967610331516651777840850520761110277224875363942309193033","12549862092815494374468253271773435129600234325866279388210551065809722236154","12545772019827878627361160408311538713526252988913811675565306764418681013019","17790976380038280976988246085058593967622099860594622912213483950365513994179","295342049608542310001266607810723788606908957088698225682924285077522343374","6042881253538576878797032051936765585731381049990189646390895524714385119979","16177540255744097871521288192447267851650838298325801002101754584177258351542","689944521090171958642896246746378107452915085681977844021127122085860793418","21806600652809306442934150151527166374544123717499224666056071691980718320158","10687999924804520822721645773635035131067056997636998429204051086244451458352","2919688173439697460443732931955910957668633676232388974155373692008001074942","2088428214431812495479622929730813017014992498691761094277448089379469403302","3415582465565312695281321795946675901044043725583982633056443485871119407177","11432629911071490835626964427117253752817170646912779324491272989814675105631","7810232533291842805873821935461788355487026463002760576510838277131727012637","15850563248943823248196314184730972664098169701487536058299754250660946727661","8728976634161630217358665668742559554087067616326533741880426574160431347132","15547734297253509235806418165603020662298589957875421913304005171944398984391","3158249123091915580481792507317767452027547932247936126792366337689584842781","8993351209143960585970304728524607023340419549878051384852055190939357644360","4916077676642951295302597643655156805863813630504586598619800437364856520347","15052050566960149294362189709830107098243646295893587902102267385191499441867","7150859141970623502564908412249208973629105197031357581428846816632024424773","5659463774436746876994077967866722465283824187257515817896446525143503038229","19464498962894958485813692012599931383997188482601571850575384753467351286244","15817240123388522852498302303406312726664688503153075471764110095076928497826","5302571205101485049626764959256598947375033298608344128379324163720645334410","20692740934715863051898617710088924214854286115389280275696778859743980624203","16121180084056885385768374518937623712121773918849607938195591718986083243748","17449335744171334550114352347521422770517337704382637045934115518315313519219","10253291411916249149409944484940846312189907495150544356013969086126665142627","1075989933051112270479502705317054499580865741297076182284940703542006602757","17496779585745191468575660181265060269367274078653980290860692264179679950345","3538122871871015265597356999511771252266082849566808379976323073541018816059","7579486643564421792498711360748450541290817800587156287997063934548078067430","12729453322089802294380978481733715584931031070971499485676879773953031357372","6694633370369966210102257937726749959486994134264582443016638266185985910723","17623873916481672691654892260114036685248130649477279788335331445450611897752","6307701910454308121209261684131709903162842155523511946468120801525808144713","2490437230848135899340146974626841790838141435966177610519877944111227880794","5017798776934405523649599878486720454877889960063314088092139283965398786505","20817420597532209277094254254011796300596270364114901508622090395551862021369","15258825807346731106480585334099109914680431439052544107298794895009458789849","436207735379833515948816288186396517305806158675320799296446691642166338508","13294452063087597313135368572465579195169503832488496277864688043228247847885","5281958238296057162541008015360609066403026130630047672176591872125940281371","386042965256259984981370670464051577241496612285005807238429392957903257172","10942243549318138624734474054079356060390652679206672396911330609350570685574","270406167611514320681193466529653886068620721651325372569688862100531780060","21769039780368018587024190597032828628077779629457595552733479023564952366755","14257848362862950978758226475754708328366569815134458955450406250786029562719","20675103741730086975536120126603499078928196755869920413190380095671818551245","4092670173605738716451085900386063604788602581706203170812942738120506696245","15831649561312402734198126328637255008767394666669354210368241338558776960189","8773460264964044836577029971056134181700063958452992767868071607709089255261","15969366571969091014788118571658462634361656562903319995975427897452380798450","9090539943906640916226800382217696518430261301435146060171359093957899579442","12598966212710420863490627175550230608849032996842656735190850410879434661800","5082369006304868528209185647948375467679404699238424225315402327829344882479","21232583620520875935273928036429179339733541639648304803699206026350761939727","15216028261411784444168994831958830734443664066057913354546359559245244924050","20503252723414965832541668822746284724979697942657467137170476075965669970069","7028702238870184282283447120220627544268950018331505390418179769944671024747","13914367585327187338201419330215996326176015243409712364994147816309186215349","11972191955486214659980933122765802430687113190375208665981572404973523390750","14164313126758634946487037847698512982901341175183925669745949763512995563823","19643507624196854874403818379994773749775871114166053756059820550045254990949","6253019705251155387518897830821875987387745060770031720935150387804561656767","12614772411624778073372124421221342091038200351899023491707175227213282820386","12799054234177807811763785306399761459507163662627299853945472202258817984059","16298413623883813223145205496435140924571599757753789623615680953320915107823","8610548149652073334956208860269106926096928271670836846827000353008597438642","9836284514785177186880347525497271134591015465315721313213772552563703130511","9784976878800158500585413974169708349867742257336666799769685612736807878718","470868555320390516869442830897247668225662850353632628471628589894687191840","17307217182098561598390477407238405653820260056045707641305128326328073989247","4674116504957384653684422429847190124325067762798863539680591567775099711828","4731805738765155173300706694658606612354279416357285157979268772012947617710","19408369527037425408359080120949793991326211819391999900817736764475384891087","18547195232973238597820755220571190923184148106985108846845816471997990813451","20764687130261902672266922992036714570336508922412884145266283492627732623055","19892377301785347591650272014822981146836631795074611861111907754644416903635","6413734757240628076834626843107147847105076965920897092716625820251267566099","20860174097442586122448303694433017965295045714190140568637973811484764859101","9976157929114087350046280965312715789783677114993652036414680945525100911346","20443284379975649347549376624760041838634895555678719470752881701519661070489","18893870838626114784034800186442840105625315290994458907142980368089948593544","11133903488642571617254269414928956946413436570602781254462926700298981057101","19260150650655385130131812830419214817760729375303617428649411135535896978281","13461732242206018780892854302161037532643049992617159415492401398338285247555","17102228736482758300705766391088892608834968842141194901502696136509842518851","12272871719359531993455999114365256014273629799700014768301209571123981371707","3594207022562239110254525411112455614396088633713917231917804057840385838433","11285761004669862352633286679979731173931391709324275439550892089674658948897","16102568806633415123079332012340754062427981513856504035688871887957095441264","19519597368641109872437527694712863032289967186787139583473763662663666076515","7850893600020675091200117628857569397261111640016750677979107965392238148005","571603306174340121900401663556670083480079944829773014219141824601049859366","13417234230361968064652407531174824869916389080577175614370178295183391972896","6339479905118967532949951465214069151191196402217454265147854834540663125252","5960266217431370639351267159124277446305252772759082083832329486288316249467","4827913422416492916492150995943144270796495141536283583210133173575222257256","505835591148323979694388175613018554712950286622892296281531129078833207836","13430162365250371418058587486919957187505271111954906160838200205517866181347","11791683213979729551370231161842890041856917089671010365556092948261209641299","13878734884084908403388117942446409924859492948402374543903835601747661416301","7914593516489852442626571171726775738811006144753811688169867990351813492226","10797302146436138655457419302923103882636832085380740614686862737265867963715","4394985227939438982168027081286727479189710464482074036154622396987481104200","17846370028727001276602920123596000650348888091372292752624526729964991577650","1399592710245988806733110276286400825565557403052909106157835149189269504885","4480510739831473990116609789595044875609739639498651344219709760264319707941","11004586942348048001456673131635437257298168527005870798189423435197580585412","17257016484028305690607802548970527681899034872857606356645268286697823560745","15880272219577681239503657424149468083362971750716603748729669119492924589385","15904554418638709990040031800946465318235842277305545433558322594469065553553","15434974732418275887764997429917488815499533240877756132902224733577879415473","21820168018779047045619488779286049910110834277003434094980989418536264599715","7749008375218427634588074063863812252051333204096406815453992945864441895362","3839511695466461913195739285494941868041132999203534272477982111080050006523","11192270025434739945085840100702117964637847488690757055208388489558083138446","7139432526479835672329459147861644569732921891281014828670035430783917357856","13194122716181797306702591509497059325803038795351433491511874742185743961578","12249486681620499703064189091192752491339675300250225642057366857872815164391","12751753758565217613271991442671268614075299410246481820732282132452214741118","14152899301351110068123785825973380466012981712532341785578761964446295185434","13188569584536274764354182121465196242988977215787135260110602036659203482271","8583058680448359031190112033511783279444748692566437598204669389441269594527","20739303906393962278673616858161941640788810322708163071371214143202505636285","1180296912375731347768428538731067445729945471280254724677426248781662325181","6017789428689615319791053684659036780814847053654130311712769439159937889609","2173620618321392312337995148079704379859037528218619197239932038613399941589","19342061241883725191788390495410721837582278801952815468188667976311290962368","11961293118976486325969636275124778155072321144934089356127319435440178254418","15003950077727351663111929517428911404929041518452601562597474042673134378445","11722551667664037124885783671627704449310149868015743702657377612966423359961","1589112258505679428520003152962075989895613700798393982576451871741579895537","10237533647542628466819493835368797714803583017400048476478599541985305410468","5633483783935945421681172594360251312787053845387155338966168908591309720937","11524348046498741796559712688153551628725965921178062387194745025875547122301","4119351785672815550070213600551390224338330329829235301635622400744195777997","8220379217788713766164367196730350016648232008308605440647920160713746282775","13638223826667319442473592100092923906983786522766094318050487349717540347281","12855479012377423286653672887817339438150952573187773204679381183748640361953","18366449890796594374544459463322936541588534912307972856193862784267127118823","14831494193189198695462931146064274924011201974477576494408974317628024686185","11093306658789847420019060296285299107442543903230107282402432370912267955583","5231748467324162438135669634394990945005973450791245562369389835255116288637","20334409444101673859585989946641575861192600463100161126574009339834336019122","10942950770398062877133838468616134250348068685639337507689939414774241938827","21031737058468102950077505705229155312762606827754507238965327181803396985398","14995690437383350976947687078631429818437217746718268679299515186473891812908","1173662311857265316234231482479000224594910385121353149729453581304925842874","16317128331316988904656774031136187679889289360179612223631661201288928381507","18022252460738403017955303125247197991330411362748880642725885324976196166640","8288649066280936236016549066415276935462595711048345269972110782845103139499","8101426167425842649552999897331966976546505505184628823541554176858292445739","19821753079400865197220037270302986474791903810187177911888698563958948917390","2784180484916863460671428583402451895733388047312540417328482549247889132480","4344349451137697568800756375175722014382670587070900626206184353193889614535","17108052563527778392492084240217991568486546407558042288984049724593379381422","7485356603493015640805315156078413547503227090809875264979461763636775540173","20116242746183168873263923842229951811573923370432089711294380935911814240419","9858039399154443683907425505646969133966670338173331647839576035520625125303","5936033307217133264257041597188115964457637953718647112906870372504454763103","10340607376355789386185133452696959378680344963374631186204861558290387937896","15143103911463403933694713744901214045515642353696764687126063928209653789192","12568011130622849006768060215361376856516151918301278020507921479894858098922","7111521666440256973246253704702100762492860379595157618666729636714922588085","7580486685427227006299614937862983316144183764347073757169003614550356572325","12502519505884004909911681176131189323239621629488138970782034914590014092043","9863581385421851101081385563919847832922036616162751380834430385700096059476","17089158809476144094792821264939338147530021791726877719480271708166652703326","7026088105062704237034940019476526637397741963002343232018356066556664336014","994845445499189024937804545514312797076696078022167307949339617575675546961","15876781382035467218016033046055811573116707790724628548144881416519229111730","14689809674274247318241891219567086413796397509459798242967892601162783903120","16802092988897859361455231737511996509109485446405679231988222489773597130923","11709594647859446002857187914237272532186051520048442968950936220950857315304","4759519183626534098537305899218615829180752782224491547499330146161396795604","12571776796240659864426729857318456609425220646299460273766246547672790642171","2769573858251324685257310553432601557929569520156842199955099014544291860073","21350702766688879701309742399569256840528276777122627878991656869575644945880","2526626063522996270964234050318417686046098564667525063669005074312714302888","18423969495073310328067310084757878116209975357377687351451039175700497833267","21531220091658777616686839660258285747325371338144374109694041768891457998130","8427394214275103558108677503145255849560869946329377312496236014365158589665","17828380319195981604154858938823367276654533109286377267191125673334432160668","19783211215983774081961805533835609388239392763346884852979216953198247940356","3727051737154131506128614318795547682671073691116653628343563309169975365047","4119083313708678127132222977172109489163864264438306707583540610970422311783","6252287104931155232025872198136217318428623125187576197254682957610815437724","16710755249167084189102639360502018827510499697025984202991420112604257385843","18110033746887190005442882808977635890410904404891461118841516946874175301218","2918227864528514910093363913084628926376993023173539111767698239437487745517","13157904629518409143900661589841979526819718227397509343138754500932973967009","15465984474345304234742186236252931608183011971272680663570940465290570424186","11878026413156941826685108652791732794881788651335612324490880949402660131765","21741112052399478281259924033664983472268352228185898315463068813827126161518","4747527944432994412143611227692094864627491876083414817086093654783041623806","10277509022239901860432140475301792168394200477149266436561100920061205891272","20754999404087624192417155025756386217241070628838846889103117636133597080130","1227483547193673052804267071643209335283088310397022289984033072158054393499","16307552232859454034882961446345138774643318545424496725987397798274178077698","11567226711210341061121984162541681925200952470462920272949521200488251321412","15424227904345959422619063085953205567698592752523587527109367016932522520639","16823401920568234413742595921287817924794689336332341371093680173736681497958","17178500371576477554985292834973399172166544093847768566487624429998590283954","1102400953040339496875839457489553861844373351305506415352858751913370587559","13080464865068812038556558702873972281884160558346383435106169788680033625409","17566439771637037764512551735908097926933863312105991588803956078424179421422","16017589041969736678541292248300058552736340849527861225476737351214952910390","17523132608433278488363705847003860425511874430394165130941513353774134550203","8092883253891793587844758644260299541045067550613025971974356731243569159353","12321254675263434305822776900976243546292614577867012315420304293383073504807","19531149435917118867843015828825849821207961709742362361864708921630704500355","15354576088842604762866949406584165222230700080158133636047990454918586008294","21332421319707262576917441034633152814114387620450650854230219273363255599523","8015272434831541996001880872358562207725683343073706305494326975486227960571","12801191151888372376060502552634956842440004908360922421581803464085063730700","8694104440224692716427888474719601394171838580385724406065092424387979527599","4765509078609181892846277022626232660521104569272055934150322254832843470212","1707661917588143644633891057877135790850785409331274025620234613394143277776","10787008015387605260759430860865388187745278282497799140302256368934199376144","18194756507120382377518900347608092311408202948025495396169941673887229961968","11810263163672173278046828506977243322053551737568215505161953008771538087012","10172831874213234727939155250453684259406380736682460492997296249444174287647","17213618752642545792657024676808752714343165784509075154710334645425090992985","9518819925372898218456223308202739688600409921430244215353056882744779318092","17131123136661624080110214353958082369854888444117983370276647495116278598167","19754012921975586054359731668325890866854753884616461552066225420294483351377","7462008052105461259399778705587223745964230591131678540554526750478109055926","5484333959594514705555581721735095833500903297285196545219921231872772537173","2557226013119092043233815190178143918872697500327638257441826698928999698503","1507054359686440154418474816353859974171432117437965276706552855449701554081","2909679213050550436618171367293366253775019191659100521218714623421006853461","10665116922568564616606427374948039957862979916786672099258153181783312457007","7437027687262241094771256075741913500475069050164092161144508657935421667697","9967053963569379718319069707565959289787419857073584408604810513462532221521","15718982984756021542737562070818004660368251058309053869841344798298950796472","8594575682392663586907570362979165880675434255219238535736457340406406145184","9849370649402433736350811470041391602601158790752692132296227692446786080869","9624482408802253671341983829498637676172459849241801149966973606965080480613","13354161934013526849172225712805307512472349171765307613219141825881166556129","7119937145734334389233313270329538489802620576999159113776679378225285195305","1344157477128478949987376865221983316869875771654805484027433189770507053978","2436371520942165567892833442377818872689562318523120379398949725464297140490","4640506731710423220152475272336202432209747972077657499961644265967270381722","8134111173406553366062271384030182464082652625519520524317327080426662707160","18835504434223507510706711065799771244448550952615072290009282262161978175311","14077721328629763505638231073434724231382773989965313645642436166756183358663","19436373778921499805072424422947303671456441758269542721598857156355476127485","12568904822717093384930952712937445754376237421200202440659283713620770814211","20314955959257660560921000685610824477917159776697875155847298772747329300768","11405801816929456032970782505841034689257844102373121701727764117532089184356","15371647220804665136508666928297419442325993974748904907636841654537146688325","1655879953669995298671229751452904731600368401825229264959225234155007235923","13666140938671349359494215404645073043195359971495797664882691221640390995273","12550904050297885561370934024413826444188941904477880730238385153385367165600","14073644402192665599906362483011583221003958995020521977339575317519946136820","16127269466493498734385715523881795251511197745525351003593964386278292404389","14837032480553715504482333167436817124130071726116661830299825705998767715604","3157996448090083717095242716808677272509143175022438801158190773708431950360","9715473676333570416382435678725993563514140964778059556896984581776706520887","256184547541958273285404071642922907436096112735647965196154201025022277333","5146840525622632106780932715431071405921695127146286279740961056077516621929","18384530045422033192575749482772861619638670180561846412064951946020645182188","11372273308168053261873108888838115723774928158127953375858579798875763228181","833683215294780236385091047137868434268111079744466678646701850123603485156","7089521065433622137186726201244536967699813557477580528539264131550132846173","18389315271722108026135864703744658330872185858220834005947924896718372293177","5273779548466102910604406559710961194676307482240757707576993583088923382766","10978849613552770174834059773211945346561256353926504281930385060310161512588","2025512406735026708082790073002703032266582308582294674172511260928159182091","4504468100864789788585048558923081175827147016553914221993821395902410226580","14522713701686086398049669439257754726056815369755592306901430082418783986888","1172467899506707275500621151748833545282318904665709759177855581577968013027","4017285937828459403753883561608416496086703957918951620827271391321529059987","11864471167080016922573162728545364451553961508840493342354739707638549565971","15395434394935126648016086405692837721115704686064641372105542066627038311542","4122633947230663267544557410467288252271224090277013257161493137456223809532","12367035182954332461724293253434245043112564579380915260333747415793763231827","11865369149265328070561952780930053440760117444614610585601990621600973752433","21203992229059334721432650225967073448947553069874953360114881444016046128212","4447062027498500706657516396155423649120105266695738260082288656873877775154","9768914556161785389033236087454305484803915332998751645480448064781057341482","20108322604990560980160877548004215957204376010054104051873159423654202752320","9595509101896597349796523888856236119720835531243000900720041097386819336414","14587725319883470075206520097311394112137459424358160384009848233555406814065","5457101278978742540891941392855879387574924402835776693411461549501000663895","12113841369063820983468698918538182086204397742190461968800698674517428421051","16068938140317889943118931947504964857830114253819180369876235993296869951694","13406404344690547712656422177528636282657567373508751252664435506615272243163","11920541176421075939593055125523895823398130674849391046727892158235384625698","18352551139579012013897403430987382961093216812627912973277904518956583676698","10674676651948544879371283545502930890187181335773388262215810803244237530411","17792652617465281251634086173304934915478757132116004782258567349353652661413","14095161285749055405609690234399476131633768997386366652456808192371657539278","14644418417880601716605432589809764539302677626964586647781758014634427301961","12682826801878685279471965670138908278972084615404951130397921689553252275917","16521811006308378802185018489472310864659177006048843323237150403797976462809","7587334525407307163363028377898856862752809539521418102406305044826227081231","2908188489370783835450675853612280861255988950722158120607386028475371765438","5768335837479629879988785208318290476463727379450480334123633739596865462597","18397687037462833823572912519678833347435022340840883701032875748539812458303","2064051903495281633275569322215038029852745445612015454511944780242997049313","20703062910303292827787302109557408114919292642975918255062370581536946280279","5192613644883731002587556312741958983910430944297172298315082126198947618654","313995112743011376940466097068957324809905301874096868794869587134429900695","6100583804412559896713857626556992976882930387670359810813986481223803866656","7568477784584193520555596651137331005687926377144262826447525559308115017859","11965816735476149301106556132754318298248490433423691841191513590415182681067","14207753099541107589311100328670316235529404246579031740240567057338780037783","8175181231439895653513458924728919160206799108112661960299471181538010485894","591574950925877159318533535833931322303268506486282492008424162963779338055","6291500295969425140209019573620316970493238770424073159034492473203273747991","21323803361917137983608045653271447127437985941865950514234012867420827584203","3099253561554789805581090448570743201416121773155589506816603655098155495780","1839714309313076287091568541152080485292267125822172679972972462776530418282","2558200175908531709047812372022758109817946983415270005672004724309427120260","19741248350058279216600684476328478604110692693351318658499898211265333707610","20513396347684804966709449761679280054940274793206626286808671260812749605107","21199395741845301585097008478390085111700771593140616012257190707415683678475","1193295440609646713499404272654104228852330502286294623055524015452275511910","20305220021223370039849959575983199996369990375922681857965899850450967281896","17820107252376141054638728180510570702321859107787033667301953883945482820393","8562102223756709272478881672945718062091524608141507453584726675060317232047","12729866889854088213825002226835767386413454298567413984333803695815667483218","2114069176086645971772669409791461648578645286643393688006056656185576536095","10328720387192484120632500167812311141771979930211632623234748092781923576473","19538747176808583509408758149278829047639151822592778264069763723986282915906","21566485228448007978934061238916445477820075682293291063348941039309377547117","16512874118663027529632973954247179090732712450359926425594828287754653354014","19513474361159315670934532641131225842686472304714306461918568972038209446632","17955660451558996091453589881731410953454580996956628370387347653903874484464","20207812711298497695792679093438648102083829229107494830848501937376854876915","2421660685500283805427163525391537853360580630525738399011621278281378880490","21220637208096207115274223617089911838806190587185640536543744119096826805827","11835649411559295031133501496374511598555615522238237687109557873710817042117","21845843315206305464060299008256175893069927481104540219951750648498803200926","20631059480895873966832525659452814534529673650140538889746811436460301724612","14931947145214186450366175386309608636198382084457683854282076180248650112954","11269118025480001613427470548591071135727829235390508347983385837123112634632","1605115028499197336856195103688387642848510242987640636183693756727845197451","14793151932068045192821467479293563014237700538215102580962654003247886510086","4775792479749631121184048728741675916968972636777338242957201950342436979106","11924757182338412396519976020707321303982941838080766083060365440475015697923","8793012126741532580270517228948233516584291822980201382325016017213162919448","12947791384548987120483288495488647496188362270092208812080516723498086541311","12431577747633669956276147567242529475925082219146607091004191516701144136626","21295609310519517439106939049470380075664847294017743131672693330232031255386","17805136075624551692961527907699002356636158441633111730604045300707846396897","15278588475566957386556949449930796412080383857587931690843946622004601690164","15086592550570758313718621320890905171205067149643603272496296451366320734641","8699916934544892971206820107825237806538121069002198874248662615835467665756","20478102917550226644126628799218539559581625330717095591690828406489686677387","21734112019017835960392215716550916739517609682150258078062175843229766012777","5622924154085488629989980934517712826380247658471643194906695701678873126248","5037675567259013572001419121301772828485815086531243296178132779054418101400","7879292516618887859296404288004569598567284522338026817864475104197386629625","18997982317212461405999296872279110480053417447725407290297221773473330565737","12867218521408319698642020263791067688553778005223894447782779145063273233968","391334649391830733165647799040269744369307545998620269291478209889127672130","19779172617188671507005003625727124894180457774396709811826326667504496286059","12596925142329235973535723979633472987429833026727663225071980844189781139909","5235665914291793592826849798922237619782905021482837663102032574231117695660","10378176145885707882180864408618732566825397818692038984901565060499728433797","5518777162814311292774945630117311095162296059457944243049863006066284885289","6383788836915296003887453192037395923957940433745589146468108910773431172608","18378980065351051303468356542903949047413878986601754325664070607662174625406","802964496357962027925228076554616050639951769911983531162733260026242452057","1151228765048898930945562930707044057686831938340081500592865256952516058143","1057436684897434830336559210204558056100073281195987707544574829513988277752","8304361322956656858271430255521912446914654094029272611293726480015886358258","18082138547469240768624686868284933205246517716350185535250166506919729036297","18560642658541340224573113670515696181164007817863242462644028839037653788889","21433948922232169473983994578762336789729720241688838555383992306060546089653","4345962888225785406562575377774464692418146638460124795786215785539658204204","18491683482553522621865105209782725705891560836095563832524693063541469370996","1595153957006911891245805177782994356237108154065736758857668165866836749177","12745465492150069776755940532782158049428554675034493241223264612067325589020","21068300037504263522637352854045908904548431623139252516417402783919558466524","21379848283598466733133277088729802150576242926281401193376016094883753111574","9100400045517145192842796463728001529189981626709973391364198878834790401311","761526173875414323215606081295741956635544790572881984169167052547500162094","4523944348324037435946042315903741390453752174721180782503374766412842506857","12826905798159813196098719614569295407483904515869413174592666343625127014683","21298301889175245346300576454864405649687317534182187998123555815790664451812","10466120407875459863164008656471249355019715662927569351006572823820953788770","18765634104736621669847916286108860226531877076283270686539673115026794951054","18029301674050837995501532337862434439785535856508206309403192619917393036618","8656248943628007700842555256812779240721861558942157285882333517421090859241","909124445964415430289446157964020522347064797918541903582383763270622833065","20322508313744566548149933895745626560811233314858699012656697985674387463552","11473133631180469596497273861714489893486108521245550300092095833600832127254","13886897454587288170317041019583091209557063660075562594238782502591880617730","1388351321374629053594529120028798986653727606192516406127733531956260217411","10820498967321126905058350631999655366739224197864958698259285565142810221774","9047437255774003551209946810681504440615180683867384529725252909718397576529","17682412621232111800652746737073732995871115754692913515596320621857114840713","17459249118412305865677329263167949944924745890546683445077681421571205578033","11260954622870514070117395143161679907416702369566601131920841166642078224652","21311356397831915997286783986273772284683252550215836267508561431199821451048","11763136682097804856942897773203126982150872911828688544623632129427460812219","21842630190420364126017236966197050216368815810409077092920252710858332802605","10278342550043948522301945276707570006673669578955262430508437722137975686347","13669836394181980472800926591849938243993826306313038236968977604089281032142","18982534836139734957526305655442344936227781958587358112416788951995174742854","924143300713476371714205215173483600456664902950245170837265326237374786123","648653927285053636997438895046220979749796246169864485502279639829145629278","5468004955461336959690612122600291068806333434489556112046051739596943193825","8198966717021290997043372415176306737647953294267526104476290516107668308327","6330635298670709263682446486509049538654774571294109306447884201740681314492","15801944407747674095773310676934626868427752390875620230089308747846331256404","3507827835726968508794483439124475369701726928422484362860421123326683863238","19859419638162971296535544182202685481010250129955481751622623103942606817204","2670989291504532792325900963509629466753053370545313281400138104314529277740","20601648770014328601409368128706235447141623327602444994362138629813091391329","9020250281221486894014346959707974240825231024554709686306581193571046947004","19448071090920013487075559489904268747031170350571103602007176116016451645384","9855626424064670213123764401317371994977710260418114099460019043585303617049","273960241475408299521801713993986326049831910833352543450619250235219034159","15178055939386630045266985854218396695095661921662396071305063121158729338683","16418360709708558514136044760916389529230612136576500765316577679946210432608","4221665154001721396448157482529680285294859819946962645592731760300169936774","15928426927240248300966353802918564700528184618416199798406399357144022404431","16641721098080574825584685806515290482647504340255838968877260490026580761685","5043328033043791709396469989853970276607353659738086803538716424273826786751","2365847136059064646235805353745790884320090296651246286300639444304747972170","4041703631909032338305847932603086185355677713004583954544688331535508848539","18955336159113062251133387111166001228674233452447804151061756635904896062707","9901364682511638439145386800139126568286116168499773668656609155268493975894","11850476168601990118767540453922551640834371441287882635558900147928082262216","8857437780894568467707096644244374183076362042327783482111667874668631632981"],["6147626315983398599623828701433547333453673391438677577603594265593492970579","17373941468853383126219105459190068607050821581808945666945628085762579781113","18675852993023932535703943048744467387004823435670327290887021721028261389122","2852369548793040881968762533784361230628321032910817596034076837353628838943","5808467217603839720723505746949026082419372220269554685256079561191978282423","881630969072083868970336367377553654445065403827225682564307597561668597575","19544569990585406772407871178492435999506060638507114401323899877313464549579","14878267709748128552530883948142489440260354911618515434884876633626486579649","17343819805602859300805807767921021643427945275478160475923718327955601493598","3147144316923493090898234228150076463075245015934615180699926751367408060422","20836727665349317544574927486063082355196001294246787527562129483352381083452","96317145595907405996130011904544599751055402678957605793377422485629255379","20396399042769838623280415410496555539316767877730329966640626730926403538050","16544170913650251958438511948437422304220931730646181712426172729311415616383","6584506727240961509162532209184300869090704109605569344599278616387977422824","19590566998868166131570194251669644997762427398843457301697274732261028743482","5370939348013017640853545726351872135226117514092676042183078550348501472430","3811261164977684952917850156691783437850828453502434535632153500394919711066","2749726461932787493809872269818342486261987625587896664994441378571818459053","11383915573983550688310113375653707661251254539665869167504588473259548645124","9916838988690774667483310481489200062268225403498599116738660259134492019394","19136188641055168463315034876725446731284472265583750601248498822680260653971","15887516977805743066217960044189842288305843582510102551810703206237207936575","17786336987824848955338515695131540821733411380051551383014609903313869530398","21005051851388306179077283769904047735509863101513109127654074489561708676041","16280781107126745125834716140922874326275066681906520932680370323147962007407","18273950651435988187072089200354144803354368518942337504978631619058165888339","18614652687185018380961130295677654222896772969195870105326190888698032468947","4648922361007933120465784894534004676668545278891300743738784783083164272952","11310213903650223937806708987912823331078563035902775716617057417534768150412","7092536296444781034677326999670539648216791129534729748520186653858607985630","16270772820615792622649247387660453356874032254909236504742474628472692028293","385367092325849782070593441039432083386681944665738979932466043995962540397","17805827342754632514390359424735316390746977081512834158806889154912559417928","20024907198154552436345245141243452270494636033297743549316539293869591409833","9234215646545489320069965310786583269490329356796444977441184167452078293345","17108590030314435824853432467901019859333457116609928515585181187173490423143","15910315900966077593714516016038233988218165769429475135456816210775619893043","6195529693120591346695405780440805718170994701745792651233817614742815203519","4245441012583870678188242646630412070966678757506494973612671283946354025495","2304903496039614013605109532969224328136162284873560250803845559468196156250","11693016457541736187220331042599070447664888658389150771534133194896638661901","1776517450185237199728116828598779967801038886584334689860313819128919908981","7806153986794341965459846938333081037827814782827885300996474222107928077822","17940588722606126928451685498548023407258873216558463377906081460549591575057","10371799193925909119136931769852410380947084603350351962123549948328327267702","20122148120685258769574029387408965700271219988052875651388434729616831444683","15035551217063457270042973549639483148607470023686796059163084647483242309786","16489878967514620362925449612730416514860426946012382948452004149598402083056","14240790414988975854386511568244923807338302009634523655466832132581555975516","15133406953007414531549110172748354779664260706851670137432180705639417343549","10690705590498820694610024170434557617847607229814360354839513194179728718523","13827979863066172786489124156769882364122124730007514470708895273478430314352","10710843232017112245199417697882565131311711949064640083364964016238583286376","16219821984152229456789841617124740176636143790533787306195214918183002289404","4443945405253668151711239889811682417722099787812699348882165569376836194505","13374936606384334329293205906352917858363668730599007422148591620583177873052","3130547537528629940846669185730749089538439536961954499553850136295109479545","4303969243784057034508123321715648667535372719281283244828773166674886261201","5989216789074209153873415762140487008397424300536017420337913939751018987680","3029463357835799909868216943346697078874683636588794683737453399576373478011","10476618143678752746465404417470443166809882491668311058666046570010751632186","9994925982779240617159890198100947662001398642389912929229658664058421436627","10176970544481288451346462511134758722164701220782536015402174118877826889800","18424158448523814893964414770095134832293892346615425373638250882224929431363","19366956079105748480886421061443145211970920795004384777659195934741753207944","11091181874846694774338090174372100116252530248564050096856395252568163657858","17353128656714558089667149499397061301594727975663152036301560017860428071020","13238006665653699249266914212871756817371819001645951476708047899463834219655","17055039311662343661955654211226746040465401123503635116898702099310815674177","5286666690003794895264449438418387547354350464287559511315554292024950176939","21392902555527188320634786446573898587249542929111262797890644582493861156962","12406681026512063332827308700529401005255127889048956231922878327520360845401","15434870710485794945517495742061260302820776556272580983813299352075013239869","4411491701113234064838089923553395617470727028121925035608993460932615875057","21024748108044825160048785654599582463761474190244764788874831807499478838044","7680978131380729207527636139131932637240489018432030824029067562073349627035","3408321867876643922057696479500927118853015770099176846426613051383968395111","4044017192507961081067569272422827731313648032811501750491406776829097444161","18331703123531329496821809270389173567173788148638525857133489033465163738374","8581985490532916637196455609081483082508040719164880448426655573293277467062","17097175177088407223987763609523437237317521418906500697394784959942004837183","17283357547543881822643982373752501634581207450744975027579424701697125768519","3114289317415665754315257515672327794564766886045727889771094589828045932059","4121982161232138234296918278643894219608247208937391244623132656218561035287","18319708437247829803403759962528832876979834741757230504257542910042917362674","264107059990458404050537285229935399100000658138987761233089330774579905414","19245962424630901799103732912445198554851301611802664729994835041984045352647","21481268955474162972538912477676302548213221412224453884623843567742457980931","13054652880944215100409957427046741206809909544801248923065995115092723867125","17445423482926512875731005227671884579111686501047535297579963992185600838705","13989585853109988062633188826244755875692853006739238542727480592170337647991","17644249062718367051707138555752661559694857297122633537358146305277959197700","11213280149118368264941616591024002649789370846345639214204202104395949573001","2479430738743447865220578715093732023607362497809812709721841147273010985071","19170346831324042064260292435651736023454774283928671114965428783767444651501","2249773762348190221814627264878686106981051077241650380763848925904895399587","15785155470883637875946431544967116475458109417323663711972510236612352559606","946428851254816645126686470157531364802207503637938152327774118754374664228","18081301874601965299421330559019912584730626502654796906499991148349725577704","13638831153633382373670579690567703064487867416124713117627597359296662910776","15731178958324434544665473314389188985713105014648908423598119023855377917080","9917979824441332180713189841520827682801122499780827932105321535841262104099","4477218349911392146745102565364781587379138332203307397011323331851070628289","4196116502992100152382226026767611298689212092096205622483116328361954387479","4125553640263062687363595819368491141976517437635820252286742313008508733408","1260916008238883369640783899703958869740490511938805562587993523697780059646","12030453507844788085837941465326991051577705323179782129621819752109773617130","1616729892142733988881271632334115354383082667129246299673207948969677972419","17790116243542925627055862896879089936668179540204703569058484177080937502249","4916826165840990844304507037890792549751849160422839689006410477257882391042","11584213073802412059271369957747279514114648193038035041611261743642554198283","16719835981206947895865946283283198567714807826433642746085372541538665338476","6699399511839905674805128446395397180664778802443708408977716737554091911123","21780850712707430600781028241084903375323034847472170705641134914367959985053","19650714630255045094059400839309517919992981015448837327702161504806266186096","17728935862560672332557173079197586635912056977568426093575277173589712551874","18218981656817542290354649557423542606221103516149396438505913482628491393745","16173320918545320350179263895050487620415753262311467001135680573821491660778","18749132839734280672991763462021231851140006460544549438336391357928762150912","19804729718734886506325561935920047752142654855830698311803656972478290268053","19852022811935550911202582188078555585552613695164681730307677046973334627440","1599238738915787308523391744992048319751794205228407988676015490331611074242","2730284211443506246137882698953449192620036180418562865041025043475273902148","16642697364423389759779785009909902509686802244536597340124664260693547218575","7030277536951152393489269782340459687632322761209815510891507421842401544976","2645282365316576153620189595563363498245471716604607785997545100954415436532","11836599958145463724978298325224948617075734206019980907941992318726742885090","9379836389594058052193342143605994573576860036693790984289698770005233003816","4936097975532856331587608856145453431462626157074390483327785374648647979182","14261272621177565679908729509467309781957277604700789847167775203637724156588","14384042993612223493091843709687195745753711205656098174358380328322622785674","7602522474780883033451932042024754309460846024406091409064496525413778743895","19284327179747355275744653991040577201544689654594363414180160712801683063400","8732420760226712172720096817390921487059254890223844820526135811172306039693","8736871804423236893739486045277613796724214967823222024310614732306446417478","10122727759967140400011531456417357002819799283827520027869345304850304243508","19600428976911158591758195579983230165311737010182255016349431988452518779459","21412640599888310728963227806182550957212529173812561818872357742782768708282","3382834884251505446697465695665888436600985771748054896175510070178943176799","5424268238511504833112942792546766462909191487396278645494904715254618246619","4984721874344265817742647345247970905833992888391940986059043485748528986042","2022573256442159494507968677656879636847262260354573370537255737091303819556","11258631584671172573229663590119520723468593511856614616016550772001845679866","14324740608597503028071282210876807343017578554502044501781245297161562860956","7445577371344670075033666971816988473049110374105172758569837792031494150228","13265606669106939823865364576315756612847139875689786156097851279279751433679","15238598484646922414421482495816633433705816808586791968083189157308379106115","10725523252426841374788275651734494325010706400301821980153464968050696737279","2633265364932628352793223988839752923311811166605503408947317749518744833456","7861175100418742846275793570757956123670007434573183352685296812332256704932","20999935414216903738941146789202104744586510072221252339001858617626303789982","5977614056432951814585414112421531222403223146602229861429936680581955055431","5931860876714797492092042112133640002267237452913723501691750002357001804830","14562008797185891958620443495496757871981918350581241703926621633158489195321","3505336021898609386263210131367635622704109853221241394942451388531030669769","16578235706824809523014538640948495588856893463000137040801413215727773380083","19375742803446681387195879499847072356772969941415230923234757010947456367191","6255367488637769736903949293980465723272271368601658401735079096147956784460","5906589694839922614995302078445158282424694339180630855015083500482196538868","13065708825279387211110931433757563977807644647530652721233367802469448976082","18232288076160370323511493082329108072058465477630759182903324408872159664436","9270542950868120082380674008791159538242222696005636916635750372888607203828","19388836984681019018462719709134421248793536992065958947499056787254258751682","17644385837318767408448645196495912141788591335975890639327420146901601072885","6455842021230030087723301679631006132297894313543816349547744163571857006938","12651647178446817886752319997848206955275956948340732199496215365053869535220","2038361690839579121638674254611449047008451768255542263231913955112979412052","14552505619309469592330707557293319610565413217299690813565239349254723939882","21809351305961289002997783583503461155560460938189863591461820286363980258154","19881244303935038444446962795728167560499810309912834473138514895445137175717","6434629727222395907353855634693221759145469065378967099211977918254204835433","11036466183244547002625933810655331358597012489081560653011525594219740881518","8696860013373675168559529464941134452066614743853560004905114221628099326183","6286610834190704195966860183541611347543876431770635371755207708407012119352","13785489482270739528894668899177561091226326813787695987264179185340645885448","8810497353129284320787428455370522511595657262006456870793996863971532676464","5950943845893271397160198360810800783099372758072046372020789345881371710825","5530915356962172707660737783638532094011201648224151382306028119770642279776","11091512250862371871604003187867080726528592592629078709401778342108977650047","15783644080397148510988340229704570796603281391084254749002543719002855287616","8763200105989369123326685776257599315907057694736599355967140415031996938110","16265670810206356417408073001772331032782360202117620221162260100178521648170","1060900582879546587300450314779603179547289174918628695451776494250751383469","14744516682282904590256322734403856848450648676567397632124016636373922693953","7963533020284370085512706609272793180113190314656815518091154379468342864360","21847103720496839760484939812661124697765074217247378137013246709106995512794","1653069435316409742759195996639155716495640457841657992745920070999323194315","1779277606640375903995595532406543892084224209567520378547237815999026067520","6995080044923736291442893376098805495068105284761180709673883412002971316831","10811321648124662138091377293526509914253637698173706332138689100382399963395","9601406465257748919110853775299124310985215012739412476110920449990474867354","18028141367193319054744440498619071967828221741281699864949191934036691507436","4607466430137542836150125749612147456128085309366797118935148996775246273855","15800640783457285335285505218287458944442721123666981076610926748598613636214","2112321293659869964303812620622373297871082794056351093537916002098854382120","14996631991733135844452595251336653836804943981827712201258451368176439511645","17520271953040754474711528844729345396665279637573303317828245745304573322797","15992472430004058554983936761614313471735664568983200231292353554082612221","13077407987480601704167238541689096961866209332906459397795676348552772889230","21534253000075971492923776155947583634689953016934976887823337792522221291547","819226293199784195154719767176522957736326171336737610132796013897711980028","17185725409385154522175797801720017361441550294043891637734656472407970636529","9575382583490973064980234314462577435416346301295239026337973844317720284455","21099851176254120774822574655588411581847669663738341957209759249291625898415","1966484535215911127324696991190082306993935247312211830919486710094847788468","1995818881696667008089141246304344453132036271634824321961354608938484533959","4667743157901207120637051668285562840191620616648732757926088699083644960980","13962937901967387497010877515712463400252815508150832310185443339350530772930","2629021746995755463136649506818480652912581474323117052162602164762321198516","20573270882617293078262572083653232250462469010594696343790004182829624161934","1913490321993231846954575139695345554332784169136285969356154414660735431290","13795292839631007915139444096743217376580091875142459105510805605582305270567","4058572558281095474323972096333621226798264350365788595026405775805372802770","17437029543151462415223319777679469646123927413521446735086712751233557753685","10258511040614960594008243736815460042536086782694789106787660436697233524699","1776622678963964166858973922665602162169906575558986124356721214967791324096","11475130909983164952012365599635166276537668089861700179995433713710298426958","2952755446410776844254499627216453159408235799061277085887851310752744265074","6624935776718778024845266788797012050011811870823913061539098756037591400653","19954266552453778490807092047530964172323837367905505645486543751921896349997","17616005977353868961299963148697997608390148348790301665790470529963563572688","900786527730568780236819563509871137970324714801299371788326143178262067587","6401534704731549429505440687499634640537230220192633410570095781266996282430","6061080980122679361349022326493404370004932185085913345491175616560373782007","17387786301877646594936351298720257531176301875267218947760820554848082721424"],["3543030996690731296144302074945644993940503512381940281158340485163553427782","14456582958634399729802605390122513015002601504508513170013909507149932778448","3126860645246915297044088167326588591680242124427769024481453610883810108674","20914220112711669635932871895638920862036110651562335932445860492773410166435","13898153337128326598294681972575411161373345548074764167063930702810085143283","11494816488079691563548948406211866308670367580609805045470273810278613528125","9265075386546133998992345241270235168672960377452999502776312567277548502287","20021949048926785450343828102540178861758398598932480397004304243016805279702","17919773090671305519402481279400246318283722142600928508878399512593964809604","9080338876332324361560940283287671152943529212088083669332838878892426421176","6966820873041565099335541093832581518388062131217364208125082807748337444442","4754959170441683519515036606259037626662671578099964081061043425010850133820","3217229650060400896792673270994784175046872440086333007152127029946297106503","21816481050785200027931285072395469615096302360347994694687269782499273734112","12807928427670068278917234235986720684636259679372568354055432889409054949297","13826913883258807838903404263173315859327388859817776690782622774806719577704","14715508594618229304924912287879458078786871554183488309385936868120900302162","4765885366156640574773808467306355912882165708339460440950145437341404320482","16722014012556015216650093088291583395944348552124898992216581531958560404280","7431786809665367144168808343099306354449102161270140701698145535166533004774","12514561575784459520302508925923482055587171874031496440739369331861774361144","13630926037601951290173737881839381432349720276436508871257961452732302249954","2416414043521570830938077478600484585162353864423849325238559208774076695812","3198391645352142061735535711335633217975113436438561010475922095171958777605","11503289488153380408852849064024910165225110948930885911379465054522594126035","17945548492985099414247885601087617115151464172983108926121249791371051519441","15206458584403956760846691261964236163202625304606621285728526159502456182565","18664803356744505916174195454562184678127127391413155379212300226736271965412","1932464282660454008791502282337362663506272754054933505791400845588414354525","7431131941001012844762212013511267729079957740244748755865134237672902463955","12260867654103631227135400757666859922137135589157019044994170609009605682612","3497692461171356958628408153056941313451942465631342687440123894946322982488","3611582236581069332046877419478476119433460345326857976137560691859450607136","16701563436812072022168694511067148429443045594144653838644405459857156283101","888833699088042159861509113185468788045755593715062347382548583028812466468","13027606106406728601332828518562058143615794059325398484231721019790789708383","16867560818956321945646006921505320613308271522776810400640826749438161909114","974286375063546693308153673073274687620807584704373288927095698770718355705","17164647015779775003667370039927920124381231953899936293739647389770842412636","13812735556582478046467982121127334513466404260587580530663067858201550350225","5555318749169933689829489127869820565736743958465695916577439219460828287201","15147736958519110413798327221058929792029254870817672304916259386717996218939","9093783603898735286753718269047404518944180735024302663202149030626421747264","19663528847623587912647904265815395529695410641548007238438947661221514322542","16050486874392688445392573281672864106952702475626854763551538209147588502217","13643154410219745091259394207881994403403664040943113504535042199360092675026","9994393341493081364074783836589113425357957616742680978059011711076524628096","6066727222812778846340829491283999369997291912496005263368499243410295288304","10275229946760815401870389679607490963497978883421730792100185293724085428674","21497546743120095993008732541489604895508606688714374565152084984414487943856","5410109209131659429652823371440397074564204322815773631417855000087652072422","4656718504694933743607748372708327104619579523407806362780445055109254730221","1535539668205688554612129122232712967981273484635206844376645263794510776905","6014624793218490271238764434773189318958730916196905789497853281972696671247","11664508187375558355195352743803150107793615135540732262825506318914225480618","6116179866134076212901873972162049629714787777774217125320617831147732712881","7156436421089505705028328573278072913507065296883146744244791316222380266201","12054467471426975647973340270599475277601084936967912793090659824480359129081","17043004725271027910538237148402068222835120116965638237871055913672994258597","16220455773823909794014715905765711732985616219607584706690711330413977988212","15859369801752308916251957941263160908672747781155852511743194995283478080957","479331876385459584849230762033048956240784621757125043523833547932336732021","17371898586803558805199285151576387708548132346602797103748639637481352576986","1669923098731048999410343513821846398616602374717981505074961546289337325891","5901847159215544530876581081126932589094431032258157198770582781864841878766","18964305080922802950293327616531540488576734432289534207487783803133028591534","21391565661610588080023857012644286006317523285224244461722350412865334901788","13859979526703965599946512832991648449058108364323767375822622250546827051763","14178842945330354151475041451258011251506932092165564803585149961516102229203","9732424347816228834779162921453357383035314691484039491038526173776392679930","2916484128690250908814196431868649363158004790333481812642864057335419267559","7496978836980754621750472326738269854937130487021159668865319635184235054270","15732272029544135687655369960610276709515477689734952583097488077854605780691","7867892378505499328367956370534010327619068595759860677931756173774607866661","2645389195137857175751801166613941761522924817957359363234922821861168369453","5428648673026825822348517069964588690890711938310863981949251926666891252998","5673097051473314160057127163079470500502486665904121175631085109229208920764","12213227243584803853178095425113463791275833583767127368163587230364245722339","18715899303501270934030638370927875241328470260353347061222955717933916891297","7978266080893459514342371863321441749862125749732741901595103595919695778835","11533864861650024617087550487008450420153395602349453386165533302160941562372","18450601439501348601530433257154147113861051704608419841682905432642513197835","9138792247850488245323412019837764753108822692897704202690513828206269873276","8780651517909025350948438820147097471614889914797642770395848326995230079810","16579891454742806064187509751513819282821430255175477305656819644332932757991","20749300053175474642021908869135322928369734326957417903553033361402813233282","14678025512968401250174091062539364192699965591711957564050835184613969981470","14500401299150087749352814234198057059984606531881272078945247743949487640486","5724620856479473091459642481591597298179650010639060800177645976144733457925","19112197370309313151147636092745145521877228675251700148292900136536916932170","13357726589469288818869234910529301323312513752019046957819344054565360588780","13374527560449258023689134260026613122339366365792290373325534211336697566956","4598648858165437260062263715423329175562992143452805065351481409276538133334","11350678282945894657287678422643168089297300739501707849993226500027831816754","3542838338928314843109276018513499150692851830271985332322006221768875867536","6915887598932201892744110121624584826388348577566708154030055143862948900209","3341372370459299156322218222512239866891612731698279185818379265788352168797","5465946929360194216023533683821008640072612018293683841488258245599905867230","12877035916601231664263696261369822574055329194451355438105731392920430333083","7152734772764736233496355792907418897029921786094807846499854978916041968421","3637783930300588858775792406146355117532464453208333425534311131944943620570","10014356913431431526174931647710822588072509765911348937997695830388503275168","1363032458635298325605180167581231122362341661979419469148204786413525015450","14749299418008156951304417344478297351805724111421271311859650072310778072387","17861121930186335338650720704614114161379448007421588691026444381264236189922","13982875176693656046913549248129840458651715264391216676392378240291122094805","17013986540180225001522806840753604869987807622757849834876725452904460718718","2388488441230564305487777723403725189663618052806260479803532470400273033483","13894658705595595767938737767669216953233363697170846839350285544511007008320","14405479371656690634733468702992982854989857716365066876824883028890686397274","5463406390085573883494999080478626961053571243436142083968477629350392248406","21534264698621976459797752593999005975042601484874798974898661774235315370253","19194802163911368935896093977713617556434585040373562667919688000266385189018"],["4674163295886668713721676554153485700383365415679648095685497378991889125957","20352935218386204728405947862710237635292695166913064017138871016474654829503","2592327317691286673995570769733690864734110983311652649344857955817901667605","16569965928578428536982359762305442141555631314673045263042967399169881481663","19131088716759828804870846683575351419567519624591961034686838811980854480317","9445249257154711404997904018575649485936923216724833070474435497562129184354","10263849450559453197266643809044161235269801564997177723771131710603406794657","3056222600207721353960552490330912452663290310028010792283928265227487578173","21790657388633280199755703552074152351760568814499175261713202273123354393653","15632854714111805599199016548148074406028161048345800202040891852724322865404","21055196030884358213128268053901624878656900226499964686210806947320487929084","20870802314656988415071187255580018825359148840256346431540367835816283233663","15616534517743330594960982114818869275309504871292088154595951649532209497803","5784776489399338538186111556208328817680916221272560662302058618935625424664","11524199340075899550845010989583353304937552835400935278913693430093835145958","6111955760150452509644281780032815573756917600365327410927439475076299492518","21618401442204665104986329854020260011488532608326424508093871089299201575674","9730498374695391045394700114591114475449040690008311140197590770638012506878","12450960556188662662174828467496697802873664968238345232698790724056489477852","19541588514194638760835578386391719199522674962225668709200961614811726952776","19932293326229311363288454122969308710212293893428838866879338848665668402397","604198849257174504677551552215661304343812986564057281411653401089383990287","4837206815765999838881694117090048237839208060322594233335602777738216787530","18830045323524997434973757449753199597597645181672539201484808179922595941767","597272048657162684432562166735615322949355566201513589220267457713801638231","1259257565303313693691585589383644773076852691198301937638112297241050998906","4299692760889064110427645653486657433003877634188292107545657115443318790741","18761514049733775183377076664698188376895721558935093039415023511830645880571","6365188664980535830887561182548117129128384651566127038255166094869781288138","10908245784622543297925944831880222108262707146660606570412640969461860215559","2993018118327211849601365308091689105225779815146751382435760912693815943525","17866549521241267273147593454540911294575012954137157106386791620196686306843","7588028284719211287685446874927984833830446870565937360743716093239510828705","2090750922500787060241285930607243134795297756000749701326291975063085030442","9457072070171052855412092923825503562704627349932867548368158306053472163269","21350677681867862863958401218481076613811347308327323704598795557647506601048","20770451808866000075425992751709612657492582152945338552610276408968142282748","2745159125861577162208805239818265210821612624943688815260513025855030451876","4978242409993988630548589666160972377966237165841561311622261456963266093585","8957122665158680185632585169710175898594503225351167444908975902379752039529","19785721977895675912077792966249940018620743361119818565517998582038530845572","11861870201391731884519245957624651537058767900307989639229586431063741762358","17255005338003805991070153748300808006158858491831332904540491356269058934807","20968613871554279013641220706303052278063770382104154194145614761598803229320","17088772914095596168232405755085581150280602134464528873794740219829997655905","17762875723381349883234521669486732244273741572046761163213388126273123976716","15757253055041927933508930441807290266967740722748969628910267606081057123247","9296526004150722607881458789952527402293389026976957647013649334875654666846","3258056648875256712165532481568505756954239103970575560653877933695716301019","10077274438511253450890613064192766199813655931242373841397350705759494726833","2485034538638996467225599076052442891342629898657527900536984935467064278829","20576592492040545165717975426556128169364393232969413514916564746364553078536","4404702101406694105795814505550144493036964326057335262710910677583726782302","4390438145706544373827946112868446908872103380251483996161316711096059314249","9320005299875600545246395152752248247569867819827474604280747799854851456406","15328920202400920589852925898624698939637026854484346389158880426029840472715","19444529705654982261781611244830441964336126547310756977478168188912080964036"],["9752260370971488270527045586368300736990068930727356612443733058936980331181","17861152003533815607258975980932083069070125130602569693881058150421024162425","5478494136231859826920266196710092163036570975555566533890278380032436251008","10470663114025860164205954011633511602249334550961664618144343510421485102643","8584166711424171940897653413099916249371028337527773813210106792825433993045","480687478798944972518402568634409857315487979030618520260560257514160422118","19050370281780858565019483243537472514353065987940901395981643695477442070526","7909886408711298712459179052698439249376302724729633721254586660282875932937","3422546743310933069772687665765317843579486790338039447423961278453066592006","13742327444822703543525245712246928813767223841816014893394911139318645136377","19985290653818527520481099040857204751957970313061971657480471856178364435734","5113623454243607312202962083851358306245672221703960790609797677771133546193","14116233721356660472284501740073810322785672551591291061323721256009346455878","4926155427866587734566793124447479446126808496458547974505225385766449054331","18737837843661096774737022603512579127563955418171470936320273353744942252119","10488727327274145721487028816083558148874702222936756843781953611817021479453","7430416809625816246215887987474320468895157902878142604273583498117862871629","15362958033781690751249945980799034135612747452438262501485459571192039957761","7971998013662637796977575957753688748657729947937463070177130208011037377134","6181181645748233273792885809633370176374365207286274393529265842466407115861","5314629852576387633630556100168250725317801821478381622914586992960199366","4515888460995791866096611222708075397170126060611423125117883548580281554338","74545133806554228861741049751398547087539129543232065265760967657668834985","7620596223797793424148158028949488299269254840309986200826069272117699745990","6891523215930979790200291579163513136440547056829176430750166726452304949371","16099728065410135581098672343255205185915801569430121937096121254451019507098","6557913779080084600620474619010501057622990909691220199506246579366751973182","629939504373643127852968084066404538738439068647901008271397818529825932208","16099832468946902732124320171948452597322634043778818748638339267108275446697"],["4703464382863044657879311175544785995557811809566957314411289057472490527020","3843782899730931149066837823855957195082814690023486343961650216093340265958","19753920348283277126115182030019993058097502466641468039307766133748654311731","6387046033771728790683513731756820363186884656538206941762539587100790793303","6083333704170189791347928946890269084686281072760260996461982250183813813455","3601362179840050473869565367769437889028980382089846018464370888724390080742","15027638961056161803405095516489512786991681560756640705495942526018791294016","19710873932029592796622363789856158433724106192219625427302644279655507023367","15638024414045421488677288694998914769438007035716986615640454221215106257457","15226555011982219477858209163809404309053286511808301742968320176656943221415","5370110265920942801753988420413217249900497386077178581974767910364898916037","16446764745477539410117561326613320146727869338745239407663387010432667098744","6928924323713233714997990198973637030825419323916177069979007639608046912970","19348991226118506958152269076463657327287453752172685562174237622786490116354","16666475864651184183551914965752229050329084262331348559694804883919620875345"],["18812969291333960246714927634541285791301021530654461980802056598587931445724","4704875114419935020350178682811140808616028527479657778061958964369984912380","15617352465980977810710937287156471405834630169023818314675251313292328425896","16144221017969671721449460332127347762820423413386277478456163956038616567891","3380797458259597109673995325806610244842743962089650531774414197031119011667","10808087229606934664635917926735817482378681653152030112405462220077698611677","1126944913887516904289476884314188784817875835019645183711270186623300417204","13585977120008359172676716020499921148287788176902665318875005382858023049126"],["3181021621803672270534191685279668265378151263688297096626662902385759927090","5364058324337084345210724157442488646258495950496398875849562278111691871665","10224931444631296256306111997023259115908040230658265780895445976301767844798","9285325465358827477019037630792435617232378052797681942227278264801019284121"],["18616110284164381247048792467749872996052606923771839554448275315790271733321","12572153507187626417608946244065205064434867662196802627032530966507417762503"],["18126106310786725129428640777676658837637478243988854333395464759337247819902"],["18989861085019751010373715058404980337683128058696554620480532863042272162529"],["11406887179192998141316434121926377942525639172220901846038964800699077034561"]] \ No newline at end of file +[["8691474413369666750892234614358820289658368726857552974633024543804680298964","17496320222604434917256246718514403734235740171188912286919341525891256570713","20717661531343094401419404535005724208121214979487601078059038701197331043233","8338161038189752845969324086767343943203808400163733790574844916777622907526","2244871586170865025448272825497968057027141766617969218599365252909572535577","3608626711809097355394527544415447989465407554113965209630262872975367728702","15123415314399351471075303556718608687323785898137080424470982286311735782352","712912966757927878965693240425422971881715436008090497769457122872348343952","3196185115626403769090812264110127828126981872545481387659039004737077237629","20852945694892786589706882486760988740184637230152727898060254427102399724085","663438552256433061576054140809160443818506164632349621099807794702352080693","18682912995789016595436882433435139159334702280353629213700041190405671371221","954361121666374676317512516553835448496801654442662842741750447529976221096","15976568257028838086904371689993285445196617581672212770040719579976951713437","1689709601556268020419125248006910470935068691712645256591639741945971733744","1644637032401895183536122531980635414363418149797237304436572320773189961342","10530161321691746280687450853188873346740398773252979676317929677235626245235","2628389834360132333366589026387003814868457686372552787974500759887369913155","20551785199765572414957755636883446606643894289625551996383687264006196444272","14647299140966795168634863382011786101084247791740654785196548451662948086183","17547875379231708590555723879540779728666475590929028917859771769395698401715","4087977103445290602464010775212316926483391914870441578758042979308767270230","6714269803293029270909153658663808588557387497502190042744619007611526657435","21829614378897985584789450465826668649930021698690579364831443823904306431333","7532552732354833964818948844447124010555621930545046129036742684162649680796","3085746588958121678695340573755073635811671969466202529706243909144419544906","15358264232435244032159222413023294519420811338021914047216004862176094578703","274618135907332659550125464790981847888019268634834758638296553463810383811","3145275707337847188939353064357731848534516166917140907835781738084777990262","712912966757927878965693240425422971881715436008090497769457122872348343952","21219905789358323534478545279193723251420616841556623254711235028135342626157","9798324625310926002331408522163043190724749435063160272808536376189654148756","13582411668238263333995209483029305625601807569534701653376051071840372484093","15950000082544045394526115523741159615348156864031044224172890462894241606231","5992148578777868893458748144399130666011631987544731979896999269126511048457","5001232371587577350490476563931715794477203224577970619789108259266886603950","17806353473562524209419921489674020711603878477377228029846764687154796899291","4781857348503260904895922377303003708601361291248025972804843818012461675526","19725005896671978040083076043827582994250733273969992727037910840857608608713","6771553323761092017375937072638415166675529808942268574147258168001934888920","6072598916249169136908315542430764263321939399814654522032874918790340778554","17174337625009122870708859925793325997946378966416309900853757797594910229791","2191847811950210640312799119786838991241770048511678287834866005381831304252","5556089667073477529764323892046529774877491089381310117639628299653468438238","5512523756717871023776497641942984346783337720501449614794308618170512394669","12964734676293244153748554238028206801414195417901916061140401142888712380451","2972653442760058165486608510571475869094354178867521177094553776876904654370","19617883112060216036437373002520931262578741557295904537678304364166866283129","1175039218798484980072399121924972057008410392367959450703939688306902524054","10396745429499812151132429056797671842807735536621273702194009800176056286117","21829614378897985584789450465826668649930021698690579364831443823904306431333","232738545482017472261496633286350972128632187612854220178426602649221258372","12964734676293244153748554238028206801414195417901916061140401142888712380451","3085746588958121678695340573755073635811671969466202529706243909144419544906","19569641468295105160418177740024945517842897645468872356974690513927041995987","13682529409340978640466595260264374070197250456280851982310079893206859446095","5864324965287761028896843934748795289028753931353130557439328109628025948300","18638025629280224617790168906173435277703684091772827588468099812026035539738","2194543658437125198357587946021311492689377172643668551084193961108304747785","21593921076086949669297200034323757069358367209393924460563276537349356681008","15613087414575084731294247924061147534041250959429049604445183368849211416480","21876658378266334569964380224531738829113969654886515172706825001082187941302","17603178439634188462056825952489860474722953595745235452510670608903852152095","18820995668034441064481786413532066855976405414499761311120499699159123037823","6071932171386993614931179655729818150534845046202199448265558256519848482826","10847231218503195759517071138679051602730407167074172266742227045164609231885","14506356872966117174131859847846372170262756655915924664237877294288585233653","5157851077382368258831146921235005863841873179959407293372390317913027109941","17215740096130814160671394963439750791336311297216240493968557475671940055057","7236783279316083836339480995960834633270959028443867776543135480683166923869","11398194787838497782166425813926171378663319996243937443066049287231892201563","8461890310516914992976016102786941165050457592527945955052989873762315959085","20131832673266427475769741534309108541338301173662948074665588100934145363162","13025268118387164480802803485697296266258675734062176433653116451463846209082","2959389974566411083204235326117036516979963119227951085034972251184734179290","9377958456884255467194088716477119239642797045077236472356953540022684583149","16698515797824680501871676266202253211872118899888285886412000454073141450701","15798767315325760489132964686987872692994717940925570238047784420230331193585","4781857348503260904895922377303003708601361291248025972804843818012461675526","12671050201903040870132377617509218353339866159494336831034048382615639662347","16118914885963834916174025584295786549597018616252080891215345608189775067017","1287880180407310800601651110405671450334122951893361316992545024696018620127","11275609334870619778800915975797190217946752952900097800029716348347769743557","4549806302643127256376053744839835469729529127535077121646524402308295761124","12385792108167898834965686312817629786971321080122734283967136719015404659574","19645303799442917520263849382981918648525479954858046014781621457535223129139","13079036262723496487062341719232498854721623596427562123822257284722043022380","7815052247860712154170106628650576750781240048309328607812510735568644480099","4224433012242275812105292037318388809660019851311870694425205064696802439276","20769202337427957655670745571969974320407145254685594108329805885177108459406","5864324965287761028896843934748795289028753931353130557439328109628025948300","1194604146042048350003512364693260099917768421477389239935129766419846021985","20342168169457748695802149508674862964537074611245094862559628187033717475867","9612640678039527906483661330640693201947160578570955411180830848021191312999","20227979332701217082249100988795416872480735366357703927751699407575642930935","5568143431214976639464768845659406494667053581733825380813024891527928235568","3208479846365475237410989805061539106045403260781956346764317556860566259416","1533174095932179741832085722978096451211273368734335528806856805965059178550","15214427790517490141925325587797963249335567355213168373025412405634050937481","13602826144456356860284419687170541618185281374064216815711251835821492025702","946455194947827940337729236114480813870835673647234481151109602462556270766","10530161321691746280687450853188873346740398773252979676317929677235626245235","20551785199765572414957755636883446606643894289625551996383687264006196444272","17492490034871188503809070393464727304143828491765350693224566925126105199911","5627116488283442946557217209333347313412518163016066550539282920861053074060","7628458932936495764524142429747955579001667142208907050372858225989514457008","13545244560072730176162896504690392106112168077747273393293519829141026712654","9197800054380533439556389025741028642781611147489934915217537670356117734985","19725005896671978040083076043827582994250733273969992727037910840857608608713","13597601271430461916896612582648919742272715556061113046784825140314498905478","13382473425074121858735590469120000769886230357897236331156422982819803288928","12439760546784082202871583401234733990044187602943315324169379543365738178519","5758137506105103459826998865197780898444584232351877574052188955203596737799","8370264878441063630462671051957262849187564367781659467838460782939804026447","17368028902269277465024746642764987612414033705161996149238721534130490186941","946455194947827940337729236114480813870835673647234481151109602462556270766","10782746953492500078751030180163064462657489179646951793154413574373371915628","4574759938850684302328171377919788556520857555728298495027674689330859913909","712912966757927878965693240425422971881715436008090497769457122872348343952","2483126835964394240864276692792992171095811055349556498083468949709404323305","2235150263865959136421726440400433738501848129328010009098035293276672220717","5469955587383559828097756439479681402770241102946573149636380518729022833750","9612640678039527906483661330640693201947160578570955411180830848021191312999","7135473937218111453151804646361837547205712024569546168416088861245626015030","9197800054380533439556389025741028642781611147489934915217537670356117734985","8177887533556223950928671845738575508418213402039951309409853690924708882619","1644637032401895183536122531980635414363418149797237304436572320773189961342","2235150263865959136421726440400433738501848129328010009098035293276672220717","19402903568454754777700416991856190103205898202952506192755702018138164903780","663438552256433061576054140809160443818506164632349621099807794702352080693","15776280343411227095808521568994471614057167432416502119979098996603887292938","12313143896208759390351526641510039095883815550699902043061685514584813600074","1218928037268356033769144531312651840516937586618523437511091378414585873142","9011100725723069477052917523444280437831907181043987084639300263089606956420","8082817983718546987105551276971252463934917335856558917892075900846966350585","17744796207881002836361754172345756972108243302293817629307470887005013537965","10909054529489265328197617859427892180031815470826676417637937142527343355023","20551785199765572414957755636883446606643894289625551996383687264006196444272","2676613676733015431959147577385543530164186971614056775227705172064306807928","15776564956440002895136116449299582951656581983212117550232796150916571692055","11412740120827044021870096407623293808851105071188140591919788265312361814171","3885925135313023686150115977607110368258492435636819989794778250027419367343","1440944398068243290019815197893325790869382856018839453050014183551865062018","18707594353877082516395132272698629627555807696619350634836774054442394671010","19750715061039895092288075649509657235159241403400837501090850293666251108617","16411233008444850443854175483761516668813055344878151975436424201109266465436","966676739412114459004685599806372707037105104204243310754946364190002350899","17496320222604434917256246718514403734235740171188912286919341525891256570713","4224433012242275812105292037318388809660019851311870694425205064696802439276","15976978918004336355901319629352200911328902990447017277673724626919242812955","16226984168490080400263373201570728966749962184950889718917387268203884202372","1071564318326244075341980988866027669737011601498674724527637774926288977632","20769202337427957655670745571969974320407145254685594108329805885177108459406","2967213245998332384543885104754783540899439580884490432048984202068901705944","20769202337427957655670745571969974320407145254685594108329805885177108459406","1828058457773990843551157525432867662470301272599690050907371698799750907039","21451388112829145060821974036366132513327328641208732802166144524686108831760","21219905789358323534478545279193723251420616841556623254711235028135342626157","5001232371587577350490476563931715794477203224577970619789108259266886603950","6540725658063818695836967143056666761434297658403942276316050979804587769432","9377958456884255467194088716477119239642797045077236472356953540022684583149","4224433012242275812105292037318388809660019851311870694425205064696802439276","20452154666799846638117791929900707763485919083101449648262816499313176812803","2191847811950210640312799119786838991241770048511678287834866005381831304252","8491224372742742395086082981236389730604525807576141462195229766319454932167","5512523756717871023776497641942984346783337720501449614794308618170512394669","20717661531343094401419404535005724208121214979487601078059038701197331043233","2476324937951789382181944025361875851099988750579823474754609765481889757439","19356492332655108003949429792555441845806681675195402015185308983898801715851","2967213245998332384543885104754783540899439580884490432048984202068901705944","5055315503098445594062335518727177962919913361908453398984787599226169183337","17492490034871188503809070393464727304143828491765350693224566925126105199911","14027649325388708488081280969586205626278814303627295953445422182588276435572","13465227484584385300386574818824135648806878577862587385005638292079537592144","12385792108167898834965686312817629786971321080122734283967136719015404659574","21267939098918134027395634942102971885281982111723141238850772621986256662900","17496320222604434917256246718514403734235740171188912286919341525891256570713","11433874323428772158013095381623924200138375055456955808189877801771380225552","15618359152517208456698312197785172766694127619077536561902714697931530755106","2628389834360132333366589026387003814868457686372552787974500759887369913155","2027121307515028227361803453971004574835283397634149795685942874063731877044","1758371485945815703876679445382538767819559386912271388124907980130004330353","712912966757927878965693240425422971881715436008090497769457122872348343952","9296362220804925104551234752226384203979024033236205671428676015277866160513","3099260939107709193833554073787772569345965287506676970762153917208260772189","21219905789358323534478545279193723251420616841556623254711235028135342626157","3099260939107709193833554073787772569345965287506676970762153917208260772189","15976568257028838086904371689993285445196617581672212770040719579976951713437","6540725658063818695836967143056666761434297658403942276316050979804587769432","663438552256433061576054140809160443818506164632349621099807794702352080693","8140644209065967749731539711645757673629321017919126168806710308878873241272","4655594634855844188499094340496759182976213206849235604185854128079411962453","13216746424486872049443607565713997095923431379037310625593547838968801990450","5512523756717871023776497641942984346783337720501449614794308618170512394669","10286727453332438406648583236643277009562092681643525436851770105870834802875","5835554999819330558954089066526405560740259616473885793288693915684399039377","2235150263865959136421726440400433738501848129328010009098035293276672220717","13602826144456356860284419687170541618185281374064216815711251835821492025702","3117586190657126472592128104269081184451127080527182054370687640020932637738","16961794929940055505618937273665830834556517799613603503371462732255229717698","20717661531343094401419404535005724208121214979487601078059038701197331043233","3054509086575963631520633315863182977708152785332183337259997415160907095845","15718330550508436908559701395606414201668068552693146421627683872153427960853","4363738634465882118172307854104596042899685656091037340905869811610138317347","3295533384340596604465346018013602551881861893498794970313069368600968766409","4549806302643127256376053744839835469729529127535077121646524402308295761124","5836322900178474894684749559174625794931606932780001961547616477680042620058","7986666009024332686676662864413304092722307894727965157582073398188685188596","8332725882597643046230446607227878580859441724564830732217655474732342787381","13605376995820845471499102796322549845207296468035227481017989756087418839900","12155172322986237416023663042004942352608253176870958535098713267207721181883","18703989514997223432661641229861332310348080898339160493229575272467603319271","12144047841603136900258834238679736103499067068658592153906655837799171705427","11964978685770609938104516880584559743324134082109819132572992701951308097934","1336458066220344521262880797524303149688311982013949559764047883761889898074","7567096820715495523465831195561335361495276610103173418515651874250913956034","16698515797824680501871676266202253211872118899888285886412000454073141450701","760526239526750316156895532664638087659951808341490670841188720735038667373","17806353473562524209419921489674020711603878477377228029846764687154796899291","13605376995820845471499102796322549845207296468035227481017989756087418839900","663438552256433061576054140809160443818506164632349621099807794702352080693","14057612694744022955506885004102834629754310001978602939456750538201073114431","21536244638197709025858135955699906074571886472797743044193407266270319669578","10940448732886105987570056589646710210974129839416224393729741337643229924295","2483126835964394240864276692792992171095811055349556498083468949709404323305","9612640678039527906483661330640693201947160578570955411180830848021191312999","15613087414575084731294247924061147534041250959429049604445183368849211416480","16411233008444850443854175483761516668813055344878151975436424201109266465436","20350757034998523187334178209550008366903662221355109911310833181698841320621","4574759938850684302328171377919788556520857555728298495027674689330859913909","1346980346605447755534859795013475283788975200653900831883060614677761712111","14662264414119036690282405601089929177544253624404097884734013101529582623919","5469955587383559828097756439479681402770241102946573149636380518729022833750","17421378063295915427159454374242321672486103038225921418122357124853338152435","11412740120827044021870096407623293808851105071188140591919788265312361814171","7471975174935772955134792946513424637999023861300940920934522552454330255354","13246300932955054699896499534663439333337260302838301416472718244977767210668","1703815020768376381115674913114725195497281256588197804868422201697152023777","3085746588958121678695340573755073635811671969466202529706243909144419544906","7236783279316083836339480995960834633270959028443867776543135480683166923869","13582411668238263333995209483029305625601807569534701653376051071840372484093","4754713757431627318482916888231215818599754770670360377946229107868340173565","4224433012242275812105292037318388809660019851311870694425205064696802439276","3196185115626403769090812264110127828126981872545481387659039004737077237629","3449083258780223991632112868061903902820017044757095982070790181182597682266","6398900866082970916513845909030912477768318655743785125093873617319711480497","1175039218798484980072399121924972057008410392367959450703939688306902524054","5210257615122466358421406540799898540909863599743777249997433762286779163631","143871243170896096761286538359612900806921859208087130133106251324625818743","7825186589955157383712635126647794282971185739134506671734682703198205174921","19356492332655108003949429792555441845806681675195402015185308983898801715851","5469955587383559828097756439479681402770241102946573149636380518729022833750","9301724904566173478342992350770203303162818770127169929361533578664506545066","14144040826170485243395777956417332299961240009335454448818306795274079743482","15106671954584442557442200864211260493785606980074399349847632055753054483078","18869217976653672070772236404509215919650604056214055814018794444287298958040","11645420524832783721170737438334136629636818531954268745339783028025385754950","13439261978972035796996150244149252173133297973805089227133789936712760569803","15106671954584442557442200864211260493785606980074399349847632055753054483078","5512523756717871023776497641942984346783337720501449614794308618170512394669","5835554999819330558954089066526405560740259616473885793288693915684399039377","8863131691935358314236967173935315033413820679736774627121405457433895003795","17806353473562524209419921489674020711603878477377228029846764687154796899291","12688265548305129213524123982283433383136772509110047948234368697335124109577","18207961221628464226564927736506330628717051411055463190287553801949660581016","14776577580296682191308190812580888360497977691535016054206068797647787496417","2716120769329705626706313807317151735273953258897025678161053651818357382993","946455194947827940337729236114480813870835673647234481151109602462556270766","614966471251760438899692967903400348852862620490339206898848861882544111046","4116036656616283014460785251860209028828407967565755603300238819653622156901","10847231218503195759517071138679051602730407167074172266742227045164609231885","20895602419903453398196391913478058693274453903342785067983129839552891433864","15689970856593006158259892732288646993746887463514406392254922588756401796606","7408129850262826909244224402840856032373035919586685754734550738382550518934","16954193412688439955632320517883969169462813275902648614432177779074490622129","10822341224343704549832157601167511762192217681493597414750548578356092990059","18869217976653672070772236404509215919650604056214055814018794444287298958040","12998359993404137434826050598531205936631009536891015167391276398139095697469","712912966757927878965693240425422971881715436008090497769457122872348343952","12439760546784082202871583401234733990044187602943315324169379543365738178519","4933182101183318250560018811514844142859815227384938275570441539742336262480","5519776064110123180759081312729047106292930891845193268609251880658830705433","11964978685770609938104516880584559743324134082109819132572992701951308097934","20852945694892786589706882486760988740184637230152727898060254427102399724085","5157851077382368258831146921235005863841873179959407293372390317913027109941","3885925135313023686150115977607110368258492435636819989794778250027419367343","1632500423430879870300869265124598190896358768919584266600939773214617936900","16480089772180635258030461748402564771495064968752027484874049433567638476934","946455194947827940337729236114480813870835673647234481151109602462556270766","15718330550508436908559701395606414201668068552693146421627683872153427960853","10646102197739219326084794742182482777338903912449154661603058840745258963379","1570274245034538183221128634382794417097801245857820047802724595210806628688","9147263785534267636687968913589685560505104267741632426978703854622278136991","614966471251760438899692967903400348852862620490339206898848861882544111046","5566832184094895187524267067093217754199394279599836592480486864883149893031","7135473937218111453151804646361837547205712024569546168416088861245626015030","946455194947827940337729236114480813870835673647234481151109602462556270766","4087977103445290602464010775212316926483391914870441578758042979308767270230","16137218824867518993112176330612823176216439366022687220615937652371635085247","1703815020768376381115674913114725195497281256588197804868422201697152023777","1175039218798484980072399121924972057008410392367959450703939688306902524054","11412740120827044021870096407623293808851105071188140591919788265312361814171","12271983753113042626833634560364485293486763667349863253834100408006012012338","954361121666374676317512516553835448496801654442662842741750447529976221096","5519776064110123180759081312729047106292930891845193268609251880658830705433","19645303799442917520263849382981918648525479954858046014781621457535223129139","15546540006815490057793129658556841909859473017172875226825092156274503806084","16664225501027310427143425928031114680302400010653769373062555871803572912785","12964734676293244153748554238028206801414195417901916061140401142888712380451","1644637032401895183536122531980635414363418149797237304436572320773189961342","14588408860702774403040643085023102427643318176411097113905533342239652444746","17806353473562524209419921489674020711603878477377228029846764687154796899291","3401355104414210656254289265060762447824858847649022703190474278352208416173","15455768567639248552871867295320669874358209402041404093780654826364925510661","18869217976653672070772236404509215919650604056214055814018794444287298958040","13605376995820845471499102796322549845207296468035227481017989756087418839900","20663699746183765412904432768074062935933374627665221119822945660203712880745","1454875708970600335304126262767303975870655905960512436254375545925577328692","16954193412688439955632320517883969169462813275902648614432177779074490622129","20895602419903453398196391913478058693274453903342785067983129839552891433864","4933182101183318250560018811514844142859815227384938275570441539742336262480","1336458066220344521262880797524303149688311982013949559764047883761889898074","12984040983088595314698866307930588700679289984810017049345447973409490678089","10847231218503195759517071138679051602730407167074172266742227045164609231885","7236783279316083836339480995960834633270959028443867776543135480683166923869","12180564838572574785577178844314834812952191421495899999848160514539788519817","12600480540100512777695577363859185402126112711196993279255107913533806514345","18207961221628464226564927736506330628717051411055463190287553801949660581016","3401355104414210656254289265060762447824858847649022703190474278352208416173","4116036656616283014460785251860209028828407967565755603300238819653622156901","12863950582730082046148154608075135240263800483912187224256340414612337617318","3054509086575963631520633315863182977708152785332183337259997415160907095845","6714269803293029270909153658663808588557387497502190042744619007611526657435","163072371065782787415009910882963726380729563508259100978084406744617596229","18124161608764573031181181091746932116602343523449108232131693108002812215595","17698177298685528128465298198488735273578406532961103401549266592203987353446","1071564318326244075341980988866027669737011601498674724527637774926288977632","19883029896859112110244432872192403645617916717981765942483639413786774824574","12155172322986237416023663042004942352608253176870958535098713267207721181883","19375155383395696510967115781488322005907183312666977471331313827828265655931","12863950582730082046148154608075135240263800483912187224256340414612337617318","19470438559791413810807322334940256814752303267756345670901343982529444306002","4754713757431627318482916888231215818599754770670360377946229107868340173565","3196185115626403769090812264110127828126981872545481387659039004737077237629","11412740120827044021870096407623293808851105071188140591919788265312361814171","21876658378266334569964380224531738829113969654886515172706825001082187941302","9888239978634522925223196837194242311545989047209631150312165940305433080157","20342168169457748695802149508674862964537074611245094862559628187033717475867","6267275553024510648754807709238333654138152587130901210611391956543755030870","14535184095124950892028872912364622595212286520594227957147431032075397154266","2244871586170865025448272825497968057027141766617969218599365252909572535577","3117586190657126472592128104269081184451127080527182054370687640020932637738","18638025629280224617790168906173435277703684091772827588468099812026035539738","13602826144456356860284419687170541618185281374064216815711251835821492025702","19136646515076729474266957823959601106059804333394786210644361751043819130428","4006308849281273792274000957432061207143923231283130218997109288816872164471","4866442763557448299456393930665252678199356968867077785577776954873671002076","5523494911625033531158591406744208675721214018061290251579858790908546943321","14262959519701291686797273506458134133352406025405884284959025726384935370757","15798767315325760489132964686987872692994717940925570238047784420230331193585","6585682031650501777630925238370902100450071127640040426788913175433490518990","19569641468295105160418177740024945517842897645468872356974690513927041995987","19617883112060216036437373002520931262578741557295904537678304364166866283129","20717661531343094401419404535005724208121214979487601078059038701197331043233","15356303677036047765901840442430056519915375782726231750029051083606835464886","18869217976653672070772236404509215919650604056214055814018794444287298958040","19645303799442917520263849382981918648525479954858046014781621457535223129139","16614048991075038030789399956909315351324595917053714063050624141460033937444","614966471251760438899692967903400348852862620490339206898848861882544111046","4099531615762313645664270695169451400067010667159453849071079869270467331430","1336458066220344521262880797524303149688311982013949559764047883761889898074","374196098865630209786313311346578647643865900042267366994874073365518434467","9141525190254519952022341797682038597679704914972221193906068133244136674784","12964734676293244153748554238028206801414195417901916061140401142888712380451","3449083258780223991632112868061903902820017044757095982070790181182597682266","1218928037268356033769144531312651840516937586618523437511091378414585873142","17639609723574756459891329821328819780244585917274648474440537044036944455741","1533174095932179741832085722978096451211273368734335528806856805965059178550","1440944398068243290019815197893325790869382856018839453050014183551865062018","13004204931687393626720102454766944489147659600561337392365246286815729618336","12325315597559743752230693830058397065789541158772176272664764348470516075554","2972653442760058165486608510571475869094354178867521177094553776876904654370","8370264878441063630462671051957262849187564367781659467838460782939804026447","2959389974566411083204235326117036516979963119227951085034972251184734179290","20551785199765572414957755636883446606643894289625551996383687264006196444272","4087977103445290602464010775212316926483391914870441578758042979308767270230","15356303677036047765901840442430056519915375782726231750029051083606835464886","2683741289082249638876005424728100137356381224531970040303109182897410726686","7809308148717690892433475015444256746265555654600319391230796066961179227754","1440944398068243290019815197893325790869382856018839453050014183551865062018","14027649325388708488081280969586205626278814303627295953445422182588276435572","18594403705196476767375145654138028270042663039914897358747063340477738248585","16336411977121389060651610820631824246361165054986934015236391565811657107740","4478906216357891733779320532575007598672127166034590483003103843151770821805","15776564956440002895136116449299582951656581983212117550232796150916571692055","10593196891529840628734555040366549092907275204600028371924840487850448911826","13602826144456356860284419687170541618185281374064216815711251835821492025702","13183232877692246822590812126633640676351230654681431401704678854597307073741","1143725056710957642097279233815583467630238769694555684003566733048000751701","21536244638197709025858135955699906074571886472797743044193407266270319669578","16118914885963834916174025584295786549597018616252080891215345608189775067017","3085746588958121678695340573755073635811671969466202529706243909144419544906","7471975174935772955134792946513424637999023861300940920934522552454330255354","16651609932326344885003930002640274787869059718257297617745634674345809614067","8863131691935358314236967173935315033413820679736774627121405457433895003795","12233333935383563259381899984287101540154684128978249282626058445737562030151","7057969325794614252651980473201258184026879446024353453586952048006174273183","8177887533556223950928671845738575508418213402039951309409853690924708882619","16336411977121389060651610820631824246361165054986934015236391565811657107740","16391403911439019484448973048634108295486984765667310507956782776900193019857","16632434695136893331490691565954322107706581064802120383393065446949358038261","7532552732354833964818948844447124010555621930545046129036742684162649680796","2959389974566411083204235326117036516979963119227951085034972251184734179290","19375155383395696510967115781488322005907183312666977471331313827828265655931","2683741289082249638876005424728100137356381224531970040303109182897410726686","1071564318326244075341980988866027669737011601498674724527637774926288977632","4688608777744900238376640178893120441686955058686461498962807904713059186065","14862128476161472318832207576059761644997238747584253112211006461966427732368","14057612694744022955506885004102834629754310001978602939456750538201073114431","1570274245034538183221128634382794417097801245857820047802724595210806628688","13748763105074593620013986383045781773296715695306976461248290420913969610259","13079036262723496487062341719232498854721623596427562123822257284722043022380","15106671954584442557442200864211260493785606980074399349847632055753054483078","1143725056710957642097279233815583467630238769694555684003566733048000751701","12271983753113042626833634560364485293486763667349863253834100408006012012338","16651609932326344885003930002640274787869059718257297617745634674345809614067","6267275553024510648754807709238333654138152587130901210611391956543755030870","17018828663094797750757032992805443165559600645338019797634595027047317699068","13826842810792073443336072469158777368557028423710280480746021228332338112849","17539019008906665692358401403758991639375357012882690788487548831749474497244","19750715061039895092288075649509657235159241403400837501090850293666251108617","15776280343411227095808521568994471614057167432416502119979098996603887292938","19356492332655108003949429792555441845806681675195402015185308983898801715851","16118914885963834916174025584295786549597018616252080891215345608189775067017","4224433012242275812105292037318388809660019851311870694425205064696802439276","6311168126082531220851145980238852866031091078497507817682388947599504858069","12439760546784082202871583401234733990044187602943315324169379543365738178519","12385792108167898834965686312817629786971321080122734283967136719015404659574","712912966757927878965693240425422971881715436008090497769457122872348343952","14506356872966117174131859847846372170262756655915924664237877294288585233653","7135473937218111453151804646361837547205712024569546168416088861245626015030","13183232877692246822590812126633640676351230654681431401704678854597307073741","7033259621441273379090690993518324745190856903793390519675567591730089293401","16954193412688439955632320517883969169462813275902648614432177779074490622129","18638025629280224617790168906173435277703684091772827588468099812026035539738","12180564838572574785577178844314834812952191421495899999848160514539788519817","13582411668238263333995209483029305625601807569534701653376051071840372484093","4655594634855844188499094340496759182976213206849235604185854128079411962453","8370264878441063630462671051957262849187564367781659467838460782939804026447","17496320222604434917256246718514403734235740171188912286919341525891256570713","9141525190254519952022341797682038597679704914972221193906068133244136674784","21570485471295626790395474884741704872769989979943302238757938053634431270592","14214179218791945815971672263715227174014095422524111075841145981660259478464","5992148578777868893458748144399130666011631987544731979896999269126511048457","11275609334870619778800915975797190217946752952900097800029716348347769743557","6714269803293029270909153658663808588557387497502190042744619007611526657435","6221105771699561812227612915438412791747103897962033448670914370271924677164","12249836732564745436903455221618799619493605772253570453747572839223832061488","1493819599258016045339110999235422917168609982262840449866816239257578013153","13682529409340978640466595260264374070197250456280851982310079893206859446095","5568143431214976639464768845659406494667053581733825380813024891527928235568","13216746424486872049443607565713997095923431379037310625593547838968801990450","12180564838572574785577178844314834812952191421495899999848160514539788519817","1346980346605447755534859795013475283788975200653900831883060614677761712111","10782746953492500078751030180163064462657489179646951793154413574373371915628","1570274245034538183221128634382794417097801245857820047802724595210806628688","11118678586223256967063779327106075185044005359468107273605978537625172540996","9957269699849018786420105364721112375750180716923816099920663920684273075720","10286727453332438406648583236643277009562092681643525436851770105870834802875","7986666009024332686676662864413304092722307894727965157582073398188685188596","274618135907332659550125464790981847888019268634834758638296553463810383811","20131832673266427475769741534309108541338301173662948074665588100934145363162","19750715061039895092288075649509657235159241403400837501090850293666251108617","11545919418828350367784519368633485476721293708396219560182357280822873453096","143871243170896096761286538359612900806921859208087130133106251324625818743","10593196891529840628734555040366549092907275204600028371924840487850448911826","3005814121577142321238773726823845968144595752898226988876012545652019094241","9798324625310926002331408522163043190724749435063160272808536376189654148756","11964978685770609938104516880584559743324134082109819132572992701951308097934","12519200710540274443987348735978102700747472530155480989464845837532354722845","9679676316674197446267516028449539668288990002440917773972518794977810420407","12519200710540274443987348735978102700747472530155480989464845837532354722845","9957269699849018786420105364721112375750180716923816099920663920684273075720","13602826144456356860284419687170541618185281374064216815711251835821492025702","17603178439634188462056825952489860474722953595745235452510670608903852152095","16651609932326344885003930002640274787869059718257297617745634674345809614067","15950000082544045394526115523741159615348156864031044224172890462894241606231","18451742809683626507365133121132299935287207259245734910631591678742738573305","15214427790517490141925325587797963249335567355213168373025412405634050937481","12600480540100512777695577363859185402126112711196993279255107913533806514345","20895602419903453398196391913478058693274453903342785067983129839552891433864","9306117694572387027262464048290209213167312534461525812720869427821619086590","10690633522035360601031737428400068881001718255130638825096194976708724866144","4866442763557448299456393930665252678199356968867077785577776954873671002076","19108128352145842008548048053308217665383455218276209300064989051535526150757","954361121666374676317512516553835448496801654442662842741750447529976221096","6714269803293029270909153658663808588557387497502190042744619007611526657435","19265929620982371511819161020399302006822082297986006761385196152068883496437","7532552732354833964818948844447124010555621930545046129036742684162649680796","5649801951154791837665343131813310668539151217466670556566164087328114632489","4866442763557448299456393930665252678199356968867077785577776954873671002076","18003950806500496937907532373283544753235688820907806692295042001546833965033","12155172322986237416023663042004942352608253176870958535098713267207721181883","6071932171386993614931179655729818150534845046202199448265558256519848482826","3099260939107709193833554073787772569345965287506676970762153917208260772189","6072598916249169136908315542430764263321939399814654522032874918790340778554","19569641468295105160418177740024945517842897645468872356974690513927041995987","17018828663094797750757032992805443165559600645338019797634595027047317699068","15776564956440002895136116449299582951656581983212117550232796150916571692055","12042091411871087770321928117714696325647592163332119499975682262951606830326","8177887533556223950928671845738575508418213402039951309409853690924708882619","11433874323428772158013095381623924200138375055456955808189877801771380225552","14535184095124950892028872912364622595212286520594227957147431032075397154266","20046290436659560311648463454245918246036175981027749522810979896203323505017","5627116488283442946557217209333347313412518163016066550539282920861053074060","16480089772180635258030461748402564771495064968752027484874049433567638476934","1194604146042048350003512364693260099917768421477389239935129766419846021985","1218928037268356033769144531312651840516937586618523437511091378414585873142","13202400967998975804928062759810694884158416475176357116907186595278657876313","6311168126082531220851145980238852866031091078497507817682388947599504858069","6795208382791933114735572030062093331533051902721517159934364925403853532318","19936787863437503780283518973149089110020946214555834613795208847908690099190","9377958456884255467194088716477119239642797045077236472356953540022684583149","15123415314399351471075303556718608687323785898137080424470982286311735782352","13370115598260167633113987566372148589924273398862423406100474476922447871102","7135473937218111453151804646361837547205712024569546168416088861245626015030","14262959519701291686797273506458134133352406025405884284959025726384935370757","13025268118387164480802803485697296266258675734062176433653116451463846209082","4624094547626164902101572852723507795056700722159656748629760282341508155551","4224433012242275812105292037318388809660019851311870694425205064696802439276","5836322900178474894684749559174625794931606932780001961547616477680042620058","13908465977240917608897406492241943260778588976320614277228337961237626209809","2628389834360132333366589026387003814868457686372552787974500759887369913155","11183511759577952361572566673527592434184886344484272921682811575415051015276","12863950582730082046148154608075135240263800483912187224256340414612337617318","14262959519701291686797273506458134133352406025405884284959025726384935370757","16137218824867518993112176330612823176216439366022687220615937652371635085247","18707594353877082516395132272698629627555807696619350634836774054442394671010","15413262379943851680637741226631729175616759345996754775627005612359539596292","4116036656616283014460785251860209028828407967565755603300238819653622156901","3099260939107709193833554073787772569345965287506676970762153917208260772189","4624094547626164902101572852723507795056700722159656748629760282341508155551","4420985155765749198917158320211243542858248750314567273670169360313609199220","4781857348503260904895922377303003708601361291248025972804843818012461675526","16698515797824680501871676266202253211872118899888285886412000454073141450701","5519776064110123180759081312729047106292930891845193268609251880658830705433","6540725658063818695836967143056666761434297658403942276316050979804587769432","19215132962371868093445083227022064420405266792249240035116240824526740725800","19375155383395696510967115781488322005907183312666977471331313827828265655931","1175039218798484980072399121924972057008410392367959450703939688306902524054","13748763105074593620013986383045781773296715695306976461248290420913969610259","15976568257028838086904371689993285445196617581672212770040719579976951713437","2731702758715001559265750806008384495080551892515362156357977538139860974530","3133838166556165943824029176542597440374447246137252468511956694712122940530","1354299594199717859606388533670792913672908168692420372657948698842311093857","10822341224343704549832157601167511762192217681493597414750548578356092990059","17018828663094797750757032992805443165559600645338019797634595027047317699068","14776577580296682191308190812580888360497977691535016054206068797647787496417","18693317710730212151208513181186966573996077028828882441479768956833225751022","17492490034871188503809070393464727304143828491765350693224566925126105199911","14172013427642179266386805494272960512005525394680301845681753498295255309908","3607534072804388173311745844584795163913258697339304886139614455491456047872","4420985155765749198917158320211243542858248750314567273670169360313609199220","7815052247860712154170106628650576750781240048309328607812510735568644480099","9277147365456707051192593343809527681573500829831413326738310307567850123829","8863131691935358314236967173935315033413820679736774627121405457433895003795","13439261978972035796996150244149252173133297973805089227133789936712760569803","13051815778936294959186188778209982533089138172215506637927986094620164817648","3835902309964760173432611751283380612399529168609044921165087497368685977916","13202400967998975804928062759810694884158416475176357116907186595278657876313","15214427790517490141925325587797963249335567355213168373025412405634050937481","2666549942988803296757576401723478920911340699174408059253220554211642279978","16122380779106962898741444352984715606386470429041317890034930229550324363289","18594403705196476767375145654138028270042663039914897358747063340477738248585","7796937569050271278342402836188937027242003149541526098037517748511185180620","8140644209065967749731539711645757673629321017919126168806710308878873241272","5992148578777868893458748144399130666011631987544731979896999269126511048457","3348432210747515061385037490620056224077503064341935527160366063098820102327","18566222379922364157274850150988399654533738702075332376935729247934165563869","2476324937951789382181944025361875851099988750579823474754609765481889757439","18637620888308371607611642373870554933712342468791368368498810637591710912686","2959389974566411083204235326117036516979963119227951085034972251184734179290","20227979332701217082249100988795416872480735366357703927751699407575642930935","17368028902269277465024746642764987612414033705161996149238721534130490186941","16653103879864200321986465966316889764620013245316877484022986374603264725648","16118914885963834916174025584295786549597018616252080891215345608189775067017","5568143431214976639464768845659406494667053581733825380813024891527928235568","13641582444261924898950561772071287900110836262790950814969623169365632502460","15546540006815490057793129658556841909859473017172875226825092156274503806084","16961794929940055505618937273665830834556517799613603503371462732255229717698","11964978685770609938104516880584559743324134082109819132572992701951308097934","14216993731814681619137662595321398279415990565678023063177228088649900891505","7815052247860712154170106628650576750781240048309328607812510735568644480099","20350757034998523187334178209550008366903662221355109911310833181698841320621","15045123937812306625997417665247004551483049589009168687548501235926225142020","16632434695136893331490691565954322107706581064802120383393065446949358038261","20838188000013629937954971368567014585342187321412629930028751871743338652961","13545244560072730176162896504690392106112168077747273393293519829141026712654","6765546767316775630226434304243025099044057869188929458111914505605517807492","17018828663094797750757032992805443165559600645338019797634595027047317699068","18820995668034441064481786413532066855976405414499761311120499699159123037823","614966471251760438899692967903400348852862620490339206898848861882544111046","17496320222604434917256246718514403734235740171188912286919341525891256570713","18637620888308371607611642373870554933712342468791368368498810637591710912686","6540725658063818695836967143056666761434297658403942276316050979804587769432","1644637032401895183536122531980635414363418149797237304436572320773189961342","8461890310516914992976016102786941165050457592527945955052989873762315959085","21591247897428723764785205441739843186077784027717063974489303352320972773514","9277147365456707051192593343809527681573500829831413326738310307567850123829","13004204931687393626720102454766944489147659600561337392365246286815729618336","11398194787838497782166425813926171378663319996243937443066049287231892201563","4006308849281273792274000957432061207143923231283130218997109288816872164471","3885925135313023686150115977607110368258492435636819989794778250027419367343","3054509086575963631520633315863182977708152785332183337259997415160907095845","5055315503098445594062335518727177962919913361908453398984787599226169183337","8491224372742742395086082981236389730604525807576141462195229766319454932167","10593196891529840628734555040366549092907275204600028371924840487850448911826","5519776064110123180759081312729047106292930891845193268609251880658830705433","20750786466099303558578845860831937634908544617912415565480052280769840150510","15798767315325760489132964686987872692994717940925570238047784420230331193585","567433434521112381841206540791234080742279927287516260853551410281774875712","16391403911439019484448973048634108295486984765667310507956782776900193019857","14057612694744022955506885004102834629754310001978602939456750538201073114431","17698177298685528128465298198488735273578406532961103401549266592203987353446","14506356872966117174131859847846372170262756655915924664237877294288585233653","11889745823596890789749077573846619853793479538535474896498174482741572852641","15976568257028838086904371689993285445196617581672212770040719579976951713437","4624094547626164902101572852723507795056700722159656748629760282341508155551","15022199219678996727354667799147374096361570599067734481207390034887749042083","8461890310516914992976016102786941165050457592527945955052989873762315959085","3054509086575963631520633315863182977708152785332183337259997415160907095845","14506356872966117174131859847846372170262756655915924664237877294288585233653","9296362220804925104551234752226384203979024033236205671428676015277866160513","12688265548305129213524123982283433383136772509110047948234368697335124109577","2903328500810487887284040113540254258409278773721503335380406605532748782645","12271983753113042626833634560364485293486763667349863253834100408006012012338","17744796207881002836361754172345756972108243302293817629307470887005013537965","16954193412688439955632320517883969169462813275902648614432177779074490622129","2666549942988803296757576401723478920911340699174408059253220554211642279978","15689970856593006158259892732288646993746887463514406392254922588756401796606","2666549942988803296757576401723478920911340699174408059253220554211642279978","6307025001981604557276095751477581176989559254288853588059732891819079685284","15106671954584442557442200864211260493785606980074399349847632055753054483078","6795208382791933114735572030062093331533051902721517159934364925403853532318","8082817983718546987105551276971252463934917335856558917892075900846966350585","3607534072804388173311745844584795163913258697339304886139614455491456047872","19108128352145842008548048053308217665383455218276209300064989051535526150757","17603223305375528970110710410175592504507901335489871100398461389444688509102","15950000082544045394526115523741159615348156864031044224172890462894241606231","17603178439634188462056825952489860474722953595745235452510670608903852152095","13079036262723496487062341719232498854721623596427562123822257284722043022380","4574759938850684302328171377919788556520857555728298495027674689330859913909","5836322900178474894684749559174625794931606932780001961547616477680042620058","18682912995789016595436882433435139159334702280353629213700041190405671371221","18682912995789016595436882433435139159334702280353629213700041190405671371221","14647299140966795168634863382011786101084247791740654785196548451662948086183","19265929620982371511819161020399302006822082297986006761385196152068883496437","13051815778936294959186188778209982533089138172215506637927986094620164817648","16226984168490080400263373201570728966749962184950889718917387268203884202372","12688265548305129213524123982283433383136772509110047948234368697335124109577","4592739379790743343042028868384342794596363702987579215937879797639357089011","4933182101183318250560018811514844142859815227384938275570441539742336262480","12519200710540274443987348735978102700747472530155480989464845837532354722845","17547875379231708590555723879540779728666475590929028917859771769395698401715","21219905789358323534478545279193723251420616841556623254711235028135342626157","18682912995789016595436882433435139159334702280353629213700041190405671371221","19617883112060216036437373002520931262578741557295904537678304364166866283129","20342168169457748695802149508674862964537074611245094862559628187033717475867","4420985155765749198917158320211243542858248750314567273670169360313609199220","3608626711809097355394527544415447989465407554113965209630262872975367728702","7986666009024332686676662864413304092722307894727965157582073398188685188596","17539019008906665692358401403758991639375357012882690788487548831749474497244","17496320222604434917256246718514403734235740171188912286919341525891256570713","4655594634855844188499094340496759182976213206849235604185854128079411962453","15618359152517208456698312197785172766694127619077536561902714697931530755106","13748763105074593620013986383045781773296715695306976461248290420913969610259","20131832673266427475769741534309108541338301173662948074665588100934145363162","10690633522035360601031737428400068881001718255130638825096194976708724866144","18594403705196476767375145654138028270042663039914897358747063340477738248585","12998359993404137434826050598531205936631009536891015167391276398139095697469","9141525190254519952022341797682038597679704914972221193906068133244136674784","14144040826170485243395777956417332299961240009335454448818306795274079743482","1570274245034538183221128634382794417097801245857820047802724595210806628688","13597601271430461916896612582648919742272715556061113046784825140314498905478","10286727453332438406648583236643277009562092681643525436851770105870834802875","15710422838883679733600834907476906094570753444844580151730513642276654631674","8082817983718546987105551276971252463934917335856558917892075900846966350585","18703989514997223432661641229861332310348080898339160493229575272467603319271","16480089772180635258030461748402564771495064968752027484874049433567638476934","2967213245998332384543885104754783540899439580884490432048984202068901705944","4655594634855844188499094340496759182976213206849235604185854128079411962453","18637620888308371607611642373870554933712342468791368368498810637591710912686","15776564956440002895136116449299582951656581983212117550232796150916571692055","5210257615122466358421406540799898540909863599743777249997433762286779163631","8691474413369666750892234614358820289658368726857552974633024543804680298964","13605376995820845471499102796322549845207296468035227481017989756087418839900","3196185115626403769090812264110127828126981872545481387659039004737077237629","21591247897428723764785205441739843186077784027717063974489303352320972773514","1194604146042048350003512364693260099917768421477389239935129766419846021985","10782746953492500078751030180163064462657489179646951793154413574373371915628","3885925135313023686150115977607110368258492435636819989794778250027419367343","20521411631300308681277111693281832014010918653298260542960102164696238242229","17582818757173661762314072926867802933652214827993395929831324522299049413904","21780456150575058339898563710498965468972448244984833163147655946608027181634","21591247897428723764785205441739843186077784027717063974489303352320972773514","8491224372742742395086082981236389730604525807576141462195229766319454932167","156542953578700199190349883532041470160708612831113224539973504251955528744","12519200710540274443987348735978102700747472530155480989464845837532354722845","2544185200680176111354240446924889864706979425265095363625611785655132613870","14897910390493117493085561230943786488745018480007968413736887385270447651383","13051815778936294959186188778209982533089138172215506637927986094620164817648","8370264878441063630462671051957262849187564367781659467838460782939804026447","3986804060834622107770115616180027696529168594693106325651227138002220680218","10782746953492500078751030180163064462657489179646951793154413574373371915628","15976978918004336355901319629352200911328902990447017277673724626919242812955","8328030641700015547962729319084004225083584314272156382022742953974692359024","2476324937951789382181944025361875851099988750579823474754609765481889757439","2476324937951789382181944025361875851099988750579823474754609765481889757439","12155172322986237416023663042004942352608253176870958535098713267207721181883","17603178439634188462056825952489860474722953595745235452510670608903852152095","20342168169457748695802149508674862964537074611245094862559628187033717475867","4688608777744900238376640178893120441686955058686461498962807904713059186065","4420985155765749198917158320211243542858248750314567273670169360313609199220","3145275707337847188939353064357731848534516166917140907835781738084777990262","17603178439634188462056825952489860474722953595745235452510670608903852152095","2235150263865959136421726440400433738501848129328010009098035293276672220717","4549806302643127256376053744839835469729529127535077121646524402308295761124","17492490034871188503809070393464727304143828491765350693224566925126105199911","18729388765252309558574413425774793050225406365031444286319123071733886008203","16480089772180635258030461748402564771495064968752027484874049433567638476934","19883029896859112110244432872192403645617916717981765942483639413786774824574","5836322900178474894684749559174625794931606932780001961547616477680042620058","16653103879864200321986465966316889764620013245316877484022986374603264725648","16698515797824680501871676266202253211872118899888285886412000454073141450701","12233333935383563259381899984287101540154684128978249282626058445737562030151","274144820678452421379816557330510579317549145397331786233749585417771792945","15776280343411227095808521568994471614057167432416502119979098996603887292938","4006308849281273792274000957432061207143923231283130218997109288816872164471","15435596047717285113986137313550661564381864970285528104339022986255133148722","20838188000013629937954971368567014585342187321412629930028751871743338652961","11433874323428772158013095381623924200138375055456955808189877801771380225552","20131832673266427475769741534309108541338301173662948074665588100934145363162","18820995668034441064481786413532066855976405414499761311120499699159123037823","10599184745355055122827201680284382421384308407491311763734067519190170881017","12876212902112174796123067808109407354255021515914362771981709565057633093870","16122380779106962898741444352984715606386470429041317890034930229550324363289","6836865286311343609694524245159119133769123287741705285044672797797129131253","21591247897428723764785205441739843186077784027717063974489303352320972773514","12385792108167898834965686312817629786971321080122734283967136719015404659574","2027121307515028227361803453971004574835283397634149795685942874063731877044","3005814121577142321238773726823845968144595752898226988876012545652019094241","4866442763557448299456393930665252678199356968867077785577776954873671002076","20046290436659560311648463454245918246036175981027749522810979896203323505017","1336458066220344521262880797524303149688311982013949559764047883761889898074","8491224372742742395086082981236389730604525807576141462195229766319454932167","16653103879864200321986465966316889764620013245316877484022986374603264725648","5988689769882991468528359729958078604149342871940113378259733314892811441673","3005814121577142321238773726823845968144595752898226988876012545652019094241","3133838166556165943824029176542597440374447246137252468511956694712122940530","11183511759577952361572566673527592434184886344484272921682811575415051015276","15613087414575084731294247924061147534041250959429049604445183368849211416480","4549806302643127256376053744839835469729529127535077121646524402308295761124","16632434695136893331490691565954322107706581064802120383393065446949358038261","4933182101183318250560018811514844142859815227384938275570441539742336262480","19750715061039895092288075649509657235159241403400837501090850293666251108617","6049121453084659222825489908739822792694774158293989229260853547616301268692","4549806302643127256376053744839835469729529127535077121646524402308295761124","13370115598260167633113987566372148589924273398862423406100474476922447871102","5469955587383559828097756439479681402770241102946573149636380518729022833750","1632500423430879870300869265124598190896358768919584266600939773214617936900","1071564318326244075341980988866027669737011601498674724527637774926288977632","1493819599258016045339110999235422917168609982262840449866816239257578013153","12998359993404137434826050598531205936631009536891015167391276398139095697469","14057612694744022955506885004102834629754310001978602939456750538201073114431","12863950582730082046148154608075135240263800483912187224256340414612337617318","21451388112829145060821974036366132513327328641208732802166144524686108831760","13004204931687393626720102454766944489147659600561337392365246286815729618336","18159717335881315589645032086713288496782632932867903491586009514211947568031","6307025001981604557276095751477581176989559254288853588059732891819079685284","1440944398068243290019815197893325790869382856018839453050014183551865062018","21780456150575058339898563710498965468972448244984833163147655946608027181634","6836865286311343609694524245159119133769123287741705285044672797797129131253","12233333935383563259381899984287101540154684128978249282626058445737562030151","20895602419903453398196391913478058693274453903342785067983129839552891433864","18207961221628464226564927736506330628717051411055463190287553801949660581016","16226984168490080400263373201570728966749962184950889718917387268203884202372","9141525190254519952022341797682038597679704914972221193906068133244136674784","11433874323428772158013095381623924200138375055456955808189877801771380225552","6585682031650501777630925238370902100450071127640040426788913175433490518990","11645420524832783721170737438334136629636818531954268745339783028025385754950","12313143896208759390351526641510039095883815550699902043061685514584813600074","9888239978634522925223196837194242311545989047209631150312165940305433080157","9306117694572387027262464048290209213167312534461525812720869427821619086590","7800856132048238285999367318239374829634076893379031119745654756621815300429","8328030641700015547962729319084004225083584314272156382022742953974692359024","19569641468295105160418177740024945517842897645468872356974690513927041995987","18703989514997223432661641229861332310348080898339160493229575272467603319271","4006308849281273792274000957432061207143923231283130218997109288816872164471","4754713757431627318482916888231215818599754770670360377946229107868340173565","8863131691935358314236967173935315033413820679736774627121405457433895003795","12616472237712801953990641170786430111219637655930398736307229893389737211053","14799475491656615059372780774624370709464328674979516248659286482744107230446","12600480540100512777695577363859185402126112711196993279255107913533806514345","7033259621441273379090690993518324745190856903793390519675567591730089293401","17603178439634188462056825952489860474722953595745235452510670608903852152095","18693317710730212151208513181186966573996077028828882441479768956833225751022","13641582444261924898950561772071287900110836262790950814969623169365632502460","6585682031650501777630925238370902100450071127640040426788913175433490518990","12006531986840408977918622834986049589872827010469069694616415380752223757192","7471975174935772955134792946513424637999023861300940920934522552454330255354","15950000082544045394526115523741159615348156864031044224172890462894241606231","14262959519701291686797273506458134133352406025405884284959025726384935370757","1758371485945815703876679445382538767819559386912271388124907980130004330353","18707594353877082516395132272698629627555807696619350634836774054442394671010","4116036656616283014460785251860209028828407967565755603300238819653622156901","18594403705196476767375145654138028270042663039914897358747063340477738248585","9377958456884255467194088716477119239642797045077236472356953540022684583149","14841990498171696915559636042318167569437811173944889089519208821758196118572","20006509131408258657369129395045362318044780385983476979717124299339121586377","6049121453084659222825489908739822792694774158293989229260853547616301268692","5568143431214976639464768845659406494667053581733825380813024891527928235568","3117586190657126472592128104269081184451127080527182054370687640020932637738","8691474413369666750892234614358820289658368726857552974633024543804680298964","17582818757173661762314072926867802933652214827993395929831324522299049413904","21267939098918134027395634942102971885281982111723141238850772621986256662900","12600480540100512777695577363859185402126112711196993279255107913533806514345","274144820678452421379816557330510579317549145397331786233749585417771792945","20663699746183765412904432768074062935933374627665221119822945660203712880745","2628389834360132333366589026387003814868457686372552787974500759887369913155","15613087414575084731294247924061147534041250959429049604445183368849211416480","17174337625009122870708859925793325997946378966416309900853757797594910229791","2967213245998332384543885104754783540899439580884490432048984202068901705944","10593196891529840628734555040366549092907275204600028371924840487850448911826","1218928037268356033769144531312651840516937586618523437511091378414585873142","19645303799442917520263849382981918648525479954858046014781621457535223129139","1218928037268356033769144531312651840516937586618523437511091378414585873142","18638025629280224617790168906173435277703684091772827588468099812026035539738","4087977103445290602464010775212316926483391914870441578758042979308767270230","8461890310516914992976016102786941165050457592527945955052989873762315959085","5568143431214976639464768845659406494667053581733825380813024891527928235568","3005814121577142321238773726823845968144595752898226988876012545652019094241","17603223305375528970110710410175592504507901335489871100398461389444688509102","2544185200680176111354240446924889864706979425265095363625611785655132613870","15718330550508436908559701395606414201668068552693146421627683872153427960853","8140644209065967749731539711645757673629321017919126168806710308878873241272","14799475491656615059372780774624370709464328674979516248659286482744107230446","374196098865630209786313311346578647643865900042267366994874073365518434467","13648236315809483800741231329158534760283476979282874649596812220944412887454","19356492332655108003949429792555441845806681675195402015185308983898801715851","1118279149946874054339337226256428104508684927524794373040609290637664978199","15045123937812306625997417665247004551483049589009168687548501235926225142020","1689709601556268020419125248006910470935068691712645256591639741945971733744","17089513984383051444012804212344078898491877698852637641465487102929365695051","3835902309964760173432611751283380612399529168609044921165087497368685977916","2544185200680176111354240446924889864706979425265095363625611785655132613870","3348432210747515061385037490620056224077503064341935527160366063098820102327","7986666009024332686676662864413304092722307894727965157582073398188685188596","7567096820715495523465831195561335361495276610103173418515651874250913956034","7800856132048238285999367318239374829634076893379031119745654756621815300429","21451388112829145060821974036366132513327328641208732802166144524686108831760","12042091411871087770321928117714696325647592163332119499975682262951606830326","19569641468295105160418177740024945517842897645468872356974690513927041995987","7532552732354833964818948844447124010555621930545046129036742684162649680796","4624094547626164902101572852723507795056700722159656748629760282341508155551","2666549942988803296757576401723478920911340699174408059253220554211642279978","9888239978634522925223196837194242311545989047209631150312165940305433080157","21267939098918134027395634942102971885281982111723141238850772621986256662900","17080170896205579351487820867879098448749980844566584779831865641843648559954","4781857348503260904895922377303003708601361291248025972804843818012461675526","5001232371587577350490476563931715794477203224577970619789108259266886603950","1194604146042048350003512364693260099917768421477389239935129766419846021985","21267939098918134027395634942102971885281982111723141238850772621986256662900","18707594353877082516395132272698629627555807696619350634836774054442394671010","7236783279316083836339480995960834633270959028443867776543135480683166923869","21570485471295626790395474884741704872769989979943302238757938053634431270592","16632434695136893331490691565954322107706581064802120383393065446949358038261","954361121666374676317512516553835448496801654442662842741750447529976221096","12998359993404137434826050598531205936631009536891015167391276398139095697469","13004204931687393626720102454766944489147659600561337392365246286815729618336","15776280343411227095808521568994471614057167432416502119979098996603887292938","7057969325794614252651980473201258184026879446024353453586952048006174273183","6994664438597925475223705340624595897260559921645516609558922687274714825714","4363738634465882118172307854104596042899685656091037340905869811610138317347","12180564838572574785577178844314834812952191421495899999848160514539788519817","13079036262723496487062341719232498854721623596427562123822257284722043022380","17496320222604434917256246718514403734235740171188912286919341525891256570713","12271983753113042626833634560364485293486763667349863253834100408006012012338","3117586190657126472592128104269081184451127080527182054370687640020932637738","14841990498171696915559636042318167569437811173944889089519208821758196118572","3814718729516245467542823378722292629370285860606484341016365565551107845022","15718330550508436908559701395606414201668068552693146421627683872153427960853","4574759938850684302328171377919788556520857555728298495027674689330859913909","9612640678039527906483661330640693201947160578570955411180830848021191312999","12172459979594272836158443334993722622077942972483988133675801482944682547814","18729388765252309558574413425774793050225406365031444286319123071733886008203","12233333935383563259381899984287101540154684128978249282626058445737562030151","19375155383395696510967115781488322005907183312666977471331313827828265655931","18207961221628464226564927736506330628717051411055463190287553801949660581016","14889586175325483443041813226686357400339931463122742842745317460691290784136","9770821889969753026439714135746557936968725073065412883354694679382717123968","3768167068773898722568469507920346701450511503268567897292049941704582796136","1899628457317453197426768456858589983666227401303606152877725712904770786388","20236454182607023448722579291892888454656044680186829166675261973593187415963"],["19444847062288131493943706784497406601211185688116273754131863169092610576967","6756357644703883372382000235355183123582254014035599689202182239604052730084","5834963883005519863277737060862183242422193207910302638450418995361988638650","14630532141997277216138304497310196564144668507296424668904559464853731825529","276005601789737429160222670723919227435048289882730462426149086438071032420","8155169592408501114771949260607780658108674298838155446397409772814142490986","8496173005628286226067567535490313700679832176191507650779467185231469190908","18522758669123103820765651383058550163152440728027329605661881000152433829894","20717160396907128742447930491661507548527901200271695593644376944470624644874","6783400954785427443777419190369959791457729235323837312105292689987925420262","15793588416019429949037560428655750893129153960665891892058368228751095545231","13047857333849170739650468523722679452310178134682835736334331719537030864403","13702952651241896077447912135262631109194634993417767336774463460551430174591","16771524083619709591205953781761522848915592462004352344297444083327000335914","18362879251176766534772404056399418613362042401782184697324682721000341441514","1921169374568757279790536398590170773520268712196928601546829626342058380013","18007271086827148118702779138045717036566051534448069739899858280155274498416","11677788058520437899562086139134738123234096436757857524455227202665943485909","18567835086166004190967610331516651777840850520761110277224875363942309193033","12549862092815494374468253271773435129600234325866279388210551065809722236154","12545772019827878627361160408311538713526252988913811675565306764418681013019","17790976380038280976988246085058593967622099860594622912213483950365513994179","295342049608542310001266607810723788606908957088698225682924285077522343374","6042881253538576878797032051936765585731381049990189646390895524714385119979","16177540255744097871521288192447267851650838298325801002101754584177258351542","689944521090171958642896246746378107452915085681977844021127122085860793418","21806600652809306442934150151527166374544123717499224666056071691980718320158","10687999924804520822721645773635035131067056997636998429204051086244451458352","2919688173439697460443732931955910957668633676232388974155373692008001074942","2088428214431812495479622929730813017014992498691761094277448089379469403302","3415582465565312695281321795946675901044043725583982633056443485871119407177","11432629911071490835626964427117253752817170646912779324491272989814675105631","7810232533291842805873821935461788355487026463002760576510838277131727012637","15850563248943823248196314184730972664098169701487536058299754250660946727661","8728976634161630217358665668742559554087067616326533741880426574160431347132","15547734297253509235806418165603020662298589957875421913304005171944398984391","3158249123091915580481792507317767452027547932247936126792366337689584842781","8993351209143960585970304728524607023340419549878051384852055190939357644360","4916077676642951295302597643655156805863813630504586598619800437364856520347","15052050566960149294362189709830107098243646295893587902102267385191499441867","7150859141970623502564908412249208973629105197031357581428846816632024424773","5659463774436746876994077967866722465283824187257515817896446525143503038229","19464498962894958485813692012599931383997188482601571850575384753467351286244","15817240123388522852498302303406312726664688503153075471764110095076928497826","5302571205101485049626764959256598947375033298608344128379324163720645334410","20692740934715863051898617710088924214854286115389280275696778859743980624203","16121180084056885385768374518937623712121773918849607938195591718986083243748","17449335744171334550114352347521422770517337704382637045934115518315313519219","10253291411916249149409944484940846312189907495150544356013969086126665142627","1075989933051112270479502705317054499580865741297076182284940703542006602757","17496779585745191468575660181265060269367274078653980290860692264179679950345","3538122871871015265597356999511771252266082849566808379976323073541018816059","7579486643564421792498711360748450541290817800587156287997063934548078067430","12729453322089802294380978481733715584931031070971499485676879773953031357372","6694633370369966210102257937726749959486994134264582443016638266185985910723","17623873916481672691654892260114036685248130649477279788335331445450611897752","6307701910454308121209261684131709903162842155523511946468120801525808144713","2490437230848135899340146974626841790838141435966177610519877944111227880794","5017798776934405523649599878486720454877889960063314088092139283965398786505","20817420597532209277094254254011796300596270364114901508622090395551862021369","15258825807346731106480585334099109914680431439052544107298794895009458789849","436207735379833515948816288186396517305806158675320799296446691642166338508","13294452063087597313135368572465579195169503832488496277864688043228247847885","5281958238296057162541008015360609066403026130630047672176591872125940281371","386042965256259984981370670464051577241496612285005807238429392957903257172","10942243549318138624734474054079356060390652679206672396911330609350570685574","270406167611514320681193466529653886068620721651325372569688862100531780060","21769039780368018587024190597032828628077779629457595552733479023564952366755","14257848362862950978758226475754708328366569815134458955450406250786029562719","20675103741730086975536120126603499078928196755869920413190380095671818551245","4092670173605738716451085900386063604788602581706203170812942738120506696245","15831649561312402734198126328637255008767394666669354210368241338558776960189","8773460264964044836577029971056134181700063958452992767868071607709089255261","15969366571969091014788118571658462634361656562903319995975427897452380798450","9090539943906640916226800382217696518430261301435146060171359093957899579442","12598966212710420863490627175550230608849032996842656735190850410879434661800","5082369006304868528209185647948375467679404699238424225315402327829344882479","21232583620520875935273928036429179339733541639648304803699206026350761939727","15216028261411784444168994831958830734443664066057913354546359559245244924050","20503252723414965832541668822746284724979697942657467137170476075965669970069","7028702238870184282283447120220627544268950018331505390418179769944671024747","13914367585327187338201419330215996326176015243409712364994147816309186215349","11972191955486214659980933122765802430687113190375208665981572404973523390750","14164313126758634946487037847698512982901341175183925669745949763512995563823","19643507624196854874403818379994773749775871114166053756059820550045254990949","6253019705251155387518897830821875987387745060770031720935150387804561656767","12614772411624778073372124421221342091038200351899023491707175227213282820386","12799054234177807811763785306399761459507163662627299853945472202258817984059","16298413623883813223145205496435140924571599757753789623615680953320915107823","8610548149652073334956208860269106926096928271670836846827000353008597438642","9836284514785177186880347525497271134591015465315721313213772552563703130511","9784976878800158500585413974169708349867742257336666799769685612736807878718","470868555320390516869442830897247668225662850353632628471628589894687191840","17307217182098561598390477407238405653820260056045707641305128326328073989247","4674116504957384653684422429847190124325067762798863539680591567775099711828","4731805738765155173300706694658606612354279416357285157979268772012947617710","19408369527037425408359080120949793991326211819391999900817736764475384891087","18547195232973238597820755220571190923184148106985108846845816471997990813451","20764687130261902672266922992036714570336508922412884145266283492627732623055","19892377301785347591650272014822981146836631795074611861111907754644416903635","6413734757240628076834626843107147847105076965920897092716625820251267566099","20860174097442586122448303694433017965295045714190140568637973811484764859101","9976157929114087350046280965312715789783677114993652036414680945525100911346","20443284379975649347549376624760041838634895555678719470752881701519661070489","18893870838626114784034800186442840105625315290994458907142980368089948593544","11133903488642571617254269414928956946413436570602781254462926700298981057101","19260150650655385130131812830419214817760729375303617428649411135535896978281","13461732242206018780892854302161037532643049992617159415492401398338285247555","17102228736482758300705766391088892608834968842141194901502696136509842518851","12272871719359531993455999114365256014273629799700014768301209571123981371707","3594207022562239110254525411112455614396088633713917231917804057840385838433","11285761004669862352633286679979731173931391709324275439550892089674658948897","16102568806633415123079332012340754062427981513856504035688871887957095441264","19519597368641109872437527694712863032289967186787139583473763662663666076515","7850893600020675091200117628857569397261111640016750677979107965392238148005","571603306174340121900401663556670083480079944829773014219141824601049859366","13417234230361968064652407531174824869916389080577175614370178295183391972896","6339479905118967532949951465214069151191196402217454265147854834540663125252","5960266217431370639351267159124277446305252772759082083832329486288316249467","4827913422416492916492150995943144270796495141536283583210133173575222257256","505835591148323979694388175613018554712950286622892296281531129078833207836","13430162365250371418058587486919957187505271111954906160838200205517866181347","11791683213979729551370231161842890041856917089671010365556092948261209641299","13878734884084908403388117942446409924859492948402374543903835601747661416301","7914593516489852442626571171726775738811006144753811688169867990351813492226","10797302146436138655457419302923103882636832085380740614686862737265867963715","4394985227939438982168027081286727479189710464482074036154622396987481104200","17846370028727001276602920123596000650348888091372292752624526729964991577650","1399592710245988806733110276286400825565557403052909106157835149189269504885","4480510739831473990116609789595044875609739639498651344219709760264319707941","11004586942348048001456673131635437257298168527005870798189423435197580585412","17257016484028305690607802548970527681899034872857606356645268286697823560745","15880272219577681239503657424149468083362971750716603748729669119492924589385","15904554418638709990040031800946465318235842277305545433558322594469065553553","15434974732418275887764997429917488815499533240877756132902224733577879415473","21820168018779047045619488779286049910110834277003434094980989418536264599715","7749008375218427634588074063863812252051333204096406815453992945864441895362","3839511695466461913195739285494941868041132999203534272477982111080050006523","11192270025434739945085840100702117964637847488690757055208388489558083138446","7139432526479835672329459147861644569732921891281014828670035430783917357856","13194122716181797306702591509497059325803038795351433491511874742185743961578","12249486681620499703064189091192752491339675300250225642057366857872815164391","12751753758565217613271991442671268614075299410246481820732282132452214741118","14152899301351110068123785825973380466012981712532341785578761964446295185434","13188569584536274764354182121465196242988977215787135260110602036659203482271","8583058680448359031190112033511783279444748692566437598204669389441269594527","20739303906393962278673616858161941640788810322708163071371214143202505636285","1180296912375731347768428538731067445729945471280254724677426248781662325181","6017789428689615319791053684659036780814847053654130311712769439159937889609","2173620618321392312337995148079704379859037528218619197239932038613399941589","19342061241883725191788390495410721837582278801952815468188667976311290962368","11961293118976486325969636275124778155072321144934089356127319435440178254418","15003950077727351663111929517428911404929041518452601562597474042673134378445","11722551667664037124885783671627704449310149868015743702657377612966423359961","1589112258505679428520003152962075989895613700798393982576451871741579895537","10237533647542628466819493835368797714803583017400048476478599541985305410468","5633483783935945421681172594360251312787053845387155338966168908591309720937","11524348046498741796559712688153551628725965921178062387194745025875547122301","4119351785672815550070213600551390224338330329829235301635622400744195777997","8220379217788713766164367196730350016648232008308605440647920160713746282775","13638223826667319442473592100092923906983786522766094318050487349717540347281","12855479012377423286653672887817339438150952573187773204679381183748640361953","18366449890796594374544459463322936541588534912307972856193862784267127118823","14831494193189198695462931146064274924011201974477576494408974317628024686185","11093306658789847420019060296285299107442543903230107282402432370912267955583","5231748467324162438135669634394990945005973450791245562369389835255116288637","20334409444101673859585989946641575861192600463100161126574009339834336019122","10942950770398062877133838468616134250348068685639337507689939414774241938827","21031737058468102950077505705229155312762606827754507238965327181803396985398","14995690437383350976947687078631429818437217746718268679299515186473891812908","1173662311857265316234231482479000224594910385121353149729453581304925842874","16317128331316988904656774031136187679889289360179612223631661201288928381507","18022252460738403017955303125247197991330411362748880642725885324976196166640","8288649066280936236016549066415276935462595711048345269972110782845103139499","8101426167425842649552999897331966976546505505184628823541554176858292445739","19821753079400865197220037270302986474791903810187177911888698563958948917390","2784180484916863460671428583402451895733388047312540417328482549247889132480","4344349451137697568800756375175722014382670587070900626206184353193889614535","17108052563527778392492084240217991568486546407558042288984049724593379381422","7485356603493015640805315156078413547503227090809875264979461763636775540173","20116242746183168873263923842229951811573923370432089711294380935911814240419","9858039399154443683907425505646969133966670338173331647839576035520625125303","5936033307217133264257041597188115964457637953718647112906870372504454763103","10340607376355789386185133452696959378680344963374631186204861558290387937896","15143103911463403933694713744901214045515642353696764687126063928209653789192","12568011130622849006768060215361376856516151918301278020507921479894858098922","7111521666440256973246253704702100762492860379595157618666729636714922588085","7580486685427227006299614937862983316144183764347073757169003614550356572325","12502519505884004909911681176131189323239621629488138970782034914590014092043","9863581385421851101081385563919847832922036616162751380834430385700096059476","17089158809476144094792821264939338147530021791726877719480271708166652703326","7026088105062704237034940019476526637397741963002343232018356066556664336014","994845445499189024937804545514312797076696078022167307949339617575675546961","15876781382035467218016033046055811573116707790724628548144881416519229111730","14689809674274247318241891219567086413796397509459798242967892601162783903120","16802092988897859361455231737511996509109485446405679231988222489773597130923","11709594647859446002857187914237272532186051520048442968950936220950857315304","4759519183626534098537305899218615829180752782224491547499330146161396795604","12571776796240659864426729857318456609425220646299460273766246547672790642171","2769573858251324685257310553432601557929569520156842199955099014544291860073","21350702766688879701309742399569256840528276777122627878991656869575644945880","2526626063522996270964234050318417686046098564667525063669005074312714302888","18423969495073310328067310084757878116209975357377687351451039175700497833267","21531220091658777616686839660258285747325371338144374109694041768891457998130","8427394214275103558108677503145255849560869946329377312496236014365158589665","17828380319195981604154858938823367276654533109286377267191125673334432160668","19783211215983774081961805533835609388239392763346884852979216953198247940356","3727051737154131506128614318795547682671073691116653628343563309169975365047","4119083313708678127132222977172109489163864264438306707583540610970422311783","6252287104931155232025872198136217318428623125187576197254682957610815437724","16710755249167084189102639360502018827510499697025984202991420112604257385843","18110033746887190005442882808977635890410904404891461118841516946874175301218","2918227864528514910093363913084628926376993023173539111767698239437487745517","13157904629518409143900661589841979526819718227397509343138754500932973967009","15465984474345304234742186236252931608183011971272680663570940465290570424186","11878026413156941826685108652791732794881788651335612324490880949402660131765","21741112052399478281259924033664983472268352228185898315463068813827126161518","4747527944432994412143611227692094864627491876083414817086093654783041623806","10277509022239901860432140475301792168394200477149266436561100920061205891272","20754999404087624192417155025756386217241070628838846889103117636133597080130","1227483547193673052804267071643209335283088310397022289984033072158054393499","16307552232859454034882961446345138774643318545424496725987397798274178077698","11567226711210341061121984162541681925200952470462920272949521200488251321412","15424227904345959422619063085953205567698592752523587527109367016932522520639","16823401920568234413742595921287817924794689336332341371093680173736681497958","17178500371576477554985292834973399172166544093847768566487624429998590283954","1102400953040339496875839457489553861844373351305506415352858751913370587559","13080464865068812038556558702873972281884160558346383435106169788680033625409","17566439771637037764512551735908097926933863312105991588803956078424179421422","16017589041969736678541292248300058552736340849527861225476737351214952910390","17523132608433278488363705847003860425511874430394165130941513353774134550203","8092883253891793587844758644260299541045067550613025971974356731243569159353","12321254675263434305822776900976243546292614577867012315420304293383073504807","19531149435917118867843015828825849821207961709742362361864708921630704500355","15354576088842604762866949406584165222230700080158133636047990454918586008294","21332421319707262576917441034633152814114387620450650854230219273363255599523","8015272434831541996001880872358562207725683343073706305494326975486227960571","12801191151888372376060502552634956842440004908360922421581803464085063730700","8694104440224692716427888474719601394171838580385724406065092424387979527599","4765509078609181892846277022626232660521104569272055934150322254832843470212","1707661917588143644633891057877135790850785409331274025620234613394143277776","10787008015387605260759430860865388187745278282497799140302256368934199376144","18194756507120382377518900347608092311408202948025495396169941673887229961968","11810263163672173278046828506977243322053551737568215505161953008771538087012","10172831874213234727939155250453684259406380736682460492997296249444174287647","17213618752642545792657024676808752714343165784509075154710334645425090992985","9518819925372898218456223308202739688600409921430244215353056882744779318092","17131123136661624080110214353958082369854888444117983370276647495116278598167","19754012921975586054359731668325890866854753884616461552066225420294483351377","7462008052105461259399778705587223745964230591131678540554526750478109055926","5484333959594514705555581721735095833500903297285196545219921231872772537173","2557226013119092043233815190178143918872697500327638257441826698928999698503","1507054359686440154418474816353859974171432117437965276706552855449701554081","2909679213050550436618171367293366253775019191659100521218714623421006853461","10665116922568564616606427374948039957862979916786672099258153181783312457007","7437027687262241094771256075741913500475069050164092161144508657935421667697","9967053963569379718319069707565959289787419857073584408604810513462532221521","15718982984756021542737562070818004660368251058309053869841344798298950796472","8594575682392663586907570362979165880675434255219238535736457340406406145184","9849370649402433736350811470041391602601158790752692132296227692446786080869","9624482408802253671341983829498637676172459849241801149966973606965080480613","13354161934013526849172225712805307512472349171765307613219141825881166556129","7119937145734334389233313270329538489802620576999159113776679378225285195305","1344157477128478949987376865221983316869875771654805484027433189770507053978","2436371520942165567892833442377818872689562318523120379398949725464297140490","4640506731710423220152475272336202432209747972077657499961644265967270381722","8134111173406553366062271384030182464082652625519520524317327080426662707160","18835504434223507510706711065799771244448550952615072290009282262161978175311","14077721328629763505638231073434724231382773989965313645642436166756183358663","19436373778921499805072424422947303671456441758269542721598857156355476127485","12568904822717093384930952712937445754376237421200202440659283713620770814211","20314955959257660560921000685610824477917159776697875155847298772747329300768","11405801816929456032970782505841034689257844102373121701727764117532089184356","15371647220804665136508666928297419442325993974748904907636841654537146688325","1655879953669995298671229751452904731600368401825229264959225234155007235923","13666140938671349359494215404645073043195359971495797664882691221640390995273","12550904050297885561370934024413826444188941904477880730238385153385367165600","14073644402192665599906362483011583221003958995020521977339575317519946136820","16127269466493498734385715523881795251511197745525351003593964386278292404389","14837032480553715504482333167436817124130071726116661830299825705998767715604","3157996448090083717095242716808677272509143175022438801158190773708431950360","9715473676333570416382435678725993563514140964778059556896984581776706520887","256184547541958273285404071642922907436096112735647965196154201025022277333","5146840525622632106780932715431071405921695127146286279740961056077516621929","18384530045422033192575749482772861619638670180561846412064951946020645182188","11372273308168053261873108888838115723774928158127953375858579798875763228181","833683215294780236385091047137868434268111079744466678646701850123603485156","7089521065433622137186726201244536967699813557477580528539264131550132846173","18389315271722108026135864703744658330872185858220834005947924896718372293177","5273779548466102910604406559710961194676307482240757707576993583088923382766","10978849613552770174834059773211945346561256353926504281930385060310161512588","2025512406735026708082790073002703032266582308582294674172511260928159182091","4504468100864789788585048558923081175827147016553914221993821395902410226580","14522713701686086398049669439257754726056815369755592306901430082418783986888","1172467899506707275500621151748833545282318904665709759177855581577968013027","4017285937828459403753883561608416496086703957918951620827271391321529059987","11864471167080016922573162728545364451553961508840493342354739707638549565971","15395434394935126648016086405692837721115704686064641372105542066627038311542","4122633947230663267544557410467288252271224090277013257161493137456223809532","12367035182954332461724293253434245043112564579380915260333747415793763231827","11865369149265328070561952780930053440760117444614610585601990621600973752433","21203992229059334721432650225967073448947553069874953360114881444016046128212","4447062027498500706657516396155423649120105266695738260082288656873877775154","9768914556161785389033236087454305484803915332998751645480448064781057341482","20108322604990560980160877548004215957204376010054104051873159423654202752320","9595509101896597349796523888856236119720835531243000900720041097386819336414","14587725319883470075206520097311394112137459424358160384009848233555406814065","5457101278978742540891941392855879387574924402835776693411461549501000663895","12113841369063820983468698918538182086204397742190461968800698674517428421051","16068938140317889943118931947504964857830114253819180369876235993296869951694","13406404344690547712656422177528636282657567373508751252664435506615272243163","11920541176421075939593055125523895823398130674849391046727892158235384625698","18352551139579012013897403430987382961093216812627912973277904518956583676698","10674676651948544879371283545502930890187181335773388262215810803244237530411","17792652617465281251634086173304934915478757132116004782258567349353652661413","14095161285749055405609690234399476131633768997386366652456808192371657539278","14644418417880601716605432589809764539302677626964586647781758014634427301961","12682826801878685279471965670138908278972084615404951130397921689553252275917","16521811006308378802185018489472310864659177006048843323237150403797976462809","7587334525407307163363028377898856862752809539521418102406305044826227081231","2908188489370783835450675853612280861255988950722158120607386028475371765438","5768335837479629879988785208318290476463727379450480334123633739596865462597","18397687037462833823572912519678833347435022340840883701032875748539812458303","2064051903495281633275569322215038029852745445612015454511944780242997049313","20703062910303292827787302109557408114919292642975918255062370581536946280279","5192613644883731002587556312741958983910430944297172298315082126198947618654","313995112743011376940466097068957324809905301874096868794869587134429900695","6100583804412559896713857626556992976882930387670359810813986481223803866656","7568477784584193520555596651137331005687926377144262826447525559308115017859","11965816735476149301106556132754318298248490433423691841191513590415182681067","14207753099541107589311100328670316235529404246579031740240567057338780037783","8175181231439895653513458924728919160206799108112661960299471181538010485894","591574950925877159318533535833931322303268506486282492008424162963779338055","6291500295969425140209019573620316970493238770424073159034492473203273747991","21323803361917137983608045653271447127437985941865950514234012867420827584203","3099253561554789805581090448570743201416121773155589506816603655098155495780","1839714309313076287091568541152080485292267125822172679972972462776530418282","2558200175908531709047812372022758109817946983415270005672004724309427120260","19741248350058279216600684476328478604110692693351318658499898211265333707610","20513396347684804966709449761679280054940274793206626286808671260812749605107","21199395741845301585097008478390085111700771593140616012257190707415683678475","1193295440609646713499404272654104228852330502286294623055524015452275511910","20305220021223370039849959575983199996369990375922681857965899850450967281896","17820107252376141054638728180510570702321859107787033667301953883945482820393","8562102223756709272478881672945718062091524608141507453584726675060317232047","12729866889854088213825002226835767386413454298567413984333803695815667483218","2114069176086645971772669409791461648578645286643393688006056656185576536095","10328720387192484120632500167812311141771979930211632623234748092781923576473","19538747176808583509408758149278829047639151822592778264069763723986282915906","21566485228448007978934061238916445477820075682293291063348941039309377547117","16512874118663027529632973954247179090732712450359926425594828287754653354014","19513474361159315670934532641131225842686472304714306461918568972038209446632","17955660451558996091453589881731410953454580996956628370387347653903874484464","20207812711298497695792679093438648102083829229107494830848501937376854876915","2421660685500283805427163525391537853360580630525738399011621278281378880490","21220637208096207115274223617089911838806190587185640536543744119096826805827","11835649411559295031133501496374511598555615522238237687109557873710817042117","21845843315206305464060299008256175893069927481104540219951750648498803200926","20631059480895873966832525659452814534529673650140538889746811436460301724612","14931947145214186450366175386309608636198382084457683854282076180248650112954","11269118025480001613427470548591071135727829235390508347983385837123112634632","1605115028499197336856195103688387642848510242987640636183693756727845197451","14793151932068045192821467479293563014237700538215102580962654003247886510086","4775792479749631121184048728741675916968972636777338242957201950342436979106","11924757182338412396519976020707321303982941838080766083060365440475015697923","8793012126741532580270517228948233516584291822980201382325016017213162919448","12947791384548987120483288495488647496188362270092208812080516723498086541311","12431577747633669956276147567242529475925082219146607091004191516701144136626","21295609310519517439106939049470380075664847294017743131672693330232031255386","17805136075624551692961527907699002356636158441633111730604045300707846396897","15278588475566957386556949449930796412080383857587931690843946622004601690164","15086592550570758313718621320890905171205067149643603272496296451366320734641","8699916934544892971206820107825237806538121069002198874248662615835467665756","20478102917550226644126628799218539559581625330717095591690828406489686677387","21734112019017835960392215716550916739517609682150258078062175843229766012777","5622924154085488629989980934517712826380247658471643194906695701678873126248","5037675567259013572001419121301772828485815086531243296178132779054418101400","7879292516618887859296404288004569598567284522338026817864475104197386629625","18997982317212461405999296872279110480053417447725407290297221773473330565737","12867218521408319698642020263791067688553778005223894447782779145063273233968","391334649391830733165647799040269744369307545998620269291478209889127672130","19779172617188671507005003625727124894180457774396709811826326667504496286059","12596925142329235973535723979633472987429833026727663225071980844189781139909","5235665914291793592826849798922237619782905021482837663102032574231117695660","10378176145885707882180864408618732566825397818692038984901565060499728433797","5518777162814311292774945630117311095162296059457944243049863006066284885289","6383788836915296003887453192037395923957940433745589146468108910773431172608","18378980065351051303468356542903949047413878986601754325664070607662174625406","802964496357962027925228076554616050639951769911983531162733260026242452057","1151228765048898930945562930707044057686831938340081500592865256952516058143","1057436684897434830336559210204558056100073281195987707544574829513988277752","8304361322956656858271430255521912446914654094029272611293726480015886358258","18082138547469240768624686868284933205246517716350185535250166506919729036297","18560642658541340224573113670515696181164007817863242462644028839037653788889","21433948922232169473983994578762336789729720241688838555383992306060546089653","4345962888225785406562575377774464692418146638460124795786215785539658204204","18491683482553522621865105209782725705891560836095563832524693063541469370996","1595153957006911891245805177782994356237108154065736758857668165866836749177","12745465492150069776755940532782158049428554675034493241223264612067325589020","21068300037504263522637352854045908904548431623139252516417402783919558466524","21379848283598466733133277088729802150576242926281401193376016094883753111574","9100400045517145192842796463728001529189981626709973391364198878834790401311","761526173875414323215606081295741956635544790572881984169167052547500162094","4523944348324037435946042315903741390453752174721180782503374766412842506857","12826905798159813196098719614569295407483904515869413174592666343625127014683","21298301889175245346300576454864405649687317534182187998123555815790664451812","10466120407875459863164008656471249355019715662927569351006572823820953788770","18765634104736621669847916286108860226531877076283270686539673115026794951054","18029301674050837995501532337862434439785535856508206309403192619917393036618","8656248943628007700842555256812779240721861558942157285882333517421090859241","909124445964415430289446157964020522347064797918541903582383763270622833065","20322508313744566548149933895745626560811233314858699012656697985674387463552","11473133631180469596497273861714489893486108521245550300092095833600832127254","13886897454587288170317041019583091209557063660075562594238782502591880617730","1388351321374629053594529120028798986653727606192516406127733531956260217411","10820498967321126905058350631999655366739224197864958698259285565142810221774","9047437255774003551209946810681504440615180683867384529725252909718397576529","17682412621232111800652746737073732995871115754692913515596320621857114840713","17459249118412305865677329263167949944924745890546683445077681421571205578033","11260954622870514070117395143161679907416702369566601131920841166642078224652","21311356397831915997286783986273772284683252550215836267508561431199821451048","11763136682097804856942897773203126982150872911828688544623632129427460812219","21842630190420364126017236966197050216368815810409077092920252710858332802605","10278342550043948522301945276707570006673669578955262430508437722137975686347","13669836394181980472800926591849938243993826306313038236968977604089281032142","18982534836139734957526305655442344936227781958587358112416788951995174742854","924143300713476371714205215173483600456664902950245170837265326237374786123","648653927285053636997438895046220979749796246169864485502279639829145629278","5468004955461336959690612122600291068806333434489556112046051739596943193825","8198966717021290997043372415176306737647953294267526104476290516107668308327","6330635298670709263682446486509049538654774571294109306447884201740681314492","15801944407747674095773310676934626868427752390875620230089308747846331256404","3507827835726968508794483439124475369701726928422484362860421123326683863238","19859419638162971296535544182202685481010250129955481751622623103942606817204","2670989291504532792325900963509629466753053370545313281400138104314529277740","20601648770014328601409368128706235447141623327602444994362138629813091391329","9020250281221486894014346959707974240825231024554709686306581193571046947004","19448071090920013487075559489904268747031170350571103602007176116016451645384","9855626424064670213123764401317371994977710260418114099460019043585303617049","273960241475408299521801713993986326049831910833352543450619250235219034159","15178055939386630045266985854218396695095661921662396071305063121158729338683","16418360709708558514136044760916389529230612136576500765316577679946210432608","4221665154001721396448157482529680285294859819946962645592731760300169936774","15928426927240248300966353802918564700528184618416199798406399357144022404431","16641721098080574825584685806515290482647504340255838968877260490026580761685","5043328033043791709396469989853970276607353659738086803538716424273826786751","2365847136059064646235805353745790884320090296651246286300639444304747972170","4041703631909032338305847932603086185355677713004583954544688331535508848539","18955336159113062251133387111166001228674233452447804151061756635904896062707","3453019952400738475973808782556481687694637205204259443905142749926960789869","11524127246411615839928909719208083192110266130517385283239210402864059917695","7492331547692183757175642328113627423098873931750301487361682365924780296700"],["6147626315983398599623828701433547333453673391438677577603594265593492970579","17373941468853383126219105459190068607050821581808945666945628085762579781113","18675852993023932535703943048744467387004823435670327290887021721028261389122","2852369548793040881968762533784361230628321032910817596034076837353628838943","5808467217603839720723505746949026082419372220269554685256079561191978282423","881630969072083868970336367377553654445065403827225682564307597561668597575","19544569990585406772407871178492435999506060638507114401323899877313464549579","14878267709748128552530883948142489440260354911618515434884876633626486579649","17343819805602859300805807767921021643427945275478160475923718327955601493598","3147144316923493090898234228150076463075245015934615180699926751367408060422","20836727665349317544574927486063082355196001294246787527562129483352381083452","96317145595907405996130011904544599751055402678957605793377422485629255379","20396399042769838623280415410496555539316767877730329966640626730926403538050","16544170913650251958438511948437422304220931730646181712426172729311415616383","6584506727240961509162532209184300869090704109605569344599278616387977422824","19590566998868166131570194251669644997762427398843457301697274732261028743482","5370939348013017640853545726351872135226117514092676042183078550348501472430","3811261164977684952917850156691783437850828453502434535632153500394919711066","2749726461932787493809872269818342486261987625587896664994441378571818459053","11383915573983550688310113375653707661251254539665869167504588473259548645124","9916838988690774667483310481489200062268225403498599116738660259134492019394","19136188641055168463315034876725446731284472265583750601248498822680260653971","15887516977805743066217960044189842288305843582510102551810703206237207936575","17786336987824848955338515695131540821733411380051551383014609903313869530398","21005051851388306179077283769904047735509863101513109127654074489561708676041","16280781107126745125834716140922874326275066681906520932680370323147962007407","18273950651435988187072089200354144803354368518942337504978631619058165888339","18614652687185018380961130295677654222896772969195870105326190888698032468947","4648922361007933120465784894534004676668545278891300743738784783083164272952","11310213903650223937806708987912823331078563035902775716617057417534768150412","7092536296444781034677326999670539648216791129534729748520186653858607985630","16270772820615792622649247387660453356874032254909236504742474628472692028293","385367092325849782070593441039432083386681944665738979932466043995962540397","17805827342754632514390359424735316390746977081512834158806889154912559417928","20024907198154552436345245141243452270494636033297743549316539293869591409833","9234215646545489320069965310786583269490329356796444977441184167452078293345","17108590030314435824853432467901019859333457116609928515585181187173490423143","15910315900966077593714516016038233988218165769429475135456816210775619893043","6195529693120591346695405780440805718170994701745792651233817614742815203519","4245441012583870678188242646630412070966678757506494973612671283946354025495","2304903496039614013605109532969224328136162284873560250803845559468196156250","11693016457541736187220331042599070447664888658389150771534133194896638661901","1776517450185237199728116828598779967801038886584334689860313819128919908981","7806153986794341965459846938333081037827814782827885300996474222107928077822","17940588722606126928451685498548023407258873216558463377906081460549591575057","10371799193925909119136931769852410380947084603350351962123549948328327267702","20122148120685258769574029387408965700271219988052875651388434729616831444683","15035551217063457270042973549639483148607470023686796059163084647483242309786","16489878967514620362925449612730416514860426946012382948452004149598402083056","14240790414988975854386511568244923807338302009634523655466832132581555975516","15133406953007414531549110172748354779664260706851670137432180705639417343549","10690705590498820694610024170434557617847607229814360354839513194179728718523","13827979863066172786489124156769882364122124730007514470708895273478430314352","10710843232017112245199417697882565131311711949064640083364964016238583286376","16219821984152229456789841617124740176636143790533787306195214918183002289404","4443945405253668151711239889811682417722099787812699348882165569376836194505","13374936606384334329293205906352917858363668730599007422148591620583177873052","3130547537528629940846669185730749089538439536961954499553850136295109479545","4303969243784057034508123321715648667535372719281283244828773166674886261201","5989216789074209153873415762140487008397424300536017420337913939751018987680","3029463357835799909868216943346697078874683636588794683737453399576373478011","10476618143678752746465404417470443166809882491668311058666046570010751632186","9994925982779240617159890198100947662001398642389912929229658664058421436627","10176970544481288451346462511134758722164701220782536015402174118877826889800","18424158448523814893964414770095134832293892346615425373638250882224929431363","19366956079105748480886421061443145211970920795004384777659195934741753207944","11091181874846694774338090174372100116252530248564050096856395252568163657858","17353128656714558089667149499397061301594727975663152036301560017860428071020","13238006665653699249266914212871756817371819001645951476708047899463834219655","17055039311662343661955654211226746040465401123503635116898702099310815674177","5286666690003794895264449438418387547354350464287559511315554292024950176939","21392902555527188320634786446573898587249542929111262797890644582493861156962","12406681026512063332827308700529401005255127889048956231922878327520360845401","15434870710485794945517495742061260302820776556272580983813299352075013239869","4411491701113234064838089923553395617470727028121925035608993460932615875057","21024748108044825160048785654599582463761474190244764788874831807499478838044","7680978131380729207527636139131932637240489018432030824029067562073349627035","3408321867876643922057696479500927118853015770099176846426613051383968395111","4044017192507961081067569272422827731313648032811501750491406776829097444161","18331703123531329496821809270389173567173788148638525857133489033465163738374","8581985490532916637196455609081483082508040719164880448426655573293277467062","17097175177088407223987763609523437237317521418906500697394784959942004837183","17283357547543881822643982373752501634581207450744975027579424701697125768519","3114289317415665754315257515672327794564766886045727889771094589828045932059","4121982161232138234296918278643894219608247208937391244623132656218561035287","18319708437247829803403759962528832876979834741757230504257542910042917362674","264107059990458404050537285229935399100000658138987761233089330774579905414","19245962424630901799103732912445198554851301611802664729994835041984045352647","21481268955474162972538912477676302548213221412224453884623843567742457980931","13054652880944215100409957427046741206809909544801248923065995115092723867125","17445423482926512875731005227671884579111686501047535297579963992185600838705","13989585853109988062633188826244755875692853006739238542727480592170337647991","17644249062718367051707138555752661559694857297122633537358146305277959197700","11213280149118368264941616591024002649789370846345639214204202104395949573001","2479430738743447865220578715093732023607362497809812709721841147273010985071","19170346831324042064260292435651736023454774283928671114965428783767444651501","2249773762348190221814627264878686106981051077241650380763848925904895399587","15785155470883637875946431544967116475458109417323663711972510236612352559606","946428851254816645126686470157531364802207503637938152327774118754374664228","18081301874601965299421330559019912584730626502654796906499991148349725577704","13638831153633382373670579690567703064487867416124713117627597359296662910776","15731178958324434544665473314389188985713105014648908423598119023855377917080","9917979824441332180713189841520827682801122499780827932105321535841262104099","4477218349911392146745102565364781587379138332203307397011323331851070628289","4196116502992100152382226026767611298689212092096205622483116328361954387479","4125553640263062687363595819368491141976517437635820252286742313008508733408","1260916008238883369640783899703958869740490511938805562587993523697780059646","12030453507844788085837941465326991051577705323179782129621819752109773617130","1616729892142733988881271632334115354383082667129246299673207948969677972419","17790116243542925627055862896879089936668179540204703569058484177080937502249","4916826165840990844304507037890792549751849160422839689006410477257882391042","11584213073802412059271369957747279514114648193038035041611261743642554198283","16719835981206947895865946283283198567714807826433642746085372541538665338476","6699399511839905674805128446395397180664778802443708408977716737554091911123","21780850712707430600781028241084903375323034847472170705641134914367959985053","19650714630255045094059400839309517919992981015448837327702161504806266186096","17728935862560672332557173079197586635912056977568426093575277173589712551874","18218981656817542290354649557423542606221103516149396438505913482628491393745","16173320918545320350179263895050487620415753262311467001135680573821491660778","18749132839734280672991763462021231851140006460544549438336391357928762150912","19804729718734886506325561935920047752142654855830698311803656972478290268053","19852022811935550911202582188078555585552613695164681730307677046973334627440","1599238738915787308523391744992048319751794205228407988676015490331611074242","2730284211443506246137882698953449192620036180418562865041025043475273902148","16642697364423389759779785009909902509686802244536597340124664260693547218575","7030277536951152393489269782340459687632322761209815510891507421842401544976","2645282365316576153620189595563363498245471716604607785997545100954415436532","11836599958145463724978298325224948617075734206019980907941992318726742885090","9379836389594058052193342143605994573576860036693790984289698770005233003816","4936097975532856331587608856145453431462626157074390483327785374648647979182","14261272621177565679908729509467309781957277604700789847167775203637724156588","14384042993612223493091843709687195745753711205656098174358380328322622785674","7602522474780883033451932042024754309460846024406091409064496525413778743895","19284327179747355275744653991040577201544689654594363414180160712801683063400","8732420760226712172720096817390921487059254890223844820526135811172306039693","8736871804423236893739486045277613796724214967823222024310614732306446417478","10122727759967140400011531456417357002819799283827520027869345304850304243508","19600428976911158591758195579983230165311737010182255016349431988452518779459","21412640599888310728963227806182550957212529173812561818872357742782768708282","3382834884251505446697465695665888436600985771748054896175510070178943176799","5424268238511504833112942792546766462909191487396278645494904715254618246619","4984721874344265817742647345247970905833992888391940986059043485748528986042","2022573256442159494507968677656879636847262260354573370537255737091303819556","11258631584671172573229663590119520723468593511856614616016550772001845679866","14324740608597503028071282210876807343017578554502044501781245297161562860956","7445577371344670075033666971816988473049110374105172758569837792031494150228","13265606669106939823865364576315756612847139875689786156097851279279751433679","15238598484646922414421482495816633433705816808586791968083189157308379106115","10725523252426841374788275651734494325010706400301821980153464968050696737279","2633265364932628352793223988839752923311811166605503408947317749518744833456","7861175100418742846275793570757956123670007434573183352685296812332256704932","20999935414216903738941146789202104744586510072221252339001858617626303789982","5977614056432951814585414112421531222403223146602229861429936680581955055431","5931860876714797492092042112133640002267237452913723501691750002357001804830","14562008797185891958620443495496757871981918350581241703926621633158489195321","3505336021898609386263210131367635622704109853221241394942451388531030669769","16578235706824809523014538640948495588856893463000137040801413215727773380083","19375742803446681387195879499847072356772969941415230923234757010947456367191","6255367488637769736903949293980465723272271368601658401735079096147956784460","5906589694839922614995302078445158282424694339180630855015083500482196538868","13065708825279387211110931433757563977807644647530652721233367802469448976082","18232288076160370323511493082329108072058465477630759182903324408872159664436","9270542950868120082380674008791159538242222696005636916635750372888607203828","19388836984681019018462719709134421248793536992065958947499056787254258751682","17644385837318767408448645196495912141788591335975890639327420146901601072885","6455842021230030087723301679631006132297894313543816349547744163571857006938","12651647178446817886752319997848206955275956948340732199496215365053869535220","2038361690839579121638674254611449047008451768255542263231913955112979412052","14552505619309469592330707557293319610565413217299690813565239349254723939882","21809351305961289002997783583503461155560460938189863591461820286363980258154","19881244303935038444446962795728167560499810309912834473138514895445137175717","6434629727222395907353855634693221759145469065378967099211977918254204835433","11036466183244547002625933810655331358597012489081560653011525594219740881518","8696860013373675168559529464941134452066614743853560004905114221628099326183","6286610834190704195966860183541611347543876431770635371755207708407012119352","13785489482270739528894668899177561091226326813787695987264179185340645885448","8810497353129284320787428455370522511595657262006456870793996863971532676464","5950943845893271397160198360810800783099372758072046372020789345881371710825","5530915356962172707660737783638532094011201648224151382306028119770642279776","11091512250862371871604003187867080726528592592629078709401778342108977650047","15783644080397148510988340229704570796603281391084254749002543719002855287616","8763200105989369123326685776257599315907057694736599355967140415031996938110","16265670810206356417408073001772331032782360202117620221162260100178521648170","1060900582879546587300450314779603179547289174918628695451776494250751383469","14744516682282904590256322734403856848450648676567397632124016636373922693953","7963533020284370085512706609272793180113190314656815518091154379468342864360","21847103720496839760484939812661124697765074217247378137013246709106995512794","1653069435316409742759195996639155716495640457841657992745920070999323194315","1779277606640375903995595532406543892084224209567520378547237815999026067520","6995080044923736291442893376098805495068105284761180709673883412002971316831","10811321648124662138091377293526509914253637698173706332138689100382399963395","9601406465257748919110853775299124310985215012739412476110920449990474867354","18028141367193319054744440498619071967828221741281699864949191934036691507436","4607466430137542836150125749612147456128085309366797118935148996775246273855","15800640783457285335285505218287458944442721123666981076610926748598613636214","2112321293659869964303812620622373297871082794056351093537916002098854382120","14996631991733135844452595251336653836804943981827712201258451368176439511645","17520271953040754474711528844729345396665279637573303317828245745304573322797","15992472430004058554983936761614313471735664568983200231292353554082612221","13077407987480601704167238541689096961866209332906459397795676348552772889230","21534253000075971492923776155947583634689953016934976887823337792522221291547","819226293199784195154719767176522957736326171336737610132796013897711980028","17185725409385154522175797801720017361441550294043891637734656472407970636529","9575382583490973064980234314462577435416346301295239026337973844317720284455","21099851176254120774822574655588411581847669663738341957209759249291625898415","1966484535215911127324696991190082306993935247312211830919486710094847788468","1995818881696667008089141246304344453132036271634824321961354608938484533959","4667743157901207120637051668285562840191620616648732757926088699083644960980","13962937901967387497010877515712463400252815508150832310185443339350530772930","2629021746995755463136649506818480652912581474323117052162602164762321198516","20573270882617293078262572083653232250462469010594696343790004182829624161934","1913490321993231846954575139695345554332784169136285969356154414660735431290","13795292839631007915139444096743217376580091875142459105510805605582305270567","4058572558281095474323972096333621226798264350365788595026405775805372802770","17437029543151462415223319777679469646123927413521446735086712751233557753685","10258511040614960594008243736815460042536086782694789106787660436697233524699","1776622678963964166858973922665602162169906575558986124356721214967791324096","11475130909983164952012365599635166276537668089861700179995433713710298426958","2952755446410776844254499627216453159408235799061277085887851310752744265074","6624935776718778024845266788797012050011811870823913061539098756037591400653","19954266552453778490807092047530964172323837367905505645486543751921896349997","17616005977353868961299963148697997608390148348790301665790470529963563572688","900786527730568780236819563509871137970324714801299371788326143178262067587","6401534704731549429505440687499634640537230220192633410570095781266996282430","13802560372833568212943129492681934904640344932457172709836721179397658071966","20720041579842235677356944193781809019573930260321940911086044513868740779772"],["3543030996690731296144302074945644993940503512381940281158340485163553427782","14456582958634399729802605390122513015002601504508513170013909507149932778448","3126860645246915297044088167326588591680242124427769024481453610883810108674","20914220112711669635932871895638920862036110651562335932445860492773410166435","13898153337128326598294681972575411161373345548074764167063930702810085143283","11494816488079691563548948406211866308670367580609805045470273810278613528125","9265075386546133998992345241270235168672960377452999502776312567277548502287","20021949048926785450343828102540178861758398598932480397004304243016805279702","17919773090671305519402481279400246318283722142600928508878399512593964809604","9080338876332324361560940283287671152943529212088083669332838878892426421176","6966820873041565099335541093832581518388062131217364208125082807748337444442","4754959170441683519515036606259037626662671578099964081061043425010850133820","3217229650060400896792673270994784175046872440086333007152127029946297106503","21816481050785200027931285072395469615096302360347994694687269782499273734112","12807928427670068278917234235986720684636259679372568354055432889409054949297","13826913883258807838903404263173315859327388859817776690782622774806719577704","14715508594618229304924912287879458078786871554183488309385936868120900302162","4765885366156640574773808467306355912882165708339460440950145437341404320482","16722014012556015216650093088291583395944348552124898992216581531958560404280","7431786809665367144168808343099306354449102161270140701698145535166533004774","12514561575784459520302508925923482055587171874031496440739369331861774361144","13630926037601951290173737881839381432349720276436508871257961452732302249954","2416414043521570830938077478600484585162353864423849325238559208774076695812","3198391645352142061735535711335633217975113436438561010475922095171958777605","11503289488153380408852849064024910165225110948930885911379465054522594126035","17945548492985099414247885601087617115151464172983108926121249791371051519441","15206458584403956760846691261964236163202625304606621285728526159502456182565","18664803356744505916174195454562184678127127391413155379212300226736271965412","1932464282660454008791502282337362663506272754054933505791400845588414354525","7431131941001012844762212013511267729079957740244748755865134237672902463955","12260867654103631227135400757666859922137135589157019044994170609009605682612","3497692461171356958628408153056941313451942465631342687440123894946322982488","3611582236581069332046877419478476119433460345326857976137560691859450607136","16701563436812072022168694511067148429443045594144653838644405459857156283101","888833699088042159861509113185468788045755593715062347382548583028812466468","13027606106406728601332828518562058143615794059325398484231721019790789708383","16867560818956321945646006921505320613308271522776810400640826749438161909114","974286375063546693308153673073274687620807584704373288927095698770718355705","17164647015779775003667370039927920124381231953899936293739647389770842412636","13812735556582478046467982121127334513466404260587580530663067858201550350225","5555318749169933689829489127869820565736743958465695916577439219460828287201","15147736958519110413798327221058929792029254870817672304916259386717996218939","9093783603898735286753718269047404518944180735024302663202149030626421747264","19663528847623587912647904265815395529695410641548007238438947661221514322542","16050486874392688445392573281672864106952702475626854763551538209147588502217","13643154410219745091259394207881994403403664040943113504535042199360092675026","9994393341493081364074783836589113425357957616742680978059011711076524628096","6066727222812778846340829491283999369997291912496005263368499243410295288304","10275229946760815401870389679607490963497978883421730792100185293724085428674","21497546743120095993008732541489604895508606688714374565152084984414487943856","5410109209131659429652823371440397074564204322815773631417855000087652072422","4656718504694933743607748372708327104619579523407806362780445055109254730221","1535539668205688554612129122232712967981273484635206844376645263794510776905","6014624793218490271238764434773189318958730916196905789497853281972696671247","11664508187375558355195352743803150107793615135540732262825506318914225480618","6116179866134076212901873972162049629714787777774217125320617831147732712881","7156436421089505705028328573278072913507065296883146744244791316222380266201","12054467471426975647973340270599475277601084936967912793090659824480359129081","17043004725271027910538237148402068222835120116965638237871055913672994258597","16220455773823909794014715905765711732985616219607584706690711330413977988212","15859369801752308916251957941263160908672747781155852511743194995283478080957","479331876385459584849230762033048956240784621757125043523833547932336732021","17371898586803558805199285151576387708548132346602797103748639637481352576986","1669923098731048999410343513821846398616602374717981505074961546289337325891","5901847159215544530876581081126932589094431032258157198770582781864841878766","18964305080922802950293327616531540488576734432289534207487783803133028591534","21391565661610588080023857012644286006317523285224244461722350412865334901788","13859979526703965599946512832991648449058108364323767375822622250546827051763","14178842945330354151475041451258011251506932092165564803585149961516102229203","9732424347816228834779162921453357383035314691484039491038526173776392679930","2916484128690250908814196431868649363158004790333481812642864057335419267559","7496978836980754621750472326738269854937130487021159668865319635184235054270","15732272029544135687655369960610276709515477689734952583097488077854605780691","7867892378505499328367956370534010327619068595759860677931756173774607866661","2645389195137857175751801166613941761522924817957359363234922821861168369453","5428648673026825822348517069964588690890711938310863981949251926666891252998","5673097051473314160057127163079470500502486665904121175631085109229208920764","12213227243584803853178095425113463791275833583767127368163587230364245722339","18715899303501270934030638370927875241328470260353347061222955717933916891297","7978266080893459514342371863321441749862125749732741901595103595919695778835","11533864861650024617087550487008450420153395602349453386165533302160941562372","18450601439501348601530433257154147113861051704608419841682905432642513197835","9138792247850488245323412019837764753108822692897704202690513828206269873276","8780651517909025350948438820147097471614889914797642770395848326995230079810","16579891454742806064187509751513819282821430255175477305656819644332932757991","20749300053175474642021908869135322928369734326957417903553033361402813233282","14678025512968401250174091062539364192699965591711957564050835184613969981470","14500401299150087749352814234198057059984606531881272078945247743949487640486","5724620856479473091459642481591597298179650010639060800177645976144733457925","19112197370309313151147636092745145521877228675251700148292900136536916932170","13357726589469288818869234910529301323312513752019046957819344054565360588780","13374527560449258023689134260026613122339366365792290373325534211336697566956","4598648858165437260062263715423329175562992143452805065351481409276538133334","11350678282945894657287678422643168089297300739501707849993226500027831816754","3542838338928314843109276018513499150692851830271985332322006221768875867536","6915887598932201892744110121624584826388348577566708154030055143862948900209","3341372370459299156322218222512239866891612731698279185818379265788352168797","5465946929360194216023533683821008640072612018293683841488258245599905867230","12877035916601231664263696261369822574055329194451355438105731392920430333083","7152734772764736233496355792907418897029921786094807846499854978916041968421","3637783930300588858775792406146355117532464453208333425534311131944943620570","10014356913431431526174931647710822588072509765911348937997695830388503275168","1363032458635298325605180167581231122362341661979419469148204786413525015450","14749299418008156951304417344478297351805724111421271311859650072310778072387","17861121930186335338650720704614114161379448007421588691026444381264236189922","13982875176693656046913549248129840458651715264391216676392378240291122094805","17013986540180225001522806840753604869987807622757849834876725452904460718718","2388488441230564305487777723403725189663618052806260479803532470400273033483","13894658705595595767938737767669216953233363697170846839350285544511007008320","14405479371656690634733468702992982854989857716365066876824883028890686397274","5463406390085573883494999080478626961053571243436142083968477629350392248406","21534264698621976459797752593999005975042601484874798974898661774235315370253","21799224364206948450546005628308365004329457058279954233217003747009751813980"],["4674163295886668713721676554153485700383365415679648095685497378991889125957","20352935218386204728405947862710237635292695166913064017138871016474654829503","2592327317691286673995570769733690864734110983311652649344857955817901667605","16569965928578428536982359762305442141555631314673045263042967399169881481663","19131088716759828804870846683575351419567519624591961034686838811980854480317","9445249257154711404997904018575649485936923216724833070474435497562129184354","10263849450559453197266643809044161235269801564997177723771131710603406794657","3056222600207721353960552490330912452663290310028010792283928265227487578173","21790657388633280199755703552074152351760568814499175261713202273123354393653","15632854714111805599199016548148074406028161048345800202040891852724322865404","21055196030884358213128268053901624878656900226499964686210806947320487929084","20870802314656988415071187255580018825359148840256346431540367835816283233663","15616534517743330594960982114818869275309504871292088154595951649532209497803","5784776489399338538186111556208328817680916221272560662302058618935625424664","11524199340075899550845010989583353304937552835400935278913693430093835145958","6111955760150452509644281780032815573756917600365327410927439475076299492518","21618401442204665104986329854020260011488532608326424508093871089299201575674","9730498374695391045394700114591114475449040690008311140197590770638012506878","12450960556188662662174828467496697802873664968238345232698790724056489477852","19541588514194638760835578386391719199522674962225668709200961614811726952776","19932293326229311363288454122969308710212293893428838866879338848665668402397","604198849257174504677551552215661304343812986564057281411653401089383990287","4837206815765999838881694117090048237839208060322594233335602777738216787530","18830045323524997434973757449753199597597645181672539201484808179922595941767","597272048657162684432562166735615322949355566201513589220267457713801638231","1259257565303313693691585589383644773076852691198301937638112297241050998906","4299692760889064110427645653486657433003877634188292107545657115443318790741","18761514049733775183377076664698188376895721558935093039415023511830645880571","6365188664980535830887561182548117129128384651566127038255166094869781288138","10908245784622543297925944831880222108262707146660606570412640969461860215559","2993018118327211849601365308091689105225779815146751382435760912693815943525","17866549521241267273147593454540911294575012954137157106386791620196686306843","7588028284719211287685446874927984833830446870565937360743716093239510828705","2090750922500787060241285930607243134795297756000749701326291975063085030442","9457072070171052855412092923825503562704627349932867548368158306053472163269","21350677681867862863958401218481076613811347308327323704598795557647506601048","20770451808866000075425992751709612657492582152945338552610276408968142282748","2745159125861577162208805239818265210821612624943688815260513025855030451876","4978242409993988630548589666160972377966237165841561311622261456963266093585","8957122665158680185632585169710175898594503225351167444908975902379752039529","19785721977895675912077792966249940018620743361119818565517998582038530845572","11861870201391731884519245957624651537058767900307989639229586431063741762358","17255005338003805991070153748300808006158858491831332904540491356269058934807","20968613871554279013641220706303052278063770382104154194145614761598803229320","17088772914095596168232405755085581150280602134464528873794740219829997655905","17762875723381349883234521669486732244273741572046761163213388126273123976716","15757253055041927933508930441807290266967740722748969628910267606081057123247","9296526004150722607881458789952527402293389026976957647013649334875654666846","3258056648875256712165532481568505756954239103970575560653877933695716301019","10077274438511253450890613064192766199813655931242373841397350705759494726833","2485034538638996467225599076052442891342629898657527900536984935467064278829","20576592492040545165717975426556128169364393232969413514916564746364553078536","4404702101406694105795814505550144493036964326057335262710910677583726782302","4390438145706544373827946112868446908872103380251483996161316711096059314249","9320005299875600545246395152752248247569867819827474604280747799854851456406","15328920202400920589852925898624698939637026854484346389158880426029840472715","8486599295438187080584450525760735526614520025443333533944573774263533673664"],["9752260370971488270527045586368300736990068930727356612443733058936980331181","17861152003533815607258975980932083069070125130602569693881058150421024162425","5478494136231859826920266196710092163036570975555566533890278380032436251008","10470663114025860164205954011633511602249334550961664618144343510421485102643","8584166711424171940897653413099916249371028337527773813210106792825433993045","480687478798944972518402568634409857315487979030618520260560257514160422118","19050370281780858565019483243537472514353065987940901395981643695477442070526","7909886408711298712459179052698439249376302724729633721254586660282875932937","3422546743310933069772687665765317843579486790338039447423961278453066592006","13742327444822703543525245712246928813767223841816014893394911139318645136377","19985290653818527520481099040857204751957970313061971657480471856178364435734","5113623454243607312202962083851358306245672221703960790609797677771133546193","14116233721356660472284501740073810322785672551591291061323721256009346455878","4926155427866587734566793124447479446126808496458547974505225385766449054331","18737837843661096774737022603512579127563955418171470936320273353744942252119","10488727327274145721487028816083558148874702222936756843781953611817021479453","7430416809625816246215887987474320468895157902878142604273583498117862871629","15362958033781690751249945980799034135612747452438262501485459571192039957761","7971998013662637796977575957753688748657729947937463070177130208011037377134","6181181645748233273792885809633370176374365207286274393529265842466407115861","5314629852576387633630556100168250725317801821478381622914586992960199366","4515888460995791866096611222708075397170126060611423125117883548580281554338","74545133806554228861741049751398547087539129543232065265760967657668834985","7620596223797793424148158028949488299269254840309986200826069272117699745990","6891523215930979790200291579163513136440547056829176430750166726452304949371","16099728065410135581098672343255205185915801569430121937096121254451019507098","6557913779080084600620474619010501057622990909691220199506246579366751973182","629939504373643127852968084066404538738439068647901008271397818529825932208","5796770995540012470043939162278308205112680750304267555647836542430331213784"],["4703464382863044657879311175544785995557811809566957314411289057472490527020","3843782899730931149066837823855957195082814690023486343961650216093340265958","19753920348283277126115182030019993058097502466641468039307766133748654311731","6387046033771728790683513731756820363186884656538206941762539587100790793303","6083333704170189791347928946890269084686281072760260996461982250183813813455","3601362179840050473869565367769437889028980382089846018464370888724390080742","15027638961056161803405095516489512786991681560756640705495942526018791294016","19710873932029592796622363789856158433724106192219625427302644279655507023367","15638024414045421488677288694998914769438007035716986615640454221215106257457","15226555011982219477858209163809404309053286511808301742968320176656943221415","5370110265920942801753988420413217249900497386077178581974767910364898916037","16446764745477539410117561326613320146727869338745239407663387010432667098744","6928924323713233714997990198973637030825419323916177069979007639608046912970","19348991226118506958152269076463657327287453752172685562174237622786490116354","21178915382594959890862250421664826278642329218140824648593071449397586077827"],["18812969291333960246714927634541285791301021530654461980802056598587931445724","4704875114419935020350178682811140808616028527479657778061958964369984912380","15617352465980977810710937287156471405834630169023818314675251313292328425896","16144221017969671721449460332127347762820423413386277478456163956038616567891","3380797458259597109673995325806610244842743962089650531774414197031119011667","10808087229606934664635917926735817482378681653152030112405462220077698611677","1126944913887516904289476884314188784817875835019645183711270186623300417204","20609978924050961475538640091972585785684055653239864923325305755133104228398"],["3181021621803672270534191685279668265378151263688297096626662902385759927090","5364058324337084345210724157442488646258495950496398875849562278111691871665","10224931444631296256306111997023259115908040230658265780895445976301767844798","20055030782188110989536830175323576726230381937229123278716473657223724370336"],["18616110284164381247048792467749872996052606923771839554448275315790271733321","17002469466029637665184131373008982287414758016642465974888037480292593544214"],["11346070196295785031787810283571557481180538196916691520680083623303153751974"],["3034324305272075327174876945100357924965739483119222533766727614603826015314"],["18143860073808067122797584013450218026827477676919083077141968823765109364047"]] \ No newline at end of file