From 28d9a0345a63874dc8a92bd1cb397d647c8e3b76 Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Wed, 13 Dec 2023 17:36:23 +0100 Subject: [PATCH] remove sync_step.sol --- contracts/snark-verifiers/sync_step.sol | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 contracts/snark-verifiers/sync_step.sol diff --git a/contracts/snark-verifiers/sync_step.sol b/contracts/snark-verifiers/sync_step.sol deleted file mode 100644 index 3369224f..00000000 --- a/contracts/snark-verifiers/sync_step.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; - -contract Verifier { - - /** - * @notice Bn256 P value - * @dev In order to prevent the verifier from accepting two version of the same pubInput, n and the quantity (n + P), where n + P <= 2^256, we require that all pubInputs are stricly less than P. - * @dev The reason for this is that the assmebly code of the verifier performs all arithmetic operations modulo P and as a consequence can't distinguish between n and n + P values. - */ - - uint256 constant SIZE_LIMIT = 21888242871839275222246405745257275088696311157297823662689037894645226208583; - - function verify( - uint256[2] calldata pubInputs, - bytes calldata proof - ) public view returns (bool) { - bool success = true; - bytes32[999] memory transcript; - for (uint i = 0; i < pubInputs.length; i++) { - require(pubInputs[i] < SIZE_LIMIT); - } - assembly { let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 function validate_ec_point(x, y) -> valid { { let x_lt_p := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let y_lt_p := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) valid := and(x_lt_p, y_lt_p) } { let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let is_affine := eq(x_cube_plus_3, y_square) valid := and(valid, is_affine) } } mstore(0xa0, mod(calldataload(0x4), f_q))mstore(0xc0, mod(calldataload(0x24), f_q))mstore(0x80, 2074481716598792847008768254772693197567601254928452996494866791385589790068) { let x := calldataload(0x84) mstore(0xe0, x) let y := calldataload(0xa4) mstore(0x100, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xc4) mstore(0x120, x) let y := calldataload(0xe4) mstore(0x140, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x104) mstore(0x160, x) let y := calldataload(0x124) mstore(0x180, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x144) mstore(0x1a0, x) let y := calldataload(0x164) mstore(0x1c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x184) mstore(0x1e0, x) let y := calldataload(0x1a4) mstore(0x200, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1c4) mstore(0x220, x) let y := calldataload(0x1e4) mstore(0x240, y) success := and(validate_ec_point(x, y), success) }mstore(0x260, keccak256(0x80, 480)){ let hash := mload(0x260) mstore(0x280, mod(hash, f_q)) mstore(0x2a0, hash) } { let x := calldataload(0x204) mstore(0x2c0, x) let y := calldataload(0x224) mstore(0x2e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x244) mstore(0x300, x) let y := calldataload(0x264) mstore(0x320, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x284) mstore(0x340, x) let y := calldataload(0x2a4) mstore(0x360, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x2c4) mstore(0x380, x) let y := calldataload(0x2e4) mstore(0x3a0, y) success := and(validate_ec_point(x, y), success) }mstore(0x3c0, keccak256(0x2a0, 288)){ let hash := mload(0x3c0) mstore(0x3e0, mod(hash, f_q)) mstore(0x400, hash) }mstore8(0x420, 1)mstore(0x420, keccak256(0x400, 33)){ let hash := mload(0x420) mstore(0x440, mod(hash, f_q)) mstore(0x460, hash) } { let x := calldataload(0x304) mstore(0x480, x) let y := calldataload(0x324) mstore(0x4a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x344) mstore(0x4c0, x) let y := calldataload(0x364) mstore(0x4e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x384) mstore(0x500, x) let y := calldataload(0x3a4) mstore(0x520, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x3c4) mstore(0x540, x) let y := calldataload(0x3e4) mstore(0x560, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x404) mstore(0x580, x) let y := calldataload(0x424) mstore(0x5a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x444) mstore(0x5c0, x) let y := calldataload(0x464) mstore(0x5e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x484) mstore(0x600, x) let y := calldataload(0x4a4) mstore(0x620, y) success := and(validate_ec_point(x, y), success) }mstore(0x640, keccak256(0x460, 480)){ let hash := mload(0x640) mstore(0x660, mod(hash, f_q)) mstore(0x680, hash) } { let x := calldataload(0x4c4) mstore(0x6a0, x) let y := calldataload(0x4e4) mstore(0x6c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x504) mstore(0x6e0, x) let y := calldataload(0x524) mstore(0x700, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x544) mstore(0x720, x) let y := calldataload(0x564) mstore(0x740, y) success := and(validate_ec_point(x, y), success) }mstore(0x760, keccak256(0x680, 224)){ let hash := mload(0x760) mstore(0x780, mod(hash, f_q)) mstore(0x7a0, hash) }mstore(0x7c0, mod(calldataload(0x584), f_q))mstore(0x7e0, mod(calldataload(0x5a4), f_q))mstore(0x800, mod(calldataload(0x5c4), f_q))mstore(0x820, mod(calldataload(0x5e4), f_q))mstore(0x840, mod(calldataload(0x604), f_q))mstore(0x860, mod(calldataload(0x624), f_q))mstore(0x880, mod(calldataload(0x644), f_q))mstore(0x8a0, mod(calldataload(0x664), f_q))mstore(0x8c0, mod(calldataload(0x684), f_q))mstore(0x8e0, mod(calldataload(0x6a4), f_q))mstore(0x900, mod(calldataload(0x6c4), f_q))mstore(0x920, mod(calldataload(0x6e4), f_q))mstore(0x940, mod(calldataload(0x704), f_q))mstore(0x960, mod(calldataload(0x724), f_q))mstore(0x980, mod(calldataload(0x744), f_q))mstore(0x9a0, mod(calldataload(0x764), f_q))mstore(0x9c0, mod(calldataload(0x784), f_q))mstore(0x9e0, mod(calldataload(0x7a4), f_q))mstore(0xa00, mod(calldataload(0x7c4), f_q))mstore(0xa20, mod(calldataload(0x7e4), f_q))mstore(0xa40, mod(calldataload(0x804), f_q))mstore(0xa60, mod(calldataload(0x824), f_q))mstore(0xa80, mod(calldataload(0x844), f_q))mstore(0xaa0, mod(calldataload(0x864), f_q))mstore(0xac0, mod(calldataload(0x884), f_q))mstore(0xae0, mod(calldataload(0x8a4), f_q))mstore(0xb00, mod(calldataload(0x8c4), f_q))mstore(0xb20, mod(calldataload(0x8e4), f_q))mstore(0xb40, mod(calldataload(0x904), f_q))mstore(0xb60, mod(calldataload(0x924), f_q))mstore(0xb80, mod(calldataload(0x944), f_q))mstore(0xba0, mod(calldataload(0x964), f_q))mstore(0xbc0, mod(calldataload(0x984), f_q))mstore(0xbe0, mod(calldataload(0x9a4), f_q))mstore(0xc00, mod(calldataload(0x9c4), f_q))mstore(0xc20, mod(calldataload(0x9e4), f_q))mstore(0xc40, mod(calldataload(0xa04), f_q))mstore(0xc60, mod(calldataload(0xa24), f_q))mstore(0xc80, mod(calldataload(0xa44), f_q))mstore(0xca0, mod(calldataload(0xa64), f_q))mstore(0xcc0, mod(calldataload(0xa84), f_q))mstore(0xce0, mod(calldataload(0xaa4), f_q))mstore(0xd00, mod(calldataload(0xac4), f_q))mstore(0xd20, mod(calldataload(0xae4), f_q))mstore(0xd40, mod(calldataload(0xb04), f_q))mstore(0xd60, mod(calldataload(0xb24), f_q))mstore(0xd80, mod(calldataload(0xb44), f_q))mstore(0xda0, mod(calldataload(0xb64), f_q))mstore(0xdc0, mod(calldataload(0xb84), f_q))mstore(0xde0, mod(calldataload(0xba4), f_q))mstore(0xe00, mod(calldataload(0xbc4), f_q))mstore(0xe20, mod(calldataload(0xbe4), f_q))mstore(0xe40, keccak256(0x7a0, 1696)){ let hash := mload(0xe40) mstore(0xe60, mod(hash, f_q)) mstore(0xe80, hash) }mstore8(0xea0, 1)mstore(0xea0, keccak256(0xe80, 33)){ let hash := mload(0xea0) mstore(0xec0, mod(hash, f_q)) mstore(0xee0, hash) } { let x := calldataload(0xc04) mstore(0xf00, x) let y := calldataload(0xc24) mstore(0xf20, y) success := and(validate_ec_point(x, y), success) }mstore(0xf40, keccak256(0xee0, 96)){ let hash := mload(0xf40) mstore(0xf60, mod(hash, f_q)) mstore(0xf80, hash) } { let x := calldataload(0xc44) mstore(0xfa0, x) let y := calldataload(0xc64) mstore(0xfc0, y) success := and(validate_ec_point(x, y), success) }mstore(0xfe0, mulmod(mload(0x780), mload(0x780), f_q))mstore(0x1000, mulmod(mload(0xfe0), mload(0xfe0), f_q))mstore(0x1020, mulmod(mload(0x1000), mload(0x1000), f_q))mstore(0x1040, mulmod(mload(0x1020), mload(0x1020), f_q))mstore(0x1060, mulmod(mload(0x1040), mload(0x1040), f_q))mstore(0x1080, mulmod(mload(0x1060), mload(0x1060), f_q))mstore(0x10a0, mulmod(mload(0x1080), mload(0x1080), f_q))mstore(0x10c0, mulmod(mload(0x10a0), mload(0x10a0), f_q))mstore(0x10e0, mulmod(mload(0x10c0), mload(0x10c0), f_q))mstore(0x1100, mulmod(mload(0x10e0), mload(0x10e0), f_q))mstore(0x1120, mulmod(mload(0x1100), mload(0x1100), f_q))mstore(0x1140, mulmod(mload(0x1120), mload(0x1120), f_q))mstore(0x1160, mulmod(mload(0x1140), mload(0x1140), f_q))mstore(0x1180, mulmod(mload(0x1160), mload(0x1160), f_q))mstore(0x11a0, mulmod(mload(0x1180), mload(0x1180), f_q))mstore(0x11c0, mulmod(mload(0x11a0), mload(0x11a0), f_q))mstore(0x11e0, mulmod(mload(0x11c0), mload(0x11c0), f_q))mstore(0x1200, mulmod(mload(0x11e0), mload(0x11e0), f_q))mstore(0x1220, mulmod(mload(0x1200), mload(0x1200), f_q))mstore(0x1240, mulmod(mload(0x1220), mload(0x1220), f_q))mstore(0x1260, mulmod(mload(0x1240), mload(0x1240), f_q))mstore(0x1280, mulmod(mload(0x1260), mload(0x1260), f_q))mstore(0x12a0, addmod(mload(0x1280), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(0x12c0, mulmod(mload(0x12a0), 21888237653275510688422624196183639687472264873923820041627027729598873448513, f_q))mstore(0x12e0, mulmod(mload(0x12c0), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x1300, addmod(mload(0x780), 8662456992307693229192232929891638461323994988937738840793806641202669341572, f_q))mstore(0x1320, mulmod(mload(0x12c0), 10939663269433627367777756708678102241564365262857670666700619874077960926249, f_q))mstore(0x1340, addmod(mload(0x780), 10948579602405647854468649036579172846983999137558363676997584312497847569368, f_q))mstore(0x1360, mulmod(mload(0x12c0), 11016257578652593686382655500910603527869149377564754001549454008164059876499, f_q))mstore(0x1380, addmod(mload(0x780), 10871985293186681535863750244346671560679215022851280342148750178411748619118, f_q))mstore(0x13a0, mulmod(mload(0x12c0), 15402826414547299628414612080036060696555554914079673875872749760617770134879, f_q))mstore(0x13c0, addmod(mload(0x780), 6485416457291975593831793665221214391992809486336360467825454425958038360738, f_q))mstore(0x13e0, mulmod(mload(0x12c0), 21710372849001950800533397158415938114909991150039389063546734567764856596059, f_q))mstore(0x1400, addmod(mload(0x780), 177870022837324421713008586841336973638373250376645280151469618810951899558, f_q))mstore(0x1420, mulmod(mload(0x12c0), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q))mstore(0x1440, addmod(mload(0x780), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q))mstore(0x1460, mulmod(mload(0x12c0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x1480, addmod(mload(0x780), 13154116519010929542673167886091370382741775939114889923107781597533678454429, f_q))mstore(0x14a0, mulmod(mload(0x12c0), 1, f_q))mstore(0x14c0, addmod(mload(0x780), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(0x14e0, mulmod(mload(0x12c0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q))mstore(0x1500, addmod(mload(0x780), 10676941854703594198666993839846402519342119846958189386823924046696287912227, f_q)){ let prod := mload(0x1300) prod := mulmod(mload(0x1340), prod, f_q) mstore(0x1520, prod) prod := mulmod(mload(0x1380), prod, f_q) mstore(0x1540, prod) prod := mulmod(mload(0x13c0), prod, f_q) mstore(0x1560, prod) prod := mulmod(mload(0x1400), prod, f_q) mstore(0x1580, prod) prod := mulmod(mload(0x1440), prod, f_q) mstore(0x15a0, prod) prod := mulmod(mload(0x1480), prod, f_q) mstore(0x15c0, prod) prod := mulmod(mload(0x14c0), prod, f_q) mstore(0x15e0, prod) prod := mulmod(mload(0x1500), prod, f_q) mstore(0x1600, prod) prod := mulmod(mload(0x12a0), prod, f_q) mstore(0x1620, prod) }mstore(0x1660, 32)mstore(0x1680, 32)mstore(0x16a0, 32)mstore(0x16c0, mload(0x1620))mstore(0x16e0, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x1700, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x1660, 0xc0, 0x1640, 0x20), 1), success){ let inv := mload(0x1640) let v v := mload(0x12a0) mstore(0x12a0, mulmod(mload(0x1600), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1500) mstore(0x1500, mulmod(mload(0x15e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x14c0) mstore(0x14c0, mulmod(mload(0x15c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1480) mstore(0x1480, mulmod(mload(0x15a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1440) mstore(0x1440, mulmod(mload(0x1580), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1400) mstore(0x1400, mulmod(mload(0x1560), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x13c0) mstore(0x13c0, mulmod(mload(0x1540), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1380) mstore(0x1380, mulmod(mload(0x1520), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1340) mstore(0x1340, mulmod(mload(0x1300), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x1300, inv) }mstore(0x1720, mulmod(mload(0x12e0), mload(0x1300), f_q))mstore(0x1740, mulmod(mload(0x1320), mload(0x1340), f_q))mstore(0x1760, mulmod(mload(0x1360), mload(0x1380), f_q))mstore(0x1780, mulmod(mload(0x13a0), mload(0x13c0), f_q))mstore(0x17a0, mulmod(mload(0x13e0), mload(0x1400), f_q))mstore(0x17c0, mulmod(mload(0x1420), mload(0x1440), f_q))mstore(0x17e0, mulmod(mload(0x1460), mload(0x1480), f_q))mstore(0x1800, mulmod(mload(0x14a0), mload(0x14c0), f_q))mstore(0x1820, mulmod(mload(0x14e0), mload(0x1500), f_q)){ let result := mulmod(mload(0x1800), mload(0xa0), f_q)result := addmod(mulmod(mload(0x1820), mload(0xc0), f_q), result, f_q)mstore(0x1840, result) }mstore(0x1860, mulmod(mload(0x800), mload(0x7e0), f_q))mstore(0x1880, addmod(mload(0x7c0), mload(0x1860), f_q))mstore(0x18a0, addmod(mload(0x1880), sub(f_q, mload(0x820)), f_q))mstore(0x18c0, mulmod(mload(0x18a0), mload(0xa20), f_q))mstore(0x18e0, mulmod(mload(0x660), mload(0x18c0), f_q))mstore(0x1900, mulmod(mload(0x880), mload(0x860), f_q))mstore(0x1920, addmod(mload(0x840), mload(0x1900), f_q))mstore(0x1940, addmod(mload(0x1920), sub(f_q, mload(0x8a0)), f_q))mstore(0x1960, mulmod(mload(0x1940), mload(0xa40), f_q))mstore(0x1980, addmod(mload(0x18e0), mload(0x1960), f_q))mstore(0x19a0, mulmod(mload(0x660), mload(0x1980), f_q))mstore(0x19c0, mulmod(mload(0x900), mload(0x8e0), f_q))mstore(0x19e0, addmod(mload(0x8c0), mload(0x19c0), f_q))mstore(0x1a00, addmod(mload(0x19e0), sub(f_q, mload(0x920)), f_q))mstore(0x1a20, mulmod(mload(0x1a00), mload(0xa60), f_q))mstore(0x1a40, addmod(mload(0x19a0), mload(0x1a20), f_q))mstore(0x1a60, mulmod(mload(0x660), mload(0x1a40), f_q))mstore(0x1a80, addmod(1, sub(f_q, mload(0xba0)), f_q))mstore(0x1aa0, mulmod(mload(0x1a80), mload(0x1800), f_q))mstore(0x1ac0, addmod(mload(0x1a60), mload(0x1aa0), f_q))mstore(0x1ae0, mulmod(mload(0x660), mload(0x1ac0), f_q))mstore(0x1b00, mulmod(mload(0xcc0), mload(0xcc0), f_q))mstore(0x1b20, addmod(mload(0x1b00), sub(f_q, mload(0xcc0)), f_q))mstore(0x1b40, mulmod(mload(0x1b20), mload(0x1720), f_q))mstore(0x1b60, addmod(mload(0x1ae0), mload(0x1b40), f_q))mstore(0x1b80, mulmod(mload(0x660), mload(0x1b60), f_q))mstore(0x1ba0, addmod(mload(0xc00), sub(f_q, mload(0xbe0)), f_q))mstore(0x1bc0, mulmod(mload(0x1ba0), mload(0x1800), f_q))mstore(0x1be0, addmod(mload(0x1b80), mload(0x1bc0), f_q))mstore(0x1c00, mulmod(mload(0x660), mload(0x1be0), f_q))mstore(0x1c20, addmod(mload(0xc60), sub(f_q, mload(0xc40)), f_q))mstore(0x1c40, mulmod(mload(0x1c20), mload(0x1800), f_q))mstore(0x1c60, addmod(mload(0x1c00), mload(0x1c40), f_q))mstore(0x1c80, mulmod(mload(0x660), mload(0x1c60), f_q))mstore(0x1ca0, addmod(mload(0xcc0), sub(f_q, mload(0xca0)), f_q))mstore(0x1cc0, mulmod(mload(0x1ca0), mload(0x1800), f_q))mstore(0x1ce0, addmod(mload(0x1c80), mload(0x1cc0), f_q))mstore(0x1d00, mulmod(mload(0x660), mload(0x1ce0), f_q))mstore(0x1d20, addmod(1, sub(f_q, mload(0x1720)), f_q))mstore(0x1d40, addmod(mload(0x1740), mload(0x1760), f_q))mstore(0x1d60, addmod(mload(0x1d40), mload(0x1780), f_q))mstore(0x1d80, addmod(mload(0x1d60), mload(0x17a0), f_q))mstore(0x1da0, addmod(mload(0x1d80), mload(0x17c0), f_q))mstore(0x1dc0, addmod(mload(0x1da0), mload(0x17e0), f_q))mstore(0x1de0, addmod(mload(0x1d20), sub(f_q, mload(0x1dc0)), f_q))mstore(0x1e00, mulmod(mload(0xaa0), mload(0x3e0), f_q))mstore(0x1e20, addmod(mload(0x9a0), mload(0x1e00), f_q))mstore(0x1e40, addmod(mload(0x1e20), mload(0x440), f_q))mstore(0x1e60, mulmod(mload(0xac0), mload(0x3e0), f_q))mstore(0x1e80, addmod(mload(0x7c0), mload(0x1e60), f_q))mstore(0x1ea0, addmod(mload(0x1e80), mload(0x440), f_q))mstore(0x1ec0, mulmod(mload(0x1ea0), mload(0x1e40), f_q))mstore(0x1ee0, mulmod(mload(0x1ec0), mload(0xbc0), f_q))mstore(0x1f00, mulmod(1, mload(0x3e0), f_q))mstore(0x1f20, mulmod(mload(0x780), mload(0x1f00), f_q))mstore(0x1f40, addmod(mload(0x9a0), mload(0x1f20), f_q))mstore(0x1f60, addmod(mload(0x1f40), mload(0x440), f_q))mstore(0x1f80, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x3e0), f_q))mstore(0x1fa0, mulmod(mload(0x780), mload(0x1f80), f_q))mstore(0x1fc0, addmod(mload(0x7c0), mload(0x1fa0), f_q))mstore(0x1fe0, addmod(mload(0x1fc0), mload(0x440), f_q))mstore(0x2000, mulmod(mload(0x1fe0), mload(0x1f60), f_q))mstore(0x2020, mulmod(mload(0x2000), mload(0xba0), f_q))mstore(0x2040, addmod(mload(0x1ee0), sub(f_q, mload(0x2020)), f_q))mstore(0x2060, mulmod(mload(0x2040), mload(0x1de0), f_q))mstore(0x2080, addmod(mload(0x1d00), mload(0x2060), f_q))mstore(0x20a0, mulmod(mload(0x660), mload(0x2080), f_q))mstore(0x20c0, mulmod(mload(0xae0), mload(0x3e0), f_q))mstore(0x20e0, addmod(mload(0x840), mload(0x20c0), f_q))mstore(0x2100, addmod(mload(0x20e0), mload(0x440), f_q))mstore(0x2120, mulmod(mload(0xb00), mload(0x3e0), f_q))mstore(0x2140, addmod(mload(0x8c0), mload(0x2120), f_q))mstore(0x2160, addmod(mload(0x2140), mload(0x440), f_q))mstore(0x2180, mulmod(mload(0x2160), mload(0x2100), f_q))mstore(0x21a0, mulmod(mload(0x2180), mload(0xc20), f_q))mstore(0x21c0, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x3e0), f_q))mstore(0x21e0, mulmod(mload(0x780), mload(0x21c0), f_q))mstore(0x2200, addmod(mload(0x840), mload(0x21e0), f_q))mstore(0x2220, addmod(mload(0x2200), mload(0x440), f_q))mstore(0x2240, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x3e0), f_q))mstore(0x2260, mulmod(mload(0x780), mload(0x2240), f_q))mstore(0x2280, addmod(mload(0x8c0), mload(0x2260), f_q))mstore(0x22a0, addmod(mload(0x2280), mload(0x440), f_q))mstore(0x22c0, mulmod(mload(0x22a0), mload(0x2220), f_q))mstore(0x22e0, mulmod(mload(0x22c0), mload(0xc00), f_q))mstore(0x2300, addmod(mload(0x21a0), sub(f_q, mload(0x22e0)), f_q))mstore(0x2320, mulmod(mload(0x2300), mload(0x1de0), f_q))mstore(0x2340, addmod(mload(0x20a0), mload(0x2320), f_q))mstore(0x2360, mulmod(mload(0x660), mload(0x2340), f_q))mstore(0x2380, mulmod(mload(0xb20), mload(0x3e0), f_q))mstore(0x23a0, addmod(mload(0x940), mload(0x2380), f_q))mstore(0x23c0, addmod(mload(0x23a0), mload(0x440), f_q))mstore(0x23e0, mulmod(mload(0xb40), mload(0x3e0), f_q))mstore(0x2400, addmod(mload(0x1840), mload(0x23e0), f_q))mstore(0x2420, addmod(mload(0x2400), mload(0x440), f_q))mstore(0x2440, mulmod(mload(0x2420), mload(0x23c0), f_q))mstore(0x2460, mulmod(mload(0x2440), mload(0xc80), f_q))mstore(0x2480, mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(0x3e0), f_q))mstore(0x24a0, mulmod(mload(0x780), mload(0x2480), f_q))mstore(0x24c0, addmod(mload(0x940), mload(0x24a0), f_q))mstore(0x24e0, addmod(mload(0x24c0), mload(0x440), f_q))mstore(0x2500, mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(0x3e0), f_q))mstore(0x2520, mulmod(mload(0x780), mload(0x2500), f_q))mstore(0x2540, addmod(mload(0x1840), mload(0x2520), f_q))mstore(0x2560, addmod(mload(0x2540), mload(0x440), f_q))mstore(0x2580, mulmod(mload(0x2560), mload(0x24e0), f_q))mstore(0x25a0, mulmod(mload(0x2580), mload(0xc60), f_q))mstore(0x25c0, addmod(mload(0x2460), sub(f_q, mload(0x25a0)), f_q))mstore(0x25e0, mulmod(mload(0x25c0), mload(0x1de0), f_q))mstore(0x2600, addmod(mload(0x2360), mload(0x25e0), f_q))mstore(0x2620, mulmod(mload(0x660), mload(0x2600), f_q))mstore(0x2640, mulmod(mload(0xb60), mload(0x3e0), f_q))mstore(0x2660, addmod(mload(0x960), mload(0x2640), f_q))mstore(0x2680, addmod(mload(0x2660), mload(0x440), f_q))mstore(0x26a0, mulmod(mload(0xb80), mload(0x3e0), f_q))mstore(0x26c0, addmod(mload(0x980), mload(0x26a0), f_q))mstore(0x26e0, addmod(mload(0x26c0), mload(0x440), f_q))mstore(0x2700, mulmod(mload(0x26e0), mload(0x2680), f_q))mstore(0x2720, mulmod(mload(0x2700), mload(0xce0), f_q))mstore(0x2740, mulmod(5625741653535312224677218588085279924365897425605943700675464992185016992283, mload(0x3e0), f_q))mstore(0x2760, mulmod(mload(0x780), mload(0x2740), f_q))mstore(0x2780, addmod(mload(0x960), mload(0x2760), f_q))mstore(0x27a0, addmod(mload(0x2780), mload(0x440), f_q))mstore(0x27c0, mulmod(14704729814417906439424896605881467874595262020190401576785074330126828718155, mload(0x3e0), f_q))mstore(0x27e0, mulmod(mload(0x780), mload(0x27c0), f_q))mstore(0x2800, addmod(mload(0x980), mload(0x27e0), f_q))mstore(0x2820, addmod(mload(0x2800), mload(0x440), f_q))mstore(0x2840, mulmod(mload(0x2820), mload(0x27a0), f_q))mstore(0x2860, mulmod(mload(0x2840), mload(0xcc0), f_q))mstore(0x2880, addmod(mload(0x2720), sub(f_q, mload(0x2860)), f_q))mstore(0x28a0, mulmod(mload(0x2880), mload(0x1de0), f_q))mstore(0x28c0, addmod(mload(0x2620), mload(0x28a0), f_q))mstore(0x28e0, mulmod(mload(0x660), mload(0x28c0), f_q))mstore(0x2900, addmod(1, sub(f_q, mload(0xd00)), f_q))mstore(0x2920, mulmod(mload(0x2900), mload(0x1800), f_q))mstore(0x2940, addmod(mload(0x28e0), mload(0x2920), f_q))mstore(0x2960, mulmod(mload(0x660), mload(0x2940), f_q))mstore(0x2980, mulmod(mload(0xd00), mload(0xd00), f_q))mstore(0x29a0, addmod(mload(0x2980), sub(f_q, mload(0xd00)), f_q))mstore(0x29c0, mulmod(mload(0x29a0), mload(0x1720), f_q))mstore(0x29e0, addmod(mload(0x2960), mload(0x29c0), f_q))mstore(0x2a00, mulmod(mload(0x660), mload(0x29e0), f_q))mstore(0x2a20, addmod(mload(0xd40), mload(0x3e0), f_q))mstore(0x2a40, mulmod(mload(0x2a20), mload(0xd20), f_q))mstore(0x2a60, addmod(mload(0xd80), mload(0x440), f_q))mstore(0x2a80, mulmod(mload(0x2a60), mload(0x2a40), f_q))mstore(0x2aa0, addmod(mload(0x940), mload(0x3e0), f_q))mstore(0x2ac0, mulmod(mload(0x2aa0), mload(0xd00), f_q))mstore(0x2ae0, addmod(mload(0x9c0), mload(0x440), f_q))mstore(0x2b00, mulmod(mload(0x2ae0), mload(0x2ac0), f_q))mstore(0x2b20, addmod(mload(0x2a80), sub(f_q, mload(0x2b00)), f_q))mstore(0x2b40, mulmod(mload(0x2b20), mload(0x1de0), f_q))mstore(0x2b60, addmod(mload(0x2a00), mload(0x2b40), f_q))mstore(0x2b80, mulmod(mload(0x660), mload(0x2b60), f_q))mstore(0x2ba0, addmod(mload(0xd40), sub(f_q, mload(0xd80)), f_q))mstore(0x2bc0, mulmod(mload(0x2ba0), mload(0x1800), f_q))mstore(0x2be0, addmod(mload(0x2b80), mload(0x2bc0), f_q))mstore(0x2c00, mulmod(mload(0x660), mload(0x2be0), f_q))mstore(0x2c20, mulmod(mload(0x2ba0), mload(0x1de0), f_q))mstore(0x2c40, addmod(mload(0xd40), sub(f_q, mload(0xd60)), f_q))mstore(0x2c60, mulmod(mload(0x2c40), mload(0x2c20), f_q))mstore(0x2c80, addmod(mload(0x2c00), mload(0x2c60), f_q))mstore(0x2ca0, mulmod(mload(0x660), mload(0x2c80), f_q))mstore(0x2cc0, addmod(1, sub(f_q, mload(0xda0)), f_q))mstore(0x2ce0, mulmod(mload(0x2cc0), mload(0x1800), f_q))mstore(0x2d00, addmod(mload(0x2ca0), mload(0x2ce0), f_q))mstore(0x2d20, mulmod(mload(0x660), mload(0x2d00), f_q))mstore(0x2d40, mulmod(mload(0xda0), mload(0xda0), f_q))mstore(0x2d60, addmod(mload(0x2d40), sub(f_q, mload(0xda0)), f_q))mstore(0x2d80, mulmod(mload(0x2d60), mload(0x1720), f_q))mstore(0x2da0, addmod(mload(0x2d20), mload(0x2d80), f_q))mstore(0x2dc0, mulmod(mload(0x660), mload(0x2da0), f_q))mstore(0x2de0, addmod(mload(0xde0), mload(0x3e0), f_q))mstore(0x2e00, mulmod(mload(0x2de0), mload(0xdc0), f_q))mstore(0x2e20, addmod(mload(0xe20), mload(0x440), f_q))mstore(0x2e40, mulmod(mload(0x2e20), mload(0x2e00), f_q))mstore(0x2e60, mulmod(mload(0x280), mload(0x960), f_q))mstore(0x2e80, addmod(mload(0x2e60), mload(0x980), f_q))mstore(0x2ea0, addmod(mload(0x2e80), mload(0x3e0), f_q))mstore(0x2ec0, mulmod(mload(0x2ea0), mload(0xda0), f_q))mstore(0x2ee0, mulmod(mload(0x280), mload(0x9e0), f_q))mstore(0x2f00, addmod(mload(0x2ee0), mload(0xa00), f_q))mstore(0x2f20, addmod(mload(0x2f00), mload(0x440), f_q))mstore(0x2f40, mulmod(mload(0x2f20), mload(0x2ec0), f_q))mstore(0x2f60, addmod(mload(0x2e40), sub(f_q, mload(0x2f40)), f_q))mstore(0x2f80, mulmod(mload(0x2f60), mload(0x1de0), f_q))mstore(0x2fa0, addmod(mload(0x2dc0), mload(0x2f80), f_q))mstore(0x2fc0, mulmod(mload(0x660), mload(0x2fa0), f_q))mstore(0x2fe0, addmod(mload(0xde0), sub(f_q, mload(0xe20)), f_q))mstore(0x3000, mulmod(mload(0x2fe0), mload(0x1800), f_q))mstore(0x3020, addmod(mload(0x2fc0), mload(0x3000), f_q))mstore(0x3040, mulmod(mload(0x660), mload(0x3020), f_q))mstore(0x3060, mulmod(mload(0x2fe0), mload(0x1de0), f_q))mstore(0x3080, addmod(mload(0xde0), sub(f_q, mload(0xe00)), f_q))mstore(0x30a0, mulmod(mload(0x3080), mload(0x3060), f_q))mstore(0x30c0, addmod(mload(0x3040), mload(0x30a0), f_q))mstore(0x30e0, mulmod(mload(0x1280), mload(0x1280), f_q))mstore(0x3100, mulmod(mload(0x30e0), mload(0x1280), f_q))mstore(0x3120, mulmod(1, mload(0x1280), f_q))mstore(0x3140, mulmod(1, mload(0x30e0), f_q))mstore(0x3160, mulmod(mload(0x30c0), mload(0x12a0), f_q))mstore(0x3180, mulmod(mload(0xfe0), mload(0x780), f_q))mstore(0x31a0, mulmod(mload(0x3180), mload(0x780), f_q))mstore(0x31c0, mulmod(mload(0x780), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x31e0, addmod(mload(0xf60), sub(f_q, mload(0x31c0)), f_q))mstore(0x3200, mulmod(mload(0x780), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x3220, addmod(mload(0xf60), sub(f_q, mload(0x3200)), f_q))mstore(0x3240, mulmod(mload(0x780), 1, f_q))mstore(0x3260, addmod(mload(0xf60), sub(f_q, mload(0x3240)), f_q))mstore(0x3280, mulmod(mload(0x780), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q))mstore(0x32a0, addmod(mload(0xf60), sub(f_q, mload(0x3280)), f_q))mstore(0x32c0, mulmod(mload(0x780), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q))mstore(0x32e0, addmod(mload(0xf60), sub(f_q, mload(0x32c0)), f_q))mstore(0x3300, mulmod(mload(0x780), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q))mstore(0x3320, addmod(mload(0xf60), sub(f_q, mload(0x3300)), f_q))mstore(0x3340, mulmod(3544324119167359571073009690693121464267965232733679586767649244433889388945, mload(0x3180), f_q))mstore(0x3360, mulmod(mload(0x3340), 1, f_q)){ let result := mulmod(mload(0xf60), mload(0x3340), f_q)result := addmod(mulmod(mload(0x780), sub(f_q, mload(0x3360)), f_q), result, f_q)mstore(0x3380, result) }mstore(0x33a0, mulmod(3860370625838117017501327045244227871206764201116468958063324100051382735289, mload(0x3180), f_q))mstore(0x33c0, mulmod(mload(0x33a0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0xf60), mload(0x33a0), f_q)result := addmod(mulmod(mload(0x780), sub(f_q, mload(0x33c0)), f_q), result, f_q)mstore(0x33e0, result) }mstore(0x3400, mulmod(21616901807277407275624036604424346159916096890712898844034238973395610537327, mload(0x3180), f_q))mstore(0x3420, mulmod(mload(0x3400), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q)){ let result := mulmod(mload(0xf60), mload(0x3400), f_q)result := addmod(mulmod(mload(0x780), sub(f_q, mload(0x3420)), f_q), result, f_q)mstore(0x3440, result) }mstore(0x3460, mulmod(3209408481237076479025468386201293941554240476766691830436732310949352383503, mload(0x3180), f_q))mstore(0x3480, mulmod(mload(0x3460), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q)){ let result := mulmod(mload(0xf60), mload(0x3460), f_q)result := addmod(mulmod(mload(0x780), sub(f_q, mload(0x3480)), f_q), result, f_q)mstore(0x34a0, result) }mstore(0x34c0, mulmod(1, mload(0x3260), f_q))mstore(0x34e0, mulmod(mload(0x34c0), mload(0x32a0), f_q))mstore(0x3500, mulmod(mload(0x34e0), mload(0x32e0), f_q))mstore(0x3520, mulmod(mload(0x3500), mload(0x3320), f_q)){ let result := mulmod(mload(0xf60), 1, f_q)result := addmod(mulmod(mload(0x780), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(0x3540, result) }mstore(0x3560, mulmod(8390819244605639573390577733158868133682115698337564550620146375401109684432, mload(0xfe0), f_q))mstore(0x3580, mulmod(mload(0x3560), 1, f_q)){ let result := mulmod(mload(0xf60), mload(0x3560), f_q)result := addmod(mulmod(mload(0x780), sub(f_q, mload(0x3580)), f_q), result, f_q)mstore(0x35a0, result) }mstore(0x35c0, mulmod(14389468897523033212448771694851898440525479866834419679925499462425232628530, mload(0xfe0), f_q))mstore(0x35e0, mulmod(mload(0x35c0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0xf60), mload(0x35c0), f_q)result := addmod(mulmod(mload(0x780), sub(f_q, mload(0x35e0)), f_q), result, f_q)mstore(0x3600, result) }mstore(0x3620, mulmod(8021781111580269725587432039983408559403601261632071736490564397134126857583, mload(0xfe0), f_q))mstore(0x3640, mulmod(mload(0x3620), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q)){ let result := mulmod(mload(0xf60), mload(0x3620), f_q)result := addmod(mulmod(mload(0x780), sub(f_q, mload(0x3640)), f_q), result, f_q)mstore(0x3660, result) }mstore(0x3680, mulmod(mload(0x34e0), mload(0x31e0), f_q))mstore(0x36a0, mulmod(10676941854703594198666993839846402519342119846958189386823924046696287912228, mload(0x780), f_q))mstore(0x36c0, mulmod(mload(0x36a0), 1, f_q)){ let result := mulmod(mload(0xf60), mload(0x36a0), f_q)result := addmod(mulmod(mload(0x780), sub(f_q, mload(0x36c0)), f_q), result, f_q)mstore(0x36e0, result) }mstore(0x3700, mulmod(11211301017135681023579411905410872569206244553457844956874280139879520583389, mload(0x780), f_q))mstore(0x3720, mulmod(mload(0x3700), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0xf60), mload(0x3700), f_q)result := addmod(mulmod(mload(0x780), sub(f_q, mload(0x3720)), f_q), result, f_q)mstore(0x3740, result) }mstore(0x3760, mulmod(13154116519010929542673167886091370382741775939114889923107781597533678454430, mload(0x780), f_q))mstore(0x3780, mulmod(mload(0x3760), 1, f_q)){ let result := mulmod(mload(0xf60), mload(0x3760), f_q)result := addmod(mulmod(mload(0x780), sub(f_q, mload(0x3780)), f_q), result, f_q)mstore(0x37a0, result) }mstore(0x37c0, mulmod(8734126352828345679573237859165904705806588461301144420590422589042130041187, mload(0x780), f_q))mstore(0x37e0, mulmod(mload(0x37c0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q)){ let result := mulmod(mload(0xf60), mload(0x37c0), f_q)result := addmod(mulmod(mload(0x780), sub(f_q, mload(0x37e0)), f_q), result, f_q)mstore(0x3800, result) }mstore(0x3820, mulmod(mload(0x34c0), mload(0x3220), f_q)){ let prod := mload(0x3380) prod := mulmod(mload(0x33e0), prod, f_q) mstore(0x3840, prod) prod := mulmod(mload(0x3440), prod, f_q) mstore(0x3860, prod) prod := mulmod(mload(0x34a0), prod, f_q) mstore(0x3880, prod) prod := mulmod(mload(0x3540), prod, f_q) mstore(0x38a0, prod) prod := mulmod(mload(0x34c0), prod, f_q) mstore(0x38c0, prod) prod := mulmod(mload(0x35a0), prod, f_q) mstore(0x38e0, prod) prod := mulmod(mload(0x3600), prod, f_q) mstore(0x3900, prod) prod := mulmod(mload(0x3660), prod, f_q) mstore(0x3920, prod) prod := mulmod(mload(0x3680), prod, f_q) mstore(0x3940, prod) prod := mulmod(mload(0x36e0), prod, f_q) mstore(0x3960, prod) prod := mulmod(mload(0x3740), prod, f_q) mstore(0x3980, prod) prod := mulmod(mload(0x34e0), prod, f_q) mstore(0x39a0, prod) prod := mulmod(mload(0x37a0), prod, f_q) mstore(0x39c0, prod) prod := mulmod(mload(0x3800), prod, f_q) mstore(0x39e0, prod) prod := mulmod(mload(0x3820), prod, f_q) mstore(0x3a00, prod) }mstore(0x3a40, 32)mstore(0x3a60, 32)mstore(0x3a80, 32)mstore(0x3aa0, mload(0x3a00))mstore(0x3ac0, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x3ae0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x3a40, 0xc0, 0x3a20, 0x20), 1), success){ let inv := mload(0x3a20) let v v := mload(0x3820) mstore(0x3820, mulmod(mload(0x39e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3800) mstore(0x3800, mulmod(mload(0x39c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x37a0) mstore(0x37a0, mulmod(mload(0x39a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x34e0) mstore(0x34e0, mulmod(mload(0x3980), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3740) mstore(0x3740, mulmod(mload(0x3960), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x36e0) mstore(0x36e0, mulmod(mload(0x3940), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3680) mstore(0x3680, mulmod(mload(0x3920), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3660) mstore(0x3660, mulmod(mload(0x3900), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3600) mstore(0x3600, mulmod(mload(0x38e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x35a0) mstore(0x35a0, mulmod(mload(0x38c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x34c0) mstore(0x34c0, mulmod(mload(0x38a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3540) mstore(0x3540, mulmod(mload(0x3880), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x34a0) mstore(0x34a0, mulmod(mload(0x3860), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3440) mstore(0x3440, mulmod(mload(0x3840), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x33e0) mstore(0x33e0, mulmod(mload(0x3380), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x3380, inv) }{ let result := mload(0x3380)result := addmod(mload(0x33e0), result, f_q)result := addmod(mload(0x3440), result, f_q)result := addmod(mload(0x34a0), result, f_q)mstore(0x3b00, result) }mstore(0x3b20, mulmod(mload(0x3520), mload(0x34c0), f_q)){ let result := mload(0x3540)mstore(0x3b40, result) }mstore(0x3b60, mulmod(mload(0x3520), mload(0x3680), f_q)){ let result := mload(0x35a0)result := addmod(mload(0x3600), result, f_q)result := addmod(mload(0x3660), result, f_q)mstore(0x3b80, result) }mstore(0x3ba0, mulmod(mload(0x3520), mload(0x34e0), f_q)){ let result := mload(0x36e0)result := addmod(mload(0x3740), result, f_q)mstore(0x3bc0, result) }mstore(0x3be0, mulmod(mload(0x3520), mload(0x3820), f_q)){ let result := mload(0x37a0)result := addmod(mload(0x3800), result, f_q)mstore(0x3c00, result) }{ let prod := mload(0x3b00) prod := mulmod(mload(0x3b40), prod, f_q) mstore(0x3c20, prod) prod := mulmod(mload(0x3b80), prod, f_q) mstore(0x3c40, prod) prod := mulmod(mload(0x3bc0), prod, f_q) mstore(0x3c60, prod) prod := mulmod(mload(0x3c00), prod, f_q) mstore(0x3c80, prod) }mstore(0x3cc0, 32)mstore(0x3ce0, 32)mstore(0x3d00, 32)mstore(0x3d20, mload(0x3c80))mstore(0x3d40, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x3d60, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x3cc0, 0xc0, 0x3ca0, 0x20), 1), success){ let inv := mload(0x3ca0) let v v := mload(0x3c00) mstore(0x3c00, mulmod(mload(0x3c60), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3bc0) mstore(0x3bc0, mulmod(mload(0x3c40), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3b80) mstore(0x3b80, mulmod(mload(0x3c20), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3b40) mstore(0x3b40, mulmod(mload(0x3b00), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x3b00, inv) }mstore(0x3d80, mulmod(mload(0x3b20), mload(0x3b40), f_q))mstore(0x3da0, mulmod(mload(0x3b60), mload(0x3b80), f_q))mstore(0x3dc0, mulmod(mload(0x3ba0), mload(0x3bc0), f_q))mstore(0x3de0, mulmod(mload(0x3be0), mload(0x3c00), f_q))mstore(0x3e00, mulmod(mload(0xe60), mload(0xe60), f_q))mstore(0x3e20, mulmod(mload(0x3e00), mload(0xe60), f_q))mstore(0x3e40, mulmod(mload(0x3e20), mload(0xe60), f_q))mstore(0x3e60, mulmod(mload(0x3e40), mload(0xe60), f_q))mstore(0x3e80, mulmod(mload(0x3e60), mload(0xe60), f_q))mstore(0x3ea0, mulmod(mload(0x3e80), mload(0xe60), f_q))mstore(0x3ec0, mulmod(mload(0x3ea0), mload(0xe60), f_q))mstore(0x3ee0, mulmod(mload(0x3ec0), mload(0xe60), f_q))mstore(0x3f00, mulmod(mload(0x3ee0), mload(0xe60), f_q))mstore(0x3f20, mulmod(mload(0x3f00), mload(0xe60), f_q))mstore(0x3f40, mulmod(mload(0x3f20), mload(0xe60), f_q))mstore(0x3f60, mulmod(mload(0x3f40), mload(0xe60), f_q))mstore(0x3f80, mulmod(mload(0x3f60), mload(0xe60), f_q))mstore(0x3fa0, mulmod(mload(0x3f80), mload(0xe60), f_q))mstore(0x3fc0, mulmod(mload(0x3fa0), mload(0xe60), f_q))mstore(0x3fe0, mulmod(mload(0x3fc0), mload(0xe60), f_q))mstore(0x4000, mulmod(mload(0x3fe0), mload(0xe60), f_q))mstore(0x4020, mulmod(mload(0x4000), mload(0xe60), f_q))mstore(0x4040, mulmod(mload(0x4020), mload(0xe60), f_q))mstore(0x4060, mulmod(mload(0x4040), mload(0xe60), f_q))mstore(0x4080, mulmod(mload(0x4060), mload(0xe60), f_q))mstore(0x40a0, mulmod(mload(0xec0), mload(0xec0), f_q))mstore(0x40c0, mulmod(mload(0x40a0), mload(0xec0), f_q))mstore(0x40e0, mulmod(mload(0x40c0), mload(0xec0), f_q))mstore(0x4100, mulmod(mload(0x40e0), mload(0xec0), f_q)){ let result := mulmod(mload(0x7c0), mload(0x3380), f_q)result := addmod(mulmod(mload(0x7e0), mload(0x33e0), f_q), result, f_q)result := addmod(mulmod(mload(0x800), mload(0x3440), f_q), result, f_q)result := addmod(mulmod(mload(0x820), mload(0x34a0), f_q), result, f_q)mstore(0x4120, result) }mstore(0x4140, mulmod(mload(0x4120), mload(0x3b00), f_q))mstore(0x4160, mulmod(sub(f_q, mload(0x4140)), 1, f_q)){ let result := mulmod(mload(0x840), mload(0x3380), f_q)result := addmod(mulmod(mload(0x860), mload(0x33e0), f_q), result, f_q)result := addmod(mulmod(mload(0x880), mload(0x3440), f_q), result, f_q)result := addmod(mulmod(mload(0x8a0), mload(0x34a0), f_q), result, f_q)mstore(0x4180, result) }mstore(0x41a0, mulmod(mload(0x4180), mload(0x3b00), f_q))mstore(0x41c0, mulmod(sub(f_q, mload(0x41a0)), mload(0xe60), f_q))mstore(0x41e0, mulmod(1, mload(0xe60), f_q))mstore(0x4200, addmod(mload(0x4160), mload(0x41c0), f_q)){ let result := mulmod(mload(0x8c0), mload(0x3380), f_q)result := addmod(mulmod(mload(0x8e0), mload(0x33e0), f_q), result, f_q)result := addmod(mulmod(mload(0x900), mload(0x3440), f_q), result, f_q)result := addmod(mulmod(mload(0x920), mload(0x34a0), f_q), result, f_q)mstore(0x4220, result) }mstore(0x4240, mulmod(mload(0x4220), mload(0x3b00), f_q))mstore(0x4260, mulmod(sub(f_q, mload(0x4240)), mload(0x3e00), f_q))mstore(0x4280, mulmod(1, mload(0x3e00), f_q))mstore(0x42a0, addmod(mload(0x4200), mload(0x4260), f_q))mstore(0x42c0, mulmod(mload(0x42a0), 1, f_q))mstore(0x42e0, mulmod(mload(0x41e0), 1, f_q))mstore(0x4300, mulmod(mload(0x4280), 1, f_q))mstore(0x4320, mulmod(1, mload(0x3b20), f_q)){ let result := mulmod(mload(0x940), mload(0x3540), f_q)mstore(0x4340, result) }mstore(0x4360, mulmod(mload(0x4340), mload(0x3d80), f_q))mstore(0x4380, mulmod(sub(f_q, mload(0x4360)), 1, f_q))mstore(0x43a0, mulmod(mload(0x4320), 1, f_q)){ let result := mulmod(mload(0x960), mload(0x3540), f_q)mstore(0x43c0, result) }mstore(0x43e0, mulmod(mload(0x43c0), mload(0x3d80), f_q))mstore(0x4400, mulmod(sub(f_q, mload(0x43e0)), mload(0xe60), f_q))mstore(0x4420, mulmod(mload(0x4320), mload(0xe60), f_q))mstore(0x4440, addmod(mload(0x4380), mload(0x4400), f_q)){ let result := mulmod(mload(0x980), mload(0x3540), f_q)mstore(0x4460, result) }mstore(0x4480, mulmod(mload(0x4460), mload(0x3d80), f_q))mstore(0x44a0, mulmod(sub(f_q, mload(0x4480)), mload(0x3e00), f_q))mstore(0x44c0, mulmod(mload(0x4320), mload(0x3e00), f_q))mstore(0x44e0, addmod(mload(0x4440), mload(0x44a0), f_q)){ let result := mulmod(mload(0xd80), mload(0x3540), f_q)mstore(0x4500, result) }mstore(0x4520, mulmod(mload(0x4500), mload(0x3d80), f_q))mstore(0x4540, mulmod(sub(f_q, mload(0x4520)), mload(0x3e20), f_q))mstore(0x4560, mulmod(mload(0x4320), mload(0x3e20), f_q))mstore(0x4580, addmod(mload(0x44e0), mload(0x4540), f_q)){ let result := mulmod(mload(0xe20), mload(0x3540), f_q)mstore(0x45a0, result) }mstore(0x45c0, mulmod(mload(0x45a0), mload(0x3d80), f_q))mstore(0x45e0, mulmod(sub(f_q, mload(0x45c0)), mload(0x3e40), f_q))mstore(0x4600, mulmod(mload(0x4320), mload(0x3e40), f_q))mstore(0x4620, addmod(mload(0x4580), mload(0x45e0), f_q)){ let result := mulmod(mload(0x9a0), mload(0x3540), f_q)mstore(0x4640, result) }mstore(0x4660, mulmod(mload(0x4640), mload(0x3d80), f_q))mstore(0x4680, mulmod(sub(f_q, mload(0x4660)), mload(0x3e60), f_q))mstore(0x46a0, mulmod(mload(0x4320), mload(0x3e60), f_q))mstore(0x46c0, addmod(mload(0x4620), mload(0x4680), f_q)){ let result := mulmod(mload(0x9c0), mload(0x3540), f_q)mstore(0x46e0, result) }mstore(0x4700, mulmod(mload(0x46e0), mload(0x3d80), f_q))mstore(0x4720, mulmod(sub(f_q, mload(0x4700)), mload(0x3e80), f_q))mstore(0x4740, mulmod(mload(0x4320), mload(0x3e80), f_q))mstore(0x4760, addmod(mload(0x46c0), mload(0x4720), f_q)){ let result := mulmod(mload(0x9e0), mload(0x3540), f_q)mstore(0x4780, result) }mstore(0x47a0, mulmod(mload(0x4780), mload(0x3d80), f_q))mstore(0x47c0, mulmod(sub(f_q, mload(0x47a0)), mload(0x3ea0), f_q))mstore(0x47e0, mulmod(mload(0x4320), mload(0x3ea0), f_q))mstore(0x4800, addmod(mload(0x4760), mload(0x47c0), f_q)){ let result := mulmod(mload(0xa00), mload(0x3540), f_q)mstore(0x4820, result) }mstore(0x4840, mulmod(mload(0x4820), mload(0x3d80), f_q))mstore(0x4860, mulmod(sub(f_q, mload(0x4840)), mload(0x3ec0), f_q))mstore(0x4880, mulmod(mload(0x4320), mload(0x3ec0), f_q))mstore(0x48a0, addmod(mload(0x4800), mload(0x4860), f_q)){ let result := mulmod(mload(0xa20), mload(0x3540), f_q)mstore(0x48c0, result) }mstore(0x48e0, mulmod(mload(0x48c0), mload(0x3d80), f_q))mstore(0x4900, mulmod(sub(f_q, mload(0x48e0)), mload(0x3ee0), f_q))mstore(0x4920, mulmod(mload(0x4320), mload(0x3ee0), f_q))mstore(0x4940, addmod(mload(0x48a0), mload(0x4900), f_q)){ let result := mulmod(mload(0xa40), mload(0x3540), f_q)mstore(0x4960, result) }mstore(0x4980, mulmod(mload(0x4960), mload(0x3d80), f_q))mstore(0x49a0, mulmod(sub(f_q, mload(0x4980)), mload(0x3f00), f_q))mstore(0x49c0, mulmod(mload(0x4320), mload(0x3f00), f_q))mstore(0x49e0, addmod(mload(0x4940), mload(0x49a0), f_q)){ let result := mulmod(mload(0xa60), mload(0x3540), f_q)mstore(0x4a00, result) }mstore(0x4a20, mulmod(mload(0x4a00), mload(0x3d80), f_q))mstore(0x4a40, mulmod(sub(f_q, mload(0x4a20)), mload(0x3f20), f_q))mstore(0x4a60, mulmod(mload(0x4320), mload(0x3f20), f_q))mstore(0x4a80, addmod(mload(0x49e0), mload(0x4a40), f_q)){ let result := mulmod(mload(0xaa0), mload(0x3540), f_q)mstore(0x4aa0, result) }mstore(0x4ac0, mulmod(mload(0x4aa0), mload(0x3d80), f_q))mstore(0x4ae0, mulmod(sub(f_q, mload(0x4ac0)), mload(0x3f40), f_q))mstore(0x4b00, mulmod(mload(0x4320), mload(0x3f40), f_q))mstore(0x4b20, addmod(mload(0x4a80), mload(0x4ae0), f_q)){ let result := mulmod(mload(0xac0), mload(0x3540), f_q)mstore(0x4b40, result) }mstore(0x4b60, mulmod(mload(0x4b40), mload(0x3d80), f_q))mstore(0x4b80, mulmod(sub(f_q, mload(0x4b60)), mload(0x3f60), f_q))mstore(0x4ba0, mulmod(mload(0x4320), mload(0x3f60), f_q))mstore(0x4bc0, addmod(mload(0x4b20), mload(0x4b80), f_q)){ let result := mulmod(mload(0xae0), mload(0x3540), f_q)mstore(0x4be0, result) }mstore(0x4c00, mulmod(mload(0x4be0), mload(0x3d80), f_q))mstore(0x4c20, mulmod(sub(f_q, mload(0x4c00)), mload(0x3f80), f_q))mstore(0x4c40, mulmod(mload(0x4320), mload(0x3f80), f_q))mstore(0x4c60, addmod(mload(0x4bc0), mload(0x4c20), f_q)){ let result := mulmod(mload(0xb00), mload(0x3540), f_q)mstore(0x4c80, result) }mstore(0x4ca0, mulmod(mload(0x4c80), mload(0x3d80), f_q))mstore(0x4cc0, mulmod(sub(f_q, mload(0x4ca0)), mload(0x3fa0), f_q))mstore(0x4ce0, mulmod(mload(0x4320), mload(0x3fa0), f_q))mstore(0x4d00, addmod(mload(0x4c60), mload(0x4cc0), f_q)){ let result := mulmod(mload(0xb20), mload(0x3540), f_q)mstore(0x4d20, result) }mstore(0x4d40, mulmod(mload(0x4d20), mload(0x3d80), f_q))mstore(0x4d60, mulmod(sub(f_q, mload(0x4d40)), mload(0x3fc0), f_q))mstore(0x4d80, mulmod(mload(0x4320), mload(0x3fc0), f_q))mstore(0x4da0, addmod(mload(0x4d00), mload(0x4d60), f_q)){ let result := mulmod(mload(0xb40), mload(0x3540), f_q)mstore(0x4dc0, result) }mstore(0x4de0, mulmod(mload(0x4dc0), mload(0x3d80), f_q))mstore(0x4e00, mulmod(sub(f_q, mload(0x4de0)), mload(0x3fe0), f_q))mstore(0x4e20, mulmod(mload(0x4320), mload(0x3fe0), f_q))mstore(0x4e40, addmod(mload(0x4da0), mload(0x4e00), f_q)){ let result := mulmod(mload(0xb60), mload(0x3540), f_q)mstore(0x4e60, result) }mstore(0x4e80, mulmod(mload(0x4e60), mload(0x3d80), f_q))mstore(0x4ea0, mulmod(sub(f_q, mload(0x4e80)), mload(0x4000), f_q))mstore(0x4ec0, mulmod(mload(0x4320), mload(0x4000), f_q))mstore(0x4ee0, addmod(mload(0x4e40), mload(0x4ea0), f_q)){ let result := mulmod(mload(0xb80), mload(0x3540), f_q)mstore(0x4f00, result) }mstore(0x4f20, mulmod(mload(0x4f00), mload(0x3d80), f_q))mstore(0x4f40, mulmod(sub(f_q, mload(0x4f20)), mload(0x4020), f_q))mstore(0x4f60, mulmod(mload(0x4320), mload(0x4020), f_q))mstore(0x4f80, addmod(mload(0x4ee0), mload(0x4f40), f_q))mstore(0x4fa0, mulmod(mload(0x3120), mload(0x3b20), f_q))mstore(0x4fc0, mulmod(mload(0x3140), mload(0x3b20), f_q)){ let result := mulmod(mload(0x3160), mload(0x3540), f_q)mstore(0x4fe0, result) }mstore(0x5000, mulmod(mload(0x4fe0), mload(0x3d80), f_q))mstore(0x5020, mulmod(sub(f_q, mload(0x5000)), mload(0x4040), f_q))mstore(0x5040, mulmod(mload(0x4320), mload(0x4040), f_q))mstore(0x5060, mulmod(mload(0x4fa0), mload(0x4040), f_q))mstore(0x5080, mulmod(mload(0x4fc0), mload(0x4040), f_q))mstore(0x50a0, addmod(mload(0x4f80), mload(0x5020), f_q)){ let result := mulmod(mload(0xa80), mload(0x3540), f_q)mstore(0x50c0, result) }mstore(0x50e0, mulmod(mload(0x50c0), mload(0x3d80), f_q))mstore(0x5100, mulmod(sub(f_q, mload(0x50e0)), mload(0x4060), f_q))mstore(0x5120, mulmod(mload(0x4320), mload(0x4060), f_q))mstore(0x5140, addmod(mload(0x50a0), mload(0x5100), f_q))mstore(0x5160, mulmod(mload(0x5140), mload(0xec0), f_q))mstore(0x5180, mulmod(mload(0x43a0), mload(0xec0), f_q))mstore(0x51a0, mulmod(mload(0x4420), mload(0xec0), f_q))mstore(0x51c0, mulmod(mload(0x44c0), mload(0xec0), f_q))mstore(0x51e0, mulmod(mload(0x4560), mload(0xec0), f_q))mstore(0x5200, mulmod(mload(0x4600), mload(0xec0), f_q))mstore(0x5220, mulmod(mload(0x46a0), mload(0xec0), f_q))mstore(0x5240, mulmod(mload(0x4740), mload(0xec0), f_q))mstore(0x5260, mulmod(mload(0x47e0), mload(0xec0), f_q))mstore(0x5280, mulmod(mload(0x4880), mload(0xec0), f_q))mstore(0x52a0, mulmod(mload(0x4920), mload(0xec0), f_q))mstore(0x52c0, mulmod(mload(0x49c0), mload(0xec0), f_q))mstore(0x52e0, mulmod(mload(0x4a60), mload(0xec0), f_q))mstore(0x5300, mulmod(mload(0x4b00), mload(0xec0), f_q))mstore(0x5320, mulmod(mload(0x4ba0), mload(0xec0), f_q))mstore(0x5340, mulmod(mload(0x4c40), mload(0xec0), f_q))mstore(0x5360, mulmod(mload(0x4ce0), mload(0xec0), f_q))mstore(0x5380, mulmod(mload(0x4d80), mload(0xec0), f_q))mstore(0x53a0, mulmod(mload(0x4e20), mload(0xec0), f_q))mstore(0x53c0, mulmod(mload(0x4ec0), mload(0xec0), f_q))mstore(0x53e0, mulmod(mload(0x4f60), mload(0xec0), f_q))mstore(0x5400, mulmod(mload(0x5040), mload(0xec0), f_q))mstore(0x5420, mulmod(mload(0x5060), mload(0xec0), f_q))mstore(0x5440, mulmod(mload(0x5080), mload(0xec0), f_q))mstore(0x5460, mulmod(mload(0x5120), mload(0xec0), f_q))mstore(0x5480, addmod(mload(0x42c0), mload(0x5160), f_q))mstore(0x54a0, mulmod(1, mload(0x3b60), f_q)){ let result := mulmod(mload(0xba0), mload(0x35a0), f_q)result := addmod(mulmod(mload(0xbc0), mload(0x3600), f_q), result, f_q)result := addmod(mulmod(mload(0xbe0), mload(0x3660), f_q), result, f_q)mstore(0x54c0, result) }mstore(0x54e0, mulmod(mload(0x54c0), mload(0x3da0), f_q))mstore(0x5500, mulmod(sub(f_q, mload(0x54e0)), 1, f_q))mstore(0x5520, mulmod(mload(0x54a0), 1, f_q)){ let result := mulmod(mload(0xc00), mload(0x35a0), f_q)result := addmod(mulmod(mload(0xc20), mload(0x3600), f_q), result, f_q)result := addmod(mulmod(mload(0xc40), mload(0x3660), f_q), result, f_q)mstore(0x5540, result) }mstore(0x5560, mulmod(mload(0x5540), mload(0x3da0), f_q))mstore(0x5580, mulmod(sub(f_q, mload(0x5560)), mload(0xe60), f_q))mstore(0x55a0, mulmod(mload(0x54a0), mload(0xe60), f_q))mstore(0x55c0, addmod(mload(0x5500), mload(0x5580), f_q)){ let result := mulmod(mload(0xc60), mload(0x35a0), f_q)result := addmod(mulmod(mload(0xc80), mload(0x3600), f_q), result, f_q)result := addmod(mulmod(mload(0xca0), mload(0x3660), f_q), result, f_q)mstore(0x55e0, result) }mstore(0x5600, mulmod(mload(0x55e0), mload(0x3da0), f_q))mstore(0x5620, mulmod(sub(f_q, mload(0x5600)), mload(0x3e00), f_q))mstore(0x5640, mulmod(mload(0x54a0), mload(0x3e00), f_q))mstore(0x5660, addmod(mload(0x55c0), mload(0x5620), f_q))mstore(0x5680, mulmod(mload(0x5660), mload(0x40a0), f_q))mstore(0x56a0, mulmod(mload(0x5520), mload(0x40a0), f_q))mstore(0x56c0, mulmod(mload(0x55a0), mload(0x40a0), f_q))mstore(0x56e0, mulmod(mload(0x5640), mload(0x40a0), f_q))mstore(0x5700, addmod(mload(0x5480), mload(0x5680), f_q))mstore(0x5720, mulmod(1, mload(0x3ba0), f_q)){ let result := mulmod(mload(0xcc0), mload(0x36e0), f_q)result := addmod(mulmod(mload(0xce0), mload(0x3740), f_q), result, f_q)mstore(0x5740, result) }mstore(0x5760, mulmod(mload(0x5740), mload(0x3dc0), f_q))mstore(0x5780, mulmod(sub(f_q, mload(0x5760)), 1, f_q))mstore(0x57a0, mulmod(mload(0x5720), 1, f_q)){ let result := mulmod(mload(0xd00), mload(0x36e0), f_q)result := addmod(mulmod(mload(0xd20), mload(0x3740), f_q), result, f_q)mstore(0x57c0, result) }mstore(0x57e0, mulmod(mload(0x57c0), mload(0x3dc0), f_q))mstore(0x5800, mulmod(sub(f_q, mload(0x57e0)), mload(0xe60), f_q))mstore(0x5820, mulmod(mload(0x5720), mload(0xe60), f_q))mstore(0x5840, addmod(mload(0x5780), mload(0x5800), f_q)){ let result := mulmod(mload(0xda0), mload(0x36e0), f_q)result := addmod(mulmod(mload(0xdc0), mload(0x3740), f_q), result, f_q)mstore(0x5860, result) }mstore(0x5880, mulmod(mload(0x5860), mload(0x3dc0), f_q))mstore(0x58a0, mulmod(sub(f_q, mload(0x5880)), mload(0x3e00), f_q))mstore(0x58c0, mulmod(mload(0x5720), mload(0x3e00), f_q))mstore(0x58e0, addmod(mload(0x5840), mload(0x58a0), f_q))mstore(0x5900, mulmod(mload(0x58e0), mload(0x40c0), f_q))mstore(0x5920, mulmod(mload(0x57a0), mload(0x40c0), f_q))mstore(0x5940, mulmod(mload(0x5820), mload(0x40c0), f_q))mstore(0x5960, mulmod(mload(0x58c0), mload(0x40c0), f_q))mstore(0x5980, addmod(mload(0x5700), mload(0x5900), f_q))mstore(0x59a0, mulmod(1, mload(0x3be0), f_q)){ let result := mulmod(mload(0xd40), mload(0x37a0), f_q)result := addmod(mulmod(mload(0xd60), mload(0x3800), f_q), result, f_q)mstore(0x59c0, result) }mstore(0x59e0, mulmod(mload(0x59c0), mload(0x3de0), f_q))mstore(0x5a00, mulmod(sub(f_q, mload(0x59e0)), 1, f_q))mstore(0x5a20, mulmod(mload(0x59a0), 1, f_q)){ let result := mulmod(mload(0xde0), mload(0x37a0), f_q)result := addmod(mulmod(mload(0xe00), mload(0x3800), f_q), result, f_q)mstore(0x5a40, result) }mstore(0x5a60, mulmod(mload(0x5a40), mload(0x3de0), f_q))mstore(0x5a80, mulmod(sub(f_q, mload(0x5a60)), mload(0xe60), f_q))mstore(0x5aa0, mulmod(mload(0x59a0), mload(0xe60), f_q))mstore(0x5ac0, addmod(mload(0x5a00), mload(0x5a80), f_q))mstore(0x5ae0, mulmod(mload(0x5ac0), mload(0x40e0), f_q))mstore(0x5b00, mulmod(mload(0x5a20), mload(0x40e0), f_q))mstore(0x5b20, mulmod(mload(0x5aa0), mload(0x40e0), f_q))mstore(0x5b40, addmod(mload(0x5980), mload(0x5ae0), f_q))mstore(0x5b60, mulmod(1, mload(0x3520), f_q))mstore(0x5b80, mulmod(1, mload(0xf60), f_q))mstore(0x5ba0, 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(0x5bc0, 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(0x5be0, mload(0x5b40))success := and(eq(staticcall(gas(), 0x7, 0x5ba0, 0x60, 0x5ba0, 0x40), 1), success)mstore(0x5c00, mload(0x5ba0)) mstore(0x5c20, mload(0x5bc0))mstore(0x5c40, mload(0xe0)) mstore(0x5c60, mload(0x100))success := and(eq(staticcall(gas(), 0x6, 0x5c00, 0x80, 0x5c00, 0x40), 1), success)mstore(0x5c80, mload(0x120)) mstore(0x5ca0, mload(0x140))mstore(0x5cc0, mload(0x42e0))success := and(eq(staticcall(gas(), 0x7, 0x5c80, 0x60, 0x5c80, 0x40), 1), success)mstore(0x5ce0, mload(0x5c00)) mstore(0x5d00, mload(0x5c20))mstore(0x5d20, mload(0x5c80)) mstore(0x5d40, mload(0x5ca0))success := and(eq(staticcall(gas(), 0x6, 0x5ce0, 0x80, 0x5ce0, 0x40), 1), success)mstore(0x5d60, mload(0x160)) mstore(0x5d80, mload(0x180))mstore(0x5da0, mload(0x4300))success := and(eq(staticcall(gas(), 0x7, 0x5d60, 0x60, 0x5d60, 0x40), 1), success)mstore(0x5dc0, mload(0x5ce0)) mstore(0x5de0, mload(0x5d00))mstore(0x5e00, mload(0x5d60)) mstore(0x5e20, mload(0x5d80))success := and(eq(staticcall(gas(), 0x6, 0x5dc0, 0x80, 0x5dc0, 0x40), 1), success)mstore(0x5e40, mload(0x1a0)) mstore(0x5e60, mload(0x1c0))mstore(0x5e80, mload(0x5180))success := and(eq(staticcall(gas(), 0x7, 0x5e40, 0x60, 0x5e40, 0x40), 1), success)mstore(0x5ea0, mload(0x5dc0)) mstore(0x5ec0, mload(0x5de0))mstore(0x5ee0, mload(0x5e40)) mstore(0x5f00, mload(0x5e60))success := and(eq(staticcall(gas(), 0x6, 0x5ea0, 0x80, 0x5ea0, 0x40), 1), success)mstore(0x5f20, mload(0x1e0)) mstore(0x5f40, mload(0x200))mstore(0x5f60, mload(0x51a0))success := and(eq(staticcall(gas(), 0x7, 0x5f20, 0x60, 0x5f20, 0x40), 1), success)mstore(0x5f80, mload(0x5ea0)) mstore(0x5fa0, mload(0x5ec0))mstore(0x5fc0, mload(0x5f20)) mstore(0x5fe0, mload(0x5f40))success := and(eq(staticcall(gas(), 0x6, 0x5f80, 0x80, 0x5f80, 0x40), 1), success)mstore(0x6000, mload(0x220)) mstore(0x6020, mload(0x240))mstore(0x6040, mload(0x51c0))success := and(eq(staticcall(gas(), 0x7, 0x6000, 0x60, 0x6000, 0x40), 1), success)mstore(0x6060, mload(0x5f80)) mstore(0x6080, mload(0x5fa0))mstore(0x60a0, mload(0x6000)) mstore(0x60c0, mload(0x6020))success := and(eq(staticcall(gas(), 0x6, 0x6060, 0x80, 0x6060, 0x40), 1), success)mstore(0x60e0, mload(0x300)) mstore(0x6100, mload(0x320))mstore(0x6120, mload(0x51e0))success := and(eq(staticcall(gas(), 0x7, 0x60e0, 0x60, 0x60e0, 0x40), 1), success)mstore(0x6140, mload(0x6060)) mstore(0x6160, mload(0x6080))mstore(0x6180, mload(0x60e0)) mstore(0x61a0, mload(0x6100))success := and(eq(staticcall(gas(), 0x6, 0x6140, 0x80, 0x6140, 0x40), 1), success)mstore(0x61c0, mload(0x380)) mstore(0x61e0, mload(0x3a0))mstore(0x6200, mload(0x5200))success := and(eq(staticcall(gas(), 0x7, 0x61c0, 0x60, 0x61c0, 0x40), 1), success)mstore(0x6220, mload(0x6140)) mstore(0x6240, mload(0x6160))mstore(0x6260, mload(0x61c0)) mstore(0x6280, mload(0x61e0))success := and(eq(staticcall(gas(), 0x6, 0x6220, 0x80, 0x6220, 0x40), 1), success)mstore(0x62a0, 0x0b96e9ba6d431371e5a12f4bc301063b6bd32203dab969797b9172df7913c7ca) mstore(0x62c0, 0x20e2bcb5d32184f92745a267dd860d994bc872c7f9754dfd49ea30f208bc8e7d)mstore(0x62e0, mload(0x5220))success := and(eq(staticcall(gas(), 0x7, 0x62a0, 0x60, 0x62a0, 0x40), 1), success)mstore(0x6300, mload(0x6220)) mstore(0x6320, mload(0x6240))mstore(0x6340, mload(0x62a0)) mstore(0x6360, mload(0x62c0))success := and(eq(staticcall(gas(), 0x6, 0x6300, 0x80, 0x6300, 0x40), 1), success)mstore(0x6380, 0x04528ec7365a2881b7d3c8925570e06bb3b17f04f6a95384ac8ed19a30c12097) mstore(0x63a0, 0x28d1ef470a8a5278ad6d2eb9047ad7e93024113f543b06870f1bbea7177db404)mstore(0x63c0, mload(0x5240))success := and(eq(staticcall(gas(), 0x7, 0x6380, 0x60, 0x6380, 0x40), 1), success)mstore(0x63e0, mload(0x6300)) mstore(0x6400, mload(0x6320))mstore(0x6420, mload(0x6380)) mstore(0x6440, mload(0x63a0))success := and(eq(staticcall(gas(), 0x6, 0x63e0, 0x80, 0x63e0, 0x40), 1), success)mstore(0x6460, 0x26d596beff3180e2081a8c83692409dfc7406cf15aaf10dc8556e0436da60495) mstore(0x6480, 0x07a8630fddcc902f826625d59e1f4d43a960becac0abccbf914cc4a195128004)mstore(0x64a0, mload(0x5260))success := and(eq(staticcall(gas(), 0x7, 0x6460, 0x60, 0x6460, 0x40), 1), success)mstore(0x64c0, mload(0x63e0)) mstore(0x64e0, mload(0x6400))mstore(0x6500, mload(0x6460)) mstore(0x6520, mload(0x6480))success := and(eq(staticcall(gas(), 0x6, 0x64c0, 0x80, 0x64c0, 0x40), 1), success)mstore(0x6540, 0x00fd9e133127912e1f0b8132fd86f0ab1171488773bfa087ff61a972ee4ee28a) mstore(0x6560, 0x00deeb5848ab55796bdab8aa6c2ba27eb8fd39a761ae2c4618fbfa321172af5d)mstore(0x6580, mload(0x5280))success := and(eq(staticcall(gas(), 0x7, 0x6540, 0x60, 0x6540, 0x40), 1), success)mstore(0x65a0, mload(0x64c0)) mstore(0x65c0, mload(0x64e0))mstore(0x65e0, mload(0x6540)) mstore(0x6600, mload(0x6560))success := and(eq(staticcall(gas(), 0x6, 0x65a0, 0x80, 0x65a0, 0x40), 1), success)mstore(0x6620, 0x117ac3e6a7f194085549165ec9f9b76173b6fcd69bea5e048b28f1772320bf88) mstore(0x6640, 0x290e8e5e1d10767bf9db8f2922c0ded0f28864a8552f75f56725ddb023c59989)mstore(0x6660, mload(0x52a0))success := and(eq(staticcall(gas(), 0x7, 0x6620, 0x60, 0x6620, 0x40), 1), success)mstore(0x6680, mload(0x65a0)) mstore(0x66a0, mload(0x65c0))mstore(0x66c0, mload(0x6620)) mstore(0x66e0, mload(0x6640))success := and(eq(staticcall(gas(), 0x6, 0x6680, 0x80, 0x6680, 0x40), 1), success)mstore(0x6700, 0x08cfd729350e86b28811da499c3e2634410db8326f0325c21afec370a71e7a7d) mstore(0x6720, 0x27a3b9bee8ef511a4d52c994946bcea865d898e9549edd25928824f64eece9bf)mstore(0x6740, mload(0x52c0))success := and(eq(staticcall(gas(), 0x7, 0x6700, 0x60, 0x6700, 0x40), 1), success)mstore(0x6760, mload(0x6680)) mstore(0x6780, mload(0x66a0))mstore(0x67a0, mload(0x6700)) mstore(0x67c0, mload(0x6720))success := and(eq(staticcall(gas(), 0x6, 0x6760, 0x80, 0x6760, 0x40), 1), success)mstore(0x67e0, 0x064faf421ac1b59c3c858c6ff15d3f624a5d3bbdc3ae781c85cbe0bdba62fd93) mstore(0x6800, 0x056e0528fd41a949b94efbf8f84e8d2c23e9b36513b6f13de5b444e3a8583ad1)mstore(0x6820, mload(0x52e0))success := and(eq(staticcall(gas(), 0x7, 0x67e0, 0x60, 0x67e0, 0x40), 1), success)mstore(0x6840, mload(0x6760)) mstore(0x6860, mload(0x6780))mstore(0x6880, mload(0x67e0)) mstore(0x68a0, mload(0x6800))success := and(eq(staticcall(gas(), 0x6, 0x6840, 0x80, 0x6840, 0x40), 1), success)mstore(0x68c0, 0x234729055f9f6c0a7f0bd162383b896913085bddc9276b1d8bad6a59692ae16f) mstore(0x68e0, 0x185b5f5b8c48147a1eedeb6a14e61094af0db376af93a8804954ca36f1fba96d)mstore(0x6900, mload(0x5300))success := and(eq(staticcall(gas(), 0x7, 0x68c0, 0x60, 0x68c0, 0x40), 1), success)mstore(0x6920, mload(0x6840)) mstore(0x6940, mload(0x6860))mstore(0x6960, mload(0x68c0)) mstore(0x6980, mload(0x68e0))success := and(eq(staticcall(gas(), 0x6, 0x6920, 0x80, 0x6920, 0x40), 1), success)mstore(0x69a0, 0x283f0f212dbc03e37b15e2685146a079911c1c5423d87c5382b161b9a0bb49ae) mstore(0x69c0, 0x2082777a3697f9d689f01ab4cb57e9c9daff8ff78609fb77786cafae88d0bc7b)mstore(0x69e0, mload(0x5320))success := and(eq(staticcall(gas(), 0x7, 0x69a0, 0x60, 0x69a0, 0x40), 1), success)mstore(0x6a00, mload(0x6920)) mstore(0x6a20, mload(0x6940))mstore(0x6a40, mload(0x69a0)) mstore(0x6a60, mload(0x69c0))success := and(eq(staticcall(gas(), 0x6, 0x6a00, 0x80, 0x6a00, 0x40), 1), success)mstore(0x6a80, 0x24741ed32b7e8bf80c633bd68ebdfebb3b8a264a12a4bfd5a8d8c6d6f0d08bc5) mstore(0x6aa0, 0x2e1a327044b74574f2dc9c58697265c79d040fdb4a95cdff5bc555e289fb44c3)mstore(0x6ac0, mload(0x5340))success := and(eq(staticcall(gas(), 0x7, 0x6a80, 0x60, 0x6a80, 0x40), 1), success)mstore(0x6ae0, mload(0x6a00)) mstore(0x6b00, mload(0x6a20))mstore(0x6b20, mload(0x6a80)) mstore(0x6b40, mload(0x6aa0))success := and(eq(staticcall(gas(), 0x6, 0x6ae0, 0x80, 0x6ae0, 0x40), 1), success)mstore(0x6b60, 0x0b297ad87fb64db7d1f995d47ac8ecb0200ff507d4d59abbfdba241728f18a09) mstore(0x6b80, 0x1d4184a7fb3da8a99f8e76c1f4bab92132447ca9c7bb2a0ce57dc2168592ec6d)mstore(0x6ba0, mload(0x5360))success := and(eq(staticcall(gas(), 0x7, 0x6b60, 0x60, 0x6b60, 0x40), 1), success)mstore(0x6bc0, mload(0x6ae0)) mstore(0x6be0, mload(0x6b00))mstore(0x6c00, mload(0x6b60)) mstore(0x6c20, mload(0x6b80))success := and(eq(staticcall(gas(), 0x6, 0x6bc0, 0x80, 0x6bc0, 0x40), 1), success)mstore(0x6c40, 0x2874853fd4a78c01e9010b9da6039901cc4b6a6b4637a3e82bad90edd4a193af) mstore(0x6c60, 0x24fb3607b118ca3571adf4a03b6fa01541751aac5f4dc7198f2fc6a72d2a2ba0)mstore(0x6c80, mload(0x5380))success := and(eq(staticcall(gas(), 0x7, 0x6c40, 0x60, 0x6c40, 0x40), 1), success)mstore(0x6ca0, mload(0x6bc0)) mstore(0x6cc0, mload(0x6be0))mstore(0x6ce0, mload(0x6c40)) mstore(0x6d00, mload(0x6c60))success := and(eq(staticcall(gas(), 0x6, 0x6ca0, 0x80, 0x6ca0, 0x40), 1), success)mstore(0x6d20, 0x271459108c112be6d916f80e10ac83c63034c3c6a0980f9898718c631976384e) mstore(0x6d40, 0x030f7b7538285670b1f478141b3ff5de441d7da00275dee9bb71d4f96310c723)mstore(0x6d60, mload(0x53a0))success := and(eq(staticcall(gas(), 0x7, 0x6d20, 0x60, 0x6d20, 0x40), 1), success)mstore(0x6d80, mload(0x6ca0)) mstore(0x6da0, mload(0x6cc0))mstore(0x6dc0, mload(0x6d20)) mstore(0x6de0, mload(0x6d40))success := and(eq(staticcall(gas(), 0x6, 0x6d80, 0x80, 0x6d80, 0x40), 1), success)mstore(0x6e00, 0x163acaaafeb0898f4b05601fb3f8ab87f55ef82d86403365016d32f027ff0522) mstore(0x6e20, 0x1013edceead5822db3c9c6fa123c4d8a9315fca983fcd2dbe9d2cadb4dbcd275)mstore(0x6e40, mload(0x53c0))success := and(eq(staticcall(gas(), 0x7, 0x6e00, 0x60, 0x6e00, 0x40), 1), success)mstore(0x6e60, mload(0x6d80)) mstore(0x6e80, mload(0x6da0))mstore(0x6ea0, mload(0x6e00)) mstore(0x6ec0, mload(0x6e20))success := and(eq(staticcall(gas(), 0x6, 0x6e60, 0x80, 0x6e60, 0x40), 1), success)mstore(0x6ee0, 0x0896766b7d7719cd07e12b6837d0c2ad2601e74e6e0ad42e0cf11768291acb87) mstore(0x6f00, 0x2087c93b42be06b6848a956762a9984e961c60351a72f0765241bfa84b06f6f9)mstore(0x6f20, mload(0x53e0))success := and(eq(staticcall(gas(), 0x7, 0x6ee0, 0x60, 0x6ee0, 0x40), 1), success)mstore(0x6f40, mload(0x6e60)) mstore(0x6f60, mload(0x6e80))mstore(0x6f80, mload(0x6ee0)) mstore(0x6fa0, mload(0x6f00))success := and(eq(staticcall(gas(), 0x6, 0x6f40, 0x80, 0x6f40, 0x40), 1), success)mstore(0x6fc0, mload(0x6a0)) mstore(0x6fe0, mload(0x6c0))mstore(0x7000, mload(0x5400))success := and(eq(staticcall(gas(), 0x7, 0x6fc0, 0x60, 0x6fc0, 0x40), 1), success)mstore(0x7020, mload(0x6f40)) mstore(0x7040, mload(0x6f60))mstore(0x7060, mload(0x6fc0)) mstore(0x7080, mload(0x6fe0))success := and(eq(staticcall(gas(), 0x6, 0x7020, 0x80, 0x7020, 0x40), 1), success)mstore(0x70a0, mload(0x6e0)) mstore(0x70c0, mload(0x700))mstore(0x70e0, mload(0x5420))success := and(eq(staticcall(gas(), 0x7, 0x70a0, 0x60, 0x70a0, 0x40), 1), success)mstore(0x7100, mload(0x7020)) mstore(0x7120, mload(0x7040))mstore(0x7140, mload(0x70a0)) mstore(0x7160, mload(0x70c0))success := and(eq(staticcall(gas(), 0x6, 0x7100, 0x80, 0x7100, 0x40), 1), success)mstore(0x7180, mload(0x720)) mstore(0x71a0, mload(0x740))mstore(0x71c0, mload(0x5440))success := and(eq(staticcall(gas(), 0x7, 0x7180, 0x60, 0x7180, 0x40), 1), success)mstore(0x71e0, mload(0x7100)) mstore(0x7200, mload(0x7120))mstore(0x7220, mload(0x7180)) mstore(0x7240, mload(0x71a0))success := and(eq(staticcall(gas(), 0x6, 0x71e0, 0x80, 0x71e0, 0x40), 1), success)mstore(0x7260, mload(0x600)) mstore(0x7280, mload(0x620))mstore(0x72a0, mload(0x5460))success := and(eq(staticcall(gas(), 0x7, 0x7260, 0x60, 0x7260, 0x40), 1), success)mstore(0x72c0, mload(0x71e0)) mstore(0x72e0, mload(0x7200))mstore(0x7300, mload(0x7260)) mstore(0x7320, mload(0x7280))success := and(eq(staticcall(gas(), 0x6, 0x72c0, 0x80, 0x72c0, 0x40), 1), success)mstore(0x7340, mload(0x480)) mstore(0x7360, mload(0x4a0))mstore(0x7380, mload(0x56a0))success := and(eq(staticcall(gas(), 0x7, 0x7340, 0x60, 0x7340, 0x40), 1), success)mstore(0x73a0, mload(0x72c0)) mstore(0x73c0, mload(0x72e0))mstore(0x73e0, mload(0x7340)) mstore(0x7400, mload(0x7360))success := and(eq(staticcall(gas(), 0x6, 0x73a0, 0x80, 0x73a0, 0x40), 1), success)mstore(0x7420, mload(0x4c0)) mstore(0x7440, mload(0x4e0))mstore(0x7460, mload(0x56c0))success := and(eq(staticcall(gas(), 0x7, 0x7420, 0x60, 0x7420, 0x40), 1), success)mstore(0x7480, mload(0x73a0)) mstore(0x74a0, mload(0x73c0))mstore(0x74c0, mload(0x7420)) mstore(0x74e0, mload(0x7440))success := and(eq(staticcall(gas(), 0x6, 0x7480, 0x80, 0x7480, 0x40), 1), success)mstore(0x7500, mload(0x500)) mstore(0x7520, mload(0x520))mstore(0x7540, mload(0x56e0))success := and(eq(staticcall(gas(), 0x7, 0x7500, 0x60, 0x7500, 0x40), 1), success)mstore(0x7560, mload(0x7480)) mstore(0x7580, mload(0x74a0))mstore(0x75a0, mload(0x7500)) mstore(0x75c0, mload(0x7520))success := and(eq(staticcall(gas(), 0x6, 0x7560, 0x80, 0x7560, 0x40), 1), success)mstore(0x75e0, mload(0x540)) mstore(0x7600, mload(0x560))mstore(0x7620, mload(0x5920))success := and(eq(staticcall(gas(), 0x7, 0x75e0, 0x60, 0x75e0, 0x40), 1), success)mstore(0x7640, mload(0x7560)) mstore(0x7660, mload(0x7580))mstore(0x7680, mload(0x75e0)) mstore(0x76a0, mload(0x7600))success := and(eq(staticcall(gas(), 0x6, 0x7640, 0x80, 0x7640, 0x40), 1), success)mstore(0x76c0, mload(0x580)) mstore(0x76e0, mload(0x5a0))mstore(0x7700, mload(0x5940))success := and(eq(staticcall(gas(), 0x7, 0x76c0, 0x60, 0x76c0, 0x40), 1), success)mstore(0x7720, mload(0x7640)) mstore(0x7740, mload(0x7660))mstore(0x7760, mload(0x76c0)) mstore(0x7780, mload(0x76e0))success := and(eq(staticcall(gas(), 0x6, 0x7720, 0x80, 0x7720, 0x40), 1), success)mstore(0x77a0, mload(0x5c0)) mstore(0x77c0, mload(0x5e0))mstore(0x77e0, mload(0x5960))success := and(eq(staticcall(gas(), 0x7, 0x77a0, 0x60, 0x77a0, 0x40), 1), success)mstore(0x7800, mload(0x7720)) mstore(0x7820, mload(0x7740))mstore(0x7840, mload(0x77a0)) mstore(0x7860, mload(0x77c0))success := and(eq(staticcall(gas(), 0x6, 0x7800, 0x80, 0x7800, 0x40), 1), success)mstore(0x7880, mload(0x2c0)) mstore(0x78a0, mload(0x2e0))mstore(0x78c0, mload(0x5b00))success := and(eq(staticcall(gas(), 0x7, 0x7880, 0x60, 0x7880, 0x40), 1), success)mstore(0x78e0, mload(0x7800)) mstore(0x7900, mload(0x7820))mstore(0x7920, mload(0x7880)) mstore(0x7940, mload(0x78a0))success := and(eq(staticcall(gas(), 0x6, 0x78e0, 0x80, 0x78e0, 0x40), 1), success)mstore(0x7960, mload(0x340)) mstore(0x7980, mload(0x360))mstore(0x79a0, mload(0x5b20))success := and(eq(staticcall(gas(), 0x7, 0x7960, 0x60, 0x7960, 0x40), 1), success)mstore(0x79c0, mload(0x78e0)) mstore(0x79e0, mload(0x7900))mstore(0x7a00, mload(0x7960)) mstore(0x7a20, mload(0x7980))success := and(eq(staticcall(gas(), 0x6, 0x79c0, 0x80, 0x79c0, 0x40), 1), success)mstore(0x7a40, mload(0xf00)) mstore(0x7a60, mload(0xf20))mstore(0x7a80, sub(f_q, mload(0x5b60)))success := and(eq(staticcall(gas(), 0x7, 0x7a40, 0x60, 0x7a40, 0x40), 1), success)mstore(0x7aa0, mload(0x79c0)) mstore(0x7ac0, mload(0x79e0))mstore(0x7ae0, mload(0x7a40)) mstore(0x7b00, mload(0x7a60))success := and(eq(staticcall(gas(), 0x6, 0x7aa0, 0x80, 0x7aa0, 0x40), 1), success)mstore(0x7b20, mload(0xfa0)) mstore(0x7b40, mload(0xfc0))mstore(0x7b60, mload(0x5b80))success := and(eq(staticcall(gas(), 0x7, 0x7b20, 0x60, 0x7b20, 0x40), 1), success)mstore(0x7b80, mload(0x7aa0)) mstore(0x7ba0, mload(0x7ac0))mstore(0x7bc0, mload(0x7b20)) mstore(0x7be0, mload(0x7b40))success := and(eq(staticcall(gas(), 0x6, 0x7b80, 0x80, 0x7b80, 0x40), 1), success)mstore(0x7c00, mload(0x7b80)) mstore(0x7c20, mload(0x7ba0))mstore(0x7c40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(0x7c60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(0x7c80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(0x7ca0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(0x7cc0, mload(0xfa0)) mstore(0x7ce0, mload(0xfc0))mstore(0x7d00, 0x0181624e80f3d6ae28df7e01eaeab1c0e919877a3b8a6b7fbc69a6817d596ea2) mstore(0x7d20, 0x1783d30dcb12d259bb89098addf6280fa4b653be7a152542a28f7b926e27e648) mstore(0x7d40, 0x00ae44489d41a0d179e2dfdc03bddd883b7109f8b6ae316a59e815c1a6b35304) mstore(0x7d60, 0x0b2147ab62a386bd63e6de1522109b8c9588ab466f5aadfde8c41ca3749423ee)success := and(eq(staticcall(gas(), 0x8, 0x7c00, 0x180, 0x7c00, 0x20), 1), success)success := and(eq(mload(0x7c00), 1), success)} return success; } }