From efd80103aa66d094cd13a4bc826e40bc124a623e Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Fri, 1 Dec 2023 21:05:02 +0100 Subject: [PATCH 01/14] update just file --- justfile | 8 ++++---- .../scripts}/download_consensus_specs.sh | 0 2 files changed, 4 insertions(+), 4 deletions(-) rename {scripts => test-utils/scripts}/download_consensus_specs.sh (100%) diff --git a/justfile b/justfile index fd77373a..79b258f8 100644 --- a/justfile +++ b/justfile @@ -20,10 +20,10 @@ setup-committee-update network: cargo run -r -- circuit committee-update -p ./build/committee_update_$1.pkey -k 18 \ --verifier-k 25 --verifier-pk-path ./build/committee_update_verifier_$1.pkey setup -gen-step-evm-verifier: - cargo run -r -- circuit sync-step -c ./lightclient-circuits/config/sync_step.json -o evm-verifier ./contracts/snark-verifiers/sync_step.yul +gen-verifier-step network: + cargo run -r -- circuit sync-step -p ./build/sync_step_$1.pkey gen-verifier -o ./contracts/snark-verifiers/sync_step_$1.sol -gen-rotation-evm-verifier: +gen-verifier-committee-update network: cargo run -r -- circuit aggregation -c ./lightclient-circuits/config/aggregation.json --app-pk-path ./build/committee_update.pkey --app-config-path ./lightclient-circuits/config/committee_update.json -i ./rotation -o evm-verifier ./contracts/snark-verifiers/committee_update_aggregated.yul build-contracts: @@ -42,7 +42,7 @@ download-spec-tests: clean-spec-tests #!/usr/bin/env bash if [[ ! -d 'consensus-spec-tests' ]]; then echo "Downloading test data." - scripts/download_consensus_specs.sh + test-utils/scripts/download_consensus_specs.sh fi # deletes all the downloaded spec tests diff --git a/scripts/download_consensus_specs.sh b/test-utils/scripts/download_consensus_specs.sh similarity index 100% rename from scripts/download_consensus_specs.sh rename to test-utils/scripts/download_consensus_specs.sh From 3d9bbd3dc7767b129c64a8902c73ad47009ac69d Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Fri, 1 Dec 2023 21:05:27 +0100 Subject: [PATCH 02/14] add flag for gas estimation --- prover/src/args.rs | 12 ++++++------ prover/src/cli.rs | 33 +++++++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/prover/src/args.rs b/prover/src/args.rs index 3f10c823..29c40326 100644 --- a/prover/src/args.rs +++ b/prover/src/args.rs @@ -74,13 +74,13 @@ pub enum ProofCmd { #[derive(Clone, clap::Subcommand)] pub enum OperationCmd { Setup, - GenVerifier(VerifierGenArgs), -} + GenVerifier { + #[clap(long, short = 'o')] + solidity_out: PathBuf, -#[derive(Clone, clap::Args)] -pub struct VerifierGenArgs { - #[clap(long, short)] - pub solidity_out: PathBuf, + #[clap(long, short)] + estimate_gas: bool, + }, } #[derive(Clone, Debug, PartialEq, EnumString, Serialize, Deserialize)] diff --git a/prover/src/cli.rs b/prover/src/cli.rs index ce2c696c..3fc74a26 100644 --- a/prover/src/cli.rs +++ b/prover/src/cli.rs @@ -52,11 +52,12 @@ where k, pk_path, } => { - let params = gen_srs(k); let cfg_path = get_config_path(&pk_path, &base_args.config_dir); match operation { OperationCmd::Setup => { + let params = gen_srs(k); + StepCircuit::::create_pk( ¶ms, &pk_path, @@ -66,8 +67,9 @@ where Ok(()) } - OperationCmd::GenVerifier(args) => { - gen_evm_verifier::>(¶ms, &pk_path, args.solidity_out) + OperationCmd::GenVerifier{ solidity_out, estimate_gas } => { + let params = gen_srs(StepCircuit::::get_degree(&cfg_path)); + gen_evm_verifier::>(¶ms, &pk_path, &cfg_path, solidity_out, estimate_gas) } } } @@ -78,10 +80,11 @@ where verifier_pk_path, pk_path, } => { - let params = gen_srs(k); let cfg_path = get_config_path(&pk_path, &base_args.config_dir); match operation { OperationCmd::Setup => { + let params = gen_srs(k); + let pk = CommitteeUpdateCircuit::::create_pk( ¶ms, &pk_path, @@ -111,8 +114,9 @@ where Ok(()) } - OperationCmd::GenVerifier(args) => { - gen_evm_verifier::>(¶ms, &pk_path, args.solidity_out) + OperationCmd::GenVerifier{ solidity_out, estimate_gas } => { + let params = gen_srs(AggregationCircuit::get_degree(&cfg_path)); + gen_evm_verifier::>(¶ms, &pk_path, &cfg_path, solidity_out, estimate_gas) } } } @@ -131,18 +135,20 @@ fn get_config_path(pk_path: &Path, config_dir: &Path) -> PathBuf { fn gen_evm_verifier( params: &ParamsKZG, pk_path: &Path, + cfg_path: &Path, mut path_out: PathBuf, + estimate_gas: bool, ) -> eyre::Result<()> where Circuit::Witness: Default, { let pk = Circuit::read_pk(params, pk_path, &Default::default()); - + + path_out.set_extension("yul"); let deplyment_code = Circuit::gen_evm_verifier_shplonk(params, &pk, Some(path_out.clone()), &Default::default()) .map_err(|e| eyre::eyre!("Failed to EVM verifier: {}", e))?; println!("yul size: {}", deplyment_code.len()); - path_out.set_extension("yul"); let sol_contract = halo2_solidity_verifier::fix_verifier_sol(path_out.clone(), 1) .map_err(|e| eyre::eyre!("Failed to generate Solidity verifier: {}", e))?; @@ -151,5 +157,16 @@ where f.write(sol_contract.as_bytes()) .map_err(|e| eyre::eyre!("Failed to write Solidity verifier: {}", e))?; + if estimate_gas { + let _ = Circuit::gen_evm_proof_shplonk( + params, + &pk, + cfg_path, + Some(deplyment_code), + &Circuit::Witness::default(), + ) + .map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?; + } + Ok(()) } From 8fa9d48769f7b588f8ce1d19dc36ef25d35a9253 Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Fri, 1 Dec 2023 21:06:19 +0100 Subject: [PATCH 03/14] fix default witness for step proof (wip) --- contract-tests/tests/step_input_encoding.rs | 2 +- contracts/rust-abi/lib.rs | 2 +- lightclient-circuits/src/sync_step_circuit.rs | 6 +-- lightclient-circuits/src/witness.rs | 4 +- lightclient-circuits/src/witness/rotation.rs | 1 + .../src/witness/{sync.rs => step.rs} | 40 +++++++++++++------ preprocessor/src/sync.rs | 4 +- 7 files changed, 37 insertions(+), 22 deletions(-) rename lightclient-circuits/src/witness/{sync.rs => step.rs} (67%) diff --git a/contract-tests/tests/step_input_encoding.rs b/contract-tests/tests/step_input_encoding.rs index f53e43ce..04ff06e6 100644 --- a/contract-tests/tests/step_input_encoding.rs +++ b/contract-tests/tests/step_input_encoding.rs @@ -35,7 +35,7 @@ impl From> for SyncStepInput { .try_into() .unwrap(); - let execution_payload_root: [u8; 32] = args.execution_payload_root.try_into().unwrap(); + let execution_payload_root: [u8; 32] = args.execution_state_root.try_into().unwrap(); SyncStepInput { attested_slot: args.attested_header.slot, diff --git a/contracts/rust-abi/lib.rs b/contracts/rust-abi/lib.rs index ca7cc0e5..49a1f777 100644 --- a/contracts/rust-abi/lib.rs +++ b/contracts/rust-abi/lib.rs @@ -43,7 +43,7 @@ impl From> for SyncStepInput { .try_into() .unwrap(); - let execution_payload_root: [u8; 32] = args.execution_payload_root.try_into().unwrap(); + let execution_payload_root: [u8; 32] = args.execution_state_root.try_into().unwrap(); SyncStepInput { attested_slot: args.attested_header.slot, diff --git a/lightclient-circuits/src/sync_step_circuit.rs b/lightclient-circuits/src/sync_step_circuit.rs index 5d0a3e80..6ca33749 100644 --- a/lightclient-circuits/src/sync_step_circuit.rs +++ b/lightclient-circuits/src/sync_step_circuit.rs @@ -67,7 +67,7 @@ impl StepCircuit { let h2c_chip = HashToCurveChip::new(&sha256_chip, &fp2_chip); let execution_payload_root: HashInputChunk> = - args.execution_payload_root.clone().into_witness(); + args.execution_state_root.clone().into_witness(); let pubkey_affines = args .pubkeys_uncompressed @@ -167,7 +167,7 @@ impl StepCircuit { verify_merkle_proof( builder, &sha256_chip, - args.execution_payload_branch + args.execution_branch .iter() .map(|w| w.clone().into_witness()), execution_payload_root.clone(), @@ -241,7 +241,7 @@ impl StepCircuit { input[24..56].copy_from_slice(&finalized_header_root); - let execution_payload_root = &args.execution_payload_root; + let execution_payload_root = &args.execution_state_root; input[56..88].copy_from_slice(execution_payload_root); let pubkey_affines = args diff --git a/lightclient-circuits/src/witness.rs b/lightclient-circuits/src/witness.rs index 5abc6e9b..dbd9d30c 100644 --- a/lightclient-circuits/src/witness.rs +++ b/lightclient-circuits/src/witness.rs @@ -1,7 +1,7 @@ //! Witnesses for all circuits. -mod sync; -pub use sync::*; +mod step; +pub use step::*; mod rotation; pub use rotation::*; diff --git a/lightclient-circuits/src/witness/rotation.rs b/lightclient-circuits/src/witness/rotation.rs index 72545055..2f756a3b 100644 --- a/lightclient-circuits/src/witness/rotation.rs +++ b/lightclient-circuits/src/witness/rotation.rs @@ -13,6 +13,7 @@ pub struct CommitteeRotationArgs { pub sync_committee_branch: Vec>, + #[serde(skip)] pub _spec: PhantomData, } diff --git a/lightclient-circuits/src/witness/sync.rs b/lightclient-circuits/src/witness/step.rs similarity index 67% rename from lightclient-circuits/src/witness/sync.rs rename to lightclient-circuits/src/witness/step.rs index 84400c6c..ce878124 100644 --- a/lightclient-circuits/src/witness/sync.rs +++ b/lightclient-circuits/src/witness/step.rs @@ -2,9 +2,10 @@ use eth_types::Spec; use ethereum_consensus_types::BeaconBlockHeader; use itertools::Itertools; use serde::{Deserialize, Serialize}; -use ssz_rs::Node; +use ssz_rs::{Node, Merkleized}; use std::iter; use std::marker::PhantomData; +use std::ops::Deref; use super::mock_root; @@ -22,9 +23,9 @@ pub struct SyncStepArgs { pub finality_branch: Vec>, - pub execution_payload_root: Vec, + pub execution_state_root: Vec, - pub execution_payload_branch: Vec>, + pub execution_branch: Vec>, pub domain: [u8; 32], @@ -37,24 +38,37 @@ impl Default for SyncStepArgs { let dummy_pk_bytes = hex::decode("021c62a0dfdfe89b5fa924d54d2ec12552aa53796ab7dc984fa8219f7042d46334b15fb2f0c6e4095b8a1e2fe551f1f50a90d7a76329d83176114c81b460de399923b3cb9b3c1020b8ca228163c5d62a577073b2d0478b5f72cedc7a17eaad52").unwrap(); let signature_compressed = hex::decode("aabe63f791d9d80aa5c5ff9a384be8ba8a61a66e9bc9e82b7f1774639b125de5de476b533b1b522e75d4bd93ad2a405a03f71fe3daf9cae3685a6b8dc9adf4b89403203ab0e081c694aa8665492a70464cdae666a168a5ea55237268cb5a2c46").unwrap(); - let state_merkle_branch = iter::repeat(vec![0u8; 32]) + let state_branch = iter::repeat(vec![0u8; 32]) .take(S::FINALIZED_HEADER_DEPTH) .collect_vec(); let execution_state_root = vec![0; 32]; - let execution_merkle_branch = vec![vec![0; 32]; S::EXECUTION_STATE_ROOT_DEPTH]; + let execution_branch = vec![vec![0; 32]; S::EXECUTION_STATE_ROOT_DEPTH]; let beacon_block_body_root = mock_root( execution_state_root.clone(), - &state_merkle_branch, + &state_branch, S::EXECUTION_STATE_ROOT_INDEX, ); - let finalized_block = BeaconBlockHeader { + let mut finalized_header = BeaconBlockHeader { body_root: Node::try_from(beacon_block_body_root.as_slice()).unwrap(), ..Default::default() }; - let finality_merkle_branch = vec![vec![0; 32]; S::FINALIZED_HEADER_DEPTH]; + let finality_header_root = finalized_header.hash_tree_root().unwrap(); + + let finality_branch = vec![vec![0; 32]; S::FINALIZED_HEADER_DEPTH]; + + let attested_state_root = mock_root( + finality_header_root.deref().to_vec(), + &finality_branch, + S::FINALIZED_HEADER_INDEX, + ); + + let attested_header = BeaconBlockHeader { + state_root: Node::try_from(attested_state_root.as_slice()).unwrap(), + ..Default::default() + }; Self { signature_compressed, @@ -66,11 +80,11 @@ impl Default for SyncStepArgs { 7, 0, 0, 0, 48, 83, 175, 74, 95, 250, 246, 166, 104, 40, 151, 228, 42, 212, 194, 8, 48, 56, 232, 147, 61, 9, 41, 204, 88, 234, 56, 134, ], - attested_header: BeaconBlockHeader::default(), - finalized_header: finalized_block, - finality_branch: finality_merkle_branch, - execution_payload_branch: execution_merkle_branch, - execution_payload_root: execution_state_root, + attested_header, + finalized_header, + finality_branch, + execution_branch, + execution_state_root, _spec: PhantomData, } } diff --git a/preprocessor/src/sync.rs b/preprocessor/src/sync.rs index 266b8fdc..2707ddbd 100644 --- a/preprocessor/src/sync.rs +++ b/preprocessor/src/sync.rs @@ -134,14 +134,14 @@ pub async fn step_args_from_finality_update( .iter() .map(|n| n.0.to_vec()) .collect_vec(), - execution_payload_root: finality_update + execution_state_root: finality_update .finalized_header .execution .clone() .hash_tree_root() .unwrap() .to_vec(), - execution_payload_branch: finality_update + execution_branch: finality_update .finalized_header .execution_branch .iter() From 2ffebe320348732f84a418c11f9fe5e51737aeef Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Fri, 1 Dec 2023 23:06:11 +0100 Subject: [PATCH 04/14] fix step default witness --- Cargo.toml | 4 +- contract-tests/tests/step_input_encoding.rs | 2 +- contracts/rust-abi/lib.rs | 2 +- lightclient-circuits/src/witness/rotation.rs | 6 +- lightclient-circuits/src/witness/step.rs | 61 ++-- lightclient-circuits/tests/step.rs | 292 +++++++++---------- preprocessor/src/sync.rs | 4 +- 7 files changed, 196 insertions(+), 175 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9ff504ec..7608bafc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -77,7 +77,7 @@ group = "0.12" num-bigint = { version = "0.4", features = ["rand"] } pasta_curves = "0.4.1" ff = "0.12" -sha2 = { version = "0.10.6", features = ["compress"] } +sha2 = { version = "0.9", features = ["compress"] } uint = "0.9.1" ark-std = { version = "0.4.0", features = ["print-trace"] } @@ -89,7 +89,7 @@ log = "0.4.14" hex = "0.4" [patch.crates-io] -halo2curves = { git = "https://github.com/timoftime/halo2curves", package = "halo2curves-axiom", rev = "f3bb3f5a7d3a8ca806368f185c112283a73a94cb" } +halo2curves = { git = "https://github.com/timoftime/halo2curves", package = "halo2curves-axiom", rev = "1bd39b8" } ssz_rs = { git = "https://github.com/ralexstokes/ssz-rs", rev = "5f1ec833718efa07bbbff427ab28a1eeaa706164" } diff --git a/contract-tests/tests/step_input_encoding.rs b/contract-tests/tests/step_input_encoding.rs index 04ff06e6..f53e43ce 100644 --- a/contract-tests/tests/step_input_encoding.rs +++ b/contract-tests/tests/step_input_encoding.rs @@ -35,7 +35,7 @@ impl From> for SyncStepInput { .try_into() .unwrap(); - let execution_payload_root: [u8; 32] = args.execution_state_root.try_into().unwrap(); + let execution_payload_root: [u8; 32] = args.execution_payload_root.try_into().unwrap(); SyncStepInput { attested_slot: args.attested_header.slot, diff --git a/contracts/rust-abi/lib.rs b/contracts/rust-abi/lib.rs index 49a1f777..ca7cc0e5 100644 --- a/contracts/rust-abi/lib.rs +++ b/contracts/rust-abi/lib.rs @@ -43,7 +43,7 @@ impl From> for SyncStepInput { .try_into() .unwrap(); - let execution_payload_root: [u8; 32] = args.execution_state_root.try_into().unwrap(); + let execution_payload_root: [u8; 32] = args.execution_payload_root.try_into().unwrap(); SyncStepInput { attested_slot: args.attested_header.slot, diff --git a/lightclient-circuits/src/witness/rotation.rs b/lightclient-circuits/src/witness/rotation.rs index 2f756a3b..067466cf 100644 --- a/lightclient-circuits/src/witness/rotation.rs +++ b/lightclient-circuits/src/witness/rotation.rs @@ -24,7 +24,7 @@ impl Default for CommitteeRotationArgs { let sync_committee_branch = vec![vec![0; 32]; S::SYNC_COMMITTEE_PUBKEYS_DEPTH]; let hashed_pk = sha2::Sha256::digest( - dummy_x_bytes + &dummy_x_bytes .iter() .copied() .pad_using(64, |_| 0) @@ -40,7 +40,7 @@ impl Default for CommitteeRotationArgs { chunks = chunks .into_iter() .tuples() - .map(|(left, right)| sha2::Sha256::digest([left, right].concat()).to_vec()) + .map(|(left, right)| sha2::Sha256::digest(&[left, right].concat()).to_vec()) .collect(); } @@ -71,7 +71,7 @@ pub(crate) fn mock_root(leaf: Vec, branch: &[Vec], mut gindex: usize) -> for i in 0..branch.len() { last_hash = Sha256::digest( - if gindex % 2 == 0 { + &if gindex % 2 == 0 { [last_hash, branch[i].clone()] } else { [branch[i].clone(), last_hash] diff --git a/lightclient-circuits/src/witness/step.rs b/lightclient-circuits/src/witness/step.rs index ce878124..71ce555c 100644 --- a/lightclient-circuits/src/witness/step.rs +++ b/lightclient-circuits/src/witness/step.rs @@ -1,8 +1,12 @@ use eth_types::Spec; +use ethereum_consensus_types::signing::compute_signing_root; use ethereum_consensus_types::BeaconBlockHeader; +use halo2curves::bls12_381::hash_to_curve::ExpandMsgXmd; +use halo2curves::bls12_381::{hash_to_curve, Fr, G1, G2}; +use halo2curves::group::Curve; use itertools::Itertools; use serde::{Deserialize, Serialize}; -use ssz_rs::{Node, Merkleized}; +use ssz_rs::{Merkleized, Node}; use std::iter; use std::marker::PhantomData; use std::ops::Deref; @@ -23,9 +27,9 @@ pub struct SyncStepArgs { pub finality_branch: Vec>, - pub execution_state_root: Vec, + pub execution_payload_root: Vec, - pub execution_branch: Vec>, + pub execution_payload_branch: Vec>, pub domain: [u8; 32], @@ -35,18 +39,16 @@ pub struct SyncStepArgs { impl Default for SyncStepArgs { fn default() -> Self { - let dummy_pk_bytes = hex::decode("021c62a0dfdfe89b5fa924d54d2ec12552aa53796ab7dc984fa8219f7042d46334b15fb2f0c6e4095b8a1e2fe551f1f50a90d7a76329d83176114c81b460de399923b3cb9b3c1020b8ca228163c5d62a577073b2d0478b5f72cedc7a17eaad52").unwrap(); - let signature_compressed = hex::decode("aabe63f791d9d80aa5c5ff9a384be8ba8a61a66e9bc9e82b7f1774639b125de5de476b533b1b522e75d4bd93ad2a405a03f71fe3daf9cae3685a6b8dc9adf4b89403203ab0e081c694aa8665492a70464cdae666a168a5ea55237268cb5a2c46").unwrap(); + const DOMAIN: [u8; 32] = [ + 7, 0, 0, 0, 48, 83, 175, 74, 95, 250, 246, 166, 104, 40, 151, 228, 42, 212, 194, 8, 48, + 56, 232, 147, 61, 9, 41, 204, 88, 234, 56, 134, + ]; - let state_branch = iter::repeat(vec![0u8; 32]) - .take(S::FINALIZED_HEADER_DEPTH) - .collect_vec(); - - let execution_state_root = vec![0; 32]; + let execution_root = vec![0; 32]; let execution_branch = vec![vec![0; 32]; S::EXECUTION_STATE_ROOT_DEPTH]; let beacon_block_body_root = mock_root( - execution_state_root.clone(), - &state_branch, + execution_root.clone(), + &execution_branch, S::EXECUTION_STATE_ROOT_INDEX, ); @@ -65,26 +67,45 @@ impl Default for SyncStepArgs { S::FINALIZED_HEADER_INDEX, ); - let attested_header = BeaconBlockHeader { + let mut attested_header = BeaconBlockHeader { state_root: Node::try_from(attested_state_root.as_slice()).unwrap(), ..Default::default() }; + let signing_root = + compute_signing_root(attested_header.hash_tree_root().unwrap(), DOMAIN).unwrap(); + + let sk = Fr::from_bytes(&[1; 32]).unwrap(); + let msg = >>::hash_to_curve( + signing_root.deref(), + S::DST, + ) + .to_affine(); + + let aggregated_signature = vec![msg * sk; S::SYNC_COMMITTEE_SIZE] + .into_iter() + .fold(G2::identity(), |acc, x| acc + x) + .to_affine(); + + let signature_compressed = aggregated_signature.to_compressed_be().to_vec(); + + let pubkey_uncompressed = (G1::generator() * sk) + .to_affine() + .to_uncompressed_be() + .to_vec(); + Self { signature_compressed, - pubkeys_uncompressed: iter::repeat(dummy_pk_bytes) + pubkeys_uncompressed: iter::repeat(pubkey_uncompressed) .take(S::SYNC_COMMITTEE_SIZE) .collect_vec(), pariticipation_bits: vec![true; S::SYNC_COMMITTEE_SIZE], - domain: [ - 7, 0, 0, 0, 48, 83, 175, 74, 95, 250, 246, 166, 104, 40, 151, 228, 42, 212, 194, 8, - 48, 56, 232, 147, 61, 9, 41, 204, 88, 234, 56, 134, - ], + domain: DOMAIN, attested_header, finalized_header, finality_branch, - execution_branch, - execution_state_root, + execution_payload_branch: execution_branch, + execution_payload_root: execution_root, _spec: PhantomData, } } diff --git a/lightclient-circuits/tests/step.rs b/lightclient-circuits/tests/step.rs index 299f38e7..847ebb2b 100644 --- a/lightclient-circuits/tests/step.rs +++ b/lightclient-circuits/tests/step.rs @@ -1,146 +1,146 @@ -use ark_std::{end_timer, start_timer}; -use eth_types::{Minimal, LIMB_BITS}; -use halo2_base::gates::circuit::CircuitBuilderStage; -use halo2_base::halo2_proofs::dev::MockProver; -use halo2_base::halo2_proofs::halo2curves::bn256; -use lightclient_circuits::committee_update_circuit::CommitteeUpdateCircuit; -use lightclient_circuits::sync_step_circuit::StepCircuit; -use lightclient_circuits::util::gen_srs; -use lightclient_circuits::util::AppCircuit; -use lightclient_circuits::util::Eth2ConfigPinning; -use lightclient_circuits::util::Halo2ConfigPinning; -use lightclient_circuits::witness::SyncStepArgs; -use rstest::rstest; -use snark_verifier_sdk::CircuitExt; -use std::path::PathBuf; - -use test_utils::read_test_files_and_gen_witness; - -#[rstest] -fn test_eth2_spec_mock_1( - #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/light_client_sync")] - #[exclude("deneb*")] - path: PathBuf, -) { - run_test_eth2_spec_mock::<18, 20>(path) -} - -fn run_test_eth2_spec_mock(path: PathBuf) { - let (sync_witness, rotation_witness) = read_test_files_and_gen_witness(&path); - - let rotation_circuit = { - let pinning: Eth2ConfigPinning = - Eth2ConfigPinning::from_path(format!("./config/committee_update_{K_ROTATION}.json")); - - CommitteeUpdateCircuit::::create_circuit( - CircuitBuilderStage::Mock, - Some(pinning), - &rotation_witness, - K_ROTATION, - ) - .unwrap() - }; - - let timer = start_timer!(|| "committee_update mock prover run"); - let prover = MockProver::::run( - K_ROTATION, - &rotation_circuit, - CommitteeUpdateCircuit::::instance(&rotation_witness, LIMB_BITS), - ) - .unwrap(); - prover.assert_satisfied_par(); - end_timer!(timer); - - let sync_circuit = { - let pinning: Eth2ConfigPinning = - Eth2ConfigPinning::from_path(format!("./config/sync_step_{K_SYNC}.json")); - - StepCircuit::::create_circuit( - CircuitBuilderStage::Mock, - Some(pinning), - &sync_witness, - K_SYNC, - ) - .unwrap() - }; - - let sync_pi_commit = - StepCircuit::::instance_commitment(&sync_witness, LIMB_BITS); - - let timer = start_timer!(|| "sync_step mock prover run"); - let prover = - MockProver::::run(K_SYNC, &sync_circuit, vec![vec![sync_pi_commit]]).unwrap(); - prover.assert_satisfied_par(); - end_timer!(timer); -} - -#[rstest] -fn test_eth2_spec_proofgen( - #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")] - #[exclude("deneb*")] - path: PathBuf, -) { - const K: u32 = 20; - let (witness, _) = read_test_files_and_gen_witness(&path); - - let params = gen_srs(K); - let pk = StepCircuit::::read_or_create_pk( - ¶ms, - "../build/sync_step_20.pkey", - "./config/sync_step_20.json", - false, - &SyncStepArgs::::default(), - ); - - let _ = StepCircuit::::gen_proof_shplonk( - ¶ms, - &pk, - "./config/sync_step_20.json", - &witness, - ) - .expect("proof generation & verification should not fail"); -} - -#[rstest] -fn test_eth2_spec_evm_verify( - #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")] - #[exclude("deneb*")] - path: PathBuf, -) { - const K: u32 = 21; - let params = gen_srs(K); - - let pk = StepCircuit::::read_or_create_pk( - ¶ms, - "../build/sync_step_21.pkey", - "./config/sync_step_21.json", - false, - &SyncStepArgs::::default(), - ); - - let (witness, _) = read_test_files_and_gen_witness(&path); - - let pinning = Eth2ConfigPinning::from_path("./config/sync_step_21.json"); - - let circuit = StepCircuit::::create_circuit( - CircuitBuilderStage::Prover, - Some(pinning), - &witness, - K, - ) - .unwrap(); - - let instances = circuit.instances(); - let proof = - snark_verifier_sdk::evm::gen_evm_proof_shplonk(¶ms, &pk, circuit, instances.clone()); - println!("proof size: {}", proof.len()); - let deployment_code = StepCircuit::::gen_evm_verifier_shplonk( - ¶ms, - &pk, - None::, - &witness, - ) - .unwrap(); - println!("deployment_code size: {}", deployment_code.len()); - snark_verifier_sdk::evm::evm_verify(deployment_code, instances, proof); -} +// use ark_std::{end_timer, start_timer}; +// use eth_types::{Minimal, LIMB_BITS}; +// use halo2_base::gates::circuit::CircuitBuilderStage; +// use halo2_base::halo2_proofs::dev::MockProver; +// use halo2_base::halo2_proofs::halo2curves::bn256; +// use lightclient_circuits::committee_update_circuit::CommitteeUpdateCircuit; +// use lightclient_circuits::sync_step_circuit::StepCircuit; +// use lightclient_circuits::util::gen_srs; +// use lightclient_circuits::util::AppCircuit; +// use lightclient_circuits::util::Eth2ConfigPinning; +// use lightclient_circuits::util::Halo2ConfigPinning; +// use lightclient_circuits::witness::SyncStepArgs; +// use rstest::rstest; +// use snark_verifier_sdk::CircuitExt; +// use std::path::PathBuf; + +// use test_utils::read_test_files_and_gen_witness; + +// #[rstest] +// fn test_eth2_spec_mock_1( +// #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/light_client_sync")] +// #[exclude("deneb*")] +// path: PathBuf, +// ) { +// run_test_eth2_spec_mock::<18, 20>(path) +// } + +// fn run_test_eth2_spec_mock(path: PathBuf) { +// let (sync_witness, rotation_witness) = read_test_files_and_gen_witness(&path); + +// let rotation_circuit = { +// let pinning: Eth2ConfigPinning = +// Eth2ConfigPinning::from_path(format!("./config/committee_update_{K_ROTATION}.json")); + +// CommitteeUpdateCircuit::::create_circuit( +// CircuitBuilderStage::Mock, +// Some(pinning), +// &rotation_witness, +// K_ROTATION, +// ) +// .unwrap() +// }; + +// let timer = start_timer!(|| "committee_update mock prover run"); +// let prover = MockProver::::run( +// K_ROTATION, +// &rotation_circuit, +// CommitteeUpdateCircuit::::instance(&rotation_witness, LIMB_BITS), +// ) +// .unwrap(); +// prover.assert_satisfied_par(); +// end_timer!(timer); + +// let sync_circuit = { +// let pinning: Eth2ConfigPinning = +// Eth2ConfigPinning::from_path(format!("./config/sync_step_{K_SYNC}.json")); + +// StepCircuit::::create_circuit( +// CircuitBuilderStage::Mock, +// Some(pinning), +// &sync_witness, +// K_SYNC, +// ) +// .unwrap() +// }; + +// let sync_pi_commit = +// StepCircuit::::instance_commitment(&sync_witness, LIMB_BITS); + +// let timer = start_timer!(|| "sync_step mock prover run"); +// let prover = +// MockProver::::run(K_SYNC, &sync_circuit, vec![vec![sync_pi_commit]]).unwrap(); +// prover.assert_satisfied_par(); +// end_timer!(timer); +// } + +// #[rstest] +// fn test_eth2_spec_proofgen( +// #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")] +// #[exclude("deneb*")] +// path: PathBuf, +// ) { +// const K: u32 = 20; +// let (witness, _) = read_test_files_and_gen_witness(&path); + +// let params = gen_srs(K); +// let pk = StepCircuit::::read_or_create_pk( +// ¶ms, +// "../build/sync_step_20.pkey", +// "./config/sync_step_20.json", +// false, +// &SyncStepArgs::::default(), +// ); + +// let _ = StepCircuit::::gen_proof_shplonk( +// ¶ms, +// &pk, +// "./config/sync_step_20.json", +// &witness, +// ) +// .expect("proof generation & verification should not fail"); +// } + +// #[rstest] +// fn test_eth2_spec_evm_verify( +// #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")] +// #[exclude("deneb*")] +// path: PathBuf, +// ) { +// const K: u32 = 21; +// let params = gen_srs(K); + +// let pk = StepCircuit::::read_or_create_pk( +// ¶ms, +// "../build/sync_step_21.pkey", +// "./config/sync_step_21.json", +// false, +// &SyncStepArgs::::default(), +// ); + +// let (witness, _) = read_test_files_and_gen_witness(&path); + +// let pinning = Eth2ConfigPinning::from_path("./config/sync_step_21.json"); + +// let circuit = StepCircuit::::create_circuit( +// CircuitBuilderStage::Prover, +// Some(pinning), +// &witness, +// K, +// ) +// .unwrap(); + +// let instances = circuit.instances(); +// let proof = +// snark_verifier_sdk::evm::gen_evm_proof_shplonk(¶ms, &pk, circuit, instances.clone()); +// println!("proof size: {}", proof.len()); +// let deployment_code = StepCircuit::::gen_evm_verifier_shplonk( +// ¶ms, +// &pk, +// None::, +// &witness, +// ) +// .unwrap(); +// println!("deployment_code size: {}", deployment_code.len()); +// snark_verifier_sdk::evm::evm_verify(deployment_code, instances, proof); +// } diff --git a/preprocessor/src/sync.rs b/preprocessor/src/sync.rs index 2707ddbd..266b8fdc 100644 --- a/preprocessor/src/sync.rs +++ b/preprocessor/src/sync.rs @@ -134,14 +134,14 @@ pub async fn step_args_from_finality_update( .iter() .map(|n| n.0.to_vec()) .collect_vec(), - execution_state_root: finality_update + execution_payload_root: finality_update .finalized_header .execution .clone() .hash_tree_root() .unwrap() .to_vec(), - execution_branch: finality_update + execution_payload_branch: finality_update .finalized_header .execution_branch .iter() From 225a5df35e9d79a3164bb6a9ee5fe04c3ce5ff94 Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Fri, 1 Dec 2023 23:14:47 +0100 Subject: [PATCH 05/14] add tests for default wittnes correctness --- .../src/committee_update_circuit.rs | 7 +- lightclient-circuits/src/sync_step_circuit.rs | 20 +- lightclient-circuits/src/witness/rotation.rs | 29 ++ lightclient-circuits/src/witness/step.rs | 29 ++ lightclient-circuits/tests/step.rs | 282 +++++++++--------- 5 files changed, 205 insertions(+), 162 deletions(-) diff --git a/lightclient-circuits/src/committee_update_circuit.rs b/lightclient-circuits/src/committee_update_circuit.rs index 0c5736a6..d91feaaf 100644 --- a/lightclient-circuits/src/committee_update_circuit.rs +++ b/lightclient-circuits/src/committee_update_circuit.rs @@ -306,16 +306,13 @@ mod tests { #[test] fn test_committee_update_circuit() { const K: u32 = 18; - let params = gen_srs(K); - let witness = load_circuit_args(); - let pinning = Eth2ConfigPinning::from_path("./config/committee_update_18.json"); let circuit = CommitteeUpdateCircuit::::create_circuit( CircuitBuilderStage::Mock, - Some(pinning), + None, &witness, - params.k(), + K, ) .unwrap(); diff --git a/lightclient-circuits/src/sync_step_circuit.rs b/lightclient-circuits/src/sync_step_circuit.rs index 6ca33749..9029b61c 100644 --- a/lightclient-circuits/src/sync_step_circuit.rs +++ b/lightclient-circuits/src/sync_step_circuit.rs @@ -32,7 +32,7 @@ use halo2_ecc::{ }; use halo2curves::{ bls12_381::{G1Affine, G2Affine}, - group::{GroupEncoding, UncompressedEncoding}, + group::UncompressedEncoding, }; use itertools::Itertools; use num_bigint::BigUint; @@ -67,7 +67,7 @@ impl StepCircuit { let h2c_chip = HashToCurveChip::new(&sha256_chip, &fp2_chip); let execution_payload_root: HashInputChunk> = - args.execution_state_root.clone().into_witness(); + args.execution_payload_root.clone().into_witness(); let pubkey_affines = args .pubkeys_uncompressed @@ -167,7 +167,7 @@ impl StepCircuit { verify_merkle_proof( builder, &sha256_chip, - args.execution_branch + args.execution_payload_branch .iter() .map(|w| w.clone().into_witness()), execution_payload_root.clone(), @@ -241,7 +241,7 @@ impl StepCircuit { input[24..56].copy_from_slice(&finalized_header_root); - let execution_payload_root = &args.execution_state_root; + let execution_payload_root = &args.execution_payload_root; input[56..88].copy_from_slice(execution_payload_root); let pubkey_affines = args @@ -259,7 +259,7 @@ impl StepCircuit { let poseidon_commitment_le = poseidon_commitment.to_bytes_le(); input[88..].copy_from_slice(&poseidon_commitment_le); - let mut public_input_commitment = sha2::Sha256::digest(input).to_vec(); + let mut public_input_commitment = sha2::Sha256::digest(&input).to_vec(); // Truncate to 253 bits public_input_commitment[31] &= 0b00011111; bn256::Fr::from_bytes_le(&public_input_commitment) @@ -311,8 +311,8 @@ impl StepCircuit { g2_chip: &G2Chip, bytes_compressed: &[u8], ) -> EcPoint> { - let sig_affine = - G2Affine::from_bytes(&bytes_compressed.try_into().unwrap()).expect("correct signature"); + let sig_affine = G2Affine::from_compressed_be(&bytes_compressed.try_into().unwrap()) + .expect("correct signature"); g2_chip.load_private_unchecked(ctx, sig_affine.into_coordinates()) } @@ -436,14 +436,12 @@ mod tests { #[test] fn test_sync_circuit() { - const K: u32 = 21; + const K: u32 = 20; let witness = load_circuit_args(); - let pinning = Eth2ConfigPinning::from_path("./config/sync_step_21.json"); - let circuit = StepCircuit::::create_circuit( CircuitBuilderStage::Mock, - Some(pinning), + None, &witness, K, ) diff --git a/lightclient-circuits/src/witness/rotation.rs b/lightclient-circuits/src/witness/rotation.rs index 067466cf..89c8d0d2 100644 --- a/lightclient-circuits/src/witness/rotation.rs +++ b/lightclient-circuits/src/witness/rotation.rs @@ -84,3 +84,32 @@ pub(crate) fn mock_root(leaf: Vec, branch: &[Vec], mut gindex: usize) -> last_hash } + +#[cfg(test)] +mod tests { + use super::*; + use crate::{committee_update_circuit::CommitteeUpdateCircuit, util::AppCircuit}; + use eth_types::Testnet; + use halo2_base::{ + gates::circuit::CircuitBuilderStage, halo2_proofs::dev::MockProver, + halo2_proofs::halo2curves::bn256::Fr, + }; + use snark_verifier_sdk::CircuitExt; + + #[test] + fn test_committee_update_default_witness() { + const K: u32 = 18; + let witness = CommitteeRotationArgs::::default(); + + let circuit = CommitteeUpdateCircuit::::create_circuit( + CircuitBuilderStage::Mock, + None, + &witness, + K, + ) + .unwrap(); + + let prover = MockProver::::run(K, &circuit, circuit.instances()).unwrap(); + prover.assert_satisfied_par(); + } +} diff --git a/lightclient-circuits/src/witness/step.rs b/lightclient-circuits/src/witness/step.rs index 71ce555c..bd1166ab 100644 --- a/lightclient-circuits/src/witness/step.rs +++ b/lightclient-circuits/src/witness/step.rs @@ -110,3 +110,32 @@ impl Default for SyncStepArgs { } } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::{sync_step_circuit::StepCircuit, util::AppCircuit}; + use eth_types::Testnet; + use halo2_base::{ + gates::circuit::CircuitBuilderStage, halo2_proofs::dev::MockProver, + halo2_proofs::halo2curves::bn256::Fr, + }; + use snark_verifier_sdk::CircuitExt; + + #[test] + fn test_step_default_witness() { + const K: u32 = 20; + let witness = SyncStepArgs::::default(); + + let circuit = StepCircuit::::create_circuit( + CircuitBuilderStage::Mock, + None, + &witness, + K, + ) + .unwrap(); + + let prover = MockProver::::run(K, &circuit, circuit.instances()).unwrap(); + prover.assert_satisfied_par(); + } +} diff --git a/lightclient-circuits/tests/step.rs b/lightclient-circuits/tests/step.rs index 847ebb2b..e9025e23 100644 --- a/lightclient-circuits/tests/step.rs +++ b/lightclient-circuits/tests/step.rs @@ -1,146 +1,136 @@ -// use ark_std::{end_timer, start_timer}; -// use eth_types::{Minimal, LIMB_BITS}; -// use halo2_base::gates::circuit::CircuitBuilderStage; -// use halo2_base::halo2_proofs::dev::MockProver; -// use halo2_base::halo2_proofs::halo2curves::bn256; -// use lightclient_circuits::committee_update_circuit::CommitteeUpdateCircuit; -// use lightclient_circuits::sync_step_circuit::StepCircuit; -// use lightclient_circuits::util::gen_srs; -// use lightclient_circuits::util::AppCircuit; -// use lightclient_circuits::util::Eth2ConfigPinning; -// use lightclient_circuits::util::Halo2ConfigPinning; -// use lightclient_circuits::witness::SyncStepArgs; -// use rstest::rstest; -// use snark_verifier_sdk::CircuitExt; -// use std::path::PathBuf; - -// use test_utils::read_test_files_and_gen_witness; - -// #[rstest] -// fn test_eth2_spec_mock_1( -// #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/light_client_sync")] -// #[exclude("deneb*")] -// path: PathBuf, -// ) { -// run_test_eth2_spec_mock::<18, 20>(path) -// } - -// fn run_test_eth2_spec_mock(path: PathBuf) { -// let (sync_witness, rotation_witness) = read_test_files_and_gen_witness(&path); - -// let rotation_circuit = { -// let pinning: Eth2ConfigPinning = -// Eth2ConfigPinning::from_path(format!("./config/committee_update_{K_ROTATION}.json")); - -// CommitteeUpdateCircuit::::create_circuit( -// CircuitBuilderStage::Mock, -// Some(pinning), -// &rotation_witness, -// K_ROTATION, -// ) -// .unwrap() -// }; - -// let timer = start_timer!(|| "committee_update mock prover run"); -// let prover = MockProver::::run( -// K_ROTATION, -// &rotation_circuit, -// CommitteeUpdateCircuit::::instance(&rotation_witness, LIMB_BITS), -// ) -// .unwrap(); -// prover.assert_satisfied_par(); -// end_timer!(timer); - -// let sync_circuit = { -// let pinning: Eth2ConfigPinning = -// Eth2ConfigPinning::from_path(format!("./config/sync_step_{K_SYNC}.json")); - -// StepCircuit::::create_circuit( -// CircuitBuilderStage::Mock, -// Some(pinning), -// &sync_witness, -// K_SYNC, -// ) -// .unwrap() -// }; - -// let sync_pi_commit = -// StepCircuit::::instance_commitment(&sync_witness, LIMB_BITS); - -// let timer = start_timer!(|| "sync_step mock prover run"); -// let prover = -// MockProver::::run(K_SYNC, &sync_circuit, vec![vec![sync_pi_commit]]).unwrap(); -// prover.assert_satisfied_par(); -// end_timer!(timer); -// } - -// #[rstest] -// fn test_eth2_spec_proofgen( -// #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")] -// #[exclude("deneb*")] -// path: PathBuf, -// ) { -// const K: u32 = 20; -// let (witness, _) = read_test_files_and_gen_witness(&path); - -// let params = gen_srs(K); -// let pk = StepCircuit::::read_or_create_pk( -// ¶ms, -// "../build/sync_step_20.pkey", -// "./config/sync_step_20.json", -// false, -// &SyncStepArgs::::default(), -// ); - -// let _ = StepCircuit::::gen_proof_shplonk( -// ¶ms, -// &pk, -// "./config/sync_step_20.json", -// &witness, -// ) -// .expect("proof generation & verification should not fail"); -// } - -// #[rstest] -// fn test_eth2_spec_evm_verify( -// #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")] -// #[exclude("deneb*")] -// path: PathBuf, -// ) { -// const K: u32 = 21; -// let params = gen_srs(K); - -// let pk = StepCircuit::::read_or_create_pk( -// ¶ms, -// "../build/sync_step_21.pkey", -// "./config/sync_step_21.json", -// false, -// &SyncStepArgs::::default(), -// ); - -// let (witness, _) = read_test_files_and_gen_witness(&path); - -// let pinning = Eth2ConfigPinning::from_path("./config/sync_step_21.json"); - -// let circuit = StepCircuit::::create_circuit( -// CircuitBuilderStage::Prover, -// Some(pinning), -// &witness, -// K, -// ) -// .unwrap(); - -// let instances = circuit.instances(); -// let proof = -// snark_verifier_sdk::evm::gen_evm_proof_shplonk(¶ms, &pk, circuit, instances.clone()); -// println!("proof size: {}", proof.len()); -// let deployment_code = StepCircuit::::gen_evm_verifier_shplonk( -// ¶ms, -// &pk, -// None::, -// &witness, -// ) -// .unwrap(); -// println!("deployment_code size: {}", deployment_code.len()); -// snark_verifier_sdk::evm::evm_verify(deployment_code, instances, proof); -// } +use ark_std::{end_timer, start_timer}; +use eth_types::{Minimal, LIMB_BITS}; +use halo2_base::gates::circuit::CircuitBuilderStage; +use halo2_base::halo2_proofs::dev::MockProver; +use halo2_base::halo2_proofs::halo2curves::bn256; +use lightclient_circuits::committee_update_circuit::CommitteeUpdateCircuit; +use lightclient_circuits::sync_step_circuit::StepCircuit; +use lightclient_circuits::util::gen_srs; +use lightclient_circuits::util::AppCircuit; +use lightclient_circuits::util::Eth2ConfigPinning; +use lightclient_circuits::util::Halo2ConfigPinning; +use lightclient_circuits::witness::SyncStepArgs; +use rstest::rstest; +use snark_verifier_sdk::CircuitExt; +use std::path::PathBuf; + +use test_utils::read_test_files_and_gen_witness; + +#[rstest] +fn test_eth2_spec_mock_1( + #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/light_client_sync")] + #[exclude("deneb*")] + path: PathBuf, +) { + run_test_eth2_spec_mock::<18, 20>(path) +} + +fn run_test_eth2_spec_mock(path: PathBuf) { + let (sync_witness, rotation_witness) = read_test_files_and_gen_witness(&path); + + let rotation_circuit = CommitteeUpdateCircuit::::create_circuit( + CircuitBuilderStage::Mock, + None, + &rotation_witness, + K_ROTATION, + ) + .unwrap(); + + let timer = start_timer!(|| "committee_update mock prover run"); + let prover = MockProver::::run( + K_ROTATION, + &rotation_circuit, + CommitteeUpdateCircuit::::instance(&rotation_witness, LIMB_BITS), + ) + .unwrap(); + prover.assert_satisfied_par(); + end_timer!(timer); + + let sync_circuit = StepCircuit::::create_circuit( + CircuitBuilderStage::Mock, + None, + &sync_witness, + K_SYNC, + ) + .unwrap(); + + let sync_pi_commit = + StepCircuit::::instance_commitment(&sync_witness, LIMB_BITS); + + let timer = start_timer!(|| "sync_step mock prover run"); + let prover = + MockProver::::run(K_SYNC, &sync_circuit, vec![vec![sync_pi_commit]]).unwrap(); + prover.assert_satisfied_par(); + end_timer!(timer); +} + +#[rstest] +fn test_eth2_spec_proofgen( + #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")] + #[exclude("deneb*")] + path: PathBuf, +) { + const K: u32 = 20; + let (witness, _) = read_test_files_and_gen_witness(&path); + + let params = gen_srs(K); + let pk = StepCircuit::::read_or_create_pk( + ¶ms, + "../build/sync_step_20.pkey", + "./config/sync_step_20.json", + false, + &SyncStepArgs::::default(), + ); + + let _ = StepCircuit::::gen_proof_shplonk( + ¶ms, + &pk, + "./config/sync_step_20.json", + &witness, + ) + .expect("proof generation & verification should not fail"); +} + +#[rstest] +fn test_eth2_spec_evm_verify( + #[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")] + #[exclude("deneb*")] + path: PathBuf, +) { + const K: u32 = 21; + let params = gen_srs(K); + + let pk = StepCircuit::::read_or_create_pk( + ¶ms, + "../build/sync_step_21.pkey", + "./config/sync_step_21.json", + false, + &SyncStepArgs::::default(), + ); + + let (witness, _) = read_test_files_and_gen_witness(&path); + + let pinning = Eth2ConfigPinning::from_path("./config/sync_step_21.json"); + + let circuit = StepCircuit::::create_circuit( + CircuitBuilderStage::Prover, + Some(pinning), + &witness, + K, + ) + .unwrap(); + + let instances = circuit.instances(); + let proof = + snark_verifier_sdk::evm::gen_evm_proof_shplonk(¶ms, &pk, circuit, instances.clone()); + println!("proof size: {}", proof.len()); + let deployment_code = StepCircuit::::gen_evm_verifier_shplonk( + ¶ms, + &pk, + None::, + &witness, + ) + .unwrap(); + println!("deployment_code size: {}", deployment_code.len()); + snark_verifier_sdk::evm::evm_verify(deployment_code, instances, proof); +} From 0aadb0c5fe6b7ecc5999e83722c4c7ca1e4ed241 Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Fri, 1 Dec 2023 23:26:36 +0100 Subject: [PATCH 06/14] add deploy local script --- contracts/script/deploy_local.sh | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 contracts/script/deploy_local.sh diff --git a/contracts/script/deploy_local.sh b/contracts/script/deploy_local.sh new file mode 100644 index 00000000..6132d7ac --- /dev/null +++ b/contracts/script/deploy_local.sh @@ -0,0 +1,6 @@ +#!/bin/sh +cd $(git rev-parse --show-toplevel) +source .env +LOCAL_RPC_URL="http://localhost:8545" + +forge script script/DeploySpectre.s.sol:DeploySpectre --private-key $ANVIL_PRIVATE_KEY --rpc-url $LOCAL_RPC_URL --broadcast -vvvv From 7b83fdacdb64a7774c443daf56c94a37a159b45d Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Sat, 2 Dec 2023 14:52:08 +0100 Subject: [PATCH 07/14] add experimental feature with new halo2-solidity-verifier --- Cargo.toml | 1 - prover/Cargo.toml | 12 +++++++++-- prover/src/cli.rs | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7608bafc..1abbddd2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,7 +65,6 @@ snark-verifier-sdk = { git = "https://github.com/axiom-crypto/snark-verifier.git "loader_evm", "halo2-pse", ] } -halo2_solidity_verifier = { git = "https://github.com/privacy-scaling-explorations/halo2-solidity-verifier", branch = "ac/initial-verifier-PR" } # ethereum types ethereum-consensus-types = { git = "https://github.com/ChainSafe/ethereum-consensus-types", branch = "capella" } diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 834125a3..7ac385f8 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -23,12 +23,16 @@ http = "0.2" # halo2 halo2curves.workspace = true + # verifier SDK snark-verifier.workspace = true snark-verifier-sdk.workspace = true -halo2_solidity_verifier.workspace = true +halo2_solidity_verifier = { git = "https://github.com/privacy-scaling-explorations/halo2-solidity-verifier", branch = "ac/initial-verifier-PR", optional = true } +halo2_solidity_verifier_new = { path = "../../halo2-solidity-verifier", package = "halo2_solidity_verifier", features = ["evm"], optional = true } + + # local -lightclient-circuits.workspace = true +lightclient-circuits.workspace = true preprocessor.workspace = true eth-types.workspace = true @@ -52,3 +56,7 @@ futures = "0.3.29" [build-dependencies] cli-batteries = "=0.4" + +[features] +default = ["halo2_solidity_verifier"] +experimental = ["halo2_solidity_verifier_new"] diff --git a/prover/src/cli.rs b/prover/src/cli.rs index 3fc74a26..e1f323ee 100644 --- a/prover/src/cli.rs +++ b/prover/src/cli.rs @@ -12,6 +12,9 @@ use snark_verifier_sdk::halo2::aggregation::AggregationCircuit; use std::path::PathBuf; use std::{fs::File, future::Future, io::Write, path::Path}; +#[cfg(feature = "experimental")] +use halo2_solidity_verifier_new::{SolidityGenerator, BatchOpenScheme, compile_solidity, Evm, encode_calldata}; + ethers::contract::abigen!( SnarkVerifierSol, r#"[ @@ -132,6 +135,57 @@ fn get_config_path(pk_path: &Path, config_dir: &Path) -> PathBuf { config_dir.join(format!("{}.json", circuit_configuration)) } +#[cfg(feature = "experimental")] +fn gen_evm_verifier( + params: &ParamsKZG, + pk_path: &Path, + cfg_path: &Path, + mut path_out: PathBuf, + estimate_gas: bool, +) -> eyre::Result<()> +where + Circuit::Witness: Default, +{ + let pk = Circuit::read_pk(params, pk_path, &Default::default()); + + let generator = SolidityGenerator::new(params, pk.get_vk(), BatchOpenScheme::Bdfg21, 1); + + let verifier_sol = generator + .render() + .map_err(|e| eyre::eyre!("Failed to generate Solidity verifier: {}", e))?; + + path_out.set_extension("sol"); + let mut f = File::create(path_out).unwrap(); + f.write(verifier_sol.as_bytes()) + .map_err(|e| eyre::eyre!("Failed to write Solidity verifier: {}", e))?; + + if estimate_gas { + let mut evm = Evm::default(); + let verifier_creation_code = compile_solidity(&verifier_sol); + println!( + "Verifier creation code size: {}", + verifier_creation_code.len() + ); + let verifier_address = evm.create(verifier_creation_code); + + let (proof, instances) = Circuit::gen_evm_proof_shplonk( + params, + &pk, + cfg_path, + None, + &Circuit::Witness::default(), + ) + .map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?; + let calldata = encode_calldata(None, &proof, &instances[0]); + let (gas_cost, output) = evm.call(verifier_address, calldata); + assert_eq!(output, [vec![0; 31], vec![1]].concat()); + println!("Gas cost of verifying proof: {gas_cost}"); + } + + Ok(()) +} + +#[cfg(not(feature = "experimental"))] fn gen_evm_verifier( params: &ParamsKZG, pk_path: &Path, From 4838834f6232d973324b94869ce4cfe44ee6ccbc Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Sat, 2 Dec 2023 15:09:59 +0100 Subject: [PATCH 08/14] update justfile --- justfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/justfile b/justfile index 79b258f8..62d01489 100644 --- a/justfile +++ b/justfile @@ -13,12 +13,12 @@ check: lint: fmt cargo clippy --all-targets --all-features --workspace -setup-step network: - cargo run -r -- circuit sync-step -p ./build/sync_step_$1.pkey -k 22 setup +setup-step network *k='22': + cargo run -r -- circuit sync-step -p ./build/sync_step_$1.pkey -k $2 setup -setup-committee-update network: +setup-committee-update network *k='25': cargo run -r -- circuit committee-update -p ./build/committee_update_$1.pkey -k 18 \ - --verifier-k 25 --verifier-pk-path ./build/committee_update_verifier_$1.pkey setup + --verifier-k $2 --verifier-pk-path ./build/committee_update_verifier_$1.pkey setup gen-verifier-step network: cargo run -r -- circuit sync-step -p ./build/sync_step_$1.pkey gen-verifier -o ./contracts/snark-verifiers/sync_step_$1.sol From 1d7eb08ce11f1f5d87174a82883f7c4b44b7bec6 Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Sat, 2 Dec 2023 18:50:22 +0100 Subject: [PATCH 09/14] fix committee update contract generation --- contracts/snark-verifiers/sync_step.sol | 1326 ++++++++++++++++- justfile | 5 +- ...{aggregation.rs => aggregation_circuit.rs} | 0 .../src/committee_update_circuit.rs | 2 +- lightclient-circuits/src/lib.rs | 2 +- prover/Cargo.toml | 1 + prover/src/cli.rs | 118 +- 7 files changed, 1385 insertions(+), 69 deletions(-) rename lightclient-circuits/src/{aggregation.rs => aggregation_circuit.rs} (100%) diff --git a/contracts/snark-verifiers/sync_step.sol b/contracts/snark-verifiers/sync_step.sol index a35f2db1..9a80c3d6 100644 --- a/contracts/snark-verifiers/sync_step.sol +++ b/contracts/snark-verifiers/sync_step.sol @@ -1,23 +1,1307 @@ // 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[1] calldata pubInputs, - bytes calldata proof - ) public view returns (bool) { - bool success = true; - bytes32[1216] memory transcript; - for (uint i = 0; i < pubInputs.length; i++) { - require(pubInputs[i] < SIZE_LIMIT); + +pragma solidity ^0.8.0; + +contract Halo2Verifier { + uint256 internal constant PROOF_LEN_CPTR = 0x44; + uint256 internal constant PROOF_CPTR = 0x64; + uint256 internal constant NUM_INSTANCE_CPTR = 0x10a4; + uint256 internal constant INSTANCE_CPTR = 0x10c4; + + uint256 internal constant FIRST_QUOTIENT_X_CPTR = 0x05e4; + uint256 internal constant LAST_QUOTIENT_X_CPTR = 0x0664; + + uint256 internal constant VK_MPTR = 0x09a0; + uint256 internal constant VK_DIGEST_MPTR = 0x09a0; + uint256 internal constant K_MPTR = 0x09c0; + uint256 internal constant N_INV_MPTR = 0x09e0; + uint256 internal constant OMEGA_MPTR = 0x0a00; + uint256 internal constant OMEGA_INV_MPTR = 0x0a20; + uint256 internal constant OMEGA_INV_TO_L_MPTR = 0x0a40; + uint256 internal constant NUM_INSTANCES_MPTR = 0x0a60; + uint256 internal constant HAS_ACCUMULATOR_MPTR = 0x0a80; + uint256 internal constant ACC_OFFSET_MPTR = 0x0aa0; + uint256 internal constant NUM_ACC_LIMBS_MPTR = 0x0ac0; + uint256 internal constant NUM_ACC_LIMB_BITS_MPTR = 0x0ae0; + uint256 internal constant G1_X_MPTR = 0x0b00; + uint256 internal constant G1_Y_MPTR = 0x0b20; + uint256 internal constant G2_X_1_MPTR = 0x0b40; + uint256 internal constant G2_X_2_MPTR = 0x0b60; + uint256 internal constant G2_Y_1_MPTR = 0x0b80; + uint256 internal constant G2_Y_2_MPTR = 0x0ba0; + uint256 internal constant NEG_S_G2_X_1_MPTR = 0x0bc0; + uint256 internal constant NEG_S_G2_X_2_MPTR = 0x0be0; + uint256 internal constant NEG_S_G2_Y_1_MPTR = 0x0c00; + uint256 internal constant NEG_S_G2_Y_2_MPTR = 0x0c20; + + uint256 internal constant CHALLENGE_MPTR = 0x1180; + + uint256 internal constant THETA_MPTR = 0x1180; + uint256 internal constant BETA_MPTR = 0x11a0; + uint256 internal constant GAMMA_MPTR = 0x11c0; + uint256 internal constant Y_MPTR = 0x11e0; + uint256 internal constant X_MPTR = 0x1200; + uint256 internal constant ZETA_MPTR = 0x1220; + uint256 internal constant NU_MPTR = 0x1240; + uint256 internal constant MU_MPTR = 0x1260; + + uint256 internal constant ACC_LHS_X_MPTR = 0x1280; + uint256 internal constant ACC_LHS_Y_MPTR = 0x12a0; + uint256 internal constant ACC_RHS_X_MPTR = 0x12c0; + uint256 internal constant ACC_RHS_Y_MPTR = 0x12e0; + uint256 internal constant X_N_MPTR = 0x1300; + uint256 internal constant X_N_MINUS_1_INV_MPTR = 0x1320; + uint256 internal constant L_LAST_MPTR = 0x1340; + uint256 internal constant L_BLIND_MPTR = 0x1360; + uint256 internal constant L_0_MPTR = 0x1380; + uint256 internal constant INSTANCE_EVAL_MPTR = 0x13a0; + uint256 internal constant QUOTIENT_EVAL_MPTR = 0x13c0; + uint256 internal constant QUOTIENT_X_MPTR = 0x13e0; + uint256 internal constant QUOTIENT_Y_MPTR = 0x1400; + uint256 internal constant R_EVAL_MPTR = 0x1420; + uint256 internal constant PAIRING_LHS_X_MPTR = 0x1440; + uint256 internal constant PAIRING_LHS_Y_MPTR = 0x1460; + uint256 internal constant PAIRING_RHS_X_MPTR = 0x1480; + uint256 internal constant PAIRING_RHS_Y_MPTR = 0x14a0; + + function verifyProof( + bytes calldata proof, + uint256[] calldata instances + ) public returns (bool) { + assembly { + // Read EC point (x, y) at (proof_cptr, proof_cptr + 0x20), + // and check if the point is on affine plane, + // and store them in (hash_mptr, hash_mptr + 0x20). + // Return updated (success, proof_cptr, hash_mptr). + function read_ec_point(success, proof_cptr, hash_mptr, q) -> ret0, ret1, ret2 { + let x := calldataload(proof_cptr) + let y := calldataload(add(proof_cptr, 0x20)) + ret0 := and(success, lt(x, q)) + ret0 := and(ret0, lt(y, q)) + ret0 := and(ret0, eq(mulmod(y, y, q), addmod(mulmod(x, mulmod(x, x, q), q), 3, q))) + mstore(hash_mptr, x) + mstore(add(hash_mptr, 0x20), y) + ret1 := add(proof_cptr, 0x40) + ret2 := add(hash_mptr, 0x40) + } + + // Squeeze challenge by keccak256(memory[0..hash_mptr]), + // and store hash mod r as challenge in challenge_mptr, + // and push back hash in 0x00 as the first input for next squeeze. + // Return updated (challenge_mptr, hash_mptr). + function squeeze_challenge(challenge_mptr, hash_mptr, r) -> ret0, ret1 { + let hash := keccak256(0x00, hash_mptr) + mstore(challenge_mptr, mod(hash, r)) + mstore(0x00, hash) + ret0 := add(challenge_mptr, 0x20) + ret1 := 0x20 + } + + // Squeeze challenge without absorbing new input from calldata, + // by putting an extra 0x01 in memory[0x20] and squeeze by keccak256(memory[0..21]), + // and store hash mod r as challenge in challenge_mptr, + // and push back hash in 0x00 as the first input for next squeeze. + // Return updated (challenge_mptr). + function squeeze_challenge_cont(challenge_mptr, r) -> ret { + mstore8(0x20, 0x01) + let hash := keccak256(0x00, 0x21) + mstore(challenge_mptr, mod(hash, r)) + mstore(0x00, hash) + ret := add(challenge_mptr, 0x20) + } + + // Batch invert values in memory[mptr_start..mptr_end] in place. + // Return updated (success). + function batch_invert(success, mptr_start, mptr_end, r) -> ret { + let gp_mptr := mptr_end + let gp := mload(mptr_start) + let mptr := add(mptr_start, 0x20) + for + {} + lt(mptr, sub(mptr_end, 0x20)) + {} + { + gp := mulmod(gp, mload(mptr), r) + mstore(gp_mptr, gp) + mptr := add(mptr, 0x20) + gp_mptr := add(gp_mptr, 0x20) + } + gp := mulmod(gp, mload(mptr), r) + + mstore(gp_mptr, 0x20) + mstore(add(gp_mptr, 0x20), 0x20) + mstore(add(gp_mptr, 0x40), 0x20) + mstore(add(gp_mptr, 0x60), gp) + mstore(add(gp_mptr, 0x80), sub(r, 2)) + mstore(add(gp_mptr, 0xa0), r) + ret := and(success, staticcall(gas(), 0x05, gp_mptr, 0xc0, gp_mptr, 0x20)) + let all_inv := mload(gp_mptr) + + let first_mptr := mptr_start + let second_mptr := add(first_mptr, 0x20) + gp_mptr := sub(gp_mptr, 0x20) + for + {} + lt(second_mptr, mptr) + {} + { + let inv := mulmod(all_inv, mload(gp_mptr), r) + all_inv := mulmod(all_inv, mload(mptr), r) + mstore(mptr, inv) + mptr := sub(mptr, 0x20) + gp_mptr := sub(gp_mptr, 0x20) + } + let inv_first := mulmod(all_inv, mload(second_mptr), r) + let inv_second := mulmod(all_inv, mload(first_mptr), r) + mstore(first_mptr, inv_first) + mstore(second_mptr, inv_second) + } + + // Add (x, y) into point at (0x00, 0x20). + // Return updated (success). + function ec_add_acc(success, x, y) -> ret { + mstore(0x40, x) + mstore(0x60, y) + ret := and(success, staticcall(gas(), 0x06, 0x00, 0x80, 0x00, 0x40)) + } + + // Scale point at (0x00, 0x20) by scalar. + function ec_mul_acc(success, scalar) -> ret { + mstore(0x40, scalar) + ret := and(success, staticcall(gas(), 0x07, 0x00, 0x60, 0x00, 0x40)) + } + + // Add (x, y) into point at (0x80, 0xa0). + // Return updated (success). + function ec_add_tmp(success, x, y) -> ret { + mstore(0xc0, x) + mstore(0xe0, y) + ret := and(success, staticcall(gas(), 0x06, 0x80, 0x80, 0x80, 0x40)) + } + + // Scale point at (0x80, 0xa0) by scalar. + // Return updated (success). + function ec_mul_tmp(success, scalar) -> ret { + mstore(0xc0, scalar) + ret := and(success, staticcall(gas(), 0x07, 0x80, 0x60, 0x80, 0x40)) + } + + // Perform pairing check. + // Return updated (success). + function ec_pairing(success, lhs_x, lhs_y, rhs_x, rhs_y) -> ret { + mstore(0x00, lhs_x) + mstore(0x20, lhs_y) + mstore(0x40, mload(G2_X_1_MPTR)) + mstore(0x60, mload(G2_X_2_MPTR)) + mstore(0x80, mload(G2_Y_1_MPTR)) + mstore(0xa0, mload(G2_Y_2_MPTR)) + mstore(0xc0, rhs_x) + mstore(0xe0, rhs_y) + mstore(0x100, mload(NEG_S_G2_X_1_MPTR)) + mstore(0x120, mload(NEG_S_G2_X_2_MPTR)) + mstore(0x140, mload(NEG_S_G2_Y_1_MPTR)) + mstore(0x160, mload(NEG_S_G2_Y_2_MPTR)) + ret := and(success, staticcall(gas(), 0x08, 0x00, 0x180, 0x00, 0x20)) + ret := and(ret, mload(0x00)) + } + + // Modulus + let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // BN254 base field + let r := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // BN254 scalar field + + // Initialize success as true + let success := true + + { + // Load vk into memory + mstore(0x09a0, 0x018b0a93b2ba7daec30e3b6c1bcd045511fd208c8d54227705591ca7ced9563c) // vk_digest + mstore(0x09c0, 0x0000000000000000000000000000000000000000000000000000000000000016) // k + mstore(0x09e0, 0x30644db14ff7d4a4f1cf9ed5406a7e5722d273a7aa184eaa5e1fb0846829b041) // n_inv + mstore(0x0a00, 0x18c95f1ae6514e11a1b30fd7923947c5ffcec5347f16e91b4dd654168326bede) // omega + mstore(0x0a20, 0x134f571fe34eb8c7b1685e875b324820e199bd70157493377cd65b204d1a3964) // omega_inv + mstore(0x0a40, 0x1d3d878f52016737bda697d23b0cee81488efd02d67b27eae3edab5f39ef347d) // omega_inv_to_l + mstore(0x0a60, 0x0000000000000000000000000000000000000000000000000000000000000001) // num_instances + mstore(0x0a80, 0x0000000000000000000000000000000000000000000000000000000000000000) // has_accumulator + mstore(0x0aa0, 0x0000000000000000000000000000000000000000000000000000000000000000) // acc_offset + mstore(0x0ac0, 0x0000000000000000000000000000000000000000000000000000000000000000) // num_acc_limbs + mstore(0x0ae0, 0x0000000000000000000000000000000000000000000000000000000000000000) // num_acc_limb_bits + mstore(0x0b00, 0x0000000000000000000000000000000000000000000000000000000000000001) // g1_x + mstore(0x0b20, 0x0000000000000000000000000000000000000000000000000000000000000002) // g1_y + mstore(0x0b40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // g2_x_1 + mstore(0x0b60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) // g2_x_2 + mstore(0x0b80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) // g2_y_1 + mstore(0x0ba0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) // g2_y_2 + mstore(0x0bc0, 0x0181624e80f3d6ae28df7e01eaeab1c0e919877a3b8a6b7fbc69a6817d596ea2) // neg_s_g2_x_1 + mstore(0x0be0, 0x1783d30dcb12d259bb89098addf6280fa4b653be7a152542a28f7b926e27e648) // neg_s_g2_x_2 + mstore(0x0c00, 0x00ae44489d41a0d179e2dfdc03bddd883b7109f8b6ae316a59e815c1a6b35304) // neg_s_g2_y_1 + mstore(0x0c20, 0x0b2147ab62a386bd63e6de1522109b8c9588ab466f5aadfde8c41ca3749423ee) // neg_s_g2_y_2 + mstore(0x0c40, 0x04d043081f0d55eead6d8ad7b10d09a6ee2718f445d9bce454075a8a37bacaf3) // fixed_comms[0].x + mstore(0x0c60, 0x27d6bcbb02cd624ab80b5532a0a65fc6f88a0faf7cf3e0d106f4aa0aa25e758b) // fixed_comms[0].y + mstore(0x0c80, 0x0d3b7c04b7391ddf5d9fc5f8906033e1d1442f341c4cab5c1584c8082ea8c21c) // fixed_comms[1].x + mstore(0x0ca0, 0x1596df7247ab32fb79261c31617e2f2bbde95b6e8719386dacfeaa8f6d7df60c) // fixed_comms[1].y + mstore(0x0cc0, 0x04d043081f0d55eead6d8ad7b10d09a6ee2718f445d9bce454075a8a37bacaf3) // fixed_comms[2].x + mstore(0x0ce0, 0x27d6bcbb02cd624ab80b5532a0a65fc6f88a0faf7cf3e0d106f4aa0aa25e758b) // fixed_comms[2].y + mstore(0x0d00, 0x2d07a1bca289cdb98b648a91cbb0809dfa3a06fe01047b291d1161ddf8d1732c) // fixed_comms[3].x + mstore(0x0d20, 0x021d078d5869c57b3fe2413b517561205de5f297ac56c0e5ef0f1a7f4a31ee94) // fixed_comms[3].y + mstore(0x0d40, 0x2808de5f33581574dd857304add28f30335fa32c49a3d7c9128f5a3f453360cc) // fixed_comms[4].x + mstore(0x0d60, 0x07f10d421231cb6aa063db7a3cf7be709ff037fbb78d19c866d7c2c674a1aaf0) // fixed_comms[4].y + mstore(0x0d80, 0x2a9d8bc0a06a141e47fa114e4e62686823227f5416f19f9b2b54b9948a0bfb4b) // fixed_comms[5].x + mstore(0x0da0, 0x170610ca7497030a3dbbfeb52cc8f5f086e7a7a91e3b52e44988e6b24f1c6c34) // fixed_comms[5].y + mstore(0x0dc0, 0x104eb8e796d7c0b0ac9eb316eac3aadbcf9ac5b42d4b14a95ec269fefd70d9ac) // fixed_comms[6].x + mstore(0x0de0, 0x22e1365078923b7f828a54c75e0b0b108c311580bac730c92d8868c7781a917b) // fixed_comms[6].y + mstore(0x0e00, 0x2e8f499835598c80e2ec4cabd4753e67822df35d0a29c05b60dca21d9173b11a) // fixed_comms[7].x + mstore(0x0e20, 0x02990fa09b4831443e5956b84832f525976cd30aa6cafe055a45f7a04328d00f) // fixed_comms[7].y + mstore(0x0e40, 0x258bbf1a0f256c29c1cee612fb7deaa2102870b85d7bda1ac8064307a593101f) // fixed_comms[8].x + mstore(0x0e60, 0x2bbbde7d34cf03b70ea4a0125d6736aeb56da64f07226bf4d662a85e8d50db3a) // fixed_comms[8].y + mstore(0x0e80, 0x05127b4a2ff58c747435761c7256b8094a0cf4e6d0f829a060c601d5cce0fdc0) // fixed_comms[9].x + mstore(0x0ea0, 0x106a8cecab556f1a6d729cdeefd6dd70afbe4954cae4785871d68396dba88d95) // fixed_comms[9].y + mstore(0x0ec0, 0x24c985411f901ba3e9fe3296d58db7a896d53a060afc4c3b85182122d2a06b16) // permutation_comms[0].x + mstore(0x0ee0, 0x1e02136b244f617c37779b0cb970dce25ff03579c671e7f3f57a320e7b1a4b06) // permutation_comms[0].y + mstore(0x0f00, 0x0e5c5a486399e328a6629926a042fde07863ce1a2e91995ee60e5c477008ebdc) // permutation_comms[1].x + mstore(0x0f20, 0x223b4bdd8d3877955728258fd5be1b7f2ac8093891a83c738f80395720cc55ca) // permutation_comms[1].y + mstore(0x0f40, 0x2e55f008e10b629fc37b0808b8264d2857e6fa34a1be704a4132f9c1621b8736) // permutation_comms[2].x + mstore(0x0f60, 0x01c3487db12618c270ffe8251633753bdad9fd2968144a02b18447bee326d19d) // permutation_comms[2].y + mstore(0x0f80, 0x0154bffa5c54063b60c4f4c66b2a9acb09fd7f1b2653a9f2b9ee75bcb1bc8ba2) // permutation_comms[3].x + mstore(0x0fa0, 0x0b15f039df5ebe088e2231ce9a07c50dbb4739402712b56dd8bab6ab93a95f3f) // permutation_comms[3].y + mstore(0x0fc0, 0x0032a37f146820eccad7796039d21d0c85504baff34e194f750d7f8c4eccf729) // permutation_comms[4].x + mstore(0x0fe0, 0x2a655340cddc523abd37c3d77f022b8e616194a3c31e414dc5d466eb2e4c0b69) // permutation_comms[4].y + mstore(0x1000, 0x0d6b367e25327ebd99fae2aaffa6fad2acae34ba7b329ef817a95fe425f65e4d) // permutation_comms[5].x + mstore(0x1020, 0x2bc4769ce00a494fde791f07b3f092019995d323c0b067d61e0660e1ad84d94f) // permutation_comms[5].y + mstore(0x1040, 0x0fef43d29ecdb947fc934c7adf7f38748fe212082d5a8e3bc621ff907213812b) // permutation_comms[6].x + mstore(0x1060, 0x1ab8ccbb8486a5508a34837db62c3426d6f6210970a2b1351f12d0ba73e11874) // permutation_comms[6].y + mstore(0x1080, 0x29cc03da3870fc7139115d43275baf04cc110d79f85d2c2e712b981c409df25e) // permutation_comms[7].x + mstore(0x10a0, 0x016a8cd002e522595ef910f87dc707449ae5f56876eb88274b2e586fceacf165) // permutation_comms[7].y + mstore(0x10c0, 0x0ec6d72e2ce7c233ca8af2fc2bd4223a6d81d545e8785579de4cb241740f36a2) // permutation_comms[8].x + mstore(0x10e0, 0x028a4450999577e25fc7d191fecf7f1a8a0526f7e042f316767c7ff43299fdd9) // permutation_comms[8].y + mstore(0x1100, 0x1fdb57cefe9c10024dfe402759cad8061e8d0edeba3f42f187ea796b1938118e) // permutation_comms[9].x + mstore(0x1120, 0x1294d92ed67eec88a2adbb5cef0682a64fae9827c02d37e69beaddd3b6a145ad) // permutation_comms[9].y + mstore(0x1140, 0x292267e75402bf3fb816d404fe987ec7b277ec539cd653568a31dc8fdd04b6f1) // permutation_comms[10].x + mstore(0x1160, 0x0a2975f29c8f29df52ea4e941daa28752eea2da8c6b6135622e4a0d823accd78) // permutation_comms[10].y + + // Check valid length of proof + success := and(success, eq(0x1040, calldataload(PROOF_LEN_CPTR))) + + // Check valid length of instances + let num_instances := mload(NUM_INSTANCES_MPTR) + success := and(success, eq(num_instances, calldataload(NUM_INSTANCE_CPTR))) + + // Absorb vk diegst + mstore(0x00, mload(VK_DIGEST_MPTR)) + + // Read instances and witness commitments and generate challenges + let hash_mptr := 0x20 + let instance_cptr := INSTANCE_CPTR + for + { let instance_cptr_end := add(instance_cptr, mul(0x20, num_instances)) } + lt(instance_cptr, instance_cptr_end) + {} + { + let instance := calldataload(instance_cptr) + success := and(success, lt(instance, r)) + mstore(hash_mptr, instance) + instance_cptr := add(instance_cptr, 0x20) + hash_mptr := add(hash_mptr, 0x20) + } + + let proof_cptr := PROOF_CPTR + let challenge_mptr := CHALLENGE_MPTR + + // Phase 1 + for + { let proof_cptr_end := add(proof_cptr, 0x0240) } + lt(proof_cptr, proof_cptr_end) + {} + { + success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) + } + + challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) + + // Phase 2 + for + { let proof_cptr_end := add(proof_cptr, 0x0100) } + lt(proof_cptr, proof_cptr_end) + {} + { + success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) + } + + challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) + challenge_mptr := squeeze_challenge_cont(challenge_mptr, r) + + // Phase 3 + for + { let proof_cptr_end := add(proof_cptr, 0x0240) } + lt(proof_cptr, proof_cptr_end) + {} + { + success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) + } + + challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) + + // Phase 4 + for + { let proof_cptr_end := add(proof_cptr, 0xc0) } + lt(proof_cptr, proof_cptr_end) + {} + { + success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) + } + + challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) + + // Read evaluations + for + { let proof_cptr_end := add(proof_cptr, 0x0980) } + lt(proof_cptr, proof_cptr_end) + {} + { + let eval := calldataload(proof_cptr) + success := and(success, lt(eval, r)) + mstore(hash_mptr, eval) + proof_cptr := add(proof_cptr, 0x20) + hash_mptr := add(hash_mptr, 0x20) + } + + // Read batch opening proof and generate challenges + challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) // zeta + challenge_mptr := squeeze_challenge_cont(challenge_mptr, r) // nu + + success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) // W + + challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) // mu + + success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) // W' + + // Read accumulator from instances + if mload(HAS_ACCUMULATOR_MPTR) { + let num_limbs := mload(NUM_ACC_LIMBS_MPTR) + let num_limb_bits := mload(NUM_ACC_LIMB_BITS_MPTR) + + let cptr := add(INSTANCE_CPTR, mul(mload(ACC_OFFSET_MPTR), 0x20)) + let lhs_y_off := mul(num_limbs, 0x20) + let rhs_x_off := mul(lhs_y_off, 2) + let rhs_y_off := mul(lhs_y_off, 3) + let lhs_x := calldataload(cptr) + let lhs_y := calldataload(add(cptr, lhs_y_off)) + let rhs_x := calldataload(add(cptr, rhs_x_off)) + let rhs_y := calldataload(add(cptr, rhs_y_off)) + for + { + let cptr_end := add(cptr, mul(0x20, num_limbs)) + let shift := num_limb_bits + } + lt(cptr, cptr_end) + {} + { + cptr := add(cptr, 0x20) + lhs_x := add(lhs_x, shl(shift, calldataload(cptr))) + lhs_y := add(lhs_y, shl(shift, calldataload(add(cptr, lhs_y_off)))) + rhs_x := add(rhs_x, shl(shift, calldataload(add(cptr, rhs_x_off)))) + rhs_y := add(rhs_y, shl(shift, calldataload(add(cptr, rhs_y_off)))) + shift := add(shift, num_limb_bits) + } + + success := and(success, eq(mulmod(lhs_y, lhs_y, q), addmod(mulmod(lhs_x, mulmod(lhs_x, lhs_x, q), q), 3, q))) + success := and(success, eq(mulmod(rhs_y, rhs_y, q), addmod(mulmod(rhs_x, mulmod(rhs_x, rhs_x, q), q), 3, q))) + + mstore(ACC_LHS_X_MPTR, lhs_x) + mstore(ACC_LHS_Y_MPTR, lhs_y) + mstore(ACC_RHS_X_MPTR, rhs_x) + mstore(ACC_RHS_Y_MPTR, rhs_y) + } + + pop(q) + } + + // Revert earlier if anything from calldata is invalid + if iszero(success) { + revert(0, 0) + } + + // Compute lagrange evaluations and instance evaluation + { + let k := mload(K_MPTR) + let x := mload(X_MPTR) + let x_n := x + for + { let idx := 0 } + lt(idx, k) + { idx := add(idx, 1) } + { + x_n := mulmod(x_n, x_n, r) + } + + let omega := mload(OMEGA_MPTR) + + let mptr := X_N_MPTR + let mptr_end := add(mptr, mul(0x20, add(mload(NUM_INSTANCES_MPTR), 7))) + if iszero(mload(NUM_INSTANCES_MPTR)) { + mptr_end := add(mptr_end, 0x20) + } + for + { let pow_of_omega := mload(OMEGA_INV_TO_L_MPTR) } + lt(mptr, mptr_end) + { mptr := add(mptr, 0x20) } + { + mstore(mptr, addmod(x, sub(r, pow_of_omega), r)) + pow_of_omega := mulmod(pow_of_omega, omega, r) + } + let x_n_minus_1 := addmod(x_n, sub(r, 1), r) + mstore(mptr_end, x_n_minus_1) + success := batch_invert(success, X_N_MPTR, add(mptr_end, 0x20), r) + + mptr := X_N_MPTR + let l_i_common := mulmod(x_n_minus_1, mload(N_INV_MPTR), r) + for + { let pow_of_omega := mload(OMEGA_INV_TO_L_MPTR) } + lt(mptr, mptr_end) + { mptr := add(mptr, 0x20) } + { + mstore(mptr, mulmod(l_i_common, mulmod(mload(mptr), pow_of_omega, r), r)) + pow_of_omega := mulmod(pow_of_omega, omega, r) + } + + let l_blind := mload(add(X_N_MPTR, 0x20)) + let l_i_cptr := add(X_N_MPTR, 0x40) + for + { let l_i_cptr_end := add(X_N_MPTR, 0xe0) } + lt(l_i_cptr, l_i_cptr_end) + { l_i_cptr := add(l_i_cptr, 0x20) } + { + l_blind := addmod(l_blind, mload(l_i_cptr), r) + } + + let instance_eval := 0 + for + { + let instance_cptr := INSTANCE_CPTR + let instance_cptr_end := add(instance_cptr, mul(0x20, mload(NUM_INSTANCES_MPTR))) + } + lt(instance_cptr, instance_cptr_end) + { + instance_cptr := add(instance_cptr, 0x20) + l_i_cptr := add(l_i_cptr, 0x20) + } + { + instance_eval := addmod(instance_eval, mulmod(mload(l_i_cptr), calldataload(instance_cptr), r), r) + } + + let x_n_minus_1_inv := mload(mptr_end) + let l_last := mload(X_N_MPTR) + let l_0 := mload(add(X_N_MPTR, 0xe0)) + + mstore(X_N_MPTR, x_n) + mstore(X_N_MINUS_1_INV_MPTR, x_n_minus_1_inv) + mstore(L_LAST_MPTR, l_last) + mstore(L_BLIND_MPTR, l_blind) + mstore(L_0_MPTR, l_0) + mstore(INSTANCE_EVAL_MPTR, instance_eval) + } + + // Compute quotient evavluation + { + let quotient_eval_numer + let delta := 4131629893567559867359510883348571134090853742863529169391034518566172092834 + let y := mload(Y_MPTR) + { + let f_4 := calldataload(0x0a84) + let a_0 := calldataload(0x06a4) + let a_0_next_1 := calldataload(0x06c4) + let a_0_next_2 := calldataload(0x06e4) + let var0 := mulmod(a_0_next_1, a_0_next_2, r) + let var1 := addmod(a_0, var0, r) + let a_0_next_3 := calldataload(0x0704) + let var2 := sub(r, a_0_next_3) + let var3 := addmod(var1, var2, r) + let var4 := mulmod(f_4, var3, r) + quotient_eval_numer := var4 + } + { + let f_5 := calldataload(0x0aa4) + let a_1 := calldataload(0x0724) + let a_1_next_1 := calldataload(0x0744) + let a_1_next_2 := calldataload(0x0764) + let var0 := mulmod(a_1_next_1, a_1_next_2, r) + let var1 := addmod(a_1, var0, r) + let a_1_next_3 := calldataload(0x0784) + let var2 := sub(r, a_1_next_3) + let var3 := addmod(var1, var2, r) + let var4 := mulmod(f_5, var3, r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var4, r) + } + { + let f_6 := calldataload(0x0ac4) + let a_2 := calldataload(0x07a4) + let a_2_next_1 := calldataload(0x07c4) + let a_2_next_2 := calldataload(0x07e4) + let var0 := mulmod(a_2_next_1, a_2_next_2, r) + let var1 := addmod(a_2, var0, r) + let a_2_next_3 := calldataload(0x0804) + let var2 := sub(r, a_2_next_3) + let var3 := addmod(var1, var2, r) + let var4 := mulmod(f_6, var3, r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var4, r) + } + { + let f_7 := calldataload(0x0ae4) + let a_3 := calldataload(0x0824) + let a_3_next_1 := calldataload(0x0844) + let a_3_next_2 := calldataload(0x0864) + let var0 := mulmod(a_3_next_1, a_3_next_2, r) + let var1 := addmod(a_3, var0, r) + let a_3_next_3 := calldataload(0x0884) + let var2 := sub(r, a_3_next_3) + let var3 := addmod(var1, var2, r) + let var4 := mulmod(f_7, var3, r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var4, r) + } + { + let f_8 := calldataload(0x0b04) + let a_4 := calldataload(0x08a4) + let a_4_next_1 := calldataload(0x08c4) + let a_4_next_2 := calldataload(0x08e4) + let var0 := mulmod(a_4_next_1, a_4_next_2, r) + let var1 := addmod(a_4, var0, r) + let a_4_next_3 := calldataload(0x0904) + let var2 := sub(r, a_4_next_3) + let var3 := addmod(var1, var2, r) + let var4 := mulmod(f_8, var3, r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var4, r) + } + { + let f_9 := calldataload(0x0b24) + let a_5 := calldataload(0x0924) + let a_5_next_1 := calldataload(0x0944) + let a_5_next_2 := calldataload(0x0964) + let var0 := mulmod(a_5_next_1, a_5_next_2, r) + let var1 := addmod(a_5, var0, r) + let a_5_next_3 := calldataload(0x0984) + let var2 := sub(r, a_5_next_3) + let var3 := addmod(var1, var2, r) + let var4 := mulmod(f_9, var3, r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var4, r) + } + { + let l_0 := mload(L_0_MPTR) + let eval := addmod(l_0, sub(r, mulmod(l_0, calldataload(0x0cc4), r)), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let perm_z_last := calldataload(0x0ea4) + let eval := mulmod(mload(L_LAST_MPTR), addmod(mulmod(perm_z_last, perm_z_last, r), sub(r, perm_z_last), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0d24), sub(r, calldataload(0x0d04)), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0d84), sub(r, calldataload(0x0d64)), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0de4), sub(r, calldataload(0x0dc4)), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0e44), sub(r, calldataload(0x0e24)), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0ea4), sub(r, calldataload(0x0e84)), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let gamma := mload(GAMMA_MPTR) + let beta := mload(BETA_MPTR) + let lhs := calldataload(0x0ce4) + let rhs := calldataload(0x0cc4) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x0a04), mulmod(beta, calldataload(0x0b64), r), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x06a4), mulmod(beta, calldataload(0x0b84), r), r), gamma, r), r) + mstore(0x00, mulmod(beta, mload(X_MPTR), r)) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x0a04), mload(0x00), r), gamma, r), r) + mstore(0x00, mulmod(mload(0x00), delta, r)) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x06a4), mload(0x00), r), gamma, r), r) + mstore(0x00, mulmod(mload(0x00), delta, r)) + let left_sub_right := addmod(lhs, sub(r, rhs), r) + let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let gamma := mload(GAMMA_MPTR) + let beta := mload(BETA_MPTR) + let lhs := calldataload(0x0d44) + let rhs := calldataload(0x0d24) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x0724), mulmod(beta, calldataload(0x0ba4), r), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x07a4), mulmod(beta, calldataload(0x0bc4), r), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x0724), mload(0x00), r), gamma, r), r) + mstore(0x00, mulmod(mload(0x00), delta, r)) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x07a4), mload(0x00), r), gamma, r), r) + mstore(0x00, mulmod(mload(0x00), delta, r)) + let left_sub_right := addmod(lhs, sub(r, rhs), r) + let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let gamma := mload(GAMMA_MPTR) + let beta := mload(BETA_MPTR) + let lhs := calldataload(0x0da4) + let rhs := calldataload(0x0d84) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x0824), mulmod(beta, calldataload(0x0be4), r), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x08a4), mulmod(beta, calldataload(0x0c04), r), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x0824), mload(0x00), r), gamma, r), r) + mstore(0x00, mulmod(mload(0x00), delta, r)) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x08a4), mload(0x00), r), gamma, r), r) + mstore(0x00, mulmod(mload(0x00), delta, r)) + let left_sub_right := addmod(lhs, sub(r, rhs), r) + let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let gamma := mload(GAMMA_MPTR) + let beta := mload(BETA_MPTR) + let lhs := calldataload(0x0e04) + let rhs := calldataload(0x0de4) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x0924), mulmod(beta, calldataload(0x0c24), r), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x09a4), mulmod(beta, calldataload(0x0c44), r), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x0924), mload(0x00), r), gamma, r), r) + mstore(0x00, mulmod(mload(0x00), delta, r)) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x09a4), mload(0x00), r), gamma, r), r) + mstore(0x00, mulmod(mload(0x00), delta, r)) + let left_sub_right := addmod(lhs, sub(r, rhs), r) + let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let gamma := mload(GAMMA_MPTR) + let beta := mload(BETA_MPTR) + let lhs := calldataload(0x0e64) + let rhs := calldataload(0x0e44) + lhs := mulmod(lhs, addmod(addmod(mload(INSTANCE_EVAL_MPTR), mulmod(beta, calldataload(0x0c64), r), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x09c4), mulmod(beta, calldataload(0x0c84), r), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(mload(INSTANCE_EVAL_MPTR), mload(0x00), r), gamma, r), r) + mstore(0x00, mulmod(mload(0x00), delta, r)) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x09c4), mload(0x00), r), gamma, r), r) + mstore(0x00, mulmod(mload(0x00), delta, r)) + let left_sub_right := addmod(lhs, sub(r, rhs), r) + let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let gamma := mload(GAMMA_MPTR) + let beta := mload(BETA_MPTR) + let lhs := calldataload(0x0ec4) + let rhs := calldataload(0x0ea4) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x09e4), mulmod(beta, calldataload(0x0ca4), r), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x09e4), mload(0x00), r), gamma, r), r) + let left_sub_right := addmod(lhs, sub(r, rhs), r) + let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let l_0 := mload(L_0_MPTR) + let eval := addmod(l_0, mulmod(l_0, sub(r, calldataload(0x0ee4)), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let l_last := mload(L_LAST_MPTR) + let eval := mulmod(l_last, addmod(mulmod(calldataload(0x0ee4), calldataload(0x0ee4), r), sub(r, calldataload(0x0ee4)), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let theta := mload(THETA_MPTR) + let input + { + let a_6 := calldataload(0x09a4) + input := a_6 + } + let table + { + let f_0 := calldataload(0x0a24) + table := f_0 + } + let beta := mload(BETA_MPTR) + let gamma := mload(GAMMA_MPTR) + let lhs := mulmod(calldataload(0x0f04), mulmod(addmod(calldataload(0x0f24), beta, r), addmod(calldataload(0x0f64), gamma, r), r), r) + let rhs := mulmod(calldataload(0x0ee4), mulmod(addmod(input, beta, r), addmod(table, gamma, r), r), r) + let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), addmod(lhs, sub(r, rhs), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0f24), sub(r, calldataload(0x0f64)), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), mulmod(addmod(calldataload(0x0f24), sub(r, calldataload(0x0f64)), r), addmod(calldataload(0x0f24), sub(r, calldataload(0x0f44)), r), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let l_0 := mload(L_0_MPTR) + let eval := addmod(l_0, mulmod(l_0, sub(r, calldataload(0x0f84)), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let l_last := mload(L_LAST_MPTR) + let eval := mulmod(l_last, addmod(mulmod(calldataload(0x0f84), calldataload(0x0f84), r), sub(r, calldataload(0x0f84)), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let theta := mload(THETA_MPTR) + let input + { + let a_7 := calldataload(0x09c4) + let a_8 := calldataload(0x09e4) + input := a_7 + input := addmod(mulmod(input, theta, r), a_8, r) + } + let table + { + let f_2 := calldataload(0x0a44) + let f_3 := calldataload(0x0a64) + table := f_2 + table := addmod(mulmod(table, theta, r), f_3, r) + } + let beta := mload(BETA_MPTR) + let gamma := mload(GAMMA_MPTR) + let lhs := mulmod(calldataload(0x0fa4), mulmod(addmod(calldataload(0x0fc4), beta, r), addmod(calldataload(0x1004), gamma, r), r), r) + let rhs := mulmod(calldataload(0x0f84), mulmod(addmod(input, beta, r), addmod(table, gamma, r), r), r) + let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), addmod(lhs, sub(r, rhs), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0fc4), sub(r, calldataload(0x1004)), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + { + let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), mulmod(addmod(calldataload(0x0fc4), sub(r, calldataload(0x1004)), r), addmod(calldataload(0x0fc4), sub(r, calldataload(0x0fe4)), r), r), r) + quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) + } + + pop(y) + pop(delta) + + let quotient_eval := mulmod(quotient_eval_numer, mload(X_N_MINUS_1_INV_MPTR), r) + mstore(QUOTIENT_EVAL_MPTR, quotient_eval) + } + + // Compute quotient commitment + { + mstore(0x00, calldataload(LAST_QUOTIENT_X_CPTR)) + mstore(0x20, calldataload(add(LAST_QUOTIENT_X_CPTR, 0x20))) + let x_n := mload(X_N_MPTR) + for + { + let cptr := sub(LAST_QUOTIENT_X_CPTR, 0x40) + let cptr_end := sub(FIRST_QUOTIENT_X_CPTR, 0x40) + } + lt(cptr_end, cptr) + {} + { + success := ec_mul_acc(success, x_n) + success := ec_add_acc(success, calldataload(cptr), calldataload(add(cptr, 0x20))) + cptr := sub(cptr, 0x40) + } + mstore(QUOTIENT_X_MPTR, mload(0x00)) + mstore(QUOTIENT_Y_MPTR, mload(0x20)) + } + + // Compute pairing lhs and rhs + { + { + let x := mload(X_MPTR) + let omega := mload(OMEGA_MPTR) + let omega_inv := mload(OMEGA_INV_MPTR) + let x_pow_of_omega := mulmod(x, omega, r) + mstore(0x0460, x_pow_of_omega) + x_pow_of_omega := mulmod(x_pow_of_omega, omega, r) + mstore(0x0480, x_pow_of_omega) + x_pow_of_omega := mulmod(x_pow_of_omega, omega, r) + mstore(0x04a0, x_pow_of_omega) + mstore(0x0440, x) + x_pow_of_omega := mulmod(x, omega_inv, r) + mstore(0x0420, x_pow_of_omega) + x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) + x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) + x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) + x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) + x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) + x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) + mstore(0x0400, x_pow_of_omega) + } + { + let mu := mload(MU_MPTR) + for + { + let mptr := 0x04c0 + let mptr_end := 0x0580 + let point_mptr := 0x0400 + } + lt(mptr, mptr_end) + { + mptr := add(mptr, 0x20) + point_mptr := add(point_mptr, 0x20) + } + { + mstore(mptr, addmod(mu, sub(r, mload(point_mptr)), r)) + } + let s + s := mload(0x0500) + s := mulmod(s, mload(0x0520), r) + s := mulmod(s, mload(0x0540), r) + s := mulmod(s, mload(0x0560), r) + mstore(0x0580, s) + let diff + diff := mload(0x04c0) + diff := mulmod(diff, mload(0x04e0), r) + mstore(0x05a0, diff) + mstore(0x00, diff) + diff := mload(0x04c0) + diff := mulmod(diff, mload(0x04e0), r) + diff := mulmod(diff, mload(0x0520), r) + diff := mulmod(diff, mload(0x0540), r) + diff := mulmod(diff, mload(0x0560), r) + mstore(0x05c0, diff) + diff := mload(0x04e0) + diff := mulmod(diff, mload(0x0540), r) + diff := mulmod(diff, mload(0x0560), r) + mstore(0x05e0, diff) + diff := mload(0x04c0) + diff := mulmod(diff, mload(0x04e0), r) + diff := mulmod(diff, mload(0x0540), r) + diff := mulmod(diff, mload(0x0560), r) + mstore(0x0600, diff) + diff := mload(0x04c0) + diff := mulmod(diff, mload(0x0520), r) + diff := mulmod(diff, mload(0x0540), r) + diff := mulmod(diff, mload(0x0560), r) + mstore(0x0620, diff) + } + { + let point_2 := mload(0x0440) + let point_3 := mload(0x0460) + let point_4 := mload(0x0480) + let point_5 := mload(0x04a0) + let coeff + coeff := addmod(point_2, sub(r, point_3), r) + coeff := mulmod(coeff, addmod(point_2, sub(r, point_4), r), r) + coeff := mulmod(coeff, addmod(point_2, sub(r, point_5), r), r) + coeff := mulmod(coeff, mload(0x0500), r) + mstore(0x20, coeff) + coeff := addmod(point_3, sub(r, point_2), r) + coeff := mulmod(coeff, addmod(point_3, sub(r, point_4), r), r) + coeff := mulmod(coeff, addmod(point_3, sub(r, point_5), r), r) + coeff := mulmod(coeff, mload(0x0520), r) + mstore(0x40, coeff) + coeff := addmod(point_4, sub(r, point_2), r) + coeff := mulmod(coeff, addmod(point_4, sub(r, point_3), r), r) + coeff := mulmod(coeff, addmod(point_4, sub(r, point_5), r), r) + coeff := mulmod(coeff, mload(0x0540), r) + mstore(0x60, coeff) + coeff := addmod(point_5, sub(r, point_2), r) + coeff := mulmod(coeff, addmod(point_5, sub(r, point_3), r), r) + coeff := mulmod(coeff, addmod(point_5, sub(r, point_4), r), r) + coeff := mulmod(coeff, mload(0x0560), r) + mstore(0x80, coeff) + } + { + let point_2 := mload(0x0440) + let coeff + coeff := 1 + coeff := mulmod(coeff, mload(0x0500), r) + mstore(0xa0, coeff) + } + { + let point_0 := mload(0x0400) + let point_2 := mload(0x0440) + let point_3 := mload(0x0460) + let coeff + coeff := addmod(point_0, sub(r, point_2), r) + coeff := mulmod(coeff, addmod(point_0, sub(r, point_3), r), r) + coeff := mulmod(coeff, mload(0x04c0), r) + mstore(0xc0, coeff) + coeff := addmod(point_2, sub(r, point_0), r) + coeff := mulmod(coeff, addmod(point_2, sub(r, point_3), r), r) + coeff := mulmod(coeff, mload(0x0500), r) + mstore(0xe0, coeff) + coeff := addmod(point_3, sub(r, point_0), r) + coeff := mulmod(coeff, addmod(point_3, sub(r, point_2), r), r) + coeff := mulmod(coeff, mload(0x0520), r) + mstore(0x0100, coeff) + } + { + let point_2 := mload(0x0440) + let point_3 := mload(0x0460) + let coeff + coeff := addmod(point_2, sub(r, point_3), r) + coeff := mulmod(coeff, mload(0x0500), r) + mstore(0x0120, coeff) + coeff := addmod(point_3, sub(r, point_2), r) + coeff := mulmod(coeff, mload(0x0520), r) + mstore(0x0140, coeff) + } + { + let point_1 := mload(0x0420) + let point_2 := mload(0x0440) + let coeff + coeff := addmod(point_1, sub(r, point_2), r) + coeff := mulmod(coeff, mload(0x04e0), r) + mstore(0x0160, coeff) + coeff := addmod(point_2, sub(r, point_1), r) + coeff := mulmod(coeff, mload(0x0500), r) + mstore(0x0180, coeff) + } + { + success := batch_invert(success, 0, 0x01a0, r) + let diff_0_inv := mload(0x00) + mstore(0x05a0, diff_0_inv) + for + { + let mptr := 0x05c0 + let mptr_end := 0x0640 + } + lt(mptr, mptr_end) + { mptr := add(mptr, 0x20) } + { + mstore(mptr, mulmod(mload(mptr), diff_0_inv, r)) + } + } + { + let zeta := mload(ZETA_MPTR) + let r_eval := 0 + r_eval := addmod(r_eval, mulmod(mload(0x20), calldataload(0x0924), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x0944), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x0964), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0984), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(mload(0x20), calldataload(0x08a4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x08c4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x08e4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0904), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(mload(0x20), calldataload(0x0824), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x0844), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x0864), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0884), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(mload(0x20), calldataload(0x07a4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x07c4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x07e4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0804), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(mload(0x20), calldataload(0x0724), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x0744), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x0764), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0784), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(mload(0x20), calldataload(0x06a4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x06c4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x06e4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0704), r), r) + mstore(0x0640, r_eval) + } + { + let coeff := mload(0xa0) + let zeta := mload(ZETA_MPTR) + let r_eval := 0 + r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x0b44), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(coeff, mload(QUOTIENT_EVAL_MPTR), r), r) + for + { + let mptr := 0x0ca4 + let mptr_end := 0x0b44 + } + lt(mptr_end, mptr) + { mptr := sub(mptr, 0x20) } + { + r_eval := addmod(mulmod(r_eval, zeta, r), mulmod(coeff, calldataload(mptr), r), r) + } + for + { + let mptr := 0x0b24 + let mptr_end := 0x09e4 + } + lt(mptr_end, mptr) + { mptr := sub(mptr, 0x20) } + { + r_eval := addmod(mulmod(r_eval, zeta, r), mulmod(coeff, calldataload(mptr), r), r) + } + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x1004), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x0f64), r), r) + for + { + let mptr := 0x09e4 + let mptr_end := 0x0984 + } + lt(mptr_end, mptr) + { mptr := sub(mptr, 0x20) } + { + r_eval := addmod(mulmod(r_eval, zeta, r), mulmod(coeff, calldataload(mptr), r), r) + } + r_eval := mulmod(r_eval, mload(0x05c0), r) + mstore(0x0660, r_eval) + } + { + let zeta := mload(ZETA_MPTR) + let r_eval := 0 + r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x0e84), r), r) + r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x0e44), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x0e64), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x0e24), r), r) + r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x0de4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x0e04), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x0dc4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x0d84), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x0da4), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x0d64), r), r) + r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x0d24), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x0d44), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x0d04), r), r) + r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x0cc4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x0ce4), r), r) + r_eval := mulmod(r_eval, mload(0x05e0), r) + mstore(0x0680, r_eval) + } + { + let zeta := mload(ZETA_MPTR) + let r_eval := 0 + r_eval := addmod(r_eval, mulmod(mload(0x0120), calldataload(0x0f84), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x0140), calldataload(0x0fa4), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(mload(0x0120), calldataload(0x0ee4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x0140), calldataload(0x0f04), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(mload(0x0120), calldataload(0x0ea4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x0140), calldataload(0x0ec4), r), r) + r_eval := mulmod(r_eval, mload(0x0600), r) + mstore(0x06a0, r_eval) + } + { + let zeta := mload(ZETA_MPTR) + let r_eval := 0 + r_eval := addmod(r_eval, mulmod(mload(0x0160), calldataload(0x0fe4), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x0180), calldataload(0x0fc4), r), r) + r_eval := mulmod(r_eval, zeta, r) + r_eval := addmod(r_eval, mulmod(mload(0x0160), calldataload(0x0f44), r), r) + r_eval := addmod(r_eval, mulmod(mload(0x0180), calldataload(0x0f24), r), r) + r_eval := mulmod(r_eval, mload(0x0620), r) + mstore(0x06c0, r_eval) + } + { + let sum := mload(0x20) + sum := addmod(sum, mload(0x40), r) + sum := addmod(sum, mload(0x60), r) + sum := addmod(sum, mload(0x80), r) + mstore(0x06e0, sum) + } + { + let sum := mload(0xa0) + mstore(0x0700, sum) + } + { + let sum := mload(0xc0) + sum := addmod(sum, mload(0xe0), r) + sum := addmod(sum, mload(0x0100), r) + mstore(0x0720, sum) + } + { + let sum := mload(0x0120) + sum := addmod(sum, mload(0x0140), r) + mstore(0x0740, sum) + } + { + let sum := mload(0x0160) + sum := addmod(sum, mload(0x0180), r) + mstore(0x0760, sum) + } + { + for + { + let mptr := 0x00 + let mptr_end := 0xa0 + let sum_mptr := 0x06e0 + } + lt(mptr, mptr_end) + { + mptr := add(mptr, 0x20) + sum_mptr := add(sum_mptr, 0x20) + } + { + mstore(mptr, mload(sum_mptr)) + } + success := batch_invert(success, 0, 0xa0, r) + let r_eval := mulmod(mload(0x80), mload(0x06c0), r) + for + { + let sum_inv_mptr := 0x60 + let sum_inv_mptr_end := 0xa0 + let r_eval_mptr := 0x06a0 + } + lt(sum_inv_mptr, sum_inv_mptr_end) + { + sum_inv_mptr := sub(sum_inv_mptr, 0x20) + r_eval_mptr := sub(r_eval_mptr, 0x20) + } + { + r_eval := mulmod(r_eval, mload(NU_MPTR), r) + r_eval := addmod(r_eval, mulmod(mload(sum_inv_mptr), mload(r_eval_mptr), r), r) + } + mstore(R_EVAL_MPTR, r_eval) + } + { + let nu := mload(NU_MPTR) + mstore(0x00, calldataload(0x01a4)) + mstore(0x20, calldataload(0x01c4)) + for + { + let mptr := 0x0164 + let mptr_end := 0x24 + } + lt(mptr_end, mptr) + { mptr := sub(mptr, 0x40) } + { + success := ec_mul_acc(success, mload(ZETA_MPTR)) + success := ec_add_acc(success, calldataload(mptr), calldataload(add(mptr, 0x20))) + } + mstore(0x80, calldataload(0x05a4)) + mstore(0xa0, calldataload(0x05c4)) + success := ec_mul_tmp(success, mload(ZETA_MPTR)) + success := ec_add_tmp(success, mload(QUOTIENT_X_MPTR), mload(QUOTIENT_Y_MPTR)) + for + { + let mptr := 0x1140 + let mptr_end := 0x0c80 + } + lt(mptr_end, mptr) + { mptr := sub(mptr, 0x40) } + { + success := ec_mul_tmp(success, mload(ZETA_MPTR)) + success := ec_add_tmp(success, mload(mptr), mload(add(mptr, 0x20))) + } + success := ec_mul_tmp(success, mload(ZETA_MPTR)) + success := ec_add_tmp(success, mload(0x0c40), mload(0x0c60)) + success := ec_mul_tmp(success, mload(ZETA_MPTR)) + success := ec_add_tmp(success, mload(0x0c80), mload(0x0ca0)) + success := ec_mul_tmp(success, mload(ZETA_MPTR)) + success := ec_add_tmp(success, calldataload(0x0364), calldataload(0x0384)) + success := ec_mul_tmp(success, mload(ZETA_MPTR)) + success := ec_add_tmp(success, calldataload(0x02e4), calldataload(0x0304)) + for + { + let mptr := 0x0264 + let mptr_end := 0x01a4 + } + lt(mptr_end, mptr) + { mptr := sub(mptr, 0x40) } + { + success := ec_mul_tmp(success, mload(ZETA_MPTR)) + success := ec_add_tmp(success, calldataload(mptr), calldataload(add(mptr, 0x20))) + } + success := ec_mul_tmp(success, mulmod(nu, mload(0x05c0), r)) + success := ec_add_acc(success, mload(0x80), mload(0xa0)) + nu := mulmod(nu, mload(NU_MPTR), r) + mstore(0x80, calldataload(0x04a4)) + mstore(0xa0, calldataload(0x04c4)) + for + { + let mptr := 0x0464 + let mptr_end := 0x0364 + } + lt(mptr_end, mptr) + { mptr := sub(mptr, 0x40) } + { + success := ec_mul_tmp(success, mload(ZETA_MPTR)) + success := ec_add_tmp(success, calldataload(mptr), calldataload(add(mptr, 0x20))) + } + success := ec_mul_tmp(success, mulmod(nu, mload(0x05e0), r)) + success := ec_add_acc(success, mload(0x80), mload(0xa0)) + nu := mulmod(nu, mload(NU_MPTR), r) + mstore(0x80, calldataload(0x0564)) + mstore(0xa0, calldataload(0x0584)) + success := ec_mul_tmp(success, mload(ZETA_MPTR)) + success := ec_add_tmp(success, calldataload(0x0524), calldataload(0x0544)) + success := ec_mul_tmp(success, mload(ZETA_MPTR)) + success := ec_add_tmp(success, calldataload(0x04e4), calldataload(0x0504)) + success := ec_mul_tmp(success, mulmod(nu, mload(0x0600), r)) + success := ec_add_acc(success, mload(0x80), mload(0xa0)) + nu := mulmod(nu, mload(NU_MPTR), r) + mstore(0x80, calldataload(0x0324)) + mstore(0xa0, calldataload(0x0344)) + success := ec_mul_tmp(success, mload(ZETA_MPTR)) + success := ec_add_tmp(success, calldataload(0x02a4), calldataload(0x02c4)) + success := ec_mul_tmp(success, mulmod(nu, mload(0x0620), r)) + success := ec_add_acc(success, mload(0x80), mload(0xa0)) + mstore(0x80, mload(G1_X_MPTR)) + mstore(0xa0, mload(G1_Y_MPTR)) + success := ec_mul_tmp(success, sub(r, mload(R_EVAL_MPTR))) + success := ec_add_acc(success, mload(0x80), mload(0xa0)) + mstore(0x80, calldataload(0x1024)) + mstore(0xa0, calldataload(0x1044)) + success := ec_mul_tmp(success, sub(r, mload(0x0580))) + success := ec_add_acc(success, mload(0x80), mload(0xa0)) + mstore(0x80, calldataload(0x1064)) + mstore(0xa0, calldataload(0x1084)) + success := ec_mul_tmp(success, mload(MU_MPTR)) + success := ec_add_acc(success, mload(0x80), mload(0xa0)) + mstore(PAIRING_LHS_X_MPTR, mload(0x00)) + mstore(PAIRING_LHS_Y_MPTR, mload(0x20)) + mstore(PAIRING_RHS_X_MPTR, calldataload(0x1064)) + mstore(PAIRING_RHS_Y_MPTR, calldataload(0x1084)) + } + } + + // Random linear combine with accumulator + if mload(HAS_ACCUMULATOR_MPTR) { + mstore(0x00, mload(ACC_LHS_X_MPTR)) + mstore(0x20, mload(ACC_LHS_Y_MPTR)) + mstore(0x40, mload(ACC_RHS_X_MPTR)) + mstore(0x60, mload(ACC_RHS_Y_MPTR)) + mstore(0x80, mload(PAIRING_LHS_X_MPTR)) + mstore(0xa0, mload(PAIRING_LHS_Y_MPTR)) + mstore(0xc0, mload(PAIRING_RHS_X_MPTR)) + mstore(0xe0, mload(PAIRING_RHS_Y_MPTR)) + let challenge := mod(keccak256(0x00, 0x100), r) + + // [pairing_lhs] += challenge * [acc_lhs] + success := ec_mul_acc(success, challenge) + success := ec_add_acc(success, mload(PAIRING_LHS_X_MPTR), mload(PAIRING_LHS_Y_MPTR)) + mstore(PAIRING_LHS_X_MPTR, mload(0x00)) + mstore(PAIRING_LHS_Y_MPTR, mload(0x20)) + + // [pairing_rhs] += challenge * [acc_rhs] + mstore(0x00, mload(ACC_RHS_X_MPTR)) + mstore(0x20, mload(ACC_RHS_Y_MPTR)) + success := ec_mul_acc(success, challenge) + success := ec_add_acc(success, mload(PAIRING_RHS_X_MPTR), mload(PAIRING_RHS_Y_MPTR)) + mstore(PAIRING_RHS_X_MPTR, mload(0x00)) + mstore(PAIRING_RHS_Y_MPTR, mload(0x20)) + } + + // Perform pairing + success := ec_pairing( + success, + mload(PAIRING_LHS_X_MPTR), + mload(PAIRING_LHS_Y_MPTR), + mload(PAIRING_RHS_X_MPTR), + mload(PAIRING_RHS_Y_MPTR) + ) + + // Revert if anything fails + if iszero(success) { + revert(0x00, 0x00) + } + + // Return 1 as result if everything succeeds + mstore(0x00, 1) + return(0x00, 0x20) } - 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(0x80, 4243859105650854234153099360242888532593913508399116289013388094561724186169) { let x := calldataload(0x64) mstore(0xc0, x) let y := calldataload(0x84) mstore(0xe0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xa4) mstore(0x100, x) let y := calldataload(0xc4) mstore(0x120, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xe4) mstore(0x140, x) let y := calldataload(0x104) mstore(0x160, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x124) mstore(0x180, x) let y := calldataload(0x144) mstore(0x1a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x164) mstore(0x1c0, x) let y := calldataload(0x184) mstore(0x1e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1a4) mstore(0x200, x) let y := calldataload(0x1c4) mstore(0x220, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1e4) mstore(0x240, x) let y := calldataload(0x204) mstore(0x260, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x224) mstore(0x280, x) let y := calldataload(0x244) mstore(0x2a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x264) mstore(0x2c0, x) let y := calldataload(0x284) mstore(0x2e0, y) success := and(validate_ec_point(x, y), success) }mstore(0x300, keccak256(0x80, 640)){ let hash := mload(0x300) mstore(0x320, mod(hash, f_q)) mstore(0x340, hash) } { let x := calldataload(0x2a4) mstore(0x360, x) let y := calldataload(0x2c4) mstore(0x380, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x2e4) mstore(0x3a0, x) let y := calldataload(0x304) mstore(0x3c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x324) mstore(0x3e0, x) let y := calldataload(0x344) mstore(0x400, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x364) mstore(0x420, x) let y := calldataload(0x384) mstore(0x440, y) success := and(validate_ec_point(x, y), success) }mstore(0x460, keccak256(0x340, 288)){ let hash := mload(0x460) mstore(0x480, mod(hash, f_q)) mstore(0x4a0, hash) }mstore8(0x4c0, 1)mstore(0x4c0, keccak256(0x4a0, 33)){ let hash := mload(0x4c0) mstore(0x4e0, mod(hash, f_q)) mstore(0x500, hash) } { let x := calldataload(0x3a4) mstore(0x520, x) let y := calldataload(0x3c4) mstore(0x540, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x3e4) mstore(0x560, x) let y := calldataload(0x404) mstore(0x580, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x424) mstore(0x5a0, x) let y := calldataload(0x444) mstore(0x5c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x464) mstore(0x5e0, x) let y := calldataload(0x484) mstore(0x600, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4a4) mstore(0x620, x) let y := calldataload(0x4c4) mstore(0x640, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4e4) mstore(0x660, x) let y := calldataload(0x504) mstore(0x680, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x524) mstore(0x6a0, x) let y := calldataload(0x544) mstore(0x6c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x564) mstore(0x6e0, x) let y := calldataload(0x584) mstore(0x700, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x5a4) mstore(0x720, x) let y := calldataload(0x5c4) mstore(0x740, y) success := and(validate_ec_point(x, y), success) }mstore(0x760, keccak256(0x500, 608)){ let hash := mload(0x760) mstore(0x780, mod(hash, f_q)) mstore(0x7a0, hash) } { let x := calldataload(0x5e4) mstore(0x7c0, x) let y := calldataload(0x604) mstore(0x7e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x624) mstore(0x800, x) let y := calldataload(0x644) mstore(0x820, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x664) mstore(0x840, x) let y := calldataload(0x684) mstore(0x860, y) success := and(validate_ec_point(x, y), success) }mstore(0x880, keccak256(0x7a0, 224)){ let hash := mload(0x880) mstore(0x8a0, mod(hash, f_q)) mstore(0x8c0, hash) }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, mod(calldataload(0xc04), f_q))mstore(0xe60, mod(calldataload(0xc24), f_q))mstore(0xe80, mod(calldataload(0xc44), f_q))mstore(0xea0, mod(calldataload(0xc64), f_q))mstore(0xec0, mod(calldataload(0xc84), f_q))mstore(0xee0, mod(calldataload(0xca4), f_q))mstore(0xf00, mod(calldataload(0xcc4), f_q))mstore(0xf20, mod(calldataload(0xce4), f_q))mstore(0xf40, mod(calldataload(0xd04), f_q))mstore(0xf60, mod(calldataload(0xd24), f_q))mstore(0xf80, mod(calldataload(0xd44), f_q))mstore(0xfa0, mod(calldataload(0xd64), f_q))mstore(0xfc0, mod(calldataload(0xd84), f_q))mstore(0xfe0, mod(calldataload(0xda4), f_q))mstore(0x1000, mod(calldataload(0xdc4), f_q))mstore(0x1020, mod(calldataload(0xde4), f_q))mstore(0x1040, mod(calldataload(0xe04), f_q))mstore(0x1060, mod(calldataload(0xe24), f_q))mstore(0x1080, mod(calldataload(0xe44), f_q))mstore(0x10a0, mod(calldataload(0xe64), f_q))mstore(0x10c0, mod(calldataload(0xe84), f_q))mstore(0x10e0, mod(calldataload(0xea4), f_q))mstore(0x1100, mod(calldataload(0xec4), f_q))mstore(0x1120, mod(calldataload(0xee4), f_q))mstore(0x1140, mod(calldataload(0xf04), f_q))mstore(0x1160, mod(calldataload(0xf24), f_q))mstore(0x1180, mod(calldataload(0xf44), f_q))mstore(0x11a0, mod(calldataload(0xf64), f_q))mstore(0x11c0, mod(calldataload(0xf84), f_q))mstore(0x11e0, mod(calldataload(0xfa4), f_q))mstore(0x1200, mod(calldataload(0xfc4), f_q))mstore(0x1220, mod(calldataload(0xfe4), f_q))mstore(0x1240, mod(calldataload(0x1004), f_q))mstore(0x1260, keccak256(0x8c0, 2464)){ let hash := mload(0x1260) mstore(0x1280, mod(hash, f_q)) mstore(0x12a0, hash) }mstore8(0x12c0, 1)mstore(0x12c0, keccak256(0x12a0, 33)){ let hash := mload(0x12c0) mstore(0x12e0, mod(hash, f_q)) mstore(0x1300, hash) } { let x := calldataload(0x1024) mstore(0x1320, x) let y := calldataload(0x1044) mstore(0x1340, y) success := and(validate_ec_point(x, y), success) }mstore(0x1360, keccak256(0x1300, 96)){ let hash := mload(0x1360) mstore(0x1380, mod(hash, f_q)) mstore(0x13a0, hash) } { let x := calldataload(0x1064) mstore(0x13c0, x) let y := calldataload(0x1084) mstore(0x13e0, y) success := and(validate_ec_point(x, y), success) }mstore(0x1400, mulmod(mload(0x8a0), mload(0x8a0), f_q))mstore(0x1420, mulmod(mload(0x1400), mload(0x1400), f_q))mstore(0x1440, mulmod(mload(0x1420), mload(0x1420), f_q))mstore(0x1460, mulmod(mload(0x1440), mload(0x1440), f_q))mstore(0x1480, mulmod(mload(0x1460), mload(0x1460), f_q))mstore(0x14a0, mulmod(mload(0x1480), mload(0x1480), f_q))mstore(0x14c0, mulmod(mload(0x14a0), mload(0x14a0), f_q))mstore(0x14e0, mulmod(mload(0x14c0), mload(0x14c0), f_q))mstore(0x1500, mulmod(mload(0x14e0), mload(0x14e0), f_q))mstore(0x1520, mulmod(mload(0x1500), mload(0x1500), f_q))mstore(0x1540, mulmod(mload(0x1520), mload(0x1520), f_q))mstore(0x1560, mulmod(mload(0x1540), mload(0x1540), f_q))mstore(0x1580, mulmod(mload(0x1560), mload(0x1560), f_q))mstore(0x15a0, mulmod(mload(0x1580), mload(0x1580), f_q))mstore(0x15c0, mulmod(mload(0x15a0), mload(0x15a0), f_q))mstore(0x15e0, mulmod(mload(0x15c0), mload(0x15c0), f_q))mstore(0x1600, mulmod(mload(0x15e0), mload(0x15e0), f_q))mstore(0x1620, mulmod(mload(0x1600), mload(0x1600), f_q))mstore(0x1640, mulmod(mload(0x1620), mload(0x1620), f_q))mstore(0x1660, mulmod(mload(0x1640), mload(0x1640), f_q))mstore(0x1680, mulmod(mload(0x1660), mload(0x1660), f_q))mstore(0x16a0, mulmod(mload(0x1680), mload(0x1680), f_q))mstore(0x16c0, addmod(mload(0x16a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(0x16e0, mulmod(mload(0x16c0), 21888237653275510688422624196183639687472264873923820041627027729598873448513, f_q))mstore(0x1700, mulmod(mload(0x16e0), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x1720, addmod(mload(0x8a0), 8662456992307693229192232929891638461323994988937738840793806641202669341572, f_q))mstore(0x1740, mulmod(mload(0x16e0), 10939663269433627367777756708678102241564365262857670666700619874077960926249, f_q))mstore(0x1760, addmod(mload(0x8a0), 10948579602405647854468649036579172846983999137558363676997584312497847569368, f_q))mstore(0x1780, mulmod(mload(0x16e0), 11016257578652593686382655500910603527869149377564754001549454008164059876499, f_q))mstore(0x17a0, addmod(mload(0x8a0), 10871985293186681535863750244346671560679215022851280342148750178411748619118, f_q))mstore(0x17c0, mulmod(mload(0x16e0), 15402826414547299628414612080036060696555554914079673875872749760617770134879, f_q))mstore(0x17e0, addmod(mload(0x8a0), 6485416457291975593831793665221214391992809486336360467825454425958038360738, f_q))mstore(0x1800, mulmod(mload(0x16e0), 21710372849001950800533397158415938114909991150039389063546734567764856596059, f_q))mstore(0x1820, addmod(mload(0x8a0), 177870022837324421713008586841336973638373250376645280151469618810951899558, f_q))mstore(0x1840, mulmod(mload(0x16e0), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q))mstore(0x1860, addmod(mload(0x8a0), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q))mstore(0x1880, mulmod(mload(0x16e0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x18a0, addmod(mload(0x8a0), 13154116519010929542673167886091370382741775939114889923107781597533678454429, f_q))mstore(0x18c0, mulmod(mload(0x16e0), 1, f_q))mstore(0x18e0, addmod(mload(0x8a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)){ let prod := mload(0x1720) prod := mulmod(mload(0x1760), prod, f_q) mstore(0x1900, prod) prod := mulmod(mload(0x17a0), prod, f_q) mstore(0x1920, prod) prod := mulmod(mload(0x17e0), prod, f_q) mstore(0x1940, prod) prod := mulmod(mload(0x1820), prod, f_q) mstore(0x1960, prod) prod := mulmod(mload(0x1860), prod, f_q) mstore(0x1980, prod) prod := mulmod(mload(0x18a0), prod, f_q) mstore(0x19a0, prod) prod := mulmod(mload(0x18e0), prod, f_q) mstore(0x19c0, prod) prod := mulmod(mload(0x16c0), prod, f_q) mstore(0x19e0, prod) }mstore(0x1a20, 32)mstore(0x1a40, 32)mstore(0x1a60, 32)mstore(0x1a80, mload(0x19e0))mstore(0x1aa0, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x1ac0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x1a20, 0xc0, 0x1a00, 0x20), 1), success){ let inv := mload(0x1a00) let v v := mload(0x16c0) mstore(0x16c0, mulmod(mload(0x19c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18e0) mstore(0x18e0, mulmod(mload(0x19a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18a0) mstore(0x18a0, mulmod(mload(0x1980), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1860) mstore(0x1860, mulmod(mload(0x1960), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1820) mstore(0x1820, mulmod(mload(0x1940), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x17e0) mstore(0x17e0, mulmod(mload(0x1920), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x17a0) mstore(0x17a0, mulmod(mload(0x1900), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1760) mstore(0x1760, mulmod(mload(0x1720), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x1720, inv) }mstore(0x1ae0, mulmod(mload(0x1700), mload(0x1720), f_q))mstore(0x1b00, mulmod(mload(0x1740), mload(0x1760), f_q))mstore(0x1b20, mulmod(mload(0x1780), mload(0x17a0), f_q))mstore(0x1b40, mulmod(mload(0x17c0), mload(0x17e0), f_q))mstore(0x1b60, mulmod(mload(0x1800), mload(0x1820), f_q))mstore(0x1b80, mulmod(mload(0x1840), mload(0x1860), f_q))mstore(0x1ba0, mulmod(mload(0x1880), mload(0x18a0), f_q))mstore(0x1bc0, mulmod(mload(0x18c0), mload(0x18e0), f_q)){ let result := mulmod(mload(0x1bc0), mload(0xa0), f_q)mstore(0x1be0, result) }mstore(0x1c00, mulmod(mload(0x920), mload(0x900), f_q))mstore(0x1c20, addmod(mload(0x8e0), mload(0x1c00), f_q))mstore(0x1c40, addmod(mload(0x1c20), sub(f_q, mload(0x940)), f_q))mstore(0x1c60, mulmod(mload(0x1c40), mload(0xcc0), f_q))mstore(0x1c80, mulmod(mload(0x780), mload(0x1c60), f_q))mstore(0x1ca0, mulmod(mload(0x9a0), mload(0x980), f_q))mstore(0x1cc0, addmod(mload(0x960), mload(0x1ca0), f_q))mstore(0x1ce0, addmod(mload(0x1cc0), sub(f_q, mload(0x9c0)), f_q))mstore(0x1d00, mulmod(mload(0x1ce0), mload(0xce0), f_q))mstore(0x1d20, addmod(mload(0x1c80), mload(0x1d00), f_q))mstore(0x1d40, mulmod(mload(0x780), mload(0x1d20), f_q))mstore(0x1d60, mulmod(mload(0xa20), mload(0xa00), f_q))mstore(0x1d80, addmod(mload(0x9e0), mload(0x1d60), f_q))mstore(0x1da0, addmod(mload(0x1d80), sub(f_q, mload(0xa40)), f_q))mstore(0x1dc0, mulmod(mload(0x1da0), mload(0xd00), f_q))mstore(0x1de0, addmod(mload(0x1d40), mload(0x1dc0), f_q))mstore(0x1e00, mulmod(mload(0x780), mload(0x1de0), f_q))mstore(0x1e20, mulmod(mload(0xaa0), mload(0xa80), f_q))mstore(0x1e40, addmod(mload(0xa60), mload(0x1e20), f_q))mstore(0x1e60, addmod(mload(0x1e40), sub(f_q, mload(0xac0)), f_q))mstore(0x1e80, mulmod(mload(0x1e60), mload(0xd20), f_q))mstore(0x1ea0, addmod(mload(0x1e00), mload(0x1e80), f_q))mstore(0x1ec0, mulmod(mload(0x780), mload(0x1ea0), f_q))mstore(0x1ee0, mulmod(mload(0xb20), mload(0xb00), f_q))mstore(0x1f00, addmod(mload(0xae0), mload(0x1ee0), f_q))mstore(0x1f20, addmod(mload(0x1f00), sub(f_q, mload(0xb40)), f_q))mstore(0x1f40, mulmod(mload(0x1f20), mload(0xd40), f_q))mstore(0x1f60, addmod(mload(0x1ec0), mload(0x1f40), f_q))mstore(0x1f80, mulmod(mload(0x780), mload(0x1f60), f_q))mstore(0x1fa0, mulmod(mload(0xba0), mload(0xb80), f_q))mstore(0x1fc0, addmod(mload(0xb60), mload(0x1fa0), f_q))mstore(0x1fe0, addmod(mload(0x1fc0), sub(f_q, mload(0xbc0)), f_q))mstore(0x2000, mulmod(mload(0x1fe0), mload(0xd60), f_q))mstore(0x2020, addmod(mload(0x1f80), mload(0x2000), f_q))mstore(0x2040, mulmod(mload(0x780), mload(0x2020), f_q))mstore(0x2060, addmod(1, sub(f_q, mload(0xf00)), f_q))mstore(0x2080, mulmod(mload(0x2060), mload(0x1bc0), f_q))mstore(0x20a0, addmod(mload(0x2040), mload(0x2080), f_q))mstore(0x20c0, mulmod(mload(0x780), mload(0x20a0), f_q))mstore(0x20e0, mulmod(mload(0x10e0), mload(0x10e0), f_q))mstore(0x2100, addmod(mload(0x20e0), sub(f_q, mload(0x10e0)), f_q))mstore(0x2120, mulmod(mload(0x2100), mload(0x1ae0), f_q))mstore(0x2140, addmod(mload(0x20c0), mload(0x2120), f_q))mstore(0x2160, mulmod(mload(0x780), mload(0x2140), f_q))mstore(0x2180, addmod(mload(0xf60), sub(f_q, mload(0xf40)), f_q))mstore(0x21a0, mulmod(mload(0x2180), mload(0x1bc0), f_q))mstore(0x21c0, addmod(mload(0x2160), mload(0x21a0), f_q))mstore(0x21e0, mulmod(mload(0x780), mload(0x21c0), f_q))mstore(0x2200, addmod(mload(0xfc0), sub(f_q, mload(0xfa0)), f_q))mstore(0x2220, mulmod(mload(0x2200), mload(0x1bc0), f_q))mstore(0x2240, addmod(mload(0x21e0), mload(0x2220), f_q))mstore(0x2260, mulmod(mload(0x780), mload(0x2240), f_q))mstore(0x2280, addmod(mload(0x1020), sub(f_q, mload(0x1000)), f_q))mstore(0x22a0, mulmod(mload(0x2280), mload(0x1bc0), f_q))mstore(0x22c0, addmod(mload(0x2260), mload(0x22a0), f_q))mstore(0x22e0, mulmod(mload(0x780), mload(0x22c0), f_q))mstore(0x2300, addmod(mload(0x1080), sub(f_q, mload(0x1060)), f_q))mstore(0x2320, mulmod(mload(0x2300), mload(0x1bc0), f_q))mstore(0x2340, addmod(mload(0x22e0), mload(0x2320), f_q))mstore(0x2360, mulmod(mload(0x780), mload(0x2340), f_q))mstore(0x2380, addmod(mload(0x10e0), sub(f_q, mload(0x10c0)), f_q))mstore(0x23a0, mulmod(mload(0x2380), mload(0x1bc0), f_q))mstore(0x23c0, addmod(mload(0x2360), mload(0x23a0), f_q))mstore(0x23e0, mulmod(mload(0x780), mload(0x23c0), f_q))mstore(0x2400, addmod(1, sub(f_q, mload(0x1ae0)), f_q))mstore(0x2420, addmod(mload(0x1b00), mload(0x1b20), f_q))mstore(0x2440, addmod(mload(0x2420), mload(0x1b40), f_q))mstore(0x2460, addmod(mload(0x2440), mload(0x1b60), f_q))mstore(0x2480, addmod(mload(0x2460), mload(0x1b80), f_q))mstore(0x24a0, addmod(mload(0x2480), mload(0x1ba0), f_q))mstore(0x24c0, addmod(mload(0x2400), sub(f_q, mload(0x24a0)), f_q))mstore(0x24e0, mulmod(mload(0xda0), mload(0x480), f_q))mstore(0x2500, addmod(mload(0xc40), mload(0x24e0), f_q))mstore(0x2520, addmod(mload(0x2500), mload(0x4e0), f_q))mstore(0x2540, mulmod(mload(0xdc0), mload(0x480), f_q))mstore(0x2560, addmod(mload(0x8e0), mload(0x2540), f_q))mstore(0x2580, addmod(mload(0x2560), mload(0x4e0), f_q))mstore(0x25a0, mulmod(mload(0x2580), mload(0x2520), f_q))mstore(0x25c0, mulmod(mload(0x25a0), mload(0xf20), f_q))mstore(0x25e0, mulmod(1, mload(0x480), f_q))mstore(0x2600, mulmod(mload(0x8a0), mload(0x25e0), f_q))mstore(0x2620, addmod(mload(0xc40), mload(0x2600), f_q))mstore(0x2640, addmod(mload(0x2620), mload(0x4e0), f_q))mstore(0x2660, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x480), f_q))mstore(0x2680, mulmod(mload(0x8a0), mload(0x2660), f_q))mstore(0x26a0, addmod(mload(0x8e0), mload(0x2680), f_q))mstore(0x26c0, addmod(mload(0x26a0), mload(0x4e0), f_q))mstore(0x26e0, mulmod(mload(0x26c0), mload(0x2640), f_q))mstore(0x2700, mulmod(mload(0x26e0), mload(0xf00), f_q))mstore(0x2720, addmod(mload(0x25c0), sub(f_q, mload(0x2700)), f_q))mstore(0x2740, mulmod(mload(0x2720), mload(0x24c0), f_q))mstore(0x2760, addmod(mload(0x23e0), mload(0x2740), f_q))mstore(0x2780, mulmod(mload(0x780), mload(0x2760), f_q))mstore(0x27a0, mulmod(mload(0xde0), mload(0x480), f_q))mstore(0x27c0, addmod(mload(0x960), mload(0x27a0), f_q))mstore(0x27e0, addmod(mload(0x27c0), mload(0x4e0), f_q))mstore(0x2800, mulmod(mload(0xe00), mload(0x480), f_q))mstore(0x2820, addmod(mload(0x9e0), mload(0x2800), f_q))mstore(0x2840, addmod(mload(0x2820), mload(0x4e0), f_q))mstore(0x2860, mulmod(mload(0x2840), mload(0x27e0), f_q))mstore(0x2880, mulmod(mload(0x2860), mload(0xf80), f_q))mstore(0x28a0, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x480), f_q))mstore(0x28c0, mulmod(mload(0x8a0), mload(0x28a0), f_q))mstore(0x28e0, addmod(mload(0x960), mload(0x28c0), f_q))mstore(0x2900, addmod(mload(0x28e0), mload(0x4e0), f_q))mstore(0x2920, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x480), f_q))mstore(0x2940, mulmod(mload(0x8a0), mload(0x2920), f_q))mstore(0x2960, addmod(mload(0x9e0), mload(0x2940), f_q))mstore(0x2980, addmod(mload(0x2960), mload(0x4e0), f_q))mstore(0x29a0, mulmod(mload(0x2980), mload(0x2900), f_q))mstore(0x29c0, mulmod(mload(0x29a0), mload(0xf60), f_q))mstore(0x29e0, addmod(mload(0x2880), sub(f_q, mload(0x29c0)), f_q))mstore(0x2a00, mulmod(mload(0x29e0), mload(0x24c0), f_q))mstore(0x2a20, addmod(mload(0x2780), mload(0x2a00), f_q))mstore(0x2a40, mulmod(mload(0x780), mload(0x2a20), f_q))mstore(0x2a60, mulmod(mload(0xe20), mload(0x480), f_q))mstore(0x2a80, addmod(mload(0xa60), mload(0x2a60), f_q))mstore(0x2aa0, addmod(mload(0x2a80), mload(0x4e0), f_q))mstore(0x2ac0, mulmod(mload(0xe40), mload(0x480), f_q))mstore(0x2ae0, addmod(mload(0xae0), mload(0x2ac0), f_q))mstore(0x2b00, addmod(mload(0x2ae0), mload(0x4e0), f_q))mstore(0x2b20, mulmod(mload(0x2b00), mload(0x2aa0), f_q))mstore(0x2b40, mulmod(mload(0x2b20), mload(0xfe0), f_q))mstore(0x2b60, mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(0x480), f_q))mstore(0x2b80, mulmod(mload(0x8a0), mload(0x2b60), f_q))mstore(0x2ba0, addmod(mload(0xa60), mload(0x2b80), f_q))mstore(0x2bc0, addmod(mload(0x2ba0), mload(0x4e0), f_q))mstore(0x2be0, mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(0x480), f_q))mstore(0x2c00, mulmod(mload(0x8a0), mload(0x2be0), f_q))mstore(0x2c20, addmod(mload(0xae0), mload(0x2c00), f_q))mstore(0x2c40, addmod(mload(0x2c20), mload(0x4e0), f_q))mstore(0x2c60, mulmod(mload(0x2c40), mload(0x2bc0), f_q))mstore(0x2c80, mulmod(mload(0x2c60), mload(0xfc0), f_q))mstore(0x2ca0, addmod(mload(0x2b40), sub(f_q, mload(0x2c80)), f_q))mstore(0x2cc0, mulmod(mload(0x2ca0), mload(0x24c0), f_q))mstore(0x2ce0, addmod(mload(0x2a40), mload(0x2cc0), f_q))mstore(0x2d00, mulmod(mload(0x780), mload(0x2ce0), f_q))mstore(0x2d20, mulmod(mload(0xe60), mload(0x480), f_q))mstore(0x2d40, addmod(mload(0xb60), mload(0x2d20), f_q))mstore(0x2d60, addmod(mload(0x2d40), mload(0x4e0), f_q))mstore(0x2d80, mulmod(mload(0xe80), mload(0x480), f_q))mstore(0x2da0, addmod(mload(0xbe0), mload(0x2d80), f_q))mstore(0x2dc0, addmod(mload(0x2da0), mload(0x4e0), f_q))mstore(0x2de0, mulmod(mload(0x2dc0), mload(0x2d60), f_q))mstore(0x2e00, mulmod(mload(0x2de0), mload(0x1040), f_q))mstore(0x2e20, mulmod(5625741653535312224677218588085279924365897425605943700675464992185016992283, mload(0x480), f_q))mstore(0x2e40, mulmod(mload(0x8a0), mload(0x2e20), f_q))mstore(0x2e60, addmod(mload(0xb60), mload(0x2e40), f_q))mstore(0x2e80, addmod(mload(0x2e60), mload(0x4e0), f_q))mstore(0x2ea0, mulmod(14704729814417906439424896605881467874595262020190401576785074330126828718155, mload(0x480), f_q))mstore(0x2ec0, mulmod(mload(0x8a0), mload(0x2ea0), f_q))mstore(0x2ee0, addmod(mload(0xbe0), mload(0x2ec0), f_q))mstore(0x2f00, addmod(mload(0x2ee0), mload(0x4e0), f_q))mstore(0x2f20, mulmod(mload(0x2f00), mload(0x2e80), f_q))mstore(0x2f40, mulmod(mload(0x2f20), mload(0x1020), f_q))mstore(0x2f60, addmod(mload(0x2e00), sub(f_q, mload(0x2f40)), f_q))mstore(0x2f80, mulmod(mload(0x2f60), mload(0x24c0), f_q))mstore(0x2fa0, addmod(mload(0x2d00), mload(0x2f80), f_q))mstore(0x2fc0, mulmod(mload(0x780), mload(0x2fa0), f_q))mstore(0x2fe0, mulmod(mload(0xea0), mload(0x480), f_q))mstore(0x3000, addmod(mload(0xc00), mload(0x2fe0), f_q))mstore(0x3020, addmod(mload(0x3000), mload(0x4e0), f_q))mstore(0x3040, mulmod(mload(0xec0), mload(0x480), f_q))mstore(0x3060, addmod(mload(0xc20), mload(0x3040), f_q))mstore(0x3080, addmod(mload(0x3060), mload(0x4e0), f_q))mstore(0x30a0, mulmod(mload(0x3080), mload(0x3020), f_q))mstore(0x30c0, mulmod(mload(0x30a0), mload(0x10a0), f_q))mstore(0x30e0, mulmod(8343274462013750416000956870576256937330525306073862550863787263304548803879, mload(0x480), f_q))mstore(0x3100, mulmod(mload(0x8a0), mload(0x30e0), f_q))mstore(0x3120, addmod(mload(0xc00), mload(0x3100), f_q))mstore(0x3140, addmod(mload(0x3120), mload(0x4e0), f_q))mstore(0x3160, mulmod(20928372310071051017340352686640453451620397549739756658327314209761852842004, mload(0x480), f_q))mstore(0x3180, mulmod(mload(0x8a0), mload(0x3160), f_q))mstore(0x31a0, addmod(mload(0xc20), mload(0x3180), f_q))mstore(0x31c0, addmod(mload(0x31a0), mload(0x4e0), f_q))mstore(0x31e0, mulmod(mload(0x31c0), mload(0x3140), f_q))mstore(0x3200, mulmod(mload(0x31e0), mload(0x1080), f_q))mstore(0x3220, addmod(mload(0x30c0), sub(f_q, mload(0x3200)), f_q))mstore(0x3240, mulmod(mload(0x3220), mload(0x24c0), f_q))mstore(0x3260, addmod(mload(0x2fc0), mload(0x3240), f_q))mstore(0x3280, mulmod(mload(0x780), mload(0x3260), f_q))mstore(0x32a0, mulmod(mload(0xee0), mload(0x480), f_q))mstore(0x32c0, addmod(mload(0x1be0), mload(0x32a0), f_q))mstore(0x32e0, addmod(mload(0x32c0), mload(0x4e0), f_q))mstore(0x3300, mulmod(mload(0x32e0), mload(0x1100), f_q))mstore(0x3320, mulmod(15845651941796975697993789271154426079663327509658641548785793587449119139335, mload(0x480), f_q))mstore(0x3340, mulmod(mload(0x8a0), mload(0x3320), f_q))mstore(0x3360, addmod(mload(0x1be0), mload(0x3340), f_q))mstore(0x3380, addmod(mload(0x3360), mload(0x4e0), f_q))mstore(0x33a0, mulmod(mload(0x3380), mload(0x10e0), f_q))mstore(0x33c0, addmod(mload(0x3300), sub(f_q, mload(0x33a0)), f_q))mstore(0x33e0, mulmod(mload(0x33c0), mload(0x24c0), f_q))mstore(0x3400, addmod(mload(0x3280), mload(0x33e0), f_q))mstore(0x3420, mulmod(mload(0x780), mload(0x3400), f_q))mstore(0x3440, addmod(1, sub(f_q, mload(0x1120)), f_q))mstore(0x3460, mulmod(mload(0x3440), mload(0x1bc0), f_q))mstore(0x3480, addmod(mload(0x3420), mload(0x3460), f_q))mstore(0x34a0, mulmod(mload(0x780), mload(0x3480), f_q))mstore(0x34c0, mulmod(mload(0x1120), mload(0x1120), f_q))mstore(0x34e0, addmod(mload(0x34c0), sub(f_q, mload(0x1120)), f_q))mstore(0x3500, mulmod(mload(0x34e0), mload(0x1ae0), f_q))mstore(0x3520, addmod(mload(0x34a0), mload(0x3500), f_q))mstore(0x3540, mulmod(mload(0x780), mload(0x3520), f_q))mstore(0x3560, addmod(mload(0x1160), mload(0x480), f_q))mstore(0x3580, mulmod(mload(0x3560), mload(0x1140), f_q))mstore(0x35a0, addmod(mload(0x11a0), mload(0x4e0), f_q))mstore(0x35c0, mulmod(mload(0x35a0), mload(0x3580), f_q))mstore(0x35e0, addmod(mload(0xbe0), mload(0x480), f_q))mstore(0x3600, mulmod(mload(0x35e0), mload(0x1120), f_q))mstore(0x3620, addmod(mload(0xc60), mload(0x4e0), f_q))mstore(0x3640, mulmod(mload(0x3620), mload(0x3600), f_q))mstore(0x3660, addmod(mload(0x35c0), sub(f_q, mload(0x3640)), f_q))mstore(0x3680, mulmod(mload(0x3660), mload(0x24c0), f_q))mstore(0x36a0, addmod(mload(0x3540), mload(0x3680), f_q))mstore(0x36c0, mulmod(mload(0x780), mload(0x36a0), f_q))mstore(0x36e0, addmod(mload(0x1160), sub(f_q, mload(0x11a0)), f_q))mstore(0x3700, mulmod(mload(0x36e0), mload(0x1bc0), f_q))mstore(0x3720, addmod(mload(0x36c0), mload(0x3700), f_q))mstore(0x3740, mulmod(mload(0x780), mload(0x3720), f_q))mstore(0x3760, mulmod(mload(0x36e0), mload(0x24c0), f_q))mstore(0x3780, addmod(mload(0x1160), sub(f_q, mload(0x1180)), f_q))mstore(0x37a0, mulmod(mload(0x3780), mload(0x3760), f_q))mstore(0x37c0, addmod(mload(0x3740), mload(0x37a0), f_q))mstore(0x37e0, mulmod(mload(0x780), mload(0x37c0), f_q))mstore(0x3800, addmod(1, sub(f_q, mload(0x11c0)), f_q))mstore(0x3820, mulmod(mload(0x3800), mload(0x1bc0), f_q))mstore(0x3840, addmod(mload(0x37e0), mload(0x3820), f_q))mstore(0x3860, mulmod(mload(0x780), mload(0x3840), f_q))mstore(0x3880, mulmod(mload(0x11c0), mload(0x11c0), f_q))mstore(0x38a0, addmod(mload(0x3880), sub(f_q, mload(0x11c0)), f_q))mstore(0x38c0, mulmod(mload(0x38a0), mload(0x1ae0), f_q))mstore(0x38e0, addmod(mload(0x3860), mload(0x38c0), f_q))mstore(0x3900, mulmod(mload(0x780), mload(0x38e0), f_q))mstore(0x3920, addmod(mload(0x1200), mload(0x480), f_q))mstore(0x3940, mulmod(mload(0x3920), mload(0x11e0), f_q))mstore(0x3960, addmod(mload(0x1240), mload(0x4e0), f_q))mstore(0x3980, mulmod(mload(0x3960), mload(0x3940), f_q))mstore(0x39a0, mulmod(mload(0x320), mload(0xc00), f_q))mstore(0x39c0, addmod(mload(0x39a0), mload(0xc20), f_q))mstore(0x39e0, addmod(mload(0x39c0), mload(0x480), f_q))mstore(0x3a00, mulmod(mload(0x39e0), mload(0x11c0), f_q))mstore(0x3a20, mulmod(mload(0x320), mload(0xc80), f_q))mstore(0x3a40, addmod(mload(0x3a20), mload(0xca0), f_q))mstore(0x3a60, addmod(mload(0x3a40), mload(0x4e0), f_q))mstore(0x3a80, mulmod(mload(0x3a60), mload(0x3a00), f_q))mstore(0x3aa0, addmod(mload(0x3980), sub(f_q, mload(0x3a80)), f_q))mstore(0x3ac0, mulmod(mload(0x3aa0), mload(0x24c0), f_q))mstore(0x3ae0, addmod(mload(0x3900), mload(0x3ac0), f_q))mstore(0x3b00, mulmod(mload(0x780), mload(0x3ae0), f_q))mstore(0x3b20, addmod(mload(0x1200), sub(f_q, mload(0x1240)), f_q))mstore(0x3b40, mulmod(mload(0x3b20), mload(0x1bc0), f_q))mstore(0x3b60, addmod(mload(0x3b00), mload(0x3b40), f_q))mstore(0x3b80, mulmod(mload(0x780), mload(0x3b60), f_q))mstore(0x3ba0, mulmod(mload(0x3b20), mload(0x24c0), f_q))mstore(0x3bc0, addmod(mload(0x1200), sub(f_q, mload(0x1220)), f_q))mstore(0x3be0, mulmod(mload(0x3bc0), mload(0x3ba0), f_q))mstore(0x3c00, addmod(mload(0x3b80), mload(0x3be0), f_q))mstore(0x3c20, mulmod(mload(0x16a0), mload(0x16a0), f_q))mstore(0x3c40, mulmod(mload(0x3c20), mload(0x16a0), f_q))mstore(0x3c60, mulmod(1, mload(0x16a0), f_q))mstore(0x3c80, mulmod(1, mload(0x3c20), f_q))mstore(0x3ca0, mulmod(mload(0x3c00), mload(0x16c0), f_q))mstore(0x3cc0, mulmod(mload(0x1400), mload(0x8a0), f_q))mstore(0x3ce0, mulmod(mload(0x3cc0), mload(0x8a0), f_q))mstore(0x3d00, mulmod(mload(0x8a0), 1, f_q))mstore(0x3d20, addmod(mload(0x1380), sub(f_q, mload(0x3d00)), f_q))mstore(0x3d40, mulmod(mload(0x8a0), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q))mstore(0x3d60, addmod(mload(0x1380), sub(f_q, mload(0x3d40)), f_q))mstore(0x3d80, mulmod(mload(0x8a0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x3da0, addmod(mload(0x1380), sub(f_q, mload(0x3d80)), f_q))mstore(0x3dc0, mulmod(mload(0x8a0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q))mstore(0x3de0, addmod(mload(0x1380), sub(f_q, mload(0x3dc0)), f_q))mstore(0x3e00, mulmod(mload(0x8a0), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q))mstore(0x3e20, addmod(mload(0x1380), sub(f_q, mload(0x3e00)), f_q))mstore(0x3e40, mulmod(mload(0x8a0), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x3e60, addmod(mload(0x1380), sub(f_q, mload(0x3e40)), f_q)){ let result := mulmod(mload(0x1380), mulmod(mload(0x3cc0), 3544324119167359571073009690693121464267965232733679586767649244433889388945, f_q), f_q)result := addmod(mulmod(mload(0x8a0), mulmod(mload(0x3cc0), 18343918752671915651173396054564153624280399167682354756930554942141919106672, f_q), f_q), result, f_q)mstore(0x3e80, result) }{ let result := mulmod(mload(0x1380), mulmod(mload(0x3cc0), 3860370625838117017501327045244227871206764201116468958063324100051382735289, f_q), f_q)result := addmod(mulmod(mload(0x8a0), mulmod(mload(0x3cc0), 21616901807277407275624036604424346159916096890712898844034238973395610537327, f_q), f_q), result, f_q)mstore(0x3ea0, result) }{ let result := mulmod(mload(0x1380), mulmod(mload(0x3cc0), 21616901807277407275624036604424346159916096890712898844034238973395610537327, f_q), f_q)result := addmod(mulmod(mload(0x8a0), mulmod(mload(0x3cc0), 889236556954614024749610889108815341999962898269585485843658889664869519176, f_q), f_q), result, f_q)mstore(0x3ec0, result) }{ let result := mulmod(mload(0x1380), mulmod(mload(0x3cc0), 3209408481237076479025468386201293941554240476766691830436732310949352383503, f_q), f_q)result := addmod(mulmod(mload(0x8a0), mulmod(mload(0x3cc0), 12080394110851700286656425387058292751221637853580771255128961096834426654570, f_q), f_q), result, f_q)mstore(0x3ee0, result) }mstore(0x3f00, mulmod(1, mload(0x3d20), f_q))mstore(0x3f20, mulmod(mload(0x3f00), mload(0x3de0), f_q))mstore(0x3f40, mulmod(mload(0x3f20), mload(0x3d60), f_q))mstore(0x3f60, mulmod(mload(0x3f40), mload(0x3e20), f_q)){ let result := mulmod(mload(0x1380), 1, f_q)result := addmod(mulmod(mload(0x8a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(0x3f80, result) }{ let result := mulmod(mload(0x1380), mulmod(mload(0x1400), 8390819244605639573390577733158868133682115698337564550620146375401109684432, f_q), f_q)result := addmod(mulmod(mload(0x8a0), mulmod(mload(0x1400), 13497423627233635648855828012098406954866248702078469793078057811174698811185, f_q), f_q), result, f_q)mstore(0x3fa0, result) }{ let result := mulmod(mload(0x1380), mulmod(mload(0x1400), 14389468897523033212448771694851898440525479866834419679925499462425232628530, f_q), f_q)result := addmod(mulmod(mload(0x8a0), mulmod(mload(0x1400), 10771624105926513343199793365135253961557027396599172824137553349410803667382, f_q), f_q), result, f_q)mstore(0x3fc0, result) }{ let result := mulmod(mload(0x1380), mulmod(mload(0x1400), 8021781111580269725587432039983408559403601261632071736490564397134126857583, f_q), f_q)result := addmod(mulmod(mload(0x8a0), mulmod(mload(0x1400), 13263758384809315129424392494083758423780924407584659157289746760747196496964, f_q), f_q), result, f_q)mstore(0x3fe0, result) }mstore(0x4000, mulmod(mload(0x3f20), mload(0x3e60), f_q)){ let result := mulmod(mload(0x1380), mulmod(mload(0x8a0), 10676941854703594198666993839846402519342119846958189386823924046696287912228, f_q), f_q)result := addmod(mulmod(mload(0x8a0), mulmod(mload(0x8a0), 11211301017135681023579411905410872569206244553457844956874280139879520583389, f_q), f_q), result, f_q)mstore(0x4020, result) }{ let result := mulmod(mload(0x1380), mulmod(mload(0x8a0), 11211301017135681023579411905410872569206244553457844956874280139879520583389, f_q), f_q)result := addmod(mulmod(mload(0x8a0), mulmod(mload(0x8a0), 9784896584414196635074050157092911033682888682202239499976482395445754094883, f_q), f_q), result, f_q)mstore(0x4040, result) }{ let result := mulmod(mload(0x1380), mulmod(mload(0x8a0), 13154116519010929542673167886091370382741775939114889923107781597533678454430, f_q), f_q)result := addmod(mulmod(mload(0x8a0), mulmod(mload(0x8a0), 8734126352828345679573237859165904705806588461301144420590422589042130041187, f_q), f_q), result, f_q)mstore(0x4060, result) }{ let result := mulmod(mload(0x1380), mulmod(mload(0x8a0), 8734126352828345679573237859165904705806588461301144420590422589042130041187, f_q), f_q)result := addmod(mulmod(mload(0x8a0), mulmod(mload(0x8a0), 5948611796446669599396300148285100597158677068822442314729736978662760216172, f_q), f_q), result, f_q)mstore(0x4080, result) }mstore(0x40a0, mulmod(mload(0x3f00), mload(0x3da0), f_q)){ let prod := mload(0x3e80) prod := mulmod(mload(0x3ea0), prod, f_q) mstore(0x40c0, prod) prod := mulmod(mload(0x3ec0), prod, f_q) mstore(0x40e0, prod) prod := mulmod(mload(0x3ee0), prod, f_q) mstore(0x4100, prod) prod := mulmod(mload(0x3f80), prod, f_q) mstore(0x4120, prod) prod := mulmod(mload(0x3f00), prod, f_q) mstore(0x4140, prod) prod := mulmod(mload(0x3fa0), prod, f_q) mstore(0x4160, prod) prod := mulmod(mload(0x3fc0), prod, f_q) mstore(0x4180, prod) prod := mulmod(mload(0x3fe0), prod, f_q) mstore(0x41a0, prod) prod := mulmod(mload(0x4000), prod, f_q) mstore(0x41c0, prod) prod := mulmod(mload(0x4020), prod, f_q) mstore(0x41e0, prod) prod := mulmod(mload(0x4040), prod, f_q) mstore(0x4200, prod) prod := mulmod(mload(0x3f20), prod, f_q) mstore(0x4220, prod) prod := mulmod(mload(0x4060), prod, f_q) mstore(0x4240, prod) prod := mulmod(mload(0x4080), prod, f_q) mstore(0x4260, prod) prod := mulmod(mload(0x40a0), prod, f_q) mstore(0x4280, prod) }mstore(0x42c0, 32)mstore(0x42e0, 32)mstore(0x4300, 32)mstore(0x4320, mload(0x4280))mstore(0x4340, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x4360, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x42c0, 0xc0, 0x42a0, 0x20), 1), success){ let inv := mload(0x42a0) let v v := mload(0x40a0) mstore(0x40a0, mulmod(mload(0x4260), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4080) mstore(0x4080, mulmod(mload(0x4240), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4060) mstore(0x4060, mulmod(mload(0x4220), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3f20) mstore(0x3f20, mulmod(mload(0x4200), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4040) mstore(0x4040, mulmod(mload(0x41e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4020) mstore(0x4020, mulmod(mload(0x41c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4000) mstore(0x4000, mulmod(mload(0x41a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3fe0) mstore(0x3fe0, mulmod(mload(0x4180), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3fc0) mstore(0x3fc0, mulmod(mload(0x4160), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3fa0) mstore(0x3fa0, mulmod(mload(0x4140), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3f00) mstore(0x3f00, mulmod(mload(0x4120), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3f80) mstore(0x3f80, mulmod(mload(0x4100), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3ee0) mstore(0x3ee0, mulmod(mload(0x40e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3ec0) mstore(0x3ec0, mulmod(mload(0x40c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3ea0) mstore(0x3ea0, mulmod(mload(0x3e80), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x3e80, inv) }{ let result := mload(0x3e80)result := addmod(mload(0x3ea0), result, f_q)result := addmod(mload(0x3ec0), result, f_q)result := addmod(mload(0x3ee0), result, f_q)mstore(0x4380, result) }mstore(0x43a0, mulmod(mload(0x3f60), mload(0x3f00), f_q)){ let result := mload(0x3f80)mstore(0x43c0, result) }mstore(0x43e0, mulmod(mload(0x3f60), mload(0x4000), f_q)){ let result := mload(0x3fa0)result := addmod(mload(0x3fc0), result, f_q)result := addmod(mload(0x3fe0), result, f_q)mstore(0x4400, result) }mstore(0x4420, mulmod(mload(0x3f60), mload(0x3f20), f_q)){ let result := mload(0x4020)result := addmod(mload(0x4040), result, f_q)mstore(0x4440, result) }mstore(0x4460, mulmod(mload(0x3f60), mload(0x40a0), f_q)){ let result := mload(0x4060)result := addmod(mload(0x4080), result, f_q)mstore(0x4480, result) }{ let prod := mload(0x4380) prod := mulmod(mload(0x43c0), prod, f_q) mstore(0x44a0, prod) prod := mulmod(mload(0x4400), prod, f_q) mstore(0x44c0, prod) prod := mulmod(mload(0x4440), prod, f_q) mstore(0x44e0, prod) prod := mulmod(mload(0x4480), prod, f_q) mstore(0x4500, prod) }mstore(0x4540, 32)mstore(0x4560, 32)mstore(0x4580, 32)mstore(0x45a0, mload(0x4500))mstore(0x45c0, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x45e0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x4540, 0xc0, 0x4520, 0x20), 1), success){ let inv := mload(0x4520) let v v := mload(0x4480) mstore(0x4480, mulmod(mload(0x44e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4440) mstore(0x4440, mulmod(mload(0x44c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4400) mstore(0x4400, mulmod(mload(0x44a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x43c0) mstore(0x43c0, mulmod(mload(0x4380), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x4380, inv) }mstore(0x4600, mulmod(mload(0x43a0), mload(0x43c0), f_q))mstore(0x4620, mulmod(mload(0x43e0), mload(0x4400), f_q))mstore(0x4640, mulmod(mload(0x4420), mload(0x4440), f_q))mstore(0x4660, mulmod(mload(0x4460), mload(0x4480), f_q))mstore(0x4680, mulmod(mload(0x1280), mload(0x1280), f_q))mstore(0x46a0, mulmod(mload(0x4680), mload(0x1280), f_q))mstore(0x46c0, mulmod(mload(0x46a0), mload(0x1280), f_q))mstore(0x46e0, mulmod(mload(0x46c0), mload(0x1280), f_q))mstore(0x4700, mulmod(mload(0x46e0), mload(0x1280), f_q))mstore(0x4720, mulmod(mload(0x4700), mload(0x1280), f_q))mstore(0x4740, mulmod(mload(0x4720), mload(0x1280), f_q))mstore(0x4760, mulmod(mload(0x4740), mload(0x1280), f_q))mstore(0x4780, mulmod(mload(0x4760), mload(0x1280), f_q))mstore(0x47a0, mulmod(mload(0x4780), mload(0x1280), f_q))mstore(0x47c0, mulmod(mload(0x47a0), mload(0x1280), f_q))mstore(0x47e0, mulmod(mload(0x47c0), mload(0x1280), f_q))mstore(0x4800, mulmod(mload(0x47e0), mload(0x1280), f_q))mstore(0x4820, mulmod(mload(0x4800), mload(0x1280), f_q))mstore(0x4840, mulmod(mload(0x4820), mload(0x1280), f_q))mstore(0x4860, mulmod(mload(0x4840), mload(0x1280), f_q))mstore(0x4880, mulmod(mload(0x4860), mload(0x1280), f_q))mstore(0x48a0, mulmod(mload(0x4880), mload(0x1280), f_q))mstore(0x48c0, mulmod(mload(0x48a0), mload(0x1280), f_q))mstore(0x48e0, mulmod(mload(0x48c0), mload(0x1280), f_q))mstore(0x4900, mulmod(mload(0x48e0), mload(0x1280), f_q))mstore(0x4920, mulmod(mload(0x4900), mload(0x1280), f_q))mstore(0x4940, mulmod(mload(0x4920), mload(0x1280), f_q))mstore(0x4960, mulmod(mload(0x4940), mload(0x1280), f_q))mstore(0x4980, mulmod(mload(0x4960), mload(0x1280), f_q))mstore(0x49a0, mulmod(mload(0x4980), mload(0x1280), f_q))mstore(0x49c0, mulmod(mload(0x49a0), mload(0x1280), f_q))mstore(0x49e0, mulmod(mload(0x12e0), mload(0x12e0), f_q))mstore(0x4a00, mulmod(mload(0x49e0), mload(0x12e0), f_q))mstore(0x4a20, mulmod(mload(0x4a00), mload(0x12e0), f_q))mstore(0x4a40, mulmod(mload(0x4a20), mload(0x12e0), f_q)){ let result := mulmod(mload(0x8e0), mload(0x3e80), f_q)result := addmod(mulmod(mload(0x900), mload(0x3ea0), f_q), result, f_q)result := addmod(mulmod(mload(0x920), mload(0x3ec0), f_q), result, f_q)result := addmod(mulmod(mload(0x940), mload(0x3ee0), f_q), result, f_q)mstore(0x4a60, result) }mstore(0x4a80, mulmod(mload(0x4a60), mload(0x4380), f_q))mstore(0x4aa0, mulmod(sub(f_q, mload(0x4a80)), 1, f_q)){ let result := mulmod(mload(0x960), mload(0x3e80), f_q)result := addmod(mulmod(mload(0x980), mload(0x3ea0), f_q), result, f_q)result := addmod(mulmod(mload(0x9a0), mload(0x3ec0), f_q), result, f_q)result := addmod(mulmod(mload(0x9c0), mload(0x3ee0), f_q), result, f_q)mstore(0x4ac0, result) }mstore(0x4ae0, mulmod(mload(0x4ac0), mload(0x4380), f_q))mstore(0x4b00, mulmod(sub(f_q, mload(0x4ae0)), mload(0x1280), f_q))mstore(0x4b20, mulmod(1, mload(0x1280), f_q))mstore(0x4b40, addmod(mload(0x4aa0), mload(0x4b00), f_q)){ let result := mulmod(mload(0x9e0), mload(0x3e80), f_q)result := addmod(mulmod(mload(0xa00), mload(0x3ea0), f_q), result, f_q)result := addmod(mulmod(mload(0xa20), mload(0x3ec0), f_q), result, f_q)result := addmod(mulmod(mload(0xa40), mload(0x3ee0), f_q), result, f_q)mstore(0x4b60, result) }mstore(0x4b80, mulmod(mload(0x4b60), mload(0x4380), f_q))mstore(0x4ba0, mulmod(sub(f_q, mload(0x4b80)), mload(0x4680), f_q))mstore(0x4bc0, mulmod(1, mload(0x4680), f_q))mstore(0x4be0, addmod(mload(0x4b40), mload(0x4ba0), f_q)){ let result := mulmod(mload(0xa60), mload(0x3e80), f_q)result := addmod(mulmod(mload(0xa80), mload(0x3ea0), f_q), result, f_q)result := addmod(mulmod(mload(0xaa0), mload(0x3ec0), f_q), result, f_q)result := addmod(mulmod(mload(0xac0), mload(0x3ee0), f_q), result, f_q)mstore(0x4c00, result) }mstore(0x4c20, mulmod(mload(0x4c00), mload(0x4380), f_q))mstore(0x4c40, mulmod(sub(f_q, mload(0x4c20)), mload(0x46a0), f_q))mstore(0x4c60, mulmod(1, mload(0x46a0), f_q))mstore(0x4c80, addmod(mload(0x4be0), mload(0x4c40), f_q)){ let result := mulmod(mload(0xae0), mload(0x3e80), f_q)result := addmod(mulmod(mload(0xb00), mload(0x3ea0), f_q), result, f_q)result := addmod(mulmod(mload(0xb20), mload(0x3ec0), f_q), result, f_q)result := addmod(mulmod(mload(0xb40), mload(0x3ee0), f_q), result, f_q)mstore(0x4ca0, result) }mstore(0x4cc0, mulmod(mload(0x4ca0), mload(0x4380), f_q))mstore(0x4ce0, mulmod(sub(f_q, mload(0x4cc0)), mload(0x46c0), f_q))mstore(0x4d00, mulmod(1, mload(0x46c0), f_q))mstore(0x4d20, addmod(mload(0x4c80), mload(0x4ce0), f_q)){ let result := mulmod(mload(0xb60), mload(0x3e80), f_q)result := addmod(mulmod(mload(0xb80), mload(0x3ea0), f_q), result, f_q)result := addmod(mulmod(mload(0xba0), mload(0x3ec0), f_q), result, f_q)result := addmod(mulmod(mload(0xbc0), mload(0x3ee0), f_q), result, f_q)mstore(0x4d40, result) }mstore(0x4d60, mulmod(mload(0x4d40), mload(0x4380), f_q))mstore(0x4d80, mulmod(sub(f_q, mload(0x4d60)), mload(0x46e0), f_q))mstore(0x4da0, mulmod(1, mload(0x46e0), f_q))mstore(0x4dc0, addmod(mload(0x4d20), mload(0x4d80), f_q))mstore(0x4de0, mulmod(mload(0x4dc0), 1, f_q))mstore(0x4e00, mulmod(mload(0x4b20), 1, f_q))mstore(0x4e20, mulmod(mload(0x4bc0), 1, f_q))mstore(0x4e40, mulmod(mload(0x4c60), 1, f_q))mstore(0x4e60, mulmod(mload(0x4d00), 1, f_q))mstore(0x4e80, mulmod(mload(0x4da0), 1, f_q))mstore(0x4ea0, mulmod(1, mload(0x43a0), f_q)){ let result := mulmod(mload(0xbe0), mload(0x3f80), f_q)mstore(0x4ec0, result) }mstore(0x4ee0, mulmod(mload(0x4ec0), mload(0x4600), f_q))mstore(0x4f00, mulmod(sub(f_q, mload(0x4ee0)), 1, f_q))mstore(0x4f20, mulmod(mload(0x4ea0), 1, f_q)){ let result := mulmod(mload(0xc00), mload(0x3f80), f_q)mstore(0x4f40, result) }mstore(0x4f60, mulmod(mload(0x4f40), mload(0x4600), f_q))mstore(0x4f80, mulmod(sub(f_q, mload(0x4f60)), mload(0x1280), f_q))mstore(0x4fa0, mulmod(mload(0x4ea0), mload(0x1280), f_q))mstore(0x4fc0, addmod(mload(0x4f00), mload(0x4f80), f_q)){ let result := mulmod(mload(0xc20), mload(0x3f80), f_q)mstore(0x4fe0, result) }mstore(0x5000, mulmod(mload(0x4fe0), mload(0x4600), f_q))mstore(0x5020, mulmod(sub(f_q, mload(0x5000)), mload(0x4680), f_q))mstore(0x5040, mulmod(mload(0x4ea0), mload(0x4680), f_q))mstore(0x5060, addmod(mload(0x4fc0), mload(0x5020), f_q)){ let result := mulmod(mload(0x11a0), mload(0x3f80), f_q)mstore(0x5080, result) }mstore(0x50a0, mulmod(mload(0x5080), mload(0x4600), f_q))mstore(0x50c0, mulmod(sub(f_q, mload(0x50a0)), mload(0x46a0), f_q))mstore(0x50e0, mulmod(mload(0x4ea0), mload(0x46a0), f_q))mstore(0x5100, addmod(mload(0x5060), mload(0x50c0), f_q)){ let result := mulmod(mload(0x1240), mload(0x3f80), f_q)mstore(0x5120, result) }mstore(0x5140, mulmod(mload(0x5120), mload(0x4600), f_q))mstore(0x5160, mulmod(sub(f_q, mload(0x5140)), mload(0x46c0), f_q))mstore(0x5180, mulmod(mload(0x4ea0), mload(0x46c0), f_q))mstore(0x51a0, addmod(mload(0x5100), mload(0x5160), f_q)){ let result := mulmod(mload(0xc40), mload(0x3f80), f_q)mstore(0x51c0, result) }mstore(0x51e0, mulmod(mload(0x51c0), mload(0x4600), f_q))mstore(0x5200, mulmod(sub(f_q, mload(0x51e0)), mload(0x46e0), f_q))mstore(0x5220, mulmod(mload(0x4ea0), mload(0x46e0), f_q))mstore(0x5240, addmod(mload(0x51a0), mload(0x5200), f_q)){ let result := mulmod(mload(0xc60), mload(0x3f80), f_q)mstore(0x5260, result) }mstore(0x5280, mulmod(mload(0x5260), mload(0x4600), f_q))mstore(0x52a0, mulmod(sub(f_q, mload(0x5280)), mload(0x4700), f_q))mstore(0x52c0, mulmod(mload(0x4ea0), mload(0x4700), f_q))mstore(0x52e0, addmod(mload(0x5240), mload(0x52a0), f_q)){ let result := mulmod(mload(0xc80), mload(0x3f80), f_q)mstore(0x5300, result) }mstore(0x5320, mulmod(mload(0x5300), mload(0x4600), f_q))mstore(0x5340, mulmod(sub(f_q, mload(0x5320)), mload(0x4720), f_q))mstore(0x5360, mulmod(mload(0x4ea0), mload(0x4720), f_q))mstore(0x5380, addmod(mload(0x52e0), mload(0x5340), f_q)){ let result := mulmod(mload(0xca0), mload(0x3f80), f_q)mstore(0x53a0, result) }mstore(0x53c0, mulmod(mload(0x53a0), mload(0x4600), f_q))mstore(0x53e0, mulmod(sub(f_q, mload(0x53c0)), mload(0x4740), f_q))mstore(0x5400, mulmod(mload(0x4ea0), mload(0x4740), f_q))mstore(0x5420, addmod(mload(0x5380), mload(0x53e0), f_q)){ let result := mulmod(mload(0xcc0), mload(0x3f80), f_q)mstore(0x5440, result) }mstore(0x5460, mulmod(mload(0x5440), mload(0x4600), f_q))mstore(0x5480, mulmod(sub(f_q, mload(0x5460)), mload(0x4760), f_q))mstore(0x54a0, mulmod(mload(0x4ea0), mload(0x4760), f_q))mstore(0x54c0, addmod(mload(0x5420), mload(0x5480), f_q)){ let result := mulmod(mload(0xce0), mload(0x3f80), f_q)mstore(0x54e0, result) }mstore(0x5500, mulmod(mload(0x54e0), mload(0x4600), f_q))mstore(0x5520, mulmod(sub(f_q, mload(0x5500)), mload(0x4780), f_q))mstore(0x5540, mulmod(mload(0x4ea0), mload(0x4780), f_q))mstore(0x5560, addmod(mload(0x54c0), mload(0x5520), f_q)){ let result := mulmod(mload(0xd00), mload(0x3f80), f_q)mstore(0x5580, result) }mstore(0x55a0, mulmod(mload(0x5580), mload(0x4600), f_q))mstore(0x55c0, mulmod(sub(f_q, mload(0x55a0)), mload(0x47a0), f_q))mstore(0x55e0, mulmod(mload(0x4ea0), mload(0x47a0), f_q))mstore(0x5600, addmod(mload(0x5560), mload(0x55c0), f_q)){ let result := mulmod(mload(0xd20), mload(0x3f80), f_q)mstore(0x5620, result) }mstore(0x5640, mulmod(mload(0x5620), mload(0x4600), f_q))mstore(0x5660, mulmod(sub(f_q, mload(0x5640)), mload(0x47c0), f_q))mstore(0x5680, mulmod(mload(0x4ea0), mload(0x47c0), f_q))mstore(0x56a0, addmod(mload(0x5600), mload(0x5660), f_q)){ let result := mulmod(mload(0xd40), mload(0x3f80), f_q)mstore(0x56c0, result) }mstore(0x56e0, mulmod(mload(0x56c0), mload(0x4600), f_q))mstore(0x5700, mulmod(sub(f_q, mload(0x56e0)), mload(0x47e0), f_q))mstore(0x5720, mulmod(mload(0x4ea0), mload(0x47e0), f_q))mstore(0x5740, addmod(mload(0x56a0), mload(0x5700), f_q)){ let result := mulmod(mload(0xd60), mload(0x3f80), f_q)mstore(0x5760, result) }mstore(0x5780, mulmod(mload(0x5760), mload(0x4600), f_q))mstore(0x57a0, mulmod(sub(f_q, mload(0x5780)), mload(0x4800), f_q))mstore(0x57c0, mulmod(mload(0x4ea0), mload(0x4800), f_q))mstore(0x57e0, addmod(mload(0x5740), mload(0x57a0), f_q)){ let result := mulmod(mload(0xda0), mload(0x3f80), f_q)mstore(0x5800, result) }mstore(0x5820, mulmod(mload(0x5800), mload(0x4600), f_q))mstore(0x5840, mulmod(sub(f_q, mload(0x5820)), mload(0x4820), f_q))mstore(0x5860, mulmod(mload(0x4ea0), mload(0x4820), f_q))mstore(0x5880, addmod(mload(0x57e0), mload(0x5840), f_q)){ let result := mulmod(mload(0xdc0), mload(0x3f80), f_q)mstore(0x58a0, result) }mstore(0x58c0, mulmod(mload(0x58a0), mload(0x4600), f_q))mstore(0x58e0, mulmod(sub(f_q, mload(0x58c0)), mload(0x4840), f_q))mstore(0x5900, mulmod(mload(0x4ea0), mload(0x4840), f_q))mstore(0x5920, addmod(mload(0x5880), mload(0x58e0), f_q)){ let result := mulmod(mload(0xde0), mload(0x3f80), f_q)mstore(0x5940, result) }mstore(0x5960, mulmod(mload(0x5940), mload(0x4600), f_q))mstore(0x5980, mulmod(sub(f_q, mload(0x5960)), mload(0x4860), f_q))mstore(0x59a0, mulmod(mload(0x4ea0), mload(0x4860), f_q))mstore(0x59c0, addmod(mload(0x5920), mload(0x5980), f_q)){ let result := mulmod(mload(0xe00), mload(0x3f80), f_q)mstore(0x59e0, result) }mstore(0x5a00, mulmod(mload(0x59e0), mload(0x4600), f_q))mstore(0x5a20, mulmod(sub(f_q, mload(0x5a00)), mload(0x4880), f_q))mstore(0x5a40, mulmod(mload(0x4ea0), mload(0x4880), f_q))mstore(0x5a60, addmod(mload(0x59c0), mload(0x5a20), f_q)){ let result := mulmod(mload(0xe20), mload(0x3f80), f_q)mstore(0x5a80, result) }mstore(0x5aa0, mulmod(mload(0x5a80), mload(0x4600), f_q))mstore(0x5ac0, mulmod(sub(f_q, mload(0x5aa0)), mload(0x48a0), f_q))mstore(0x5ae0, mulmod(mload(0x4ea0), mload(0x48a0), f_q))mstore(0x5b00, addmod(mload(0x5a60), mload(0x5ac0), f_q)){ let result := mulmod(mload(0xe40), mload(0x3f80), f_q)mstore(0x5b20, result) }mstore(0x5b40, mulmod(mload(0x5b20), mload(0x4600), f_q))mstore(0x5b60, mulmod(sub(f_q, mload(0x5b40)), mload(0x48c0), f_q))mstore(0x5b80, mulmod(mload(0x4ea0), mload(0x48c0), f_q))mstore(0x5ba0, addmod(mload(0x5b00), mload(0x5b60), f_q)){ let result := mulmod(mload(0xe60), mload(0x3f80), f_q)mstore(0x5bc0, result) }mstore(0x5be0, mulmod(mload(0x5bc0), mload(0x4600), f_q))mstore(0x5c00, mulmod(sub(f_q, mload(0x5be0)), mload(0x48e0), f_q))mstore(0x5c20, mulmod(mload(0x4ea0), mload(0x48e0), f_q))mstore(0x5c40, addmod(mload(0x5ba0), mload(0x5c00), f_q)){ let result := mulmod(mload(0xe80), mload(0x3f80), f_q)mstore(0x5c60, result) }mstore(0x5c80, mulmod(mload(0x5c60), mload(0x4600), f_q))mstore(0x5ca0, mulmod(sub(f_q, mload(0x5c80)), mload(0x4900), f_q))mstore(0x5cc0, mulmod(mload(0x4ea0), mload(0x4900), f_q))mstore(0x5ce0, addmod(mload(0x5c40), mload(0x5ca0), f_q)){ let result := mulmod(mload(0xea0), mload(0x3f80), f_q)mstore(0x5d00, result) }mstore(0x5d20, mulmod(mload(0x5d00), mload(0x4600), f_q))mstore(0x5d40, mulmod(sub(f_q, mload(0x5d20)), mload(0x4920), f_q))mstore(0x5d60, mulmod(mload(0x4ea0), mload(0x4920), f_q))mstore(0x5d80, addmod(mload(0x5ce0), mload(0x5d40), f_q)){ let result := mulmod(mload(0xec0), mload(0x3f80), f_q)mstore(0x5da0, result) }mstore(0x5dc0, mulmod(mload(0x5da0), mload(0x4600), f_q))mstore(0x5de0, mulmod(sub(f_q, mload(0x5dc0)), mload(0x4940), f_q))mstore(0x5e00, mulmod(mload(0x4ea0), mload(0x4940), f_q))mstore(0x5e20, addmod(mload(0x5d80), mload(0x5de0), f_q)){ let result := mulmod(mload(0xee0), mload(0x3f80), f_q)mstore(0x5e40, result) }mstore(0x5e60, mulmod(mload(0x5e40), mload(0x4600), f_q))mstore(0x5e80, mulmod(sub(f_q, mload(0x5e60)), mload(0x4960), f_q))mstore(0x5ea0, mulmod(mload(0x4ea0), mload(0x4960), f_q))mstore(0x5ec0, addmod(mload(0x5e20), mload(0x5e80), f_q))mstore(0x5ee0, mulmod(mload(0x3c60), mload(0x43a0), f_q))mstore(0x5f00, mulmod(mload(0x3c80), mload(0x43a0), f_q)){ let result := mulmod(mload(0x3ca0), mload(0x3f80), f_q)mstore(0x5f20, result) }mstore(0x5f40, mulmod(mload(0x5f20), mload(0x4600), f_q))mstore(0x5f60, mulmod(sub(f_q, mload(0x5f40)), mload(0x4980), f_q))mstore(0x5f80, mulmod(mload(0x4ea0), mload(0x4980), f_q))mstore(0x5fa0, mulmod(mload(0x5ee0), mload(0x4980), f_q))mstore(0x5fc0, mulmod(mload(0x5f00), mload(0x4980), f_q))mstore(0x5fe0, addmod(mload(0x5ec0), mload(0x5f60), f_q)){ let result := mulmod(mload(0xd80), mload(0x3f80), f_q)mstore(0x6000, result) }mstore(0x6020, mulmod(mload(0x6000), mload(0x4600), f_q))mstore(0x6040, mulmod(sub(f_q, mload(0x6020)), mload(0x49a0), f_q))mstore(0x6060, mulmod(mload(0x4ea0), mload(0x49a0), f_q))mstore(0x6080, addmod(mload(0x5fe0), mload(0x6040), f_q))mstore(0x60a0, mulmod(mload(0x6080), mload(0x12e0), f_q))mstore(0x60c0, mulmod(mload(0x4f20), mload(0x12e0), f_q))mstore(0x60e0, mulmod(mload(0x4fa0), mload(0x12e0), f_q))mstore(0x6100, mulmod(mload(0x5040), mload(0x12e0), f_q))mstore(0x6120, mulmod(mload(0x50e0), mload(0x12e0), f_q))mstore(0x6140, mulmod(mload(0x5180), mload(0x12e0), f_q))mstore(0x6160, mulmod(mload(0x5220), mload(0x12e0), f_q))mstore(0x6180, mulmod(mload(0x52c0), mload(0x12e0), f_q))mstore(0x61a0, mulmod(mload(0x5360), mload(0x12e0), f_q))mstore(0x61c0, mulmod(mload(0x5400), mload(0x12e0), f_q))mstore(0x61e0, mulmod(mload(0x54a0), mload(0x12e0), f_q))mstore(0x6200, mulmod(mload(0x5540), mload(0x12e0), f_q))mstore(0x6220, mulmod(mload(0x55e0), mload(0x12e0), f_q))mstore(0x6240, mulmod(mload(0x5680), mload(0x12e0), f_q))mstore(0x6260, mulmod(mload(0x5720), mload(0x12e0), f_q))mstore(0x6280, mulmod(mload(0x57c0), mload(0x12e0), f_q))mstore(0x62a0, mulmod(mload(0x5860), mload(0x12e0), f_q))mstore(0x62c0, mulmod(mload(0x5900), mload(0x12e0), f_q))mstore(0x62e0, mulmod(mload(0x59a0), mload(0x12e0), f_q))mstore(0x6300, mulmod(mload(0x5a40), mload(0x12e0), f_q))mstore(0x6320, mulmod(mload(0x5ae0), mload(0x12e0), f_q))mstore(0x6340, mulmod(mload(0x5b80), mload(0x12e0), f_q))mstore(0x6360, mulmod(mload(0x5c20), mload(0x12e0), f_q))mstore(0x6380, mulmod(mload(0x5cc0), mload(0x12e0), f_q))mstore(0x63a0, mulmod(mload(0x5d60), mload(0x12e0), f_q))mstore(0x63c0, mulmod(mload(0x5e00), mload(0x12e0), f_q))mstore(0x63e0, mulmod(mload(0x5ea0), mload(0x12e0), f_q))mstore(0x6400, mulmod(mload(0x5f80), mload(0x12e0), f_q))mstore(0x6420, mulmod(mload(0x5fa0), mload(0x12e0), f_q))mstore(0x6440, mulmod(mload(0x5fc0), mload(0x12e0), f_q))mstore(0x6460, mulmod(mload(0x6060), mload(0x12e0), f_q))mstore(0x6480, addmod(mload(0x4de0), mload(0x60a0), f_q))mstore(0x64a0, mulmod(1, mload(0x43e0), f_q)){ let result := mulmod(mload(0xf00), mload(0x3fa0), f_q)result := addmod(mulmod(mload(0xf20), mload(0x3fc0), f_q), result, f_q)result := addmod(mulmod(mload(0xf40), mload(0x3fe0), f_q), result, f_q)mstore(0x64c0, result) }mstore(0x64e0, mulmod(mload(0x64c0), mload(0x4620), f_q))mstore(0x6500, mulmod(sub(f_q, mload(0x64e0)), 1, f_q))mstore(0x6520, mulmod(mload(0x64a0), 1, f_q)){ let result := mulmod(mload(0xf60), mload(0x3fa0), f_q)result := addmod(mulmod(mload(0xf80), mload(0x3fc0), f_q), result, f_q)result := addmod(mulmod(mload(0xfa0), mload(0x3fe0), f_q), result, f_q)mstore(0x6540, result) }mstore(0x6560, mulmod(mload(0x6540), mload(0x4620), f_q))mstore(0x6580, mulmod(sub(f_q, mload(0x6560)), mload(0x1280), f_q))mstore(0x65a0, mulmod(mload(0x64a0), mload(0x1280), f_q))mstore(0x65c0, addmod(mload(0x6500), mload(0x6580), f_q)){ let result := mulmod(mload(0xfc0), mload(0x3fa0), f_q)result := addmod(mulmod(mload(0xfe0), mload(0x3fc0), f_q), result, f_q)result := addmod(mulmod(mload(0x1000), mload(0x3fe0), f_q), result, f_q)mstore(0x65e0, result) }mstore(0x6600, mulmod(mload(0x65e0), mload(0x4620), f_q))mstore(0x6620, mulmod(sub(f_q, mload(0x6600)), mload(0x4680), f_q))mstore(0x6640, mulmod(mload(0x64a0), mload(0x4680), f_q))mstore(0x6660, addmod(mload(0x65c0), mload(0x6620), f_q)){ let result := mulmod(mload(0x1020), mload(0x3fa0), f_q)result := addmod(mulmod(mload(0x1040), mload(0x3fc0), f_q), result, f_q)result := addmod(mulmod(mload(0x1060), mload(0x3fe0), f_q), result, f_q)mstore(0x6680, result) }mstore(0x66a0, mulmod(mload(0x6680), mload(0x4620), f_q))mstore(0x66c0, mulmod(sub(f_q, mload(0x66a0)), mload(0x46a0), f_q))mstore(0x66e0, mulmod(mload(0x64a0), mload(0x46a0), f_q))mstore(0x6700, addmod(mload(0x6660), mload(0x66c0), f_q)){ let result := mulmod(mload(0x1080), mload(0x3fa0), f_q)result := addmod(mulmod(mload(0x10a0), mload(0x3fc0), f_q), result, f_q)result := addmod(mulmod(mload(0x10c0), mload(0x3fe0), f_q), result, f_q)mstore(0x6720, result) }mstore(0x6740, mulmod(mload(0x6720), mload(0x4620), f_q))mstore(0x6760, mulmod(sub(f_q, mload(0x6740)), mload(0x46c0), f_q))mstore(0x6780, mulmod(mload(0x64a0), mload(0x46c0), f_q))mstore(0x67a0, addmod(mload(0x6700), mload(0x6760), f_q))mstore(0x67c0, mulmod(mload(0x67a0), mload(0x49e0), f_q))mstore(0x67e0, mulmod(mload(0x6520), mload(0x49e0), f_q))mstore(0x6800, mulmod(mload(0x65a0), mload(0x49e0), f_q))mstore(0x6820, mulmod(mload(0x6640), mload(0x49e0), f_q))mstore(0x6840, mulmod(mload(0x66e0), mload(0x49e0), f_q))mstore(0x6860, mulmod(mload(0x6780), mload(0x49e0), f_q))mstore(0x6880, addmod(mload(0x6480), mload(0x67c0), f_q))mstore(0x68a0, mulmod(1, mload(0x4420), f_q)){ let result := mulmod(mload(0x10e0), mload(0x4020), f_q)result := addmod(mulmod(mload(0x1100), mload(0x4040), f_q), result, f_q)mstore(0x68c0, result) }mstore(0x68e0, mulmod(mload(0x68c0), mload(0x4640), f_q))mstore(0x6900, mulmod(sub(f_q, mload(0x68e0)), 1, f_q))mstore(0x6920, mulmod(mload(0x68a0), 1, f_q)){ let result := mulmod(mload(0x1120), mload(0x4020), f_q)result := addmod(mulmod(mload(0x1140), mload(0x4040), f_q), result, f_q)mstore(0x6940, result) }mstore(0x6960, mulmod(mload(0x6940), mload(0x4640), f_q))mstore(0x6980, mulmod(sub(f_q, mload(0x6960)), mload(0x1280), f_q))mstore(0x69a0, mulmod(mload(0x68a0), mload(0x1280), f_q))mstore(0x69c0, addmod(mload(0x6900), mload(0x6980), f_q)){ let result := mulmod(mload(0x11c0), mload(0x4020), f_q)result := addmod(mulmod(mload(0x11e0), mload(0x4040), f_q), result, f_q)mstore(0x69e0, result) }mstore(0x6a00, mulmod(mload(0x69e0), mload(0x4640), f_q))mstore(0x6a20, mulmod(sub(f_q, mload(0x6a00)), mload(0x4680), f_q))mstore(0x6a40, mulmod(mload(0x68a0), mload(0x4680), f_q))mstore(0x6a60, addmod(mload(0x69c0), mload(0x6a20), f_q))mstore(0x6a80, mulmod(mload(0x6a60), mload(0x4a00), f_q))mstore(0x6aa0, mulmod(mload(0x6920), mload(0x4a00), f_q))mstore(0x6ac0, mulmod(mload(0x69a0), mload(0x4a00), f_q))mstore(0x6ae0, mulmod(mload(0x6a40), mload(0x4a00), f_q))mstore(0x6b00, addmod(mload(0x6880), mload(0x6a80), f_q))mstore(0x6b20, mulmod(1, mload(0x4460), f_q)){ let result := mulmod(mload(0x1160), mload(0x4060), f_q)result := addmod(mulmod(mload(0x1180), mload(0x4080), f_q), result, f_q)mstore(0x6b40, result) }mstore(0x6b60, mulmod(mload(0x6b40), mload(0x4660), f_q))mstore(0x6b80, mulmod(sub(f_q, mload(0x6b60)), 1, f_q))mstore(0x6ba0, mulmod(mload(0x6b20), 1, f_q)){ let result := mulmod(mload(0x1200), mload(0x4060), f_q)result := addmod(mulmod(mload(0x1220), mload(0x4080), f_q), result, f_q)mstore(0x6bc0, result) }mstore(0x6be0, mulmod(mload(0x6bc0), mload(0x4660), f_q))mstore(0x6c00, mulmod(sub(f_q, mload(0x6be0)), mload(0x1280), f_q))mstore(0x6c20, mulmod(mload(0x6b20), mload(0x1280), f_q))mstore(0x6c40, addmod(mload(0x6b80), mload(0x6c00), f_q))mstore(0x6c60, mulmod(mload(0x6c40), mload(0x4a20), f_q))mstore(0x6c80, mulmod(mload(0x6ba0), mload(0x4a20), f_q))mstore(0x6ca0, mulmod(mload(0x6c20), mload(0x4a20), f_q))mstore(0x6cc0, addmod(mload(0x6b00), mload(0x6c60), f_q))mstore(0x6ce0, mulmod(1, mload(0x3f60), f_q))mstore(0x6d00, mulmod(1, mload(0x1380), f_q))mstore(0x6d20, 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(0x6d40, 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(0x6d60, mload(0x6cc0))success := and(eq(staticcall(gas(), 0x7, 0x6d20, 0x60, 0x6d20, 0x40), 1), success)mstore(0x6d80, mload(0x6d20)) mstore(0x6da0, mload(0x6d40))mstore(0x6dc0, mload(0xc0)) mstore(0x6de0, mload(0xe0))success := and(eq(staticcall(gas(), 0x6, 0x6d80, 0x80, 0x6d80, 0x40), 1), success)mstore(0x6e00, mload(0x100)) mstore(0x6e20, mload(0x120))mstore(0x6e40, mload(0x4e00))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, mload(0x140)) mstore(0x6f00, mload(0x160))mstore(0x6f20, mload(0x4e20))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(0x180)) mstore(0x6fe0, mload(0x1a0))mstore(0x7000, mload(0x4e40))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(0x1c0)) mstore(0x70c0, mload(0x1e0))mstore(0x70e0, mload(0x4e60))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(0x200)) mstore(0x71a0, mload(0x220))mstore(0x71c0, mload(0x4e80))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(0x240)) mstore(0x7280, mload(0x260))mstore(0x72a0, mload(0x60c0))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(0x280)) mstore(0x7360, mload(0x2a0))mstore(0x7380, mload(0x60e0))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(0x2c0)) mstore(0x7440, mload(0x2e0))mstore(0x7460, mload(0x6100))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(0x3a0)) mstore(0x7520, mload(0x3c0))mstore(0x7540, mload(0x6120))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(0x420)) mstore(0x7600, mload(0x440))mstore(0x7620, mload(0x6140))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, 0x1efccb5f35c0ab008fa604178482fb235779612117d933e230bf21aed1936775) mstore(0x76e0, 0x1dab7bfc8c09774da8326adfa867ee15820c0e4a66068d086b2dee960993fc8a)mstore(0x7700, mload(0x6160))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, 0x04528ec7365a2881b7d3c8925570e06bb3b17f04f6a95384ac8ed19a30c12097) mstore(0x77c0, 0x28d1ef470a8a5278ad6d2eb9047ad7e93024113f543b06870f1bbea7177db404)mstore(0x77e0, mload(0x6180))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, 0x04d043081f0d55eead6d8ad7b10d09a6ee2718f445d9bce454075a8a37bacaf3) mstore(0x78a0, 0x27d6bcbb02cd624ab80b5532a0a65fc6f88a0faf7cf3e0d106f4aa0aa25e758b)mstore(0x78c0, mload(0x61a0))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, 0x2d07a1bca289cdb98b648a91cbb0809dfa3a06fe01047b291d1161ddf8d1732c) mstore(0x7980, 0x021d078d5869c57b3fe2413b517561205de5f297ac56c0e5ef0f1a7f4a31ee94)mstore(0x79a0, mload(0x61c0))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, 0x0654df583cf4a624c7d28ab22c3d83ac654441d1773fa149a5d8dd93904aefa1) mstore(0x7a60, 0x03505462356097e7becf98acd86de36a336a2e9c149fe3ff073199ff414da34e)mstore(0x7a80, mload(0x61e0))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, 0x013693bda5e1bad435fc7cc97749086b700dd0a10463a371be028ef9837494df) mstore(0x7b40, 0x219efc67984ad64348266fefcffc138d846b0c0d8f81a24ea3774609d3f5d724)mstore(0x7b60, mload(0x6200))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, 0x1a29044990ec839bb07d56ffa00618e186716d7366207f909fb44641a8845baf) mstore(0x7c20, 0x16b51f53337d9b353024e90d2b9870fe165ef601abd795707d318ba5bcb211d4)mstore(0x7c40, mload(0x6220))success := and(eq(staticcall(gas(), 0x7, 0x7c00, 0x60, 0x7c00, 0x40), 1), success)mstore(0x7c60, mload(0x7b80)) mstore(0x7c80, mload(0x7ba0))mstore(0x7ca0, mload(0x7c00)) mstore(0x7cc0, mload(0x7c20))success := and(eq(staticcall(gas(), 0x6, 0x7c60, 0x80, 0x7c60, 0x40), 1), success)mstore(0x7ce0, 0x0bd8cdd311a39512e0f4c79e046470751b4a0cf050a865eeca84b31cef672341) mstore(0x7d00, 0x2dc5df62b48f53a8f1ee964a28d2ae7d32fdccd4a18dfd38fed88c05a4d16149)mstore(0x7d20, mload(0x6240))success := and(eq(staticcall(gas(), 0x7, 0x7ce0, 0x60, 0x7ce0, 0x40), 1), success)mstore(0x7d40, mload(0x7c60)) mstore(0x7d60, mload(0x7c80))mstore(0x7d80, mload(0x7ce0)) mstore(0x7da0, mload(0x7d00))success := and(eq(staticcall(gas(), 0x6, 0x7d40, 0x80, 0x7d40, 0x40), 1), success)mstore(0x7dc0, 0x028aa90bb886253410dcea14a0fcc7ee2e66ce14b81aec4715614c41bf7563ab) mstore(0x7de0, 0x26991cf8ac328075cc8c3acb7aee7fd287ea7c81dcb26a16b4539140dfcab001)mstore(0x7e00, mload(0x6260))success := and(eq(staticcall(gas(), 0x7, 0x7dc0, 0x60, 0x7dc0, 0x40), 1), success)mstore(0x7e20, mload(0x7d40)) mstore(0x7e40, mload(0x7d60))mstore(0x7e60, mload(0x7dc0)) mstore(0x7e80, mload(0x7de0))success := and(eq(staticcall(gas(), 0x6, 0x7e20, 0x80, 0x7e20, 0x40), 1), success)mstore(0x7ea0, 0x037d1f9567a4b280e0fa0a464db3f588dcbca2d083da31da1820f3686c61b04c) mstore(0x7ec0, 0x16a2ae3f6a18fc2f7b9bcb04c2f09795840bb5c60dfef3178a9cf5812e950d50)mstore(0x7ee0, mload(0x6280))success := and(eq(staticcall(gas(), 0x7, 0x7ea0, 0x60, 0x7ea0, 0x40), 1), success)mstore(0x7f00, mload(0x7e20)) mstore(0x7f20, mload(0x7e40))mstore(0x7f40, mload(0x7ea0)) mstore(0x7f60, mload(0x7ec0))success := and(eq(staticcall(gas(), 0x6, 0x7f00, 0x80, 0x7f00, 0x40), 1), success)mstore(0x7f80, 0x0ec0c922ea73b30b8180de1bc071f10ad77ace6def7b54caae1d4cc0095c1f78) mstore(0x7fa0, 0x146049ebdf9fb52936d6a4bed7148261823d713cdc7b897eb71feb3a5d0cef74)mstore(0x7fc0, mload(0x62a0))success := and(eq(staticcall(gas(), 0x7, 0x7f80, 0x60, 0x7f80, 0x40), 1), success)mstore(0x7fe0, mload(0x7f00)) mstore(0x8000, mload(0x7f20))mstore(0x8020, mload(0x7f80)) mstore(0x8040, mload(0x7fa0))success := and(eq(staticcall(gas(), 0x6, 0x7fe0, 0x80, 0x7fe0, 0x40), 1), success)mstore(0x8060, 0x080c6980a51e47dc74652e5e2ce4777899fa99c9dedb1cdb5aa63a21faf54236) mstore(0x8080, 0x1b6967f189da082c60d7b916d0cf4303334c9a2e615a2b094a0fd896b37bab9e)mstore(0x80a0, mload(0x62c0))success := and(eq(staticcall(gas(), 0x7, 0x8060, 0x60, 0x8060, 0x40), 1), success)mstore(0x80c0, mload(0x7fe0)) mstore(0x80e0, mload(0x8000))mstore(0x8100, mload(0x8060)) mstore(0x8120, mload(0x8080))success := and(eq(staticcall(gas(), 0x6, 0x80c0, 0x80, 0x80c0, 0x40), 1), success)mstore(0x8140, 0x280be2ede448f837f163473438439007cad788067f27fa14e53b7dc177ef2a59) mstore(0x8160, 0x00804c408a2860ec4020b49299dc4f2a96f27c6586da719d2907e2b0248edd24)mstore(0x8180, mload(0x62e0))success := and(eq(staticcall(gas(), 0x7, 0x8140, 0x60, 0x8140, 0x40), 1), success)mstore(0x81a0, mload(0x80c0)) mstore(0x81c0, mload(0x80e0))mstore(0x81e0, mload(0x8140)) mstore(0x8200, mload(0x8160))success := and(eq(staticcall(gas(), 0x6, 0x81a0, 0x80, 0x81a0, 0x40), 1), success)mstore(0x8220, 0x098c0774d8a6bb5e6f16db4af08273aaf352980e582eebd70323a69bec6e9569) mstore(0x8240, 0x1ae410753dde006f1c34513ddc66c05b17419a746dc468a32db541e4de6c3e5d)mstore(0x8260, mload(0x6300))success := and(eq(staticcall(gas(), 0x7, 0x8220, 0x60, 0x8220, 0x40), 1), success)mstore(0x8280, mload(0x81a0)) mstore(0x82a0, mload(0x81c0))mstore(0x82c0, mload(0x8220)) mstore(0x82e0, mload(0x8240))success := and(eq(staticcall(gas(), 0x6, 0x8280, 0x80, 0x8280, 0x40), 1), success)mstore(0x8300, 0x1c7529bd3f005de2d1319ef3faa0f2e301fdc4a80e5bc256297b7676875be33a) mstore(0x8320, 0x149f786b2355985e8a2aedb1974448bd312d1fda6231177f0915c35d96ac460f)mstore(0x8340, mload(0x6320))success := and(eq(staticcall(gas(), 0x7, 0x8300, 0x60, 0x8300, 0x40), 1), success)mstore(0x8360, mload(0x8280)) mstore(0x8380, mload(0x82a0))mstore(0x83a0, mload(0x8300)) mstore(0x83c0, mload(0x8320))success := and(eq(staticcall(gas(), 0x6, 0x8360, 0x80, 0x8360, 0x40), 1), success)mstore(0x83e0, 0x281dad8bf95d2164b0906c6b77b79bec3c5485308d8d619fe698994e6970af72) mstore(0x8400, 0x24e52f6a9fa13d1862a68e9cd782c0cfa63b5a75e83ff95ba33fad23bb13d304)mstore(0x8420, mload(0x6340))success := and(eq(staticcall(gas(), 0x7, 0x83e0, 0x60, 0x83e0, 0x40), 1), success)mstore(0x8440, mload(0x8360)) mstore(0x8460, mload(0x8380))mstore(0x8480, mload(0x83e0)) mstore(0x84a0, mload(0x8400))success := and(eq(staticcall(gas(), 0x6, 0x8440, 0x80, 0x8440, 0x40), 1), success)mstore(0x84c0, 0x213c15ae99dd2f66174198cd5dc8874c17b276b63e8d27509c6750b24b9d444d) mstore(0x84e0, 0x0fb99c21eca080d626c2a71695f3168c9fb9291719277f7fa85f535f5ac89fee)mstore(0x8500, mload(0x6360))success := and(eq(staticcall(gas(), 0x7, 0x84c0, 0x60, 0x84c0, 0x40), 1), success)mstore(0x8520, mload(0x8440)) mstore(0x8540, mload(0x8460))mstore(0x8560, mload(0x84c0)) mstore(0x8580, mload(0x84e0))success := and(eq(staticcall(gas(), 0x6, 0x8520, 0x80, 0x8520, 0x40), 1), success)mstore(0x85a0, 0x191a9edf71e99c534b6a65892a2be90b6d7ea46ef42633144570cb070927edf1) mstore(0x85c0, 0x097fcf51b5b4c39dcfbc97e1c34467d6bcfe994d3e74008a23056c623e36963d)mstore(0x85e0, mload(0x6380))success := and(eq(staticcall(gas(), 0x7, 0x85a0, 0x60, 0x85a0, 0x40), 1), success)mstore(0x8600, mload(0x8520)) mstore(0x8620, mload(0x8540))mstore(0x8640, mload(0x85a0)) mstore(0x8660, mload(0x85c0))success := and(eq(staticcall(gas(), 0x6, 0x8600, 0x80, 0x8600, 0x40), 1), success)mstore(0x8680, 0x1ea58e7845fc49f2556e2bc6ceb43fe04c18c0e0bd9be401b2e9649aae82deea) mstore(0x86a0, 0x08868558da7b21bb3d936d87405a4c08ca582ad92164580a95aa62323e7266d2)mstore(0x86c0, mload(0x63a0))success := and(eq(staticcall(gas(), 0x7, 0x8680, 0x60, 0x8680, 0x40), 1), success)mstore(0x86e0, mload(0x8600)) mstore(0x8700, mload(0x8620))mstore(0x8720, mload(0x8680)) mstore(0x8740, mload(0x86a0))success := and(eq(staticcall(gas(), 0x6, 0x86e0, 0x80, 0x86e0, 0x40), 1), success)mstore(0x8760, 0x06d289011bf01c484da50f75171f091dda7a75d61defc9a091065969c6ba0b41) mstore(0x8780, 0x1853b673466e1fdbc8afeb7953a1e5817cff8d36be59bd76cf6bf480d2bf6f9d)mstore(0x87a0, mload(0x63c0))success := and(eq(staticcall(gas(), 0x7, 0x8760, 0x60, 0x8760, 0x40), 1), success)mstore(0x87c0, mload(0x86e0)) mstore(0x87e0, mload(0x8700))mstore(0x8800, mload(0x8760)) mstore(0x8820, mload(0x8780))success := and(eq(staticcall(gas(), 0x6, 0x87c0, 0x80, 0x87c0, 0x40), 1), success)mstore(0x8840, 0x09a7332c71ded2c1a03ea2f167d117e3051805f6f5008a26c718ebb85d2b1bf7) mstore(0x8860, 0x2928a92fa94da957f331277462d426534a31c5c30e7702735d12c4a7155b6f09)mstore(0x8880, mload(0x63e0))success := and(eq(staticcall(gas(), 0x7, 0x8840, 0x60, 0x8840, 0x40), 1), success)mstore(0x88a0, mload(0x87c0)) mstore(0x88c0, mload(0x87e0))mstore(0x88e0, mload(0x8840)) mstore(0x8900, mload(0x8860))success := and(eq(staticcall(gas(), 0x6, 0x88a0, 0x80, 0x88a0, 0x40), 1), success)mstore(0x8920, mload(0x7c0)) mstore(0x8940, mload(0x7e0))mstore(0x8960, mload(0x6400))success := and(eq(staticcall(gas(), 0x7, 0x8920, 0x60, 0x8920, 0x40), 1), success)mstore(0x8980, mload(0x88a0)) mstore(0x89a0, mload(0x88c0))mstore(0x89c0, mload(0x8920)) mstore(0x89e0, mload(0x8940))success := and(eq(staticcall(gas(), 0x6, 0x8980, 0x80, 0x8980, 0x40), 1), success)mstore(0x8a00, mload(0x800)) mstore(0x8a20, mload(0x820))mstore(0x8a40, mload(0x6420))success := and(eq(staticcall(gas(), 0x7, 0x8a00, 0x60, 0x8a00, 0x40), 1), success)mstore(0x8a60, mload(0x8980)) mstore(0x8a80, mload(0x89a0))mstore(0x8aa0, mload(0x8a00)) mstore(0x8ac0, mload(0x8a20))success := and(eq(staticcall(gas(), 0x6, 0x8a60, 0x80, 0x8a60, 0x40), 1), success)mstore(0x8ae0, mload(0x840)) mstore(0x8b00, mload(0x860))mstore(0x8b20, mload(0x6440))success := and(eq(staticcall(gas(), 0x7, 0x8ae0, 0x60, 0x8ae0, 0x40), 1), success)mstore(0x8b40, mload(0x8a60)) mstore(0x8b60, mload(0x8a80))mstore(0x8b80, mload(0x8ae0)) mstore(0x8ba0, mload(0x8b00))success := and(eq(staticcall(gas(), 0x6, 0x8b40, 0x80, 0x8b40, 0x40), 1), success)mstore(0x8bc0, mload(0x720)) mstore(0x8be0, mload(0x740))mstore(0x8c00, mload(0x6460))success := and(eq(staticcall(gas(), 0x7, 0x8bc0, 0x60, 0x8bc0, 0x40), 1), success)mstore(0x8c20, mload(0x8b40)) mstore(0x8c40, mload(0x8b60))mstore(0x8c60, mload(0x8bc0)) mstore(0x8c80, mload(0x8be0))success := and(eq(staticcall(gas(), 0x6, 0x8c20, 0x80, 0x8c20, 0x40), 1), success)mstore(0x8ca0, mload(0x520)) mstore(0x8cc0, mload(0x540))mstore(0x8ce0, mload(0x67e0))success := and(eq(staticcall(gas(), 0x7, 0x8ca0, 0x60, 0x8ca0, 0x40), 1), success)mstore(0x8d00, mload(0x8c20)) mstore(0x8d20, mload(0x8c40))mstore(0x8d40, mload(0x8ca0)) mstore(0x8d60, mload(0x8cc0))success := and(eq(staticcall(gas(), 0x6, 0x8d00, 0x80, 0x8d00, 0x40), 1), success)mstore(0x8d80, mload(0x560)) mstore(0x8da0, mload(0x580))mstore(0x8dc0, mload(0x6800))success := and(eq(staticcall(gas(), 0x7, 0x8d80, 0x60, 0x8d80, 0x40), 1), success)mstore(0x8de0, mload(0x8d00)) mstore(0x8e00, mload(0x8d20))mstore(0x8e20, mload(0x8d80)) mstore(0x8e40, mload(0x8da0))success := and(eq(staticcall(gas(), 0x6, 0x8de0, 0x80, 0x8de0, 0x40), 1), success)mstore(0x8e60, mload(0x5a0)) mstore(0x8e80, mload(0x5c0))mstore(0x8ea0, mload(0x6820))success := and(eq(staticcall(gas(), 0x7, 0x8e60, 0x60, 0x8e60, 0x40), 1), success)mstore(0x8ec0, mload(0x8de0)) mstore(0x8ee0, mload(0x8e00))mstore(0x8f00, mload(0x8e60)) mstore(0x8f20, mload(0x8e80))success := and(eq(staticcall(gas(), 0x6, 0x8ec0, 0x80, 0x8ec0, 0x40), 1), success)mstore(0x8f40, mload(0x5e0)) mstore(0x8f60, mload(0x600))mstore(0x8f80, mload(0x6840))success := and(eq(staticcall(gas(), 0x7, 0x8f40, 0x60, 0x8f40, 0x40), 1), success)mstore(0x8fa0, mload(0x8ec0)) mstore(0x8fc0, mload(0x8ee0))mstore(0x8fe0, mload(0x8f40)) mstore(0x9000, mload(0x8f60))success := and(eq(staticcall(gas(), 0x6, 0x8fa0, 0x80, 0x8fa0, 0x40), 1), success)mstore(0x9020, mload(0x620)) mstore(0x9040, mload(0x640))mstore(0x9060, mload(0x6860))success := and(eq(staticcall(gas(), 0x7, 0x9020, 0x60, 0x9020, 0x40), 1), success)mstore(0x9080, mload(0x8fa0)) mstore(0x90a0, mload(0x8fc0))mstore(0x90c0, mload(0x9020)) mstore(0x90e0, mload(0x9040))success := and(eq(staticcall(gas(), 0x6, 0x9080, 0x80, 0x9080, 0x40), 1), success)mstore(0x9100, mload(0x660)) mstore(0x9120, mload(0x680))mstore(0x9140, mload(0x6aa0))success := and(eq(staticcall(gas(), 0x7, 0x9100, 0x60, 0x9100, 0x40), 1), success)mstore(0x9160, mload(0x9080)) mstore(0x9180, mload(0x90a0))mstore(0x91a0, mload(0x9100)) mstore(0x91c0, mload(0x9120))success := and(eq(staticcall(gas(), 0x6, 0x9160, 0x80, 0x9160, 0x40), 1), success)mstore(0x91e0, mload(0x6a0)) mstore(0x9200, mload(0x6c0))mstore(0x9220, mload(0x6ac0))success := and(eq(staticcall(gas(), 0x7, 0x91e0, 0x60, 0x91e0, 0x40), 1), success)mstore(0x9240, mload(0x9160)) mstore(0x9260, mload(0x9180))mstore(0x9280, mload(0x91e0)) mstore(0x92a0, mload(0x9200))success := and(eq(staticcall(gas(), 0x6, 0x9240, 0x80, 0x9240, 0x40), 1), success)mstore(0x92c0, mload(0x6e0)) mstore(0x92e0, mload(0x700))mstore(0x9300, mload(0x6ae0))success := and(eq(staticcall(gas(), 0x7, 0x92c0, 0x60, 0x92c0, 0x40), 1), success)mstore(0x9320, mload(0x9240)) mstore(0x9340, mload(0x9260))mstore(0x9360, mload(0x92c0)) mstore(0x9380, mload(0x92e0))success := and(eq(staticcall(gas(), 0x6, 0x9320, 0x80, 0x9320, 0x40), 1), success)mstore(0x93a0, mload(0x360)) mstore(0x93c0, mload(0x380))mstore(0x93e0, mload(0x6c80))success := and(eq(staticcall(gas(), 0x7, 0x93a0, 0x60, 0x93a0, 0x40), 1), success)mstore(0x9400, mload(0x9320)) mstore(0x9420, mload(0x9340))mstore(0x9440, mload(0x93a0)) mstore(0x9460, mload(0x93c0))success := and(eq(staticcall(gas(), 0x6, 0x9400, 0x80, 0x9400, 0x40), 1), success)mstore(0x9480, mload(0x3e0)) mstore(0x94a0, mload(0x400))mstore(0x94c0, mload(0x6ca0))success := and(eq(staticcall(gas(), 0x7, 0x9480, 0x60, 0x9480, 0x40), 1), success)mstore(0x94e0, mload(0x9400)) mstore(0x9500, mload(0x9420))mstore(0x9520, mload(0x9480)) mstore(0x9540, mload(0x94a0))success := and(eq(staticcall(gas(), 0x6, 0x94e0, 0x80, 0x94e0, 0x40), 1), success)mstore(0x9560, mload(0x1320)) mstore(0x9580, mload(0x1340))mstore(0x95a0, sub(f_q, mload(0x6ce0)))success := and(eq(staticcall(gas(), 0x7, 0x9560, 0x60, 0x9560, 0x40), 1), success)mstore(0x95c0, mload(0x94e0)) mstore(0x95e0, mload(0x9500))mstore(0x9600, mload(0x9560)) mstore(0x9620, mload(0x9580))success := and(eq(staticcall(gas(), 0x6, 0x95c0, 0x80, 0x95c0, 0x40), 1), success)mstore(0x9640, mload(0x13c0)) mstore(0x9660, mload(0x13e0))mstore(0x9680, mload(0x6d00))success := and(eq(staticcall(gas(), 0x7, 0x9640, 0x60, 0x9640, 0x40), 1), success)mstore(0x96a0, mload(0x95c0)) mstore(0x96c0, mload(0x95e0))mstore(0x96e0, mload(0x9640)) mstore(0x9700, mload(0x9660))success := and(eq(staticcall(gas(), 0x6, 0x96a0, 0x80, 0x96a0, 0x40), 1), success)mstore(0x9720, mload(0x96a0)) mstore(0x9740, mload(0x96c0))mstore(0x9760, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(0x9780, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(0x97a0, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(0x97c0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(0x97e0, mload(0x13c0)) mstore(0x9800, mload(0x13e0))mstore(0x9820, 0x0181624e80f3d6ae28df7e01eaeab1c0e919877a3b8a6b7fbc69a6817d596ea2) mstore(0x9840, 0x1783d30dcb12d259bb89098addf6280fa4b653be7a152542a28f7b926e27e648) mstore(0x9860, 0x00ae44489d41a0d179e2dfdc03bddd883b7109f8b6ae316a59e815c1a6b35304) mstore(0x9880, 0x0b2147ab62a386bd63e6de1522109b8c9588ab466f5aadfde8c41ca3749423ee)success := and(eq(staticcall(gas(), 0x8, 0x9720, 0x180, 0x9720, 0x20), 1), success)success := and(eq(mload(0x9720), 1), success)} return success; } } + } +} \ No newline at end of file diff --git a/justfile b/justfile index 62d01489..6e2d385c 100644 --- a/justfile +++ b/justfile @@ -17,14 +17,15 @@ setup-step network *k='22': cargo run -r -- circuit sync-step -p ./build/sync_step_$1.pkey -k $2 setup setup-committee-update network *k='25': - cargo run -r -- circuit committee-update -p ./build/committee_update_$1.pkey -k 18 \ + cargo run -r -- circuit committee-update -p ./build/committee_update_$1.pkey -k 18 \ --verifier-k $2 --verifier-pk-path ./build/committee_update_verifier_$1.pkey setup gen-verifier-step network: cargo run -r -- circuit sync-step -p ./build/sync_step_$1.pkey gen-verifier -o ./contracts/snark-verifiers/sync_step_$1.sol gen-verifier-committee-update network: - cargo run -r -- circuit aggregation -c ./lightclient-circuits/config/aggregation.json --app-pk-path ./build/committee_update.pkey --app-config-path ./lightclient-circuits/config/committee_update.json -i ./rotation -o evm-verifier ./contracts/snark-verifiers/committee_update_aggregated.yul + cargo run -r -- circuit committee-update -p ./build/committee_update_$1.pkey --verifier-pk-path ./build/committee_update_verifier_$1.pkey \ + gen-verifier -o ./contracts/snark-verifiers/committee_update_$1.sol build-contracts: cd contracts && forge build diff --git a/lightclient-circuits/src/aggregation.rs b/lightclient-circuits/src/aggregation_circuit.rs similarity index 100% rename from lightclient-circuits/src/aggregation.rs rename to lightclient-circuits/src/aggregation_circuit.rs diff --git a/lightclient-circuits/src/committee_update_circuit.rs b/lightclient-circuits/src/committee_update_circuit.rs index d91feaaf..018c01ea 100644 --- a/lightclient-circuits/src/committee_update_circuit.rs +++ b/lightclient-circuits/src/committee_update_circuit.rs @@ -245,7 +245,7 @@ mod tests { use std::fs; use crate::{ - aggregation::AggregationConfigPinning, util::Halo2ConfigPinning, + aggregation_circuit::AggregationConfigPinning, util::Halo2ConfigPinning, witness::CommitteeRotationArgs, }; diff --git a/lightclient-circuits/src/lib.rs b/lightclient-circuits/src/lib.rs index 48c2dded..4d1b5a84 100644 --- a/lightclient-circuits/src/lib.rs +++ b/lightclient-circuits/src/lib.rs @@ -11,7 +11,7 @@ pub mod gadget; pub mod util; pub mod witness; -pub mod aggregation; +pub mod aggregation_circuit; pub mod committee_update_circuit; pub mod sync_step_circuit; diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 7ac385f8..e3991fc6 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -37,6 +37,7 @@ preprocessor.workspace = true eth-types.workspace = true # misc +ark-std.workspace = true itertools.workspace = true serde.workspace = true serde_json.workspace = true diff --git a/prover/src/cli.rs b/prover/src/cli.rs index e1f323ee..307e2ae4 100644 --- a/prover/src/cli.rs +++ b/prover/src/cli.rs @@ -1,6 +1,7 @@ use crate::args::BaseArgs; use crate::args::{OperationCmd, ProofCmd}; +use ark_std::{end_timer, start_timer}; use lightclient_circuits::{ committee_update_circuit::CommitteeUpdateCircuit, halo2_proofs::halo2curves::bn256::{Bn256, Fr}, @@ -13,7 +14,9 @@ use std::path::PathBuf; use std::{fs::File, future::Future, io::Write, path::Path}; #[cfg(feature = "experimental")] -use halo2_solidity_verifier_new::{SolidityGenerator, BatchOpenScheme, compile_solidity, Evm, encode_calldata}; +use halo2_solidity_verifier_new::{ + compile_solidity, encode_calldata, BatchOpenScheme, Evm, SolidityGenerator, +}; ethers::contract::abigen!( SnarkVerifierSol, @@ -70,9 +73,19 @@ where Ok(()) } - OperationCmd::GenVerifier{ solidity_out, estimate_gas } => { + OperationCmd::GenVerifier { + solidity_out, + estimate_gas, + } => { let params = gen_srs(StepCircuit::::get_degree(&cfg_path)); - gen_evm_verifier::>(¶ms, &pk_path, &cfg_path, solidity_out, estimate_gas) + gen_evm_verifier::>( + ¶ms, + &pk_path, + &cfg_path, + solidity_out, + estimate_gas, + Default::default(), + ) } } } @@ -84,25 +97,32 @@ where pk_path, } => { let cfg_path = get_config_path(&pk_path, &base_args.config_dir); - match operation { - OperationCmd::Setup => { - let params = gen_srs(k); - let pk = CommitteeUpdateCircuit::::create_pk( - ¶ms, - &pk_path, - &cfg_path, - &Default::default(), - ); + let gen_dummy_snark = |k: u32| { + let params = gen_srs(k); - let dummy_snark = CommitteeUpdateCircuit::::gen_snark_shplonk( - ¶ms, - &pk, - &cfg_path, - None::, - &Default::default(), - ) - .map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?; + let pk = CommitteeUpdateCircuit::::create_pk( + ¶ms, + &pk_path, + &cfg_path, + &Default::default(), + ); + + CommitteeUpdateCircuit::::gen_snark_shplonk( + ¶ms, + &pk, + &cfg_path, + None::, + &Default::default(), + ) + .map_err(|e| eyre::eyre!("Failed to generate proof: {}", e)) + }; + + match operation { + OperationCmd::Setup => { + let timer = start_timer!(|| "gen committee update verifier witness"); + let dummy_snark = gen_dummy_snark(k)?; + end_timer!(timer); let verifier_params = gen_srs(verifier_k); let verifier_cfg_path = @@ -117,9 +137,28 @@ where Ok(()) } - OperationCmd::GenVerifier{ solidity_out, estimate_gas } => { - let params = gen_srs(AggregationCircuit::get_degree(&cfg_path)); - gen_evm_verifier::>(¶ms, &pk_path, &cfg_path, solidity_out, estimate_gas) + OperationCmd::GenVerifier { + solidity_out, + estimate_gas, + } => { + let timer = start_timer!(|| "gen committee update verifier witness"); + let dummy_snark = + gen_dummy_snark(CommitteeUpdateCircuit::::get_degree(&cfg_path))?; + end_timer!(timer); + + let verifier_cfg_path = + get_config_path(&verifier_pk_path, &base_args.config_dir); + let verifier_params = + gen_srs(AggregationCircuit::get_degree(&verifier_cfg_path)); + + gen_evm_verifier::( + &verifier_params, + &verifier_pk_path, + &verifier_cfg_path, + solidity_out, + estimate_gas, + vec![dummy_snark], + ) } } } @@ -142,11 +181,9 @@ fn gen_evm_verifier( cfg_path: &Path, mut path_out: PathBuf, estimate_gas: bool, -) -> eyre::Result<()> -where - Circuit::Witness: Default, -{ - let pk = Circuit::read_pk(params, pk_path, &Default::default()); + default_witness: Circuit::Witness, +) -> eyre::Result<()> { + let pk = Circuit::read_pk(params, pk_path, &default_witness); let generator = SolidityGenerator::new(params, pk.get_vk(), BatchOpenScheme::Bdfg21, 1); @@ -168,14 +205,9 @@ where ); let verifier_address = evm.create(verifier_creation_code); - let (proof, instances) = Circuit::gen_evm_proof_shplonk( - params, - &pk, - cfg_path, - None, - &Circuit::Witness::default(), - ) - .map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?; + let (proof, instances) = + Circuit::gen_evm_proof_shplonk(params, &pk, cfg_path, None, &default_witness) + .map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?; let calldata = encode_calldata(None, &proof, &instances[0]); let (gas_cost, output) = evm.call(verifier_address, calldata); assert_eq!(output, [vec![0; 31], vec![1]].concat()); @@ -192,15 +224,13 @@ fn gen_evm_verifier( cfg_path: &Path, mut path_out: PathBuf, estimate_gas: bool, -) -> eyre::Result<()> -where - Circuit::Witness: Default, -{ - let pk = Circuit::read_pk(params, pk_path, &Default::default()); - + default_witness: Circuit::Witness, +) -> eyre::Result<()> { + let pk = Circuit::read_pk(params, pk_path, &default_witness); + path_out.set_extension("yul"); let deplyment_code = - Circuit::gen_evm_verifier_shplonk(params, &pk, Some(path_out.clone()), &Default::default()) + Circuit::gen_evm_verifier_shplonk(params, &pk, Some(path_out.clone()), &default_witness) .map_err(|e| eyre::eyre!("Failed to EVM verifier: {}", e))?; println!("yul size: {}", deplyment_code.len()); @@ -217,7 +247,7 @@ where &pk, cfg_path, Some(deplyment_code), - &Circuit::Witness::default(), + &default_witness, ) .map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?; } From 27bc524a8774ccfa58fe8eebd9456e2d7a9d84a8 Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Mon, 4 Dec 2023 14:47:34 +0100 Subject: [PATCH 10/14] fix num instances in solidity gen --- prover/Cargo.toml | 2 +- prover/src/cli.rs | 83 ++++++++++++++++++++++++++--------------------- 2 files changed, 47 insertions(+), 38 deletions(-) diff --git a/prover/Cargo.toml b/prover/Cargo.toml index e3991fc6..9a144bcd 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -28,7 +28,7 @@ halo2curves.workspace = true snark-verifier.workspace = true snark-verifier-sdk.workspace = true halo2_solidity_verifier = { git = "https://github.com/privacy-scaling-explorations/halo2-solidity-verifier", branch = "ac/initial-verifier-PR", optional = true } -halo2_solidity_verifier_new = { path = "../../halo2-solidity-verifier", package = "halo2_solidity_verifier", features = ["evm"], optional = true } +halo2_solidity_verifier_new = { git = "https://github.com/privacy-scaling-explorations/halo2-solidity-verifier", package = "halo2_solidity_verifier", features = ["evm"], optional = true } # local diff --git a/prover/src/cli.rs b/prover/src/cli.rs index 307e2ae4..2dc5e962 100644 --- a/prover/src/cli.rs +++ b/prover/src/cli.rs @@ -174,7 +174,8 @@ fn get_config_path(pk_path: &Path, config_dir: &Path) -> PathBuf { config_dir.join(format!("{}.json", circuit_configuration)) } -#[cfg(feature = "experimental")] + +#[cfg(not(feature = "experimental"))] fn gen_evm_verifier( params: &ParamsKZG, pk_path: &Path, @@ -183,41 +184,44 @@ fn gen_evm_verifier( estimate_gas: bool, default_witness: Circuit::Witness, ) -> eyre::Result<()> { + use lightclient_circuits::{halo2_base::gates::circuit::CircuitBuilderStage, halo2_proofs::poly::commitment::Params}; + use snark_verifier_sdk::CircuitExt; + let pk = Circuit::read_pk(params, pk_path, &default_witness); - let generator = SolidityGenerator::new(params, pk.get_vk(), BatchOpenScheme::Bdfg21, 1); + let num_instances = { + let circuit = Circuit::create_circuit(CircuitBuilderStage::Mock, None, &default_witness, params.k()).unwrap(); + circuit.num_instance().first().map_or(0, |x| *x as u32) + }; - let verifier_sol = generator - .render() - .map_err(|e| eyre::eyre!("Failed to generate Solidity verifier: {}", e))?; + path_out.set_extension("yul"); + let deplyment_code = + Circuit::gen_evm_verifier_shplonk(params, &pk, Some(path_out.clone()), &default_witness) + .map_err(|e| eyre::eyre!("Failed to EVM verifier: {}", e))?; + println!("yul size: {}", deplyment_code.len()); + let sol_contract = halo2_solidity_verifier::fix_verifier_sol(path_out.clone(), num_instances) + .map_err(|e| eyre::eyre!("Failed to generate Solidity verifier: {}", e))?; path_out.set_extension("sol"); let mut f = File::create(path_out).unwrap(); - f.write(verifier_sol.as_bytes()) + f.write(sol_contract.as_bytes()) .map_err(|e| eyre::eyre!("Failed to write Solidity verifier: {}", e))?; if estimate_gas { - let mut evm = Evm::default(); - let verifier_creation_code = compile_solidity(&verifier_sol); - println!( - "Verifier creation code size: {}", - verifier_creation_code.len() - ); - let verifier_address = evm.create(verifier_creation_code); - - let (proof, instances) = - Circuit::gen_evm_proof_shplonk(params, &pk, cfg_path, None, &default_witness) - .map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?; - let calldata = encode_calldata(None, &proof, &instances[0]); - let (gas_cost, output) = evm.call(verifier_address, calldata); - assert_eq!(output, [vec![0; 31], vec![1]].concat()); - println!("Gas cost of verifying proof: {gas_cost}"); + let _ = Circuit::gen_evm_proof_shplonk( + params, + &pk, + cfg_path, + Some(deplyment_code), + &default_witness, + ) + .map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?; } Ok(()) } -#[cfg(not(feature = "experimental"))] +#[cfg(feature = "experimental")] fn gen_evm_verifier( params: &ParamsKZG, pk_path: &Path, @@ -228,28 +232,33 @@ fn gen_evm_verifier( ) -> eyre::Result<()> { let pk = Circuit::read_pk(params, pk_path, &default_witness); - path_out.set_extension("yul"); - let deplyment_code = - Circuit::gen_evm_verifier_shplonk(params, &pk, Some(path_out.clone()), &default_witness) - .map_err(|e| eyre::eyre!("Failed to EVM verifier: {}", e))?; - println!("yul size: {}", deplyment_code.len()); + let generator = SolidityGenerator::new(params, pk.get_vk(), BatchOpenScheme::Bdfg21, 1); - let sol_contract = halo2_solidity_verifier::fix_verifier_sol(path_out.clone(), 1) + let verifier_sol = generator + .render() .map_err(|e| eyre::eyre!("Failed to generate Solidity verifier: {}", e))?; + path_out.set_extension("sol"); let mut f = File::create(path_out).unwrap(); - f.write(sol_contract.as_bytes()) + f.write(verifier_sol.as_bytes()) .map_err(|e| eyre::eyre!("Failed to write Solidity verifier: {}", e))?; if estimate_gas { - let _ = Circuit::gen_evm_proof_shplonk( - params, - &pk, - cfg_path, - Some(deplyment_code), - &default_witness, - ) - .map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?; + let mut evm = Evm::default(); + let verifier_creation_code = compile_solidity(&verifier_sol); + println!( + "Verifier creation code size: {}", + verifier_creation_code.len() + ); + let verifier_address = evm.create(verifier_creation_code); + + let (proof, instances) = + Circuit::gen_evm_proof_shplonk(params, &pk, cfg_path, None, &default_witness) + .map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?; + let calldata = encode_calldata(None, &proof, &instances[0]); + let (gas_cost, output) = evm.call(verifier_address, calldata); + assert_eq!(output, [vec![0; 31], vec![1]].concat()); + println!("Gas cost of verifying proof: {gas_cost}"); } Ok(()) From dad01727640b57291f43a524eed20de4b356cd84 Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Mon, 4 Dec 2023 15:02:11 +0100 Subject: [PATCH 11/14] use remote dependency --- prover/Cargo.toml | 3 +-- prover/src/cli.rs | 30 ++++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 9a144bcd..89db6b26 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -28,8 +28,7 @@ halo2curves.workspace = true snark-verifier.workspace = true snark-verifier-sdk.workspace = true halo2_solidity_verifier = { git = "https://github.com/privacy-scaling-explorations/halo2-solidity-verifier", branch = "ac/initial-verifier-PR", optional = true } -halo2_solidity_verifier_new = { git = "https://github.com/privacy-scaling-explorations/halo2-solidity-verifier", package = "halo2_solidity_verifier", features = ["evm"], optional = true } - +halo2_solidity_verifier_new = { git = "https://github.com/timoftime/halo2-solidity-verifier", branch = "bump-halo2proofs", package = "halo2_solidity_verifier", features = ["evm"], optional = true } # local lightclient-circuits.workspace = true diff --git a/prover/src/cli.rs b/prover/src/cli.rs index 2dc5e962..af552fec 100644 --- a/prover/src/cli.rs +++ b/prover/src/cli.rs @@ -8,8 +8,12 @@ use lightclient_circuits::{ sync_step_circuit::StepCircuit, util::{gen_srs, AppCircuit}, }; +use lightclient_circuits::{ + halo2_base::gates::circuit::CircuitBuilderStage, halo2_proofs::poly::commitment::Params, +}; use snark_verifier::loader::halo2::halo2_ecc::halo2_base::halo2_proofs::poly::kzg::commitment::ParamsKZG; use snark_verifier_sdk::halo2::aggregation::AggregationCircuit; +use snark_verifier_sdk::CircuitExt; use std::path::PathBuf; use std::{fs::File, future::Future, io::Write, path::Path}; @@ -174,7 +178,6 @@ fn get_config_path(pk_path: &Path, config_dir: &Path) -> PathBuf { config_dir.join(format!("{}.json", circuit_configuration)) } - #[cfg(not(feature = "experimental"))] fn gen_evm_verifier( params: &ParamsKZG, @@ -184,13 +187,16 @@ fn gen_evm_verifier( estimate_gas: bool, default_witness: Circuit::Witness, ) -> eyre::Result<()> { - use lightclient_circuits::{halo2_base::gates::circuit::CircuitBuilderStage, halo2_proofs::poly::commitment::Params}; - use snark_verifier_sdk::CircuitExt; - let pk = Circuit::read_pk(params, pk_path, &default_witness); let num_instances = { - let circuit = Circuit::create_circuit(CircuitBuilderStage::Mock, None, &default_witness, params.k()).unwrap(); + let circuit = Circuit::create_circuit( + CircuitBuilderStage::Mock, + None, + &default_witness, + params.k(), + ) + .unwrap(); circuit.num_instance().first().map_or(0, |x| *x as u32) }; @@ -232,7 +238,19 @@ fn gen_evm_verifier( ) -> eyre::Result<()> { let pk = Circuit::read_pk(params, pk_path, &default_witness); - let generator = SolidityGenerator::new(params, pk.get_vk(), BatchOpenScheme::Bdfg21, 1); + let num_instances = { + let circuit = Circuit::create_circuit( + CircuitBuilderStage::Mock, + None, + &default_witness, + params.k(), + ) + .unwrap(); + circuit.num_instance().first().map_or(0, |x| *x) + }; + + let generator = + SolidityGenerator::new(params, pk.get_vk(), BatchOpenScheme::Bdfg21, num_instances); let verifier_sol = generator .render() From 62148e1aea59552e568b2d41599b97ef16467897 Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Mon, 4 Dec 2023 15:16:06 +0100 Subject: [PATCH 12/14] use old verion of sync step verifier --- contracts/snark-verifiers/sync_step.sol | 1326 +---------------------- 1 file changed, 21 insertions(+), 1305 deletions(-) diff --git a/contracts/snark-verifiers/sync_step.sol b/contracts/snark-verifiers/sync_step.sol index 9a80c3d6..c28bf418 100644 --- a/contracts/snark-verifiers/sync_step.sol +++ b/contracts/snark-verifiers/sync_step.sol @@ -1,1307 +1,23 @@ // SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -contract Halo2Verifier { - uint256 internal constant PROOF_LEN_CPTR = 0x44; - uint256 internal constant PROOF_CPTR = 0x64; - uint256 internal constant NUM_INSTANCE_CPTR = 0x10a4; - uint256 internal constant INSTANCE_CPTR = 0x10c4; - - uint256 internal constant FIRST_QUOTIENT_X_CPTR = 0x05e4; - uint256 internal constant LAST_QUOTIENT_X_CPTR = 0x0664; - - uint256 internal constant VK_MPTR = 0x09a0; - uint256 internal constant VK_DIGEST_MPTR = 0x09a0; - uint256 internal constant K_MPTR = 0x09c0; - uint256 internal constant N_INV_MPTR = 0x09e0; - uint256 internal constant OMEGA_MPTR = 0x0a00; - uint256 internal constant OMEGA_INV_MPTR = 0x0a20; - uint256 internal constant OMEGA_INV_TO_L_MPTR = 0x0a40; - uint256 internal constant NUM_INSTANCES_MPTR = 0x0a60; - uint256 internal constant HAS_ACCUMULATOR_MPTR = 0x0a80; - uint256 internal constant ACC_OFFSET_MPTR = 0x0aa0; - uint256 internal constant NUM_ACC_LIMBS_MPTR = 0x0ac0; - uint256 internal constant NUM_ACC_LIMB_BITS_MPTR = 0x0ae0; - uint256 internal constant G1_X_MPTR = 0x0b00; - uint256 internal constant G1_Y_MPTR = 0x0b20; - uint256 internal constant G2_X_1_MPTR = 0x0b40; - uint256 internal constant G2_X_2_MPTR = 0x0b60; - uint256 internal constant G2_Y_1_MPTR = 0x0b80; - uint256 internal constant G2_Y_2_MPTR = 0x0ba0; - uint256 internal constant NEG_S_G2_X_1_MPTR = 0x0bc0; - uint256 internal constant NEG_S_G2_X_2_MPTR = 0x0be0; - uint256 internal constant NEG_S_G2_Y_1_MPTR = 0x0c00; - uint256 internal constant NEG_S_G2_Y_2_MPTR = 0x0c20; - - uint256 internal constant CHALLENGE_MPTR = 0x1180; - - uint256 internal constant THETA_MPTR = 0x1180; - uint256 internal constant BETA_MPTR = 0x11a0; - uint256 internal constant GAMMA_MPTR = 0x11c0; - uint256 internal constant Y_MPTR = 0x11e0; - uint256 internal constant X_MPTR = 0x1200; - uint256 internal constant ZETA_MPTR = 0x1220; - uint256 internal constant NU_MPTR = 0x1240; - uint256 internal constant MU_MPTR = 0x1260; - - uint256 internal constant ACC_LHS_X_MPTR = 0x1280; - uint256 internal constant ACC_LHS_Y_MPTR = 0x12a0; - uint256 internal constant ACC_RHS_X_MPTR = 0x12c0; - uint256 internal constant ACC_RHS_Y_MPTR = 0x12e0; - uint256 internal constant X_N_MPTR = 0x1300; - uint256 internal constant X_N_MINUS_1_INV_MPTR = 0x1320; - uint256 internal constant L_LAST_MPTR = 0x1340; - uint256 internal constant L_BLIND_MPTR = 0x1360; - uint256 internal constant L_0_MPTR = 0x1380; - uint256 internal constant INSTANCE_EVAL_MPTR = 0x13a0; - uint256 internal constant QUOTIENT_EVAL_MPTR = 0x13c0; - uint256 internal constant QUOTIENT_X_MPTR = 0x13e0; - uint256 internal constant QUOTIENT_Y_MPTR = 0x1400; - uint256 internal constant R_EVAL_MPTR = 0x1420; - uint256 internal constant PAIRING_LHS_X_MPTR = 0x1440; - uint256 internal constant PAIRING_LHS_Y_MPTR = 0x1460; - uint256 internal constant PAIRING_RHS_X_MPTR = 0x1480; - uint256 internal constant PAIRING_RHS_Y_MPTR = 0x14a0; - - function verifyProof( - bytes calldata proof, - uint256[] calldata instances - ) public returns (bool) { - assembly { - // Read EC point (x, y) at (proof_cptr, proof_cptr + 0x20), - // and check if the point is on affine plane, - // and store them in (hash_mptr, hash_mptr + 0x20). - // Return updated (success, proof_cptr, hash_mptr). - function read_ec_point(success, proof_cptr, hash_mptr, q) -> ret0, ret1, ret2 { - let x := calldataload(proof_cptr) - let y := calldataload(add(proof_cptr, 0x20)) - ret0 := and(success, lt(x, q)) - ret0 := and(ret0, lt(y, q)) - ret0 := and(ret0, eq(mulmod(y, y, q), addmod(mulmod(x, mulmod(x, x, q), q), 3, q))) - mstore(hash_mptr, x) - mstore(add(hash_mptr, 0x20), y) - ret1 := add(proof_cptr, 0x40) - ret2 := add(hash_mptr, 0x40) - } - - // Squeeze challenge by keccak256(memory[0..hash_mptr]), - // and store hash mod r as challenge in challenge_mptr, - // and push back hash in 0x00 as the first input for next squeeze. - // Return updated (challenge_mptr, hash_mptr). - function squeeze_challenge(challenge_mptr, hash_mptr, r) -> ret0, ret1 { - let hash := keccak256(0x00, hash_mptr) - mstore(challenge_mptr, mod(hash, r)) - mstore(0x00, hash) - ret0 := add(challenge_mptr, 0x20) - ret1 := 0x20 - } - - // Squeeze challenge without absorbing new input from calldata, - // by putting an extra 0x01 in memory[0x20] and squeeze by keccak256(memory[0..21]), - // and store hash mod r as challenge in challenge_mptr, - // and push back hash in 0x00 as the first input for next squeeze. - // Return updated (challenge_mptr). - function squeeze_challenge_cont(challenge_mptr, r) -> ret { - mstore8(0x20, 0x01) - let hash := keccak256(0x00, 0x21) - mstore(challenge_mptr, mod(hash, r)) - mstore(0x00, hash) - ret := add(challenge_mptr, 0x20) - } - - // Batch invert values in memory[mptr_start..mptr_end] in place. - // Return updated (success). - function batch_invert(success, mptr_start, mptr_end, r) -> ret { - let gp_mptr := mptr_end - let gp := mload(mptr_start) - let mptr := add(mptr_start, 0x20) - for - {} - lt(mptr, sub(mptr_end, 0x20)) - {} - { - gp := mulmod(gp, mload(mptr), r) - mstore(gp_mptr, gp) - mptr := add(mptr, 0x20) - gp_mptr := add(gp_mptr, 0x20) - } - gp := mulmod(gp, mload(mptr), r) - - mstore(gp_mptr, 0x20) - mstore(add(gp_mptr, 0x20), 0x20) - mstore(add(gp_mptr, 0x40), 0x20) - mstore(add(gp_mptr, 0x60), gp) - mstore(add(gp_mptr, 0x80), sub(r, 2)) - mstore(add(gp_mptr, 0xa0), r) - ret := and(success, staticcall(gas(), 0x05, gp_mptr, 0xc0, gp_mptr, 0x20)) - let all_inv := mload(gp_mptr) - - let first_mptr := mptr_start - let second_mptr := add(first_mptr, 0x20) - gp_mptr := sub(gp_mptr, 0x20) - for - {} - lt(second_mptr, mptr) - {} - { - let inv := mulmod(all_inv, mload(gp_mptr), r) - all_inv := mulmod(all_inv, mload(mptr), r) - mstore(mptr, inv) - mptr := sub(mptr, 0x20) - gp_mptr := sub(gp_mptr, 0x20) - } - let inv_first := mulmod(all_inv, mload(second_mptr), r) - let inv_second := mulmod(all_inv, mload(first_mptr), r) - mstore(first_mptr, inv_first) - mstore(second_mptr, inv_second) - } - - // Add (x, y) into point at (0x00, 0x20). - // Return updated (success). - function ec_add_acc(success, x, y) -> ret { - mstore(0x40, x) - mstore(0x60, y) - ret := and(success, staticcall(gas(), 0x06, 0x00, 0x80, 0x00, 0x40)) - } - - // Scale point at (0x00, 0x20) by scalar. - function ec_mul_acc(success, scalar) -> ret { - mstore(0x40, scalar) - ret := and(success, staticcall(gas(), 0x07, 0x00, 0x60, 0x00, 0x40)) - } - - // Add (x, y) into point at (0x80, 0xa0). - // Return updated (success). - function ec_add_tmp(success, x, y) -> ret { - mstore(0xc0, x) - mstore(0xe0, y) - ret := and(success, staticcall(gas(), 0x06, 0x80, 0x80, 0x80, 0x40)) - } - - // Scale point at (0x80, 0xa0) by scalar. - // Return updated (success). - function ec_mul_tmp(success, scalar) -> ret { - mstore(0xc0, scalar) - ret := and(success, staticcall(gas(), 0x07, 0x80, 0x60, 0x80, 0x40)) - } - - // Perform pairing check. - // Return updated (success). - function ec_pairing(success, lhs_x, lhs_y, rhs_x, rhs_y) -> ret { - mstore(0x00, lhs_x) - mstore(0x20, lhs_y) - mstore(0x40, mload(G2_X_1_MPTR)) - mstore(0x60, mload(G2_X_2_MPTR)) - mstore(0x80, mload(G2_Y_1_MPTR)) - mstore(0xa0, mload(G2_Y_2_MPTR)) - mstore(0xc0, rhs_x) - mstore(0xe0, rhs_y) - mstore(0x100, mload(NEG_S_G2_X_1_MPTR)) - mstore(0x120, mload(NEG_S_G2_X_2_MPTR)) - mstore(0x140, mload(NEG_S_G2_Y_1_MPTR)) - mstore(0x160, mload(NEG_S_G2_Y_2_MPTR)) - ret := and(success, staticcall(gas(), 0x08, 0x00, 0x180, 0x00, 0x20)) - ret := and(ret, mload(0x00)) - } - - // Modulus - let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // BN254 base field - let r := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // BN254 scalar field - - // Initialize success as true - let success := true - - { - // Load vk into memory - mstore(0x09a0, 0x018b0a93b2ba7daec30e3b6c1bcd045511fd208c8d54227705591ca7ced9563c) // vk_digest - mstore(0x09c0, 0x0000000000000000000000000000000000000000000000000000000000000016) // k - mstore(0x09e0, 0x30644db14ff7d4a4f1cf9ed5406a7e5722d273a7aa184eaa5e1fb0846829b041) // n_inv - mstore(0x0a00, 0x18c95f1ae6514e11a1b30fd7923947c5ffcec5347f16e91b4dd654168326bede) // omega - mstore(0x0a20, 0x134f571fe34eb8c7b1685e875b324820e199bd70157493377cd65b204d1a3964) // omega_inv - mstore(0x0a40, 0x1d3d878f52016737bda697d23b0cee81488efd02d67b27eae3edab5f39ef347d) // omega_inv_to_l - mstore(0x0a60, 0x0000000000000000000000000000000000000000000000000000000000000001) // num_instances - mstore(0x0a80, 0x0000000000000000000000000000000000000000000000000000000000000000) // has_accumulator - mstore(0x0aa0, 0x0000000000000000000000000000000000000000000000000000000000000000) // acc_offset - mstore(0x0ac0, 0x0000000000000000000000000000000000000000000000000000000000000000) // num_acc_limbs - mstore(0x0ae0, 0x0000000000000000000000000000000000000000000000000000000000000000) // num_acc_limb_bits - mstore(0x0b00, 0x0000000000000000000000000000000000000000000000000000000000000001) // g1_x - mstore(0x0b20, 0x0000000000000000000000000000000000000000000000000000000000000002) // g1_y - mstore(0x0b40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // g2_x_1 - mstore(0x0b60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) // g2_x_2 - mstore(0x0b80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) // g2_y_1 - mstore(0x0ba0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) // g2_y_2 - mstore(0x0bc0, 0x0181624e80f3d6ae28df7e01eaeab1c0e919877a3b8a6b7fbc69a6817d596ea2) // neg_s_g2_x_1 - mstore(0x0be0, 0x1783d30dcb12d259bb89098addf6280fa4b653be7a152542a28f7b926e27e648) // neg_s_g2_x_2 - mstore(0x0c00, 0x00ae44489d41a0d179e2dfdc03bddd883b7109f8b6ae316a59e815c1a6b35304) // neg_s_g2_y_1 - mstore(0x0c20, 0x0b2147ab62a386bd63e6de1522109b8c9588ab466f5aadfde8c41ca3749423ee) // neg_s_g2_y_2 - mstore(0x0c40, 0x04d043081f0d55eead6d8ad7b10d09a6ee2718f445d9bce454075a8a37bacaf3) // fixed_comms[0].x - mstore(0x0c60, 0x27d6bcbb02cd624ab80b5532a0a65fc6f88a0faf7cf3e0d106f4aa0aa25e758b) // fixed_comms[0].y - mstore(0x0c80, 0x0d3b7c04b7391ddf5d9fc5f8906033e1d1442f341c4cab5c1584c8082ea8c21c) // fixed_comms[1].x - mstore(0x0ca0, 0x1596df7247ab32fb79261c31617e2f2bbde95b6e8719386dacfeaa8f6d7df60c) // fixed_comms[1].y - mstore(0x0cc0, 0x04d043081f0d55eead6d8ad7b10d09a6ee2718f445d9bce454075a8a37bacaf3) // fixed_comms[2].x - mstore(0x0ce0, 0x27d6bcbb02cd624ab80b5532a0a65fc6f88a0faf7cf3e0d106f4aa0aa25e758b) // fixed_comms[2].y - mstore(0x0d00, 0x2d07a1bca289cdb98b648a91cbb0809dfa3a06fe01047b291d1161ddf8d1732c) // fixed_comms[3].x - mstore(0x0d20, 0x021d078d5869c57b3fe2413b517561205de5f297ac56c0e5ef0f1a7f4a31ee94) // fixed_comms[3].y - mstore(0x0d40, 0x2808de5f33581574dd857304add28f30335fa32c49a3d7c9128f5a3f453360cc) // fixed_comms[4].x - mstore(0x0d60, 0x07f10d421231cb6aa063db7a3cf7be709ff037fbb78d19c866d7c2c674a1aaf0) // fixed_comms[4].y - mstore(0x0d80, 0x2a9d8bc0a06a141e47fa114e4e62686823227f5416f19f9b2b54b9948a0bfb4b) // fixed_comms[5].x - mstore(0x0da0, 0x170610ca7497030a3dbbfeb52cc8f5f086e7a7a91e3b52e44988e6b24f1c6c34) // fixed_comms[5].y - mstore(0x0dc0, 0x104eb8e796d7c0b0ac9eb316eac3aadbcf9ac5b42d4b14a95ec269fefd70d9ac) // fixed_comms[6].x - mstore(0x0de0, 0x22e1365078923b7f828a54c75e0b0b108c311580bac730c92d8868c7781a917b) // fixed_comms[6].y - mstore(0x0e00, 0x2e8f499835598c80e2ec4cabd4753e67822df35d0a29c05b60dca21d9173b11a) // fixed_comms[7].x - mstore(0x0e20, 0x02990fa09b4831443e5956b84832f525976cd30aa6cafe055a45f7a04328d00f) // fixed_comms[7].y - mstore(0x0e40, 0x258bbf1a0f256c29c1cee612fb7deaa2102870b85d7bda1ac8064307a593101f) // fixed_comms[8].x - mstore(0x0e60, 0x2bbbde7d34cf03b70ea4a0125d6736aeb56da64f07226bf4d662a85e8d50db3a) // fixed_comms[8].y - mstore(0x0e80, 0x05127b4a2ff58c747435761c7256b8094a0cf4e6d0f829a060c601d5cce0fdc0) // fixed_comms[9].x - mstore(0x0ea0, 0x106a8cecab556f1a6d729cdeefd6dd70afbe4954cae4785871d68396dba88d95) // fixed_comms[9].y - mstore(0x0ec0, 0x24c985411f901ba3e9fe3296d58db7a896d53a060afc4c3b85182122d2a06b16) // permutation_comms[0].x - mstore(0x0ee0, 0x1e02136b244f617c37779b0cb970dce25ff03579c671e7f3f57a320e7b1a4b06) // permutation_comms[0].y - mstore(0x0f00, 0x0e5c5a486399e328a6629926a042fde07863ce1a2e91995ee60e5c477008ebdc) // permutation_comms[1].x - mstore(0x0f20, 0x223b4bdd8d3877955728258fd5be1b7f2ac8093891a83c738f80395720cc55ca) // permutation_comms[1].y - mstore(0x0f40, 0x2e55f008e10b629fc37b0808b8264d2857e6fa34a1be704a4132f9c1621b8736) // permutation_comms[2].x - mstore(0x0f60, 0x01c3487db12618c270ffe8251633753bdad9fd2968144a02b18447bee326d19d) // permutation_comms[2].y - mstore(0x0f80, 0x0154bffa5c54063b60c4f4c66b2a9acb09fd7f1b2653a9f2b9ee75bcb1bc8ba2) // permutation_comms[3].x - mstore(0x0fa0, 0x0b15f039df5ebe088e2231ce9a07c50dbb4739402712b56dd8bab6ab93a95f3f) // permutation_comms[3].y - mstore(0x0fc0, 0x0032a37f146820eccad7796039d21d0c85504baff34e194f750d7f8c4eccf729) // permutation_comms[4].x - mstore(0x0fe0, 0x2a655340cddc523abd37c3d77f022b8e616194a3c31e414dc5d466eb2e4c0b69) // permutation_comms[4].y - mstore(0x1000, 0x0d6b367e25327ebd99fae2aaffa6fad2acae34ba7b329ef817a95fe425f65e4d) // permutation_comms[5].x - mstore(0x1020, 0x2bc4769ce00a494fde791f07b3f092019995d323c0b067d61e0660e1ad84d94f) // permutation_comms[5].y - mstore(0x1040, 0x0fef43d29ecdb947fc934c7adf7f38748fe212082d5a8e3bc621ff907213812b) // permutation_comms[6].x - mstore(0x1060, 0x1ab8ccbb8486a5508a34837db62c3426d6f6210970a2b1351f12d0ba73e11874) // permutation_comms[6].y - mstore(0x1080, 0x29cc03da3870fc7139115d43275baf04cc110d79f85d2c2e712b981c409df25e) // permutation_comms[7].x - mstore(0x10a0, 0x016a8cd002e522595ef910f87dc707449ae5f56876eb88274b2e586fceacf165) // permutation_comms[7].y - mstore(0x10c0, 0x0ec6d72e2ce7c233ca8af2fc2bd4223a6d81d545e8785579de4cb241740f36a2) // permutation_comms[8].x - mstore(0x10e0, 0x028a4450999577e25fc7d191fecf7f1a8a0526f7e042f316767c7ff43299fdd9) // permutation_comms[8].y - mstore(0x1100, 0x1fdb57cefe9c10024dfe402759cad8061e8d0edeba3f42f187ea796b1938118e) // permutation_comms[9].x - mstore(0x1120, 0x1294d92ed67eec88a2adbb5cef0682a64fae9827c02d37e69beaddd3b6a145ad) // permutation_comms[9].y - mstore(0x1140, 0x292267e75402bf3fb816d404fe987ec7b277ec539cd653568a31dc8fdd04b6f1) // permutation_comms[10].x - mstore(0x1160, 0x0a2975f29c8f29df52ea4e941daa28752eea2da8c6b6135622e4a0d823accd78) // permutation_comms[10].y - - // Check valid length of proof - success := and(success, eq(0x1040, calldataload(PROOF_LEN_CPTR))) - - // Check valid length of instances - let num_instances := mload(NUM_INSTANCES_MPTR) - success := and(success, eq(num_instances, calldataload(NUM_INSTANCE_CPTR))) - - // Absorb vk diegst - mstore(0x00, mload(VK_DIGEST_MPTR)) - - // Read instances and witness commitments and generate challenges - let hash_mptr := 0x20 - let instance_cptr := INSTANCE_CPTR - for - { let instance_cptr_end := add(instance_cptr, mul(0x20, num_instances)) } - lt(instance_cptr, instance_cptr_end) - {} - { - let instance := calldataload(instance_cptr) - success := and(success, lt(instance, r)) - mstore(hash_mptr, instance) - instance_cptr := add(instance_cptr, 0x20) - hash_mptr := add(hash_mptr, 0x20) - } - - let proof_cptr := PROOF_CPTR - let challenge_mptr := CHALLENGE_MPTR - - // Phase 1 - for - { let proof_cptr_end := add(proof_cptr, 0x0240) } - lt(proof_cptr, proof_cptr_end) - {} - { - success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) - } - - challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) - - // Phase 2 - for - { let proof_cptr_end := add(proof_cptr, 0x0100) } - lt(proof_cptr, proof_cptr_end) - {} - { - success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) - } - - challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) - challenge_mptr := squeeze_challenge_cont(challenge_mptr, r) - - // Phase 3 - for - { let proof_cptr_end := add(proof_cptr, 0x0240) } - lt(proof_cptr, proof_cptr_end) - {} - { - success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) - } - - challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) - - // Phase 4 - for - { let proof_cptr_end := add(proof_cptr, 0xc0) } - lt(proof_cptr, proof_cptr_end) - {} - { - success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) - } - - challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) - - // Read evaluations - for - { let proof_cptr_end := add(proof_cptr, 0x0980) } - lt(proof_cptr, proof_cptr_end) - {} - { - let eval := calldataload(proof_cptr) - success := and(success, lt(eval, r)) - mstore(hash_mptr, eval) - proof_cptr := add(proof_cptr, 0x20) - hash_mptr := add(hash_mptr, 0x20) - } - - // Read batch opening proof and generate challenges - challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) // zeta - challenge_mptr := squeeze_challenge_cont(challenge_mptr, r) // nu - - success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) // W - - challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) // mu - - success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) // W' - - // Read accumulator from instances - if mload(HAS_ACCUMULATOR_MPTR) { - let num_limbs := mload(NUM_ACC_LIMBS_MPTR) - let num_limb_bits := mload(NUM_ACC_LIMB_BITS_MPTR) - - let cptr := add(INSTANCE_CPTR, mul(mload(ACC_OFFSET_MPTR), 0x20)) - let lhs_y_off := mul(num_limbs, 0x20) - let rhs_x_off := mul(lhs_y_off, 2) - let rhs_y_off := mul(lhs_y_off, 3) - let lhs_x := calldataload(cptr) - let lhs_y := calldataload(add(cptr, lhs_y_off)) - let rhs_x := calldataload(add(cptr, rhs_x_off)) - let rhs_y := calldataload(add(cptr, rhs_y_off)) - for - { - let cptr_end := add(cptr, mul(0x20, num_limbs)) - let shift := num_limb_bits - } - lt(cptr, cptr_end) - {} - { - cptr := add(cptr, 0x20) - lhs_x := add(lhs_x, shl(shift, calldataload(cptr))) - lhs_y := add(lhs_y, shl(shift, calldataload(add(cptr, lhs_y_off)))) - rhs_x := add(rhs_x, shl(shift, calldataload(add(cptr, rhs_x_off)))) - rhs_y := add(rhs_y, shl(shift, calldataload(add(cptr, rhs_y_off)))) - shift := add(shift, num_limb_bits) - } - - success := and(success, eq(mulmod(lhs_y, lhs_y, q), addmod(mulmod(lhs_x, mulmod(lhs_x, lhs_x, q), q), 3, q))) - success := and(success, eq(mulmod(rhs_y, rhs_y, q), addmod(mulmod(rhs_x, mulmod(rhs_x, rhs_x, q), q), 3, q))) - - mstore(ACC_LHS_X_MPTR, lhs_x) - mstore(ACC_LHS_Y_MPTR, lhs_y) - mstore(ACC_RHS_X_MPTR, rhs_x) - mstore(ACC_RHS_Y_MPTR, rhs_y) - } - - pop(q) - } - - // Revert earlier if anything from calldata is invalid - if iszero(success) { - revert(0, 0) - } - - // Compute lagrange evaluations and instance evaluation - { - let k := mload(K_MPTR) - let x := mload(X_MPTR) - let x_n := x - for - { let idx := 0 } - lt(idx, k) - { idx := add(idx, 1) } - { - x_n := mulmod(x_n, x_n, r) - } - - let omega := mload(OMEGA_MPTR) - - let mptr := X_N_MPTR - let mptr_end := add(mptr, mul(0x20, add(mload(NUM_INSTANCES_MPTR), 7))) - if iszero(mload(NUM_INSTANCES_MPTR)) { - mptr_end := add(mptr_end, 0x20) - } - for - { let pow_of_omega := mload(OMEGA_INV_TO_L_MPTR) } - lt(mptr, mptr_end) - { mptr := add(mptr, 0x20) } - { - mstore(mptr, addmod(x, sub(r, pow_of_omega), r)) - pow_of_omega := mulmod(pow_of_omega, omega, r) - } - let x_n_minus_1 := addmod(x_n, sub(r, 1), r) - mstore(mptr_end, x_n_minus_1) - success := batch_invert(success, X_N_MPTR, add(mptr_end, 0x20), r) - - mptr := X_N_MPTR - let l_i_common := mulmod(x_n_minus_1, mload(N_INV_MPTR), r) - for - { let pow_of_omega := mload(OMEGA_INV_TO_L_MPTR) } - lt(mptr, mptr_end) - { mptr := add(mptr, 0x20) } - { - mstore(mptr, mulmod(l_i_common, mulmod(mload(mptr), pow_of_omega, r), r)) - pow_of_omega := mulmod(pow_of_omega, omega, r) - } - - let l_blind := mload(add(X_N_MPTR, 0x20)) - let l_i_cptr := add(X_N_MPTR, 0x40) - for - { let l_i_cptr_end := add(X_N_MPTR, 0xe0) } - lt(l_i_cptr, l_i_cptr_end) - { l_i_cptr := add(l_i_cptr, 0x20) } - { - l_blind := addmod(l_blind, mload(l_i_cptr), r) - } - - let instance_eval := 0 - for - { - let instance_cptr := INSTANCE_CPTR - let instance_cptr_end := add(instance_cptr, mul(0x20, mload(NUM_INSTANCES_MPTR))) - } - lt(instance_cptr, instance_cptr_end) - { - instance_cptr := add(instance_cptr, 0x20) - l_i_cptr := add(l_i_cptr, 0x20) - } - { - instance_eval := addmod(instance_eval, mulmod(mload(l_i_cptr), calldataload(instance_cptr), r), r) - } - - let x_n_minus_1_inv := mload(mptr_end) - let l_last := mload(X_N_MPTR) - let l_0 := mload(add(X_N_MPTR, 0xe0)) - - mstore(X_N_MPTR, x_n) - mstore(X_N_MINUS_1_INV_MPTR, x_n_minus_1_inv) - mstore(L_LAST_MPTR, l_last) - mstore(L_BLIND_MPTR, l_blind) - mstore(L_0_MPTR, l_0) - mstore(INSTANCE_EVAL_MPTR, instance_eval) - } - - // Compute quotient evavluation - { - let quotient_eval_numer - let delta := 4131629893567559867359510883348571134090853742863529169391034518566172092834 - let y := mload(Y_MPTR) - { - let f_4 := calldataload(0x0a84) - let a_0 := calldataload(0x06a4) - let a_0_next_1 := calldataload(0x06c4) - let a_0_next_2 := calldataload(0x06e4) - let var0 := mulmod(a_0_next_1, a_0_next_2, r) - let var1 := addmod(a_0, var0, r) - let a_0_next_3 := calldataload(0x0704) - let var2 := sub(r, a_0_next_3) - let var3 := addmod(var1, var2, r) - let var4 := mulmod(f_4, var3, r) - quotient_eval_numer := var4 - } - { - let f_5 := calldataload(0x0aa4) - let a_1 := calldataload(0x0724) - let a_1_next_1 := calldataload(0x0744) - let a_1_next_2 := calldataload(0x0764) - let var0 := mulmod(a_1_next_1, a_1_next_2, r) - let var1 := addmod(a_1, var0, r) - let a_1_next_3 := calldataload(0x0784) - let var2 := sub(r, a_1_next_3) - let var3 := addmod(var1, var2, r) - let var4 := mulmod(f_5, var3, r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var4, r) - } - { - let f_6 := calldataload(0x0ac4) - let a_2 := calldataload(0x07a4) - let a_2_next_1 := calldataload(0x07c4) - let a_2_next_2 := calldataload(0x07e4) - let var0 := mulmod(a_2_next_1, a_2_next_2, r) - let var1 := addmod(a_2, var0, r) - let a_2_next_3 := calldataload(0x0804) - let var2 := sub(r, a_2_next_3) - let var3 := addmod(var1, var2, r) - let var4 := mulmod(f_6, var3, r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var4, r) - } - { - let f_7 := calldataload(0x0ae4) - let a_3 := calldataload(0x0824) - let a_3_next_1 := calldataload(0x0844) - let a_3_next_2 := calldataload(0x0864) - let var0 := mulmod(a_3_next_1, a_3_next_2, r) - let var1 := addmod(a_3, var0, r) - let a_3_next_3 := calldataload(0x0884) - let var2 := sub(r, a_3_next_3) - let var3 := addmod(var1, var2, r) - let var4 := mulmod(f_7, var3, r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var4, r) - } - { - let f_8 := calldataload(0x0b04) - let a_4 := calldataload(0x08a4) - let a_4_next_1 := calldataload(0x08c4) - let a_4_next_2 := calldataload(0x08e4) - let var0 := mulmod(a_4_next_1, a_4_next_2, r) - let var1 := addmod(a_4, var0, r) - let a_4_next_3 := calldataload(0x0904) - let var2 := sub(r, a_4_next_3) - let var3 := addmod(var1, var2, r) - let var4 := mulmod(f_8, var3, r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var4, r) - } - { - let f_9 := calldataload(0x0b24) - let a_5 := calldataload(0x0924) - let a_5_next_1 := calldataload(0x0944) - let a_5_next_2 := calldataload(0x0964) - let var0 := mulmod(a_5_next_1, a_5_next_2, r) - let var1 := addmod(a_5, var0, r) - let a_5_next_3 := calldataload(0x0984) - let var2 := sub(r, a_5_next_3) - let var3 := addmod(var1, var2, r) - let var4 := mulmod(f_9, var3, r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var4, r) - } - { - let l_0 := mload(L_0_MPTR) - let eval := addmod(l_0, sub(r, mulmod(l_0, calldataload(0x0cc4), r)), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let perm_z_last := calldataload(0x0ea4) - let eval := mulmod(mload(L_LAST_MPTR), addmod(mulmod(perm_z_last, perm_z_last, r), sub(r, perm_z_last), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0d24), sub(r, calldataload(0x0d04)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0d84), sub(r, calldataload(0x0d64)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0de4), sub(r, calldataload(0x0dc4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0e44), sub(r, calldataload(0x0e24)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0ea4), sub(r, calldataload(0x0e84)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let gamma := mload(GAMMA_MPTR) - let beta := mload(BETA_MPTR) - let lhs := calldataload(0x0ce4) - let rhs := calldataload(0x0cc4) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0a04), mulmod(beta, calldataload(0x0b64), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x06a4), mulmod(beta, calldataload(0x0b84), r), r), gamma, r), r) - mstore(0x00, mulmod(beta, mload(X_MPTR), r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0a04), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x06a4), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - let left_sub_right := addmod(lhs, sub(r, rhs), r) - let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let gamma := mload(GAMMA_MPTR) - let beta := mload(BETA_MPTR) - let lhs := calldataload(0x0d44) - let rhs := calldataload(0x0d24) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0724), mulmod(beta, calldataload(0x0ba4), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x07a4), mulmod(beta, calldataload(0x0bc4), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0724), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x07a4), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - let left_sub_right := addmod(lhs, sub(r, rhs), r) - let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let gamma := mload(GAMMA_MPTR) - let beta := mload(BETA_MPTR) - let lhs := calldataload(0x0da4) - let rhs := calldataload(0x0d84) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0824), mulmod(beta, calldataload(0x0be4), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x08a4), mulmod(beta, calldataload(0x0c04), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0824), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x08a4), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - let left_sub_right := addmod(lhs, sub(r, rhs), r) - let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let gamma := mload(GAMMA_MPTR) - let beta := mload(BETA_MPTR) - let lhs := calldataload(0x0e04) - let rhs := calldataload(0x0de4) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0924), mulmod(beta, calldataload(0x0c24), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x09a4), mulmod(beta, calldataload(0x0c44), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0924), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x09a4), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - let left_sub_right := addmod(lhs, sub(r, rhs), r) - let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let gamma := mload(GAMMA_MPTR) - let beta := mload(BETA_MPTR) - let lhs := calldataload(0x0e64) - let rhs := calldataload(0x0e44) - lhs := mulmod(lhs, addmod(addmod(mload(INSTANCE_EVAL_MPTR), mulmod(beta, calldataload(0x0c64), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x09c4), mulmod(beta, calldataload(0x0c84), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(mload(INSTANCE_EVAL_MPTR), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x09c4), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - let left_sub_right := addmod(lhs, sub(r, rhs), r) - let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let gamma := mload(GAMMA_MPTR) - let beta := mload(BETA_MPTR) - let lhs := calldataload(0x0ec4) - let rhs := calldataload(0x0ea4) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x09e4), mulmod(beta, calldataload(0x0ca4), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x09e4), mload(0x00), r), gamma, r), r) - let left_sub_right := addmod(lhs, sub(r, rhs), r) - let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_0 := mload(L_0_MPTR) - let eval := addmod(l_0, mulmod(l_0, sub(r, calldataload(0x0ee4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_last := mload(L_LAST_MPTR) - let eval := mulmod(l_last, addmod(mulmod(calldataload(0x0ee4), calldataload(0x0ee4), r), sub(r, calldataload(0x0ee4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let theta := mload(THETA_MPTR) - let input - { - let a_6 := calldataload(0x09a4) - input := a_6 - } - let table - { - let f_0 := calldataload(0x0a24) - table := f_0 - } - let beta := mload(BETA_MPTR) - let gamma := mload(GAMMA_MPTR) - let lhs := mulmod(calldataload(0x0f04), mulmod(addmod(calldataload(0x0f24), beta, r), addmod(calldataload(0x0f64), gamma, r), r), r) - let rhs := mulmod(calldataload(0x0ee4), mulmod(addmod(input, beta, r), addmod(table, gamma, r), r), r) - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), addmod(lhs, sub(r, rhs), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0f24), sub(r, calldataload(0x0f64)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), mulmod(addmod(calldataload(0x0f24), sub(r, calldataload(0x0f64)), r), addmod(calldataload(0x0f24), sub(r, calldataload(0x0f44)), r), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_0 := mload(L_0_MPTR) - let eval := addmod(l_0, mulmod(l_0, sub(r, calldataload(0x0f84)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_last := mload(L_LAST_MPTR) - let eval := mulmod(l_last, addmod(mulmod(calldataload(0x0f84), calldataload(0x0f84), r), sub(r, calldataload(0x0f84)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let theta := mload(THETA_MPTR) - let input - { - let a_7 := calldataload(0x09c4) - let a_8 := calldataload(0x09e4) - input := a_7 - input := addmod(mulmod(input, theta, r), a_8, r) - } - let table - { - let f_2 := calldataload(0x0a44) - let f_3 := calldataload(0x0a64) - table := f_2 - table := addmod(mulmod(table, theta, r), f_3, r) - } - let beta := mload(BETA_MPTR) - let gamma := mload(GAMMA_MPTR) - let lhs := mulmod(calldataload(0x0fa4), mulmod(addmod(calldataload(0x0fc4), beta, r), addmod(calldataload(0x1004), gamma, r), r), r) - let rhs := mulmod(calldataload(0x0f84), mulmod(addmod(input, beta, r), addmod(table, gamma, r), r), r) - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), addmod(lhs, sub(r, rhs), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0fc4), sub(r, calldataload(0x1004)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), mulmod(addmod(calldataload(0x0fc4), sub(r, calldataload(0x1004)), r), addmod(calldataload(0x0fc4), sub(r, calldataload(0x0fe4)), r), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - - pop(y) - pop(delta) - - let quotient_eval := mulmod(quotient_eval_numer, mload(X_N_MINUS_1_INV_MPTR), r) - mstore(QUOTIENT_EVAL_MPTR, quotient_eval) - } - - // Compute quotient commitment - { - mstore(0x00, calldataload(LAST_QUOTIENT_X_CPTR)) - mstore(0x20, calldataload(add(LAST_QUOTIENT_X_CPTR, 0x20))) - let x_n := mload(X_N_MPTR) - for - { - let cptr := sub(LAST_QUOTIENT_X_CPTR, 0x40) - let cptr_end := sub(FIRST_QUOTIENT_X_CPTR, 0x40) - } - lt(cptr_end, cptr) - {} - { - success := ec_mul_acc(success, x_n) - success := ec_add_acc(success, calldataload(cptr), calldataload(add(cptr, 0x20))) - cptr := sub(cptr, 0x40) - } - mstore(QUOTIENT_X_MPTR, mload(0x00)) - mstore(QUOTIENT_Y_MPTR, mload(0x20)) - } - - // Compute pairing lhs and rhs - { - { - let x := mload(X_MPTR) - let omega := mload(OMEGA_MPTR) - let omega_inv := mload(OMEGA_INV_MPTR) - let x_pow_of_omega := mulmod(x, omega, r) - mstore(0x0460, x_pow_of_omega) - x_pow_of_omega := mulmod(x_pow_of_omega, omega, r) - mstore(0x0480, x_pow_of_omega) - x_pow_of_omega := mulmod(x_pow_of_omega, omega, r) - mstore(0x04a0, x_pow_of_omega) - mstore(0x0440, x) - x_pow_of_omega := mulmod(x, omega_inv, r) - mstore(0x0420, x_pow_of_omega) - x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) - x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) - x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) - x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) - x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) - x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) - mstore(0x0400, x_pow_of_omega) - } - { - let mu := mload(MU_MPTR) - for - { - let mptr := 0x04c0 - let mptr_end := 0x0580 - let point_mptr := 0x0400 - } - lt(mptr, mptr_end) - { - mptr := add(mptr, 0x20) - point_mptr := add(point_mptr, 0x20) - } - { - mstore(mptr, addmod(mu, sub(r, mload(point_mptr)), r)) - } - let s - s := mload(0x0500) - s := mulmod(s, mload(0x0520), r) - s := mulmod(s, mload(0x0540), r) - s := mulmod(s, mload(0x0560), r) - mstore(0x0580, s) - let diff - diff := mload(0x04c0) - diff := mulmod(diff, mload(0x04e0), r) - mstore(0x05a0, diff) - mstore(0x00, diff) - diff := mload(0x04c0) - diff := mulmod(diff, mload(0x04e0), r) - diff := mulmod(diff, mload(0x0520), r) - diff := mulmod(diff, mload(0x0540), r) - diff := mulmod(diff, mload(0x0560), r) - mstore(0x05c0, diff) - diff := mload(0x04e0) - diff := mulmod(diff, mload(0x0540), r) - diff := mulmod(diff, mload(0x0560), r) - mstore(0x05e0, diff) - diff := mload(0x04c0) - diff := mulmod(diff, mload(0x04e0), r) - diff := mulmod(diff, mload(0x0540), r) - diff := mulmod(diff, mload(0x0560), r) - mstore(0x0600, diff) - diff := mload(0x04c0) - diff := mulmod(diff, mload(0x0520), r) - diff := mulmod(diff, mload(0x0540), r) - diff := mulmod(diff, mload(0x0560), r) - mstore(0x0620, diff) - } - { - let point_2 := mload(0x0440) - let point_3 := mload(0x0460) - let point_4 := mload(0x0480) - let point_5 := mload(0x04a0) - let coeff - coeff := addmod(point_2, sub(r, point_3), r) - coeff := mulmod(coeff, addmod(point_2, sub(r, point_4), r), r) - coeff := mulmod(coeff, addmod(point_2, sub(r, point_5), r), r) - coeff := mulmod(coeff, mload(0x0500), r) - mstore(0x20, coeff) - coeff := addmod(point_3, sub(r, point_2), r) - coeff := mulmod(coeff, addmod(point_3, sub(r, point_4), r), r) - coeff := mulmod(coeff, addmod(point_3, sub(r, point_5), r), r) - coeff := mulmod(coeff, mload(0x0520), r) - mstore(0x40, coeff) - coeff := addmod(point_4, sub(r, point_2), r) - coeff := mulmod(coeff, addmod(point_4, sub(r, point_3), r), r) - coeff := mulmod(coeff, addmod(point_4, sub(r, point_5), r), r) - coeff := mulmod(coeff, mload(0x0540), r) - mstore(0x60, coeff) - coeff := addmod(point_5, sub(r, point_2), r) - coeff := mulmod(coeff, addmod(point_5, sub(r, point_3), r), r) - coeff := mulmod(coeff, addmod(point_5, sub(r, point_4), r), r) - coeff := mulmod(coeff, mload(0x0560), r) - mstore(0x80, coeff) - } - { - let point_2 := mload(0x0440) - let coeff - coeff := 1 - coeff := mulmod(coeff, mload(0x0500), r) - mstore(0xa0, coeff) - } - { - let point_0 := mload(0x0400) - let point_2 := mload(0x0440) - let point_3 := mload(0x0460) - let coeff - coeff := addmod(point_0, sub(r, point_2), r) - coeff := mulmod(coeff, addmod(point_0, sub(r, point_3), r), r) - coeff := mulmod(coeff, mload(0x04c0), r) - mstore(0xc0, coeff) - coeff := addmod(point_2, sub(r, point_0), r) - coeff := mulmod(coeff, addmod(point_2, sub(r, point_3), r), r) - coeff := mulmod(coeff, mload(0x0500), r) - mstore(0xe0, coeff) - coeff := addmod(point_3, sub(r, point_0), r) - coeff := mulmod(coeff, addmod(point_3, sub(r, point_2), r), r) - coeff := mulmod(coeff, mload(0x0520), r) - mstore(0x0100, coeff) - } - { - let point_2 := mload(0x0440) - let point_3 := mload(0x0460) - let coeff - coeff := addmod(point_2, sub(r, point_3), r) - coeff := mulmod(coeff, mload(0x0500), r) - mstore(0x0120, coeff) - coeff := addmod(point_3, sub(r, point_2), r) - coeff := mulmod(coeff, mload(0x0520), r) - mstore(0x0140, coeff) - } - { - let point_1 := mload(0x0420) - let point_2 := mload(0x0440) - let coeff - coeff := addmod(point_1, sub(r, point_2), r) - coeff := mulmod(coeff, mload(0x04e0), r) - mstore(0x0160, coeff) - coeff := addmod(point_2, sub(r, point_1), r) - coeff := mulmod(coeff, mload(0x0500), r) - mstore(0x0180, coeff) - } - { - success := batch_invert(success, 0, 0x01a0, r) - let diff_0_inv := mload(0x00) - mstore(0x05a0, diff_0_inv) - for - { - let mptr := 0x05c0 - let mptr_end := 0x0640 - } - lt(mptr, mptr_end) - { mptr := add(mptr, 0x20) } - { - mstore(mptr, mulmod(mload(mptr), diff_0_inv, r)) - } - } - { - let zeta := mload(ZETA_MPTR) - let r_eval := 0 - r_eval := addmod(r_eval, mulmod(mload(0x20), calldataload(0x0924), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x0944), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x0964), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0984), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0x20), calldataload(0x08a4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x08c4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x08e4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0904), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0x20), calldataload(0x0824), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x0844), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x0864), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0884), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0x20), calldataload(0x07a4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x07c4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x07e4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0804), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0x20), calldataload(0x0724), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x0744), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x0764), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0784), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0x20), calldataload(0x06a4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x06c4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x06e4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0704), r), r) - mstore(0x0640, r_eval) - } - { - let coeff := mload(0xa0) - let zeta := mload(ZETA_MPTR) - let r_eval := 0 - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x0b44), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, mload(QUOTIENT_EVAL_MPTR), r), r) - for - { - let mptr := 0x0ca4 - let mptr_end := 0x0b44 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x20) } - { - r_eval := addmod(mulmod(r_eval, zeta, r), mulmod(coeff, calldataload(mptr), r), r) - } - for - { - let mptr := 0x0b24 - let mptr_end := 0x09e4 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x20) } - { - r_eval := addmod(mulmod(r_eval, zeta, r), mulmod(coeff, calldataload(mptr), r), r) - } - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x1004), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x0f64), r), r) - for - { - let mptr := 0x09e4 - let mptr_end := 0x0984 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x20) } - { - r_eval := addmod(mulmod(r_eval, zeta, r), mulmod(coeff, calldataload(mptr), r), r) - } - r_eval := mulmod(r_eval, mload(0x05c0), r) - mstore(0x0660, r_eval) - } - { - let zeta := mload(ZETA_MPTR) - let r_eval := 0 - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x0e84), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x0e44), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x0e64), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x0e24), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x0de4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x0e04), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x0dc4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x0d84), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x0da4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x0d64), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x0d24), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x0d44), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x0d04), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x0cc4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x0ce4), r), r) - r_eval := mulmod(r_eval, mload(0x05e0), r) - mstore(0x0680, r_eval) - } - { - let zeta := mload(ZETA_MPTR) - let r_eval := 0 - r_eval := addmod(r_eval, mulmod(mload(0x0120), calldataload(0x0f84), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0140), calldataload(0x0fa4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0x0120), calldataload(0x0ee4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0140), calldataload(0x0f04), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0x0120), calldataload(0x0ea4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0140), calldataload(0x0ec4), r), r) - r_eval := mulmod(r_eval, mload(0x0600), r) - mstore(0x06a0, r_eval) - } - { - let zeta := mload(ZETA_MPTR) - let r_eval := 0 - r_eval := addmod(r_eval, mulmod(mload(0x0160), calldataload(0x0fe4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0180), calldataload(0x0fc4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0x0160), calldataload(0x0f44), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0180), calldataload(0x0f24), r), r) - r_eval := mulmod(r_eval, mload(0x0620), r) - mstore(0x06c0, r_eval) - } - { - let sum := mload(0x20) - sum := addmod(sum, mload(0x40), r) - sum := addmod(sum, mload(0x60), r) - sum := addmod(sum, mload(0x80), r) - mstore(0x06e0, sum) - } - { - let sum := mload(0xa0) - mstore(0x0700, sum) - } - { - let sum := mload(0xc0) - sum := addmod(sum, mload(0xe0), r) - sum := addmod(sum, mload(0x0100), r) - mstore(0x0720, sum) - } - { - let sum := mload(0x0120) - sum := addmod(sum, mload(0x0140), r) - mstore(0x0740, sum) - } - { - let sum := mload(0x0160) - sum := addmod(sum, mload(0x0180), r) - mstore(0x0760, sum) - } - { - for - { - let mptr := 0x00 - let mptr_end := 0xa0 - let sum_mptr := 0x06e0 - } - lt(mptr, mptr_end) - { - mptr := add(mptr, 0x20) - sum_mptr := add(sum_mptr, 0x20) - } - { - mstore(mptr, mload(sum_mptr)) - } - success := batch_invert(success, 0, 0xa0, r) - let r_eval := mulmod(mload(0x80), mload(0x06c0), r) - for - { - let sum_inv_mptr := 0x60 - let sum_inv_mptr_end := 0xa0 - let r_eval_mptr := 0x06a0 - } - lt(sum_inv_mptr, sum_inv_mptr_end) - { - sum_inv_mptr := sub(sum_inv_mptr, 0x20) - r_eval_mptr := sub(r_eval_mptr, 0x20) - } - { - r_eval := mulmod(r_eval, mload(NU_MPTR), r) - r_eval := addmod(r_eval, mulmod(mload(sum_inv_mptr), mload(r_eval_mptr), r), r) - } - mstore(R_EVAL_MPTR, r_eval) - } - { - let nu := mload(NU_MPTR) - mstore(0x00, calldataload(0x01a4)) - mstore(0x20, calldataload(0x01c4)) - for - { - let mptr := 0x0164 - let mptr_end := 0x24 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x40) } - { - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(mptr), calldataload(add(mptr, 0x20))) - } - mstore(0x80, calldataload(0x05a4)) - mstore(0xa0, calldataload(0x05c4)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, mload(QUOTIENT_X_MPTR), mload(QUOTIENT_Y_MPTR)) - for - { - let mptr := 0x1140 - let mptr_end := 0x0c80 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x40) } - { - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, mload(mptr), mload(add(mptr, 0x20))) - } - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, mload(0x0c40), mload(0x0c60)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, mload(0x0c80), mload(0x0ca0)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(0x0364), calldataload(0x0384)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(0x02e4), calldataload(0x0304)) - for - { - let mptr := 0x0264 - let mptr_end := 0x01a4 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x40) } - { - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(mptr), calldataload(add(mptr, 0x20))) - } - success := ec_mul_tmp(success, mulmod(nu, mload(0x05c0), r)) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - nu := mulmod(nu, mload(NU_MPTR), r) - mstore(0x80, calldataload(0x04a4)) - mstore(0xa0, calldataload(0x04c4)) - for - { - let mptr := 0x0464 - let mptr_end := 0x0364 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x40) } - { - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(mptr), calldataload(add(mptr, 0x20))) - } - success := ec_mul_tmp(success, mulmod(nu, mload(0x05e0), r)) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - nu := mulmod(nu, mload(NU_MPTR), r) - mstore(0x80, calldataload(0x0564)) - mstore(0xa0, calldataload(0x0584)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(0x0524), calldataload(0x0544)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(0x04e4), calldataload(0x0504)) - success := ec_mul_tmp(success, mulmod(nu, mload(0x0600), r)) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - nu := mulmod(nu, mload(NU_MPTR), r) - mstore(0x80, calldataload(0x0324)) - mstore(0xa0, calldataload(0x0344)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(0x02a4), calldataload(0x02c4)) - success := ec_mul_tmp(success, mulmod(nu, mload(0x0620), r)) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - mstore(0x80, mload(G1_X_MPTR)) - mstore(0xa0, mload(G1_Y_MPTR)) - success := ec_mul_tmp(success, sub(r, mload(R_EVAL_MPTR))) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - mstore(0x80, calldataload(0x1024)) - mstore(0xa0, calldataload(0x1044)) - success := ec_mul_tmp(success, sub(r, mload(0x0580))) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - mstore(0x80, calldataload(0x1064)) - mstore(0xa0, calldataload(0x1084)) - success := ec_mul_tmp(success, mload(MU_MPTR)) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - mstore(PAIRING_LHS_X_MPTR, mload(0x00)) - mstore(PAIRING_LHS_Y_MPTR, mload(0x20)) - mstore(PAIRING_RHS_X_MPTR, calldataload(0x1064)) - mstore(PAIRING_RHS_Y_MPTR, calldataload(0x1084)) - } - } - - // Random linear combine with accumulator - if mload(HAS_ACCUMULATOR_MPTR) { - mstore(0x00, mload(ACC_LHS_X_MPTR)) - mstore(0x20, mload(ACC_LHS_Y_MPTR)) - mstore(0x40, mload(ACC_RHS_X_MPTR)) - mstore(0x60, mload(ACC_RHS_Y_MPTR)) - mstore(0x80, mload(PAIRING_LHS_X_MPTR)) - mstore(0xa0, mload(PAIRING_LHS_Y_MPTR)) - mstore(0xc0, mload(PAIRING_RHS_X_MPTR)) - mstore(0xe0, mload(PAIRING_RHS_Y_MPTR)) - let challenge := mod(keccak256(0x00, 0x100), r) - - // [pairing_lhs] += challenge * [acc_lhs] - success := ec_mul_acc(success, challenge) - success := ec_add_acc(success, mload(PAIRING_LHS_X_MPTR), mload(PAIRING_LHS_Y_MPTR)) - mstore(PAIRING_LHS_X_MPTR, mload(0x00)) - mstore(PAIRING_LHS_Y_MPTR, mload(0x20)) - - // [pairing_rhs] += challenge * [acc_rhs] - mstore(0x00, mload(ACC_RHS_X_MPTR)) - mstore(0x20, mload(ACC_RHS_Y_MPTR)) - success := ec_mul_acc(success, challenge) - success := ec_add_acc(success, mload(PAIRING_RHS_X_MPTR), mload(PAIRING_RHS_Y_MPTR)) - mstore(PAIRING_RHS_X_MPTR, mload(0x00)) - mstore(PAIRING_RHS_Y_MPTR, mload(0x20)) - } - - // Perform pairing - success := ec_pairing( - success, - mload(PAIRING_LHS_X_MPTR), - mload(PAIRING_LHS_Y_MPTR), - mload(PAIRING_RHS_X_MPTR), - mload(PAIRING_RHS_Y_MPTR) - ) - - // Revert if anything fails - if iszero(success) { - revert(0x00, 0x00) - } - - // Return 1 as result if everything succeeds - mstore(0x00, 1) - return(0x00, 0x20) +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[0] calldata pubInputs, + bytes calldata proof + ) public view returns (bool) { + bool success = true; + bytes32[1229] memory transcript; + for (uint i = 0; i < pubInputs.length; i++) { + require(pubInputs[i] < SIZE_LIMIT); } - } -} \ No newline at end of file + assembly { } { 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(0x80, 697977589985395630139925574281256772762542249956921372363329126037282444860) { let x := calldataload(0x4) mstore(0xa0, x) let y := calldataload(0x44) mstore(0xc0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x64) mstore(0xe0, x) let y := calldataload(0x84) mstore(0x100, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xa4) mstore(0x120, x) let y := calldataload(0xc4) mstore(0x140, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xe4) mstore(0x160, x) let y := calldataload(0x104) mstore(0x180, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x124) mstore(0x1a0, x) let y := calldataload(0x144) mstore(0x1c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x164) mstore(0x1e0, x) let y := calldataload(0x184) mstore(0x200, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1a4) mstore(0x220, x) let y := calldataload(0x1c4) mstore(0x240, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1e4) mstore(0x260, x) let y := calldataload(0x204) mstore(0x280, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x224) mstore(0x2a0, x) let y := calldataload(0x244) mstore(0x2c0, y) success := and(validate_ec_point(x, y), success) }mstore(0x2e0, keccak256(0x80, 608)){ let hash := mload(0x2e0) mstore(0x300, mod(hash, f_q)) mstore(0x320, hash) } { let x := calldataload(0x264) mstore(0x340, x) let y := calldataload(0x284) mstore(0x360, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x2a4) mstore(0x380, x) let y := calldataload(0x2c4) mstore(0x3a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x2e4) mstore(0x3c0, x) let y := calldataload(0x304) mstore(0x3e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x324) mstore(0x400, x) let y := calldataload(0x344) mstore(0x420, y) success := and(validate_ec_point(x, y), success) }mstore(0x440, keccak256(0x320, 288)){ let hash := mload(0x440) mstore(0x460, mod(hash, f_q)) mstore(0x480, hash) }mstore8(0x4a0, 1)mstore(0x4a0, keccak256(0x480, 33)){ let hash := mload(0x4a0) mstore(0x4c0, mod(hash, f_q)) mstore(0x4e0, hash) } { let x := calldataload(0x364) mstore(0x500, x) let y := calldataload(0x384) mstore(0x520, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x3a4) mstore(0x540, x) let y := calldataload(0x3c4) mstore(0x560, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x3e4) mstore(0x580, x) let y := calldataload(0x404) mstore(0x5a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x424) mstore(0x5c0, x) let y := calldataload(0x444) mstore(0x5e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x464) mstore(0x600, x) let y := calldataload(0x484) mstore(0x620, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4a4) mstore(0x640, x) let y := calldataload(0x4c4) mstore(0x660, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4e4) mstore(0x680, x) let y := calldataload(0x504) mstore(0x6a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x524) mstore(0x6c0, x) let y := calldataload(0x544) mstore(0x6e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x564) mstore(0x700, x) let y := calldataload(0x584) mstore(0x720, y) success := and(validate_ec_point(x, y), success) }mstore(0x740, keccak256(0x4e0, 608)){ let hash := mload(0x740) mstore(0x760, mod(hash, f_q)) mstore(0x780, hash) } { let x := calldataload(0x5a4) mstore(0x7a0, x) let y := calldataload(0x5c4) mstore(0x7c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x5e4) mstore(0x7e0, x) let y := calldataload(0x604) mstore(0x800, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x624) mstore(0x820, x) let y := calldataload(0x644) mstore(0x840, y) success := and(validate_ec_point(x, y), success) }mstore(0x860, keccak256(0x780, 224)){ let hash := mload(0x860) mstore(0x880, mod(hash, f_q)) mstore(0x8a0, hash) }mstore(0x8c0, mod(calldataload(0x664), f_q))mstore(0x8e0, mod(calldataload(0x684), f_q))mstore(0x900, mod(calldataload(0x6a4), f_q))mstore(0x920, mod(calldataload(0x6c4), f_q))mstore(0x940, mod(calldataload(0x6e4), f_q))mstore(0x960, mod(calldataload(0x704), f_q))mstore(0x980, mod(calldataload(0x724), f_q))mstore(0x9a0, mod(calldataload(0x744), f_q))mstore(0x9c0, mod(calldataload(0x764), f_q))mstore(0x9e0, mod(calldataload(0x784), f_q))mstore(0xa00, mod(calldataload(0x7a4), f_q))mstore(0xa20, mod(calldataload(0x7c4), f_q))mstore(0xa40, mod(calldataload(0x7e4), f_q))mstore(0xa60, mod(calldataload(0x804), f_q))mstore(0xa80, mod(calldataload(0x824), f_q))mstore(0xaa0, mod(calldataload(0x844), f_q))mstore(0xac0, mod(calldataload(0x864), f_q))mstore(0xae0, mod(calldataload(0x884), f_q))mstore(0xb00, mod(calldataload(0x8a4), f_q))mstore(0xb20, mod(calldataload(0x8c4), f_q))mstore(0xb40, mod(calldataload(0x8e4), f_q))mstore(0xb60, mod(calldataload(0x904), f_q))mstore(0xb80, mod(calldataload(0x924), f_q))mstore(0xba0, mod(calldataload(0x944), f_q))mstore(0xbc0, mod(calldataload(0x964), f_q))mstore(0xbe0, mod(calldataload(0x984), f_q))mstore(0xc00, mod(calldataload(0x9a4), f_q))mstore(0xc20, mod(calldataload(0x9c4), f_q))mstore(0xc40, mod(calldataload(0x9e4), f_q))mstore(0xc60, mod(calldataload(0xa04), f_q))mstore(0xc80, mod(calldataload(0xa24), f_q))mstore(0xca0, mod(calldataload(0xa44), f_q))mstore(0xcc0, mod(calldataload(0xa64), f_q))mstore(0xce0, mod(calldataload(0xa84), f_q))mstore(0xd00, mod(calldataload(0xaa4), f_q))mstore(0xd20, mod(calldataload(0xac4), f_q))mstore(0xd40, mod(calldataload(0xae4), f_q))mstore(0xd60, mod(calldataload(0xb04), f_q))mstore(0xd80, mod(calldataload(0xb24), f_q))mstore(0xda0, mod(calldataload(0xb44), f_q))mstore(0xdc0, mod(calldataload(0xb64), f_q))mstore(0xde0, mod(calldataload(0xb84), f_q))mstore(0xe00, mod(calldataload(0xba4), f_q))mstore(0xe20, mod(calldataload(0xbc4), f_q))mstore(0xe40, mod(calldataload(0xbe4), f_q))mstore(0xe60, mod(calldataload(0xc04), f_q))mstore(0xe80, mod(calldataload(0xc24), f_q))mstore(0xea0, mod(calldataload(0xc44), f_q))mstore(0xec0, mod(calldataload(0xc64), f_q))mstore(0xee0, mod(calldataload(0xc84), f_q))mstore(0xf00, mod(calldataload(0xca4), f_q))mstore(0xf20, mod(calldataload(0xcc4), f_q))mstore(0xf40, mod(calldataload(0xce4), f_q))mstore(0xf60, mod(calldataload(0xd04), f_q))mstore(0xf80, mod(calldataload(0xd24), f_q))mstore(0xfa0, mod(calldataload(0xd44), f_q))mstore(0xfc0, mod(calldataload(0xd64), f_q))mstore(0xfe0, mod(calldataload(0xd84), f_q))mstore(0x1000, mod(calldataload(0xda4), f_q))mstore(0x1020, mod(calldataload(0xdc4), f_q))mstore(0x1040, mod(calldataload(0xde4), f_q))mstore(0x1060, mod(calldataload(0xe04), f_q))mstore(0x1080, mod(calldataload(0xe24), f_q))mstore(0x10a0, mod(calldataload(0xe44), f_q))mstore(0x10c0, mod(calldataload(0xe64), f_q))mstore(0x10e0, mod(calldataload(0xe84), f_q))mstore(0x1100, mod(calldataload(0xea4), f_q))mstore(0x1120, mod(calldataload(0xec4), f_q))mstore(0x1140, mod(calldataload(0xee4), f_q))mstore(0x1160, mod(calldataload(0xf04), f_q))mstore(0x1180, mod(calldataload(0xf24), f_q))mstore(0x11a0, mod(calldataload(0xf44), f_q))mstore(0x11c0, mod(calldataload(0xf64), f_q))mstore(0x11e0, mod(calldataload(0xf84), f_q))mstore(0x1200, mod(calldataload(0xfa4), f_q))mstore(0x1220, mod(calldataload(0xfc4), f_q))mstore(0x1240, keccak256(0x8a0, 2464)){ let hash := mload(0x1240) mstore(0x1260, mod(hash, f_q)) mstore(0x1280, hash) }mstore8(0x12a0, 1)mstore(0x12a0, keccak256(0x1280, 33)){ let hash := mload(0x12a0) mstore(0x12c0, mod(hash, f_q)) mstore(0x12e0, hash) } { let x := calldataload(0xfe4) mstore(0x1300, x) let y := calldataload(0x1004) mstore(0x1320, y) success := and(validate_ec_point(x, y), success) }mstore(0x1340, keccak256(0x12e0, 96)){ let hash := mload(0x1340) mstore(0x1360, mod(hash, f_q)) mstore(0x1380, hash) } { let x := calldataload(0x1024) mstore(0x13a0, x) let y := calldataload(0x1044) mstore(0x13c0, y) success := and(validate_ec_point(x, y), success) }mstore(0x13e0, mulmod(mload(0x880), mload(0x880), f_q))mstore(0x1400, mulmod(mload(0x13e0), mload(0x13e0), f_q))mstore(0x1420, mulmod(mload(0x1400), mload(0x1400), f_q))mstore(0x1440, mulmod(mload(0x1420), mload(0x1420), f_q))mstore(0x1460, mulmod(mload(0x1440), mload(0x1440), f_q))mstore(0x1480, mulmod(mload(0x1460), mload(0x1460), f_q))mstore(0x14a0, mulmod(mload(0x1480), mload(0x1480), f_q))mstore(0x14c0, mulmod(mload(0x14a0), mload(0x14a0), f_q))mstore(0x14e0, mulmod(mload(0x14c0), mload(0x14c0), f_q))mstore(0x1500, mulmod(mload(0x14e0), mload(0x14e0), f_q))mstore(0x1520, mulmod(mload(0x1500), mload(0x1500), f_q))mstore(0x1540, mulmod(mload(0x1520), mload(0x1520), f_q))mstore(0x1560, mulmod(mload(0x1540), mload(0x1540), f_q))mstore(0x1580, mulmod(mload(0x1560), mload(0x1560), f_q))mstore(0x15a0, mulmod(mload(0x1580), mload(0x1580), f_q))mstore(0x15c0, mulmod(mload(0x15a0), mload(0x15a0), f_q))mstore(0x15e0, mulmod(mload(0x15c0), mload(0x15c0), f_q))mstore(0x1600, mulmod(mload(0x15e0), mload(0x15e0), f_q))mstore(0x1620, mulmod(mload(0x1600), mload(0x1600), f_q))mstore(0x1640, mulmod(mload(0x1620), mload(0x1620), f_q))mstore(0x1660, mulmod(mload(0x1640), mload(0x1640), f_q))mstore(0x1680, mulmod(mload(0x1660), mload(0x1660), f_q))mstore(0x16a0, addmod(mload(0x1680), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(0x16c0, mulmod(mload(0x16a0), 21888237653275510688422624196183639687472264873923820041627027729598873448513, f_q))mstore(0x16e0, mulmod(mload(0x16c0), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x1700, addmod(mload(0x880), 8662456992307693229192232929891638461323994988937738840793806641202669341572, f_q))mstore(0x1720, mulmod(mload(0x16c0), 10939663269433627367777756708678102241564365262857670666700619874077960926249, f_q))mstore(0x1740, addmod(mload(0x880), 10948579602405647854468649036579172846983999137558363676997584312497847569368, f_q))mstore(0x1760, mulmod(mload(0x16c0), 11016257578652593686382655500910603527869149377564754001549454008164059876499, f_q))mstore(0x1780, addmod(mload(0x880), 10871985293186681535863750244346671560679215022851280342148750178411748619118, f_q))mstore(0x17a0, mulmod(mload(0x16c0), 15402826414547299628414612080036060696555554914079673875872749760617770134879, f_q))mstore(0x17c0, addmod(mload(0x880), 6485416457291975593831793665221214391992809486336360467825454425958038360738, f_q))mstore(0x17e0, mulmod(mload(0x16c0), 21710372849001950800533397158415938114909991150039389063546734567764856596059, f_q))mstore(0x1800, addmod(mload(0x880), 177870022837324421713008586841336973638373250376645280151469618810951899558, f_q))mstore(0x1820, mulmod(mload(0x16c0), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q))mstore(0x1840, addmod(mload(0x880), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q))mstore(0x1860, mulmod(mload(0x16c0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x1880, addmod(mload(0x880), 13154116519010929542673167886091370382741775939114889923107781597533678454429, f_q))mstore(0x18a0, mulmod(mload(0x16c0), 1, f_q))mstore(0x18c0, addmod(mload(0x880), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)){ let prod := mload(0x1700) prod := mulmod(mload(0x1740), prod, f_q) mstore(0x18e0, prod) prod := mulmod(mload(0x1780), prod, f_q) mstore(0x1900, prod) prod := mulmod(mload(0x17c0), prod, f_q) mstore(0x1920, prod) prod := mulmod(mload(0x1800), prod, f_q) mstore(0x1940, prod) prod := mulmod(mload(0x1840), prod, f_q) mstore(0x1960, prod) prod := mulmod(mload(0x1880), prod, f_q) mstore(0x1980, prod) prod := mulmod(mload(0x18c0), prod, f_q) mstore(0x19a0, prod) prod := mulmod(mload(0x16a0), prod, f_q) mstore(0x19c0, prod) }mstore(0x1a00, 32)mstore(0x1a20, 32)mstore(0x1a40, 32)mstore(0x1a60, mload(0x19c0))mstore(0x1a80, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x1aa0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x1a00, 0xc0, 0x19e0, 0x20), 1), success){ let inv := mload(0x19e0) let v v := mload(0x16a0) mstore(0x16a0, mulmod(mload(0x19a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18c0) mstore(0x18c0, mulmod(mload(0x1980), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1880) mstore(0x1880, mulmod(mload(0x1960), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1840) mstore(0x1840, mulmod(mload(0x1940), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1800) mstore(0x1800, mulmod(mload(0x1920), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x17c0) mstore(0x17c0, mulmod(mload(0x1900), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1780) mstore(0x1780, mulmod(mload(0x18e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1740) mstore(0x1740, mulmod(mload(0x1700), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x1700, inv) }mstore(0x1ac0, mulmod(mload(0x16e0), mload(0x1700), f_q))mstore(0x1ae0, mulmod(mload(0x1720), mload(0x1740), f_q))mstore(0x1b00, mulmod(mload(0x1760), mload(0x1780), f_q))mstore(0x1b20, mulmod(mload(0x17a0), mload(0x17c0), f_q))mstore(0x1b40, mulmod(mload(0x17e0), mload(0x1800), f_q))mstore(0x1b60, mulmod(mload(0x1820), mload(0x1840), f_q))mstore(0x1b80, mulmod(mload(0x1860), mload(0x1880), f_q))mstore(0x1ba0, mulmod(mload(0x18a0), mload(0x18c0), f_q))mstore(0x1bc0, mulmod(mload(0x900), mload(0x8e0), f_q))mstore(0x1be0, addmod(mload(0x8c0), mload(0x1bc0), f_q))mstore(0x1c00, addmod(mload(0x1be0), sub(f_q, mload(0x920)), f_q))mstore(0x1c20, mulmod(mload(0x1c00), mload(0xca0), f_q))mstore(0x1c40, mulmod(mload(0x760), mload(0x1c20), f_q))mstore(0x1c60, mulmod(mload(0x980), mload(0x960), f_q))mstore(0x1c80, addmod(mload(0x940), mload(0x1c60), f_q))mstore(0x1ca0, addmod(mload(0x1c80), sub(f_q, mload(0x9a0)), f_q))mstore(0x1cc0, mulmod(mload(0x1ca0), mload(0xcc0), f_q))mstore(0x1ce0, addmod(mload(0x1c40), mload(0x1cc0), f_q))mstore(0x1d00, mulmod(mload(0x760), mload(0x1ce0), f_q))mstore(0x1d20, mulmod(mload(0xa00), mload(0x9e0), f_q))mstore(0x1d40, addmod(mload(0x9c0), mload(0x1d20), f_q))mstore(0x1d60, addmod(mload(0x1d40), sub(f_q, mload(0xa20)), f_q))mstore(0x1d80, mulmod(mload(0x1d60), mload(0xce0), f_q))mstore(0x1da0, addmod(mload(0x1d00), mload(0x1d80), f_q))mstore(0x1dc0, mulmod(mload(0x760), mload(0x1da0), f_q))mstore(0x1de0, mulmod(mload(0xa80), mload(0xa60), f_q))mstore(0x1e00, addmod(mload(0xa40), mload(0x1de0), f_q))mstore(0x1e20, addmod(mload(0x1e00), sub(f_q, mload(0xaa0)), f_q))mstore(0x1e40, mulmod(mload(0x1e20), mload(0xd00), f_q))mstore(0x1e60, addmod(mload(0x1dc0), mload(0x1e40), f_q))mstore(0x1e80, mulmod(mload(0x760), mload(0x1e60), f_q))mstore(0x1ea0, mulmod(mload(0xb00), mload(0xae0), f_q))mstore(0x1ec0, addmod(mload(0xac0), mload(0x1ea0), f_q))mstore(0x1ee0, addmod(mload(0x1ec0), sub(f_q, mload(0xb20)), f_q))mstore(0x1f00, mulmod(mload(0x1ee0), mload(0xd20), f_q))mstore(0x1f20, addmod(mload(0x1e80), mload(0x1f00), f_q))mstore(0x1f40, mulmod(mload(0x760), mload(0x1f20), f_q))mstore(0x1f60, mulmod(mload(0xb80), mload(0xb60), f_q))mstore(0x1f80, addmod(mload(0xb40), mload(0x1f60), f_q))mstore(0x1fa0, addmod(mload(0x1f80), sub(f_q, mload(0xba0)), f_q))mstore(0x1fc0, mulmod(mload(0x1fa0), mload(0xd40), f_q))mstore(0x1fe0, addmod(mload(0x1f40), mload(0x1fc0), f_q))mstore(0x2000, mulmod(mload(0x760), mload(0x1fe0), f_q))mstore(0x2020, addmod(1, sub(f_q, mload(0xee0)), f_q))mstore(0x2040, mulmod(mload(0x2020), mload(0x1ba0), f_q))mstore(0x2060, addmod(mload(0x2000), mload(0x2040), f_q))mstore(0x2080, mulmod(mload(0x760), mload(0x2060), f_q))mstore(0x20a0, mulmod(mload(0x10c0), mload(0x10c0), f_q))mstore(0x20c0, addmod(mload(0x20a0), sub(f_q, mload(0x10c0)), f_q))mstore(0x20e0, mulmod(mload(0x20c0), mload(0x1ac0), f_q))mstore(0x2100, addmod(mload(0x2080), mload(0x20e0), f_q))mstore(0x2120, mulmod(mload(0x760), mload(0x2100), f_q))mstore(0x2140, addmod(mload(0xf40), sub(f_q, mload(0xf20)), f_q))mstore(0x2160, mulmod(mload(0x2140), mload(0x1ba0), f_q))mstore(0x2180, addmod(mload(0x2120), mload(0x2160), f_q))mstore(0x21a0, mulmod(mload(0x760), mload(0x2180), f_q))mstore(0x21c0, addmod(mload(0xfa0), sub(f_q, mload(0xf80)), f_q))mstore(0x21e0, mulmod(mload(0x21c0), mload(0x1ba0), f_q))mstore(0x2200, addmod(mload(0x21a0), mload(0x21e0), f_q))mstore(0x2220, mulmod(mload(0x760), mload(0x2200), f_q))mstore(0x2240, addmod(mload(0x1000), sub(f_q, mload(0xfe0)), f_q))mstore(0x2260, mulmod(mload(0x2240), mload(0x1ba0), f_q))mstore(0x2280, addmod(mload(0x2220), mload(0x2260), f_q))mstore(0x22a0, mulmod(mload(0x760), mload(0x2280), f_q))mstore(0x22c0, addmod(mload(0x1060), sub(f_q, mload(0x1040)), f_q))mstore(0x22e0, mulmod(mload(0x22c0), mload(0x1ba0), f_q))mstore(0x2300, addmod(mload(0x22a0), mload(0x22e0), f_q))mstore(0x2320, mulmod(mload(0x760), mload(0x2300), f_q))mstore(0x2340, addmod(mload(0x10c0), sub(f_q, mload(0x10a0)), f_q))mstore(0x2360, mulmod(mload(0x2340), mload(0x1ba0), f_q))mstore(0x2380, addmod(mload(0x2320), mload(0x2360), f_q))mstore(0x23a0, mulmod(mload(0x760), mload(0x2380), f_q))mstore(0x23c0, addmod(1, sub(f_q, mload(0x1ac0)), f_q))mstore(0x23e0, addmod(mload(0x1ae0), mload(0x1b00), f_q))mstore(0x2400, addmod(mload(0x23e0), mload(0x1b20), f_q))mstore(0x2420, addmod(mload(0x2400), mload(0x1b40), f_q))mstore(0x2440, addmod(mload(0x2420), mload(0x1b60), f_q))mstore(0x2460, addmod(mload(0x2440), mload(0x1b80), f_q))mstore(0x2480, addmod(mload(0x23c0), sub(f_q, mload(0x2460)), f_q))mstore(0x24a0, mulmod(mload(0xd80), mload(0x460), f_q))mstore(0x24c0, addmod(mload(0xc20), mload(0x24a0), f_q))mstore(0x24e0, addmod(mload(0x24c0), mload(0x4c0), f_q))mstore(0x2500, mulmod(mload(0xda0), mload(0x460), f_q))mstore(0x2520, addmod(mload(0x8c0), mload(0x2500), f_q))mstore(0x2540, addmod(mload(0x2520), mload(0x4c0), f_q))mstore(0x2560, mulmod(mload(0x2540), mload(0x24e0), f_q))mstore(0x2580, mulmod(mload(0x2560), mload(0xf00), f_q))mstore(0x25a0, mulmod(1, mload(0x460), f_q))mstore(0x25c0, mulmod(mload(0x880), mload(0x25a0), f_q))mstore(0x25e0, addmod(mload(0xc20), mload(0x25c0), f_q))mstore(0x2600, addmod(mload(0x25e0), mload(0x4c0), f_q))mstore(0x2620, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x460), f_q))mstore(0x2640, mulmod(mload(0x880), mload(0x2620), f_q))mstore(0x2660, addmod(mload(0x8c0), mload(0x2640), f_q))mstore(0x2680, addmod(mload(0x2660), mload(0x4c0), f_q))mstore(0x26a0, mulmod(mload(0x2680), mload(0x2600), f_q))mstore(0x26c0, mulmod(mload(0x26a0), mload(0xee0), f_q))mstore(0x26e0, addmod(mload(0x2580), sub(f_q, mload(0x26c0)), f_q))mstore(0x2700, mulmod(mload(0x26e0), mload(0x2480), f_q))mstore(0x2720, addmod(mload(0x23a0), mload(0x2700), f_q))mstore(0x2740, mulmod(mload(0x760), mload(0x2720), f_q))mstore(0x2760, mulmod(mload(0xdc0), mload(0x460), f_q))mstore(0x2780, addmod(mload(0x940), mload(0x2760), f_q))mstore(0x27a0, addmod(mload(0x2780), mload(0x4c0), f_q))mstore(0x27c0, mulmod(mload(0xde0), mload(0x460), f_q))mstore(0x27e0, addmod(mload(0x9c0), mload(0x27c0), f_q))mstore(0x2800, addmod(mload(0x27e0), mload(0x4c0), f_q))mstore(0x2820, mulmod(mload(0x2800), mload(0x27a0), f_q))mstore(0x2840, mulmod(mload(0x2820), mload(0xf60), f_q))mstore(0x2860, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x460), f_q))mstore(0x2880, mulmod(mload(0x880), mload(0x2860), f_q))mstore(0x28a0, addmod(mload(0x940), mload(0x2880), f_q))mstore(0x28c0, addmod(mload(0x28a0), mload(0x4c0), f_q))mstore(0x28e0, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x460), f_q))mstore(0x2900, mulmod(mload(0x880), mload(0x28e0), f_q))mstore(0x2920, addmod(mload(0x9c0), mload(0x2900), f_q))mstore(0x2940, addmod(mload(0x2920), mload(0x4c0), f_q))mstore(0x2960, mulmod(mload(0x2940), mload(0x28c0), f_q))mstore(0x2980, mulmod(mload(0x2960), mload(0xf40), f_q))mstore(0x29a0, addmod(mload(0x2840), sub(f_q, mload(0x2980)), f_q))mstore(0x29c0, mulmod(mload(0x29a0), mload(0x2480), f_q))mstore(0x29e0, addmod(mload(0x2740), mload(0x29c0), f_q))mstore(0x2a00, mulmod(mload(0x760), mload(0x29e0), f_q))mstore(0x2a20, mulmod(mload(0xe00), mload(0x460), f_q))mstore(0x2a40, addmod(mload(0xa40), mload(0x2a20), f_q))mstore(0x2a60, addmod(mload(0x2a40), mload(0x4c0), f_q))mstore(0x2a80, mulmod(mload(0xe20), mload(0x460), f_q))mstore(0x2aa0, addmod(mload(0xac0), mload(0x2a80), f_q))mstore(0x2ac0, addmod(mload(0x2aa0), mload(0x4c0), f_q))mstore(0x2ae0, mulmod(mload(0x2ac0), mload(0x2a60), f_q))mstore(0x2b00, mulmod(mload(0x2ae0), mload(0xfc0), f_q))mstore(0x2b20, mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(0x460), f_q))mstore(0x2b40, mulmod(mload(0x880), mload(0x2b20), f_q))mstore(0x2b60, addmod(mload(0xa40), mload(0x2b40), f_q))mstore(0x2b80, addmod(mload(0x2b60), mload(0x4c0), f_q))mstore(0x2ba0, mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(0x460), f_q))mstore(0x2bc0, mulmod(mload(0x880), mload(0x2ba0), f_q))mstore(0x2be0, addmod(mload(0xac0), mload(0x2bc0), f_q))mstore(0x2c00, addmod(mload(0x2be0), mload(0x4c0), f_q))mstore(0x2c20, mulmod(mload(0x2c00), mload(0x2b80), f_q))mstore(0x2c40, mulmod(mload(0x2c20), mload(0xfa0), f_q))mstore(0x2c60, addmod(mload(0x2b00), sub(f_q, mload(0x2c40)), f_q))mstore(0x2c80, mulmod(mload(0x2c60), mload(0x2480), f_q))mstore(0x2ca0, addmod(mload(0x2a00), mload(0x2c80), f_q))mstore(0x2cc0, mulmod(mload(0x760), mload(0x2ca0), f_q))mstore(0x2ce0, mulmod(mload(0xe40), mload(0x460), f_q))mstore(0x2d00, addmod(mload(0xb40), mload(0x2ce0), f_q))mstore(0x2d20, addmod(mload(0x2d00), mload(0x4c0), f_q))mstore(0x2d40, mulmod(mload(0xe60), mload(0x460), f_q))mstore(0x2d60, addmod(mload(0xbc0), mload(0x2d40), f_q))mstore(0x2d80, addmod(mload(0x2d60), mload(0x4c0), f_q))mstore(0x2da0, mulmod(mload(0x2d80), mload(0x2d20), f_q))mstore(0x2dc0, mulmod(mload(0x2da0), mload(0x1020), f_q))mstore(0x2de0, mulmod(5625741653535312224677218588085279924365897425605943700675464992185016992283, mload(0x460), f_q))mstore(0x2e00, mulmod(mload(0x880), mload(0x2de0), f_q))mstore(0x2e20, addmod(mload(0xb40), mload(0x2e00), f_q))mstore(0x2e40, addmod(mload(0x2e20), mload(0x4c0), f_q))mstore(0x2e60, mulmod(14704729814417906439424896605881467874595262020190401576785074330126828718155, mload(0x460), f_q))mstore(0x2e80, mulmod(mload(0x880), mload(0x2e60), f_q))mstore(0x2ea0, addmod(mload(0xbc0), mload(0x2e80), f_q))mstore(0x2ec0, addmod(mload(0x2ea0), mload(0x4c0), f_q))mstore(0x2ee0, mulmod(mload(0x2ec0), mload(0x2e40), f_q))mstore(0x2f00, mulmod(mload(0x2ee0), mload(0x1000), f_q))mstore(0x2f20, addmod(mload(0x2dc0), sub(f_q, mload(0x2f00)), f_q))mstore(0x2f40, mulmod(mload(0x2f20), mload(0x2480), f_q))mstore(0x2f60, addmod(mload(0x2cc0), mload(0x2f40), f_q))mstore(0x2f80, mulmod(mload(0x760), mload(0x2f60), f_q))mstore(0x2fa0, mulmod(mload(0xe80), mload(0x460), f_q))mstore(0x2fc0, addmod(0, mload(0x2fa0), f_q))mstore(0x2fe0, addmod(mload(0x2fc0), mload(0x4c0), f_q))mstore(0x3000, mulmod(mload(0xea0), mload(0x460), f_q))mstore(0x3020, addmod(mload(0xbe0), mload(0x3000), f_q))mstore(0x3040, addmod(mload(0x3020), mload(0x4c0), f_q))mstore(0x3060, mulmod(mload(0x3040), mload(0x2fe0), f_q))mstore(0x3080, mulmod(mload(0x3060), mload(0x1080), f_q))mstore(0x30a0, mulmod(8343274462013750416000956870576256937330525306073862550863787263304548803879, mload(0x460), f_q))mstore(0x30c0, mulmod(mload(0x880), mload(0x30a0), f_q))mstore(0x30e0, addmod(0, mload(0x30c0), f_q))mstore(0x3100, addmod(mload(0x30e0), mload(0x4c0), f_q))mstore(0x3120, mulmod(20928372310071051017340352686640453451620397549739756658327314209761852842004, mload(0x460), f_q))mstore(0x3140, mulmod(mload(0x880), mload(0x3120), f_q))mstore(0x3160, addmod(mload(0xbe0), mload(0x3140), f_q))mstore(0x3180, addmod(mload(0x3160), mload(0x4c0), f_q))mstore(0x31a0, mulmod(mload(0x3180), mload(0x3100), f_q))mstore(0x31c0, mulmod(mload(0x31a0), mload(0x1060), f_q))mstore(0x31e0, addmod(mload(0x3080), sub(f_q, mload(0x31c0)), f_q))mstore(0x3200, mulmod(mload(0x31e0), mload(0x2480), f_q))mstore(0x3220, addmod(mload(0x2f80), mload(0x3200), f_q))mstore(0x3240, mulmod(mload(0x760), mload(0x3220), f_q))mstore(0x3260, mulmod(mload(0xec0), mload(0x460), f_q))mstore(0x3280, addmod(mload(0xc00), mload(0x3260), f_q))mstore(0x32a0, addmod(mload(0x3280), mload(0x4c0), f_q))mstore(0x32c0, mulmod(mload(0x32a0), mload(0x10e0), f_q))mstore(0x32e0, mulmod(15845651941796975697993789271154426079663327509658641548785793587449119139335, mload(0x460), f_q))mstore(0x3300, mulmod(mload(0x880), mload(0x32e0), f_q))mstore(0x3320, addmod(mload(0xc00), mload(0x3300), f_q))mstore(0x3340, addmod(mload(0x3320), mload(0x4c0), f_q))mstore(0x3360, mulmod(mload(0x3340), mload(0x10c0), f_q))mstore(0x3380, addmod(mload(0x32c0), sub(f_q, mload(0x3360)), f_q))mstore(0x33a0, mulmod(mload(0x3380), mload(0x2480), f_q))mstore(0x33c0, addmod(mload(0x3240), mload(0x33a0), f_q))mstore(0x33e0, mulmod(mload(0x760), mload(0x33c0), f_q))mstore(0x3400, addmod(1, sub(f_q, mload(0x1100)), f_q))mstore(0x3420, mulmod(mload(0x3400), mload(0x1ba0), f_q))mstore(0x3440, addmod(mload(0x33e0), mload(0x3420), f_q))mstore(0x3460, mulmod(mload(0x760), mload(0x3440), f_q))mstore(0x3480, mulmod(mload(0x1100), mload(0x1100), f_q))mstore(0x34a0, addmod(mload(0x3480), sub(f_q, mload(0x1100)), f_q))mstore(0x34c0, mulmod(mload(0x34a0), mload(0x1ac0), f_q))mstore(0x34e0, addmod(mload(0x3460), mload(0x34c0), f_q))mstore(0x3500, mulmod(mload(0x760), mload(0x34e0), f_q))mstore(0x3520, addmod(mload(0x1140), mload(0x460), f_q))mstore(0x3540, mulmod(mload(0x3520), mload(0x1120), f_q))mstore(0x3560, addmod(mload(0x1180), mload(0x4c0), f_q))mstore(0x3580, mulmod(mload(0x3560), mload(0x3540), f_q))mstore(0x35a0, addmod(mload(0xbc0), mload(0x460), f_q))mstore(0x35c0, mulmod(mload(0x35a0), mload(0x1100), f_q))mstore(0x35e0, addmod(mload(0xc40), mload(0x4c0), f_q))mstore(0x3600, mulmod(mload(0x35e0), mload(0x35c0), f_q))mstore(0x3620, addmod(mload(0x3580), sub(f_q, mload(0x3600)), f_q))mstore(0x3640, mulmod(mload(0x3620), mload(0x2480), f_q))mstore(0x3660, addmod(mload(0x3500), mload(0x3640), f_q))mstore(0x3680, mulmod(mload(0x760), mload(0x3660), f_q))mstore(0x36a0, addmod(mload(0x1140), sub(f_q, mload(0x1180)), f_q))mstore(0x36c0, mulmod(mload(0x36a0), mload(0x1ba0), f_q))mstore(0x36e0, addmod(mload(0x3680), mload(0x36c0), f_q))mstore(0x3700, mulmod(mload(0x760), mload(0x36e0), f_q))mstore(0x3720, mulmod(mload(0x36a0), mload(0x2480), f_q))mstore(0x3740, addmod(mload(0x1140), sub(f_q, mload(0x1160)), f_q))mstore(0x3760, mulmod(mload(0x3740), mload(0x3720), f_q))mstore(0x3780, addmod(mload(0x3700), mload(0x3760), f_q))mstore(0x37a0, mulmod(mload(0x760), mload(0x3780), f_q))mstore(0x37c0, addmod(1, sub(f_q, mload(0x11a0)), f_q))mstore(0x37e0, mulmod(mload(0x37c0), mload(0x1ba0), f_q))mstore(0x3800, addmod(mload(0x37a0), mload(0x37e0), f_q))mstore(0x3820, mulmod(mload(0x760), mload(0x3800), f_q))mstore(0x3840, mulmod(mload(0x11a0), mload(0x11a0), f_q))mstore(0x3860, addmod(mload(0x3840), sub(f_q, mload(0x11a0)), f_q))mstore(0x3880, mulmod(mload(0x3860), mload(0x1ac0), f_q))mstore(0x38a0, addmod(mload(0x3820), mload(0x3880), f_q))mstore(0x38c0, mulmod(mload(0x760), mload(0x38a0), f_q))mstore(0x38e0, addmod(mload(0x11e0), mload(0x460), f_q))mstore(0x3900, mulmod(mload(0x38e0), mload(0x11c0), f_q))mstore(0x3920, addmod(mload(0x1220), mload(0x4c0), f_q))mstore(0x3940, mulmod(mload(0x3920), mload(0x3900), f_q))mstore(0x3960, mulmod(mload(0x300), mload(0xbe0), f_q))mstore(0x3980, addmod(mload(0x3960), mload(0xc00), f_q))mstore(0x39a0, addmod(mload(0x3980), mload(0x460), f_q))mstore(0x39c0, mulmod(mload(0x39a0), mload(0x11a0), f_q))mstore(0x39e0, mulmod(mload(0x300), mload(0xc60), f_q))mstore(0x3a00, addmod(mload(0x39e0), mload(0xc80), f_q))mstore(0x3a20, addmod(mload(0x3a00), mload(0x4c0), f_q))mstore(0x3a40, mulmod(mload(0x3a20), mload(0x39c0), f_q))mstore(0x3a60, addmod(mload(0x3940), sub(f_q, mload(0x3a40)), f_q))mstore(0x3a80, mulmod(mload(0x3a60), mload(0x2480), f_q))mstore(0x3aa0, addmod(mload(0x38c0), mload(0x3a80), f_q))mstore(0x3ac0, mulmod(mload(0x760), mload(0x3aa0), f_q))mstore(0x3ae0, addmod(mload(0x11e0), sub(f_q, mload(0x1220)), f_q))mstore(0x3b00, mulmod(mload(0x3ae0), mload(0x1ba0), f_q))mstore(0x3b20, addmod(mload(0x3ac0), mload(0x3b00), f_q))mstore(0x3b40, mulmod(mload(0x760), mload(0x3b20), f_q))mstore(0x3b60, mulmod(mload(0x3ae0), mload(0x2480), f_q))mstore(0x3b80, addmod(mload(0x11e0), sub(f_q, mload(0x1200)), f_q))mstore(0x3ba0, mulmod(mload(0x3b80), mload(0x3b60), f_q))mstore(0x3bc0, addmod(mload(0x3b40), mload(0x3ba0), f_q))mstore(0x3be0, mulmod(mload(0x1680), mload(0x1680), f_q))mstore(0x3c00, mulmod(mload(0x3be0), mload(0x1680), f_q))mstore(0x3c20, mulmod(1, mload(0x1680), f_q))mstore(0x3c40, mulmod(1, mload(0x3be0), f_q))mstore(0x3c60, mulmod(mload(0x3bc0), mload(0x16a0), f_q))mstore(0x3c80, mulmod(mload(0x13e0), mload(0x880), f_q))mstore(0x3ca0, mulmod(mload(0x3c80), mload(0x880), f_q))mstore(0x3cc0, mulmod(mload(0x880), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x3ce0, addmod(mload(0x1360), sub(f_q, mload(0x3cc0)), f_q))mstore(0x3d00, mulmod(mload(0x880), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x3d20, addmod(mload(0x1360), sub(f_q, mload(0x3d00)), f_q))mstore(0x3d40, mulmod(mload(0x880), 1, f_q))mstore(0x3d60, addmod(mload(0x1360), sub(f_q, mload(0x3d40)), f_q))mstore(0x3d80, mulmod(mload(0x880), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q))mstore(0x3da0, addmod(mload(0x1360), sub(f_q, mload(0x3d80)), f_q))mstore(0x3dc0, mulmod(mload(0x880), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q))mstore(0x3de0, addmod(mload(0x1360), sub(f_q, mload(0x3dc0)), f_q))mstore(0x3e00, mulmod(mload(0x880), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q))mstore(0x3e20, addmod(mload(0x1360), sub(f_q, mload(0x3e00)), f_q))mstore(0x3e40, mulmod(3544324119167359571073009690693121464267965232733679586767649244433889388945, mload(0x3c80), f_q))mstore(0x3e60, mulmod(mload(0x3e40), 1, f_q)){ let result := mulmod(mload(0x1360), mload(0x3e40), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x3e60)), f_q), result, f_q)mstore(0x3e80, result) }mstore(0x3ea0, mulmod(3860370625838117017501327045244227871206764201116468958063324100051382735289, mload(0x3c80), f_q))mstore(0x3ec0, mulmod(mload(0x3ea0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1360), mload(0x3ea0), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x3ec0)), f_q), result, f_q)mstore(0x3ee0, result) }mstore(0x3f00, mulmod(21616901807277407275624036604424346159916096890712898844034238973395610537327, mload(0x3c80), f_q))mstore(0x3f20, mulmod(mload(0x3f00), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q)){ let result := mulmod(mload(0x1360), mload(0x3f00), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x3f20)), f_q), result, f_q)mstore(0x3f40, result) }mstore(0x3f60, mulmod(3209408481237076479025468386201293941554240476766691830436732310949352383503, mload(0x3c80), f_q))mstore(0x3f80, mulmod(mload(0x3f60), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q)){ let result := mulmod(mload(0x1360), mload(0x3f60), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x3f80)), f_q), result, f_q)mstore(0x3fa0, result) }mstore(0x3fc0, mulmod(1, mload(0x3d60), f_q))mstore(0x3fe0, mulmod(mload(0x3fc0), mload(0x3da0), f_q))mstore(0x4000, mulmod(mload(0x3fe0), mload(0x3de0), f_q))mstore(0x4020, mulmod(mload(0x4000), mload(0x3e20), f_q)){ let result := mulmod(mload(0x1360), 1, f_q)result := addmod(mulmod(mload(0x880), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(0x4040, result) }mstore(0x4060, mulmod(8390819244605639573390577733158868133682115698337564550620146375401109684432, mload(0x13e0), f_q))mstore(0x4080, mulmod(mload(0x4060), 1, f_q)){ let result := mulmod(mload(0x1360), mload(0x4060), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x4080)), f_q), result, f_q)mstore(0x40a0, result) }mstore(0x40c0, mulmod(14389468897523033212448771694851898440525479866834419679925499462425232628530, mload(0x13e0), f_q))mstore(0x40e0, mulmod(mload(0x40c0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1360), mload(0x40c0), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x40e0)), f_q), result, f_q)mstore(0x4100, result) }mstore(0x4120, mulmod(8021781111580269725587432039983408559403601261632071736490564397134126857583, mload(0x13e0), f_q))mstore(0x4140, mulmod(mload(0x4120), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q)){ let result := mulmod(mload(0x1360), mload(0x4120), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x4140)), f_q), result, f_q)mstore(0x4160, result) }mstore(0x4180, mulmod(mload(0x3fe0), mload(0x3ce0), f_q))mstore(0x41a0, mulmod(10676941854703594198666993839846402519342119846958189386823924046696287912228, mload(0x880), f_q))mstore(0x41c0, mulmod(mload(0x41a0), 1, f_q)){ let result := mulmod(mload(0x1360), mload(0x41a0), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x41c0)), f_q), result, f_q)mstore(0x41e0, result) }mstore(0x4200, mulmod(11211301017135681023579411905410872569206244553457844956874280139879520583389, mload(0x880), f_q))mstore(0x4220, mulmod(mload(0x4200), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1360), mload(0x4200), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x4220)), f_q), result, f_q)mstore(0x4240, result) }mstore(0x4260, mulmod(13154116519010929542673167886091370382741775939114889923107781597533678454430, mload(0x880), f_q))mstore(0x4280, mulmod(mload(0x4260), 1, f_q)){ let result := mulmod(mload(0x1360), mload(0x4260), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x4280)), f_q), result, f_q)mstore(0x42a0, result) }mstore(0x42c0, mulmod(8734126352828345679573237859165904705806588461301144420590422589042130041187, mload(0x880), f_q))mstore(0x42e0, mulmod(mload(0x42c0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q)){ let result := mulmod(mload(0x1360), mload(0x42c0), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x42e0)), f_q), result, f_q)mstore(0x4300, result) }mstore(0x4320, mulmod(mload(0x3fc0), mload(0x3d20), f_q)){ let prod := mload(0x3e80) prod := mulmod(mload(0x3ee0), prod, f_q) mstore(0x4340, prod) prod := mulmod(mload(0x3f40), prod, f_q) mstore(0x4360, prod) prod := mulmod(mload(0x3fa0), prod, f_q) mstore(0x4380, prod) prod := mulmod(mload(0x4040), prod, f_q) mstore(0x43a0, prod) prod := mulmod(mload(0x3fc0), prod, f_q) mstore(0x43c0, prod) prod := mulmod(mload(0x40a0), prod, f_q) mstore(0x43e0, prod) prod := mulmod(mload(0x4100), prod, f_q) mstore(0x4400, prod) prod := mulmod(mload(0x4160), prod, f_q) mstore(0x4420, prod) prod := mulmod(mload(0x4180), prod, f_q) mstore(0x4440, prod) prod := mulmod(mload(0x41e0), prod, f_q) mstore(0x4460, prod) prod := mulmod(mload(0x4240), prod, f_q) mstore(0x4480, prod) prod := mulmod(mload(0x3fe0), prod, f_q) mstore(0x44a0, prod) prod := mulmod(mload(0x42a0), prod, f_q) mstore(0x44c0, prod) prod := mulmod(mload(0x4300), prod, f_q) mstore(0x44e0, prod) prod := mulmod(mload(0x4320), prod, f_q) mstore(0x4500, prod) }mstore(0x4540, 32)mstore(0x4560, 32)mstore(0x4580, 32)mstore(0x45a0, mload(0x4500))mstore(0x45c0, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x45e0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x4540, 0xc0, 0x4520, 0x20), 1), success){ let inv := mload(0x4520) let v v := mload(0x4320) mstore(0x4320, mulmod(mload(0x44e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4300) mstore(0x4300, mulmod(mload(0x44c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x42a0) mstore(0x42a0, mulmod(mload(0x44a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3fe0) mstore(0x3fe0, mulmod(mload(0x4480), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4240) mstore(0x4240, mulmod(mload(0x4460), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x41e0) mstore(0x41e0, mulmod(mload(0x4440), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4180) mstore(0x4180, mulmod(mload(0x4420), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4160) mstore(0x4160, mulmod(mload(0x4400), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4100) mstore(0x4100, mulmod(mload(0x43e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x40a0) mstore(0x40a0, mulmod(mload(0x43c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3fc0) mstore(0x3fc0, mulmod(mload(0x43a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4040) mstore(0x4040, mulmod(mload(0x4380), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3fa0) mstore(0x3fa0, mulmod(mload(0x4360), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3f40) mstore(0x3f40, mulmod(mload(0x4340), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3ee0) mstore(0x3ee0, mulmod(mload(0x3e80), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x3e80, inv) }{ let result := mload(0x3e80)result := addmod(mload(0x3ee0), result, f_q)result := addmod(mload(0x3f40), result, f_q)result := addmod(mload(0x3fa0), result, f_q)mstore(0x4600, result) }mstore(0x4620, mulmod(mload(0x4020), mload(0x3fc0), f_q)){ let result := mload(0x4040)mstore(0x4640, result) }mstore(0x4660, mulmod(mload(0x4020), mload(0x4180), f_q)){ let result := mload(0x40a0)result := addmod(mload(0x4100), result, f_q)result := addmod(mload(0x4160), result, f_q)mstore(0x4680, result) }mstore(0x46a0, mulmod(mload(0x4020), mload(0x3fe0), f_q)){ let result := mload(0x41e0)result := addmod(mload(0x4240), result, f_q)mstore(0x46c0, result) }mstore(0x46e0, mulmod(mload(0x4020), mload(0x4320), f_q)){ let result := mload(0x42a0)result := addmod(mload(0x4300), result, f_q)mstore(0x4700, result) }{ let prod := mload(0x4600) prod := mulmod(mload(0x4640), prod, f_q) mstore(0x4720, prod) prod := mulmod(mload(0x4680), prod, f_q) mstore(0x4740, prod) prod := mulmod(mload(0x46c0), prod, f_q) mstore(0x4760, prod) prod := mulmod(mload(0x4700), prod, f_q) mstore(0x4780, prod) }mstore(0x47c0, 32)mstore(0x47e0, 32)mstore(0x4800, 32)mstore(0x4820, mload(0x4780))mstore(0x4840, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x4860, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x47c0, 0xc0, 0x47a0, 0x20), 1), success){ let inv := mload(0x47a0) let v v := mload(0x4700) mstore(0x4700, mulmod(mload(0x4760), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x46c0) mstore(0x46c0, mulmod(mload(0x4740), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4680) mstore(0x4680, mulmod(mload(0x4720), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4640) mstore(0x4640, mulmod(mload(0x4600), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x4600, inv) }mstore(0x4880, mulmod(mload(0x4620), mload(0x4640), f_q))mstore(0x48a0, mulmod(mload(0x4660), mload(0x4680), f_q))mstore(0x48c0, mulmod(mload(0x46a0), mload(0x46c0), f_q))mstore(0x48e0, mulmod(mload(0x46e0), mload(0x4700), f_q))mstore(0x4900, mulmod(mload(0x1260), mload(0x1260), f_q))mstore(0x4920, mulmod(mload(0x4900), mload(0x1260), f_q))mstore(0x4940, mulmod(mload(0x4920), mload(0x1260), f_q))mstore(0x4960, mulmod(mload(0x4940), mload(0x1260), f_q))mstore(0x4980, mulmod(mload(0x4960), mload(0x1260), f_q))mstore(0x49a0, mulmod(mload(0x4980), mload(0x1260), f_q))mstore(0x49c0, mulmod(mload(0x49a0), mload(0x1260), f_q))mstore(0x49e0, mulmod(mload(0x49c0), mload(0x1260), f_q))mstore(0x4a00, mulmod(mload(0x49e0), mload(0x1260), f_q))mstore(0x4a20, mulmod(mload(0x4a00), mload(0x1260), f_q))mstore(0x4a40, mulmod(mload(0x4a20), mload(0x1260), f_q))mstore(0x4a60, mulmod(mload(0x4a40), mload(0x1260), f_q))mstore(0x4a80, mulmod(mload(0x4a60), mload(0x1260), f_q))mstore(0x4aa0, mulmod(mload(0x4a80), mload(0x1260), f_q))mstore(0x4ac0, mulmod(mload(0x4aa0), mload(0x1260), f_q))mstore(0x4ae0, mulmod(mload(0x4ac0), mload(0x1260), f_q))mstore(0x4b00, mulmod(mload(0x4ae0), mload(0x1260), f_q))mstore(0x4b20, mulmod(mload(0x4b00), mload(0x1260), f_q))mstore(0x4b40, mulmod(mload(0x4b20), mload(0x1260), f_q))mstore(0x4b60, mulmod(mload(0x4b40), mload(0x1260), f_q))mstore(0x4b80, mulmod(mload(0x4b60), mload(0x1260), f_q))mstore(0x4ba0, mulmod(mload(0x4b80), mload(0x1260), f_q))mstore(0x4bc0, mulmod(mload(0x4ba0), mload(0x1260), f_q))mstore(0x4be0, mulmod(mload(0x4bc0), mload(0x1260), f_q))mstore(0x4c00, mulmod(mload(0x4be0), mload(0x1260), f_q))mstore(0x4c20, mulmod(mload(0x4c00), mload(0x1260), f_q))mstore(0x4c40, mulmod(mload(0x4c20), mload(0x1260), f_q))mstore(0x4c60, mulmod(mload(0x12c0), mload(0x12c0), f_q))mstore(0x4c80, mulmod(mload(0x4c60), mload(0x12c0), f_q))mstore(0x4ca0, mulmod(mload(0x4c80), mload(0x12c0), f_q))mstore(0x4cc0, mulmod(mload(0x4ca0), mload(0x12c0), f_q)){ let result := mulmod(mload(0x8c0), mload(0x3e80), f_q)result := addmod(mulmod(mload(0x8e0), mload(0x3ee0), f_q), result, f_q)result := addmod(mulmod(mload(0x900), mload(0x3f40), f_q), result, f_q)result := addmod(mulmod(mload(0x920), mload(0x3fa0), f_q), result, f_q)mstore(0x4ce0, result) }mstore(0x4d00, mulmod(mload(0x4ce0), mload(0x4600), f_q))mstore(0x4d20, mulmod(sub(f_q, mload(0x4d00)), 1, f_q)){ let result := mulmod(mload(0x940), mload(0x3e80), f_q)result := addmod(mulmod(mload(0x960), mload(0x3ee0), f_q), result, f_q)result := addmod(mulmod(mload(0x980), mload(0x3f40), f_q), result, f_q)result := addmod(mulmod(mload(0x9a0), mload(0x3fa0), f_q), result, f_q)mstore(0x4d40, result) }mstore(0x4d60, mulmod(mload(0x4d40), mload(0x4600), f_q))mstore(0x4d80, mulmod(sub(f_q, mload(0x4d60)), mload(0x1260), f_q))mstore(0x4da0, mulmod(1, mload(0x1260), f_q))mstore(0x4dc0, addmod(mload(0x4d20), mload(0x4d80), f_q)){ let result := mulmod(mload(0x9c0), mload(0x3e80), f_q)result := addmod(mulmod(mload(0x9e0), mload(0x3ee0), f_q), result, f_q)result := addmod(mulmod(mload(0xa00), mload(0x3f40), f_q), result, f_q)result := addmod(mulmod(mload(0xa20), mload(0x3fa0), f_q), result, f_q)mstore(0x4de0, result) }mstore(0x4e00, mulmod(mload(0x4de0), mload(0x4600), f_q))mstore(0x4e20, mulmod(sub(f_q, mload(0x4e00)), mload(0x4900), f_q))mstore(0x4e40, mulmod(1, mload(0x4900), f_q))mstore(0x4e60, addmod(mload(0x4dc0), mload(0x4e20), f_q)){ let result := mulmod(mload(0xa40), mload(0x3e80), f_q)result := addmod(mulmod(mload(0xa60), mload(0x3ee0), f_q), result, f_q)result := addmod(mulmod(mload(0xa80), mload(0x3f40), f_q), result, f_q)result := addmod(mulmod(mload(0xaa0), mload(0x3fa0), f_q), result, f_q)mstore(0x4e80, result) }mstore(0x4ea0, mulmod(mload(0x4e80), mload(0x4600), f_q))mstore(0x4ec0, mulmod(sub(f_q, mload(0x4ea0)), mload(0x4920), f_q))mstore(0x4ee0, mulmod(1, mload(0x4920), f_q))mstore(0x4f00, addmod(mload(0x4e60), mload(0x4ec0), f_q)){ let result := mulmod(mload(0xac0), mload(0x3e80), f_q)result := addmod(mulmod(mload(0xae0), mload(0x3ee0), f_q), result, f_q)result := addmod(mulmod(mload(0xb00), mload(0x3f40), f_q), result, f_q)result := addmod(mulmod(mload(0xb20), mload(0x3fa0), f_q), result, f_q)mstore(0x4f20, result) }mstore(0x4f40, mulmod(mload(0x4f20), mload(0x4600), f_q))mstore(0x4f60, mulmod(sub(f_q, mload(0x4f40)), mload(0x4940), f_q))mstore(0x4f80, mulmod(1, mload(0x4940), f_q))mstore(0x4fa0, addmod(mload(0x4f00), mload(0x4f60), f_q)){ let result := mulmod(mload(0xb40), mload(0x3e80), f_q)result := addmod(mulmod(mload(0xb60), mload(0x3ee0), f_q), result, f_q)result := addmod(mulmod(mload(0xb80), mload(0x3f40), f_q), result, f_q)result := addmod(mulmod(mload(0xba0), mload(0x3fa0), f_q), result, f_q)mstore(0x4fc0, result) }mstore(0x4fe0, mulmod(mload(0x4fc0), mload(0x4600), f_q))mstore(0x5000, mulmod(sub(f_q, mload(0x4fe0)), mload(0x4960), f_q))mstore(0x5020, mulmod(1, mload(0x4960), f_q))mstore(0x5040, addmod(mload(0x4fa0), mload(0x5000), f_q))mstore(0x5060, mulmod(mload(0x5040), 1, f_q))mstore(0x5080, mulmod(mload(0x4da0), 1, f_q))mstore(0x50a0, mulmod(mload(0x4e40), 1, f_q))mstore(0x50c0, mulmod(mload(0x4ee0), 1, f_q))mstore(0x50e0, mulmod(mload(0x4f80), 1, f_q))mstore(0x5100, mulmod(mload(0x5020), 1, f_q))mstore(0x5120, mulmod(1, mload(0x4620), f_q)){ let result := mulmod(mload(0xbc0), mload(0x4040), f_q)mstore(0x5140, result) }mstore(0x5160, mulmod(mload(0x5140), mload(0x4880), f_q))mstore(0x5180, mulmod(sub(f_q, mload(0x5160)), 1, f_q))mstore(0x51a0, mulmod(mload(0x5120), 1, f_q)){ let result := mulmod(mload(0xbe0), mload(0x4040), f_q)mstore(0x51c0, result) }mstore(0x51e0, mulmod(mload(0x51c0), mload(0x4880), f_q))mstore(0x5200, mulmod(sub(f_q, mload(0x51e0)), mload(0x1260), f_q))mstore(0x5220, mulmod(mload(0x5120), mload(0x1260), f_q))mstore(0x5240, addmod(mload(0x5180), mload(0x5200), f_q)){ let result := mulmod(mload(0xc00), mload(0x4040), f_q)mstore(0x5260, result) }mstore(0x5280, mulmod(mload(0x5260), mload(0x4880), f_q))mstore(0x52a0, mulmod(sub(f_q, mload(0x5280)), mload(0x4900), f_q))mstore(0x52c0, mulmod(mload(0x5120), mload(0x4900), f_q))mstore(0x52e0, addmod(mload(0x5240), mload(0x52a0), f_q)){ let result := mulmod(mload(0x1180), mload(0x4040), f_q)mstore(0x5300, result) }mstore(0x5320, mulmod(mload(0x5300), mload(0x4880), f_q))mstore(0x5340, mulmod(sub(f_q, mload(0x5320)), mload(0x4920), f_q))mstore(0x5360, mulmod(mload(0x5120), mload(0x4920), f_q))mstore(0x5380, addmod(mload(0x52e0), mload(0x5340), f_q)){ let result := mulmod(mload(0x1220), mload(0x4040), f_q)mstore(0x53a0, result) }mstore(0x53c0, mulmod(mload(0x53a0), mload(0x4880), f_q))mstore(0x53e0, mulmod(sub(f_q, mload(0x53c0)), mload(0x4940), f_q))mstore(0x5400, mulmod(mload(0x5120), mload(0x4940), f_q))mstore(0x5420, addmod(mload(0x5380), mload(0x53e0), f_q)){ let result := mulmod(mload(0xc20), mload(0x4040), f_q)mstore(0x5440, result) }mstore(0x5460, mulmod(mload(0x5440), mload(0x4880), f_q))mstore(0x5480, mulmod(sub(f_q, mload(0x5460)), mload(0x4960), f_q))mstore(0x54a0, mulmod(mload(0x5120), mload(0x4960), f_q))mstore(0x54c0, addmod(mload(0x5420), mload(0x5480), f_q)){ let result := mulmod(mload(0xc40), mload(0x4040), f_q)mstore(0x54e0, result) }mstore(0x5500, mulmod(mload(0x54e0), mload(0x4880), f_q))mstore(0x5520, mulmod(sub(f_q, mload(0x5500)), mload(0x4980), f_q))mstore(0x5540, mulmod(mload(0x5120), mload(0x4980), f_q))mstore(0x5560, addmod(mload(0x54c0), mload(0x5520), f_q)){ let result := mulmod(mload(0xc60), mload(0x4040), f_q)mstore(0x5580, result) }mstore(0x55a0, mulmod(mload(0x5580), mload(0x4880), f_q))mstore(0x55c0, mulmod(sub(f_q, mload(0x55a0)), mload(0x49a0), f_q))mstore(0x55e0, mulmod(mload(0x5120), mload(0x49a0), f_q))mstore(0x5600, addmod(mload(0x5560), mload(0x55c0), f_q))mstore(0x5620, addmod(mload(0x5540), mload(0x55e0), f_q)){ let result := mulmod(mload(0xc80), mload(0x4040), f_q)mstore(0x5640, result) }mstore(0x5660, mulmod(mload(0x5640), mload(0x4880), f_q))mstore(0x5680, mulmod(sub(f_q, mload(0x5660)), mload(0x49c0), f_q))mstore(0x56a0, mulmod(mload(0x5120), mload(0x49c0), f_q))mstore(0x56c0, addmod(mload(0x5600), mload(0x5680), f_q)){ let result := mulmod(mload(0xca0), mload(0x4040), f_q)mstore(0x56e0, result) }mstore(0x5700, mulmod(mload(0x56e0), mload(0x4880), f_q))mstore(0x5720, mulmod(sub(f_q, mload(0x5700)), mload(0x49e0), f_q))mstore(0x5740, mulmod(mload(0x5120), mload(0x49e0), f_q))mstore(0x5760, addmod(mload(0x56c0), mload(0x5720), f_q)){ let result := mulmod(mload(0xcc0), mload(0x4040), f_q)mstore(0x5780, result) }mstore(0x57a0, mulmod(mload(0x5780), mload(0x4880), f_q))mstore(0x57c0, mulmod(sub(f_q, mload(0x57a0)), mload(0x4a00), f_q))mstore(0x57e0, mulmod(mload(0x5120), mload(0x4a00), f_q))mstore(0x5800, addmod(mload(0x5760), mload(0x57c0), f_q)){ let result := mulmod(mload(0xce0), mload(0x4040), f_q)mstore(0x5820, result) }mstore(0x5840, mulmod(mload(0x5820), mload(0x4880), f_q))mstore(0x5860, mulmod(sub(f_q, mload(0x5840)), mload(0x4a20), f_q))mstore(0x5880, mulmod(mload(0x5120), mload(0x4a20), f_q))mstore(0x58a0, addmod(mload(0x5800), mload(0x5860), f_q)){ let result := mulmod(mload(0xd00), mload(0x4040), f_q)mstore(0x58c0, result) }mstore(0x58e0, mulmod(mload(0x58c0), mload(0x4880), f_q))mstore(0x5900, mulmod(sub(f_q, mload(0x58e0)), mload(0x4a40), f_q))mstore(0x5920, mulmod(mload(0x5120), mload(0x4a40), f_q))mstore(0x5940, addmod(mload(0x58a0), mload(0x5900), f_q)){ let result := mulmod(mload(0xd20), mload(0x4040), f_q)mstore(0x5960, result) }mstore(0x5980, mulmod(mload(0x5960), mload(0x4880), f_q))mstore(0x59a0, mulmod(sub(f_q, mload(0x5980)), mload(0x4a60), f_q))mstore(0x59c0, mulmod(mload(0x5120), mload(0x4a60), f_q))mstore(0x59e0, addmod(mload(0x5940), mload(0x59a0), f_q)){ let result := mulmod(mload(0xd40), mload(0x4040), f_q)mstore(0x5a00, result) }mstore(0x5a20, mulmod(mload(0x5a00), mload(0x4880), f_q))mstore(0x5a40, mulmod(sub(f_q, mload(0x5a20)), mload(0x4a80), f_q))mstore(0x5a60, mulmod(mload(0x5120), mload(0x4a80), f_q))mstore(0x5a80, addmod(mload(0x59e0), mload(0x5a40), f_q)){ let result := mulmod(mload(0xd80), mload(0x4040), f_q)mstore(0x5aa0, result) }mstore(0x5ac0, mulmod(mload(0x5aa0), mload(0x4880), f_q))mstore(0x5ae0, mulmod(sub(f_q, mload(0x5ac0)), mload(0x4aa0), f_q))mstore(0x5b00, mulmod(mload(0x5120), mload(0x4aa0), f_q))mstore(0x5b20, addmod(mload(0x5a80), mload(0x5ae0), f_q)){ let result := mulmod(mload(0xda0), mload(0x4040), f_q)mstore(0x5b40, result) }mstore(0x5b60, mulmod(mload(0x5b40), mload(0x4880), f_q))mstore(0x5b80, mulmod(sub(f_q, mload(0x5b60)), mload(0x4ac0), f_q))mstore(0x5ba0, mulmod(mload(0x5120), mload(0x4ac0), f_q))mstore(0x5bc0, addmod(mload(0x5b20), mload(0x5b80), f_q)){ let result := mulmod(mload(0xdc0), mload(0x4040), f_q)mstore(0x5be0, result) }mstore(0x5c00, mulmod(mload(0x5be0), mload(0x4880), f_q))mstore(0x5c20, mulmod(sub(f_q, mload(0x5c00)), mload(0x4ae0), f_q))mstore(0x5c40, mulmod(mload(0x5120), mload(0x4ae0), f_q))mstore(0x5c60, addmod(mload(0x5bc0), mload(0x5c20), f_q)){ let result := mulmod(mload(0xde0), mload(0x4040), f_q)mstore(0x5c80, result) }mstore(0x5ca0, mulmod(mload(0x5c80), mload(0x4880), f_q))mstore(0x5cc0, mulmod(sub(f_q, mload(0x5ca0)), mload(0x4b00), f_q))mstore(0x5ce0, mulmod(mload(0x5120), mload(0x4b00), f_q))mstore(0x5d00, addmod(mload(0x5c60), mload(0x5cc0), f_q)){ let result := mulmod(mload(0xe00), mload(0x4040), f_q)mstore(0x5d20, result) }mstore(0x5d40, mulmod(mload(0x5d20), mload(0x4880), f_q))mstore(0x5d60, mulmod(sub(f_q, mload(0x5d40)), mload(0x4b20), f_q))mstore(0x5d80, mulmod(mload(0x5120), mload(0x4b20), f_q))mstore(0x5da0, addmod(mload(0x5d00), mload(0x5d60), f_q)){ let result := mulmod(mload(0xe20), mload(0x4040), f_q)mstore(0x5dc0, result) }mstore(0x5de0, mulmod(mload(0x5dc0), mload(0x4880), f_q))mstore(0x5e00, mulmod(sub(f_q, mload(0x5de0)), mload(0x4b40), f_q))mstore(0x5e20, mulmod(mload(0x5120), mload(0x4b40), f_q))mstore(0x5e40, addmod(mload(0x5da0), mload(0x5e00), f_q)){ let result := mulmod(mload(0xe40), mload(0x4040), f_q)mstore(0x5e60, result) }mstore(0x5e80, mulmod(mload(0x5e60), mload(0x4880), f_q))mstore(0x5ea0, mulmod(sub(f_q, mload(0x5e80)), mload(0x4b60), f_q))mstore(0x5ec0, mulmod(mload(0x5120), mload(0x4b60), f_q))mstore(0x5ee0, addmod(mload(0x5e40), mload(0x5ea0), f_q)){ let result := mulmod(mload(0xe60), mload(0x4040), f_q)mstore(0x5f00, result) }mstore(0x5f20, mulmod(mload(0x5f00), mload(0x4880), f_q))mstore(0x5f40, mulmod(sub(f_q, mload(0x5f20)), mload(0x4b80), f_q))mstore(0x5f60, mulmod(mload(0x5120), mload(0x4b80), f_q))mstore(0x5f80, addmod(mload(0x5ee0), mload(0x5f40), f_q)){ let result := mulmod(mload(0xe80), mload(0x4040), f_q)mstore(0x5fa0, result) }mstore(0x5fc0, mulmod(mload(0x5fa0), mload(0x4880), f_q))mstore(0x5fe0, mulmod(sub(f_q, mload(0x5fc0)), mload(0x4ba0), f_q))mstore(0x6000, mulmod(mload(0x5120), mload(0x4ba0), f_q))mstore(0x6020, addmod(mload(0x5f80), mload(0x5fe0), f_q)){ let result := mulmod(mload(0xea0), mload(0x4040), f_q)mstore(0x6040, result) }mstore(0x6060, mulmod(mload(0x6040), mload(0x4880), f_q))mstore(0x6080, mulmod(sub(f_q, mload(0x6060)), mload(0x4bc0), f_q))mstore(0x60a0, mulmod(mload(0x5120), mload(0x4bc0), f_q))mstore(0x60c0, addmod(mload(0x6020), mload(0x6080), f_q)){ let result := mulmod(mload(0xec0), mload(0x4040), f_q)mstore(0x60e0, result) }mstore(0x6100, mulmod(mload(0x60e0), mload(0x4880), f_q))mstore(0x6120, mulmod(sub(f_q, mload(0x6100)), mload(0x4be0), f_q))mstore(0x6140, mulmod(mload(0x5120), mload(0x4be0), f_q))mstore(0x6160, addmod(mload(0x60c0), mload(0x6120), f_q))mstore(0x6180, mulmod(mload(0x3c20), mload(0x4620), f_q))mstore(0x61a0, mulmod(mload(0x3c40), mload(0x4620), f_q)){ let result := mulmod(mload(0x3c60), mload(0x4040), f_q)mstore(0x61c0, result) }mstore(0x61e0, mulmod(mload(0x61c0), mload(0x4880), f_q))mstore(0x6200, mulmod(sub(f_q, mload(0x61e0)), mload(0x4c00), f_q))mstore(0x6220, mulmod(mload(0x5120), mload(0x4c00), f_q))mstore(0x6240, mulmod(mload(0x6180), mload(0x4c00), f_q))mstore(0x6260, mulmod(mload(0x61a0), mload(0x4c00), f_q))mstore(0x6280, addmod(mload(0x6160), mload(0x6200), f_q)){ let result := mulmod(mload(0xd60), mload(0x4040), f_q)mstore(0x62a0, result) }mstore(0x62c0, mulmod(mload(0x62a0), mload(0x4880), f_q))mstore(0x62e0, mulmod(sub(f_q, mload(0x62c0)), mload(0x4c20), f_q))mstore(0x6300, mulmod(mload(0x5120), mload(0x4c20), f_q))mstore(0x6320, addmod(mload(0x6280), mload(0x62e0), f_q))mstore(0x6340, mulmod(mload(0x6320), mload(0x12c0), f_q))mstore(0x6360, mulmod(mload(0x51a0), mload(0x12c0), f_q))mstore(0x6380, mulmod(mload(0x5220), mload(0x12c0), f_q))mstore(0x63a0, mulmod(mload(0x52c0), mload(0x12c0), f_q))mstore(0x63c0, mulmod(mload(0x5360), mload(0x12c0), f_q))mstore(0x63e0, mulmod(mload(0x5400), mload(0x12c0), f_q))mstore(0x6400, mulmod(mload(0x54a0), mload(0x12c0), f_q))mstore(0x6420, mulmod(mload(0x5620), mload(0x12c0), f_q))mstore(0x6440, mulmod(mload(0x56a0), mload(0x12c0), f_q))mstore(0x6460, mulmod(mload(0x5740), mload(0x12c0), f_q))mstore(0x6480, mulmod(mload(0x57e0), mload(0x12c0), f_q))mstore(0x64a0, mulmod(mload(0x5880), mload(0x12c0), f_q))mstore(0x64c0, mulmod(mload(0x5920), mload(0x12c0), f_q))mstore(0x64e0, mulmod(mload(0x59c0), mload(0x12c0), f_q))mstore(0x6500, mulmod(mload(0x5a60), mload(0x12c0), f_q))mstore(0x6520, mulmod(mload(0x5b00), mload(0x12c0), f_q))mstore(0x6540, mulmod(mload(0x5ba0), mload(0x12c0), f_q))mstore(0x6560, mulmod(mload(0x5c40), mload(0x12c0), f_q))mstore(0x6580, mulmod(mload(0x5ce0), mload(0x12c0), f_q))mstore(0x65a0, mulmod(mload(0x5d80), mload(0x12c0), f_q))mstore(0x65c0, mulmod(mload(0x5e20), mload(0x12c0), f_q))mstore(0x65e0, mulmod(mload(0x5ec0), mload(0x12c0), f_q))mstore(0x6600, mulmod(mload(0x5f60), mload(0x12c0), f_q))mstore(0x6620, mulmod(mload(0x6000), mload(0x12c0), f_q))mstore(0x6640, mulmod(mload(0x60a0), mload(0x12c0), f_q))mstore(0x6660, mulmod(mload(0x6140), mload(0x12c0), f_q))mstore(0x6680, mulmod(mload(0x6220), mload(0x12c0), f_q))mstore(0x66a0, mulmod(mload(0x6240), mload(0x12c0), f_q))mstore(0x66c0, mulmod(mload(0x6260), mload(0x12c0), f_q))mstore(0x66e0, mulmod(mload(0x6300), mload(0x12c0), f_q))mstore(0x6700, addmod(mload(0x5060), mload(0x6340), f_q))mstore(0x6720, mulmod(1, mload(0x4660), f_q)){ let result := mulmod(mload(0xee0), mload(0x40a0), f_q)result := addmod(mulmod(mload(0xf00), mload(0x4100), f_q), result, f_q)result := addmod(mulmod(mload(0xf20), mload(0x4160), f_q), result, f_q)mstore(0x6740, result) }mstore(0x6760, mulmod(mload(0x6740), mload(0x48a0), f_q))mstore(0x6780, mulmod(sub(f_q, mload(0x6760)), 1, f_q))mstore(0x67a0, mulmod(mload(0x6720), 1, f_q)){ let result := mulmod(mload(0xf40), mload(0x40a0), f_q)result := addmod(mulmod(mload(0xf60), mload(0x4100), f_q), result, f_q)result := addmod(mulmod(mload(0xf80), mload(0x4160), f_q), result, f_q)mstore(0x67c0, result) }mstore(0x67e0, mulmod(mload(0x67c0), mload(0x48a0), f_q))mstore(0x6800, mulmod(sub(f_q, mload(0x67e0)), mload(0x1260), f_q))mstore(0x6820, mulmod(mload(0x6720), mload(0x1260), f_q))mstore(0x6840, addmod(mload(0x6780), mload(0x6800), f_q)){ let result := mulmod(mload(0xfa0), mload(0x40a0), f_q)result := addmod(mulmod(mload(0xfc0), mload(0x4100), f_q), result, f_q)result := addmod(mulmod(mload(0xfe0), mload(0x4160), f_q), result, f_q)mstore(0x6860, result) }mstore(0x6880, mulmod(mload(0x6860), mload(0x48a0), f_q))mstore(0x68a0, mulmod(sub(f_q, mload(0x6880)), mload(0x4900), f_q))mstore(0x68c0, mulmod(mload(0x6720), mload(0x4900), f_q))mstore(0x68e0, addmod(mload(0x6840), mload(0x68a0), f_q)){ let result := mulmod(mload(0x1000), mload(0x40a0), f_q)result := addmod(mulmod(mload(0x1020), mload(0x4100), f_q), result, f_q)result := addmod(mulmod(mload(0x1040), mload(0x4160), f_q), result, f_q)mstore(0x6900, result) }mstore(0x6920, mulmod(mload(0x6900), mload(0x48a0), f_q))mstore(0x6940, mulmod(sub(f_q, mload(0x6920)), mload(0x4920), f_q))mstore(0x6960, mulmod(mload(0x6720), mload(0x4920), f_q))mstore(0x6980, addmod(mload(0x68e0), mload(0x6940), f_q)){ let result := mulmod(mload(0x1060), mload(0x40a0), f_q)result := addmod(mulmod(mload(0x1080), mload(0x4100), f_q), result, f_q)result := addmod(mulmod(mload(0x10a0), mload(0x4160), f_q), result, f_q)mstore(0x69a0, result) }mstore(0x69c0, mulmod(mload(0x69a0), mload(0x48a0), f_q))mstore(0x69e0, mulmod(sub(f_q, mload(0x69c0)), mload(0x4940), f_q))mstore(0x6a00, mulmod(mload(0x6720), mload(0x4940), f_q))mstore(0x6a20, addmod(mload(0x6980), mload(0x69e0), f_q))mstore(0x6a40, mulmod(mload(0x6a20), mload(0x4c60), f_q))mstore(0x6a60, mulmod(mload(0x67a0), mload(0x4c60), f_q))mstore(0x6a80, mulmod(mload(0x6820), mload(0x4c60), f_q))mstore(0x6aa0, mulmod(mload(0x68c0), mload(0x4c60), f_q))mstore(0x6ac0, mulmod(mload(0x6960), mload(0x4c60), f_q))mstore(0x6ae0, mulmod(mload(0x6a00), mload(0x4c60), f_q))mstore(0x6b00, addmod(mload(0x6700), mload(0x6a40), f_q))mstore(0x6b20, mulmod(1, mload(0x46a0), f_q)){ let result := mulmod(mload(0x10c0), mload(0x41e0), f_q)result := addmod(mulmod(mload(0x10e0), mload(0x4240), f_q), result, f_q)mstore(0x6b40, result) }mstore(0x6b60, mulmod(mload(0x6b40), mload(0x48c0), f_q))mstore(0x6b80, mulmod(sub(f_q, mload(0x6b60)), 1, f_q))mstore(0x6ba0, mulmod(mload(0x6b20), 1, f_q)){ let result := mulmod(mload(0x1100), mload(0x41e0), f_q)result := addmod(mulmod(mload(0x1120), mload(0x4240), f_q), result, f_q)mstore(0x6bc0, result) }mstore(0x6be0, mulmod(mload(0x6bc0), mload(0x48c0), f_q))mstore(0x6c00, mulmod(sub(f_q, mload(0x6be0)), mload(0x1260), f_q))mstore(0x6c20, mulmod(mload(0x6b20), mload(0x1260), f_q))mstore(0x6c40, addmod(mload(0x6b80), mload(0x6c00), f_q)){ let result := mulmod(mload(0x11a0), mload(0x41e0), f_q)result := addmod(mulmod(mload(0x11c0), mload(0x4240), f_q), result, f_q)mstore(0x6c60, result) }mstore(0x6c80, mulmod(mload(0x6c60), mload(0x48c0), f_q))mstore(0x6ca0, mulmod(sub(f_q, mload(0x6c80)), mload(0x4900), f_q))mstore(0x6cc0, mulmod(mload(0x6b20), mload(0x4900), f_q))mstore(0x6ce0, addmod(mload(0x6c40), mload(0x6ca0), f_q))mstore(0x6d00, mulmod(mload(0x6ce0), mload(0x4c80), f_q))mstore(0x6d20, mulmod(mload(0x6ba0), mload(0x4c80), f_q))mstore(0x6d40, mulmod(mload(0x6c20), mload(0x4c80), f_q))mstore(0x6d60, mulmod(mload(0x6cc0), mload(0x4c80), f_q))mstore(0x6d80, addmod(mload(0x6b00), mload(0x6d00), f_q))mstore(0x6da0, mulmod(1, mload(0x46e0), f_q)){ let result := mulmod(mload(0x1140), mload(0x42a0), f_q)result := addmod(mulmod(mload(0x1160), mload(0x4300), f_q), result, f_q)mstore(0x6dc0, result) }mstore(0x6de0, mulmod(mload(0x6dc0), mload(0x48e0), f_q))mstore(0x6e00, mulmod(sub(f_q, mload(0x6de0)), 1, f_q))mstore(0x6e20, mulmod(mload(0x6da0), 1, f_q)){ let result := mulmod(mload(0x11e0), mload(0x42a0), f_q)result := addmod(mulmod(mload(0x1200), mload(0x4300), f_q), result, f_q)mstore(0x6e40, result) }mstore(0x6e60, mulmod(mload(0x6e40), mload(0x48e0), f_q))mstore(0x6e80, mulmod(sub(f_q, mload(0x6e60)), mload(0x1260), f_q))mstore(0x6ea0, mulmod(mload(0x6da0), mload(0x1260), f_q))mstore(0x6ec0, addmod(mload(0x6e00), mload(0x6e80), f_q))mstore(0x6ee0, mulmod(mload(0x6ec0), mload(0x4ca0), f_q))mstore(0x6f00, mulmod(mload(0x6e20), mload(0x4ca0), f_q))mstore(0x6f20, mulmod(mload(0x6ea0), mload(0x4ca0), f_q))mstore(0x6f40, addmod(mload(0x6d80), mload(0x6ee0), f_q))mstore(0x6f60, mulmod(1, mload(0x4020), f_q))mstore(0x6f80, mulmod(1, mload(0x1360), f_q))mstore(0x6fa0, 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(0x6fc0, 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(0x6fe0, mload(0x6f40))success := and(eq(staticcall(gas(), 0x7, 0x6fa0, 0x60, 0x6fa0, 0x40), 1), success)mstore(0x7000, mload(0x6fa0)) mstore(0x7020, mload(0x6fc0))mstore(0x7040, mload(0xa0)) mstore(0x7060, mload(0xc0))success := and(eq(staticcall(gas(), 0x6, 0x7000, 0x80, 0x7000, 0x40), 1), success)mstore(0x7080, mload(0xe0)) mstore(0x70a0, mload(0x100))mstore(0x70c0, mload(0x5080))success := and(eq(staticcall(gas(), 0x7, 0x7080, 0x60, 0x7080, 0x40), 1), success)mstore(0x70e0, mload(0x7000)) mstore(0x7100, mload(0x7020))mstore(0x7120, mload(0x7080)) mstore(0x7140, mload(0x70a0))success := and(eq(staticcall(gas(), 0x6, 0x70e0, 0x80, 0x70e0, 0x40), 1), success)mstore(0x7160, mload(0x120)) mstore(0x7180, mload(0x140))mstore(0x71a0, mload(0x50a0))success := and(eq(staticcall(gas(), 0x7, 0x7160, 0x60, 0x7160, 0x40), 1), success)mstore(0x71c0, mload(0x70e0)) mstore(0x71e0, mload(0x7100))mstore(0x7200, mload(0x7160)) mstore(0x7220, mload(0x7180))success := and(eq(staticcall(gas(), 0x6, 0x71c0, 0x80, 0x71c0, 0x40), 1), success)mstore(0x7240, mload(0x160)) mstore(0x7260, mload(0x180))mstore(0x7280, mload(0x50c0))success := and(eq(staticcall(gas(), 0x7, 0x7240, 0x60, 0x7240, 0x40), 1), success)mstore(0x72a0, mload(0x71c0)) mstore(0x72c0, mload(0x71e0))mstore(0x72e0, mload(0x7240)) mstore(0x7300, mload(0x7260))success := and(eq(staticcall(gas(), 0x6, 0x72a0, 0x80, 0x72a0, 0x40), 1), success)mstore(0x7320, mload(0x1a0)) mstore(0x7340, mload(0x1c0))mstore(0x7360, mload(0x50e0))success := and(eq(staticcall(gas(), 0x7, 0x7320, 0x60, 0x7320, 0x40), 1), success)mstore(0x7380, mload(0x72a0)) mstore(0x73a0, mload(0x72c0))mstore(0x73c0, mload(0x7320)) mstore(0x73e0, mload(0x7340))success := and(eq(staticcall(gas(), 0x6, 0x7380, 0x80, 0x7380, 0x40), 1), success)mstore(0x7400, mload(0x1e0)) mstore(0x7420, mload(0x200))mstore(0x7440, mload(0x5100))success := and(eq(staticcall(gas(), 0x7, 0x7400, 0x60, 0x7400, 0x40), 1), success)mstore(0x7460, mload(0x7380)) mstore(0x7480, mload(0x73a0))mstore(0x74a0, mload(0x7400)) mstore(0x74c0, mload(0x7420))success := and(eq(staticcall(gas(), 0x6, 0x7460, 0x80, 0x7460, 0x40), 1), success)mstore(0x74e0, mload(0x220)) mstore(0x7500, mload(0x240))mstore(0x7520, mload(0x6360))success := and(eq(staticcall(gas(), 0x7, 0x74e0, 0x60, 0x74e0, 0x40), 1), success)mstore(0x7540, mload(0x7460)) mstore(0x7560, mload(0x7480))mstore(0x7580, mload(0x74e0)) mstore(0x75a0, mload(0x7500))success := and(eq(staticcall(gas(), 0x6, 0x7540, 0x80, 0x7540, 0x40), 1), success)mstore(0x75c0, mload(0x260)) mstore(0x75e0, mload(0x280))mstore(0x7600, mload(0x6380))success := and(eq(staticcall(gas(), 0x7, 0x75c0, 0x60, 0x75c0, 0x40), 1), success)mstore(0x7620, mload(0x7540)) mstore(0x7640, mload(0x7560))mstore(0x7660, mload(0x75c0)) mstore(0x7680, mload(0x75e0))success := and(eq(staticcall(gas(), 0x6, 0x7620, 0x80, 0x7620, 0x40), 1), success)mstore(0x76a0, mload(0x2a0)) mstore(0x76c0, mload(0x2c0))mstore(0x76e0, mload(0x63a0))success := and(eq(staticcall(gas(), 0x7, 0x76a0, 0x60, 0x76a0, 0x40), 1), success)mstore(0x7700, mload(0x7620)) mstore(0x7720, mload(0x7640))mstore(0x7740, mload(0x76a0)) mstore(0x7760, mload(0x76c0))success := and(eq(staticcall(gas(), 0x6, 0x7700, 0x80, 0x7700, 0x40), 1), success)mstore(0x7780, mload(0x380)) mstore(0x77a0, mload(0x3a0))mstore(0x77c0, mload(0x63c0))success := and(eq(staticcall(gas(), 0x7, 0x7780, 0x60, 0x7780, 0x40), 1), success)mstore(0x77e0, mload(0x7700)) mstore(0x7800, mload(0x7720))mstore(0x7820, mload(0x7780)) mstore(0x7840, mload(0x77a0))success := and(eq(staticcall(gas(), 0x6, 0x77e0, 0x80, 0x77e0, 0x40), 1), success)mstore(0x7860, mload(0x400)) mstore(0x7880, mload(0x420))mstore(0x78a0, mload(0x63e0))success := and(eq(staticcall(gas(), 0x7, 0x7860, 0x60, 0x7860, 0x40), 1), success)mstore(0x78c0, mload(0x77e0)) mstore(0x78e0, mload(0x7800))mstore(0x7900, mload(0x7860)) mstore(0x7920, mload(0x7880))success := and(eq(staticcall(gas(), 0x6, 0x78c0, 0x80, 0x78c0, 0x40), 1), success)mstore(0x7940, 0x0d3b7c04b7391ddf5d9fc5f8906033e1d1442f341c4cab5c1584c8082ea8c21c) mstore(0x7960, 0x1596df7247ab32fb79261c31617e2f2bbde95b6e8719386dacfeaa8f6d7df60c)mstore(0x7980, mload(0x6400))success := and(eq(staticcall(gas(), 0x7, 0x7940, 0x60, 0x7940, 0x40), 1), success)mstore(0x79a0, mload(0x78c0)) mstore(0x79c0, mload(0x78e0))mstore(0x79e0, mload(0x7940)) mstore(0x7a00, mload(0x7960))success := and(eq(staticcall(gas(), 0x6, 0x79a0, 0x80, 0x79a0, 0x40), 1), success)mstore(0x7a20, 0x04d043081f0d55eead6d8ad7b10d09a6ee2718f445d9bce454075a8a37bacaf3) mstore(0x7a40, 0x27d6bcbb02cd624ab80b5532a0a65fc6f88a0faf7cf3e0d106f4aa0aa25e758b)mstore(0x7a60, mload(0x6420))success := and(eq(staticcall(gas(), 0x7, 0x7a20, 0x60, 0x7a20, 0x40), 1), success)mstore(0x7a80, mload(0x79a0)) mstore(0x7aa0, mload(0x79c0))mstore(0x7ac0, mload(0x7a20)) mstore(0x7ae0, mload(0x7a40))success := and(eq(staticcall(gas(), 0x6, 0x7a80, 0x80, 0x7a80, 0x40), 1), success)mstore(0x7b00, 0x2d07a1bca289cdb98b648a91cbb0809dfa3a06fe01047b291d1161ddf8d1732c) mstore(0x7b20, 0x021d078d5869c57b3fe2413b517561205de5f297ac56c0e5ef0f1a7f4a31ee94)mstore(0x7b40, mload(0x6440))success := and(eq(staticcall(gas(), 0x7, 0x7b00, 0x60, 0x7b00, 0x40), 1), success)mstore(0x7b60, mload(0x7a80)) mstore(0x7b80, mload(0x7aa0))mstore(0x7ba0, mload(0x7b00)) mstore(0x7bc0, mload(0x7b20))success := and(eq(staticcall(gas(), 0x6, 0x7b60, 0x80, 0x7b60, 0x40), 1), success)mstore(0x7be0, 0x2808de5f33581574dd857304add28f30335fa32c49a3d7c9128f5a3f453360cc) mstore(0x7c00, 0x07f10d421231cb6aa063db7a3cf7be709ff037fbb78d19c866d7c2c674a1aaf0)mstore(0x7c20, mload(0x6460))success := and(eq(staticcall(gas(), 0x7, 0x7be0, 0x60, 0x7be0, 0x40), 1), success)mstore(0x7c40, mload(0x7b60)) mstore(0x7c60, mload(0x7b80))mstore(0x7c80, mload(0x7be0)) mstore(0x7ca0, mload(0x7c00))success := and(eq(staticcall(gas(), 0x6, 0x7c40, 0x80, 0x7c40, 0x40), 1), success)mstore(0x7cc0, 0x2a9d8bc0a06a141e47fa114e4e62686823227f5416f19f9b2b54b9948a0bfb4b) mstore(0x7ce0, 0x170610ca7497030a3dbbfeb52cc8f5f086e7a7a91e3b52e44988e6b24f1c6c34)mstore(0x7d00, mload(0x6480))success := and(eq(staticcall(gas(), 0x7, 0x7cc0, 0x60, 0x7cc0, 0x40), 1), success)mstore(0x7d20, mload(0x7c40)) mstore(0x7d40, mload(0x7c60))mstore(0x7d60, mload(0x7cc0)) mstore(0x7d80, mload(0x7ce0))success := and(eq(staticcall(gas(), 0x6, 0x7d20, 0x80, 0x7d20, 0x40), 1), success)mstore(0x7da0, 0x104eb8e796d7c0b0ac9eb316eac3aadbcf9ac5b42d4b14a95ec269fefd70d9ac) mstore(0x7dc0, 0x22e1365078923b7f828a54c75e0b0b108c311580bac730c92d8868c7781a917b)mstore(0x7de0, mload(0x64a0))success := and(eq(staticcall(gas(), 0x7, 0x7da0, 0x60, 0x7da0, 0x40), 1), success)mstore(0x7e00, mload(0x7d20)) mstore(0x7e20, mload(0x7d40))mstore(0x7e40, mload(0x7da0)) mstore(0x7e60, mload(0x7dc0))success := and(eq(staticcall(gas(), 0x6, 0x7e00, 0x80, 0x7e00, 0x40), 1), success)mstore(0x7e80, 0x2e8f499835598c80e2ec4cabd4753e67822df35d0a29c05b60dca21d9173b11a) mstore(0x7ea0, 0x02990fa09b4831443e5956b84832f525976cd30aa6cafe055a45f7a04328d00f)mstore(0x7ec0, mload(0x64c0))success := and(eq(staticcall(gas(), 0x7, 0x7e80, 0x60, 0x7e80, 0x40), 1), success)mstore(0x7ee0, mload(0x7e00)) mstore(0x7f00, mload(0x7e20))mstore(0x7f20, mload(0x7e80)) mstore(0x7f40, mload(0x7ea0))success := and(eq(staticcall(gas(), 0x6, 0x7ee0, 0x80, 0x7ee0, 0x40), 1), success)mstore(0x7f60, 0x258bbf1a0f256c29c1cee612fb7deaa2102870b85d7bda1ac8064307a593101f) mstore(0x7f80, 0x2bbbde7d34cf03b70ea4a0125d6736aeb56da64f07226bf4d662a85e8d50db3a)mstore(0x7fa0, mload(0x64e0))success := and(eq(staticcall(gas(), 0x7, 0x7f60, 0x60, 0x7f60, 0x40), 1), success)mstore(0x7fc0, mload(0x7ee0)) mstore(0x7fe0, mload(0x7f00))mstore(0x8000, mload(0x7f60)) mstore(0x8020, mload(0x7f80))success := and(eq(staticcall(gas(), 0x6, 0x7fc0, 0x80, 0x7fc0, 0x40), 1), success)mstore(0x8040, 0x05127b4a2ff58c747435761c7256b8094a0cf4e6d0f829a060c601d5cce0fdc0) mstore(0x8060, 0x106a8cecab556f1a6d729cdeefd6dd70afbe4954cae4785871d68396dba88d95)mstore(0x8080, mload(0x6500))success := and(eq(staticcall(gas(), 0x7, 0x8040, 0x60, 0x8040, 0x40), 1), success)mstore(0x80a0, mload(0x7fc0)) mstore(0x80c0, mload(0x7fe0))mstore(0x80e0, mload(0x8040)) mstore(0x8100, mload(0x8060))success := and(eq(staticcall(gas(), 0x6, 0x80a0, 0x80, 0x80a0, 0x40), 1), success)mstore(0x8120, 0x24c985411f901ba3e9fe3296d58db7a896d53a060afc4c3b85182122d2a06b16) mstore(0x8140, 0x1e02136b244f617c37779b0cb970dce25ff03579c671e7f3f57a320e7b1a4b06)mstore(0x8160, mload(0x6520))success := and(eq(staticcall(gas(), 0x7, 0x8120, 0x60, 0x8120, 0x40), 1), success)mstore(0x8180, mload(0x80a0)) mstore(0x81a0, mload(0x80c0))mstore(0x81c0, mload(0x8120)) mstore(0x81e0, mload(0x8140))success := and(eq(staticcall(gas(), 0x6, 0x8180, 0x80, 0x8180, 0x40), 1), success)mstore(0x8200, 0x0e5c5a486399e328a6629926a042fde07863ce1a2e91995ee60e5c477008ebdc) mstore(0x8220, 0x223b4bdd8d3877955728258fd5be1b7f2ac8093891a83c738f80395720cc55ca)mstore(0x8240, mload(0x6540))success := and(eq(staticcall(gas(), 0x7, 0x8200, 0x60, 0x8200, 0x40), 1), success)mstore(0x8260, mload(0x8180)) mstore(0x8280, mload(0x81a0))mstore(0x82a0, mload(0x8200)) mstore(0x82c0, mload(0x8220))success := and(eq(staticcall(gas(), 0x6, 0x8260, 0x80, 0x8260, 0x40), 1), success)mstore(0x82e0, 0x2e55f008e10b629fc37b0808b8264d2857e6fa34a1be704a4132f9c1621b8736) mstore(0x8300, 0x01c3487db12618c270ffe8251633753bdad9fd2968144a02b18447bee326d19d)mstore(0x8320, mload(0x6560))success := and(eq(staticcall(gas(), 0x7, 0x82e0, 0x60, 0x82e0, 0x40), 1), success)mstore(0x8340, mload(0x8260)) mstore(0x8360, mload(0x8280))mstore(0x8380, mload(0x82e0)) mstore(0x83a0, mload(0x8300))success := and(eq(staticcall(gas(), 0x6, 0x8340, 0x80, 0x8340, 0x40), 1), success)mstore(0x83c0, 0x0154bffa5c54063b60c4f4c66b2a9acb09fd7f1b2653a9f2b9ee75bcb1bc8ba2) mstore(0x83e0, 0x0b15f039df5ebe088e2231ce9a07c50dbb4739402712b56dd8bab6ab93a95f3f)mstore(0x8400, mload(0x6580))success := and(eq(staticcall(gas(), 0x7, 0x83c0, 0x60, 0x83c0, 0x40), 1), success)mstore(0x8420, mload(0x8340)) mstore(0x8440, mload(0x8360))mstore(0x8460, mload(0x83c0)) mstore(0x8480, mload(0x83e0))success := and(eq(staticcall(gas(), 0x6, 0x8420, 0x80, 0x8420, 0x40), 1), success)mstore(0x84a0, 0x0032a37f146820eccad7796039d21d0c85504baff34e194f750d7f8c4eccf729) mstore(0x84c0, 0x2a655340cddc523abd37c3d77f022b8e616194a3c31e414dc5d466eb2e4c0b69)mstore(0x84e0, mload(0x65a0))success := and(eq(staticcall(gas(), 0x7, 0x84a0, 0x60, 0x84a0, 0x40), 1), success)mstore(0x8500, mload(0x8420)) mstore(0x8520, mload(0x8440))mstore(0x8540, mload(0x84a0)) mstore(0x8560, mload(0x84c0))success := and(eq(staticcall(gas(), 0x6, 0x8500, 0x80, 0x8500, 0x40), 1), success)mstore(0x8580, 0x0d6b367e25327ebd99fae2aaffa6fad2acae34ba7b329ef817a95fe425f65e4d) mstore(0x85a0, 0x2bc4769ce00a494fde791f07b3f092019995d323c0b067d61e0660e1ad84d94f)mstore(0x85c0, mload(0x65c0))success := and(eq(staticcall(gas(), 0x7, 0x8580, 0x60, 0x8580, 0x40), 1), success)mstore(0x85e0, mload(0x8500)) mstore(0x8600, mload(0x8520))mstore(0x8620, mload(0x8580)) mstore(0x8640, mload(0x85a0))success := and(eq(staticcall(gas(), 0x6, 0x85e0, 0x80, 0x85e0, 0x40), 1), success)mstore(0x8660, 0x0fef43d29ecdb947fc934c7adf7f38748fe212082d5a8e3bc621ff907213812b) mstore(0x8680, 0x1ab8ccbb8486a5508a34837db62c3426d6f6210970a2b1351f12d0ba73e11874)mstore(0x86a0, mload(0x65e0))success := and(eq(staticcall(gas(), 0x7, 0x8660, 0x60, 0x8660, 0x40), 1), success)mstore(0x86c0, mload(0x85e0)) mstore(0x86e0, mload(0x8600))mstore(0x8700, mload(0x8660)) mstore(0x8720, mload(0x8680))success := and(eq(staticcall(gas(), 0x6, 0x86c0, 0x80, 0x86c0, 0x40), 1), success)mstore(0x8740, 0x29cc03da3870fc7139115d43275baf04cc110d79f85d2c2e712b981c409df25e) mstore(0x8760, 0x016a8cd002e522595ef910f87dc707449ae5f56876eb88274b2e586fceacf165)mstore(0x8780, mload(0x6600))success := and(eq(staticcall(gas(), 0x7, 0x8740, 0x60, 0x8740, 0x40), 1), success)mstore(0x87a0, mload(0x86c0)) mstore(0x87c0, mload(0x86e0))mstore(0x87e0, mload(0x8740)) mstore(0x8800, mload(0x8760))success := and(eq(staticcall(gas(), 0x6, 0x87a0, 0x80, 0x87a0, 0x40), 1), success)mstore(0x8820, 0x0ec6d72e2ce7c233ca8af2fc2bd4223a6d81d545e8785579de4cb241740f36a2) mstore(0x8840, 0x028a4450999577e25fc7d191fecf7f1a8a0526f7e042f316767c7ff43299fdd9)mstore(0x8860, mload(0x6620))success := and(eq(staticcall(gas(), 0x7, 0x8820, 0x60, 0x8820, 0x40), 1), success)mstore(0x8880, mload(0x87a0)) mstore(0x88a0, mload(0x87c0))mstore(0x88c0, mload(0x8820)) mstore(0x88e0, mload(0x8840))success := and(eq(staticcall(gas(), 0x6, 0x8880, 0x80, 0x8880, 0x40), 1), success)mstore(0x8900, 0x1fdb57cefe9c10024dfe402759cad8061e8d0edeba3f42f187ea796b1938118e) mstore(0x8920, 0x1294d92ed67eec88a2adbb5cef0682a64fae9827c02d37e69beaddd3b6a145ad)mstore(0x8940, mload(0x6640))success := and(eq(staticcall(gas(), 0x7, 0x8900, 0x60, 0x8900, 0x40), 1), success)mstore(0x8960, mload(0x8880)) mstore(0x8980, mload(0x88a0))mstore(0x89a0, mload(0x8900)) mstore(0x89c0, mload(0x8920))success := and(eq(staticcall(gas(), 0x6, 0x8960, 0x80, 0x8960, 0x40), 1), success)mstore(0x89e0, 0x292267e75402bf3fb816d404fe987ec7b277ec539cd653568a31dc8fdd04b6f1) mstore(0x8a00, 0x0a2975f29c8f29df52ea4e941daa28752eea2da8c6b6135622e4a0d823accd78)mstore(0x8a20, mload(0x6660))success := and(eq(staticcall(gas(), 0x7, 0x89e0, 0x60, 0x89e0, 0x40), 1), success)mstore(0x8a40, mload(0x8960)) mstore(0x8a60, mload(0x8980))mstore(0x8a80, mload(0x89e0)) mstore(0x8aa0, mload(0x8a00))success := and(eq(staticcall(gas(), 0x6, 0x8a40, 0x80, 0x8a40, 0x40), 1), success)mstore(0x8ac0, mload(0x7a0)) mstore(0x8ae0, mload(0x7c0))mstore(0x8b00, mload(0x6680))success := and(eq(staticcall(gas(), 0x7, 0x8ac0, 0x60, 0x8ac0, 0x40), 1), success)mstore(0x8b20, mload(0x8a40)) mstore(0x8b40, mload(0x8a60))mstore(0x8b60, mload(0x8ac0)) mstore(0x8b80, mload(0x8ae0))success := and(eq(staticcall(gas(), 0x6, 0x8b20, 0x80, 0x8b20, 0x40), 1), success)mstore(0x8ba0, mload(0x7e0)) mstore(0x8bc0, mload(0x800))mstore(0x8be0, mload(0x66a0))success := and(eq(staticcall(gas(), 0x7, 0x8ba0, 0x60, 0x8ba0, 0x40), 1), success)mstore(0x8c00, mload(0x8b20)) mstore(0x8c20, mload(0x8b40))mstore(0x8c40, mload(0x8ba0)) mstore(0x8c60, mload(0x8bc0))success := and(eq(staticcall(gas(), 0x6, 0x8c00, 0x80, 0x8c00, 0x40), 1), success)mstore(0x8c80, mload(0x820)) mstore(0x8ca0, mload(0x840))mstore(0x8cc0, mload(0x66c0))success := and(eq(staticcall(gas(), 0x7, 0x8c80, 0x60, 0x8c80, 0x40), 1), success)mstore(0x8ce0, mload(0x8c00)) mstore(0x8d00, mload(0x8c20))mstore(0x8d20, mload(0x8c80)) mstore(0x8d40, mload(0x8ca0))success := and(eq(staticcall(gas(), 0x6, 0x8ce0, 0x80, 0x8ce0, 0x40), 1), success)mstore(0x8d60, mload(0x700)) mstore(0x8d80, mload(0x720))mstore(0x8da0, mload(0x66e0))success := and(eq(staticcall(gas(), 0x7, 0x8d60, 0x60, 0x8d60, 0x40), 1), success)mstore(0x8dc0, mload(0x8ce0)) mstore(0x8de0, mload(0x8d00))mstore(0x8e00, mload(0x8d60)) mstore(0x8e20, mload(0x8d80))success := and(eq(staticcall(gas(), 0x6, 0x8dc0, 0x80, 0x8dc0, 0x40), 1), success)mstore(0x8e40, mload(0x500)) mstore(0x8e60, mload(0x520))mstore(0x8e80, mload(0x6a60))success := and(eq(staticcall(gas(), 0x7, 0x8e40, 0x60, 0x8e40, 0x40), 1), success)mstore(0x8ea0, mload(0x8dc0)) mstore(0x8ec0, mload(0x8de0))mstore(0x8ee0, mload(0x8e40)) mstore(0x8f00, mload(0x8e60))success := and(eq(staticcall(gas(), 0x6, 0x8ea0, 0x80, 0x8ea0, 0x40), 1), success)mstore(0x8f20, mload(0x540)) mstore(0x8f40, mload(0x560))mstore(0x8f60, mload(0x6a80))success := and(eq(staticcall(gas(), 0x7, 0x8f20, 0x60, 0x8f20, 0x40), 1), success)mstore(0x8f80, mload(0x8ea0)) mstore(0x8fa0, mload(0x8ec0))mstore(0x8fc0, mload(0x8f20)) mstore(0x8fe0, mload(0x8f40))success := and(eq(staticcall(gas(), 0x6, 0x8f80, 0x80, 0x8f80, 0x40), 1), success)mstore(0x9000, mload(0x580)) mstore(0x9020, mload(0x5a0))mstore(0x9040, mload(0x6aa0))success := and(eq(staticcall(gas(), 0x7, 0x9000, 0x60, 0x9000, 0x40), 1), success)mstore(0x9060, mload(0x8f80)) mstore(0x9080, mload(0x8fa0))mstore(0x90a0, mload(0x9000)) mstore(0x90c0, mload(0x9020))success := and(eq(staticcall(gas(), 0x6, 0x9060, 0x80, 0x9060, 0x40), 1), success)mstore(0x90e0, mload(0x5c0)) mstore(0x9100, mload(0x5e0))mstore(0x9120, mload(0x6ac0))success := and(eq(staticcall(gas(), 0x7, 0x90e0, 0x60, 0x90e0, 0x40), 1), success)mstore(0x9140, mload(0x9060)) mstore(0x9160, mload(0x9080))mstore(0x9180, mload(0x90e0)) mstore(0x91a0, mload(0x9100))success := and(eq(staticcall(gas(), 0x6, 0x9140, 0x80, 0x9140, 0x40), 1), success)mstore(0x91c0, mload(0x600)) mstore(0x91e0, mload(0x620))mstore(0x9200, mload(0x6ae0))success := and(eq(staticcall(gas(), 0x7, 0x91c0, 0x60, 0x91c0, 0x40), 1), success)mstore(0x9220, mload(0x9140)) mstore(0x9240, mload(0x9160))mstore(0x9260, mload(0x91c0)) mstore(0x9280, mload(0x91e0))success := and(eq(staticcall(gas(), 0x6, 0x9220, 0x80, 0x9220, 0x40), 1), success)mstore(0x92a0, mload(0x640)) mstore(0x92c0, mload(0x660))mstore(0x92e0, mload(0x6d20))success := and(eq(staticcall(gas(), 0x7, 0x92a0, 0x60, 0x92a0, 0x40), 1), success)mstore(0x9300, mload(0x9220)) mstore(0x9320, mload(0x9240))mstore(0x9340, mload(0x92a0)) mstore(0x9360, mload(0x92c0))success := and(eq(staticcall(gas(), 0x6, 0x9300, 0x80, 0x9300, 0x40), 1), success)mstore(0x9380, mload(0x680)) mstore(0x93a0, mload(0x6a0))mstore(0x93c0, mload(0x6d40))success := and(eq(staticcall(gas(), 0x7, 0x9380, 0x60, 0x9380, 0x40), 1), success)mstore(0x93e0, mload(0x9300)) mstore(0x9400, mload(0x9320))mstore(0x9420, mload(0x9380)) mstore(0x9440, mload(0x93a0))success := and(eq(staticcall(gas(), 0x6, 0x93e0, 0x80, 0x93e0, 0x40), 1), success)mstore(0x9460, mload(0x6c0)) mstore(0x9480, mload(0x6e0))mstore(0x94a0, mload(0x6d60))success := and(eq(staticcall(gas(), 0x7, 0x9460, 0x60, 0x9460, 0x40), 1), success)mstore(0x94c0, mload(0x93e0)) mstore(0x94e0, mload(0x9400))mstore(0x9500, mload(0x9460)) mstore(0x9520, mload(0x9480))success := and(eq(staticcall(gas(), 0x6, 0x94c0, 0x80, 0x94c0, 0x40), 1), success)mstore(0x9540, mload(0x340)) mstore(0x9560, mload(0x360))mstore(0x9580, mload(0x6f00))success := and(eq(staticcall(gas(), 0x7, 0x9540, 0x60, 0x9540, 0x40), 1), success)mstore(0x95a0, mload(0x94c0)) mstore(0x95c0, mload(0x94e0))mstore(0x95e0, mload(0x9540)) mstore(0x9600, mload(0x9560))success := and(eq(staticcall(gas(), 0x6, 0x95a0, 0x80, 0x95a0, 0x40), 1), success)mstore(0x9620, mload(0x3c0)) mstore(0x9640, mload(0x3e0))mstore(0x9660, mload(0x6f20))success := and(eq(staticcall(gas(), 0x7, 0x9620, 0x60, 0x9620, 0x40), 1), success)mstore(0x9680, mload(0x95a0)) mstore(0x96a0, mload(0x95c0))mstore(0x96c0, mload(0x9620)) mstore(0x96e0, mload(0x9640))success := and(eq(staticcall(gas(), 0x6, 0x9680, 0x80, 0x9680, 0x40), 1), success)mstore(0x9700, mload(0x1300)) mstore(0x9720, mload(0x1320))mstore(0x9740, sub(f_q, mload(0x6f60)))success := and(eq(staticcall(gas(), 0x7, 0x9700, 0x60, 0x9700, 0x40), 1), success)mstore(0x9760, mload(0x9680)) mstore(0x9780, mload(0x96a0))mstore(0x97a0, mload(0x9700)) mstore(0x97c0, mload(0x9720))success := and(eq(staticcall(gas(), 0x6, 0x9760, 0x80, 0x9760, 0x40), 1), success)mstore(0x97e0, mload(0x13a0)) mstore(0x9800, mload(0x13c0))mstore(0x9820, mload(0x6f80))success := and(eq(staticcall(gas(), 0x7, 0x97e0, 0x60, 0x97e0, 0x40), 1), success)mstore(0x9840, mload(0x9760)) mstore(0x9860, mload(0x9780))mstore(0x9880, mload(0x97e0)) mstore(0x98a0, mload(0x9800))success := and(eq(staticcall(gas(), 0x6, 0x9840, 0x80, 0x9840, 0x40), 1), success)mstore(0x98c0, mload(0x9840)) mstore(0x98e0, mload(0x9860))mstore(0x9900, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(0x9920, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(0x9940, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(0x9960, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(0x9980, mload(0x13a0)) mstore(0x99a0, mload(0x13c0))mstore(0x99c0, 0x0181624e80f3d6ae28df7e01eaeab1c0e919877a3b8a6b7fbc69a6817d596ea2) mstore(0x99e0, 0x1783d30dcb12d259bb89098addf6280fa4b653be7a152542a28f7b926e27e648) mstore(0x9a00, 0x00ae44489d41a0d179e2dfdc03bddd883b7109f8b6ae316a59e815c1a6b35304) mstore(0x9a20, 0x0b2147ab62a386bd63e6de1522109b8c9588ab466f5aadfde8c41ca3749423ee)success := and(eq(staticcall(gas(), 0x8, 0x98c0, 0x180, 0x98c0, 0x20), 1), success)success := and(eq(mload(0x98c0), 1), success) // Revert if anything fails if iszero(success) { revert(0, 0) }} return success; } } From cd5acf6d8010a0e1992a57a0a200c0c5d74d7e11 Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Mon, 4 Dec 2023 15:35:42 +0100 Subject: [PATCH 13/14] fix num instances infer --- contracts/snark-verifiers/sync_step.sol | 6 +++--- lightclient-circuits/src/committee_update_circuit.rs | 2 +- lightclient-circuits/src/sync_step_circuit.rs | 2 +- prover/src/cli.rs | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/snark-verifiers/sync_step.sol b/contracts/snark-verifiers/sync_step.sol index c28bf418..85b857a3 100644 --- a/contracts/snark-verifiers/sync_step.sol +++ b/contracts/snark-verifiers/sync_step.sol @@ -12,12 +12,12 @@ contract Verifier { uint256 constant SIZE_LIMIT = 21888242871839275222246405745257275088696311157297823662689037894645226208583; function verify( - uint256[0] calldata pubInputs, + uint256[1] calldata pubInputs, bytes calldata proof ) public view returns (bool) { bool success = true; - bytes32[1229] memory transcript; + bytes32[1231] memory transcript; for (uint i = 0; i < pubInputs.length; i++) { require(pubInputs[i] < SIZE_LIMIT); } - assembly { } { 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(0x80, 697977589985395630139925574281256772762542249956921372363329126037282444860) { let x := calldataload(0x4) mstore(0xa0, x) let y := calldataload(0x44) mstore(0xc0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x64) mstore(0xe0, x) let y := calldataload(0x84) mstore(0x100, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xa4) mstore(0x120, x) let y := calldataload(0xc4) mstore(0x140, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xe4) mstore(0x160, x) let y := calldataload(0x104) mstore(0x180, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x124) mstore(0x1a0, x) let y := calldataload(0x144) mstore(0x1c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x164) mstore(0x1e0, x) let y := calldataload(0x184) mstore(0x200, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1a4) mstore(0x220, x) let y := calldataload(0x1c4) mstore(0x240, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1e4) mstore(0x260, x) let y := calldataload(0x204) mstore(0x280, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x224) mstore(0x2a0, x) let y := calldataload(0x244) mstore(0x2c0, y) success := and(validate_ec_point(x, y), success) }mstore(0x2e0, keccak256(0x80, 608)){ let hash := mload(0x2e0) mstore(0x300, mod(hash, f_q)) mstore(0x320, hash) } { let x := calldataload(0x264) mstore(0x340, x) let y := calldataload(0x284) mstore(0x360, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x2a4) mstore(0x380, x) let y := calldataload(0x2c4) mstore(0x3a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x2e4) mstore(0x3c0, x) let y := calldataload(0x304) mstore(0x3e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x324) mstore(0x400, x) let y := calldataload(0x344) mstore(0x420, y) success := and(validate_ec_point(x, y), success) }mstore(0x440, keccak256(0x320, 288)){ let hash := mload(0x440) mstore(0x460, mod(hash, f_q)) mstore(0x480, hash) }mstore8(0x4a0, 1)mstore(0x4a0, keccak256(0x480, 33)){ let hash := mload(0x4a0) mstore(0x4c0, mod(hash, f_q)) mstore(0x4e0, hash) } { let x := calldataload(0x364) mstore(0x500, x) let y := calldataload(0x384) mstore(0x520, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x3a4) mstore(0x540, x) let y := calldataload(0x3c4) mstore(0x560, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x3e4) mstore(0x580, x) let y := calldataload(0x404) mstore(0x5a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x424) mstore(0x5c0, x) let y := calldataload(0x444) mstore(0x5e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x464) mstore(0x600, x) let y := calldataload(0x484) mstore(0x620, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4a4) mstore(0x640, x) let y := calldataload(0x4c4) mstore(0x660, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4e4) mstore(0x680, x) let y := calldataload(0x504) mstore(0x6a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x524) mstore(0x6c0, x) let y := calldataload(0x544) mstore(0x6e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x564) mstore(0x700, x) let y := calldataload(0x584) mstore(0x720, y) success := and(validate_ec_point(x, y), success) }mstore(0x740, keccak256(0x4e0, 608)){ let hash := mload(0x740) mstore(0x760, mod(hash, f_q)) mstore(0x780, hash) } { let x := calldataload(0x5a4) mstore(0x7a0, x) let y := calldataload(0x5c4) mstore(0x7c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x5e4) mstore(0x7e0, x) let y := calldataload(0x604) mstore(0x800, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x624) mstore(0x820, x) let y := calldataload(0x644) mstore(0x840, y) success := and(validate_ec_point(x, y), success) }mstore(0x860, keccak256(0x780, 224)){ let hash := mload(0x860) mstore(0x880, mod(hash, f_q)) mstore(0x8a0, hash) }mstore(0x8c0, mod(calldataload(0x664), f_q))mstore(0x8e0, mod(calldataload(0x684), f_q))mstore(0x900, mod(calldataload(0x6a4), f_q))mstore(0x920, mod(calldataload(0x6c4), f_q))mstore(0x940, mod(calldataload(0x6e4), f_q))mstore(0x960, mod(calldataload(0x704), f_q))mstore(0x980, mod(calldataload(0x724), f_q))mstore(0x9a0, mod(calldataload(0x744), f_q))mstore(0x9c0, mod(calldataload(0x764), f_q))mstore(0x9e0, mod(calldataload(0x784), f_q))mstore(0xa00, mod(calldataload(0x7a4), f_q))mstore(0xa20, mod(calldataload(0x7c4), f_q))mstore(0xa40, mod(calldataload(0x7e4), f_q))mstore(0xa60, mod(calldataload(0x804), f_q))mstore(0xa80, mod(calldataload(0x824), f_q))mstore(0xaa0, mod(calldataload(0x844), f_q))mstore(0xac0, mod(calldataload(0x864), f_q))mstore(0xae0, mod(calldataload(0x884), f_q))mstore(0xb00, mod(calldataload(0x8a4), f_q))mstore(0xb20, mod(calldataload(0x8c4), f_q))mstore(0xb40, mod(calldataload(0x8e4), f_q))mstore(0xb60, mod(calldataload(0x904), f_q))mstore(0xb80, mod(calldataload(0x924), f_q))mstore(0xba0, mod(calldataload(0x944), f_q))mstore(0xbc0, mod(calldataload(0x964), f_q))mstore(0xbe0, mod(calldataload(0x984), f_q))mstore(0xc00, mod(calldataload(0x9a4), f_q))mstore(0xc20, mod(calldataload(0x9c4), f_q))mstore(0xc40, mod(calldataload(0x9e4), f_q))mstore(0xc60, mod(calldataload(0xa04), f_q))mstore(0xc80, mod(calldataload(0xa24), f_q))mstore(0xca0, mod(calldataload(0xa44), f_q))mstore(0xcc0, mod(calldataload(0xa64), f_q))mstore(0xce0, mod(calldataload(0xa84), f_q))mstore(0xd00, mod(calldataload(0xaa4), f_q))mstore(0xd20, mod(calldataload(0xac4), f_q))mstore(0xd40, mod(calldataload(0xae4), f_q))mstore(0xd60, mod(calldataload(0xb04), f_q))mstore(0xd80, mod(calldataload(0xb24), f_q))mstore(0xda0, mod(calldataload(0xb44), f_q))mstore(0xdc0, mod(calldataload(0xb64), f_q))mstore(0xde0, mod(calldataload(0xb84), f_q))mstore(0xe00, mod(calldataload(0xba4), f_q))mstore(0xe20, mod(calldataload(0xbc4), f_q))mstore(0xe40, mod(calldataload(0xbe4), f_q))mstore(0xe60, mod(calldataload(0xc04), f_q))mstore(0xe80, mod(calldataload(0xc24), f_q))mstore(0xea0, mod(calldataload(0xc44), f_q))mstore(0xec0, mod(calldataload(0xc64), f_q))mstore(0xee0, mod(calldataload(0xc84), f_q))mstore(0xf00, mod(calldataload(0xca4), f_q))mstore(0xf20, mod(calldataload(0xcc4), f_q))mstore(0xf40, mod(calldataload(0xce4), f_q))mstore(0xf60, mod(calldataload(0xd04), f_q))mstore(0xf80, mod(calldataload(0xd24), f_q))mstore(0xfa0, mod(calldataload(0xd44), f_q))mstore(0xfc0, mod(calldataload(0xd64), f_q))mstore(0xfe0, mod(calldataload(0xd84), f_q))mstore(0x1000, mod(calldataload(0xda4), f_q))mstore(0x1020, mod(calldataload(0xdc4), f_q))mstore(0x1040, mod(calldataload(0xde4), f_q))mstore(0x1060, mod(calldataload(0xe04), f_q))mstore(0x1080, mod(calldataload(0xe24), f_q))mstore(0x10a0, mod(calldataload(0xe44), f_q))mstore(0x10c0, mod(calldataload(0xe64), f_q))mstore(0x10e0, mod(calldataload(0xe84), f_q))mstore(0x1100, mod(calldataload(0xea4), f_q))mstore(0x1120, mod(calldataload(0xec4), f_q))mstore(0x1140, mod(calldataload(0xee4), f_q))mstore(0x1160, mod(calldataload(0xf04), f_q))mstore(0x1180, mod(calldataload(0xf24), f_q))mstore(0x11a0, mod(calldataload(0xf44), f_q))mstore(0x11c0, mod(calldataload(0xf64), f_q))mstore(0x11e0, mod(calldataload(0xf84), f_q))mstore(0x1200, mod(calldataload(0xfa4), f_q))mstore(0x1220, mod(calldataload(0xfc4), f_q))mstore(0x1240, keccak256(0x8a0, 2464)){ let hash := mload(0x1240) mstore(0x1260, mod(hash, f_q)) mstore(0x1280, hash) }mstore8(0x12a0, 1)mstore(0x12a0, keccak256(0x1280, 33)){ let hash := mload(0x12a0) mstore(0x12c0, mod(hash, f_q)) mstore(0x12e0, hash) } { let x := calldataload(0xfe4) mstore(0x1300, x) let y := calldataload(0x1004) mstore(0x1320, y) success := and(validate_ec_point(x, y), success) }mstore(0x1340, keccak256(0x12e0, 96)){ let hash := mload(0x1340) mstore(0x1360, mod(hash, f_q)) mstore(0x1380, hash) } { let x := calldataload(0x1024) mstore(0x13a0, x) let y := calldataload(0x1044) mstore(0x13c0, y) success := and(validate_ec_point(x, y), success) }mstore(0x13e0, mulmod(mload(0x880), mload(0x880), f_q))mstore(0x1400, mulmod(mload(0x13e0), mload(0x13e0), f_q))mstore(0x1420, mulmod(mload(0x1400), mload(0x1400), f_q))mstore(0x1440, mulmod(mload(0x1420), mload(0x1420), f_q))mstore(0x1460, mulmod(mload(0x1440), mload(0x1440), f_q))mstore(0x1480, mulmod(mload(0x1460), mload(0x1460), f_q))mstore(0x14a0, mulmod(mload(0x1480), mload(0x1480), f_q))mstore(0x14c0, mulmod(mload(0x14a0), mload(0x14a0), f_q))mstore(0x14e0, mulmod(mload(0x14c0), mload(0x14c0), f_q))mstore(0x1500, mulmod(mload(0x14e0), mload(0x14e0), f_q))mstore(0x1520, mulmod(mload(0x1500), mload(0x1500), f_q))mstore(0x1540, mulmod(mload(0x1520), mload(0x1520), f_q))mstore(0x1560, mulmod(mload(0x1540), mload(0x1540), f_q))mstore(0x1580, mulmod(mload(0x1560), mload(0x1560), f_q))mstore(0x15a0, mulmod(mload(0x1580), mload(0x1580), f_q))mstore(0x15c0, mulmod(mload(0x15a0), mload(0x15a0), f_q))mstore(0x15e0, mulmod(mload(0x15c0), mload(0x15c0), f_q))mstore(0x1600, mulmod(mload(0x15e0), mload(0x15e0), f_q))mstore(0x1620, mulmod(mload(0x1600), mload(0x1600), f_q))mstore(0x1640, mulmod(mload(0x1620), mload(0x1620), f_q))mstore(0x1660, mulmod(mload(0x1640), mload(0x1640), f_q))mstore(0x1680, mulmod(mload(0x1660), mload(0x1660), f_q))mstore(0x16a0, addmod(mload(0x1680), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(0x16c0, mulmod(mload(0x16a0), 21888237653275510688422624196183639687472264873923820041627027729598873448513, f_q))mstore(0x16e0, mulmod(mload(0x16c0), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x1700, addmod(mload(0x880), 8662456992307693229192232929891638461323994988937738840793806641202669341572, f_q))mstore(0x1720, mulmod(mload(0x16c0), 10939663269433627367777756708678102241564365262857670666700619874077960926249, f_q))mstore(0x1740, addmod(mload(0x880), 10948579602405647854468649036579172846983999137558363676997584312497847569368, f_q))mstore(0x1760, mulmod(mload(0x16c0), 11016257578652593686382655500910603527869149377564754001549454008164059876499, f_q))mstore(0x1780, addmod(mload(0x880), 10871985293186681535863750244346671560679215022851280342148750178411748619118, f_q))mstore(0x17a0, mulmod(mload(0x16c0), 15402826414547299628414612080036060696555554914079673875872749760617770134879, f_q))mstore(0x17c0, addmod(mload(0x880), 6485416457291975593831793665221214391992809486336360467825454425958038360738, f_q))mstore(0x17e0, mulmod(mload(0x16c0), 21710372849001950800533397158415938114909991150039389063546734567764856596059, f_q))mstore(0x1800, addmod(mload(0x880), 177870022837324421713008586841336973638373250376645280151469618810951899558, f_q))mstore(0x1820, mulmod(mload(0x16c0), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q))mstore(0x1840, addmod(mload(0x880), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q))mstore(0x1860, mulmod(mload(0x16c0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x1880, addmod(mload(0x880), 13154116519010929542673167886091370382741775939114889923107781597533678454429, f_q))mstore(0x18a0, mulmod(mload(0x16c0), 1, f_q))mstore(0x18c0, addmod(mload(0x880), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)){ let prod := mload(0x1700) prod := mulmod(mload(0x1740), prod, f_q) mstore(0x18e0, prod) prod := mulmod(mload(0x1780), prod, f_q) mstore(0x1900, prod) prod := mulmod(mload(0x17c0), prod, f_q) mstore(0x1920, prod) prod := mulmod(mload(0x1800), prod, f_q) mstore(0x1940, prod) prod := mulmod(mload(0x1840), prod, f_q) mstore(0x1960, prod) prod := mulmod(mload(0x1880), prod, f_q) mstore(0x1980, prod) prod := mulmod(mload(0x18c0), prod, f_q) mstore(0x19a0, prod) prod := mulmod(mload(0x16a0), prod, f_q) mstore(0x19c0, prod) }mstore(0x1a00, 32)mstore(0x1a20, 32)mstore(0x1a40, 32)mstore(0x1a60, mload(0x19c0))mstore(0x1a80, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x1aa0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x1a00, 0xc0, 0x19e0, 0x20), 1), success){ let inv := mload(0x19e0) let v v := mload(0x16a0) mstore(0x16a0, mulmod(mload(0x19a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18c0) mstore(0x18c0, mulmod(mload(0x1980), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1880) mstore(0x1880, mulmod(mload(0x1960), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1840) mstore(0x1840, mulmod(mload(0x1940), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1800) mstore(0x1800, mulmod(mload(0x1920), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x17c0) mstore(0x17c0, mulmod(mload(0x1900), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1780) mstore(0x1780, mulmod(mload(0x18e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1740) mstore(0x1740, mulmod(mload(0x1700), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x1700, inv) }mstore(0x1ac0, mulmod(mload(0x16e0), mload(0x1700), f_q))mstore(0x1ae0, mulmod(mload(0x1720), mload(0x1740), f_q))mstore(0x1b00, mulmod(mload(0x1760), mload(0x1780), f_q))mstore(0x1b20, mulmod(mload(0x17a0), mload(0x17c0), f_q))mstore(0x1b40, mulmod(mload(0x17e0), mload(0x1800), f_q))mstore(0x1b60, mulmod(mload(0x1820), mload(0x1840), f_q))mstore(0x1b80, mulmod(mload(0x1860), mload(0x1880), f_q))mstore(0x1ba0, mulmod(mload(0x18a0), mload(0x18c0), f_q))mstore(0x1bc0, mulmod(mload(0x900), mload(0x8e0), f_q))mstore(0x1be0, addmod(mload(0x8c0), mload(0x1bc0), f_q))mstore(0x1c00, addmod(mload(0x1be0), sub(f_q, mload(0x920)), f_q))mstore(0x1c20, mulmod(mload(0x1c00), mload(0xca0), f_q))mstore(0x1c40, mulmod(mload(0x760), mload(0x1c20), f_q))mstore(0x1c60, mulmod(mload(0x980), mload(0x960), f_q))mstore(0x1c80, addmod(mload(0x940), mload(0x1c60), f_q))mstore(0x1ca0, addmod(mload(0x1c80), sub(f_q, mload(0x9a0)), f_q))mstore(0x1cc0, mulmod(mload(0x1ca0), mload(0xcc0), f_q))mstore(0x1ce0, addmod(mload(0x1c40), mload(0x1cc0), f_q))mstore(0x1d00, mulmod(mload(0x760), mload(0x1ce0), f_q))mstore(0x1d20, mulmod(mload(0xa00), mload(0x9e0), f_q))mstore(0x1d40, addmod(mload(0x9c0), mload(0x1d20), f_q))mstore(0x1d60, addmod(mload(0x1d40), sub(f_q, mload(0xa20)), f_q))mstore(0x1d80, mulmod(mload(0x1d60), mload(0xce0), f_q))mstore(0x1da0, addmod(mload(0x1d00), mload(0x1d80), f_q))mstore(0x1dc0, mulmod(mload(0x760), mload(0x1da0), f_q))mstore(0x1de0, mulmod(mload(0xa80), mload(0xa60), f_q))mstore(0x1e00, addmod(mload(0xa40), mload(0x1de0), f_q))mstore(0x1e20, addmod(mload(0x1e00), sub(f_q, mload(0xaa0)), f_q))mstore(0x1e40, mulmod(mload(0x1e20), mload(0xd00), f_q))mstore(0x1e60, addmod(mload(0x1dc0), mload(0x1e40), f_q))mstore(0x1e80, mulmod(mload(0x760), mload(0x1e60), f_q))mstore(0x1ea0, mulmod(mload(0xb00), mload(0xae0), f_q))mstore(0x1ec0, addmod(mload(0xac0), mload(0x1ea0), f_q))mstore(0x1ee0, addmod(mload(0x1ec0), sub(f_q, mload(0xb20)), f_q))mstore(0x1f00, mulmod(mload(0x1ee0), mload(0xd20), f_q))mstore(0x1f20, addmod(mload(0x1e80), mload(0x1f00), f_q))mstore(0x1f40, mulmod(mload(0x760), mload(0x1f20), f_q))mstore(0x1f60, mulmod(mload(0xb80), mload(0xb60), f_q))mstore(0x1f80, addmod(mload(0xb40), mload(0x1f60), f_q))mstore(0x1fa0, addmod(mload(0x1f80), sub(f_q, mload(0xba0)), f_q))mstore(0x1fc0, mulmod(mload(0x1fa0), mload(0xd40), f_q))mstore(0x1fe0, addmod(mload(0x1f40), mload(0x1fc0), f_q))mstore(0x2000, mulmod(mload(0x760), mload(0x1fe0), f_q))mstore(0x2020, addmod(1, sub(f_q, mload(0xee0)), f_q))mstore(0x2040, mulmod(mload(0x2020), mload(0x1ba0), f_q))mstore(0x2060, addmod(mload(0x2000), mload(0x2040), f_q))mstore(0x2080, mulmod(mload(0x760), mload(0x2060), f_q))mstore(0x20a0, mulmod(mload(0x10c0), mload(0x10c0), f_q))mstore(0x20c0, addmod(mload(0x20a0), sub(f_q, mload(0x10c0)), f_q))mstore(0x20e0, mulmod(mload(0x20c0), mload(0x1ac0), f_q))mstore(0x2100, addmod(mload(0x2080), mload(0x20e0), f_q))mstore(0x2120, mulmod(mload(0x760), mload(0x2100), f_q))mstore(0x2140, addmod(mload(0xf40), sub(f_q, mload(0xf20)), f_q))mstore(0x2160, mulmod(mload(0x2140), mload(0x1ba0), f_q))mstore(0x2180, addmod(mload(0x2120), mload(0x2160), f_q))mstore(0x21a0, mulmod(mload(0x760), mload(0x2180), f_q))mstore(0x21c0, addmod(mload(0xfa0), sub(f_q, mload(0xf80)), f_q))mstore(0x21e0, mulmod(mload(0x21c0), mload(0x1ba0), f_q))mstore(0x2200, addmod(mload(0x21a0), mload(0x21e0), f_q))mstore(0x2220, mulmod(mload(0x760), mload(0x2200), f_q))mstore(0x2240, addmod(mload(0x1000), sub(f_q, mload(0xfe0)), f_q))mstore(0x2260, mulmod(mload(0x2240), mload(0x1ba0), f_q))mstore(0x2280, addmod(mload(0x2220), mload(0x2260), f_q))mstore(0x22a0, mulmod(mload(0x760), mload(0x2280), f_q))mstore(0x22c0, addmod(mload(0x1060), sub(f_q, mload(0x1040)), f_q))mstore(0x22e0, mulmod(mload(0x22c0), mload(0x1ba0), f_q))mstore(0x2300, addmod(mload(0x22a0), mload(0x22e0), f_q))mstore(0x2320, mulmod(mload(0x760), mload(0x2300), f_q))mstore(0x2340, addmod(mload(0x10c0), sub(f_q, mload(0x10a0)), f_q))mstore(0x2360, mulmod(mload(0x2340), mload(0x1ba0), f_q))mstore(0x2380, addmod(mload(0x2320), mload(0x2360), f_q))mstore(0x23a0, mulmod(mload(0x760), mload(0x2380), f_q))mstore(0x23c0, addmod(1, sub(f_q, mload(0x1ac0)), f_q))mstore(0x23e0, addmod(mload(0x1ae0), mload(0x1b00), f_q))mstore(0x2400, addmod(mload(0x23e0), mload(0x1b20), f_q))mstore(0x2420, addmod(mload(0x2400), mload(0x1b40), f_q))mstore(0x2440, addmod(mload(0x2420), mload(0x1b60), f_q))mstore(0x2460, addmod(mload(0x2440), mload(0x1b80), f_q))mstore(0x2480, addmod(mload(0x23c0), sub(f_q, mload(0x2460)), f_q))mstore(0x24a0, mulmod(mload(0xd80), mload(0x460), f_q))mstore(0x24c0, addmod(mload(0xc20), mload(0x24a0), f_q))mstore(0x24e0, addmod(mload(0x24c0), mload(0x4c0), f_q))mstore(0x2500, mulmod(mload(0xda0), mload(0x460), f_q))mstore(0x2520, addmod(mload(0x8c0), mload(0x2500), f_q))mstore(0x2540, addmod(mload(0x2520), mload(0x4c0), f_q))mstore(0x2560, mulmod(mload(0x2540), mload(0x24e0), f_q))mstore(0x2580, mulmod(mload(0x2560), mload(0xf00), f_q))mstore(0x25a0, mulmod(1, mload(0x460), f_q))mstore(0x25c0, mulmod(mload(0x880), mload(0x25a0), f_q))mstore(0x25e0, addmod(mload(0xc20), mload(0x25c0), f_q))mstore(0x2600, addmod(mload(0x25e0), mload(0x4c0), f_q))mstore(0x2620, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x460), f_q))mstore(0x2640, mulmod(mload(0x880), mload(0x2620), f_q))mstore(0x2660, addmod(mload(0x8c0), mload(0x2640), f_q))mstore(0x2680, addmod(mload(0x2660), mload(0x4c0), f_q))mstore(0x26a0, mulmod(mload(0x2680), mload(0x2600), f_q))mstore(0x26c0, mulmod(mload(0x26a0), mload(0xee0), f_q))mstore(0x26e0, addmod(mload(0x2580), sub(f_q, mload(0x26c0)), f_q))mstore(0x2700, mulmod(mload(0x26e0), mload(0x2480), f_q))mstore(0x2720, addmod(mload(0x23a0), mload(0x2700), f_q))mstore(0x2740, mulmod(mload(0x760), mload(0x2720), f_q))mstore(0x2760, mulmod(mload(0xdc0), mload(0x460), f_q))mstore(0x2780, addmod(mload(0x940), mload(0x2760), f_q))mstore(0x27a0, addmod(mload(0x2780), mload(0x4c0), f_q))mstore(0x27c0, mulmod(mload(0xde0), mload(0x460), f_q))mstore(0x27e0, addmod(mload(0x9c0), mload(0x27c0), f_q))mstore(0x2800, addmod(mload(0x27e0), mload(0x4c0), f_q))mstore(0x2820, mulmod(mload(0x2800), mload(0x27a0), f_q))mstore(0x2840, mulmod(mload(0x2820), mload(0xf60), f_q))mstore(0x2860, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x460), f_q))mstore(0x2880, mulmod(mload(0x880), mload(0x2860), f_q))mstore(0x28a0, addmod(mload(0x940), mload(0x2880), f_q))mstore(0x28c0, addmod(mload(0x28a0), mload(0x4c0), f_q))mstore(0x28e0, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x460), f_q))mstore(0x2900, mulmod(mload(0x880), mload(0x28e0), f_q))mstore(0x2920, addmod(mload(0x9c0), mload(0x2900), f_q))mstore(0x2940, addmod(mload(0x2920), mload(0x4c0), f_q))mstore(0x2960, mulmod(mload(0x2940), mload(0x28c0), f_q))mstore(0x2980, mulmod(mload(0x2960), mload(0xf40), f_q))mstore(0x29a0, addmod(mload(0x2840), sub(f_q, mload(0x2980)), f_q))mstore(0x29c0, mulmod(mload(0x29a0), mload(0x2480), f_q))mstore(0x29e0, addmod(mload(0x2740), mload(0x29c0), f_q))mstore(0x2a00, mulmod(mload(0x760), mload(0x29e0), f_q))mstore(0x2a20, mulmod(mload(0xe00), mload(0x460), f_q))mstore(0x2a40, addmod(mload(0xa40), mload(0x2a20), f_q))mstore(0x2a60, addmod(mload(0x2a40), mload(0x4c0), f_q))mstore(0x2a80, mulmod(mload(0xe20), mload(0x460), f_q))mstore(0x2aa0, addmod(mload(0xac0), mload(0x2a80), f_q))mstore(0x2ac0, addmod(mload(0x2aa0), mload(0x4c0), f_q))mstore(0x2ae0, mulmod(mload(0x2ac0), mload(0x2a60), f_q))mstore(0x2b00, mulmod(mload(0x2ae0), mload(0xfc0), f_q))mstore(0x2b20, mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(0x460), f_q))mstore(0x2b40, mulmod(mload(0x880), mload(0x2b20), f_q))mstore(0x2b60, addmod(mload(0xa40), mload(0x2b40), f_q))mstore(0x2b80, addmod(mload(0x2b60), mload(0x4c0), f_q))mstore(0x2ba0, mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(0x460), f_q))mstore(0x2bc0, mulmod(mload(0x880), mload(0x2ba0), f_q))mstore(0x2be0, addmod(mload(0xac0), mload(0x2bc0), f_q))mstore(0x2c00, addmod(mload(0x2be0), mload(0x4c0), f_q))mstore(0x2c20, mulmod(mload(0x2c00), mload(0x2b80), f_q))mstore(0x2c40, mulmod(mload(0x2c20), mload(0xfa0), f_q))mstore(0x2c60, addmod(mload(0x2b00), sub(f_q, mload(0x2c40)), f_q))mstore(0x2c80, mulmod(mload(0x2c60), mload(0x2480), f_q))mstore(0x2ca0, addmod(mload(0x2a00), mload(0x2c80), f_q))mstore(0x2cc0, mulmod(mload(0x760), mload(0x2ca0), f_q))mstore(0x2ce0, mulmod(mload(0xe40), mload(0x460), f_q))mstore(0x2d00, addmod(mload(0xb40), mload(0x2ce0), f_q))mstore(0x2d20, addmod(mload(0x2d00), mload(0x4c0), f_q))mstore(0x2d40, mulmod(mload(0xe60), mload(0x460), f_q))mstore(0x2d60, addmod(mload(0xbc0), mload(0x2d40), f_q))mstore(0x2d80, addmod(mload(0x2d60), mload(0x4c0), f_q))mstore(0x2da0, mulmod(mload(0x2d80), mload(0x2d20), f_q))mstore(0x2dc0, mulmod(mload(0x2da0), mload(0x1020), f_q))mstore(0x2de0, mulmod(5625741653535312224677218588085279924365897425605943700675464992185016992283, mload(0x460), f_q))mstore(0x2e00, mulmod(mload(0x880), mload(0x2de0), f_q))mstore(0x2e20, addmod(mload(0xb40), mload(0x2e00), f_q))mstore(0x2e40, addmod(mload(0x2e20), mload(0x4c0), f_q))mstore(0x2e60, mulmod(14704729814417906439424896605881467874595262020190401576785074330126828718155, mload(0x460), f_q))mstore(0x2e80, mulmod(mload(0x880), mload(0x2e60), f_q))mstore(0x2ea0, addmod(mload(0xbc0), mload(0x2e80), f_q))mstore(0x2ec0, addmod(mload(0x2ea0), mload(0x4c0), f_q))mstore(0x2ee0, mulmod(mload(0x2ec0), mload(0x2e40), f_q))mstore(0x2f00, mulmod(mload(0x2ee0), mload(0x1000), f_q))mstore(0x2f20, addmod(mload(0x2dc0), sub(f_q, mload(0x2f00)), f_q))mstore(0x2f40, mulmod(mload(0x2f20), mload(0x2480), f_q))mstore(0x2f60, addmod(mload(0x2cc0), mload(0x2f40), f_q))mstore(0x2f80, mulmod(mload(0x760), mload(0x2f60), f_q))mstore(0x2fa0, mulmod(mload(0xe80), mload(0x460), f_q))mstore(0x2fc0, addmod(0, mload(0x2fa0), f_q))mstore(0x2fe0, addmod(mload(0x2fc0), mload(0x4c0), f_q))mstore(0x3000, mulmod(mload(0xea0), mload(0x460), f_q))mstore(0x3020, addmod(mload(0xbe0), mload(0x3000), f_q))mstore(0x3040, addmod(mload(0x3020), mload(0x4c0), f_q))mstore(0x3060, mulmod(mload(0x3040), mload(0x2fe0), f_q))mstore(0x3080, mulmod(mload(0x3060), mload(0x1080), f_q))mstore(0x30a0, mulmod(8343274462013750416000956870576256937330525306073862550863787263304548803879, mload(0x460), f_q))mstore(0x30c0, mulmod(mload(0x880), mload(0x30a0), f_q))mstore(0x30e0, addmod(0, mload(0x30c0), f_q))mstore(0x3100, addmod(mload(0x30e0), mload(0x4c0), f_q))mstore(0x3120, mulmod(20928372310071051017340352686640453451620397549739756658327314209761852842004, mload(0x460), f_q))mstore(0x3140, mulmod(mload(0x880), mload(0x3120), f_q))mstore(0x3160, addmod(mload(0xbe0), mload(0x3140), f_q))mstore(0x3180, addmod(mload(0x3160), mload(0x4c0), f_q))mstore(0x31a0, mulmod(mload(0x3180), mload(0x3100), f_q))mstore(0x31c0, mulmod(mload(0x31a0), mload(0x1060), f_q))mstore(0x31e0, addmod(mload(0x3080), sub(f_q, mload(0x31c0)), f_q))mstore(0x3200, mulmod(mload(0x31e0), mload(0x2480), f_q))mstore(0x3220, addmod(mload(0x2f80), mload(0x3200), f_q))mstore(0x3240, mulmod(mload(0x760), mload(0x3220), f_q))mstore(0x3260, mulmod(mload(0xec0), mload(0x460), f_q))mstore(0x3280, addmod(mload(0xc00), mload(0x3260), f_q))mstore(0x32a0, addmod(mload(0x3280), mload(0x4c0), f_q))mstore(0x32c0, mulmod(mload(0x32a0), mload(0x10e0), f_q))mstore(0x32e0, mulmod(15845651941796975697993789271154426079663327509658641548785793587449119139335, mload(0x460), f_q))mstore(0x3300, mulmod(mload(0x880), mload(0x32e0), f_q))mstore(0x3320, addmod(mload(0xc00), mload(0x3300), f_q))mstore(0x3340, addmod(mload(0x3320), mload(0x4c0), f_q))mstore(0x3360, mulmod(mload(0x3340), mload(0x10c0), f_q))mstore(0x3380, addmod(mload(0x32c0), sub(f_q, mload(0x3360)), f_q))mstore(0x33a0, mulmod(mload(0x3380), mload(0x2480), f_q))mstore(0x33c0, addmod(mload(0x3240), mload(0x33a0), f_q))mstore(0x33e0, mulmod(mload(0x760), mload(0x33c0), f_q))mstore(0x3400, addmod(1, sub(f_q, mload(0x1100)), f_q))mstore(0x3420, mulmod(mload(0x3400), mload(0x1ba0), f_q))mstore(0x3440, addmod(mload(0x33e0), mload(0x3420), f_q))mstore(0x3460, mulmod(mload(0x760), mload(0x3440), f_q))mstore(0x3480, mulmod(mload(0x1100), mload(0x1100), f_q))mstore(0x34a0, addmod(mload(0x3480), sub(f_q, mload(0x1100)), f_q))mstore(0x34c0, mulmod(mload(0x34a0), mload(0x1ac0), f_q))mstore(0x34e0, addmod(mload(0x3460), mload(0x34c0), f_q))mstore(0x3500, mulmod(mload(0x760), mload(0x34e0), f_q))mstore(0x3520, addmod(mload(0x1140), mload(0x460), f_q))mstore(0x3540, mulmod(mload(0x3520), mload(0x1120), f_q))mstore(0x3560, addmod(mload(0x1180), mload(0x4c0), f_q))mstore(0x3580, mulmod(mload(0x3560), mload(0x3540), f_q))mstore(0x35a0, addmod(mload(0xbc0), mload(0x460), f_q))mstore(0x35c0, mulmod(mload(0x35a0), mload(0x1100), f_q))mstore(0x35e0, addmod(mload(0xc40), mload(0x4c0), f_q))mstore(0x3600, mulmod(mload(0x35e0), mload(0x35c0), f_q))mstore(0x3620, addmod(mload(0x3580), sub(f_q, mload(0x3600)), f_q))mstore(0x3640, mulmod(mload(0x3620), mload(0x2480), f_q))mstore(0x3660, addmod(mload(0x3500), mload(0x3640), f_q))mstore(0x3680, mulmod(mload(0x760), mload(0x3660), f_q))mstore(0x36a0, addmod(mload(0x1140), sub(f_q, mload(0x1180)), f_q))mstore(0x36c0, mulmod(mload(0x36a0), mload(0x1ba0), f_q))mstore(0x36e0, addmod(mload(0x3680), mload(0x36c0), f_q))mstore(0x3700, mulmod(mload(0x760), mload(0x36e0), f_q))mstore(0x3720, mulmod(mload(0x36a0), mload(0x2480), f_q))mstore(0x3740, addmod(mload(0x1140), sub(f_q, mload(0x1160)), f_q))mstore(0x3760, mulmod(mload(0x3740), mload(0x3720), f_q))mstore(0x3780, addmod(mload(0x3700), mload(0x3760), f_q))mstore(0x37a0, mulmod(mload(0x760), mload(0x3780), f_q))mstore(0x37c0, addmod(1, sub(f_q, mload(0x11a0)), f_q))mstore(0x37e0, mulmod(mload(0x37c0), mload(0x1ba0), f_q))mstore(0x3800, addmod(mload(0x37a0), mload(0x37e0), f_q))mstore(0x3820, mulmod(mload(0x760), mload(0x3800), f_q))mstore(0x3840, mulmod(mload(0x11a0), mload(0x11a0), f_q))mstore(0x3860, addmod(mload(0x3840), sub(f_q, mload(0x11a0)), f_q))mstore(0x3880, mulmod(mload(0x3860), mload(0x1ac0), f_q))mstore(0x38a0, addmod(mload(0x3820), mload(0x3880), f_q))mstore(0x38c0, mulmod(mload(0x760), mload(0x38a0), f_q))mstore(0x38e0, addmod(mload(0x11e0), mload(0x460), f_q))mstore(0x3900, mulmod(mload(0x38e0), mload(0x11c0), f_q))mstore(0x3920, addmod(mload(0x1220), mload(0x4c0), f_q))mstore(0x3940, mulmod(mload(0x3920), mload(0x3900), f_q))mstore(0x3960, mulmod(mload(0x300), mload(0xbe0), f_q))mstore(0x3980, addmod(mload(0x3960), mload(0xc00), f_q))mstore(0x39a0, addmod(mload(0x3980), mload(0x460), f_q))mstore(0x39c0, mulmod(mload(0x39a0), mload(0x11a0), f_q))mstore(0x39e0, mulmod(mload(0x300), mload(0xc60), f_q))mstore(0x3a00, addmod(mload(0x39e0), mload(0xc80), f_q))mstore(0x3a20, addmod(mload(0x3a00), mload(0x4c0), f_q))mstore(0x3a40, mulmod(mload(0x3a20), mload(0x39c0), f_q))mstore(0x3a60, addmod(mload(0x3940), sub(f_q, mload(0x3a40)), f_q))mstore(0x3a80, mulmod(mload(0x3a60), mload(0x2480), f_q))mstore(0x3aa0, addmod(mload(0x38c0), mload(0x3a80), f_q))mstore(0x3ac0, mulmod(mload(0x760), mload(0x3aa0), f_q))mstore(0x3ae0, addmod(mload(0x11e0), sub(f_q, mload(0x1220)), f_q))mstore(0x3b00, mulmod(mload(0x3ae0), mload(0x1ba0), f_q))mstore(0x3b20, addmod(mload(0x3ac0), mload(0x3b00), f_q))mstore(0x3b40, mulmod(mload(0x760), mload(0x3b20), f_q))mstore(0x3b60, mulmod(mload(0x3ae0), mload(0x2480), f_q))mstore(0x3b80, addmod(mload(0x11e0), sub(f_q, mload(0x1200)), f_q))mstore(0x3ba0, mulmod(mload(0x3b80), mload(0x3b60), f_q))mstore(0x3bc0, addmod(mload(0x3b40), mload(0x3ba0), f_q))mstore(0x3be0, mulmod(mload(0x1680), mload(0x1680), f_q))mstore(0x3c00, mulmod(mload(0x3be0), mload(0x1680), f_q))mstore(0x3c20, mulmod(1, mload(0x1680), f_q))mstore(0x3c40, mulmod(1, mload(0x3be0), f_q))mstore(0x3c60, mulmod(mload(0x3bc0), mload(0x16a0), f_q))mstore(0x3c80, mulmod(mload(0x13e0), mload(0x880), f_q))mstore(0x3ca0, mulmod(mload(0x3c80), mload(0x880), f_q))mstore(0x3cc0, mulmod(mload(0x880), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x3ce0, addmod(mload(0x1360), sub(f_q, mload(0x3cc0)), f_q))mstore(0x3d00, mulmod(mload(0x880), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x3d20, addmod(mload(0x1360), sub(f_q, mload(0x3d00)), f_q))mstore(0x3d40, mulmod(mload(0x880), 1, f_q))mstore(0x3d60, addmod(mload(0x1360), sub(f_q, mload(0x3d40)), f_q))mstore(0x3d80, mulmod(mload(0x880), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q))mstore(0x3da0, addmod(mload(0x1360), sub(f_q, mload(0x3d80)), f_q))mstore(0x3dc0, mulmod(mload(0x880), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q))mstore(0x3de0, addmod(mload(0x1360), sub(f_q, mload(0x3dc0)), f_q))mstore(0x3e00, mulmod(mload(0x880), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q))mstore(0x3e20, addmod(mload(0x1360), sub(f_q, mload(0x3e00)), f_q))mstore(0x3e40, mulmod(3544324119167359571073009690693121464267965232733679586767649244433889388945, mload(0x3c80), f_q))mstore(0x3e60, mulmod(mload(0x3e40), 1, f_q)){ let result := mulmod(mload(0x1360), mload(0x3e40), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x3e60)), f_q), result, f_q)mstore(0x3e80, result) }mstore(0x3ea0, mulmod(3860370625838117017501327045244227871206764201116468958063324100051382735289, mload(0x3c80), f_q))mstore(0x3ec0, mulmod(mload(0x3ea0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1360), mload(0x3ea0), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x3ec0)), f_q), result, f_q)mstore(0x3ee0, result) }mstore(0x3f00, mulmod(21616901807277407275624036604424346159916096890712898844034238973395610537327, mload(0x3c80), f_q))mstore(0x3f20, mulmod(mload(0x3f00), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q)){ let result := mulmod(mload(0x1360), mload(0x3f00), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x3f20)), f_q), result, f_q)mstore(0x3f40, result) }mstore(0x3f60, mulmod(3209408481237076479025468386201293941554240476766691830436732310949352383503, mload(0x3c80), f_q))mstore(0x3f80, mulmod(mload(0x3f60), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q)){ let result := mulmod(mload(0x1360), mload(0x3f60), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x3f80)), f_q), result, f_q)mstore(0x3fa0, result) }mstore(0x3fc0, mulmod(1, mload(0x3d60), f_q))mstore(0x3fe0, mulmod(mload(0x3fc0), mload(0x3da0), f_q))mstore(0x4000, mulmod(mload(0x3fe0), mload(0x3de0), f_q))mstore(0x4020, mulmod(mload(0x4000), mload(0x3e20), f_q)){ let result := mulmod(mload(0x1360), 1, f_q)result := addmod(mulmod(mload(0x880), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(0x4040, result) }mstore(0x4060, mulmod(8390819244605639573390577733158868133682115698337564550620146375401109684432, mload(0x13e0), f_q))mstore(0x4080, mulmod(mload(0x4060), 1, f_q)){ let result := mulmod(mload(0x1360), mload(0x4060), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x4080)), f_q), result, f_q)mstore(0x40a0, result) }mstore(0x40c0, mulmod(14389468897523033212448771694851898440525479866834419679925499462425232628530, mload(0x13e0), f_q))mstore(0x40e0, mulmod(mload(0x40c0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1360), mload(0x40c0), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x40e0)), f_q), result, f_q)mstore(0x4100, result) }mstore(0x4120, mulmod(8021781111580269725587432039983408559403601261632071736490564397134126857583, mload(0x13e0), f_q))mstore(0x4140, mulmod(mload(0x4120), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q)){ let result := mulmod(mload(0x1360), mload(0x4120), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x4140)), f_q), result, f_q)mstore(0x4160, result) }mstore(0x4180, mulmod(mload(0x3fe0), mload(0x3ce0), f_q))mstore(0x41a0, mulmod(10676941854703594198666993839846402519342119846958189386823924046696287912228, mload(0x880), f_q))mstore(0x41c0, mulmod(mload(0x41a0), 1, f_q)){ let result := mulmod(mload(0x1360), mload(0x41a0), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x41c0)), f_q), result, f_q)mstore(0x41e0, result) }mstore(0x4200, mulmod(11211301017135681023579411905410872569206244553457844956874280139879520583389, mload(0x880), f_q))mstore(0x4220, mulmod(mload(0x4200), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1360), mload(0x4200), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x4220)), f_q), result, f_q)mstore(0x4240, result) }mstore(0x4260, mulmod(13154116519010929542673167886091370382741775939114889923107781597533678454430, mload(0x880), f_q))mstore(0x4280, mulmod(mload(0x4260), 1, f_q)){ let result := mulmod(mload(0x1360), mload(0x4260), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x4280)), f_q), result, f_q)mstore(0x42a0, result) }mstore(0x42c0, mulmod(8734126352828345679573237859165904705806588461301144420590422589042130041187, mload(0x880), f_q))mstore(0x42e0, mulmod(mload(0x42c0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q)){ let result := mulmod(mload(0x1360), mload(0x42c0), f_q)result := addmod(mulmod(mload(0x880), sub(f_q, mload(0x42e0)), f_q), result, f_q)mstore(0x4300, result) }mstore(0x4320, mulmod(mload(0x3fc0), mload(0x3d20), f_q)){ let prod := mload(0x3e80) prod := mulmod(mload(0x3ee0), prod, f_q) mstore(0x4340, prod) prod := mulmod(mload(0x3f40), prod, f_q) mstore(0x4360, prod) prod := mulmod(mload(0x3fa0), prod, f_q) mstore(0x4380, prod) prod := mulmod(mload(0x4040), prod, f_q) mstore(0x43a0, prod) prod := mulmod(mload(0x3fc0), prod, f_q) mstore(0x43c0, prod) prod := mulmod(mload(0x40a0), prod, f_q) mstore(0x43e0, prod) prod := mulmod(mload(0x4100), prod, f_q) mstore(0x4400, prod) prod := mulmod(mload(0x4160), prod, f_q) mstore(0x4420, prod) prod := mulmod(mload(0x4180), prod, f_q) mstore(0x4440, prod) prod := mulmod(mload(0x41e0), prod, f_q) mstore(0x4460, prod) prod := mulmod(mload(0x4240), prod, f_q) mstore(0x4480, prod) prod := mulmod(mload(0x3fe0), prod, f_q) mstore(0x44a0, prod) prod := mulmod(mload(0x42a0), prod, f_q) mstore(0x44c0, prod) prod := mulmod(mload(0x4300), prod, f_q) mstore(0x44e0, prod) prod := mulmod(mload(0x4320), prod, f_q) mstore(0x4500, prod) }mstore(0x4540, 32)mstore(0x4560, 32)mstore(0x4580, 32)mstore(0x45a0, mload(0x4500))mstore(0x45c0, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x45e0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x4540, 0xc0, 0x4520, 0x20), 1), success){ let inv := mload(0x4520) let v v := mload(0x4320) mstore(0x4320, mulmod(mload(0x44e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4300) mstore(0x4300, mulmod(mload(0x44c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x42a0) mstore(0x42a0, mulmod(mload(0x44a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3fe0) mstore(0x3fe0, mulmod(mload(0x4480), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4240) mstore(0x4240, mulmod(mload(0x4460), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x41e0) mstore(0x41e0, mulmod(mload(0x4440), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4180) mstore(0x4180, mulmod(mload(0x4420), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4160) mstore(0x4160, mulmod(mload(0x4400), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4100) mstore(0x4100, mulmod(mload(0x43e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x40a0) mstore(0x40a0, mulmod(mload(0x43c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3fc0) mstore(0x3fc0, mulmod(mload(0x43a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4040) mstore(0x4040, mulmod(mload(0x4380), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3fa0) mstore(0x3fa0, mulmod(mload(0x4360), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3f40) mstore(0x3f40, mulmod(mload(0x4340), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3ee0) mstore(0x3ee0, mulmod(mload(0x3e80), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x3e80, inv) }{ let result := mload(0x3e80)result := addmod(mload(0x3ee0), result, f_q)result := addmod(mload(0x3f40), result, f_q)result := addmod(mload(0x3fa0), result, f_q)mstore(0x4600, result) }mstore(0x4620, mulmod(mload(0x4020), mload(0x3fc0), f_q)){ let result := mload(0x4040)mstore(0x4640, result) }mstore(0x4660, mulmod(mload(0x4020), mload(0x4180), f_q)){ let result := mload(0x40a0)result := addmod(mload(0x4100), result, f_q)result := addmod(mload(0x4160), result, f_q)mstore(0x4680, result) }mstore(0x46a0, mulmod(mload(0x4020), mload(0x3fe0), f_q)){ let result := mload(0x41e0)result := addmod(mload(0x4240), result, f_q)mstore(0x46c0, result) }mstore(0x46e0, mulmod(mload(0x4020), mload(0x4320), f_q)){ let result := mload(0x42a0)result := addmod(mload(0x4300), result, f_q)mstore(0x4700, result) }{ let prod := mload(0x4600) prod := mulmod(mload(0x4640), prod, f_q) mstore(0x4720, prod) prod := mulmod(mload(0x4680), prod, f_q) mstore(0x4740, prod) prod := mulmod(mload(0x46c0), prod, f_q) mstore(0x4760, prod) prod := mulmod(mload(0x4700), prod, f_q) mstore(0x4780, prod) }mstore(0x47c0, 32)mstore(0x47e0, 32)mstore(0x4800, 32)mstore(0x4820, mload(0x4780))mstore(0x4840, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x4860, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x47c0, 0xc0, 0x47a0, 0x20), 1), success){ let inv := mload(0x47a0) let v v := mload(0x4700) mstore(0x4700, mulmod(mload(0x4760), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x46c0) mstore(0x46c0, mulmod(mload(0x4740), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4680) mstore(0x4680, mulmod(mload(0x4720), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4640) mstore(0x4640, mulmod(mload(0x4600), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x4600, inv) }mstore(0x4880, mulmod(mload(0x4620), mload(0x4640), f_q))mstore(0x48a0, mulmod(mload(0x4660), mload(0x4680), f_q))mstore(0x48c0, mulmod(mload(0x46a0), mload(0x46c0), f_q))mstore(0x48e0, mulmod(mload(0x46e0), mload(0x4700), f_q))mstore(0x4900, mulmod(mload(0x1260), mload(0x1260), f_q))mstore(0x4920, mulmod(mload(0x4900), mload(0x1260), f_q))mstore(0x4940, mulmod(mload(0x4920), mload(0x1260), f_q))mstore(0x4960, mulmod(mload(0x4940), mload(0x1260), f_q))mstore(0x4980, mulmod(mload(0x4960), mload(0x1260), f_q))mstore(0x49a0, mulmod(mload(0x4980), mload(0x1260), f_q))mstore(0x49c0, mulmod(mload(0x49a0), mload(0x1260), f_q))mstore(0x49e0, mulmod(mload(0x49c0), mload(0x1260), f_q))mstore(0x4a00, mulmod(mload(0x49e0), mload(0x1260), f_q))mstore(0x4a20, mulmod(mload(0x4a00), mload(0x1260), f_q))mstore(0x4a40, mulmod(mload(0x4a20), mload(0x1260), f_q))mstore(0x4a60, mulmod(mload(0x4a40), mload(0x1260), f_q))mstore(0x4a80, mulmod(mload(0x4a60), mload(0x1260), f_q))mstore(0x4aa0, mulmod(mload(0x4a80), mload(0x1260), f_q))mstore(0x4ac0, mulmod(mload(0x4aa0), mload(0x1260), f_q))mstore(0x4ae0, mulmod(mload(0x4ac0), mload(0x1260), f_q))mstore(0x4b00, mulmod(mload(0x4ae0), mload(0x1260), f_q))mstore(0x4b20, mulmod(mload(0x4b00), mload(0x1260), f_q))mstore(0x4b40, mulmod(mload(0x4b20), mload(0x1260), f_q))mstore(0x4b60, mulmod(mload(0x4b40), mload(0x1260), f_q))mstore(0x4b80, mulmod(mload(0x4b60), mload(0x1260), f_q))mstore(0x4ba0, mulmod(mload(0x4b80), mload(0x1260), f_q))mstore(0x4bc0, mulmod(mload(0x4ba0), mload(0x1260), f_q))mstore(0x4be0, mulmod(mload(0x4bc0), mload(0x1260), f_q))mstore(0x4c00, mulmod(mload(0x4be0), mload(0x1260), f_q))mstore(0x4c20, mulmod(mload(0x4c00), mload(0x1260), f_q))mstore(0x4c40, mulmod(mload(0x4c20), mload(0x1260), f_q))mstore(0x4c60, mulmod(mload(0x12c0), mload(0x12c0), f_q))mstore(0x4c80, mulmod(mload(0x4c60), mload(0x12c0), f_q))mstore(0x4ca0, mulmod(mload(0x4c80), mload(0x12c0), f_q))mstore(0x4cc0, mulmod(mload(0x4ca0), mload(0x12c0), f_q)){ let result := mulmod(mload(0x8c0), mload(0x3e80), f_q)result := addmod(mulmod(mload(0x8e0), mload(0x3ee0), f_q), result, f_q)result := addmod(mulmod(mload(0x900), mload(0x3f40), f_q), result, f_q)result := addmod(mulmod(mload(0x920), mload(0x3fa0), f_q), result, f_q)mstore(0x4ce0, result) }mstore(0x4d00, mulmod(mload(0x4ce0), mload(0x4600), f_q))mstore(0x4d20, mulmod(sub(f_q, mload(0x4d00)), 1, f_q)){ let result := mulmod(mload(0x940), mload(0x3e80), f_q)result := addmod(mulmod(mload(0x960), mload(0x3ee0), f_q), result, f_q)result := addmod(mulmod(mload(0x980), mload(0x3f40), f_q), result, f_q)result := addmod(mulmod(mload(0x9a0), mload(0x3fa0), f_q), result, f_q)mstore(0x4d40, result) }mstore(0x4d60, mulmod(mload(0x4d40), mload(0x4600), f_q))mstore(0x4d80, mulmod(sub(f_q, mload(0x4d60)), mload(0x1260), f_q))mstore(0x4da0, mulmod(1, mload(0x1260), f_q))mstore(0x4dc0, addmod(mload(0x4d20), mload(0x4d80), f_q)){ let result := mulmod(mload(0x9c0), mload(0x3e80), f_q)result := addmod(mulmod(mload(0x9e0), mload(0x3ee0), f_q), result, f_q)result := addmod(mulmod(mload(0xa00), mload(0x3f40), f_q), result, f_q)result := addmod(mulmod(mload(0xa20), mload(0x3fa0), f_q), result, f_q)mstore(0x4de0, result) }mstore(0x4e00, mulmod(mload(0x4de0), mload(0x4600), f_q))mstore(0x4e20, mulmod(sub(f_q, mload(0x4e00)), mload(0x4900), f_q))mstore(0x4e40, mulmod(1, mload(0x4900), f_q))mstore(0x4e60, addmod(mload(0x4dc0), mload(0x4e20), f_q)){ let result := mulmod(mload(0xa40), mload(0x3e80), f_q)result := addmod(mulmod(mload(0xa60), mload(0x3ee0), f_q), result, f_q)result := addmod(mulmod(mload(0xa80), mload(0x3f40), f_q), result, f_q)result := addmod(mulmod(mload(0xaa0), mload(0x3fa0), f_q), result, f_q)mstore(0x4e80, result) }mstore(0x4ea0, mulmod(mload(0x4e80), mload(0x4600), f_q))mstore(0x4ec0, mulmod(sub(f_q, mload(0x4ea0)), mload(0x4920), f_q))mstore(0x4ee0, mulmod(1, mload(0x4920), f_q))mstore(0x4f00, addmod(mload(0x4e60), mload(0x4ec0), f_q)){ let result := mulmod(mload(0xac0), mload(0x3e80), f_q)result := addmod(mulmod(mload(0xae0), mload(0x3ee0), f_q), result, f_q)result := addmod(mulmod(mload(0xb00), mload(0x3f40), f_q), result, f_q)result := addmod(mulmod(mload(0xb20), mload(0x3fa0), f_q), result, f_q)mstore(0x4f20, result) }mstore(0x4f40, mulmod(mload(0x4f20), mload(0x4600), f_q))mstore(0x4f60, mulmod(sub(f_q, mload(0x4f40)), mload(0x4940), f_q))mstore(0x4f80, mulmod(1, mload(0x4940), f_q))mstore(0x4fa0, addmod(mload(0x4f00), mload(0x4f60), f_q)){ let result := mulmod(mload(0xb40), mload(0x3e80), f_q)result := addmod(mulmod(mload(0xb60), mload(0x3ee0), f_q), result, f_q)result := addmod(mulmod(mload(0xb80), mload(0x3f40), f_q), result, f_q)result := addmod(mulmod(mload(0xba0), mload(0x3fa0), f_q), result, f_q)mstore(0x4fc0, result) }mstore(0x4fe0, mulmod(mload(0x4fc0), mload(0x4600), f_q))mstore(0x5000, mulmod(sub(f_q, mload(0x4fe0)), mload(0x4960), f_q))mstore(0x5020, mulmod(1, mload(0x4960), f_q))mstore(0x5040, addmod(mload(0x4fa0), mload(0x5000), f_q))mstore(0x5060, mulmod(mload(0x5040), 1, f_q))mstore(0x5080, mulmod(mload(0x4da0), 1, f_q))mstore(0x50a0, mulmod(mload(0x4e40), 1, f_q))mstore(0x50c0, mulmod(mload(0x4ee0), 1, f_q))mstore(0x50e0, mulmod(mload(0x4f80), 1, f_q))mstore(0x5100, mulmod(mload(0x5020), 1, f_q))mstore(0x5120, mulmod(1, mload(0x4620), f_q)){ let result := mulmod(mload(0xbc0), mload(0x4040), f_q)mstore(0x5140, result) }mstore(0x5160, mulmod(mload(0x5140), mload(0x4880), f_q))mstore(0x5180, mulmod(sub(f_q, mload(0x5160)), 1, f_q))mstore(0x51a0, mulmod(mload(0x5120), 1, f_q)){ let result := mulmod(mload(0xbe0), mload(0x4040), f_q)mstore(0x51c0, result) }mstore(0x51e0, mulmod(mload(0x51c0), mload(0x4880), f_q))mstore(0x5200, mulmod(sub(f_q, mload(0x51e0)), mload(0x1260), f_q))mstore(0x5220, mulmod(mload(0x5120), mload(0x1260), f_q))mstore(0x5240, addmod(mload(0x5180), mload(0x5200), f_q)){ let result := mulmod(mload(0xc00), mload(0x4040), f_q)mstore(0x5260, result) }mstore(0x5280, mulmod(mload(0x5260), mload(0x4880), f_q))mstore(0x52a0, mulmod(sub(f_q, mload(0x5280)), mload(0x4900), f_q))mstore(0x52c0, mulmod(mload(0x5120), mload(0x4900), f_q))mstore(0x52e0, addmod(mload(0x5240), mload(0x52a0), f_q)){ let result := mulmod(mload(0x1180), mload(0x4040), f_q)mstore(0x5300, result) }mstore(0x5320, mulmod(mload(0x5300), mload(0x4880), f_q))mstore(0x5340, mulmod(sub(f_q, mload(0x5320)), mload(0x4920), f_q))mstore(0x5360, mulmod(mload(0x5120), mload(0x4920), f_q))mstore(0x5380, addmod(mload(0x52e0), mload(0x5340), f_q)){ let result := mulmod(mload(0x1220), mload(0x4040), f_q)mstore(0x53a0, result) }mstore(0x53c0, mulmod(mload(0x53a0), mload(0x4880), f_q))mstore(0x53e0, mulmod(sub(f_q, mload(0x53c0)), mload(0x4940), f_q))mstore(0x5400, mulmod(mload(0x5120), mload(0x4940), f_q))mstore(0x5420, addmod(mload(0x5380), mload(0x53e0), f_q)){ let result := mulmod(mload(0xc20), mload(0x4040), f_q)mstore(0x5440, result) }mstore(0x5460, mulmod(mload(0x5440), mload(0x4880), f_q))mstore(0x5480, mulmod(sub(f_q, mload(0x5460)), mload(0x4960), f_q))mstore(0x54a0, mulmod(mload(0x5120), mload(0x4960), f_q))mstore(0x54c0, addmod(mload(0x5420), mload(0x5480), f_q)){ let result := mulmod(mload(0xc40), mload(0x4040), f_q)mstore(0x54e0, result) }mstore(0x5500, mulmod(mload(0x54e0), mload(0x4880), f_q))mstore(0x5520, mulmod(sub(f_q, mload(0x5500)), mload(0x4980), f_q))mstore(0x5540, mulmod(mload(0x5120), mload(0x4980), f_q))mstore(0x5560, addmod(mload(0x54c0), mload(0x5520), f_q)){ let result := mulmod(mload(0xc60), mload(0x4040), f_q)mstore(0x5580, result) }mstore(0x55a0, mulmod(mload(0x5580), mload(0x4880), f_q))mstore(0x55c0, mulmod(sub(f_q, mload(0x55a0)), mload(0x49a0), f_q))mstore(0x55e0, mulmod(mload(0x5120), mload(0x49a0), f_q))mstore(0x5600, addmod(mload(0x5560), mload(0x55c0), f_q))mstore(0x5620, addmod(mload(0x5540), mload(0x55e0), f_q)){ let result := mulmod(mload(0xc80), mload(0x4040), f_q)mstore(0x5640, result) }mstore(0x5660, mulmod(mload(0x5640), mload(0x4880), f_q))mstore(0x5680, mulmod(sub(f_q, mload(0x5660)), mload(0x49c0), f_q))mstore(0x56a0, mulmod(mload(0x5120), mload(0x49c0), f_q))mstore(0x56c0, addmod(mload(0x5600), mload(0x5680), f_q)){ let result := mulmod(mload(0xca0), mload(0x4040), f_q)mstore(0x56e0, result) }mstore(0x5700, mulmod(mload(0x56e0), mload(0x4880), f_q))mstore(0x5720, mulmod(sub(f_q, mload(0x5700)), mload(0x49e0), f_q))mstore(0x5740, mulmod(mload(0x5120), mload(0x49e0), f_q))mstore(0x5760, addmod(mload(0x56c0), mload(0x5720), f_q)){ let result := mulmod(mload(0xcc0), mload(0x4040), f_q)mstore(0x5780, result) }mstore(0x57a0, mulmod(mload(0x5780), mload(0x4880), f_q))mstore(0x57c0, mulmod(sub(f_q, mload(0x57a0)), mload(0x4a00), f_q))mstore(0x57e0, mulmod(mload(0x5120), mload(0x4a00), f_q))mstore(0x5800, addmod(mload(0x5760), mload(0x57c0), f_q)){ let result := mulmod(mload(0xce0), mload(0x4040), f_q)mstore(0x5820, result) }mstore(0x5840, mulmod(mload(0x5820), mload(0x4880), f_q))mstore(0x5860, mulmod(sub(f_q, mload(0x5840)), mload(0x4a20), f_q))mstore(0x5880, mulmod(mload(0x5120), mload(0x4a20), f_q))mstore(0x58a0, addmod(mload(0x5800), mload(0x5860), f_q)){ let result := mulmod(mload(0xd00), mload(0x4040), f_q)mstore(0x58c0, result) }mstore(0x58e0, mulmod(mload(0x58c0), mload(0x4880), f_q))mstore(0x5900, mulmod(sub(f_q, mload(0x58e0)), mload(0x4a40), f_q))mstore(0x5920, mulmod(mload(0x5120), mload(0x4a40), f_q))mstore(0x5940, addmod(mload(0x58a0), mload(0x5900), f_q)){ let result := mulmod(mload(0xd20), mload(0x4040), f_q)mstore(0x5960, result) }mstore(0x5980, mulmod(mload(0x5960), mload(0x4880), f_q))mstore(0x59a0, mulmod(sub(f_q, mload(0x5980)), mload(0x4a60), f_q))mstore(0x59c0, mulmod(mload(0x5120), mload(0x4a60), f_q))mstore(0x59e0, addmod(mload(0x5940), mload(0x59a0), f_q)){ let result := mulmod(mload(0xd40), mload(0x4040), f_q)mstore(0x5a00, result) }mstore(0x5a20, mulmod(mload(0x5a00), mload(0x4880), f_q))mstore(0x5a40, mulmod(sub(f_q, mload(0x5a20)), mload(0x4a80), f_q))mstore(0x5a60, mulmod(mload(0x5120), mload(0x4a80), f_q))mstore(0x5a80, addmod(mload(0x59e0), mload(0x5a40), f_q)){ let result := mulmod(mload(0xd80), mload(0x4040), f_q)mstore(0x5aa0, result) }mstore(0x5ac0, mulmod(mload(0x5aa0), mload(0x4880), f_q))mstore(0x5ae0, mulmod(sub(f_q, mload(0x5ac0)), mload(0x4aa0), f_q))mstore(0x5b00, mulmod(mload(0x5120), mload(0x4aa0), f_q))mstore(0x5b20, addmod(mload(0x5a80), mload(0x5ae0), f_q)){ let result := mulmod(mload(0xda0), mload(0x4040), f_q)mstore(0x5b40, result) }mstore(0x5b60, mulmod(mload(0x5b40), mload(0x4880), f_q))mstore(0x5b80, mulmod(sub(f_q, mload(0x5b60)), mload(0x4ac0), f_q))mstore(0x5ba0, mulmod(mload(0x5120), mload(0x4ac0), f_q))mstore(0x5bc0, addmod(mload(0x5b20), mload(0x5b80), f_q)){ let result := mulmod(mload(0xdc0), mload(0x4040), f_q)mstore(0x5be0, result) }mstore(0x5c00, mulmod(mload(0x5be0), mload(0x4880), f_q))mstore(0x5c20, mulmod(sub(f_q, mload(0x5c00)), mload(0x4ae0), f_q))mstore(0x5c40, mulmod(mload(0x5120), mload(0x4ae0), f_q))mstore(0x5c60, addmod(mload(0x5bc0), mload(0x5c20), f_q)){ let result := mulmod(mload(0xde0), mload(0x4040), f_q)mstore(0x5c80, result) }mstore(0x5ca0, mulmod(mload(0x5c80), mload(0x4880), f_q))mstore(0x5cc0, mulmod(sub(f_q, mload(0x5ca0)), mload(0x4b00), f_q))mstore(0x5ce0, mulmod(mload(0x5120), mload(0x4b00), f_q))mstore(0x5d00, addmod(mload(0x5c60), mload(0x5cc0), f_q)){ let result := mulmod(mload(0xe00), mload(0x4040), f_q)mstore(0x5d20, result) }mstore(0x5d40, mulmod(mload(0x5d20), mload(0x4880), f_q))mstore(0x5d60, mulmod(sub(f_q, mload(0x5d40)), mload(0x4b20), f_q))mstore(0x5d80, mulmod(mload(0x5120), mload(0x4b20), f_q))mstore(0x5da0, addmod(mload(0x5d00), mload(0x5d60), f_q)){ let result := mulmod(mload(0xe20), mload(0x4040), f_q)mstore(0x5dc0, result) }mstore(0x5de0, mulmod(mload(0x5dc0), mload(0x4880), f_q))mstore(0x5e00, mulmod(sub(f_q, mload(0x5de0)), mload(0x4b40), f_q))mstore(0x5e20, mulmod(mload(0x5120), mload(0x4b40), f_q))mstore(0x5e40, addmod(mload(0x5da0), mload(0x5e00), f_q)){ let result := mulmod(mload(0xe40), mload(0x4040), f_q)mstore(0x5e60, result) }mstore(0x5e80, mulmod(mload(0x5e60), mload(0x4880), f_q))mstore(0x5ea0, mulmod(sub(f_q, mload(0x5e80)), mload(0x4b60), f_q))mstore(0x5ec0, mulmod(mload(0x5120), mload(0x4b60), f_q))mstore(0x5ee0, addmod(mload(0x5e40), mload(0x5ea0), f_q)){ let result := mulmod(mload(0xe60), mload(0x4040), f_q)mstore(0x5f00, result) }mstore(0x5f20, mulmod(mload(0x5f00), mload(0x4880), f_q))mstore(0x5f40, mulmod(sub(f_q, mload(0x5f20)), mload(0x4b80), f_q))mstore(0x5f60, mulmod(mload(0x5120), mload(0x4b80), f_q))mstore(0x5f80, addmod(mload(0x5ee0), mload(0x5f40), f_q)){ let result := mulmod(mload(0xe80), mload(0x4040), f_q)mstore(0x5fa0, result) }mstore(0x5fc0, mulmod(mload(0x5fa0), mload(0x4880), f_q))mstore(0x5fe0, mulmod(sub(f_q, mload(0x5fc0)), mload(0x4ba0), f_q))mstore(0x6000, mulmod(mload(0x5120), mload(0x4ba0), f_q))mstore(0x6020, addmod(mload(0x5f80), mload(0x5fe0), f_q)){ let result := mulmod(mload(0xea0), mload(0x4040), f_q)mstore(0x6040, result) }mstore(0x6060, mulmod(mload(0x6040), mload(0x4880), f_q))mstore(0x6080, mulmod(sub(f_q, mload(0x6060)), mload(0x4bc0), f_q))mstore(0x60a0, mulmod(mload(0x5120), mload(0x4bc0), f_q))mstore(0x60c0, addmod(mload(0x6020), mload(0x6080), f_q)){ let result := mulmod(mload(0xec0), mload(0x4040), f_q)mstore(0x60e0, result) }mstore(0x6100, mulmod(mload(0x60e0), mload(0x4880), f_q))mstore(0x6120, mulmod(sub(f_q, mload(0x6100)), mload(0x4be0), f_q))mstore(0x6140, mulmod(mload(0x5120), mload(0x4be0), f_q))mstore(0x6160, addmod(mload(0x60c0), mload(0x6120), f_q))mstore(0x6180, mulmod(mload(0x3c20), mload(0x4620), f_q))mstore(0x61a0, mulmod(mload(0x3c40), mload(0x4620), f_q)){ let result := mulmod(mload(0x3c60), mload(0x4040), f_q)mstore(0x61c0, result) }mstore(0x61e0, mulmod(mload(0x61c0), mload(0x4880), f_q))mstore(0x6200, mulmod(sub(f_q, mload(0x61e0)), mload(0x4c00), f_q))mstore(0x6220, mulmod(mload(0x5120), mload(0x4c00), f_q))mstore(0x6240, mulmod(mload(0x6180), mload(0x4c00), f_q))mstore(0x6260, mulmod(mload(0x61a0), mload(0x4c00), f_q))mstore(0x6280, addmod(mload(0x6160), mload(0x6200), f_q)){ let result := mulmod(mload(0xd60), mload(0x4040), f_q)mstore(0x62a0, result) }mstore(0x62c0, mulmod(mload(0x62a0), mload(0x4880), f_q))mstore(0x62e0, mulmod(sub(f_q, mload(0x62c0)), mload(0x4c20), f_q))mstore(0x6300, mulmod(mload(0x5120), mload(0x4c20), f_q))mstore(0x6320, addmod(mload(0x6280), mload(0x62e0), f_q))mstore(0x6340, mulmod(mload(0x6320), mload(0x12c0), f_q))mstore(0x6360, mulmod(mload(0x51a0), mload(0x12c0), f_q))mstore(0x6380, mulmod(mload(0x5220), mload(0x12c0), f_q))mstore(0x63a0, mulmod(mload(0x52c0), mload(0x12c0), f_q))mstore(0x63c0, mulmod(mload(0x5360), mload(0x12c0), f_q))mstore(0x63e0, mulmod(mload(0x5400), mload(0x12c0), f_q))mstore(0x6400, mulmod(mload(0x54a0), mload(0x12c0), f_q))mstore(0x6420, mulmod(mload(0x5620), mload(0x12c0), f_q))mstore(0x6440, mulmod(mload(0x56a0), mload(0x12c0), f_q))mstore(0x6460, mulmod(mload(0x5740), mload(0x12c0), f_q))mstore(0x6480, mulmod(mload(0x57e0), mload(0x12c0), f_q))mstore(0x64a0, mulmod(mload(0x5880), mload(0x12c0), f_q))mstore(0x64c0, mulmod(mload(0x5920), mload(0x12c0), f_q))mstore(0x64e0, mulmod(mload(0x59c0), mload(0x12c0), f_q))mstore(0x6500, mulmod(mload(0x5a60), mload(0x12c0), f_q))mstore(0x6520, mulmod(mload(0x5b00), mload(0x12c0), f_q))mstore(0x6540, mulmod(mload(0x5ba0), mload(0x12c0), f_q))mstore(0x6560, mulmod(mload(0x5c40), mload(0x12c0), f_q))mstore(0x6580, mulmod(mload(0x5ce0), mload(0x12c0), f_q))mstore(0x65a0, mulmod(mload(0x5d80), mload(0x12c0), f_q))mstore(0x65c0, mulmod(mload(0x5e20), mload(0x12c0), f_q))mstore(0x65e0, mulmod(mload(0x5ec0), mload(0x12c0), f_q))mstore(0x6600, mulmod(mload(0x5f60), mload(0x12c0), f_q))mstore(0x6620, mulmod(mload(0x6000), mload(0x12c0), f_q))mstore(0x6640, mulmod(mload(0x60a0), mload(0x12c0), f_q))mstore(0x6660, mulmod(mload(0x6140), mload(0x12c0), f_q))mstore(0x6680, mulmod(mload(0x6220), mload(0x12c0), f_q))mstore(0x66a0, mulmod(mload(0x6240), mload(0x12c0), f_q))mstore(0x66c0, mulmod(mload(0x6260), mload(0x12c0), f_q))mstore(0x66e0, mulmod(mload(0x6300), mload(0x12c0), f_q))mstore(0x6700, addmod(mload(0x5060), mload(0x6340), f_q))mstore(0x6720, mulmod(1, mload(0x4660), f_q)){ let result := mulmod(mload(0xee0), mload(0x40a0), f_q)result := addmod(mulmod(mload(0xf00), mload(0x4100), f_q), result, f_q)result := addmod(mulmod(mload(0xf20), mload(0x4160), f_q), result, f_q)mstore(0x6740, result) }mstore(0x6760, mulmod(mload(0x6740), mload(0x48a0), f_q))mstore(0x6780, mulmod(sub(f_q, mload(0x6760)), 1, f_q))mstore(0x67a0, mulmod(mload(0x6720), 1, f_q)){ let result := mulmod(mload(0xf40), mload(0x40a0), f_q)result := addmod(mulmod(mload(0xf60), mload(0x4100), f_q), result, f_q)result := addmod(mulmod(mload(0xf80), mload(0x4160), f_q), result, f_q)mstore(0x67c0, result) }mstore(0x67e0, mulmod(mload(0x67c0), mload(0x48a0), f_q))mstore(0x6800, mulmod(sub(f_q, mload(0x67e0)), mload(0x1260), f_q))mstore(0x6820, mulmod(mload(0x6720), mload(0x1260), f_q))mstore(0x6840, addmod(mload(0x6780), mload(0x6800), f_q)){ let result := mulmod(mload(0xfa0), mload(0x40a0), f_q)result := addmod(mulmod(mload(0xfc0), mload(0x4100), f_q), result, f_q)result := addmod(mulmod(mload(0xfe0), mload(0x4160), f_q), result, f_q)mstore(0x6860, result) }mstore(0x6880, mulmod(mload(0x6860), mload(0x48a0), f_q))mstore(0x68a0, mulmod(sub(f_q, mload(0x6880)), mload(0x4900), f_q))mstore(0x68c0, mulmod(mload(0x6720), mload(0x4900), f_q))mstore(0x68e0, addmod(mload(0x6840), mload(0x68a0), f_q)){ let result := mulmod(mload(0x1000), mload(0x40a0), f_q)result := addmod(mulmod(mload(0x1020), mload(0x4100), f_q), result, f_q)result := addmod(mulmod(mload(0x1040), mload(0x4160), f_q), result, f_q)mstore(0x6900, result) }mstore(0x6920, mulmod(mload(0x6900), mload(0x48a0), f_q))mstore(0x6940, mulmod(sub(f_q, mload(0x6920)), mload(0x4920), f_q))mstore(0x6960, mulmod(mload(0x6720), mload(0x4920), f_q))mstore(0x6980, addmod(mload(0x68e0), mload(0x6940), f_q)){ let result := mulmod(mload(0x1060), mload(0x40a0), f_q)result := addmod(mulmod(mload(0x1080), mload(0x4100), f_q), result, f_q)result := addmod(mulmod(mload(0x10a0), mload(0x4160), f_q), result, f_q)mstore(0x69a0, result) }mstore(0x69c0, mulmod(mload(0x69a0), mload(0x48a0), f_q))mstore(0x69e0, mulmod(sub(f_q, mload(0x69c0)), mload(0x4940), f_q))mstore(0x6a00, mulmod(mload(0x6720), mload(0x4940), f_q))mstore(0x6a20, addmod(mload(0x6980), mload(0x69e0), f_q))mstore(0x6a40, mulmod(mload(0x6a20), mload(0x4c60), f_q))mstore(0x6a60, mulmod(mload(0x67a0), mload(0x4c60), f_q))mstore(0x6a80, mulmod(mload(0x6820), mload(0x4c60), f_q))mstore(0x6aa0, mulmod(mload(0x68c0), mload(0x4c60), f_q))mstore(0x6ac0, mulmod(mload(0x6960), mload(0x4c60), f_q))mstore(0x6ae0, mulmod(mload(0x6a00), mload(0x4c60), f_q))mstore(0x6b00, addmod(mload(0x6700), mload(0x6a40), f_q))mstore(0x6b20, mulmod(1, mload(0x46a0), f_q)){ let result := mulmod(mload(0x10c0), mload(0x41e0), f_q)result := addmod(mulmod(mload(0x10e0), mload(0x4240), f_q), result, f_q)mstore(0x6b40, result) }mstore(0x6b60, mulmod(mload(0x6b40), mload(0x48c0), f_q))mstore(0x6b80, mulmod(sub(f_q, mload(0x6b60)), 1, f_q))mstore(0x6ba0, mulmod(mload(0x6b20), 1, f_q)){ let result := mulmod(mload(0x1100), mload(0x41e0), f_q)result := addmod(mulmod(mload(0x1120), mload(0x4240), f_q), result, f_q)mstore(0x6bc0, result) }mstore(0x6be0, mulmod(mload(0x6bc0), mload(0x48c0), f_q))mstore(0x6c00, mulmod(sub(f_q, mload(0x6be0)), mload(0x1260), f_q))mstore(0x6c20, mulmod(mload(0x6b20), mload(0x1260), f_q))mstore(0x6c40, addmod(mload(0x6b80), mload(0x6c00), f_q)){ let result := mulmod(mload(0x11a0), mload(0x41e0), f_q)result := addmod(mulmod(mload(0x11c0), mload(0x4240), f_q), result, f_q)mstore(0x6c60, result) }mstore(0x6c80, mulmod(mload(0x6c60), mload(0x48c0), f_q))mstore(0x6ca0, mulmod(sub(f_q, mload(0x6c80)), mload(0x4900), f_q))mstore(0x6cc0, mulmod(mload(0x6b20), mload(0x4900), f_q))mstore(0x6ce0, addmod(mload(0x6c40), mload(0x6ca0), f_q))mstore(0x6d00, mulmod(mload(0x6ce0), mload(0x4c80), f_q))mstore(0x6d20, mulmod(mload(0x6ba0), mload(0x4c80), f_q))mstore(0x6d40, mulmod(mload(0x6c20), mload(0x4c80), f_q))mstore(0x6d60, mulmod(mload(0x6cc0), mload(0x4c80), f_q))mstore(0x6d80, addmod(mload(0x6b00), mload(0x6d00), f_q))mstore(0x6da0, mulmod(1, mload(0x46e0), f_q)){ let result := mulmod(mload(0x1140), mload(0x42a0), f_q)result := addmod(mulmod(mload(0x1160), mload(0x4300), f_q), result, f_q)mstore(0x6dc0, result) }mstore(0x6de0, mulmod(mload(0x6dc0), mload(0x48e0), f_q))mstore(0x6e00, mulmod(sub(f_q, mload(0x6de0)), 1, f_q))mstore(0x6e20, mulmod(mload(0x6da0), 1, f_q)){ let result := mulmod(mload(0x11e0), mload(0x42a0), f_q)result := addmod(mulmod(mload(0x1200), mload(0x4300), f_q), result, f_q)mstore(0x6e40, result) }mstore(0x6e60, mulmod(mload(0x6e40), mload(0x48e0), f_q))mstore(0x6e80, mulmod(sub(f_q, mload(0x6e60)), mload(0x1260), f_q))mstore(0x6ea0, mulmod(mload(0x6da0), mload(0x1260), f_q))mstore(0x6ec0, addmod(mload(0x6e00), mload(0x6e80), f_q))mstore(0x6ee0, mulmod(mload(0x6ec0), mload(0x4ca0), f_q))mstore(0x6f00, mulmod(mload(0x6e20), mload(0x4ca0), f_q))mstore(0x6f20, mulmod(mload(0x6ea0), mload(0x4ca0), f_q))mstore(0x6f40, addmod(mload(0x6d80), mload(0x6ee0), f_q))mstore(0x6f60, mulmod(1, mload(0x4020), f_q))mstore(0x6f80, mulmod(1, mload(0x1360), f_q))mstore(0x6fa0, 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(0x6fc0, 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(0x6fe0, mload(0x6f40))success := and(eq(staticcall(gas(), 0x7, 0x6fa0, 0x60, 0x6fa0, 0x40), 1), success)mstore(0x7000, mload(0x6fa0)) mstore(0x7020, mload(0x6fc0))mstore(0x7040, mload(0xa0)) mstore(0x7060, mload(0xc0))success := and(eq(staticcall(gas(), 0x6, 0x7000, 0x80, 0x7000, 0x40), 1), success)mstore(0x7080, mload(0xe0)) mstore(0x70a0, mload(0x100))mstore(0x70c0, mload(0x5080))success := and(eq(staticcall(gas(), 0x7, 0x7080, 0x60, 0x7080, 0x40), 1), success)mstore(0x70e0, mload(0x7000)) mstore(0x7100, mload(0x7020))mstore(0x7120, mload(0x7080)) mstore(0x7140, mload(0x70a0))success := and(eq(staticcall(gas(), 0x6, 0x70e0, 0x80, 0x70e0, 0x40), 1), success)mstore(0x7160, mload(0x120)) mstore(0x7180, mload(0x140))mstore(0x71a0, mload(0x50a0))success := and(eq(staticcall(gas(), 0x7, 0x7160, 0x60, 0x7160, 0x40), 1), success)mstore(0x71c0, mload(0x70e0)) mstore(0x71e0, mload(0x7100))mstore(0x7200, mload(0x7160)) mstore(0x7220, mload(0x7180))success := and(eq(staticcall(gas(), 0x6, 0x71c0, 0x80, 0x71c0, 0x40), 1), success)mstore(0x7240, mload(0x160)) mstore(0x7260, mload(0x180))mstore(0x7280, mload(0x50c0))success := and(eq(staticcall(gas(), 0x7, 0x7240, 0x60, 0x7240, 0x40), 1), success)mstore(0x72a0, mload(0x71c0)) mstore(0x72c0, mload(0x71e0))mstore(0x72e0, mload(0x7240)) mstore(0x7300, mload(0x7260))success := and(eq(staticcall(gas(), 0x6, 0x72a0, 0x80, 0x72a0, 0x40), 1), success)mstore(0x7320, mload(0x1a0)) mstore(0x7340, mload(0x1c0))mstore(0x7360, mload(0x50e0))success := and(eq(staticcall(gas(), 0x7, 0x7320, 0x60, 0x7320, 0x40), 1), success)mstore(0x7380, mload(0x72a0)) mstore(0x73a0, mload(0x72c0))mstore(0x73c0, mload(0x7320)) mstore(0x73e0, mload(0x7340))success := and(eq(staticcall(gas(), 0x6, 0x7380, 0x80, 0x7380, 0x40), 1), success)mstore(0x7400, mload(0x1e0)) mstore(0x7420, mload(0x200))mstore(0x7440, mload(0x5100))success := and(eq(staticcall(gas(), 0x7, 0x7400, 0x60, 0x7400, 0x40), 1), success)mstore(0x7460, mload(0x7380)) mstore(0x7480, mload(0x73a0))mstore(0x74a0, mload(0x7400)) mstore(0x74c0, mload(0x7420))success := and(eq(staticcall(gas(), 0x6, 0x7460, 0x80, 0x7460, 0x40), 1), success)mstore(0x74e0, mload(0x220)) mstore(0x7500, mload(0x240))mstore(0x7520, mload(0x6360))success := and(eq(staticcall(gas(), 0x7, 0x74e0, 0x60, 0x74e0, 0x40), 1), success)mstore(0x7540, mload(0x7460)) mstore(0x7560, mload(0x7480))mstore(0x7580, mload(0x74e0)) mstore(0x75a0, mload(0x7500))success := and(eq(staticcall(gas(), 0x6, 0x7540, 0x80, 0x7540, 0x40), 1), success)mstore(0x75c0, mload(0x260)) mstore(0x75e0, mload(0x280))mstore(0x7600, mload(0x6380))success := and(eq(staticcall(gas(), 0x7, 0x75c0, 0x60, 0x75c0, 0x40), 1), success)mstore(0x7620, mload(0x7540)) mstore(0x7640, mload(0x7560))mstore(0x7660, mload(0x75c0)) mstore(0x7680, mload(0x75e0))success := and(eq(staticcall(gas(), 0x6, 0x7620, 0x80, 0x7620, 0x40), 1), success)mstore(0x76a0, mload(0x2a0)) mstore(0x76c0, mload(0x2c0))mstore(0x76e0, mload(0x63a0))success := and(eq(staticcall(gas(), 0x7, 0x76a0, 0x60, 0x76a0, 0x40), 1), success)mstore(0x7700, mload(0x7620)) mstore(0x7720, mload(0x7640))mstore(0x7740, mload(0x76a0)) mstore(0x7760, mload(0x76c0))success := and(eq(staticcall(gas(), 0x6, 0x7700, 0x80, 0x7700, 0x40), 1), success)mstore(0x7780, mload(0x380)) mstore(0x77a0, mload(0x3a0))mstore(0x77c0, mload(0x63c0))success := and(eq(staticcall(gas(), 0x7, 0x7780, 0x60, 0x7780, 0x40), 1), success)mstore(0x77e0, mload(0x7700)) mstore(0x7800, mload(0x7720))mstore(0x7820, mload(0x7780)) mstore(0x7840, mload(0x77a0))success := and(eq(staticcall(gas(), 0x6, 0x77e0, 0x80, 0x77e0, 0x40), 1), success)mstore(0x7860, mload(0x400)) mstore(0x7880, mload(0x420))mstore(0x78a0, mload(0x63e0))success := and(eq(staticcall(gas(), 0x7, 0x7860, 0x60, 0x7860, 0x40), 1), success)mstore(0x78c0, mload(0x77e0)) mstore(0x78e0, mload(0x7800))mstore(0x7900, mload(0x7860)) mstore(0x7920, mload(0x7880))success := and(eq(staticcall(gas(), 0x6, 0x78c0, 0x80, 0x78c0, 0x40), 1), success)mstore(0x7940, 0x0d3b7c04b7391ddf5d9fc5f8906033e1d1442f341c4cab5c1584c8082ea8c21c) mstore(0x7960, 0x1596df7247ab32fb79261c31617e2f2bbde95b6e8719386dacfeaa8f6d7df60c)mstore(0x7980, mload(0x6400))success := and(eq(staticcall(gas(), 0x7, 0x7940, 0x60, 0x7940, 0x40), 1), success)mstore(0x79a0, mload(0x78c0)) mstore(0x79c0, mload(0x78e0))mstore(0x79e0, mload(0x7940)) mstore(0x7a00, mload(0x7960))success := and(eq(staticcall(gas(), 0x6, 0x79a0, 0x80, 0x79a0, 0x40), 1), success)mstore(0x7a20, 0x04d043081f0d55eead6d8ad7b10d09a6ee2718f445d9bce454075a8a37bacaf3) mstore(0x7a40, 0x27d6bcbb02cd624ab80b5532a0a65fc6f88a0faf7cf3e0d106f4aa0aa25e758b)mstore(0x7a60, mload(0x6420))success := and(eq(staticcall(gas(), 0x7, 0x7a20, 0x60, 0x7a20, 0x40), 1), success)mstore(0x7a80, mload(0x79a0)) mstore(0x7aa0, mload(0x79c0))mstore(0x7ac0, mload(0x7a20)) mstore(0x7ae0, mload(0x7a40))success := and(eq(staticcall(gas(), 0x6, 0x7a80, 0x80, 0x7a80, 0x40), 1), success)mstore(0x7b00, 0x2d07a1bca289cdb98b648a91cbb0809dfa3a06fe01047b291d1161ddf8d1732c) mstore(0x7b20, 0x021d078d5869c57b3fe2413b517561205de5f297ac56c0e5ef0f1a7f4a31ee94)mstore(0x7b40, mload(0x6440))success := and(eq(staticcall(gas(), 0x7, 0x7b00, 0x60, 0x7b00, 0x40), 1), success)mstore(0x7b60, mload(0x7a80)) mstore(0x7b80, mload(0x7aa0))mstore(0x7ba0, mload(0x7b00)) mstore(0x7bc0, mload(0x7b20))success := and(eq(staticcall(gas(), 0x6, 0x7b60, 0x80, 0x7b60, 0x40), 1), success)mstore(0x7be0, 0x2808de5f33581574dd857304add28f30335fa32c49a3d7c9128f5a3f453360cc) mstore(0x7c00, 0x07f10d421231cb6aa063db7a3cf7be709ff037fbb78d19c866d7c2c674a1aaf0)mstore(0x7c20, mload(0x6460))success := and(eq(staticcall(gas(), 0x7, 0x7be0, 0x60, 0x7be0, 0x40), 1), success)mstore(0x7c40, mload(0x7b60)) mstore(0x7c60, mload(0x7b80))mstore(0x7c80, mload(0x7be0)) mstore(0x7ca0, mload(0x7c00))success := and(eq(staticcall(gas(), 0x6, 0x7c40, 0x80, 0x7c40, 0x40), 1), success)mstore(0x7cc0, 0x2a9d8bc0a06a141e47fa114e4e62686823227f5416f19f9b2b54b9948a0bfb4b) mstore(0x7ce0, 0x170610ca7497030a3dbbfeb52cc8f5f086e7a7a91e3b52e44988e6b24f1c6c34)mstore(0x7d00, mload(0x6480))success := and(eq(staticcall(gas(), 0x7, 0x7cc0, 0x60, 0x7cc0, 0x40), 1), success)mstore(0x7d20, mload(0x7c40)) mstore(0x7d40, mload(0x7c60))mstore(0x7d60, mload(0x7cc0)) mstore(0x7d80, mload(0x7ce0))success := and(eq(staticcall(gas(), 0x6, 0x7d20, 0x80, 0x7d20, 0x40), 1), success)mstore(0x7da0, 0x104eb8e796d7c0b0ac9eb316eac3aadbcf9ac5b42d4b14a95ec269fefd70d9ac) mstore(0x7dc0, 0x22e1365078923b7f828a54c75e0b0b108c311580bac730c92d8868c7781a917b)mstore(0x7de0, mload(0x64a0))success := and(eq(staticcall(gas(), 0x7, 0x7da0, 0x60, 0x7da0, 0x40), 1), success)mstore(0x7e00, mload(0x7d20)) mstore(0x7e20, mload(0x7d40))mstore(0x7e40, mload(0x7da0)) mstore(0x7e60, mload(0x7dc0))success := and(eq(staticcall(gas(), 0x6, 0x7e00, 0x80, 0x7e00, 0x40), 1), success)mstore(0x7e80, 0x2e8f499835598c80e2ec4cabd4753e67822df35d0a29c05b60dca21d9173b11a) mstore(0x7ea0, 0x02990fa09b4831443e5956b84832f525976cd30aa6cafe055a45f7a04328d00f)mstore(0x7ec0, mload(0x64c0))success := and(eq(staticcall(gas(), 0x7, 0x7e80, 0x60, 0x7e80, 0x40), 1), success)mstore(0x7ee0, mload(0x7e00)) mstore(0x7f00, mload(0x7e20))mstore(0x7f20, mload(0x7e80)) mstore(0x7f40, mload(0x7ea0))success := and(eq(staticcall(gas(), 0x6, 0x7ee0, 0x80, 0x7ee0, 0x40), 1), success)mstore(0x7f60, 0x258bbf1a0f256c29c1cee612fb7deaa2102870b85d7bda1ac8064307a593101f) mstore(0x7f80, 0x2bbbde7d34cf03b70ea4a0125d6736aeb56da64f07226bf4d662a85e8d50db3a)mstore(0x7fa0, mload(0x64e0))success := and(eq(staticcall(gas(), 0x7, 0x7f60, 0x60, 0x7f60, 0x40), 1), success)mstore(0x7fc0, mload(0x7ee0)) mstore(0x7fe0, mload(0x7f00))mstore(0x8000, mload(0x7f60)) mstore(0x8020, mload(0x7f80))success := and(eq(staticcall(gas(), 0x6, 0x7fc0, 0x80, 0x7fc0, 0x40), 1), success)mstore(0x8040, 0x05127b4a2ff58c747435761c7256b8094a0cf4e6d0f829a060c601d5cce0fdc0) mstore(0x8060, 0x106a8cecab556f1a6d729cdeefd6dd70afbe4954cae4785871d68396dba88d95)mstore(0x8080, mload(0x6500))success := and(eq(staticcall(gas(), 0x7, 0x8040, 0x60, 0x8040, 0x40), 1), success)mstore(0x80a0, mload(0x7fc0)) mstore(0x80c0, mload(0x7fe0))mstore(0x80e0, mload(0x8040)) mstore(0x8100, mload(0x8060))success := and(eq(staticcall(gas(), 0x6, 0x80a0, 0x80, 0x80a0, 0x40), 1), success)mstore(0x8120, 0x24c985411f901ba3e9fe3296d58db7a896d53a060afc4c3b85182122d2a06b16) mstore(0x8140, 0x1e02136b244f617c37779b0cb970dce25ff03579c671e7f3f57a320e7b1a4b06)mstore(0x8160, mload(0x6520))success := and(eq(staticcall(gas(), 0x7, 0x8120, 0x60, 0x8120, 0x40), 1), success)mstore(0x8180, mload(0x80a0)) mstore(0x81a0, mload(0x80c0))mstore(0x81c0, mload(0x8120)) mstore(0x81e0, mload(0x8140))success := and(eq(staticcall(gas(), 0x6, 0x8180, 0x80, 0x8180, 0x40), 1), success)mstore(0x8200, 0x0e5c5a486399e328a6629926a042fde07863ce1a2e91995ee60e5c477008ebdc) mstore(0x8220, 0x223b4bdd8d3877955728258fd5be1b7f2ac8093891a83c738f80395720cc55ca)mstore(0x8240, mload(0x6540))success := and(eq(staticcall(gas(), 0x7, 0x8200, 0x60, 0x8200, 0x40), 1), success)mstore(0x8260, mload(0x8180)) mstore(0x8280, mload(0x81a0))mstore(0x82a0, mload(0x8200)) mstore(0x82c0, mload(0x8220))success := and(eq(staticcall(gas(), 0x6, 0x8260, 0x80, 0x8260, 0x40), 1), success)mstore(0x82e0, 0x2e55f008e10b629fc37b0808b8264d2857e6fa34a1be704a4132f9c1621b8736) mstore(0x8300, 0x01c3487db12618c270ffe8251633753bdad9fd2968144a02b18447bee326d19d)mstore(0x8320, mload(0x6560))success := and(eq(staticcall(gas(), 0x7, 0x82e0, 0x60, 0x82e0, 0x40), 1), success)mstore(0x8340, mload(0x8260)) mstore(0x8360, mload(0x8280))mstore(0x8380, mload(0x82e0)) mstore(0x83a0, mload(0x8300))success := and(eq(staticcall(gas(), 0x6, 0x8340, 0x80, 0x8340, 0x40), 1), success)mstore(0x83c0, 0x0154bffa5c54063b60c4f4c66b2a9acb09fd7f1b2653a9f2b9ee75bcb1bc8ba2) mstore(0x83e0, 0x0b15f039df5ebe088e2231ce9a07c50dbb4739402712b56dd8bab6ab93a95f3f)mstore(0x8400, mload(0x6580))success := and(eq(staticcall(gas(), 0x7, 0x83c0, 0x60, 0x83c0, 0x40), 1), success)mstore(0x8420, mload(0x8340)) mstore(0x8440, mload(0x8360))mstore(0x8460, mload(0x83c0)) mstore(0x8480, mload(0x83e0))success := and(eq(staticcall(gas(), 0x6, 0x8420, 0x80, 0x8420, 0x40), 1), success)mstore(0x84a0, 0x0032a37f146820eccad7796039d21d0c85504baff34e194f750d7f8c4eccf729) mstore(0x84c0, 0x2a655340cddc523abd37c3d77f022b8e616194a3c31e414dc5d466eb2e4c0b69)mstore(0x84e0, mload(0x65a0))success := and(eq(staticcall(gas(), 0x7, 0x84a0, 0x60, 0x84a0, 0x40), 1), success)mstore(0x8500, mload(0x8420)) mstore(0x8520, mload(0x8440))mstore(0x8540, mload(0x84a0)) mstore(0x8560, mload(0x84c0))success := and(eq(staticcall(gas(), 0x6, 0x8500, 0x80, 0x8500, 0x40), 1), success)mstore(0x8580, 0x0d6b367e25327ebd99fae2aaffa6fad2acae34ba7b329ef817a95fe425f65e4d) mstore(0x85a0, 0x2bc4769ce00a494fde791f07b3f092019995d323c0b067d61e0660e1ad84d94f)mstore(0x85c0, mload(0x65c0))success := and(eq(staticcall(gas(), 0x7, 0x8580, 0x60, 0x8580, 0x40), 1), success)mstore(0x85e0, mload(0x8500)) mstore(0x8600, mload(0x8520))mstore(0x8620, mload(0x8580)) mstore(0x8640, mload(0x85a0))success := and(eq(staticcall(gas(), 0x6, 0x85e0, 0x80, 0x85e0, 0x40), 1), success)mstore(0x8660, 0x0fef43d29ecdb947fc934c7adf7f38748fe212082d5a8e3bc621ff907213812b) mstore(0x8680, 0x1ab8ccbb8486a5508a34837db62c3426d6f6210970a2b1351f12d0ba73e11874)mstore(0x86a0, mload(0x65e0))success := and(eq(staticcall(gas(), 0x7, 0x8660, 0x60, 0x8660, 0x40), 1), success)mstore(0x86c0, mload(0x85e0)) mstore(0x86e0, mload(0x8600))mstore(0x8700, mload(0x8660)) mstore(0x8720, mload(0x8680))success := and(eq(staticcall(gas(), 0x6, 0x86c0, 0x80, 0x86c0, 0x40), 1), success)mstore(0x8740, 0x29cc03da3870fc7139115d43275baf04cc110d79f85d2c2e712b981c409df25e) mstore(0x8760, 0x016a8cd002e522595ef910f87dc707449ae5f56876eb88274b2e586fceacf165)mstore(0x8780, mload(0x6600))success := and(eq(staticcall(gas(), 0x7, 0x8740, 0x60, 0x8740, 0x40), 1), success)mstore(0x87a0, mload(0x86c0)) mstore(0x87c0, mload(0x86e0))mstore(0x87e0, mload(0x8740)) mstore(0x8800, mload(0x8760))success := and(eq(staticcall(gas(), 0x6, 0x87a0, 0x80, 0x87a0, 0x40), 1), success)mstore(0x8820, 0x0ec6d72e2ce7c233ca8af2fc2bd4223a6d81d545e8785579de4cb241740f36a2) mstore(0x8840, 0x028a4450999577e25fc7d191fecf7f1a8a0526f7e042f316767c7ff43299fdd9)mstore(0x8860, mload(0x6620))success := and(eq(staticcall(gas(), 0x7, 0x8820, 0x60, 0x8820, 0x40), 1), success)mstore(0x8880, mload(0x87a0)) mstore(0x88a0, mload(0x87c0))mstore(0x88c0, mload(0x8820)) mstore(0x88e0, mload(0x8840))success := and(eq(staticcall(gas(), 0x6, 0x8880, 0x80, 0x8880, 0x40), 1), success)mstore(0x8900, 0x1fdb57cefe9c10024dfe402759cad8061e8d0edeba3f42f187ea796b1938118e) mstore(0x8920, 0x1294d92ed67eec88a2adbb5cef0682a64fae9827c02d37e69beaddd3b6a145ad)mstore(0x8940, mload(0x6640))success := and(eq(staticcall(gas(), 0x7, 0x8900, 0x60, 0x8900, 0x40), 1), success)mstore(0x8960, mload(0x8880)) mstore(0x8980, mload(0x88a0))mstore(0x89a0, mload(0x8900)) mstore(0x89c0, mload(0x8920))success := and(eq(staticcall(gas(), 0x6, 0x8960, 0x80, 0x8960, 0x40), 1), success)mstore(0x89e0, 0x292267e75402bf3fb816d404fe987ec7b277ec539cd653568a31dc8fdd04b6f1) mstore(0x8a00, 0x0a2975f29c8f29df52ea4e941daa28752eea2da8c6b6135622e4a0d823accd78)mstore(0x8a20, mload(0x6660))success := and(eq(staticcall(gas(), 0x7, 0x89e0, 0x60, 0x89e0, 0x40), 1), success)mstore(0x8a40, mload(0x8960)) mstore(0x8a60, mload(0x8980))mstore(0x8a80, mload(0x89e0)) mstore(0x8aa0, mload(0x8a00))success := and(eq(staticcall(gas(), 0x6, 0x8a40, 0x80, 0x8a40, 0x40), 1), success)mstore(0x8ac0, mload(0x7a0)) mstore(0x8ae0, mload(0x7c0))mstore(0x8b00, mload(0x6680))success := and(eq(staticcall(gas(), 0x7, 0x8ac0, 0x60, 0x8ac0, 0x40), 1), success)mstore(0x8b20, mload(0x8a40)) mstore(0x8b40, mload(0x8a60))mstore(0x8b60, mload(0x8ac0)) mstore(0x8b80, mload(0x8ae0))success := and(eq(staticcall(gas(), 0x6, 0x8b20, 0x80, 0x8b20, 0x40), 1), success)mstore(0x8ba0, mload(0x7e0)) mstore(0x8bc0, mload(0x800))mstore(0x8be0, mload(0x66a0))success := and(eq(staticcall(gas(), 0x7, 0x8ba0, 0x60, 0x8ba0, 0x40), 1), success)mstore(0x8c00, mload(0x8b20)) mstore(0x8c20, mload(0x8b40))mstore(0x8c40, mload(0x8ba0)) mstore(0x8c60, mload(0x8bc0))success := and(eq(staticcall(gas(), 0x6, 0x8c00, 0x80, 0x8c00, 0x40), 1), success)mstore(0x8c80, mload(0x820)) mstore(0x8ca0, mload(0x840))mstore(0x8cc0, mload(0x66c0))success := and(eq(staticcall(gas(), 0x7, 0x8c80, 0x60, 0x8c80, 0x40), 1), success)mstore(0x8ce0, mload(0x8c00)) mstore(0x8d00, mload(0x8c20))mstore(0x8d20, mload(0x8c80)) mstore(0x8d40, mload(0x8ca0))success := and(eq(staticcall(gas(), 0x6, 0x8ce0, 0x80, 0x8ce0, 0x40), 1), success)mstore(0x8d60, mload(0x700)) mstore(0x8d80, mload(0x720))mstore(0x8da0, mload(0x66e0))success := and(eq(staticcall(gas(), 0x7, 0x8d60, 0x60, 0x8d60, 0x40), 1), success)mstore(0x8dc0, mload(0x8ce0)) mstore(0x8de0, mload(0x8d00))mstore(0x8e00, mload(0x8d60)) mstore(0x8e20, mload(0x8d80))success := and(eq(staticcall(gas(), 0x6, 0x8dc0, 0x80, 0x8dc0, 0x40), 1), success)mstore(0x8e40, mload(0x500)) mstore(0x8e60, mload(0x520))mstore(0x8e80, mload(0x6a60))success := and(eq(staticcall(gas(), 0x7, 0x8e40, 0x60, 0x8e40, 0x40), 1), success)mstore(0x8ea0, mload(0x8dc0)) mstore(0x8ec0, mload(0x8de0))mstore(0x8ee0, mload(0x8e40)) mstore(0x8f00, mload(0x8e60))success := and(eq(staticcall(gas(), 0x6, 0x8ea0, 0x80, 0x8ea0, 0x40), 1), success)mstore(0x8f20, mload(0x540)) mstore(0x8f40, mload(0x560))mstore(0x8f60, mload(0x6a80))success := and(eq(staticcall(gas(), 0x7, 0x8f20, 0x60, 0x8f20, 0x40), 1), success)mstore(0x8f80, mload(0x8ea0)) mstore(0x8fa0, mload(0x8ec0))mstore(0x8fc0, mload(0x8f20)) mstore(0x8fe0, mload(0x8f40))success := and(eq(staticcall(gas(), 0x6, 0x8f80, 0x80, 0x8f80, 0x40), 1), success)mstore(0x9000, mload(0x580)) mstore(0x9020, mload(0x5a0))mstore(0x9040, mload(0x6aa0))success := and(eq(staticcall(gas(), 0x7, 0x9000, 0x60, 0x9000, 0x40), 1), success)mstore(0x9060, mload(0x8f80)) mstore(0x9080, mload(0x8fa0))mstore(0x90a0, mload(0x9000)) mstore(0x90c0, mload(0x9020))success := and(eq(staticcall(gas(), 0x6, 0x9060, 0x80, 0x9060, 0x40), 1), success)mstore(0x90e0, mload(0x5c0)) mstore(0x9100, mload(0x5e0))mstore(0x9120, mload(0x6ac0))success := and(eq(staticcall(gas(), 0x7, 0x90e0, 0x60, 0x90e0, 0x40), 1), success)mstore(0x9140, mload(0x9060)) mstore(0x9160, mload(0x9080))mstore(0x9180, mload(0x90e0)) mstore(0x91a0, mload(0x9100))success := and(eq(staticcall(gas(), 0x6, 0x9140, 0x80, 0x9140, 0x40), 1), success)mstore(0x91c0, mload(0x600)) mstore(0x91e0, mload(0x620))mstore(0x9200, mload(0x6ae0))success := and(eq(staticcall(gas(), 0x7, 0x91c0, 0x60, 0x91c0, 0x40), 1), success)mstore(0x9220, mload(0x9140)) mstore(0x9240, mload(0x9160))mstore(0x9260, mload(0x91c0)) mstore(0x9280, mload(0x91e0))success := and(eq(staticcall(gas(), 0x6, 0x9220, 0x80, 0x9220, 0x40), 1), success)mstore(0x92a0, mload(0x640)) mstore(0x92c0, mload(0x660))mstore(0x92e0, mload(0x6d20))success := and(eq(staticcall(gas(), 0x7, 0x92a0, 0x60, 0x92a0, 0x40), 1), success)mstore(0x9300, mload(0x9220)) mstore(0x9320, mload(0x9240))mstore(0x9340, mload(0x92a0)) mstore(0x9360, mload(0x92c0))success := and(eq(staticcall(gas(), 0x6, 0x9300, 0x80, 0x9300, 0x40), 1), success)mstore(0x9380, mload(0x680)) mstore(0x93a0, mload(0x6a0))mstore(0x93c0, mload(0x6d40))success := and(eq(staticcall(gas(), 0x7, 0x9380, 0x60, 0x9380, 0x40), 1), success)mstore(0x93e0, mload(0x9300)) mstore(0x9400, mload(0x9320))mstore(0x9420, mload(0x9380)) mstore(0x9440, mload(0x93a0))success := and(eq(staticcall(gas(), 0x6, 0x93e0, 0x80, 0x93e0, 0x40), 1), success)mstore(0x9460, mload(0x6c0)) mstore(0x9480, mload(0x6e0))mstore(0x94a0, mload(0x6d60))success := and(eq(staticcall(gas(), 0x7, 0x9460, 0x60, 0x9460, 0x40), 1), success)mstore(0x94c0, mload(0x93e0)) mstore(0x94e0, mload(0x9400))mstore(0x9500, mload(0x9460)) mstore(0x9520, mload(0x9480))success := and(eq(staticcall(gas(), 0x6, 0x94c0, 0x80, 0x94c0, 0x40), 1), success)mstore(0x9540, mload(0x340)) mstore(0x9560, mload(0x360))mstore(0x9580, mload(0x6f00))success := and(eq(staticcall(gas(), 0x7, 0x9540, 0x60, 0x9540, 0x40), 1), success)mstore(0x95a0, mload(0x94c0)) mstore(0x95c0, mload(0x94e0))mstore(0x95e0, mload(0x9540)) mstore(0x9600, mload(0x9560))success := and(eq(staticcall(gas(), 0x6, 0x95a0, 0x80, 0x95a0, 0x40), 1), success)mstore(0x9620, mload(0x3c0)) mstore(0x9640, mload(0x3e0))mstore(0x9660, mload(0x6f20))success := and(eq(staticcall(gas(), 0x7, 0x9620, 0x60, 0x9620, 0x40), 1), success)mstore(0x9680, mload(0x95a0)) mstore(0x96a0, mload(0x95c0))mstore(0x96c0, mload(0x9620)) mstore(0x96e0, mload(0x9640))success := and(eq(staticcall(gas(), 0x6, 0x9680, 0x80, 0x9680, 0x40), 1), success)mstore(0x9700, mload(0x1300)) mstore(0x9720, mload(0x1320))mstore(0x9740, sub(f_q, mload(0x6f60)))success := and(eq(staticcall(gas(), 0x7, 0x9700, 0x60, 0x9700, 0x40), 1), success)mstore(0x9760, mload(0x9680)) mstore(0x9780, mload(0x96a0))mstore(0x97a0, mload(0x9700)) mstore(0x97c0, mload(0x9720))success := and(eq(staticcall(gas(), 0x6, 0x9760, 0x80, 0x9760, 0x40), 1), success)mstore(0x97e0, mload(0x13a0)) mstore(0x9800, mload(0x13c0))mstore(0x9820, mload(0x6f80))success := and(eq(staticcall(gas(), 0x7, 0x97e0, 0x60, 0x97e0, 0x40), 1), success)mstore(0x9840, mload(0x9760)) mstore(0x9860, mload(0x9780))mstore(0x9880, mload(0x97e0)) mstore(0x98a0, mload(0x9800))success := and(eq(staticcall(gas(), 0x6, 0x9840, 0x80, 0x9840, 0x40), 1), success)mstore(0x98c0, mload(0x9840)) mstore(0x98e0, mload(0x9860))mstore(0x9900, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(0x9920, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(0x9940, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(0x9960, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(0x9980, mload(0x13a0)) mstore(0x99a0, mload(0x13c0))mstore(0x99c0, 0x0181624e80f3d6ae28df7e01eaeab1c0e919877a3b8a6b7fbc69a6817d596ea2) mstore(0x99e0, 0x1783d30dcb12d259bb89098addf6280fa4b653be7a152542a28f7b926e27e648) mstore(0x9a00, 0x00ae44489d41a0d179e2dfdc03bddd883b7109f8b6ae316a59e815c1a6b35304) mstore(0x9a20, 0x0b2147ab62a386bd63e6de1522109b8c9588ab466f5aadfde8c41ca3749423ee)success := and(eq(staticcall(gas(), 0x8, 0x98c0, 0x180, 0x98c0, 0x20), 1), success)success := and(eq(mload(0x98c0), 1), success) // Revert if anything fails if iszero(success) { revert(0, 0) }} return success; } } + assembly { } { 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(0x80, 697977589985395630139925574281256772762542249956921372363329126037282444860) { let x := calldataload(0x64) mstore(0xc0, x) let y := calldataload(0x84) mstore(0xe0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xa4) mstore(0x100, x) let y := calldataload(0xc4) mstore(0x120, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xe4) mstore(0x140, x) let y := calldataload(0x104) mstore(0x160, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x124) mstore(0x180, x) let y := calldataload(0x144) mstore(0x1a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x164) mstore(0x1c0, x) let y := calldataload(0x184) mstore(0x1e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1a4) mstore(0x200, x) let y := calldataload(0x1c4) mstore(0x220, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1e4) mstore(0x240, x) let y := calldataload(0x204) mstore(0x260, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x224) mstore(0x280, x) let y := calldataload(0x244) mstore(0x2a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x264) mstore(0x2c0, x) let y := calldataload(0x284) mstore(0x2e0, y) success := and(validate_ec_point(x, y), success) }mstore(0x300, keccak256(0x80, 640)){ let hash := mload(0x300) mstore(0x320, mod(hash, f_q)) mstore(0x340, hash) } { let x := calldataload(0x2a4) mstore(0x360, x) let y := calldataload(0x2c4) mstore(0x380, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x2e4) mstore(0x3a0, x) let y := calldataload(0x304) mstore(0x3c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x324) mstore(0x3e0, x) let y := calldataload(0x344) mstore(0x400, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x364) mstore(0x420, x) let y := calldataload(0x384) mstore(0x440, y) success := and(validate_ec_point(x, y), success) }mstore(0x460, keccak256(0x340, 288)){ let hash := mload(0x460) mstore(0x480, mod(hash, f_q)) mstore(0x4a0, hash) }mstore8(0x4c0, 1)mstore(0x4c0, keccak256(0x4a0, 33)){ let hash := mload(0x4c0) mstore(0x4e0, mod(hash, f_q)) mstore(0x500, hash) } { let x := calldataload(0x3a4) mstore(0x520, x) let y := calldataload(0x3c4) mstore(0x540, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x3e4) mstore(0x560, x) let y := calldataload(0x404) mstore(0x580, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x424) mstore(0x5a0, x) let y := calldataload(0x444) mstore(0x5c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x464) mstore(0x5e0, x) let y := calldataload(0x484) mstore(0x600, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4a4) mstore(0x620, x) let y := calldataload(0x4c4) mstore(0x640, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4e4) mstore(0x660, x) let y := calldataload(0x504) mstore(0x680, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x524) mstore(0x6a0, x) let y := calldataload(0x544) mstore(0x6c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x564) mstore(0x6e0, x) let y := calldataload(0x584) mstore(0x700, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x5a4) mstore(0x720, x) let y := calldataload(0x5c4) mstore(0x740, y) success := and(validate_ec_point(x, y), success) }mstore(0x760, keccak256(0x500, 608)){ let hash := mload(0x760) mstore(0x780, mod(hash, f_q)) mstore(0x7a0, hash) } { let x := calldataload(0x5e4) mstore(0x7c0, x) let y := calldataload(0x604) mstore(0x7e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x624) mstore(0x800, x) let y := calldataload(0x644) mstore(0x820, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x664) mstore(0x840, x) let y := calldataload(0x684) mstore(0x860, y) success := and(validate_ec_point(x, y), success) }mstore(0x880, keccak256(0x7a0, 224)){ let hash := mload(0x880) mstore(0x8a0, mod(hash, f_q)) mstore(0x8c0, hash) }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, mod(calldataload(0xc04), f_q))mstore(0xe60, mod(calldataload(0xc24), f_q))mstore(0xe80, mod(calldataload(0xc44), f_q))mstore(0xea0, mod(calldataload(0xc64), f_q))mstore(0xec0, mod(calldataload(0xc84), f_q))mstore(0xee0, mod(calldataload(0xca4), f_q))mstore(0xf00, mod(calldataload(0xcc4), f_q))mstore(0xf20, mod(calldataload(0xce4), f_q))mstore(0xf40, mod(calldataload(0xd04), f_q))mstore(0xf60, mod(calldataload(0xd24), f_q))mstore(0xf80, mod(calldataload(0xd44), f_q))mstore(0xfa0, mod(calldataload(0xd64), f_q))mstore(0xfc0, mod(calldataload(0xd84), f_q))mstore(0xfe0, mod(calldataload(0xda4), f_q))mstore(0x1000, mod(calldataload(0xdc4), f_q))mstore(0x1020, mod(calldataload(0xde4), f_q))mstore(0x1040, mod(calldataload(0xe04), f_q))mstore(0x1060, mod(calldataload(0xe24), f_q))mstore(0x1080, mod(calldataload(0xe44), f_q))mstore(0x10a0, mod(calldataload(0xe64), f_q))mstore(0x10c0, mod(calldataload(0xe84), f_q))mstore(0x10e0, mod(calldataload(0xea4), f_q))mstore(0x1100, mod(calldataload(0xec4), f_q))mstore(0x1120, mod(calldataload(0xee4), f_q))mstore(0x1140, mod(calldataload(0xf04), f_q))mstore(0x1160, mod(calldataload(0xf24), f_q))mstore(0x1180, mod(calldataload(0xf44), f_q))mstore(0x11a0, mod(calldataload(0xf64), f_q))mstore(0x11c0, mod(calldataload(0xf84), f_q))mstore(0x11e0, mod(calldataload(0xfa4), f_q))mstore(0x1200, mod(calldataload(0xfc4), f_q))mstore(0x1220, mod(calldataload(0xfe4), f_q))mstore(0x1240, mod(calldataload(0x1004), f_q))mstore(0x1260, keccak256(0x8c0, 2464)){ let hash := mload(0x1260) mstore(0x1280, mod(hash, f_q)) mstore(0x12a0, hash) }mstore8(0x12c0, 1)mstore(0x12c0, keccak256(0x12a0, 33)){ let hash := mload(0x12c0) mstore(0x12e0, mod(hash, f_q)) mstore(0x1300, hash) } { let x := calldataload(0x1024) mstore(0x1320, x) let y := calldataload(0x1044) mstore(0x1340, y) success := and(validate_ec_point(x, y), success) }mstore(0x1360, keccak256(0x1300, 96)){ let hash := mload(0x1360) mstore(0x1380, mod(hash, f_q)) mstore(0x13a0, hash) } { let x := calldataload(0x1064) mstore(0x13c0, x) let y := calldataload(0x1084) mstore(0x13e0, y) success := and(validate_ec_point(x, y), success) }mstore(0x1400, mulmod(mload(0x8a0), mload(0x8a0), f_q))mstore(0x1420, mulmod(mload(0x1400), mload(0x1400), f_q))mstore(0x1440, mulmod(mload(0x1420), mload(0x1420), f_q))mstore(0x1460, mulmod(mload(0x1440), mload(0x1440), f_q))mstore(0x1480, mulmod(mload(0x1460), mload(0x1460), f_q))mstore(0x14a0, mulmod(mload(0x1480), mload(0x1480), f_q))mstore(0x14c0, mulmod(mload(0x14a0), mload(0x14a0), f_q))mstore(0x14e0, mulmod(mload(0x14c0), mload(0x14c0), f_q))mstore(0x1500, mulmod(mload(0x14e0), mload(0x14e0), f_q))mstore(0x1520, mulmod(mload(0x1500), mload(0x1500), f_q))mstore(0x1540, mulmod(mload(0x1520), mload(0x1520), f_q))mstore(0x1560, mulmod(mload(0x1540), mload(0x1540), f_q))mstore(0x1580, mulmod(mload(0x1560), mload(0x1560), f_q))mstore(0x15a0, mulmod(mload(0x1580), mload(0x1580), f_q))mstore(0x15c0, mulmod(mload(0x15a0), mload(0x15a0), f_q))mstore(0x15e0, mulmod(mload(0x15c0), mload(0x15c0), f_q))mstore(0x1600, mulmod(mload(0x15e0), mload(0x15e0), f_q))mstore(0x1620, mulmod(mload(0x1600), mload(0x1600), f_q))mstore(0x1640, mulmod(mload(0x1620), mload(0x1620), f_q))mstore(0x1660, mulmod(mload(0x1640), mload(0x1640), f_q))mstore(0x1680, mulmod(mload(0x1660), mload(0x1660), f_q))mstore(0x16a0, mulmod(mload(0x1680), mload(0x1680), f_q))mstore(0x16c0, addmod(mload(0x16a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(0x16e0, mulmod(mload(0x16c0), 21888237653275510688422624196183639687472264873923820041627027729598873448513, f_q))mstore(0x1700, mulmod(mload(0x16e0), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x1720, addmod(mload(0x8a0), 8662456992307693229192232929891638461323994988937738840793806641202669341572, f_q))mstore(0x1740, mulmod(mload(0x16e0), 10939663269433627367777756708678102241564365262857670666700619874077960926249, f_q))mstore(0x1760, addmod(mload(0x8a0), 10948579602405647854468649036579172846983999137558363676997584312497847569368, f_q))mstore(0x1780, mulmod(mload(0x16e0), 11016257578652593686382655500910603527869149377564754001549454008164059876499, f_q))mstore(0x17a0, addmod(mload(0x8a0), 10871985293186681535863750244346671560679215022851280342148750178411748619118, f_q))mstore(0x17c0, mulmod(mload(0x16e0), 15402826414547299628414612080036060696555554914079673875872749760617770134879, f_q))mstore(0x17e0, addmod(mload(0x8a0), 6485416457291975593831793665221214391992809486336360467825454425958038360738, f_q))mstore(0x1800, mulmod(mload(0x16e0), 21710372849001950800533397158415938114909991150039389063546734567764856596059, f_q))mstore(0x1820, addmod(mload(0x8a0), 177870022837324421713008586841336973638373250376645280151469618810951899558, f_q))mstore(0x1840, mulmod(mload(0x16e0), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q))mstore(0x1860, addmod(mload(0x8a0), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q))mstore(0x1880, mulmod(mload(0x16e0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x18a0, addmod(mload(0x8a0), 13154116519010929542673167886091370382741775939114889923107781597533678454429, f_q))mstore(0x18c0, mulmod(mload(0x16e0), 1, f_q))mstore(0x18e0, addmod(mload(0x8a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)){ let prod := mload(0x1720) prod := mulmod(mload(0x1760), prod, f_q) mstore(0x1900, prod) prod := mulmod(mload(0x17a0), prod, f_q) mstore(0x1920, prod) prod := mulmod(mload(0x17e0), prod, f_q) mstore(0x1940, prod) prod := mulmod(mload(0x1820), prod, f_q) mstore(0x1960, prod) prod := mulmod(mload(0x1860), prod, f_q) mstore(0x1980, prod) prod := mulmod(mload(0x18a0), prod, f_q) mstore(0x19a0, prod) prod := mulmod(mload(0x18e0), prod, f_q) mstore(0x19c0, prod) prod := mulmod(mload(0x16c0), prod, f_q) mstore(0x19e0, prod) }mstore(0x1a20, 32)mstore(0x1a40, 32)mstore(0x1a60, 32)mstore(0x1a80, mload(0x19e0))mstore(0x1aa0, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x1ac0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x1a20, 0xc0, 0x1a00, 0x20), 1), success){ let inv := mload(0x1a00) let v v := mload(0x16c0) mstore(0x16c0, mulmod(mload(0x19c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18e0) mstore(0x18e0, mulmod(mload(0x19a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18a0) mstore(0x18a0, mulmod(mload(0x1980), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1860) mstore(0x1860, mulmod(mload(0x1960), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1820) mstore(0x1820, mulmod(mload(0x1940), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x17e0) mstore(0x17e0, mulmod(mload(0x1920), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x17a0) mstore(0x17a0, mulmod(mload(0x1900), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1760) mstore(0x1760, mulmod(mload(0x1720), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x1720, inv) }mstore(0x1ae0, mulmod(mload(0x1700), mload(0x1720), f_q))mstore(0x1b00, mulmod(mload(0x1740), mload(0x1760), f_q))mstore(0x1b20, mulmod(mload(0x1780), mload(0x17a0), f_q))mstore(0x1b40, mulmod(mload(0x17c0), mload(0x17e0), f_q))mstore(0x1b60, mulmod(mload(0x1800), mload(0x1820), f_q))mstore(0x1b80, mulmod(mload(0x1840), mload(0x1860), f_q))mstore(0x1ba0, mulmod(mload(0x1880), mload(0x18a0), f_q))mstore(0x1bc0, mulmod(mload(0x18c0), mload(0x18e0), f_q)){ let result := mulmod(mload(0x1bc0), mload(0xa0), f_q)mstore(0x1be0, result) }mstore(0x1c00, mulmod(mload(0x920), mload(0x900), f_q))mstore(0x1c20, addmod(mload(0x8e0), mload(0x1c00), f_q))mstore(0x1c40, addmod(mload(0x1c20), sub(f_q, mload(0x940)), f_q))mstore(0x1c60, mulmod(mload(0x1c40), mload(0xcc0), f_q))mstore(0x1c80, mulmod(mload(0x780), mload(0x1c60), f_q))mstore(0x1ca0, mulmod(mload(0x9a0), mload(0x980), f_q))mstore(0x1cc0, addmod(mload(0x960), mload(0x1ca0), f_q))mstore(0x1ce0, addmod(mload(0x1cc0), sub(f_q, mload(0x9c0)), f_q))mstore(0x1d00, mulmod(mload(0x1ce0), mload(0xce0), f_q))mstore(0x1d20, addmod(mload(0x1c80), mload(0x1d00), f_q))mstore(0x1d40, mulmod(mload(0x780), mload(0x1d20), f_q))mstore(0x1d60, mulmod(mload(0xa20), mload(0xa00), f_q))mstore(0x1d80, addmod(mload(0x9e0), mload(0x1d60), f_q))mstore(0x1da0, addmod(mload(0x1d80), sub(f_q, mload(0xa40)), f_q))mstore(0x1dc0, mulmod(mload(0x1da0), mload(0xd00), f_q))mstore(0x1de0, addmod(mload(0x1d40), mload(0x1dc0), f_q))mstore(0x1e00, mulmod(mload(0x780), mload(0x1de0), f_q))mstore(0x1e20, mulmod(mload(0xaa0), mload(0xa80), f_q))mstore(0x1e40, addmod(mload(0xa60), mload(0x1e20), f_q))mstore(0x1e60, addmod(mload(0x1e40), sub(f_q, mload(0xac0)), f_q))mstore(0x1e80, mulmod(mload(0x1e60), mload(0xd20), f_q))mstore(0x1ea0, addmod(mload(0x1e00), mload(0x1e80), f_q))mstore(0x1ec0, mulmod(mload(0x780), mload(0x1ea0), f_q))mstore(0x1ee0, mulmod(mload(0xb20), mload(0xb00), f_q))mstore(0x1f00, addmod(mload(0xae0), mload(0x1ee0), f_q))mstore(0x1f20, addmod(mload(0x1f00), sub(f_q, mload(0xb40)), f_q))mstore(0x1f40, mulmod(mload(0x1f20), mload(0xd40), f_q))mstore(0x1f60, addmod(mload(0x1ec0), mload(0x1f40), f_q))mstore(0x1f80, mulmod(mload(0x780), mload(0x1f60), f_q))mstore(0x1fa0, mulmod(mload(0xba0), mload(0xb80), f_q))mstore(0x1fc0, addmod(mload(0xb60), mload(0x1fa0), f_q))mstore(0x1fe0, addmod(mload(0x1fc0), sub(f_q, mload(0xbc0)), f_q))mstore(0x2000, mulmod(mload(0x1fe0), mload(0xd60), f_q))mstore(0x2020, addmod(mload(0x1f80), mload(0x2000), f_q))mstore(0x2040, mulmod(mload(0x780), mload(0x2020), f_q))mstore(0x2060, addmod(1, sub(f_q, mload(0xf00)), f_q))mstore(0x2080, mulmod(mload(0x2060), mload(0x1bc0), f_q))mstore(0x20a0, addmod(mload(0x2040), mload(0x2080), f_q))mstore(0x20c0, mulmod(mload(0x780), mload(0x20a0), f_q))mstore(0x20e0, mulmod(mload(0x10e0), mload(0x10e0), f_q))mstore(0x2100, addmod(mload(0x20e0), sub(f_q, mload(0x10e0)), f_q))mstore(0x2120, mulmod(mload(0x2100), mload(0x1ae0), f_q))mstore(0x2140, addmod(mload(0x20c0), mload(0x2120), f_q))mstore(0x2160, mulmod(mload(0x780), mload(0x2140), f_q))mstore(0x2180, addmod(mload(0xf60), sub(f_q, mload(0xf40)), f_q))mstore(0x21a0, mulmod(mload(0x2180), mload(0x1bc0), f_q))mstore(0x21c0, addmod(mload(0x2160), mload(0x21a0), f_q))mstore(0x21e0, mulmod(mload(0x780), mload(0x21c0), f_q))mstore(0x2200, addmod(mload(0xfc0), sub(f_q, mload(0xfa0)), f_q))mstore(0x2220, mulmod(mload(0x2200), mload(0x1bc0), f_q))mstore(0x2240, addmod(mload(0x21e0), mload(0x2220), f_q))mstore(0x2260, mulmod(mload(0x780), mload(0x2240), f_q))mstore(0x2280, addmod(mload(0x1020), sub(f_q, mload(0x1000)), f_q))mstore(0x22a0, mulmod(mload(0x2280), mload(0x1bc0), f_q))mstore(0x22c0, addmod(mload(0x2260), mload(0x22a0), f_q))mstore(0x22e0, mulmod(mload(0x780), mload(0x22c0), f_q))mstore(0x2300, addmod(mload(0x1080), sub(f_q, mload(0x1060)), f_q))mstore(0x2320, mulmod(mload(0x2300), mload(0x1bc0), f_q))mstore(0x2340, addmod(mload(0x22e0), mload(0x2320), f_q))mstore(0x2360, mulmod(mload(0x780), mload(0x2340), f_q))mstore(0x2380, addmod(mload(0x10e0), sub(f_q, mload(0x10c0)), f_q))mstore(0x23a0, mulmod(mload(0x2380), mload(0x1bc0), f_q))mstore(0x23c0, addmod(mload(0x2360), mload(0x23a0), f_q))mstore(0x23e0, mulmod(mload(0x780), mload(0x23c0), f_q))mstore(0x2400, addmod(1, sub(f_q, mload(0x1ae0)), f_q))mstore(0x2420, addmod(mload(0x1b00), mload(0x1b20), f_q))mstore(0x2440, addmod(mload(0x2420), mload(0x1b40), f_q))mstore(0x2460, addmod(mload(0x2440), mload(0x1b60), f_q))mstore(0x2480, addmod(mload(0x2460), mload(0x1b80), f_q))mstore(0x24a0, addmod(mload(0x2480), mload(0x1ba0), f_q))mstore(0x24c0, addmod(mload(0x2400), sub(f_q, mload(0x24a0)), f_q))mstore(0x24e0, mulmod(mload(0xda0), mload(0x480), f_q))mstore(0x2500, addmod(mload(0xc40), mload(0x24e0), f_q))mstore(0x2520, addmod(mload(0x2500), mload(0x4e0), f_q))mstore(0x2540, mulmod(mload(0xdc0), mload(0x480), f_q))mstore(0x2560, addmod(mload(0x8e0), mload(0x2540), f_q))mstore(0x2580, addmod(mload(0x2560), mload(0x4e0), f_q))mstore(0x25a0, mulmod(mload(0x2580), mload(0x2520), f_q))mstore(0x25c0, mulmod(mload(0x25a0), mload(0xf20), f_q))mstore(0x25e0, mulmod(1, mload(0x480), f_q))mstore(0x2600, mulmod(mload(0x8a0), mload(0x25e0), f_q))mstore(0x2620, addmod(mload(0xc40), mload(0x2600), f_q))mstore(0x2640, addmod(mload(0x2620), mload(0x4e0), f_q))mstore(0x2660, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x480), f_q))mstore(0x2680, mulmod(mload(0x8a0), mload(0x2660), f_q))mstore(0x26a0, addmod(mload(0x8e0), mload(0x2680), f_q))mstore(0x26c0, addmod(mload(0x26a0), mload(0x4e0), f_q))mstore(0x26e0, mulmod(mload(0x26c0), mload(0x2640), f_q))mstore(0x2700, mulmod(mload(0x26e0), mload(0xf00), f_q))mstore(0x2720, addmod(mload(0x25c0), sub(f_q, mload(0x2700)), f_q))mstore(0x2740, mulmod(mload(0x2720), mload(0x24c0), f_q))mstore(0x2760, addmod(mload(0x23e0), mload(0x2740), f_q))mstore(0x2780, mulmod(mload(0x780), mload(0x2760), f_q))mstore(0x27a0, mulmod(mload(0xde0), mload(0x480), f_q))mstore(0x27c0, addmod(mload(0x960), mload(0x27a0), f_q))mstore(0x27e0, addmod(mload(0x27c0), mload(0x4e0), f_q))mstore(0x2800, mulmod(mload(0xe00), mload(0x480), f_q))mstore(0x2820, addmod(mload(0x9e0), mload(0x2800), f_q))mstore(0x2840, addmod(mload(0x2820), mload(0x4e0), f_q))mstore(0x2860, mulmod(mload(0x2840), mload(0x27e0), f_q))mstore(0x2880, mulmod(mload(0x2860), mload(0xf80), f_q))mstore(0x28a0, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x480), f_q))mstore(0x28c0, mulmod(mload(0x8a0), mload(0x28a0), f_q))mstore(0x28e0, addmod(mload(0x960), mload(0x28c0), f_q))mstore(0x2900, addmod(mload(0x28e0), mload(0x4e0), f_q))mstore(0x2920, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x480), f_q))mstore(0x2940, mulmod(mload(0x8a0), mload(0x2920), f_q))mstore(0x2960, addmod(mload(0x9e0), mload(0x2940), f_q))mstore(0x2980, addmod(mload(0x2960), mload(0x4e0), f_q))mstore(0x29a0, mulmod(mload(0x2980), mload(0x2900), f_q))mstore(0x29c0, mulmod(mload(0x29a0), mload(0xf60), f_q))mstore(0x29e0, addmod(mload(0x2880), sub(f_q, mload(0x29c0)), f_q))mstore(0x2a00, mulmod(mload(0x29e0), mload(0x24c0), f_q))mstore(0x2a20, addmod(mload(0x2780), mload(0x2a00), f_q))mstore(0x2a40, mulmod(mload(0x780), mload(0x2a20), f_q))mstore(0x2a60, mulmod(mload(0xe20), mload(0x480), f_q))mstore(0x2a80, addmod(mload(0xa60), mload(0x2a60), f_q))mstore(0x2aa0, addmod(mload(0x2a80), mload(0x4e0), f_q))mstore(0x2ac0, mulmod(mload(0xe40), mload(0x480), f_q))mstore(0x2ae0, addmod(mload(0xae0), mload(0x2ac0), f_q))mstore(0x2b00, addmod(mload(0x2ae0), mload(0x4e0), f_q))mstore(0x2b20, mulmod(mload(0x2b00), mload(0x2aa0), f_q))mstore(0x2b40, mulmod(mload(0x2b20), mload(0xfe0), f_q))mstore(0x2b60, mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(0x480), f_q))mstore(0x2b80, mulmod(mload(0x8a0), mload(0x2b60), f_q))mstore(0x2ba0, addmod(mload(0xa60), mload(0x2b80), f_q))mstore(0x2bc0, addmod(mload(0x2ba0), mload(0x4e0), f_q))mstore(0x2be0, mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(0x480), f_q))mstore(0x2c00, mulmod(mload(0x8a0), mload(0x2be0), f_q))mstore(0x2c20, addmod(mload(0xae0), mload(0x2c00), f_q))mstore(0x2c40, addmod(mload(0x2c20), mload(0x4e0), f_q))mstore(0x2c60, mulmod(mload(0x2c40), mload(0x2bc0), f_q))mstore(0x2c80, mulmod(mload(0x2c60), mload(0xfc0), f_q))mstore(0x2ca0, addmod(mload(0x2b40), sub(f_q, mload(0x2c80)), f_q))mstore(0x2cc0, mulmod(mload(0x2ca0), mload(0x24c0), f_q))mstore(0x2ce0, addmod(mload(0x2a40), mload(0x2cc0), f_q))mstore(0x2d00, mulmod(mload(0x780), mload(0x2ce0), f_q))mstore(0x2d20, mulmod(mload(0xe60), mload(0x480), f_q))mstore(0x2d40, addmod(mload(0xb60), mload(0x2d20), f_q))mstore(0x2d60, addmod(mload(0x2d40), mload(0x4e0), f_q))mstore(0x2d80, mulmod(mload(0xe80), mload(0x480), f_q))mstore(0x2da0, addmod(mload(0xbe0), mload(0x2d80), f_q))mstore(0x2dc0, addmod(mload(0x2da0), mload(0x4e0), f_q))mstore(0x2de0, mulmod(mload(0x2dc0), mload(0x2d60), f_q))mstore(0x2e00, mulmod(mload(0x2de0), mload(0x1040), f_q))mstore(0x2e20, mulmod(5625741653535312224677218588085279924365897425605943700675464992185016992283, mload(0x480), f_q))mstore(0x2e40, mulmod(mload(0x8a0), mload(0x2e20), f_q))mstore(0x2e60, addmod(mload(0xb60), mload(0x2e40), f_q))mstore(0x2e80, addmod(mload(0x2e60), mload(0x4e0), f_q))mstore(0x2ea0, mulmod(14704729814417906439424896605881467874595262020190401576785074330126828718155, mload(0x480), f_q))mstore(0x2ec0, mulmod(mload(0x8a0), mload(0x2ea0), f_q))mstore(0x2ee0, addmod(mload(0xbe0), mload(0x2ec0), f_q))mstore(0x2f00, addmod(mload(0x2ee0), mload(0x4e0), f_q))mstore(0x2f20, mulmod(mload(0x2f00), mload(0x2e80), f_q))mstore(0x2f40, mulmod(mload(0x2f20), mload(0x1020), f_q))mstore(0x2f60, addmod(mload(0x2e00), sub(f_q, mload(0x2f40)), f_q))mstore(0x2f80, mulmod(mload(0x2f60), mload(0x24c0), f_q))mstore(0x2fa0, addmod(mload(0x2d00), mload(0x2f80), f_q))mstore(0x2fc0, mulmod(mload(0x780), mload(0x2fa0), f_q))mstore(0x2fe0, mulmod(mload(0xea0), mload(0x480), f_q))mstore(0x3000, addmod(mload(0x1be0), mload(0x2fe0), f_q))mstore(0x3020, addmod(mload(0x3000), mload(0x4e0), f_q))mstore(0x3040, mulmod(mload(0xec0), mload(0x480), f_q))mstore(0x3060, addmod(mload(0xc00), mload(0x3040), f_q))mstore(0x3080, addmod(mload(0x3060), mload(0x4e0), f_q))mstore(0x30a0, mulmod(mload(0x3080), mload(0x3020), f_q))mstore(0x30c0, mulmod(mload(0x30a0), mload(0x10a0), f_q))mstore(0x30e0, mulmod(8343274462013750416000956870576256937330525306073862550863787263304548803879, mload(0x480), f_q))mstore(0x3100, mulmod(mload(0x8a0), mload(0x30e0), f_q))mstore(0x3120, addmod(mload(0x1be0), mload(0x3100), f_q))mstore(0x3140, addmod(mload(0x3120), mload(0x4e0), f_q))mstore(0x3160, mulmod(20928372310071051017340352686640453451620397549739756658327314209761852842004, mload(0x480), f_q))mstore(0x3180, mulmod(mload(0x8a0), mload(0x3160), f_q))mstore(0x31a0, addmod(mload(0xc00), mload(0x3180), f_q))mstore(0x31c0, addmod(mload(0x31a0), mload(0x4e0), f_q))mstore(0x31e0, mulmod(mload(0x31c0), mload(0x3140), f_q))mstore(0x3200, mulmod(mload(0x31e0), mload(0x1080), f_q))mstore(0x3220, addmod(mload(0x30c0), sub(f_q, mload(0x3200)), f_q))mstore(0x3240, mulmod(mload(0x3220), mload(0x24c0), f_q))mstore(0x3260, addmod(mload(0x2fc0), mload(0x3240), f_q))mstore(0x3280, mulmod(mload(0x780), mload(0x3260), f_q))mstore(0x32a0, mulmod(mload(0xee0), mload(0x480), f_q))mstore(0x32c0, addmod(mload(0xc20), mload(0x32a0), f_q))mstore(0x32e0, addmod(mload(0x32c0), mload(0x4e0), f_q))mstore(0x3300, mulmod(mload(0x32e0), mload(0x1100), f_q))mstore(0x3320, mulmod(15845651941796975697993789271154426079663327509658641548785793587449119139335, mload(0x480), f_q))mstore(0x3340, mulmod(mload(0x8a0), mload(0x3320), f_q))mstore(0x3360, addmod(mload(0xc20), mload(0x3340), f_q))mstore(0x3380, addmod(mload(0x3360), mload(0x4e0), f_q))mstore(0x33a0, mulmod(mload(0x3380), mload(0x10e0), f_q))mstore(0x33c0, addmod(mload(0x3300), sub(f_q, mload(0x33a0)), f_q))mstore(0x33e0, mulmod(mload(0x33c0), mload(0x24c0), f_q))mstore(0x3400, addmod(mload(0x3280), mload(0x33e0), f_q))mstore(0x3420, mulmod(mload(0x780), mload(0x3400), f_q))mstore(0x3440, addmod(1, sub(f_q, mload(0x1120)), f_q))mstore(0x3460, mulmod(mload(0x3440), mload(0x1bc0), f_q))mstore(0x3480, addmod(mload(0x3420), mload(0x3460), f_q))mstore(0x34a0, mulmod(mload(0x780), mload(0x3480), f_q))mstore(0x34c0, mulmod(mload(0x1120), mload(0x1120), f_q))mstore(0x34e0, addmod(mload(0x34c0), sub(f_q, mload(0x1120)), f_q))mstore(0x3500, mulmod(mload(0x34e0), mload(0x1ae0), f_q))mstore(0x3520, addmod(mload(0x34a0), mload(0x3500), f_q))mstore(0x3540, mulmod(mload(0x780), mload(0x3520), f_q))mstore(0x3560, addmod(mload(0x1160), mload(0x480), f_q))mstore(0x3580, mulmod(mload(0x3560), mload(0x1140), f_q))mstore(0x35a0, addmod(mload(0x11a0), mload(0x4e0), f_q))mstore(0x35c0, mulmod(mload(0x35a0), mload(0x3580), f_q))mstore(0x35e0, addmod(mload(0xbe0), mload(0x480), f_q))mstore(0x3600, mulmod(mload(0x35e0), mload(0x1120), f_q))mstore(0x3620, addmod(mload(0xc60), mload(0x4e0), f_q))mstore(0x3640, mulmod(mload(0x3620), mload(0x3600), f_q))mstore(0x3660, addmod(mload(0x35c0), sub(f_q, mload(0x3640)), f_q))mstore(0x3680, mulmod(mload(0x3660), mload(0x24c0), f_q))mstore(0x36a0, addmod(mload(0x3540), mload(0x3680), f_q))mstore(0x36c0, mulmod(mload(0x780), mload(0x36a0), f_q))mstore(0x36e0, addmod(mload(0x1160), sub(f_q, mload(0x11a0)), f_q))mstore(0x3700, mulmod(mload(0x36e0), mload(0x1bc0), f_q))mstore(0x3720, addmod(mload(0x36c0), mload(0x3700), f_q))mstore(0x3740, mulmod(mload(0x780), mload(0x3720), f_q))mstore(0x3760, mulmod(mload(0x36e0), mload(0x24c0), f_q))mstore(0x3780, addmod(mload(0x1160), sub(f_q, mload(0x1180)), f_q))mstore(0x37a0, mulmod(mload(0x3780), mload(0x3760), f_q))mstore(0x37c0, addmod(mload(0x3740), mload(0x37a0), f_q))mstore(0x37e0, mulmod(mload(0x780), mload(0x37c0), f_q))mstore(0x3800, addmod(1, sub(f_q, mload(0x11c0)), f_q))mstore(0x3820, mulmod(mload(0x3800), mload(0x1bc0), f_q))mstore(0x3840, addmod(mload(0x37e0), mload(0x3820), f_q))mstore(0x3860, mulmod(mload(0x780), mload(0x3840), f_q))mstore(0x3880, mulmod(mload(0x11c0), mload(0x11c0), f_q))mstore(0x38a0, addmod(mload(0x3880), sub(f_q, mload(0x11c0)), f_q))mstore(0x38c0, mulmod(mload(0x38a0), mload(0x1ae0), f_q))mstore(0x38e0, addmod(mload(0x3860), mload(0x38c0), f_q))mstore(0x3900, mulmod(mload(0x780), mload(0x38e0), f_q))mstore(0x3920, addmod(mload(0x1200), mload(0x480), f_q))mstore(0x3940, mulmod(mload(0x3920), mload(0x11e0), f_q))mstore(0x3960, addmod(mload(0x1240), mload(0x4e0), f_q))mstore(0x3980, mulmod(mload(0x3960), mload(0x3940), f_q))mstore(0x39a0, mulmod(mload(0x320), mload(0xc00), f_q))mstore(0x39c0, addmod(mload(0x39a0), mload(0xc20), f_q))mstore(0x39e0, addmod(mload(0x39c0), mload(0x480), f_q))mstore(0x3a00, mulmod(mload(0x39e0), mload(0x11c0), f_q))mstore(0x3a20, mulmod(mload(0x320), mload(0xc80), f_q))mstore(0x3a40, addmod(mload(0x3a20), mload(0xca0), f_q))mstore(0x3a60, addmod(mload(0x3a40), mload(0x4e0), f_q))mstore(0x3a80, mulmod(mload(0x3a60), mload(0x3a00), f_q))mstore(0x3aa0, addmod(mload(0x3980), sub(f_q, mload(0x3a80)), f_q))mstore(0x3ac0, mulmod(mload(0x3aa0), mload(0x24c0), f_q))mstore(0x3ae0, addmod(mload(0x3900), mload(0x3ac0), f_q))mstore(0x3b00, mulmod(mload(0x780), mload(0x3ae0), f_q))mstore(0x3b20, addmod(mload(0x1200), sub(f_q, mload(0x1240)), f_q))mstore(0x3b40, mulmod(mload(0x3b20), mload(0x1bc0), f_q))mstore(0x3b60, addmod(mload(0x3b00), mload(0x3b40), f_q))mstore(0x3b80, mulmod(mload(0x780), mload(0x3b60), f_q))mstore(0x3ba0, mulmod(mload(0x3b20), mload(0x24c0), f_q))mstore(0x3bc0, addmod(mload(0x1200), sub(f_q, mload(0x1220)), f_q))mstore(0x3be0, mulmod(mload(0x3bc0), mload(0x3ba0), f_q))mstore(0x3c00, addmod(mload(0x3b80), mload(0x3be0), f_q))mstore(0x3c20, mulmod(mload(0x16a0), mload(0x16a0), f_q))mstore(0x3c40, mulmod(mload(0x3c20), mload(0x16a0), f_q))mstore(0x3c60, mulmod(1, mload(0x16a0), f_q))mstore(0x3c80, mulmod(1, mload(0x3c20), f_q))mstore(0x3ca0, mulmod(mload(0x3c00), mload(0x16c0), f_q))mstore(0x3cc0, mulmod(mload(0x1400), mload(0x8a0), f_q))mstore(0x3ce0, mulmod(mload(0x3cc0), mload(0x8a0), f_q))mstore(0x3d00, mulmod(mload(0x8a0), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x3d20, addmod(mload(0x1380), sub(f_q, mload(0x3d00)), f_q))mstore(0x3d40, mulmod(mload(0x8a0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x3d60, addmod(mload(0x1380), sub(f_q, mload(0x3d40)), f_q))mstore(0x3d80, mulmod(mload(0x8a0), 1, f_q))mstore(0x3da0, addmod(mload(0x1380), sub(f_q, mload(0x3d80)), f_q))mstore(0x3dc0, mulmod(mload(0x8a0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q))mstore(0x3de0, addmod(mload(0x1380), sub(f_q, mload(0x3dc0)), f_q))mstore(0x3e00, mulmod(mload(0x8a0), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q))mstore(0x3e20, addmod(mload(0x1380), sub(f_q, mload(0x3e00)), f_q))mstore(0x3e40, mulmod(mload(0x8a0), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q))mstore(0x3e60, addmod(mload(0x1380), sub(f_q, mload(0x3e40)), f_q))mstore(0x3e80, mulmod(3544324119167359571073009690693121464267965232733679586767649244433889388945, mload(0x3cc0), f_q))mstore(0x3ea0, mulmod(mload(0x3e80), 1, f_q)){ let result := mulmod(mload(0x1380), mload(0x3e80), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x3ea0)), f_q), result, f_q)mstore(0x3ec0, result) }mstore(0x3ee0, mulmod(3860370625838117017501327045244227871206764201116468958063324100051382735289, mload(0x3cc0), f_q))mstore(0x3f00, mulmod(mload(0x3ee0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1380), mload(0x3ee0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x3f00)), f_q), result, f_q)mstore(0x3f20, result) }mstore(0x3f40, mulmod(21616901807277407275624036604424346159916096890712898844034238973395610537327, mload(0x3cc0), f_q))mstore(0x3f60, mulmod(mload(0x3f40), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q)){ let result := mulmod(mload(0x1380), mload(0x3f40), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x3f60)), f_q), result, f_q)mstore(0x3f80, result) }mstore(0x3fa0, mulmod(3209408481237076479025468386201293941554240476766691830436732310949352383503, mload(0x3cc0), f_q))mstore(0x3fc0, mulmod(mload(0x3fa0), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q)){ let result := mulmod(mload(0x1380), mload(0x3fa0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x3fc0)), f_q), result, f_q)mstore(0x3fe0, result) }mstore(0x4000, mulmod(1, mload(0x3da0), f_q))mstore(0x4020, mulmod(mload(0x4000), mload(0x3de0), f_q))mstore(0x4040, mulmod(mload(0x4020), mload(0x3e20), f_q))mstore(0x4060, mulmod(mload(0x4040), mload(0x3e60), f_q)){ let result := mulmod(mload(0x1380), 1, f_q)result := addmod(mulmod(mload(0x8a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(0x4080, result) }mstore(0x40a0, mulmod(8390819244605639573390577733158868133682115698337564550620146375401109684432, mload(0x1400), f_q))mstore(0x40c0, mulmod(mload(0x40a0), 1, f_q)){ let result := mulmod(mload(0x1380), mload(0x40a0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x40c0)), f_q), result, f_q)mstore(0x40e0, result) }mstore(0x4100, mulmod(14389468897523033212448771694851898440525479866834419679925499462425232628530, mload(0x1400), f_q))mstore(0x4120, mulmod(mload(0x4100), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1380), mload(0x4100), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4120)), f_q), result, f_q)mstore(0x4140, result) }mstore(0x4160, mulmod(8021781111580269725587432039983408559403601261632071736490564397134126857583, mload(0x1400), f_q))mstore(0x4180, mulmod(mload(0x4160), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q)){ let result := mulmod(mload(0x1380), mload(0x4160), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4180)), f_q), result, f_q)mstore(0x41a0, result) }mstore(0x41c0, mulmod(mload(0x4020), mload(0x3d20), f_q))mstore(0x41e0, mulmod(10676941854703594198666993839846402519342119846958189386823924046696287912228, mload(0x8a0), f_q))mstore(0x4200, mulmod(mload(0x41e0), 1, f_q)){ let result := mulmod(mload(0x1380), mload(0x41e0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4200)), f_q), result, f_q)mstore(0x4220, result) }mstore(0x4240, mulmod(11211301017135681023579411905410872569206244553457844956874280139879520583389, mload(0x8a0), f_q))mstore(0x4260, mulmod(mload(0x4240), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1380), mload(0x4240), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4260)), f_q), result, f_q)mstore(0x4280, result) }mstore(0x42a0, mulmod(13154116519010929542673167886091370382741775939114889923107781597533678454430, mload(0x8a0), f_q))mstore(0x42c0, mulmod(mload(0x42a0), 1, f_q)){ let result := mulmod(mload(0x1380), mload(0x42a0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x42c0)), f_q), result, f_q)mstore(0x42e0, result) }mstore(0x4300, mulmod(8734126352828345679573237859165904705806588461301144420590422589042130041187, mload(0x8a0), f_q))mstore(0x4320, mulmod(mload(0x4300), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q)){ let result := mulmod(mload(0x1380), mload(0x4300), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4320)), f_q), result, f_q)mstore(0x4340, result) }mstore(0x4360, mulmod(mload(0x4000), mload(0x3d60), f_q)){ let prod := mload(0x3ec0) prod := mulmod(mload(0x3f20), prod, f_q) mstore(0x4380, prod) prod := mulmod(mload(0x3f80), prod, f_q) mstore(0x43a0, prod) prod := mulmod(mload(0x3fe0), prod, f_q) mstore(0x43c0, prod) prod := mulmod(mload(0x4080), prod, f_q) mstore(0x43e0, prod) prod := mulmod(mload(0x4000), prod, f_q) mstore(0x4400, prod) prod := mulmod(mload(0x40e0), prod, f_q) mstore(0x4420, prod) prod := mulmod(mload(0x4140), prod, f_q) mstore(0x4440, prod) prod := mulmod(mload(0x41a0), prod, f_q) mstore(0x4460, prod) prod := mulmod(mload(0x41c0), prod, f_q) mstore(0x4480, prod) prod := mulmod(mload(0x4220), prod, f_q) mstore(0x44a0, prod) prod := mulmod(mload(0x4280), prod, f_q) mstore(0x44c0, prod) prod := mulmod(mload(0x4020), prod, f_q) mstore(0x44e0, prod) prod := mulmod(mload(0x42e0), prod, f_q) mstore(0x4500, prod) prod := mulmod(mload(0x4340), prod, f_q) mstore(0x4520, prod) prod := mulmod(mload(0x4360), prod, f_q) mstore(0x4540, prod) }mstore(0x4580, 32)mstore(0x45a0, 32)mstore(0x45c0, 32)mstore(0x45e0, mload(0x4540))mstore(0x4600, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x4620, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x4580, 0xc0, 0x4560, 0x20), 1), success){ let inv := mload(0x4560) let v v := mload(0x4360) mstore(0x4360, mulmod(mload(0x4520), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4340) mstore(0x4340, mulmod(mload(0x4500), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x42e0) mstore(0x42e0, mulmod(mload(0x44e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4020) mstore(0x4020, mulmod(mload(0x44c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4280) mstore(0x4280, mulmod(mload(0x44a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4220) mstore(0x4220, mulmod(mload(0x4480), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x41c0) mstore(0x41c0, mulmod(mload(0x4460), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x41a0) mstore(0x41a0, mulmod(mload(0x4440), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4140) mstore(0x4140, mulmod(mload(0x4420), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x40e0) mstore(0x40e0, mulmod(mload(0x4400), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4000) mstore(0x4000, mulmod(mload(0x43e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4080) mstore(0x4080, mulmod(mload(0x43c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3fe0) mstore(0x3fe0, mulmod(mload(0x43a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3f80) mstore(0x3f80, mulmod(mload(0x4380), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3f20) mstore(0x3f20, mulmod(mload(0x3ec0), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x3ec0, inv) }{ let result := mload(0x3ec0)result := addmod(mload(0x3f20), result, f_q)result := addmod(mload(0x3f80), result, f_q)result := addmod(mload(0x3fe0), result, f_q)mstore(0x4640, result) }mstore(0x4660, mulmod(mload(0x4060), mload(0x4000), f_q)){ let result := mload(0x4080)mstore(0x4680, result) }mstore(0x46a0, mulmod(mload(0x4060), mload(0x41c0), f_q)){ let result := mload(0x40e0)result := addmod(mload(0x4140), result, f_q)result := addmod(mload(0x41a0), result, f_q)mstore(0x46c0, result) }mstore(0x46e0, mulmod(mload(0x4060), mload(0x4020), f_q)){ let result := mload(0x4220)result := addmod(mload(0x4280), result, f_q)mstore(0x4700, result) }mstore(0x4720, mulmod(mload(0x4060), mload(0x4360), f_q)){ let result := mload(0x42e0)result := addmod(mload(0x4340), result, f_q)mstore(0x4740, result) }{ let prod := mload(0x4640) prod := mulmod(mload(0x4680), prod, f_q) mstore(0x4760, prod) prod := mulmod(mload(0x46c0), prod, f_q) mstore(0x4780, prod) prod := mulmod(mload(0x4700), prod, f_q) mstore(0x47a0, prod) prod := mulmod(mload(0x4740), prod, f_q) mstore(0x47c0, prod) }mstore(0x4800, 32)mstore(0x4820, 32)mstore(0x4840, 32)mstore(0x4860, mload(0x47c0))mstore(0x4880, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x48a0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x4800, 0xc0, 0x47e0, 0x20), 1), success){ let inv := mload(0x47e0) let v v := mload(0x4740) mstore(0x4740, mulmod(mload(0x47a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4700) mstore(0x4700, mulmod(mload(0x4780), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x46c0) mstore(0x46c0, mulmod(mload(0x4760), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4680) mstore(0x4680, mulmod(mload(0x4640), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x4640, inv) }mstore(0x48c0, mulmod(mload(0x4660), mload(0x4680), f_q))mstore(0x48e0, mulmod(mload(0x46a0), mload(0x46c0), f_q))mstore(0x4900, mulmod(mload(0x46e0), mload(0x4700), f_q))mstore(0x4920, mulmod(mload(0x4720), mload(0x4740), f_q))mstore(0x4940, mulmod(mload(0x1280), mload(0x1280), f_q))mstore(0x4960, mulmod(mload(0x4940), mload(0x1280), f_q))mstore(0x4980, mulmod(mload(0x4960), mload(0x1280), f_q))mstore(0x49a0, mulmod(mload(0x4980), mload(0x1280), f_q))mstore(0x49c0, mulmod(mload(0x49a0), mload(0x1280), f_q))mstore(0x49e0, mulmod(mload(0x49c0), mload(0x1280), f_q))mstore(0x4a00, mulmod(mload(0x49e0), mload(0x1280), f_q))mstore(0x4a20, mulmod(mload(0x4a00), mload(0x1280), f_q))mstore(0x4a40, mulmod(mload(0x4a20), mload(0x1280), f_q))mstore(0x4a60, mulmod(mload(0x4a40), mload(0x1280), f_q))mstore(0x4a80, mulmod(mload(0x4a60), mload(0x1280), f_q))mstore(0x4aa0, mulmod(mload(0x4a80), mload(0x1280), f_q))mstore(0x4ac0, mulmod(mload(0x4aa0), mload(0x1280), f_q))mstore(0x4ae0, mulmod(mload(0x4ac0), mload(0x1280), f_q))mstore(0x4b00, mulmod(mload(0x4ae0), mload(0x1280), f_q))mstore(0x4b20, mulmod(mload(0x4b00), mload(0x1280), f_q))mstore(0x4b40, mulmod(mload(0x4b20), mload(0x1280), f_q))mstore(0x4b60, mulmod(mload(0x4b40), mload(0x1280), f_q))mstore(0x4b80, mulmod(mload(0x4b60), mload(0x1280), f_q))mstore(0x4ba0, mulmod(mload(0x4b80), mload(0x1280), f_q))mstore(0x4bc0, mulmod(mload(0x4ba0), mload(0x1280), f_q))mstore(0x4be0, mulmod(mload(0x4bc0), mload(0x1280), f_q))mstore(0x4c00, mulmod(mload(0x4be0), mload(0x1280), f_q))mstore(0x4c20, mulmod(mload(0x4c00), mload(0x1280), f_q))mstore(0x4c40, mulmod(mload(0x4c20), mload(0x1280), f_q))mstore(0x4c60, mulmod(mload(0x4c40), mload(0x1280), f_q))mstore(0x4c80, mulmod(mload(0x4c60), mload(0x1280), f_q))mstore(0x4ca0, mulmod(mload(0x12e0), mload(0x12e0), f_q))mstore(0x4cc0, mulmod(mload(0x4ca0), mload(0x12e0), f_q))mstore(0x4ce0, mulmod(mload(0x4cc0), mload(0x12e0), f_q))mstore(0x4d00, mulmod(mload(0x4ce0), mload(0x12e0), f_q)){ let result := mulmod(mload(0x8e0), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0x900), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0x920), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0x940), mload(0x3fe0), f_q), result, f_q)mstore(0x4d20, result) }mstore(0x4d40, mulmod(mload(0x4d20), mload(0x4640), f_q))mstore(0x4d60, mulmod(sub(f_q, mload(0x4d40)), 1, f_q)){ let result := mulmod(mload(0x960), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0x980), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0x9a0), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0x9c0), mload(0x3fe0), f_q), result, f_q)mstore(0x4d80, result) }mstore(0x4da0, mulmod(mload(0x4d80), mload(0x4640), f_q))mstore(0x4dc0, mulmod(sub(f_q, mload(0x4da0)), mload(0x1280), f_q))mstore(0x4de0, mulmod(1, mload(0x1280), f_q))mstore(0x4e00, addmod(mload(0x4d60), mload(0x4dc0), f_q)){ let result := mulmod(mload(0x9e0), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0xa00), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0xa20), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0xa40), mload(0x3fe0), f_q), result, f_q)mstore(0x4e20, result) }mstore(0x4e40, mulmod(mload(0x4e20), mload(0x4640), f_q))mstore(0x4e60, mulmod(sub(f_q, mload(0x4e40)), mload(0x4940), f_q))mstore(0x4e80, mulmod(1, mload(0x4940), f_q))mstore(0x4ea0, addmod(mload(0x4e00), mload(0x4e60), f_q)){ let result := mulmod(mload(0xa60), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0xa80), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0xaa0), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0xac0), mload(0x3fe0), f_q), result, f_q)mstore(0x4ec0, result) }mstore(0x4ee0, mulmod(mload(0x4ec0), mload(0x4640), f_q))mstore(0x4f00, mulmod(sub(f_q, mload(0x4ee0)), mload(0x4960), f_q))mstore(0x4f20, mulmod(1, mload(0x4960), f_q))mstore(0x4f40, addmod(mload(0x4ea0), mload(0x4f00), f_q)){ let result := mulmod(mload(0xae0), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0xb00), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0xb20), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0xb40), mload(0x3fe0), f_q), result, f_q)mstore(0x4f60, result) }mstore(0x4f80, mulmod(mload(0x4f60), mload(0x4640), f_q))mstore(0x4fa0, mulmod(sub(f_q, mload(0x4f80)), mload(0x4980), f_q))mstore(0x4fc0, mulmod(1, mload(0x4980), f_q))mstore(0x4fe0, addmod(mload(0x4f40), mload(0x4fa0), f_q)){ let result := mulmod(mload(0xb60), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0xb80), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0xba0), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0xbc0), mload(0x3fe0), f_q), result, f_q)mstore(0x5000, result) }mstore(0x5020, mulmod(mload(0x5000), mload(0x4640), f_q))mstore(0x5040, mulmod(sub(f_q, mload(0x5020)), mload(0x49a0), f_q))mstore(0x5060, mulmod(1, mload(0x49a0), f_q))mstore(0x5080, addmod(mload(0x4fe0), mload(0x5040), f_q))mstore(0x50a0, mulmod(mload(0x5080), 1, f_q))mstore(0x50c0, mulmod(mload(0x4de0), 1, f_q))mstore(0x50e0, mulmod(mload(0x4e80), 1, f_q))mstore(0x5100, mulmod(mload(0x4f20), 1, f_q))mstore(0x5120, mulmod(mload(0x4fc0), 1, f_q))mstore(0x5140, mulmod(mload(0x5060), 1, f_q))mstore(0x5160, mulmod(1, mload(0x4660), f_q)){ let result := mulmod(mload(0xbe0), mload(0x4080), f_q)mstore(0x5180, result) }mstore(0x51a0, mulmod(mload(0x5180), mload(0x48c0), f_q))mstore(0x51c0, mulmod(sub(f_q, mload(0x51a0)), 1, f_q))mstore(0x51e0, mulmod(mload(0x5160), 1, f_q)){ let result := mulmod(mload(0xc00), mload(0x4080), f_q)mstore(0x5200, result) }mstore(0x5220, mulmod(mload(0x5200), mload(0x48c0), f_q))mstore(0x5240, mulmod(sub(f_q, mload(0x5220)), mload(0x1280), f_q))mstore(0x5260, mulmod(mload(0x5160), mload(0x1280), f_q))mstore(0x5280, addmod(mload(0x51c0), mload(0x5240), f_q)){ let result := mulmod(mload(0xc20), mload(0x4080), f_q)mstore(0x52a0, result) }mstore(0x52c0, mulmod(mload(0x52a0), mload(0x48c0), f_q))mstore(0x52e0, mulmod(sub(f_q, mload(0x52c0)), mload(0x4940), f_q))mstore(0x5300, mulmod(mload(0x5160), mload(0x4940), f_q))mstore(0x5320, addmod(mload(0x5280), mload(0x52e0), f_q)){ let result := mulmod(mload(0x11a0), mload(0x4080), f_q)mstore(0x5340, result) }mstore(0x5360, mulmod(mload(0x5340), mload(0x48c0), f_q))mstore(0x5380, mulmod(sub(f_q, mload(0x5360)), mload(0x4960), f_q))mstore(0x53a0, mulmod(mload(0x5160), mload(0x4960), f_q))mstore(0x53c0, addmod(mload(0x5320), mload(0x5380), f_q)){ let result := mulmod(mload(0x1240), mload(0x4080), f_q)mstore(0x53e0, result) }mstore(0x5400, mulmod(mload(0x53e0), mload(0x48c0), f_q))mstore(0x5420, mulmod(sub(f_q, mload(0x5400)), mload(0x4980), f_q))mstore(0x5440, mulmod(mload(0x5160), mload(0x4980), f_q))mstore(0x5460, addmod(mload(0x53c0), mload(0x5420), f_q)){ let result := mulmod(mload(0xc40), mload(0x4080), f_q)mstore(0x5480, result) }mstore(0x54a0, mulmod(mload(0x5480), mload(0x48c0), f_q))mstore(0x54c0, mulmod(sub(f_q, mload(0x54a0)), mload(0x49a0), f_q))mstore(0x54e0, mulmod(mload(0x5160), mload(0x49a0), f_q))mstore(0x5500, addmod(mload(0x5460), mload(0x54c0), f_q)){ let result := mulmod(mload(0xc60), mload(0x4080), f_q)mstore(0x5520, result) }mstore(0x5540, mulmod(mload(0x5520), mload(0x48c0), f_q))mstore(0x5560, mulmod(sub(f_q, mload(0x5540)), mload(0x49c0), f_q))mstore(0x5580, mulmod(mload(0x5160), mload(0x49c0), f_q))mstore(0x55a0, addmod(mload(0x5500), mload(0x5560), f_q)){ let result := mulmod(mload(0xc80), mload(0x4080), f_q)mstore(0x55c0, result) }mstore(0x55e0, mulmod(mload(0x55c0), mload(0x48c0), f_q))mstore(0x5600, mulmod(sub(f_q, mload(0x55e0)), mload(0x49e0), f_q))mstore(0x5620, mulmod(mload(0x5160), mload(0x49e0), f_q))mstore(0x5640, addmod(mload(0x55a0), mload(0x5600), f_q))mstore(0x5660, addmod(mload(0x5580), mload(0x5620), f_q)){ let result := mulmod(mload(0xca0), mload(0x4080), f_q)mstore(0x5680, result) }mstore(0x56a0, mulmod(mload(0x5680), mload(0x48c0), f_q))mstore(0x56c0, mulmod(sub(f_q, mload(0x56a0)), mload(0x4a00), f_q))mstore(0x56e0, mulmod(mload(0x5160), mload(0x4a00), f_q))mstore(0x5700, addmod(mload(0x5640), mload(0x56c0), f_q)){ let result := mulmod(mload(0xcc0), mload(0x4080), f_q)mstore(0x5720, result) }mstore(0x5740, mulmod(mload(0x5720), mload(0x48c0), f_q))mstore(0x5760, mulmod(sub(f_q, mload(0x5740)), mload(0x4a20), f_q))mstore(0x5780, mulmod(mload(0x5160), mload(0x4a20), f_q))mstore(0x57a0, addmod(mload(0x5700), mload(0x5760), f_q)){ let result := mulmod(mload(0xce0), mload(0x4080), f_q)mstore(0x57c0, result) }mstore(0x57e0, mulmod(mload(0x57c0), mload(0x48c0), f_q))mstore(0x5800, mulmod(sub(f_q, mload(0x57e0)), mload(0x4a40), f_q))mstore(0x5820, mulmod(mload(0x5160), mload(0x4a40), f_q))mstore(0x5840, addmod(mload(0x57a0), mload(0x5800), f_q)){ let result := mulmod(mload(0xd00), mload(0x4080), f_q)mstore(0x5860, result) }mstore(0x5880, mulmod(mload(0x5860), mload(0x48c0), f_q))mstore(0x58a0, mulmod(sub(f_q, mload(0x5880)), mload(0x4a60), f_q))mstore(0x58c0, mulmod(mload(0x5160), mload(0x4a60), f_q))mstore(0x58e0, addmod(mload(0x5840), mload(0x58a0), f_q)){ let result := mulmod(mload(0xd20), mload(0x4080), f_q)mstore(0x5900, result) }mstore(0x5920, mulmod(mload(0x5900), mload(0x48c0), f_q))mstore(0x5940, mulmod(sub(f_q, mload(0x5920)), mload(0x4a80), f_q))mstore(0x5960, mulmod(mload(0x5160), mload(0x4a80), f_q))mstore(0x5980, addmod(mload(0x58e0), mload(0x5940), f_q)){ let result := mulmod(mload(0xd40), mload(0x4080), f_q)mstore(0x59a0, result) }mstore(0x59c0, mulmod(mload(0x59a0), mload(0x48c0), f_q))mstore(0x59e0, mulmod(sub(f_q, mload(0x59c0)), mload(0x4aa0), f_q))mstore(0x5a00, mulmod(mload(0x5160), mload(0x4aa0), f_q))mstore(0x5a20, addmod(mload(0x5980), mload(0x59e0), f_q)){ let result := mulmod(mload(0xd60), mload(0x4080), f_q)mstore(0x5a40, result) }mstore(0x5a60, mulmod(mload(0x5a40), mload(0x48c0), f_q))mstore(0x5a80, mulmod(sub(f_q, mload(0x5a60)), mload(0x4ac0), f_q))mstore(0x5aa0, mulmod(mload(0x5160), mload(0x4ac0), f_q))mstore(0x5ac0, addmod(mload(0x5a20), mload(0x5a80), f_q)){ let result := mulmod(mload(0xda0), mload(0x4080), f_q)mstore(0x5ae0, result) }mstore(0x5b00, mulmod(mload(0x5ae0), mload(0x48c0), f_q))mstore(0x5b20, mulmod(sub(f_q, mload(0x5b00)), mload(0x4ae0), f_q))mstore(0x5b40, mulmod(mload(0x5160), mload(0x4ae0), f_q))mstore(0x5b60, addmod(mload(0x5ac0), mload(0x5b20), f_q)){ let result := mulmod(mload(0xdc0), mload(0x4080), f_q)mstore(0x5b80, result) }mstore(0x5ba0, mulmod(mload(0x5b80), mload(0x48c0), f_q))mstore(0x5bc0, mulmod(sub(f_q, mload(0x5ba0)), mload(0x4b00), f_q))mstore(0x5be0, mulmod(mload(0x5160), mload(0x4b00), f_q))mstore(0x5c00, addmod(mload(0x5b60), mload(0x5bc0), f_q)){ let result := mulmod(mload(0xde0), mload(0x4080), f_q)mstore(0x5c20, result) }mstore(0x5c40, mulmod(mload(0x5c20), mload(0x48c0), f_q))mstore(0x5c60, mulmod(sub(f_q, mload(0x5c40)), mload(0x4b20), f_q))mstore(0x5c80, mulmod(mload(0x5160), mload(0x4b20), f_q))mstore(0x5ca0, addmod(mload(0x5c00), mload(0x5c60), f_q)){ let result := mulmod(mload(0xe00), mload(0x4080), f_q)mstore(0x5cc0, result) }mstore(0x5ce0, mulmod(mload(0x5cc0), mload(0x48c0), f_q))mstore(0x5d00, mulmod(sub(f_q, mload(0x5ce0)), mload(0x4b40), f_q))mstore(0x5d20, mulmod(mload(0x5160), mload(0x4b40), f_q))mstore(0x5d40, addmod(mload(0x5ca0), mload(0x5d00), f_q)){ let result := mulmod(mload(0xe20), mload(0x4080), f_q)mstore(0x5d60, result) }mstore(0x5d80, mulmod(mload(0x5d60), mload(0x48c0), f_q))mstore(0x5da0, mulmod(sub(f_q, mload(0x5d80)), mload(0x4b60), f_q))mstore(0x5dc0, mulmod(mload(0x5160), mload(0x4b60), f_q))mstore(0x5de0, addmod(mload(0x5d40), mload(0x5da0), f_q)){ let result := mulmod(mload(0xe40), mload(0x4080), f_q)mstore(0x5e00, result) }mstore(0x5e20, mulmod(mload(0x5e00), mload(0x48c0), f_q))mstore(0x5e40, mulmod(sub(f_q, mload(0x5e20)), mload(0x4b80), f_q))mstore(0x5e60, mulmod(mload(0x5160), mload(0x4b80), f_q))mstore(0x5e80, addmod(mload(0x5de0), mload(0x5e40), f_q)){ let result := mulmod(mload(0xe60), mload(0x4080), f_q)mstore(0x5ea0, result) }mstore(0x5ec0, mulmod(mload(0x5ea0), mload(0x48c0), f_q))mstore(0x5ee0, mulmod(sub(f_q, mload(0x5ec0)), mload(0x4ba0), f_q))mstore(0x5f00, mulmod(mload(0x5160), mload(0x4ba0), f_q))mstore(0x5f20, addmod(mload(0x5e80), mload(0x5ee0), f_q)){ let result := mulmod(mload(0xe80), mload(0x4080), f_q)mstore(0x5f40, result) }mstore(0x5f60, mulmod(mload(0x5f40), mload(0x48c0), f_q))mstore(0x5f80, mulmod(sub(f_q, mload(0x5f60)), mload(0x4bc0), f_q))mstore(0x5fa0, mulmod(mload(0x5160), mload(0x4bc0), f_q))mstore(0x5fc0, addmod(mload(0x5f20), mload(0x5f80), f_q)){ let result := mulmod(mload(0xea0), mload(0x4080), f_q)mstore(0x5fe0, result) }mstore(0x6000, mulmod(mload(0x5fe0), mload(0x48c0), f_q))mstore(0x6020, mulmod(sub(f_q, mload(0x6000)), mload(0x4be0), f_q))mstore(0x6040, mulmod(mload(0x5160), mload(0x4be0), f_q))mstore(0x6060, addmod(mload(0x5fc0), mload(0x6020), f_q)){ let result := mulmod(mload(0xec0), mload(0x4080), f_q)mstore(0x6080, result) }mstore(0x60a0, mulmod(mload(0x6080), mload(0x48c0), f_q))mstore(0x60c0, mulmod(sub(f_q, mload(0x60a0)), mload(0x4c00), f_q))mstore(0x60e0, mulmod(mload(0x5160), mload(0x4c00), f_q))mstore(0x6100, addmod(mload(0x6060), mload(0x60c0), f_q)){ let result := mulmod(mload(0xee0), mload(0x4080), f_q)mstore(0x6120, result) }mstore(0x6140, mulmod(mload(0x6120), mload(0x48c0), f_q))mstore(0x6160, mulmod(sub(f_q, mload(0x6140)), mload(0x4c20), f_q))mstore(0x6180, mulmod(mload(0x5160), mload(0x4c20), f_q))mstore(0x61a0, addmod(mload(0x6100), mload(0x6160), f_q))mstore(0x61c0, mulmod(mload(0x3c60), mload(0x4660), f_q))mstore(0x61e0, mulmod(mload(0x3c80), mload(0x4660), f_q)){ let result := mulmod(mload(0x3ca0), mload(0x4080), f_q)mstore(0x6200, result) }mstore(0x6220, mulmod(mload(0x6200), mload(0x48c0), f_q))mstore(0x6240, mulmod(sub(f_q, mload(0x6220)), mload(0x4c40), f_q))mstore(0x6260, mulmod(mload(0x5160), mload(0x4c40), f_q))mstore(0x6280, mulmod(mload(0x61c0), mload(0x4c40), f_q))mstore(0x62a0, mulmod(mload(0x61e0), mload(0x4c40), f_q))mstore(0x62c0, addmod(mload(0x61a0), mload(0x6240), f_q)){ let result := mulmod(mload(0xd80), mload(0x4080), f_q)mstore(0x62e0, result) }mstore(0x6300, mulmod(mload(0x62e0), mload(0x48c0), f_q))mstore(0x6320, mulmod(sub(f_q, mload(0x6300)), mload(0x4c60), f_q))mstore(0x6340, mulmod(mload(0x5160), mload(0x4c60), f_q))mstore(0x6360, addmod(mload(0x62c0), mload(0x6320), f_q))mstore(0x6380, mulmod(mload(0x6360), mload(0x12e0), f_q))mstore(0x63a0, mulmod(mload(0x51e0), mload(0x12e0), f_q))mstore(0x63c0, mulmod(mload(0x5260), mload(0x12e0), f_q))mstore(0x63e0, mulmod(mload(0x5300), mload(0x12e0), f_q))mstore(0x6400, mulmod(mload(0x53a0), mload(0x12e0), f_q))mstore(0x6420, mulmod(mload(0x5440), mload(0x12e0), f_q))mstore(0x6440, mulmod(mload(0x54e0), mload(0x12e0), f_q))mstore(0x6460, mulmod(mload(0x5660), mload(0x12e0), f_q))mstore(0x6480, mulmod(mload(0x56e0), mload(0x12e0), f_q))mstore(0x64a0, mulmod(mload(0x5780), mload(0x12e0), f_q))mstore(0x64c0, mulmod(mload(0x5820), mload(0x12e0), f_q))mstore(0x64e0, mulmod(mload(0x58c0), mload(0x12e0), f_q))mstore(0x6500, mulmod(mload(0x5960), mload(0x12e0), f_q))mstore(0x6520, mulmod(mload(0x5a00), mload(0x12e0), f_q))mstore(0x6540, mulmod(mload(0x5aa0), mload(0x12e0), f_q))mstore(0x6560, mulmod(mload(0x5b40), mload(0x12e0), f_q))mstore(0x6580, mulmod(mload(0x5be0), mload(0x12e0), f_q))mstore(0x65a0, mulmod(mload(0x5c80), mload(0x12e0), f_q))mstore(0x65c0, mulmod(mload(0x5d20), mload(0x12e0), f_q))mstore(0x65e0, mulmod(mload(0x5dc0), mload(0x12e0), f_q))mstore(0x6600, mulmod(mload(0x5e60), mload(0x12e0), f_q))mstore(0x6620, mulmod(mload(0x5f00), mload(0x12e0), f_q))mstore(0x6640, mulmod(mload(0x5fa0), mload(0x12e0), f_q))mstore(0x6660, mulmod(mload(0x6040), mload(0x12e0), f_q))mstore(0x6680, mulmod(mload(0x60e0), mload(0x12e0), f_q))mstore(0x66a0, mulmod(mload(0x6180), mload(0x12e0), f_q))mstore(0x66c0, mulmod(mload(0x6260), mload(0x12e0), f_q))mstore(0x66e0, mulmod(mload(0x6280), mload(0x12e0), f_q))mstore(0x6700, mulmod(mload(0x62a0), mload(0x12e0), f_q))mstore(0x6720, mulmod(mload(0x6340), mload(0x12e0), f_q))mstore(0x6740, addmod(mload(0x50a0), mload(0x6380), f_q))mstore(0x6760, mulmod(1, mload(0x46a0), f_q)){ let result := mulmod(mload(0xf00), mload(0x40e0), f_q)result := addmod(mulmod(mload(0xf20), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0xf40), mload(0x41a0), f_q), result, f_q)mstore(0x6780, result) }mstore(0x67a0, mulmod(mload(0x6780), mload(0x48e0), f_q))mstore(0x67c0, mulmod(sub(f_q, mload(0x67a0)), 1, f_q))mstore(0x67e0, mulmod(mload(0x6760), 1, f_q)){ let result := mulmod(mload(0xf60), mload(0x40e0), f_q)result := addmod(mulmod(mload(0xf80), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0xfa0), mload(0x41a0), f_q), result, f_q)mstore(0x6800, result) }mstore(0x6820, mulmod(mload(0x6800), mload(0x48e0), f_q))mstore(0x6840, mulmod(sub(f_q, mload(0x6820)), mload(0x1280), f_q))mstore(0x6860, mulmod(mload(0x6760), mload(0x1280), f_q))mstore(0x6880, addmod(mload(0x67c0), mload(0x6840), f_q)){ let result := mulmod(mload(0xfc0), mload(0x40e0), f_q)result := addmod(mulmod(mload(0xfe0), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0x1000), mload(0x41a0), f_q), result, f_q)mstore(0x68a0, result) }mstore(0x68c0, mulmod(mload(0x68a0), mload(0x48e0), f_q))mstore(0x68e0, mulmod(sub(f_q, mload(0x68c0)), mload(0x4940), f_q))mstore(0x6900, mulmod(mload(0x6760), mload(0x4940), f_q))mstore(0x6920, addmod(mload(0x6880), mload(0x68e0), f_q)){ let result := mulmod(mload(0x1020), mload(0x40e0), f_q)result := addmod(mulmod(mload(0x1040), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0x1060), mload(0x41a0), f_q), result, f_q)mstore(0x6940, result) }mstore(0x6960, mulmod(mload(0x6940), mload(0x48e0), f_q))mstore(0x6980, mulmod(sub(f_q, mload(0x6960)), mload(0x4960), f_q))mstore(0x69a0, mulmod(mload(0x6760), mload(0x4960), f_q))mstore(0x69c0, addmod(mload(0x6920), mload(0x6980), f_q)){ let result := mulmod(mload(0x1080), mload(0x40e0), f_q)result := addmod(mulmod(mload(0x10a0), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0x10c0), mload(0x41a0), f_q), result, f_q)mstore(0x69e0, result) }mstore(0x6a00, mulmod(mload(0x69e0), mload(0x48e0), f_q))mstore(0x6a20, mulmod(sub(f_q, mload(0x6a00)), mload(0x4980), f_q))mstore(0x6a40, mulmod(mload(0x6760), mload(0x4980), f_q))mstore(0x6a60, addmod(mload(0x69c0), mload(0x6a20), f_q))mstore(0x6a80, mulmod(mload(0x6a60), mload(0x4ca0), f_q))mstore(0x6aa0, mulmod(mload(0x67e0), mload(0x4ca0), f_q))mstore(0x6ac0, mulmod(mload(0x6860), mload(0x4ca0), f_q))mstore(0x6ae0, mulmod(mload(0x6900), mload(0x4ca0), f_q))mstore(0x6b00, mulmod(mload(0x69a0), mload(0x4ca0), f_q))mstore(0x6b20, mulmod(mload(0x6a40), mload(0x4ca0), f_q))mstore(0x6b40, addmod(mload(0x6740), mload(0x6a80), f_q))mstore(0x6b60, mulmod(1, mload(0x46e0), f_q)){ let result := mulmod(mload(0x10e0), mload(0x4220), f_q)result := addmod(mulmod(mload(0x1100), mload(0x4280), f_q), result, f_q)mstore(0x6b80, result) }mstore(0x6ba0, mulmod(mload(0x6b80), mload(0x4900), f_q))mstore(0x6bc0, mulmod(sub(f_q, mload(0x6ba0)), 1, f_q))mstore(0x6be0, mulmod(mload(0x6b60), 1, f_q)){ let result := mulmod(mload(0x1120), mload(0x4220), f_q)result := addmod(mulmod(mload(0x1140), mload(0x4280), f_q), result, f_q)mstore(0x6c00, result) }mstore(0x6c20, mulmod(mload(0x6c00), mload(0x4900), f_q))mstore(0x6c40, mulmod(sub(f_q, mload(0x6c20)), mload(0x1280), f_q))mstore(0x6c60, mulmod(mload(0x6b60), mload(0x1280), f_q))mstore(0x6c80, addmod(mload(0x6bc0), mload(0x6c40), f_q)){ let result := mulmod(mload(0x11c0), mload(0x4220), f_q)result := addmod(mulmod(mload(0x11e0), mload(0x4280), f_q), result, f_q)mstore(0x6ca0, result) }mstore(0x6cc0, mulmod(mload(0x6ca0), mload(0x4900), f_q))mstore(0x6ce0, mulmod(sub(f_q, mload(0x6cc0)), mload(0x4940), f_q))mstore(0x6d00, mulmod(mload(0x6b60), mload(0x4940), f_q))mstore(0x6d20, addmod(mload(0x6c80), mload(0x6ce0), f_q))mstore(0x6d40, mulmod(mload(0x6d20), mload(0x4cc0), f_q))mstore(0x6d60, mulmod(mload(0x6be0), mload(0x4cc0), f_q))mstore(0x6d80, mulmod(mload(0x6c60), mload(0x4cc0), f_q))mstore(0x6da0, mulmod(mload(0x6d00), mload(0x4cc0), f_q))mstore(0x6dc0, addmod(mload(0x6b40), mload(0x6d40), f_q))mstore(0x6de0, mulmod(1, mload(0x4720), f_q)){ let result := mulmod(mload(0x1160), mload(0x42e0), f_q)result := addmod(mulmod(mload(0x1180), mload(0x4340), f_q), result, f_q)mstore(0x6e00, result) }mstore(0x6e20, mulmod(mload(0x6e00), mload(0x4920), f_q))mstore(0x6e40, mulmod(sub(f_q, mload(0x6e20)), 1, f_q))mstore(0x6e60, mulmod(mload(0x6de0), 1, f_q)){ let result := mulmod(mload(0x1200), mload(0x42e0), f_q)result := addmod(mulmod(mload(0x1220), mload(0x4340), f_q), result, f_q)mstore(0x6e80, result) }mstore(0x6ea0, mulmod(mload(0x6e80), mload(0x4920), f_q))mstore(0x6ec0, mulmod(sub(f_q, mload(0x6ea0)), mload(0x1280), f_q))mstore(0x6ee0, mulmod(mload(0x6de0), mload(0x1280), f_q))mstore(0x6f00, addmod(mload(0x6e40), mload(0x6ec0), f_q))mstore(0x6f20, mulmod(mload(0x6f00), mload(0x4ce0), f_q))mstore(0x6f40, mulmod(mload(0x6e60), mload(0x4ce0), f_q))mstore(0x6f60, mulmod(mload(0x6ee0), mload(0x4ce0), f_q))mstore(0x6f80, addmod(mload(0x6dc0), mload(0x6f20), f_q))mstore(0x6fa0, mulmod(1, mload(0x4060), f_q))mstore(0x6fc0, mulmod(1, mload(0x1380), f_q))mstore(0x6fe0, 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(0x7000, 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(0x7020, mload(0x6f80))success := and(eq(staticcall(gas(), 0x7, 0x6fe0, 0x60, 0x6fe0, 0x40), 1), success)mstore(0x7040, mload(0x6fe0)) mstore(0x7060, mload(0x7000))mstore(0x7080, mload(0xc0)) mstore(0x70a0, mload(0xe0))success := and(eq(staticcall(gas(), 0x6, 0x7040, 0x80, 0x7040, 0x40), 1), success)mstore(0x70c0, mload(0x100)) mstore(0x70e0, mload(0x120))mstore(0x7100, mload(0x50c0))success := and(eq(staticcall(gas(), 0x7, 0x70c0, 0x60, 0x70c0, 0x40), 1), success)mstore(0x7120, mload(0x7040)) mstore(0x7140, mload(0x7060))mstore(0x7160, mload(0x70c0)) mstore(0x7180, mload(0x70e0))success := and(eq(staticcall(gas(), 0x6, 0x7120, 0x80, 0x7120, 0x40), 1), success)mstore(0x71a0, mload(0x140)) mstore(0x71c0, mload(0x160))mstore(0x71e0, mload(0x50e0))success := and(eq(staticcall(gas(), 0x7, 0x71a0, 0x60, 0x71a0, 0x40), 1), success)mstore(0x7200, mload(0x7120)) mstore(0x7220, mload(0x7140))mstore(0x7240, mload(0x71a0)) mstore(0x7260, mload(0x71c0))success := and(eq(staticcall(gas(), 0x6, 0x7200, 0x80, 0x7200, 0x40), 1), success)mstore(0x7280, mload(0x180)) mstore(0x72a0, mload(0x1a0))mstore(0x72c0, mload(0x5100))success := and(eq(staticcall(gas(), 0x7, 0x7280, 0x60, 0x7280, 0x40), 1), success)mstore(0x72e0, mload(0x7200)) mstore(0x7300, mload(0x7220))mstore(0x7320, mload(0x7280)) mstore(0x7340, mload(0x72a0))success := and(eq(staticcall(gas(), 0x6, 0x72e0, 0x80, 0x72e0, 0x40), 1), success)mstore(0x7360, mload(0x1c0)) mstore(0x7380, mload(0x1e0))mstore(0x73a0, mload(0x5120))success := and(eq(staticcall(gas(), 0x7, 0x7360, 0x60, 0x7360, 0x40), 1), success)mstore(0x73c0, mload(0x72e0)) mstore(0x73e0, mload(0x7300))mstore(0x7400, mload(0x7360)) mstore(0x7420, mload(0x7380))success := and(eq(staticcall(gas(), 0x6, 0x73c0, 0x80, 0x73c0, 0x40), 1), success)mstore(0x7440, mload(0x200)) mstore(0x7460, mload(0x220))mstore(0x7480, mload(0x5140))success := and(eq(staticcall(gas(), 0x7, 0x7440, 0x60, 0x7440, 0x40), 1), success)mstore(0x74a0, mload(0x73c0)) mstore(0x74c0, mload(0x73e0))mstore(0x74e0, mload(0x7440)) mstore(0x7500, mload(0x7460))success := and(eq(staticcall(gas(), 0x6, 0x74a0, 0x80, 0x74a0, 0x40), 1), success)mstore(0x7520, mload(0x240)) mstore(0x7540, mload(0x260))mstore(0x7560, mload(0x63a0))success := and(eq(staticcall(gas(), 0x7, 0x7520, 0x60, 0x7520, 0x40), 1), success)mstore(0x7580, mload(0x74a0)) mstore(0x75a0, mload(0x74c0))mstore(0x75c0, mload(0x7520)) mstore(0x75e0, mload(0x7540))success := and(eq(staticcall(gas(), 0x6, 0x7580, 0x80, 0x7580, 0x40), 1), success)mstore(0x7600, mload(0x280)) mstore(0x7620, mload(0x2a0))mstore(0x7640, mload(0x63c0))success := and(eq(staticcall(gas(), 0x7, 0x7600, 0x60, 0x7600, 0x40), 1), success)mstore(0x7660, mload(0x7580)) mstore(0x7680, mload(0x75a0))mstore(0x76a0, mload(0x7600)) mstore(0x76c0, mload(0x7620))success := and(eq(staticcall(gas(), 0x6, 0x7660, 0x80, 0x7660, 0x40), 1), success)mstore(0x76e0, mload(0x2c0)) mstore(0x7700, mload(0x2e0))mstore(0x7720, mload(0x63e0))success := and(eq(staticcall(gas(), 0x7, 0x76e0, 0x60, 0x76e0, 0x40), 1), success)mstore(0x7740, mload(0x7660)) mstore(0x7760, mload(0x7680))mstore(0x7780, mload(0x76e0)) mstore(0x77a0, mload(0x7700))success := and(eq(staticcall(gas(), 0x6, 0x7740, 0x80, 0x7740, 0x40), 1), success)mstore(0x77c0, mload(0x3a0)) mstore(0x77e0, mload(0x3c0))mstore(0x7800, mload(0x6400))success := and(eq(staticcall(gas(), 0x7, 0x77c0, 0x60, 0x77c0, 0x40), 1), success)mstore(0x7820, mload(0x7740)) mstore(0x7840, mload(0x7760))mstore(0x7860, mload(0x77c0)) mstore(0x7880, mload(0x77e0))success := and(eq(staticcall(gas(), 0x6, 0x7820, 0x80, 0x7820, 0x40), 1), success)mstore(0x78a0, mload(0x420)) mstore(0x78c0, mload(0x440))mstore(0x78e0, mload(0x6420))success := and(eq(staticcall(gas(), 0x7, 0x78a0, 0x60, 0x78a0, 0x40), 1), success)mstore(0x7900, mload(0x7820)) mstore(0x7920, mload(0x7840))mstore(0x7940, mload(0x78a0)) mstore(0x7960, mload(0x78c0))success := and(eq(staticcall(gas(), 0x6, 0x7900, 0x80, 0x7900, 0x40), 1), success)mstore(0x7980, 0x0d3b7c04b7391ddf5d9fc5f8906033e1d1442f341c4cab5c1584c8082ea8c21c) mstore(0x79a0, 0x1596df7247ab32fb79261c31617e2f2bbde95b6e8719386dacfeaa8f6d7df60c)mstore(0x79c0, mload(0x6440))success := and(eq(staticcall(gas(), 0x7, 0x7980, 0x60, 0x7980, 0x40), 1), success)mstore(0x79e0, mload(0x7900)) mstore(0x7a00, mload(0x7920))mstore(0x7a20, mload(0x7980)) mstore(0x7a40, mload(0x79a0))success := and(eq(staticcall(gas(), 0x6, 0x79e0, 0x80, 0x79e0, 0x40), 1), success)mstore(0x7a60, 0x04d043081f0d55eead6d8ad7b10d09a6ee2718f445d9bce454075a8a37bacaf3) mstore(0x7a80, 0x27d6bcbb02cd624ab80b5532a0a65fc6f88a0faf7cf3e0d106f4aa0aa25e758b)mstore(0x7aa0, mload(0x6460))success := and(eq(staticcall(gas(), 0x7, 0x7a60, 0x60, 0x7a60, 0x40), 1), success)mstore(0x7ac0, mload(0x79e0)) mstore(0x7ae0, mload(0x7a00))mstore(0x7b00, mload(0x7a60)) mstore(0x7b20, mload(0x7a80))success := and(eq(staticcall(gas(), 0x6, 0x7ac0, 0x80, 0x7ac0, 0x40), 1), success)mstore(0x7b40, 0x2d07a1bca289cdb98b648a91cbb0809dfa3a06fe01047b291d1161ddf8d1732c) mstore(0x7b60, 0x021d078d5869c57b3fe2413b517561205de5f297ac56c0e5ef0f1a7f4a31ee94)mstore(0x7b80, mload(0x6480))success := and(eq(staticcall(gas(), 0x7, 0x7b40, 0x60, 0x7b40, 0x40), 1), success)mstore(0x7ba0, mload(0x7ac0)) mstore(0x7bc0, mload(0x7ae0))mstore(0x7be0, mload(0x7b40)) mstore(0x7c00, mload(0x7b60))success := and(eq(staticcall(gas(), 0x6, 0x7ba0, 0x80, 0x7ba0, 0x40), 1), success)mstore(0x7c20, 0x2808de5f33581574dd857304add28f30335fa32c49a3d7c9128f5a3f453360cc) mstore(0x7c40, 0x07f10d421231cb6aa063db7a3cf7be709ff037fbb78d19c866d7c2c674a1aaf0)mstore(0x7c60, mload(0x64a0))success := and(eq(staticcall(gas(), 0x7, 0x7c20, 0x60, 0x7c20, 0x40), 1), success)mstore(0x7c80, mload(0x7ba0)) mstore(0x7ca0, mload(0x7bc0))mstore(0x7cc0, mload(0x7c20)) mstore(0x7ce0, mload(0x7c40))success := and(eq(staticcall(gas(), 0x6, 0x7c80, 0x80, 0x7c80, 0x40), 1), success)mstore(0x7d00, 0x2a9d8bc0a06a141e47fa114e4e62686823227f5416f19f9b2b54b9948a0bfb4b) mstore(0x7d20, 0x170610ca7497030a3dbbfeb52cc8f5f086e7a7a91e3b52e44988e6b24f1c6c34)mstore(0x7d40, mload(0x64c0))success := and(eq(staticcall(gas(), 0x7, 0x7d00, 0x60, 0x7d00, 0x40), 1), success)mstore(0x7d60, mload(0x7c80)) mstore(0x7d80, mload(0x7ca0))mstore(0x7da0, mload(0x7d00)) mstore(0x7dc0, mload(0x7d20))success := and(eq(staticcall(gas(), 0x6, 0x7d60, 0x80, 0x7d60, 0x40), 1), success)mstore(0x7de0, 0x104eb8e796d7c0b0ac9eb316eac3aadbcf9ac5b42d4b14a95ec269fefd70d9ac) mstore(0x7e00, 0x22e1365078923b7f828a54c75e0b0b108c311580bac730c92d8868c7781a917b)mstore(0x7e20, mload(0x64e0))success := and(eq(staticcall(gas(), 0x7, 0x7de0, 0x60, 0x7de0, 0x40), 1), success)mstore(0x7e40, mload(0x7d60)) mstore(0x7e60, mload(0x7d80))mstore(0x7e80, mload(0x7de0)) mstore(0x7ea0, mload(0x7e00))success := and(eq(staticcall(gas(), 0x6, 0x7e40, 0x80, 0x7e40, 0x40), 1), success)mstore(0x7ec0, 0x2e8f499835598c80e2ec4cabd4753e67822df35d0a29c05b60dca21d9173b11a) mstore(0x7ee0, 0x02990fa09b4831443e5956b84832f525976cd30aa6cafe055a45f7a04328d00f)mstore(0x7f00, mload(0x6500))success := and(eq(staticcall(gas(), 0x7, 0x7ec0, 0x60, 0x7ec0, 0x40), 1), success)mstore(0x7f20, mload(0x7e40)) mstore(0x7f40, mload(0x7e60))mstore(0x7f60, mload(0x7ec0)) mstore(0x7f80, mload(0x7ee0))success := and(eq(staticcall(gas(), 0x6, 0x7f20, 0x80, 0x7f20, 0x40), 1), success)mstore(0x7fa0, 0x258bbf1a0f256c29c1cee612fb7deaa2102870b85d7bda1ac8064307a593101f) mstore(0x7fc0, 0x2bbbde7d34cf03b70ea4a0125d6736aeb56da64f07226bf4d662a85e8d50db3a)mstore(0x7fe0, mload(0x6520))success := and(eq(staticcall(gas(), 0x7, 0x7fa0, 0x60, 0x7fa0, 0x40), 1), success)mstore(0x8000, mload(0x7f20)) mstore(0x8020, mload(0x7f40))mstore(0x8040, mload(0x7fa0)) mstore(0x8060, mload(0x7fc0))success := and(eq(staticcall(gas(), 0x6, 0x8000, 0x80, 0x8000, 0x40), 1), success)mstore(0x8080, 0x05127b4a2ff58c747435761c7256b8094a0cf4e6d0f829a060c601d5cce0fdc0) mstore(0x80a0, 0x106a8cecab556f1a6d729cdeefd6dd70afbe4954cae4785871d68396dba88d95)mstore(0x80c0, mload(0x6540))success := and(eq(staticcall(gas(), 0x7, 0x8080, 0x60, 0x8080, 0x40), 1), success)mstore(0x80e0, mload(0x8000)) mstore(0x8100, mload(0x8020))mstore(0x8120, mload(0x8080)) mstore(0x8140, mload(0x80a0))success := and(eq(staticcall(gas(), 0x6, 0x80e0, 0x80, 0x80e0, 0x40), 1), success)mstore(0x8160, 0x24c985411f901ba3e9fe3296d58db7a896d53a060afc4c3b85182122d2a06b16) mstore(0x8180, 0x1e02136b244f617c37779b0cb970dce25ff03579c671e7f3f57a320e7b1a4b06)mstore(0x81a0, mload(0x6560))success := and(eq(staticcall(gas(), 0x7, 0x8160, 0x60, 0x8160, 0x40), 1), success)mstore(0x81c0, mload(0x80e0)) mstore(0x81e0, mload(0x8100))mstore(0x8200, mload(0x8160)) mstore(0x8220, mload(0x8180))success := and(eq(staticcall(gas(), 0x6, 0x81c0, 0x80, 0x81c0, 0x40), 1), success)mstore(0x8240, 0x0e5c5a486399e328a6629926a042fde07863ce1a2e91995ee60e5c477008ebdc) mstore(0x8260, 0x223b4bdd8d3877955728258fd5be1b7f2ac8093891a83c738f80395720cc55ca)mstore(0x8280, mload(0x6580))success := and(eq(staticcall(gas(), 0x7, 0x8240, 0x60, 0x8240, 0x40), 1), success)mstore(0x82a0, mload(0x81c0)) mstore(0x82c0, mload(0x81e0))mstore(0x82e0, mload(0x8240)) mstore(0x8300, mload(0x8260))success := and(eq(staticcall(gas(), 0x6, 0x82a0, 0x80, 0x82a0, 0x40), 1), success)mstore(0x8320, 0x2e55f008e10b629fc37b0808b8264d2857e6fa34a1be704a4132f9c1621b8736) mstore(0x8340, 0x01c3487db12618c270ffe8251633753bdad9fd2968144a02b18447bee326d19d)mstore(0x8360, mload(0x65a0))success := and(eq(staticcall(gas(), 0x7, 0x8320, 0x60, 0x8320, 0x40), 1), success)mstore(0x8380, mload(0x82a0)) mstore(0x83a0, mload(0x82c0))mstore(0x83c0, mload(0x8320)) mstore(0x83e0, mload(0x8340))success := and(eq(staticcall(gas(), 0x6, 0x8380, 0x80, 0x8380, 0x40), 1), success)mstore(0x8400, 0x0154bffa5c54063b60c4f4c66b2a9acb09fd7f1b2653a9f2b9ee75bcb1bc8ba2) mstore(0x8420, 0x0b15f039df5ebe088e2231ce9a07c50dbb4739402712b56dd8bab6ab93a95f3f)mstore(0x8440, mload(0x65c0))success := and(eq(staticcall(gas(), 0x7, 0x8400, 0x60, 0x8400, 0x40), 1), success)mstore(0x8460, mload(0x8380)) mstore(0x8480, mload(0x83a0))mstore(0x84a0, mload(0x8400)) mstore(0x84c0, mload(0x8420))success := and(eq(staticcall(gas(), 0x6, 0x8460, 0x80, 0x8460, 0x40), 1), success)mstore(0x84e0, 0x0032a37f146820eccad7796039d21d0c85504baff34e194f750d7f8c4eccf729) mstore(0x8500, 0x2a655340cddc523abd37c3d77f022b8e616194a3c31e414dc5d466eb2e4c0b69)mstore(0x8520, mload(0x65e0))success := and(eq(staticcall(gas(), 0x7, 0x84e0, 0x60, 0x84e0, 0x40), 1), success)mstore(0x8540, mload(0x8460)) mstore(0x8560, mload(0x8480))mstore(0x8580, mload(0x84e0)) mstore(0x85a0, mload(0x8500))success := and(eq(staticcall(gas(), 0x6, 0x8540, 0x80, 0x8540, 0x40), 1), success)mstore(0x85c0, 0x0d6b367e25327ebd99fae2aaffa6fad2acae34ba7b329ef817a95fe425f65e4d) mstore(0x85e0, 0x2bc4769ce00a494fde791f07b3f092019995d323c0b067d61e0660e1ad84d94f)mstore(0x8600, mload(0x6600))success := and(eq(staticcall(gas(), 0x7, 0x85c0, 0x60, 0x85c0, 0x40), 1), success)mstore(0x8620, mload(0x8540)) mstore(0x8640, mload(0x8560))mstore(0x8660, mload(0x85c0)) mstore(0x8680, mload(0x85e0))success := and(eq(staticcall(gas(), 0x6, 0x8620, 0x80, 0x8620, 0x40), 1), success)mstore(0x86a0, 0x0fef43d29ecdb947fc934c7adf7f38748fe212082d5a8e3bc621ff907213812b) mstore(0x86c0, 0x1ab8ccbb8486a5508a34837db62c3426d6f6210970a2b1351f12d0ba73e11874)mstore(0x86e0, mload(0x6620))success := and(eq(staticcall(gas(), 0x7, 0x86a0, 0x60, 0x86a0, 0x40), 1), success)mstore(0x8700, mload(0x8620)) mstore(0x8720, mload(0x8640))mstore(0x8740, mload(0x86a0)) mstore(0x8760, mload(0x86c0))success := and(eq(staticcall(gas(), 0x6, 0x8700, 0x80, 0x8700, 0x40), 1), success)mstore(0x8780, 0x29cc03da3870fc7139115d43275baf04cc110d79f85d2c2e712b981c409df25e) mstore(0x87a0, 0x016a8cd002e522595ef910f87dc707449ae5f56876eb88274b2e586fceacf165)mstore(0x87c0, mload(0x6640))success := and(eq(staticcall(gas(), 0x7, 0x8780, 0x60, 0x8780, 0x40), 1), success)mstore(0x87e0, mload(0x8700)) mstore(0x8800, mload(0x8720))mstore(0x8820, mload(0x8780)) mstore(0x8840, mload(0x87a0))success := and(eq(staticcall(gas(), 0x6, 0x87e0, 0x80, 0x87e0, 0x40), 1), success)mstore(0x8860, 0x0ec6d72e2ce7c233ca8af2fc2bd4223a6d81d545e8785579de4cb241740f36a2) mstore(0x8880, 0x028a4450999577e25fc7d191fecf7f1a8a0526f7e042f316767c7ff43299fdd9)mstore(0x88a0, mload(0x6660))success := and(eq(staticcall(gas(), 0x7, 0x8860, 0x60, 0x8860, 0x40), 1), success)mstore(0x88c0, mload(0x87e0)) mstore(0x88e0, mload(0x8800))mstore(0x8900, mload(0x8860)) mstore(0x8920, mload(0x8880))success := and(eq(staticcall(gas(), 0x6, 0x88c0, 0x80, 0x88c0, 0x40), 1), success)mstore(0x8940, 0x1fdb57cefe9c10024dfe402759cad8061e8d0edeba3f42f187ea796b1938118e) mstore(0x8960, 0x1294d92ed67eec88a2adbb5cef0682a64fae9827c02d37e69beaddd3b6a145ad)mstore(0x8980, mload(0x6680))success := and(eq(staticcall(gas(), 0x7, 0x8940, 0x60, 0x8940, 0x40), 1), success)mstore(0x89a0, mload(0x88c0)) mstore(0x89c0, mload(0x88e0))mstore(0x89e0, mload(0x8940)) mstore(0x8a00, mload(0x8960))success := and(eq(staticcall(gas(), 0x6, 0x89a0, 0x80, 0x89a0, 0x40), 1), success)mstore(0x8a20, 0x292267e75402bf3fb816d404fe987ec7b277ec539cd653568a31dc8fdd04b6f1) mstore(0x8a40, 0x0a2975f29c8f29df52ea4e941daa28752eea2da8c6b6135622e4a0d823accd78)mstore(0x8a60, mload(0x66a0))success := and(eq(staticcall(gas(), 0x7, 0x8a20, 0x60, 0x8a20, 0x40), 1), success)mstore(0x8a80, mload(0x89a0)) mstore(0x8aa0, mload(0x89c0))mstore(0x8ac0, mload(0x8a20)) mstore(0x8ae0, mload(0x8a40))success := and(eq(staticcall(gas(), 0x6, 0x8a80, 0x80, 0x8a80, 0x40), 1), success)mstore(0x8b00, mload(0x7c0)) mstore(0x8b20, mload(0x7e0))mstore(0x8b40, mload(0x66c0))success := and(eq(staticcall(gas(), 0x7, 0x8b00, 0x60, 0x8b00, 0x40), 1), success)mstore(0x8b60, mload(0x8a80)) mstore(0x8b80, mload(0x8aa0))mstore(0x8ba0, mload(0x8b00)) mstore(0x8bc0, mload(0x8b20))success := and(eq(staticcall(gas(), 0x6, 0x8b60, 0x80, 0x8b60, 0x40), 1), success)mstore(0x8be0, mload(0x800)) mstore(0x8c00, mload(0x820))mstore(0x8c20, mload(0x66e0))success := and(eq(staticcall(gas(), 0x7, 0x8be0, 0x60, 0x8be0, 0x40), 1), success)mstore(0x8c40, mload(0x8b60)) mstore(0x8c60, mload(0x8b80))mstore(0x8c80, mload(0x8be0)) mstore(0x8ca0, mload(0x8c00))success := and(eq(staticcall(gas(), 0x6, 0x8c40, 0x80, 0x8c40, 0x40), 1), success)mstore(0x8cc0, mload(0x840)) mstore(0x8ce0, mload(0x860))mstore(0x8d00, mload(0x6700))success := and(eq(staticcall(gas(), 0x7, 0x8cc0, 0x60, 0x8cc0, 0x40), 1), success)mstore(0x8d20, mload(0x8c40)) mstore(0x8d40, mload(0x8c60))mstore(0x8d60, mload(0x8cc0)) mstore(0x8d80, mload(0x8ce0))success := and(eq(staticcall(gas(), 0x6, 0x8d20, 0x80, 0x8d20, 0x40), 1), success)mstore(0x8da0, mload(0x720)) mstore(0x8dc0, mload(0x740))mstore(0x8de0, mload(0x6720))success := and(eq(staticcall(gas(), 0x7, 0x8da0, 0x60, 0x8da0, 0x40), 1), success)mstore(0x8e00, mload(0x8d20)) mstore(0x8e20, mload(0x8d40))mstore(0x8e40, mload(0x8da0)) mstore(0x8e60, mload(0x8dc0))success := and(eq(staticcall(gas(), 0x6, 0x8e00, 0x80, 0x8e00, 0x40), 1), success)mstore(0x8e80, mload(0x520)) mstore(0x8ea0, mload(0x540))mstore(0x8ec0, mload(0x6aa0))success := and(eq(staticcall(gas(), 0x7, 0x8e80, 0x60, 0x8e80, 0x40), 1), success)mstore(0x8ee0, mload(0x8e00)) mstore(0x8f00, mload(0x8e20))mstore(0x8f20, mload(0x8e80)) mstore(0x8f40, mload(0x8ea0))success := and(eq(staticcall(gas(), 0x6, 0x8ee0, 0x80, 0x8ee0, 0x40), 1), success)mstore(0x8f60, mload(0x560)) mstore(0x8f80, mload(0x580))mstore(0x8fa0, mload(0x6ac0))success := and(eq(staticcall(gas(), 0x7, 0x8f60, 0x60, 0x8f60, 0x40), 1), success)mstore(0x8fc0, mload(0x8ee0)) mstore(0x8fe0, mload(0x8f00))mstore(0x9000, mload(0x8f60)) mstore(0x9020, mload(0x8f80))success := and(eq(staticcall(gas(), 0x6, 0x8fc0, 0x80, 0x8fc0, 0x40), 1), success)mstore(0x9040, mload(0x5a0)) mstore(0x9060, mload(0x5c0))mstore(0x9080, mload(0x6ae0))success := and(eq(staticcall(gas(), 0x7, 0x9040, 0x60, 0x9040, 0x40), 1), success)mstore(0x90a0, mload(0x8fc0)) mstore(0x90c0, mload(0x8fe0))mstore(0x90e0, mload(0x9040)) mstore(0x9100, mload(0x9060))success := and(eq(staticcall(gas(), 0x6, 0x90a0, 0x80, 0x90a0, 0x40), 1), success)mstore(0x9120, mload(0x5e0)) mstore(0x9140, mload(0x600))mstore(0x9160, mload(0x6b00))success := and(eq(staticcall(gas(), 0x7, 0x9120, 0x60, 0x9120, 0x40), 1), success)mstore(0x9180, mload(0x90a0)) mstore(0x91a0, mload(0x90c0))mstore(0x91c0, mload(0x9120)) mstore(0x91e0, mload(0x9140))success := and(eq(staticcall(gas(), 0x6, 0x9180, 0x80, 0x9180, 0x40), 1), success)mstore(0x9200, mload(0x620)) mstore(0x9220, mload(0x640))mstore(0x9240, mload(0x6b20))success := and(eq(staticcall(gas(), 0x7, 0x9200, 0x60, 0x9200, 0x40), 1), success)mstore(0x9260, mload(0x9180)) mstore(0x9280, mload(0x91a0))mstore(0x92a0, mload(0x9200)) mstore(0x92c0, mload(0x9220))success := and(eq(staticcall(gas(), 0x6, 0x9260, 0x80, 0x9260, 0x40), 1), success)mstore(0x92e0, mload(0x660)) mstore(0x9300, mload(0x680))mstore(0x9320, mload(0x6d60))success := and(eq(staticcall(gas(), 0x7, 0x92e0, 0x60, 0x92e0, 0x40), 1), success)mstore(0x9340, mload(0x9260)) mstore(0x9360, mload(0x9280))mstore(0x9380, mload(0x92e0)) mstore(0x93a0, mload(0x9300))success := and(eq(staticcall(gas(), 0x6, 0x9340, 0x80, 0x9340, 0x40), 1), success)mstore(0x93c0, mload(0x6a0)) mstore(0x93e0, mload(0x6c0))mstore(0x9400, mload(0x6d80))success := and(eq(staticcall(gas(), 0x7, 0x93c0, 0x60, 0x93c0, 0x40), 1), success)mstore(0x9420, mload(0x9340)) mstore(0x9440, mload(0x9360))mstore(0x9460, mload(0x93c0)) mstore(0x9480, mload(0x93e0))success := and(eq(staticcall(gas(), 0x6, 0x9420, 0x80, 0x9420, 0x40), 1), success)mstore(0x94a0, mload(0x6e0)) mstore(0x94c0, mload(0x700))mstore(0x94e0, mload(0x6da0))success := and(eq(staticcall(gas(), 0x7, 0x94a0, 0x60, 0x94a0, 0x40), 1), success)mstore(0x9500, mload(0x9420)) mstore(0x9520, mload(0x9440))mstore(0x9540, mload(0x94a0)) mstore(0x9560, mload(0x94c0))success := and(eq(staticcall(gas(), 0x6, 0x9500, 0x80, 0x9500, 0x40), 1), success)mstore(0x9580, mload(0x360)) mstore(0x95a0, mload(0x380))mstore(0x95c0, mload(0x6f40))success := and(eq(staticcall(gas(), 0x7, 0x9580, 0x60, 0x9580, 0x40), 1), success)mstore(0x95e0, mload(0x9500)) mstore(0x9600, mload(0x9520))mstore(0x9620, mload(0x9580)) mstore(0x9640, mload(0x95a0))success := and(eq(staticcall(gas(), 0x6, 0x95e0, 0x80, 0x95e0, 0x40), 1), success)mstore(0x9660, mload(0x3e0)) mstore(0x9680, mload(0x400))mstore(0x96a0, mload(0x6f60))success := and(eq(staticcall(gas(), 0x7, 0x9660, 0x60, 0x9660, 0x40), 1), success)mstore(0x96c0, mload(0x95e0)) mstore(0x96e0, mload(0x9600))mstore(0x9700, mload(0x9660)) mstore(0x9720, mload(0x9680))success := and(eq(staticcall(gas(), 0x6, 0x96c0, 0x80, 0x96c0, 0x40), 1), success)mstore(0x9740, mload(0x1320)) mstore(0x9760, mload(0x1340))mstore(0x9780, sub(f_q, mload(0x6fa0)))success := and(eq(staticcall(gas(), 0x7, 0x9740, 0x60, 0x9740, 0x40), 1), success)mstore(0x97a0, mload(0x96c0)) mstore(0x97c0, mload(0x96e0))mstore(0x97e0, mload(0x9740)) mstore(0x9800, mload(0x9760))success := and(eq(staticcall(gas(), 0x6, 0x97a0, 0x80, 0x97a0, 0x40), 1), success)mstore(0x9820, mload(0x13c0)) mstore(0x9840, mload(0x13e0))mstore(0x9860, mload(0x6fc0))success := and(eq(staticcall(gas(), 0x7, 0x9820, 0x60, 0x9820, 0x40), 1), success)mstore(0x9880, mload(0x97a0)) mstore(0x98a0, mload(0x97c0))mstore(0x98c0, mload(0x9820)) mstore(0x98e0, mload(0x9840))success := and(eq(staticcall(gas(), 0x6, 0x9880, 0x80, 0x9880, 0x40), 1), success)mstore(0x9900, mload(0x9880)) mstore(0x9920, mload(0x98a0))mstore(0x9940, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(0x9960, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(0x9980, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(0x99a0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(0x99c0, mload(0x13c0)) mstore(0x99e0, mload(0x13e0))mstore(0x9a00, 0x0181624e80f3d6ae28df7e01eaeab1c0e919877a3b8a6b7fbc69a6817d596ea2) mstore(0x9a20, 0x1783d30dcb12d259bb89098addf6280fa4b653be7a152542a28f7b926e27e648) mstore(0x9a40, 0x00ae44489d41a0d179e2dfdc03bddd883b7109f8b6ae316a59e815c1a6b35304) mstore(0x9a60, 0x0b2147ab62a386bd63e6de1522109b8c9588ab466f5aadfde8c41ca3749423ee)success := and(eq(staticcall(gas(), 0x8, 0x9900, 0x180, 0x9900, 0x20), 1), success)success := and(eq(mload(0x9900), 1), success) // Revert if anything fails if iszero(success) { revert(0, 0) }} return success; } } diff --git a/lightclient-circuits/src/committee_update_circuit.rs b/lightclient-circuits/src/committee_update_circuit.rs index 018c01ea..3417837c 100644 --- a/lightclient-circuits/src/committee_update_circuit.rs +++ b/lightclient-circuits/src/committee_update_circuit.rs @@ -217,10 +217,10 @@ impl AppCircuit for CommitteeUpdateCircuit { let fp_chip = FpChip::new(&range, LIMB_BITS, NUM_LIMBS); let assigned_instances = Self::synthesize(&mut builder, &fp_chip, witness)?; + builder.set_instances(0, assigned_instances); match stage { CircuitBuilderStage::Prover => { - builder.set_instances(0, assigned_instances); if let Some(pinning) = pinning { builder.set_params(pinning.params); builder.set_break_points(pinning.break_points); diff --git a/lightclient-circuits/src/sync_step_circuit.rs b/lightclient-circuits/src/sync_step_circuit.rs index 9029b61c..c78e5ebc 100644 --- a/lightclient-circuits/src/sync_step_circuit.rs +++ b/lightclient-circuits/src/sync_step_circuit.rs @@ -390,10 +390,10 @@ impl AppCircuit for StepCircuit { let fp_chip = FpChip::new(&range, LIMB_BITS, NUM_LIMBS); let assigned_instances = Self::synthesize(&mut builder, &fp_chip, args)?; + builder.set_instances(0, assigned_instances); match stage { CircuitBuilderStage::Prover => { - builder.set_instances(0, assigned_instances); if let Some(pinning) = pinning { builder.set_params(pinning.params); builder.set_break_points(pinning.break_points); diff --git a/prover/src/cli.rs b/prover/src/cli.rs index af552fec..d1cdfb73 100644 --- a/prover/src/cli.rs +++ b/prover/src/cli.rs @@ -191,7 +191,7 @@ fn gen_evm_verifier( let num_instances = { let circuit = Circuit::create_circuit( - CircuitBuilderStage::Mock, + CircuitBuilderStage::Keygen, None, &default_witness, params.k(), From 02ac2bab770a25690d40ff0bc9a21f9644a8ba87 Mon Sep 17 00:00:00 2001 From: Timofey Luin Date: Mon, 4 Dec 2023 17:04:32 +0100 Subject: [PATCH 14/14] fix solidity contract generation --- Cargo.toml | 5 ++-- contracts/rust-abi/lib.rs | 2 +- contracts/script/DeploySpectre.s.sol | 2 +- contracts/script/DeploySpectreTestnet.s.sol | 27 +++++++++++++++++++ contracts/script/deploy_testnet.sh | 6 +++++ .../committee_update_aggregated.sol | 23 ---------------- .../committee_update_verifier.sol | 23 ++++++++++++++++ contracts/snark-verifiers/sync_step.sol | 2 +- justfile | 4 +-- 9 files changed, 64 insertions(+), 30 deletions(-) create mode 100644 contracts/script/DeploySpectreTestnet.s.sol create mode 100644 contracts/script/deploy_testnet.sh delete mode 100644 contracts/snark-verifiers/committee_update_aggregated.sol create mode 100644 contracts/snark-verifiers/committee_update_verifier.sol diff --git a/Cargo.toml b/Cargo.toml index 1abbddd2..e44c3dda 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -114,7 +114,8 @@ zkevm-hashes = { git = "https://github.com/timoftime/halo2-lib", branch = "feat/ [patch."https://github.com/axiom-crypto/snark-verifier.git"] -snark-verifier = { git = "https://github.com/timoftime/snark-verifier", branch = "halo2-pse-fix", default-features = false } -snark-verifier-sdk = { git = "https://github.com/timoftime/snark-verifier", branch = "halo2-pse-fix", default-features = false } +snark-verifier = { git = "https://github.com/timoftime/snark-verifier", branch = "yul-codegen", default-features = false } +snark-verifier-sdk = { git = "https://github.com/timoftime/snark-verifier", branch = "yul-codegen", default-features = false } # snark-verifier = { path = "../snark-verifier/snark-verifier" } # snark-verifier-sdk = { path = "../snark-verifier/snark-verifier-sdk" } + diff --git a/contracts/rust-abi/lib.rs b/contracts/rust-abi/lib.rs index ca7cc0e5..df58061d 100644 --- a/contracts/rust-abi/lib.rs +++ b/contracts/rust-abi/lib.rs @@ -14,7 +14,7 @@ abigen!( StepVerifier, "./out/sync_step.sol/Verifier.json"; CommitteeUpdateVerifier, - "./out/committee_update_aggregated.sol/Verifier.json"; + "./out/committee_update_verifier.sol/Verifier.json"; StepMockVerifier, "./out/SyncStepMockVerifier.sol/SyncStepMockVerifier.json"; CommitteeUpdateMockVerifier, diff --git a/contracts/script/DeploySpectre.s.sol b/contracts/script/DeploySpectre.s.sol index 191b4721..c15bc133 100644 --- a/contracts/script/DeploySpectre.s.sol +++ b/contracts/script/DeploySpectre.s.sol @@ -5,7 +5,7 @@ import "forge-std/Script.sol"; import {Spectre} from "../src/Spectre.sol"; import {Verifier as SyncStepVerifier} from "../snark-verifiers/sync_step.sol"; -import {Verifier as CommitteeUpdateVerifier} from "../snark-verifiers/committee_update_aggregated.sol"; +import {Verifier as CommitteeUpdateVerifier} from "../snark-verifiers/committee_update_verifier.sol"; contract DeploySpectre is Script { diff --git a/contracts/script/DeploySpectreTestnet.s.sol b/contracts/script/DeploySpectreTestnet.s.sol new file mode 100644 index 00000000..c15bc133 --- /dev/null +++ b/contracts/script/DeploySpectreTestnet.s.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Script.sol"; + +import {Spectre} from "../src/Spectre.sol"; +import {Verifier as SyncStepVerifier} from "../snark-verifiers/sync_step.sol"; +import {Verifier as CommitteeUpdateVerifier} from "../snark-verifiers/committee_update_verifier.sol"; + +contract DeploySpectre is Script { + + function run() external { + uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PRIVATE_KEY"); + uint256 initialSyncPeriod = vm.envUint("INITIAL_SYNC_PERIOD"); + bytes32 initialCommitteePoseidon = vm.envBytes32("INITIAL_COMMITTEE_POSEIDON"); + uint256 slotsPerPeriod = vm.envUint("SLOTS_PER_PERIOD"); + + vm.startBroadcast(deployerPrivateKey); + + SyncStepVerifier stepVerifier = new SyncStepVerifier(); + CommitteeUpdateVerifier updateVerifier = new CommitteeUpdateVerifier(); + + Spectre spectre = new Spectre(address(stepVerifier), address(updateVerifier), initialSyncPeriod, initialCommitteePoseidon, slotsPerPeriod); + + vm.stopBroadcast(); + } +} diff --git a/contracts/script/deploy_testnet.sh b/contracts/script/deploy_testnet.sh new file mode 100644 index 00000000..e69b26f8 --- /dev/null +++ b/contracts/script/deploy_testnet.sh @@ -0,0 +1,6 @@ +#!/bin/sh +cd $(git rev-parse --show-toplevel) +source .env +LOCAL_RPC_URL="http://localhost:8545" + +forge script script/DeploySpectreTestnet.s.sol:DeploySpectre --private-key $ANVIL_PRIVATE_KEY --rpc-url $LOCAL_RPC_URL --broadcast -vvvv diff --git a/contracts/snark-verifiers/committee_update_aggregated.sol b/contracts/snark-verifiers/committee_update_aggregated.sol deleted file mode 100644 index 0e46725b..00000000 --- a/contracts/snark-verifiers/committee_update_aggregated.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[65] calldata pubInputs, - bytes calldata proof - ) public view returns (bool) { - bool success = true; - bytes32[1232] 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(0x64), f_q))mstore(0xe0, mod(calldataload(0x84), f_q))mstore(0x100, mod(calldataload(0xa4), f_q))mstore(0x120, mod(calldataload(0xc4), f_q))mstore(0x140, mod(calldataload(0xe4), f_q))mstore(0x160, mod(calldataload(0x104), f_q))mstore(0x180, mod(calldataload(0x124), f_q))mstore(0x1a0, mod(calldataload(0x144), f_q))mstore(0x1c0, mod(calldataload(0x164), f_q))mstore(0x1e0, mod(calldataload(0x184), f_q))mstore(0x200, mod(calldataload(0x1a4), f_q))mstore(0x80, 938337048247040967907199320956470111355537465130939797301108084530768572301) { let x := calldataload(0x1c4) mstore(0x220, x) let y := calldataload(0x1e4) mstore(0x240, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x204) mstore(0x260, x) let y := calldataload(0x224) mstore(0x280, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x244) mstore(0x2a0, x) let y := calldataload(0x264) mstore(0x2c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x284) mstore(0x2e0, x) let y := calldataload(0x2a4) mstore(0x300, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x2c4) mstore(0x320, x) let y := calldataload(0x2e4) mstore(0x340, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x304) mstore(0x360, x) let y := calldataload(0x324) mstore(0x380, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x344) mstore(0x3a0, x) let y := calldataload(0x364) mstore(0x3c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x384) mstore(0x3e0, x) let y := calldataload(0x3a4) mstore(0x400, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x3c4) mstore(0x420, x) let y := calldataload(0x3e4) mstore(0x440, y) success := and(validate_ec_point(x, y), success) }mstore(0x460, keccak256(0x80, 992)){ let hash := mload(0x460) mstore(0x480, mod(hash, f_q)) mstore(0x4a0, hash) } { let x := calldataload(0x404) mstore(0x4c0, x) let y := calldataload(0x424) mstore(0x4e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x444) mstore(0x500, x) let y := calldataload(0x464) mstore(0x520, y) success := and(validate_ec_point(x, y), success) }mstore(0x540, keccak256(0x4a0, 160)){ let hash := mload(0x540) mstore(0x560, mod(hash, f_q)) mstore(0x580, hash) }mstore8(0x5a0, 1)mstore(0x5a0, keccak256(0x580, 33)){ let hash := mload(0x5a0) mstore(0x5c0, mod(hash, f_q)) mstore(0x5e0, hash) } { let x := calldataload(0x484) mstore(0x600, x) let y := calldataload(0x4a4) mstore(0x620, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4c4) mstore(0x640, x) let y := calldataload(0x4e4) mstore(0x660, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x504) mstore(0x680, x) let y := calldataload(0x524) mstore(0x6a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x544) mstore(0x6c0, x) let y := calldataload(0x564) mstore(0x6e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x584) mstore(0x700, x) let y := calldataload(0x5a4) mstore(0x720, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x5c4) mstore(0x740, x) let y := calldataload(0x5e4) mstore(0x760, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x604) mstore(0x780, x) let y := calldataload(0x624) mstore(0x7a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x644) mstore(0x7c0, x) let y := calldataload(0x664) mstore(0x7e0, y) success := and(validate_ec_point(x, y), success) }mstore(0x800, keccak256(0x5e0, 544)){ let hash := mload(0x800) mstore(0x820, mod(hash, f_q)) mstore(0x840, hash) } { let x := calldataload(0x684) mstore(0x860, x) let y := calldataload(0x6a4) mstore(0x880, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x6c4) mstore(0x8a0, x) let y := calldataload(0x6e4) mstore(0x8c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x704) mstore(0x8e0, x) let y := calldataload(0x724) mstore(0x900, y) success := and(validate_ec_point(x, y), success) }mstore(0x920, keccak256(0x840, 224)){ let hash := mload(0x920) mstore(0x940, mod(hash, f_q)) mstore(0x960, hash) }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, mod(calldataload(0xc04), f_q))mstore(0xe60, mod(calldataload(0xc24), f_q))mstore(0xe80, mod(calldataload(0xc44), f_q))mstore(0xea0, mod(calldataload(0xc64), f_q))mstore(0xec0, mod(calldataload(0xc84), f_q))mstore(0xee0, mod(calldataload(0xca4), f_q))mstore(0xf00, mod(calldataload(0xcc4), f_q))mstore(0xf20, mod(calldataload(0xce4), f_q))mstore(0xf40, mod(calldataload(0xd04), f_q))mstore(0xf60, mod(calldataload(0xd24), f_q))mstore(0xf80, mod(calldataload(0xd44), f_q))mstore(0xfa0, mod(calldataload(0xd64), f_q))mstore(0xfc0, mod(calldataload(0xd84), f_q))mstore(0xfe0, mod(calldataload(0xda4), f_q))mstore(0x1000, mod(calldataload(0xdc4), f_q))mstore(0x1020, mod(calldataload(0xde4), f_q))mstore(0x1040, mod(calldataload(0xe04), f_q))mstore(0x1060, mod(calldataload(0xe24), f_q))mstore(0x1080, mod(calldataload(0xe44), f_q))mstore(0x10a0, mod(calldataload(0xe64), f_q))mstore(0x10c0, mod(calldataload(0xe84), f_q))mstore(0x10e0, mod(calldataload(0xea4), f_q))mstore(0x1100, mod(calldataload(0xec4), f_q))mstore(0x1120, mod(calldataload(0xee4), f_q))mstore(0x1140, mod(calldataload(0xf04), f_q))mstore(0x1160, mod(calldataload(0xf24), f_q))mstore(0x1180, mod(calldataload(0xf44), f_q))mstore(0x11a0, mod(calldataload(0xf64), f_q))mstore(0x11c0, mod(calldataload(0xf84), f_q))mstore(0x11e0, mod(calldataload(0xfa4), f_q))mstore(0x1200, mod(calldataload(0xfc4), f_q))mstore(0x1220, mod(calldataload(0xfe4), f_q))mstore(0x1240, mod(calldataload(0x1004), f_q))mstore(0x1260, mod(calldataload(0x1024), f_q))mstore(0x1280, mod(calldataload(0x1044), f_q))mstore(0x12a0, mod(calldataload(0x1064), f_q))mstore(0x12c0, mod(calldataload(0x1084), f_q))mstore(0x12e0, mod(calldataload(0x10a4), f_q))mstore(0x1300, mod(calldataload(0x10c4), f_q))mstore(0x1320, keccak256(0x960, 2496)){ let hash := mload(0x1320) mstore(0x1340, mod(hash, f_q)) mstore(0x1360, hash) }mstore8(0x1380, 1)mstore(0x1380, keccak256(0x1360, 33)){ let hash := mload(0x1380) mstore(0x13a0, mod(hash, f_q)) mstore(0x13c0, hash) } { let x := calldataload(0x10e4) mstore(0x13e0, x) let y := calldataload(0x1104) mstore(0x1400, y) success := and(validate_ec_point(x, y), success) }mstore(0x1420, keccak256(0x13c0, 96)){ let hash := mload(0x1420) mstore(0x1440, mod(hash, f_q)) mstore(0x1460, hash) } { let x := calldataload(0x1124) mstore(0x1480, x) let y := calldataload(0x1144) mstore(0x14a0, y) success := and(validate_ec_point(x, y), success) }{ let x := mload(0xa0)x := add(x, shl(88, mload(0xc0)))x := add(x, shl(176, mload(0xe0)))mstore(0x14c0, x)let y := mload(0x100)y := add(y, shl(88, mload(0x120)))y := add(y, shl(176, mload(0x140)))mstore(0x14e0, y) success := and(validate_ec_point(x, y), success) }{ let x := mload(0x160)x := add(x, shl(88, mload(0x180)))x := add(x, shl(176, mload(0x1a0)))mstore(0x1500, x)let y := mload(0x1c0)y := add(y, shl(88, mload(0x1e0)))y := add(y, shl(176, mload(0x200)))mstore(0x1520, y) success := and(validate_ec_point(x, y), success) }mstore(0x1540, mulmod(mload(0x940), mload(0x940), f_q))mstore(0x1560, mulmod(mload(0x1540), mload(0x1540), f_q))mstore(0x1580, mulmod(mload(0x1560), mload(0x1560), f_q))mstore(0x15a0, mulmod(mload(0x1580), mload(0x1580), f_q))mstore(0x15c0, mulmod(mload(0x15a0), mload(0x15a0), f_q))mstore(0x15e0, mulmod(mload(0x15c0), mload(0x15c0), f_q))mstore(0x1600, mulmod(mload(0x15e0), mload(0x15e0), f_q))mstore(0x1620, mulmod(mload(0x1600), mload(0x1600), f_q))mstore(0x1640, mulmod(mload(0x1620), mload(0x1620), f_q))mstore(0x1660, mulmod(mload(0x1640), mload(0x1640), f_q))mstore(0x1680, mulmod(mload(0x1660), mload(0x1660), f_q))mstore(0x16a0, mulmod(mload(0x1680), mload(0x1680), f_q))mstore(0x16c0, mulmod(mload(0x16a0), mload(0x16a0), f_q))mstore(0x16e0, mulmod(mload(0x16c0), mload(0x16c0), f_q))mstore(0x1700, mulmod(mload(0x16e0), mload(0x16e0), f_q))mstore(0x1720, mulmod(mload(0x1700), mload(0x1700), f_q))mstore(0x1740, mulmod(mload(0x1720), mload(0x1720), f_q))mstore(0x1760, mulmod(mload(0x1740), mload(0x1740), f_q))mstore(0x1780, mulmod(mload(0x1760), mload(0x1760), f_q))mstore(0x17a0, mulmod(mload(0x1780), mload(0x1780), f_q))mstore(0x17c0, mulmod(mload(0x17a0), mload(0x17a0), f_q))mstore(0x17e0, mulmod(mload(0x17c0), mload(0x17c0), f_q))mstore(0x1800, addmod(mload(0x17e0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(0x1820, mulmod(mload(0x1800), 21888237653275510688422624196183639687472264873923820041627027729598873448513, f_q))mstore(0x1840, mulmod(mload(0x1820), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x1860, addmod(mload(0x940), 8662456992307693229192232929891638461323994988937738840793806641202669341572, f_q))mstore(0x1880, mulmod(mload(0x1820), 10939663269433627367777756708678102241564365262857670666700619874077960926249, f_q))mstore(0x18a0, addmod(mload(0x940), 10948579602405647854468649036579172846983999137558363676997584312497847569368, f_q))mstore(0x18c0, mulmod(mload(0x1820), 11016257578652593686382655500910603527869149377564754001549454008164059876499, f_q))mstore(0x18e0, addmod(mload(0x940), 10871985293186681535863750244346671560679215022851280342148750178411748619118, f_q))mstore(0x1900, mulmod(mload(0x1820), 15402826414547299628414612080036060696555554914079673875872749760617770134879, f_q))mstore(0x1920, addmod(mload(0x940), 6485416457291975593831793665221214391992809486336360467825454425958038360738, f_q))mstore(0x1940, mulmod(mload(0x1820), 21710372849001950800533397158415938114909991150039389063546734567764856596059, f_q))mstore(0x1960, addmod(mload(0x940), 177870022837324421713008586841336973638373250376645280151469618810951899558, f_q))mstore(0x1980, mulmod(mload(0x1820), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q))mstore(0x19a0, addmod(mload(0x940), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q))mstore(0x19c0, mulmod(mload(0x1820), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x19e0, addmod(mload(0x940), 13154116519010929542673167886091370382741775939114889923107781597533678454429, f_q))mstore(0x1a00, mulmod(mload(0x1820), 1, f_q))mstore(0x1a20, addmod(mload(0x940), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(0x1a40, mulmod(mload(0x1820), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q))mstore(0x1a60, addmod(mload(0x940), 10676941854703594198666993839846402519342119846958189386823924046696287912227, f_q))mstore(0x1a80, mulmod(mload(0x1820), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q))mstore(0x1aa0, addmod(mload(0x940), 20461838439117790833741043996939313553025008529160428886800406442142042007110, f_q))mstore(0x1ac0, mulmod(mload(0x1820), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q))mstore(0x1ae0, addmod(mload(0x940), 9268625363986062636089532824584791139728887410636484032390921470890938228625, f_q))mstore(0x1b00, mulmod(mload(0x1820), 19032961837237948602743626455740240236231119053033140765040043513661803148152, f_q))mstore(0x1b20, addmod(mload(0x940), 2855281034601326619502779289517034852317245347382893578658160672914005347465, f_q))mstore(0x1b40, mulmod(mload(0x1820), 915149353520972163646494413843788069594022902357002628455555785223409501882, f_q))mstore(0x1b60, addmod(mload(0x940), 20973093518318303058599911331413487018954341498059031715242648401352398993735, f_q))mstore(0x1b80, mulmod(mload(0x1820), 3766081621734395783232337525162072736827576297943013392955872170138036189193, f_q))mstore(0x1ba0, addmod(mload(0x940), 18122161250104879439014068220095202351720788102473020950742332016437772306424, f_q))mstore(0x1bc0, mulmod(mload(0x1820), 4245441013247250116003069945606352967193023389718465410501109428393342802981, f_q))mstore(0x1be0, addmod(mload(0x940), 17642801858592025106243335799650922121355341010697568933197094758182465692636, f_q))mstore(0x1c00, mulmod(mload(0x1820), 5854133144571823792863860130267644613802765696134002830362054821530146160770, f_q))mstore(0x1c20, addmod(mload(0x940), 16034109727267451429382545614989630474745598704282031513336149365045662334847, f_q))mstore(0x1c40, mulmod(mload(0x1820), 5980488956150442207659150513163747165544364597008566989111579977672498964212, f_q))mstore(0x1c60, addmod(mload(0x940), 15907753915688833014587255232093527923003999803407467354586624208903309531405, f_q))mstore(0x1c80, mulmod(mload(0x1820), 14557038802599140430182096396825290815503940951075961210638273254419942783582, f_q))mstore(0x1ca0, addmod(mload(0x940), 7331204069240134792064309348431984273044423449340073133059930932155865712035, f_q))mstore(0x1cc0, mulmod(mload(0x1820), 13553911191894110065493137367144919847521088405945523452288398666974237857208, f_q))mstore(0x1ce0, addmod(mload(0x940), 8334331679945165156753268378112355241027275994470510891409805519601570638409, f_q)){ let prod := mload(0x1860) prod := mulmod(mload(0x18a0), prod, f_q) mstore(0x1d00, prod) prod := mulmod(mload(0x18e0), prod, f_q) mstore(0x1d20, prod) prod := mulmod(mload(0x1920), prod, f_q) mstore(0x1d40, prod) prod := mulmod(mload(0x1960), prod, f_q) mstore(0x1d60, prod) prod := mulmod(mload(0x19a0), prod, f_q) mstore(0x1d80, prod) prod := mulmod(mload(0x19e0), prod, f_q) mstore(0x1da0, prod) prod := mulmod(mload(0x1a20), prod, f_q) mstore(0x1dc0, prod) prod := mulmod(mload(0x1a60), prod, f_q) mstore(0x1de0, prod) prod := mulmod(mload(0x1aa0), prod, f_q) mstore(0x1e00, prod) prod := mulmod(mload(0x1ae0), prod, f_q) mstore(0x1e20, prod) prod := mulmod(mload(0x1b20), prod, f_q) mstore(0x1e40, prod) prod := mulmod(mload(0x1b60), prod, f_q) mstore(0x1e60, prod) prod := mulmod(mload(0x1ba0), prod, f_q) mstore(0x1e80, prod) prod := mulmod(mload(0x1be0), prod, f_q) mstore(0x1ea0, prod) prod := mulmod(mload(0x1c20), prod, f_q) mstore(0x1ec0, prod) prod := mulmod(mload(0x1c60), prod, f_q) mstore(0x1ee0, prod) prod := mulmod(mload(0x1ca0), prod, f_q) mstore(0x1f00, prod) prod := mulmod(mload(0x1ce0), prod, f_q) mstore(0x1f20, prod) prod := mulmod(mload(0x1800), prod, f_q) mstore(0x1f40, prod) }mstore(0x1f80, 32)mstore(0x1fa0, 32)mstore(0x1fc0, 32)mstore(0x1fe0, mload(0x1f40))mstore(0x2000, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x2020, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x1f80, 0xc0, 0x1f60, 0x20), 1), success){ let inv := mload(0x1f60) let v v := mload(0x1800) mstore(0x1800, mulmod(mload(0x1f20), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1ce0) mstore(0x1ce0, mulmod(mload(0x1f00), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1ca0) mstore(0x1ca0, mulmod(mload(0x1ee0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1c60) mstore(0x1c60, mulmod(mload(0x1ec0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1c20) mstore(0x1c20, mulmod(mload(0x1ea0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1be0) mstore(0x1be0, mulmod(mload(0x1e80), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1ba0) mstore(0x1ba0, mulmod(mload(0x1e60), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1b60) mstore(0x1b60, mulmod(mload(0x1e40), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1b20) mstore(0x1b20, mulmod(mload(0x1e20), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1ae0) mstore(0x1ae0, mulmod(mload(0x1e00), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1aa0) mstore(0x1aa0, mulmod(mload(0x1de0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1a60) mstore(0x1a60, mulmod(mload(0x1dc0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1a20) mstore(0x1a20, mulmod(mload(0x1da0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x19e0) mstore(0x19e0, mulmod(mload(0x1d80), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x19a0) mstore(0x19a0, mulmod(mload(0x1d60), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1960) mstore(0x1960, mulmod(mload(0x1d40), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1920) mstore(0x1920, mulmod(mload(0x1d20), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18e0) mstore(0x18e0, mulmod(mload(0x1d00), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18a0) mstore(0x18a0, mulmod(mload(0x1860), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x1860, inv) }mstore(0x2040, mulmod(mload(0x1840), mload(0x1860), f_q))mstore(0x2060, mulmod(mload(0x1880), mload(0x18a0), f_q))mstore(0x2080, mulmod(mload(0x18c0), mload(0x18e0), f_q))mstore(0x20a0, mulmod(mload(0x1900), mload(0x1920), f_q))mstore(0x20c0, mulmod(mload(0x1940), mload(0x1960), f_q))mstore(0x20e0, mulmod(mload(0x1980), mload(0x19a0), f_q))mstore(0x2100, mulmod(mload(0x19c0), mload(0x19e0), f_q))mstore(0x2120, mulmod(mload(0x1a00), mload(0x1a20), f_q))mstore(0x2140, mulmod(mload(0x1a40), mload(0x1a60), f_q))mstore(0x2160, mulmod(mload(0x1a80), mload(0x1aa0), f_q))mstore(0x2180, mulmod(mload(0x1ac0), mload(0x1ae0), f_q))mstore(0x21a0, mulmod(mload(0x1b00), mload(0x1b20), f_q))mstore(0x21c0, mulmod(mload(0x1b40), mload(0x1b60), f_q))mstore(0x21e0, mulmod(mload(0x1b80), mload(0x1ba0), f_q))mstore(0x2200, mulmod(mload(0x1bc0), mload(0x1be0), f_q))mstore(0x2220, mulmod(mload(0x1c00), mload(0x1c20), f_q))mstore(0x2240, mulmod(mload(0x1c40), mload(0x1c60), f_q))mstore(0x2260, mulmod(mload(0x1c80), mload(0x1ca0), f_q))mstore(0x2280, mulmod(mload(0x1cc0), mload(0x1ce0), f_q)){ let result := mulmod(mload(0x2120), mload(0xa0), f_q)result := addmod(mulmod(mload(0x2140), mload(0xc0), f_q), result, f_q)result := addmod(mulmod(mload(0x2160), mload(0xe0), f_q), result, f_q)result := addmod(mulmod(mload(0x2180), mload(0x100), f_q), result, f_q)result := addmod(mulmod(mload(0x21a0), mload(0x120), f_q), result, f_q)result := addmod(mulmod(mload(0x21c0), mload(0x140), f_q), result, f_q)result := addmod(mulmod(mload(0x21e0), mload(0x160), f_q), result, f_q)result := addmod(mulmod(mload(0x2200), mload(0x180), f_q), result, f_q)result := addmod(mulmod(mload(0x2220), mload(0x1a0), f_q), result, f_q)result := addmod(mulmod(mload(0x2240), mload(0x1c0), f_q), result, f_q)result := addmod(mulmod(mload(0x2260), mload(0x1e0), f_q), result, f_q)result := addmod(mulmod(mload(0x2280), mload(0x200), f_q), result, f_q)mstore(0x22a0, result) }mstore(0x22c0, mulmod(mload(0x9c0), mload(0x9a0), f_q))mstore(0x22e0, addmod(mload(0x980), mload(0x22c0), f_q))mstore(0x2300, addmod(mload(0x22e0), sub(f_q, mload(0x9e0)), f_q))mstore(0x2320, mulmod(mload(0x2300), mload(0xde0), f_q))mstore(0x2340, mulmod(mload(0x820), mload(0x2320), f_q))mstore(0x2360, mulmod(mload(0xa40), mload(0xa20), f_q))mstore(0x2380, addmod(mload(0xa00), mload(0x2360), f_q))mstore(0x23a0, addmod(mload(0x2380), sub(f_q, mload(0xa60)), f_q))mstore(0x23c0, mulmod(mload(0x23a0), mload(0xe00), f_q))mstore(0x23e0, addmod(mload(0x2340), mload(0x23c0), f_q))mstore(0x2400, mulmod(mload(0x820), mload(0x23e0), f_q))mstore(0x2420, mulmod(mload(0xac0), mload(0xaa0), f_q))mstore(0x2440, addmod(mload(0xa80), mload(0x2420), f_q))mstore(0x2460, addmod(mload(0x2440), sub(f_q, mload(0xae0)), f_q))mstore(0x2480, mulmod(mload(0x2460), mload(0xe20), f_q))mstore(0x24a0, addmod(mload(0x2400), mload(0x2480), f_q))mstore(0x24c0, mulmod(mload(0x820), mload(0x24a0), f_q))mstore(0x24e0, mulmod(mload(0xb40), mload(0xb20), f_q))mstore(0x2500, addmod(mload(0xb00), mload(0x24e0), f_q))mstore(0x2520, addmod(mload(0x2500), sub(f_q, mload(0xb60)), f_q))mstore(0x2540, mulmod(mload(0x2520), mload(0xe40), f_q))mstore(0x2560, addmod(mload(0x24c0), mload(0x2540), f_q))mstore(0x2580, mulmod(mload(0x820), mload(0x2560), f_q))mstore(0x25a0, mulmod(mload(0xbc0), mload(0xba0), f_q))mstore(0x25c0, addmod(mload(0xb80), mload(0x25a0), f_q))mstore(0x25e0, addmod(mload(0x25c0), sub(f_q, mload(0xbe0)), f_q))mstore(0x2600, mulmod(mload(0x25e0), mload(0xe60), f_q))mstore(0x2620, addmod(mload(0x2580), mload(0x2600), f_q))mstore(0x2640, mulmod(mload(0x820), mload(0x2620), f_q))mstore(0x2660, mulmod(mload(0xc40), mload(0xc20), f_q))mstore(0x2680, addmod(mload(0xc00), mload(0x2660), f_q))mstore(0x26a0, addmod(mload(0x2680), sub(f_q, mload(0xc60)), f_q))mstore(0x26c0, mulmod(mload(0x26a0), mload(0xe80), f_q))mstore(0x26e0, addmod(mload(0x2640), mload(0x26c0), f_q))mstore(0x2700, mulmod(mload(0x820), mload(0x26e0), f_q))mstore(0x2720, mulmod(mload(0xcc0), mload(0xca0), f_q))mstore(0x2740, addmod(mload(0xc80), mload(0x2720), f_q))mstore(0x2760, addmod(mload(0x2740), sub(f_q, mload(0xce0)), f_q))mstore(0x2780, mulmod(mload(0x2760), mload(0xea0), f_q))mstore(0x27a0, addmod(mload(0x2700), mload(0x2780), f_q))mstore(0x27c0, mulmod(mload(0x820), mload(0x27a0), f_q))mstore(0x27e0, mulmod(mload(0xd40), mload(0xd20), f_q))mstore(0x2800, addmod(mload(0xd00), mload(0x27e0), f_q))mstore(0x2820, addmod(mload(0x2800), sub(f_q, mload(0xd60)), f_q))mstore(0x2840, mulmod(mload(0x2820), mload(0xec0), f_q))mstore(0x2860, addmod(mload(0x27c0), mload(0x2840), f_q))mstore(0x2880, mulmod(mload(0x820), mload(0x2860), f_q))mstore(0x28a0, addmod(1, sub(f_q, mload(0x1060)), f_q))mstore(0x28c0, mulmod(mload(0x28a0), mload(0x2120), f_q))mstore(0x28e0, addmod(mload(0x2880), mload(0x28c0), f_q))mstore(0x2900, mulmod(mload(0x820), mload(0x28e0), f_q))mstore(0x2920, mulmod(mload(0x1240), mload(0x1240), f_q))mstore(0x2940, addmod(mload(0x2920), sub(f_q, mload(0x1240)), f_q))mstore(0x2960, mulmod(mload(0x2940), mload(0x2040), f_q))mstore(0x2980, addmod(mload(0x2900), mload(0x2960), f_q))mstore(0x29a0, mulmod(mload(0x820), mload(0x2980), f_q))mstore(0x29c0, addmod(mload(0x10c0), sub(f_q, mload(0x10a0)), f_q))mstore(0x29e0, mulmod(mload(0x29c0), mload(0x2120), f_q))mstore(0x2a00, addmod(mload(0x29a0), mload(0x29e0), f_q))mstore(0x2a20, mulmod(mload(0x820), mload(0x2a00), f_q))mstore(0x2a40, addmod(mload(0x1120), sub(f_q, mload(0x1100)), f_q))mstore(0x2a60, mulmod(mload(0x2a40), mload(0x2120), f_q))mstore(0x2a80, addmod(mload(0x2a20), mload(0x2a60), f_q))mstore(0x2aa0, mulmod(mload(0x820), mload(0x2a80), f_q))mstore(0x2ac0, addmod(mload(0x1180), sub(f_q, mload(0x1160)), f_q))mstore(0x2ae0, mulmod(mload(0x2ac0), mload(0x2120), f_q))mstore(0x2b00, addmod(mload(0x2aa0), mload(0x2ae0), f_q))mstore(0x2b20, mulmod(mload(0x820), mload(0x2b00), f_q))mstore(0x2b40, addmod(mload(0x11e0), sub(f_q, mload(0x11c0)), f_q))mstore(0x2b60, mulmod(mload(0x2b40), mload(0x2120), f_q))mstore(0x2b80, addmod(mload(0x2b20), mload(0x2b60), f_q))mstore(0x2ba0, mulmod(mload(0x820), mload(0x2b80), f_q))mstore(0x2bc0, addmod(mload(0x1240), sub(f_q, mload(0x1220)), f_q))mstore(0x2be0, mulmod(mload(0x2bc0), mload(0x2120), f_q))mstore(0x2c00, addmod(mload(0x2ba0), mload(0x2be0), f_q))mstore(0x2c20, mulmod(mload(0x820), mload(0x2c00), f_q))mstore(0x2c40, addmod(1, sub(f_q, mload(0x2040)), f_q))mstore(0x2c60, addmod(mload(0x2060), mload(0x2080), f_q))mstore(0x2c80, addmod(mload(0x2c60), mload(0x20a0), f_q))mstore(0x2ca0, addmod(mload(0x2c80), mload(0x20c0), f_q))mstore(0x2cc0, addmod(mload(0x2ca0), mload(0x20e0), f_q))mstore(0x2ce0, addmod(mload(0x2cc0), mload(0x2100), f_q))mstore(0x2d00, addmod(mload(0x2c40), sub(f_q, mload(0x2ce0)), f_q))mstore(0x2d20, mulmod(mload(0xf00), mload(0x560), f_q))mstore(0x2d40, addmod(mload(0xda0), mload(0x2d20), f_q))mstore(0x2d60, addmod(mload(0x2d40), mload(0x5c0), f_q))mstore(0x2d80, mulmod(mload(0xf20), mload(0x560), f_q))mstore(0x2da0, addmod(mload(0x980), mload(0x2d80), f_q))mstore(0x2dc0, addmod(mload(0x2da0), mload(0x5c0), f_q))mstore(0x2de0, mulmod(mload(0x2dc0), mload(0x2d60), f_q))mstore(0x2e00, mulmod(mload(0x2de0), mload(0x1080), f_q))mstore(0x2e20, mulmod(1, mload(0x560), f_q))mstore(0x2e40, mulmod(mload(0x940), mload(0x2e20), f_q))mstore(0x2e60, addmod(mload(0xda0), mload(0x2e40), f_q))mstore(0x2e80, addmod(mload(0x2e60), mload(0x5c0), f_q))mstore(0x2ea0, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x560), f_q))mstore(0x2ec0, mulmod(mload(0x940), mload(0x2ea0), f_q))mstore(0x2ee0, addmod(mload(0x980), mload(0x2ec0), f_q))mstore(0x2f00, addmod(mload(0x2ee0), mload(0x5c0), f_q))mstore(0x2f20, mulmod(mload(0x2f00), mload(0x2e80), f_q))mstore(0x2f40, mulmod(mload(0x2f20), mload(0x1060), f_q))mstore(0x2f60, addmod(mload(0x2e00), sub(f_q, mload(0x2f40)), f_q))mstore(0x2f80, mulmod(mload(0x2f60), mload(0x2d00), f_q))mstore(0x2fa0, addmod(mload(0x2c20), mload(0x2f80), f_q))mstore(0x2fc0, mulmod(mload(0x820), mload(0x2fa0), f_q))mstore(0x2fe0, mulmod(mload(0xf40), mload(0x560), f_q))mstore(0x3000, addmod(mload(0xa00), mload(0x2fe0), f_q))mstore(0x3020, addmod(mload(0x3000), mload(0x5c0), f_q))mstore(0x3040, mulmod(mload(0xf60), mload(0x560), f_q))mstore(0x3060, addmod(mload(0xa80), mload(0x3040), f_q))mstore(0x3080, addmod(mload(0x3060), mload(0x5c0), f_q))mstore(0x30a0, mulmod(mload(0x3080), mload(0x3020), f_q))mstore(0x30c0, mulmod(mload(0x30a0), mload(0x10e0), f_q))mstore(0x30e0, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x560), f_q))mstore(0x3100, mulmod(mload(0x940), mload(0x30e0), f_q))mstore(0x3120, addmod(mload(0xa00), mload(0x3100), f_q))mstore(0x3140, addmod(mload(0x3120), mload(0x5c0), f_q))mstore(0x3160, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x560), f_q))mstore(0x3180, mulmod(mload(0x940), mload(0x3160), f_q))mstore(0x31a0, addmod(mload(0xa80), mload(0x3180), f_q))mstore(0x31c0, addmod(mload(0x31a0), mload(0x5c0), f_q))mstore(0x31e0, mulmod(mload(0x31c0), mload(0x3140), f_q))mstore(0x3200, mulmod(mload(0x31e0), mload(0x10c0), f_q))mstore(0x3220, addmod(mload(0x30c0), sub(f_q, mload(0x3200)), f_q))mstore(0x3240, mulmod(mload(0x3220), mload(0x2d00), f_q))mstore(0x3260, addmod(mload(0x2fc0), mload(0x3240), f_q))mstore(0x3280, mulmod(mload(0x820), mload(0x3260), f_q))mstore(0x32a0, mulmod(mload(0xf80), mload(0x560), f_q))mstore(0x32c0, addmod(mload(0xb00), mload(0x32a0), f_q))mstore(0x32e0, addmod(mload(0x32c0), mload(0x5c0), f_q))mstore(0x3300, mulmod(mload(0xfa0), mload(0x560), f_q))mstore(0x3320, addmod(mload(0xb80), mload(0x3300), f_q))mstore(0x3340, addmod(mload(0x3320), mload(0x5c0), f_q))mstore(0x3360, mulmod(mload(0x3340), mload(0x32e0), f_q))mstore(0x3380, mulmod(mload(0x3360), mload(0x1140), f_q))mstore(0x33a0, mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(0x560), f_q))mstore(0x33c0, mulmod(mload(0x940), mload(0x33a0), f_q))mstore(0x33e0, addmod(mload(0xb00), mload(0x33c0), f_q))mstore(0x3400, addmod(mload(0x33e0), mload(0x5c0), f_q))mstore(0x3420, mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(0x560), f_q))mstore(0x3440, mulmod(mload(0x940), mload(0x3420), f_q))mstore(0x3460, addmod(mload(0xb80), mload(0x3440), f_q))mstore(0x3480, addmod(mload(0x3460), mload(0x5c0), f_q))mstore(0x34a0, mulmod(mload(0x3480), mload(0x3400), f_q))mstore(0x34c0, mulmod(mload(0x34a0), mload(0x1120), f_q))mstore(0x34e0, addmod(mload(0x3380), sub(f_q, mload(0x34c0)), f_q))mstore(0x3500, mulmod(mload(0x34e0), mload(0x2d00), f_q))mstore(0x3520, addmod(mload(0x3280), mload(0x3500), f_q))mstore(0x3540, mulmod(mload(0x820), mload(0x3520), f_q))mstore(0x3560, mulmod(mload(0xfc0), mload(0x560), f_q))mstore(0x3580, addmod(mload(0xc00), mload(0x3560), f_q))mstore(0x35a0, addmod(mload(0x3580), mload(0x5c0), f_q))mstore(0x35c0, mulmod(mload(0xfe0), mload(0x560), f_q))mstore(0x35e0, addmod(mload(0xc80), mload(0x35c0), f_q))mstore(0x3600, addmod(mload(0x35e0), mload(0x5c0), f_q))mstore(0x3620, mulmod(mload(0x3600), mload(0x35a0), f_q))mstore(0x3640, mulmod(mload(0x3620), mload(0x11a0), f_q))mstore(0x3660, mulmod(5625741653535312224677218588085279924365897425605943700675464992185016992283, mload(0x560), f_q))mstore(0x3680, mulmod(mload(0x940), mload(0x3660), f_q))mstore(0x36a0, addmod(mload(0xc00), mload(0x3680), f_q))mstore(0x36c0, addmod(mload(0x36a0), mload(0x5c0), f_q))mstore(0x36e0, mulmod(14704729814417906439424896605881467874595262020190401576785074330126828718155, mload(0x560), f_q))mstore(0x3700, mulmod(mload(0x940), mload(0x36e0), f_q))mstore(0x3720, addmod(mload(0xc80), mload(0x3700), f_q))mstore(0x3740, addmod(mload(0x3720), mload(0x5c0), f_q))mstore(0x3760, mulmod(mload(0x3740), mload(0x36c0), f_q))mstore(0x3780, mulmod(mload(0x3760), mload(0x1180), f_q))mstore(0x37a0, addmod(mload(0x3640), sub(f_q, mload(0x3780)), f_q))mstore(0x37c0, mulmod(mload(0x37a0), mload(0x2d00), f_q))mstore(0x37e0, addmod(mload(0x3540), mload(0x37c0), f_q))mstore(0x3800, mulmod(mload(0x820), mload(0x37e0), f_q))mstore(0x3820, mulmod(mload(0x1000), mload(0x560), f_q))mstore(0x3840, addmod(mload(0xd00), mload(0x3820), f_q))mstore(0x3860, addmod(mload(0x3840), mload(0x5c0), f_q))mstore(0x3880, mulmod(mload(0x1020), mload(0x560), f_q))mstore(0x38a0, addmod(mload(0xd80), mload(0x3880), f_q))mstore(0x38c0, addmod(mload(0x38a0), mload(0x5c0), f_q))mstore(0x38e0, mulmod(mload(0x38c0), mload(0x3860), f_q))mstore(0x3900, mulmod(mload(0x38e0), mload(0x1200), f_q))mstore(0x3920, mulmod(8343274462013750416000956870576256937330525306073862550863787263304548803879, mload(0x560), f_q))mstore(0x3940, mulmod(mload(0x940), mload(0x3920), f_q))mstore(0x3960, addmod(mload(0xd00), mload(0x3940), f_q))mstore(0x3980, addmod(mload(0x3960), mload(0x5c0), f_q))mstore(0x39a0, mulmod(20928372310071051017340352686640453451620397549739756658327314209761852842004, mload(0x560), f_q))mstore(0x39c0, mulmod(mload(0x940), mload(0x39a0), f_q))mstore(0x39e0, addmod(mload(0xd80), mload(0x39c0), f_q))mstore(0x3a00, addmod(mload(0x39e0), mload(0x5c0), f_q))mstore(0x3a20, mulmod(mload(0x3a00), mload(0x3980), f_q))mstore(0x3a40, mulmod(mload(0x3a20), mload(0x11e0), f_q))mstore(0x3a60, addmod(mload(0x3900), sub(f_q, mload(0x3a40)), f_q))mstore(0x3a80, mulmod(mload(0x3a60), mload(0x2d00), f_q))mstore(0x3aa0, addmod(mload(0x3800), mload(0x3a80), f_q))mstore(0x3ac0, mulmod(mload(0x820), mload(0x3aa0), f_q))mstore(0x3ae0, mulmod(mload(0x1040), mload(0x560), f_q))mstore(0x3b00, addmod(mload(0x22a0), mload(0x3ae0), f_q))mstore(0x3b20, addmod(mload(0x3b00), mload(0x5c0), f_q))mstore(0x3b40, mulmod(mload(0x3b20), mload(0x1260), f_q))mstore(0x3b60, mulmod(15845651941796975697993789271154426079663327509658641548785793587449119139335, mload(0x560), f_q))mstore(0x3b80, mulmod(mload(0x940), mload(0x3b60), f_q))mstore(0x3ba0, addmod(mload(0x22a0), mload(0x3b80), f_q))mstore(0x3bc0, addmod(mload(0x3ba0), mload(0x5c0), f_q))mstore(0x3be0, mulmod(mload(0x3bc0), mload(0x1240), f_q))mstore(0x3c00, addmod(mload(0x3b40), sub(f_q, mload(0x3be0)), f_q))mstore(0x3c20, mulmod(mload(0x3c00), mload(0x2d00), f_q))mstore(0x3c40, addmod(mload(0x3ac0), mload(0x3c20), f_q))mstore(0x3c60, mulmod(mload(0x820), mload(0x3c40), f_q))mstore(0x3c80, addmod(1, sub(f_q, mload(0x1280)), f_q))mstore(0x3ca0, mulmod(mload(0x3c80), mload(0x2120), f_q))mstore(0x3cc0, addmod(mload(0x3c60), mload(0x3ca0), f_q))mstore(0x3ce0, mulmod(mload(0x820), mload(0x3cc0), f_q))mstore(0x3d00, mulmod(mload(0x1280), mload(0x1280), f_q))mstore(0x3d20, addmod(mload(0x3d00), sub(f_q, mload(0x1280)), f_q))mstore(0x3d40, mulmod(mload(0x3d20), mload(0x2040), f_q))mstore(0x3d60, addmod(mload(0x3ce0), mload(0x3d40), f_q))mstore(0x3d80, mulmod(mload(0x820), mload(0x3d60), f_q))mstore(0x3da0, addmod(mload(0x12c0), mload(0x560), f_q))mstore(0x3dc0, mulmod(mload(0x3da0), mload(0x12a0), f_q))mstore(0x3de0, addmod(mload(0x1300), mload(0x5c0), f_q))mstore(0x3e00, mulmod(mload(0x3de0), mload(0x3dc0), f_q))mstore(0x3e20, addmod(mload(0xd80), mload(0x560), f_q))mstore(0x3e40, mulmod(mload(0x3e20), mload(0x1280), f_q))mstore(0x3e60, addmod(mload(0xdc0), mload(0x5c0), f_q))mstore(0x3e80, mulmod(mload(0x3e60), mload(0x3e40), f_q))mstore(0x3ea0, addmod(mload(0x3e00), sub(f_q, mload(0x3e80)), f_q))mstore(0x3ec0, mulmod(mload(0x3ea0), mload(0x2d00), f_q))mstore(0x3ee0, addmod(mload(0x3d80), mload(0x3ec0), f_q))mstore(0x3f00, mulmod(mload(0x820), mload(0x3ee0), f_q))mstore(0x3f20, addmod(mload(0x12c0), sub(f_q, mload(0x1300)), f_q))mstore(0x3f40, mulmod(mload(0x3f20), mload(0x2120), f_q))mstore(0x3f60, addmod(mload(0x3f00), mload(0x3f40), f_q))mstore(0x3f80, mulmod(mload(0x820), mload(0x3f60), f_q))mstore(0x3fa0, mulmod(mload(0x3f20), mload(0x2d00), f_q))mstore(0x3fc0, addmod(mload(0x12c0), sub(f_q, mload(0x12e0)), f_q))mstore(0x3fe0, mulmod(mload(0x3fc0), mload(0x3fa0), f_q))mstore(0x4000, addmod(mload(0x3f80), mload(0x3fe0), f_q))mstore(0x4020, mulmod(mload(0x17e0), mload(0x17e0), f_q))mstore(0x4040, mulmod(mload(0x4020), mload(0x17e0), f_q))mstore(0x4060, mulmod(1, mload(0x17e0), f_q))mstore(0x4080, mulmod(1, mload(0x4020), f_q))mstore(0x40a0, mulmod(mload(0x4000), mload(0x1800), f_q))mstore(0x40c0, mulmod(mload(0x1540), mload(0x940), f_q))mstore(0x40e0, mulmod(mload(0x40c0), mload(0x940), f_q))mstore(0x4100, mulmod(mload(0x940), 1, f_q))mstore(0x4120, addmod(mload(0x1440), sub(f_q, mload(0x4100)), f_q))mstore(0x4140, mulmod(mload(0x940), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q))mstore(0x4160, addmod(mload(0x1440), sub(f_q, mload(0x4140)), f_q))mstore(0x4180, mulmod(mload(0x940), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x41a0, addmod(mload(0x1440), sub(f_q, mload(0x4180)), f_q))mstore(0x41c0, mulmod(mload(0x940), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q))mstore(0x41e0, addmod(mload(0x1440), sub(f_q, mload(0x41c0)), f_q))mstore(0x4200, mulmod(mload(0x940), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q))mstore(0x4220, addmod(mload(0x1440), sub(f_q, mload(0x4200)), f_q))mstore(0x4240, mulmod(mload(0x940), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x4260, addmod(mload(0x1440), sub(f_q, mload(0x4240)), f_q)){ let result := mulmod(mload(0x1440), mulmod(mload(0x40c0), 3544324119167359571073009690693121464267965232733679586767649244433889388945, f_q), f_q)result := addmod(mulmod(mload(0x940), mulmod(mload(0x40c0), 18343918752671915651173396054564153624280399167682354756930554942141919106672, f_q), f_q), result, f_q)mstore(0x4280, result) }{ let result := mulmod(mload(0x1440), mulmod(mload(0x40c0), 3860370625838117017501327045244227871206764201116468958063324100051382735289, f_q), f_q)result := addmod(mulmod(mload(0x940), mulmod(mload(0x40c0), 21616901807277407275624036604424346159916096890712898844034238973395610537327, f_q), f_q), result, f_q)mstore(0x42a0, result) }{ let result := mulmod(mload(0x1440), mulmod(mload(0x40c0), 21616901807277407275624036604424346159916096890712898844034238973395610537327, f_q), f_q)result := addmod(mulmod(mload(0x940), mulmod(mload(0x40c0), 889236556954614024749610889108815341999962898269585485843658889664869519176, f_q), f_q), result, f_q)mstore(0x42c0, result) }{ let result := mulmod(mload(0x1440), mulmod(mload(0x40c0), 3209408481237076479025468386201293941554240476766691830436732310949352383503, f_q), f_q)result := addmod(mulmod(mload(0x940), mulmod(mload(0x40c0), 12080394110851700286656425387058292751221637853580771255128961096834426654570, f_q), f_q), result, f_q)mstore(0x42e0, result) }mstore(0x4300, mulmod(1, mload(0x4120), f_q))mstore(0x4320, mulmod(mload(0x4300), mload(0x41e0), f_q))mstore(0x4340, mulmod(mload(0x4320), mload(0x4160), f_q))mstore(0x4360, mulmod(mload(0x4340), mload(0x4220), f_q)){ let result := mulmod(mload(0x1440), 1, f_q)result := addmod(mulmod(mload(0x940), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(0x4380, result) }{ let result := mulmod(mload(0x1440), mulmod(mload(0x1540), 8390819244605639573390577733158868133682115698337564550620146375401109684432, f_q), f_q)result := addmod(mulmod(mload(0x940), mulmod(mload(0x1540), 13497423627233635648855828012098406954866248702078469793078057811174698811185, f_q), f_q), result, f_q)mstore(0x43a0, result) }{ let result := mulmod(mload(0x1440), mulmod(mload(0x1540), 14389468897523033212448771694851898440525479866834419679925499462425232628530, f_q), f_q)result := addmod(mulmod(mload(0x940), mulmod(mload(0x1540), 10771624105926513343199793365135253961557027396599172824137553349410803667382, f_q), f_q), result, f_q)mstore(0x43c0, result) }{ let result := mulmod(mload(0x1440), mulmod(mload(0x1540), 8021781111580269725587432039983408559403601261632071736490564397134126857583, f_q), f_q)result := addmod(mulmod(mload(0x940), mulmod(mload(0x1540), 13263758384809315129424392494083758423780924407584659157289746760747196496964, f_q), f_q), result, f_q)mstore(0x43e0, result) }mstore(0x4400, mulmod(mload(0x4320), mload(0x4260), f_q)){ let result := mulmod(mload(0x1440), mulmod(mload(0x940), 10676941854703594198666993839846402519342119846958189386823924046696287912228, f_q), f_q)result := addmod(mulmod(mload(0x940), mulmod(mload(0x940), 11211301017135681023579411905410872569206244553457844956874280139879520583389, f_q), f_q), result, f_q)mstore(0x4420, result) }{ let result := mulmod(mload(0x1440), mulmod(mload(0x940), 11211301017135681023579411905410872569206244553457844956874280139879520583389, f_q), f_q)result := addmod(mulmod(mload(0x940), mulmod(mload(0x940), 9784896584414196635074050157092911033682888682202239499976482395445754094883, f_q), f_q), result, f_q)mstore(0x4440, result) }{ let result := mulmod(mload(0x1440), mulmod(mload(0x940), 13154116519010929542673167886091370382741775939114889923107781597533678454430, f_q), f_q)result := addmod(mulmod(mload(0x940), mulmod(mload(0x940), 8734126352828345679573237859165904705806588461301144420590422589042130041187, f_q), f_q), result, f_q)mstore(0x4460, result) }{ let result := mulmod(mload(0x1440), mulmod(mload(0x940), 8734126352828345679573237859165904705806588461301144420590422589042130041187, f_q), f_q)result := addmod(mulmod(mload(0x940), mulmod(mload(0x940), 5948611796446669599396300148285100597158677068822442314729736978662760216172, f_q), f_q), result, f_q)mstore(0x4480, result) }mstore(0x44a0, mulmod(mload(0x4300), mload(0x41a0), f_q)){ let prod := mload(0x4280) prod := mulmod(mload(0x42a0), prod, f_q) mstore(0x44c0, prod) prod := mulmod(mload(0x42c0), prod, f_q) mstore(0x44e0, prod) prod := mulmod(mload(0x42e0), prod, f_q) mstore(0x4500, prod) prod := mulmod(mload(0x4380), prod, f_q) mstore(0x4520, prod) prod := mulmod(mload(0x4300), prod, f_q) mstore(0x4540, prod) prod := mulmod(mload(0x43a0), prod, f_q) mstore(0x4560, prod) prod := mulmod(mload(0x43c0), prod, f_q) mstore(0x4580, prod) prod := mulmod(mload(0x43e0), prod, f_q) mstore(0x45a0, prod) prod := mulmod(mload(0x4400), prod, f_q) mstore(0x45c0, prod) prod := mulmod(mload(0x4420), prod, f_q) mstore(0x45e0, prod) prod := mulmod(mload(0x4440), prod, f_q) mstore(0x4600, prod) prod := mulmod(mload(0x4320), prod, f_q) mstore(0x4620, prod) prod := mulmod(mload(0x4460), prod, f_q) mstore(0x4640, prod) prod := mulmod(mload(0x4480), prod, f_q) mstore(0x4660, prod) prod := mulmod(mload(0x44a0), prod, f_q) mstore(0x4680, prod) }mstore(0x46c0, 32)mstore(0x46e0, 32)mstore(0x4700, 32)mstore(0x4720, mload(0x4680))mstore(0x4740, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x4760, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x46c0, 0xc0, 0x46a0, 0x20), 1), success){ let inv := mload(0x46a0) let v v := mload(0x44a0) mstore(0x44a0, mulmod(mload(0x4660), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4480) mstore(0x4480, mulmod(mload(0x4640), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4460) mstore(0x4460, mulmod(mload(0x4620), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4320) mstore(0x4320, mulmod(mload(0x4600), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4440) mstore(0x4440, mulmod(mload(0x45e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4420) mstore(0x4420, mulmod(mload(0x45c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4400) mstore(0x4400, mulmod(mload(0x45a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x43e0) mstore(0x43e0, mulmod(mload(0x4580), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x43c0) mstore(0x43c0, mulmod(mload(0x4560), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x43a0) mstore(0x43a0, mulmod(mload(0x4540), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4300) mstore(0x4300, mulmod(mload(0x4520), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4380) mstore(0x4380, mulmod(mload(0x4500), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x42e0) mstore(0x42e0, mulmod(mload(0x44e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x42c0) mstore(0x42c0, mulmod(mload(0x44c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x42a0) mstore(0x42a0, mulmod(mload(0x4280), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x4280, inv) }{ let result := mload(0x4280)result := addmod(mload(0x42a0), result, f_q)result := addmod(mload(0x42c0), result, f_q)result := addmod(mload(0x42e0), result, f_q)mstore(0x4780, result) }mstore(0x47a0, mulmod(mload(0x4360), mload(0x4300), f_q)){ let result := mload(0x4380)mstore(0x47c0, result) }mstore(0x47e0, mulmod(mload(0x4360), mload(0x4400), f_q)){ let result := mload(0x43a0)result := addmod(mload(0x43c0), result, f_q)result := addmod(mload(0x43e0), result, f_q)mstore(0x4800, result) }mstore(0x4820, mulmod(mload(0x4360), mload(0x4320), f_q)){ let result := mload(0x4420)result := addmod(mload(0x4440), result, f_q)mstore(0x4840, result) }mstore(0x4860, mulmod(mload(0x4360), mload(0x44a0), f_q)){ let result := mload(0x4460)result := addmod(mload(0x4480), result, f_q)mstore(0x4880, result) }{ let prod := mload(0x4780) prod := mulmod(mload(0x47c0), prod, f_q) mstore(0x48a0, prod) prod := mulmod(mload(0x4800), prod, f_q) mstore(0x48c0, prod) prod := mulmod(mload(0x4840), prod, f_q) mstore(0x48e0, prod) prod := mulmod(mload(0x4880), prod, f_q) mstore(0x4900, prod) }mstore(0x4940, 32)mstore(0x4960, 32)mstore(0x4980, 32)mstore(0x49a0, mload(0x4900))mstore(0x49c0, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x49e0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x4940, 0xc0, 0x4920, 0x20), 1), success){ let inv := mload(0x4920) let v v := mload(0x4880) mstore(0x4880, mulmod(mload(0x48e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4840) mstore(0x4840, mulmod(mload(0x48c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4800) mstore(0x4800, mulmod(mload(0x48a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x47c0) mstore(0x47c0, mulmod(mload(0x4780), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x4780, inv) }mstore(0x4a00, mulmod(mload(0x47a0), mload(0x47c0), f_q))mstore(0x4a20, mulmod(mload(0x47e0), mload(0x4800), f_q))mstore(0x4a40, mulmod(mload(0x4820), mload(0x4840), f_q))mstore(0x4a60, mulmod(mload(0x4860), mload(0x4880), f_q))mstore(0x4a80, mulmod(mload(0x1340), mload(0x1340), f_q))mstore(0x4aa0, mulmod(mload(0x4a80), mload(0x1340), f_q))mstore(0x4ac0, mulmod(mload(0x4aa0), mload(0x1340), f_q))mstore(0x4ae0, mulmod(mload(0x4ac0), mload(0x1340), f_q))mstore(0x4b00, mulmod(mload(0x4ae0), mload(0x1340), f_q))mstore(0x4b20, mulmod(mload(0x4b00), mload(0x1340), f_q))mstore(0x4b40, mulmod(mload(0x4b20), mload(0x1340), f_q))mstore(0x4b60, mulmod(mload(0x4b40), mload(0x1340), f_q))mstore(0x4b80, mulmod(mload(0x4b60), mload(0x1340), f_q))mstore(0x4ba0, mulmod(mload(0x4b80), mload(0x1340), f_q))mstore(0x4bc0, mulmod(mload(0x4ba0), mload(0x1340), f_q))mstore(0x4be0, mulmod(mload(0x4bc0), mload(0x1340), f_q))mstore(0x4c00, mulmod(mload(0x4be0), mload(0x1340), f_q))mstore(0x4c20, mulmod(mload(0x4c00), mload(0x1340), f_q))mstore(0x4c40, mulmod(mload(0x4c20), mload(0x1340), f_q))mstore(0x4c60, mulmod(mload(0x4c40), mload(0x1340), f_q))mstore(0x4c80, mulmod(mload(0x4c60), mload(0x1340), f_q))mstore(0x4ca0, mulmod(mload(0x4c80), mload(0x1340), f_q))mstore(0x4cc0, mulmod(mload(0x4ca0), mload(0x1340), f_q))mstore(0x4ce0, mulmod(mload(0x4cc0), mload(0x1340), f_q))mstore(0x4d00, mulmod(mload(0x4ce0), mload(0x1340), f_q))mstore(0x4d20, mulmod(mload(0x4d00), mload(0x1340), f_q))mstore(0x4d40, mulmod(mload(0x4d20), mload(0x1340), f_q))mstore(0x4d60, mulmod(mload(0x4d40), mload(0x1340), f_q))mstore(0x4d80, mulmod(mload(0x13a0), mload(0x13a0), f_q))mstore(0x4da0, mulmod(mload(0x4d80), mload(0x13a0), f_q))mstore(0x4dc0, mulmod(mload(0x4da0), mload(0x13a0), f_q))mstore(0x4de0, mulmod(mload(0x4dc0), mload(0x13a0), f_q)){ let result := mulmod(mload(0x980), mload(0x4280), f_q)result := addmod(mulmod(mload(0x9a0), mload(0x42a0), f_q), result, f_q)result := addmod(mulmod(mload(0x9c0), mload(0x42c0), f_q), result, f_q)result := addmod(mulmod(mload(0x9e0), mload(0x42e0), f_q), result, f_q)mstore(0x4e00, result) }mstore(0x4e20, mulmod(mload(0x4e00), mload(0x4780), f_q))mstore(0x4e40, mulmod(sub(f_q, mload(0x4e20)), 1, f_q)){ let result := mulmod(mload(0xa00), mload(0x4280), f_q)result := addmod(mulmod(mload(0xa20), mload(0x42a0), f_q), result, f_q)result := addmod(mulmod(mload(0xa40), mload(0x42c0), f_q), result, f_q)result := addmod(mulmod(mload(0xa60), mload(0x42e0), f_q), result, f_q)mstore(0x4e60, result) }mstore(0x4e80, mulmod(mload(0x4e60), mload(0x4780), f_q))mstore(0x4ea0, mulmod(sub(f_q, mload(0x4e80)), mload(0x1340), f_q))mstore(0x4ec0, mulmod(1, mload(0x1340), f_q))mstore(0x4ee0, addmod(mload(0x4e40), mload(0x4ea0), f_q)){ let result := mulmod(mload(0xa80), mload(0x4280), f_q)result := addmod(mulmod(mload(0xaa0), mload(0x42a0), f_q), result, f_q)result := addmod(mulmod(mload(0xac0), mload(0x42c0), f_q), result, f_q)result := addmod(mulmod(mload(0xae0), mload(0x42e0), f_q), result, f_q)mstore(0x4f00, result) }mstore(0x4f20, mulmod(mload(0x4f00), mload(0x4780), f_q))mstore(0x4f40, mulmod(sub(f_q, mload(0x4f20)), mload(0x4a80), f_q))mstore(0x4f60, mulmod(1, mload(0x4a80), f_q))mstore(0x4f80, addmod(mload(0x4ee0), mload(0x4f40), f_q)){ let result := mulmod(mload(0xb00), mload(0x4280), f_q)result := addmod(mulmod(mload(0xb20), mload(0x42a0), f_q), result, f_q)result := addmod(mulmod(mload(0xb40), mload(0x42c0), f_q), result, f_q)result := addmod(mulmod(mload(0xb60), mload(0x42e0), f_q), result, f_q)mstore(0x4fa0, result) }mstore(0x4fc0, mulmod(mload(0x4fa0), mload(0x4780), f_q))mstore(0x4fe0, mulmod(sub(f_q, mload(0x4fc0)), mload(0x4aa0), f_q))mstore(0x5000, mulmod(1, mload(0x4aa0), f_q))mstore(0x5020, addmod(mload(0x4f80), mload(0x4fe0), f_q)){ let result := mulmod(mload(0xb80), mload(0x4280), f_q)result := addmod(mulmod(mload(0xba0), mload(0x42a0), f_q), result, f_q)result := addmod(mulmod(mload(0xbc0), mload(0x42c0), f_q), result, f_q)result := addmod(mulmod(mload(0xbe0), mload(0x42e0), f_q), result, f_q)mstore(0x5040, result) }mstore(0x5060, mulmod(mload(0x5040), mload(0x4780), f_q))mstore(0x5080, mulmod(sub(f_q, mload(0x5060)), mload(0x4ac0), f_q))mstore(0x50a0, mulmod(1, mload(0x4ac0), f_q))mstore(0x50c0, addmod(mload(0x5020), mload(0x5080), f_q)){ let result := mulmod(mload(0xc00), mload(0x4280), f_q)result := addmod(mulmod(mload(0xc20), mload(0x42a0), f_q), result, f_q)result := addmod(mulmod(mload(0xc40), mload(0x42c0), f_q), result, f_q)result := addmod(mulmod(mload(0xc60), mload(0x42e0), f_q), result, f_q)mstore(0x50e0, result) }mstore(0x5100, mulmod(mload(0x50e0), mload(0x4780), f_q))mstore(0x5120, mulmod(sub(f_q, mload(0x5100)), mload(0x4ae0), f_q))mstore(0x5140, mulmod(1, mload(0x4ae0), f_q))mstore(0x5160, addmod(mload(0x50c0), mload(0x5120), f_q)){ let result := mulmod(mload(0xc80), mload(0x4280), f_q)result := addmod(mulmod(mload(0xca0), mload(0x42a0), f_q), result, f_q)result := addmod(mulmod(mload(0xcc0), mload(0x42c0), f_q), result, f_q)result := addmod(mulmod(mload(0xce0), mload(0x42e0), f_q), result, f_q)mstore(0x5180, result) }mstore(0x51a0, mulmod(mload(0x5180), mload(0x4780), f_q))mstore(0x51c0, mulmod(sub(f_q, mload(0x51a0)), mload(0x4b00), f_q))mstore(0x51e0, mulmod(1, mload(0x4b00), f_q))mstore(0x5200, addmod(mload(0x5160), mload(0x51c0), f_q)){ let result := mulmod(mload(0xd00), mload(0x4280), f_q)result := addmod(mulmod(mload(0xd20), mload(0x42a0), f_q), result, f_q)result := addmod(mulmod(mload(0xd40), mload(0x42c0), f_q), result, f_q)result := addmod(mulmod(mload(0xd60), mload(0x42e0), f_q), result, f_q)mstore(0x5220, result) }mstore(0x5240, mulmod(mload(0x5220), mload(0x4780), f_q))mstore(0x5260, mulmod(sub(f_q, mload(0x5240)), mload(0x4b20), f_q))mstore(0x5280, mulmod(1, mload(0x4b20), f_q))mstore(0x52a0, addmod(mload(0x5200), mload(0x5260), f_q))mstore(0x52c0, mulmod(mload(0x52a0), 1, f_q))mstore(0x52e0, mulmod(mload(0x4ec0), 1, f_q))mstore(0x5300, mulmod(mload(0x4f60), 1, f_q))mstore(0x5320, mulmod(mload(0x5000), 1, f_q))mstore(0x5340, mulmod(mload(0x50a0), 1, f_q))mstore(0x5360, mulmod(mload(0x5140), 1, f_q))mstore(0x5380, mulmod(mload(0x51e0), 1, f_q))mstore(0x53a0, mulmod(mload(0x5280), 1, f_q))mstore(0x53c0, mulmod(1, mload(0x47a0), f_q)){ let result := mulmod(mload(0xd80), mload(0x4380), f_q)mstore(0x53e0, result) }mstore(0x5400, mulmod(mload(0x53e0), mload(0x4a00), f_q))mstore(0x5420, mulmod(sub(f_q, mload(0x5400)), 1, f_q))mstore(0x5440, mulmod(mload(0x53c0), 1, f_q)){ let result := mulmod(mload(0x1300), mload(0x4380), f_q)mstore(0x5460, result) }mstore(0x5480, mulmod(mload(0x5460), mload(0x4a00), f_q))mstore(0x54a0, mulmod(sub(f_q, mload(0x5480)), mload(0x1340), f_q))mstore(0x54c0, mulmod(mload(0x53c0), mload(0x1340), f_q))mstore(0x54e0, addmod(mload(0x5420), mload(0x54a0), f_q)){ let result := mulmod(mload(0xda0), mload(0x4380), f_q)mstore(0x5500, result) }mstore(0x5520, mulmod(mload(0x5500), mload(0x4a00), f_q))mstore(0x5540, mulmod(sub(f_q, mload(0x5520)), mload(0x4a80), f_q))mstore(0x5560, mulmod(mload(0x53c0), mload(0x4a80), f_q))mstore(0x5580, addmod(mload(0x54e0), mload(0x5540), f_q)){ let result := mulmod(mload(0xdc0), mload(0x4380), f_q)mstore(0x55a0, result) }mstore(0x55c0, mulmod(mload(0x55a0), mload(0x4a00), f_q))mstore(0x55e0, mulmod(sub(f_q, mload(0x55c0)), mload(0x4aa0), f_q))mstore(0x5600, mulmod(mload(0x53c0), mload(0x4aa0), f_q))mstore(0x5620, addmod(mload(0x5580), mload(0x55e0), f_q)){ let result := mulmod(mload(0xde0), mload(0x4380), f_q)mstore(0x5640, result) }mstore(0x5660, mulmod(mload(0x5640), mload(0x4a00), f_q))mstore(0x5680, mulmod(sub(f_q, mload(0x5660)), mload(0x4ac0), f_q))mstore(0x56a0, mulmod(mload(0x53c0), mload(0x4ac0), f_q))mstore(0x56c0, addmod(mload(0x5620), mload(0x5680), f_q)){ let result := mulmod(mload(0xe00), mload(0x4380), f_q)mstore(0x56e0, result) }mstore(0x5700, mulmod(mload(0x56e0), mload(0x4a00), f_q))mstore(0x5720, mulmod(sub(f_q, mload(0x5700)), mload(0x4ae0), f_q))mstore(0x5740, mulmod(mload(0x53c0), mload(0x4ae0), f_q))mstore(0x5760, addmod(mload(0x56c0), mload(0x5720), f_q)){ let result := mulmod(mload(0xe20), mload(0x4380), f_q)mstore(0x5780, result) }mstore(0x57a0, mulmod(mload(0x5780), mload(0x4a00), f_q))mstore(0x57c0, mulmod(sub(f_q, mload(0x57a0)), mload(0x4b00), f_q))mstore(0x57e0, mulmod(mload(0x53c0), mload(0x4b00), f_q))mstore(0x5800, addmod(mload(0x5760), mload(0x57c0), f_q)){ let result := mulmod(mload(0xe40), mload(0x4380), f_q)mstore(0x5820, result) }mstore(0x5840, mulmod(mload(0x5820), mload(0x4a00), f_q))mstore(0x5860, mulmod(sub(f_q, mload(0x5840)), mload(0x4b20), f_q))mstore(0x5880, mulmod(mload(0x53c0), mload(0x4b20), f_q))mstore(0x58a0, addmod(mload(0x5800), mload(0x5860), f_q)){ let result := mulmod(mload(0xe60), mload(0x4380), f_q)mstore(0x58c0, result) }mstore(0x58e0, mulmod(mload(0x58c0), mload(0x4a00), f_q))mstore(0x5900, mulmod(sub(f_q, mload(0x58e0)), mload(0x4b40), f_q))mstore(0x5920, mulmod(mload(0x53c0), mload(0x4b40), f_q))mstore(0x5940, addmod(mload(0x58a0), mload(0x5900), f_q)){ let result := mulmod(mload(0xe80), mload(0x4380), f_q)mstore(0x5960, result) }mstore(0x5980, mulmod(mload(0x5960), mload(0x4a00), f_q))mstore(0x59a0, mulmod(sub(f_q, mload(0x5980)), mload(0x4b60), f_q))mstore(0x59c0, mulmod(mload(0x53c0), mload(0x4b60), f_q))mstore(0x59e0, addmod(mload(0x5940), mload(0x59a0), f_q)){ let result := mulmod(mload(0xea0), mload(0x4380), f_q)mstore(0x5a00, result) }mstore(0x5a20, mulmod(mload(0x5a00), mload(0x4a00), f_q))mstore(0x5a40, mulmod(sub(f_q, mload(0x5a20)), mload(0x4b80), f_q))mstore(0x5a60, mulmod(mload(0x53c0), mload(0x4b80), f_q))mstore(0x5a80, addmod(mload(0x59e0), mload(0x5a40), f_q)){ let result := mulmod(mload(0xec0), mload(0x4380), f_q)mstore(0x5aa0, result) }mstore(0x5ac0, mulmod(mload(0x5aa0), mload(0x4a00), f_q))mstore(0x5ae0, mulmod(sub(f_q, mload(0x5ac0)), mload(0x4ba0), f_q))mstore(0x5b00, mulmod(mload(0x53c0), mload(0x4ba0), f_q))mstore(0x5b20, addmod(mload(0x5a80), mload(0x5ae0), f_q)){ let result := mulmod(mload(0xf00), mload(0x4380), f_q)mstore(0x5b40, result) }mstore(0x5b60, mulmod(mload(0x5b40), mload(0x4a00), f_q))mstore(0x5b80, mulmod(sub(f_q, mload(0x5b60)), mload(0x4bc0), f_q))mstore(0x5ba0, mulmod(mload(0x53c0), mload(0x4bc0), f_q))mstore(0x5bc0, addmod(mload(0x5b20), mload(0x5b80), f_q)){ let result := mulmod(mload(0xf20), mload(0x4380), f_q)mstore(0x5be0, result) }mstore(0x5c00, mulmod(mload(0x5be0), mload(0x4a00), f_q))mstore(0x5c20, mulmod(sub(f_q, mload(0x5c00)), mload(0x4be0), f_q))mstore(0x5c40, mulmod(mload(0x53c0), mload(0x4be0), f_q))mstore(0x5c60, addmod(mload(0x5bc0), mload(0x5c20), f_q)){ let result := mulmod(mload(0xf40), mload(0x4380), f_q)mstore(0x5c80, result) }mstore(0x5ca0, mulmod(mload(0x5c80), mload(0x4a00), f_q))mstore(0x5cc0, mulmod(sub(f_q, mload(0x5ca0)), mload(0x4c00), f_q))mstore(0x5ce0, mulmod(mload(0x53c0), mload(0x4c00), f_q))mstore(0x5d00, addmod(mload(0x5c60), mload(0x5cc0), f_q)){ let result := mulmod(mload(0xf60), mload(0x4380), f_q)mstore(0x5d20, result) }mstore(0x5d40, mulmod(mload(0x5d20), mload(0x4a00), f_q))mstore(0x5d60, mulmod(sub(f_q, mload(0x5d40)), mload(0x4c20), f_q))mstore(0x5d80, mulmod(mload(0x53c0), mload(0x4c20), f_q))mstore(0x5da0, addmod(mload(0x5d00), mload(0x5d60), f_q)){ let result := mulmod(mload(0xf80), mload(0x4380), f_q)mstore(0x5dc0, result) }mstore(0x5de0, mulmod(mload(0x5dc0), mload(0x4a00), f_q))mstore(0x5e00, mulmod(sub(f_q, mload(0x5de0)), mload(0x4c40), f_q))mstore(0x5e20, mulmod(mload(0x53c0), mload(0x4c40), f_q))mstore(0x5e40, addmod(mload(0x5da0), mload(0x5e00), f_q)){ let result := mulmod(mload(0xfa0), mload(0x4380), f_q)mstore(0x5e60, result) }mstore(0x5e80, mulmod(mload(0x5e60), mload(0x4a00), f_q))mstore(0x5ea0, mulmod(sub(f_q, mload(0x5e80)), mload(0x4c60), f_q))mstore(0x5ec0, mulmod(mload(0x53c0), mload(0x4c60), f_q))mstore(0x5ee0, addmod(mload(0x5e40), mload(0x5ea0), f_q)){ let result := mulmod(mload(0xfc0), mload(0x4380), f_q)mstore(0x5f00, result) }mstore(0x5f20, mulmod(mload(0x5f00), mload(0x4a00), f_q))mstore(0x5f40, mulmod(sub(f_q, mload(0x5f20)), mload(0x4c80), f_q))mstore(0x5f60, mulmod(mload(0x53c0), mload(0x4c80), f_q))mstore(0x5f80, addmod(mload(0x5ee0), mload(0x5f40), f_q)){ let result := mulmod(mload(0xfe0), mload(0x4380), f_q)mstore(0x5fa0, result) }mstore(0x5fc0, mulmod(mload(0x5fa0), mload(0x4a00), f_q))mstore(0x5fe0, mulmod(sub(f_q, mload(0x5fc0)), mload(0x4ca0), f_q))mstore(0x6000, mulmod(mload(0x53c0), mload(0x4ca0), f_q))mstore(0x6020, addmod(mload(0x5f80), mload(0x5fe0), f_q)){ let result := mulmod(mload(0x1000), mload(0x4380), f_q)mstore(0x6040, result) }mstore(0x6060, mulmod(mload(0x6040), mload(0x4a00), f_q))mstore(0x6080, mulmod(sub(f_q, mload(0x6060)), mload(0x4cc0), f_q))mstore(0x60a0, mulmod(mload(0x53c0), mload(0x4cc0), f_q))mstore(0x60c0, addmod(mload(0x6020), mload(0x6080), f_q)){ let result := mulmod(mload(0x1020), mload(0x4380), f_q)mstore(0x60e0, result) }mstore(0x6100, mulmod(mload(0x60e0), mload(0x4a00), f_q))mstore(0x6120, mulmod(sub(f_q, mload(0x6100)), mload(0x4ce0), f_q))mstore(0x6140, mulmod(mload(0x53c0), mload(0x4ce0), f_q))mstore(0x6160, addmod(mload(0x60c0), mload(0x6120), f_q)){ let result := mulmod(mload(0x1040), mload(0x4380), f_q)mstore(0x6180, result) }mstore(0x61a0, mulmod(mload(0x6180), mload(0x4a00), f_q))mstore(0x61c0, mulmod(sub(f_q, mload(0x61a0)), mload(0x4d00), f_q))mstore(0x61e0, mulmod(mload(0x53c0), mload(0x4d00), f_q))mstore(0x6200, addmod(mload(0x6160), mload(0x61c0), f_q))mstore(0x6220, mulmod(mload(0x4060), mload(0x47a0), f_q))mstore(0x6240, mulmod(mload(0x4080), mload(0x47a0), f_q)){ let result := mulmod(mload(0x40a0), mload(0x4380), f_q)mstore(0x6260, result) }mstore(0x6280, mulmod(mload(0x6260), mload(0x4a00), f_q))mstore(0x62a0, mulmod(sub(f_q, mload(0x6280)), mload(0x4d20), f_q))mstore(0x62c0, mulmod(mload(0x53c0), mload(0x4d20), f_q))mstore(0x62e0, mulmod(mload(0x6220), mload(0x4d20), f_q))mstore(0x6300, mulmod(mload(0x6240), mload(0x4d20), f_q))mstore(0x6320, addmod(mload(0x6200), mload(0x62a0), f_q)){ let result := mulmod(mload(0xee0), mload(0x4380), f_q)mstore(0x6340, result) }mstore(0x6360, mulmod(mload(0x6340), mload(0x4a00), f_q))mstore(0x6380, mulmod(sub(f_q, mload(0x6360)), mload(0x4d40), f_q))mstore(0x63a0, mulmod(mload(0x53c0), mload(0x4d40), f_q))mstore(0x63c0, addmod(mload(0x6320), mload(0x6380), f_q))mstore(0x63e0, mulmod(mload(0x63c0), mload(0x13a0), f_q))mstore(0x6400, mulmod(mload(0x5440), mload(0x13a0), f_q))mstore(0x6420, mulmod(mload(0x54c0), mload(0x13a0), f_q))mstore(0x6440, mulmod(mload(0x5560), mload(0x13a0), f_q))mstore(0x6460, mulmod(mload(0x5600), mload(0x13a0), f_q))mstore(0x6480, mulmod(mload(0x56a0), mload(0x13a0), f_q))mstore(0x64a0, mulmod(mload(0x5740), mload(0x13a0), f_q))mstore(0x64c0, mulmod(mload(0x57e0), mload(0x13a0), f_q))mstore(0x64e0, mulmod(mload(0x5880), mload(0x13a0), f_q))mstore(0x6500, mulmod(mload(0x5920), mload(0x13a0), f_q))mstore(0x6520, mulmod(mload(0x59c0), mload(0x13a0), f_q))mstore(0x6540, mulmod(mload(0x5a60), mload(0x13a0), f_q))mstore(0x6560, mulmod(mload(0x5b00), mload(0x13a0), f_q))mstore(0x6580, mulmod(mload(0x5ba0), mload(0x13a0), f_q))mstore(0x65a0, mulmod(mload(0x5c40), mload(0x13a0), f_q))mstore(0x65c0, mulmod(mload(0x5ce0), mload(0x13a0), f_q))mstore(0x65e0, mulmod(mload(0x5d80), mload(0x13a0), f_q))mstore(0x6600, mulmod(mload(0x5e20), mload(0x13a0), f_q))mstore(0x6620, mulmod(mload(0x5ec0), mload(0x13a0), f_q))mstore(0x6640, mulmod(mload(0x5f60), mload(0x13a0), f_q))mstore(0x6660, mulmod(mload(0x6000), mload(0x13a0), f_q))mstore(0x6680, mulmod(mload(0x60a0), mload(0x13a0), f_q))mstore(0x66a0, mulmod(mload(0x6140), mload(0x13a0), f_q))mstore(0x66c0, mulmod(mload(0x61e0), mload(0x13a0), f_q))mstore(0x66e0, mulmod(mload(0x62c0), mload(0x13a0), f_q))mstore(0x6700, mulmod(mload(0x62e0), mload(0x13a0), f_q))mstore(0x6720, mulmod(mload(0x6300), mload(0x13a0), f_q))mstore(0x6740, mulmod(mload(0x63a0), mload(0x13a0), f_q))mstore(0x6760, addmod(mload(0x52c0), mload(0x63e0), f_q))mstore(0x6780, mulmod(1, mload(0x47e0), f_q)){ let result := mulmod(mload(0x1060), mload(0x43a0), f_q)result := addmod(mulmod(mload(0x1080), mload(0x43c0), f_q), result, f_q)result := addmod(mulmod(mload(0x10a0), mload(0x43e0), f_q), result, f_q)mstore(0x67a0, result) }mstore(0x67c0, mulmod(mload(0x67a0), mload(0x4a20), f_q))mstore(0x67e0, mulmod(sub(f_q, mload(0x67c0)), 1, f_q))mstore(0x6800, mulmod(mload(0x6780), 1, f_q)){ let result := mulmod(mload(0x10c0), mload(0x43a0), f_q)result := addmod(mulmod(mload(0x10e0), mload(0x43c0), f_q), result, f_q)result := addmod(mulmod(mload(0x1100), mload(0x43e0), f_q), result, f_q)mstore(0x6820, result) }mstore(0x6840, mulmod(mload(0x6820), mload(0x4a20), f_q))mstore(0x6860, mulmod(sub(f_q, mload(0x6840)), mload(0x1340), f_q))mstore(0x6880, mulmod(mload(0x6780), mload(0x1340), f_q))mstore(0x68a0, addmod(mload(0x67e0), mload(0x6860), f_q)){ let result := mulmod(mload(0x1120), mload(0x43a0), f_q)result := addmod(mulmod(mload(0x1140), mload(0x43c0), f_q), result, f_q)result := addmod(mulmod(mload(0x1160), mload(0x43e0), f_q), result, f_q)mstore(0x68c0, result) }mstore(0x68e0, mulmod(mload(0x68c0), mload(0x4a20), f_q))mstore(0x6900, mulmod(sub(f_q, mload(0x68e0)), mload(0x4a80), f_q))mstore(0x6920, mulmod(mload(0x6780), mload(0x4a80), f_q))mstore(0x6940, addmod(mload(0x68a0), mload(0x6900), f_q)){ let result := mulmod(mload(0x1180), mload(0x43a0), f_q)result := addmod(mulmod(mload(0x11a0), mload(0x43c0), f_q), result, f_q)result := addmod(mulmod(mload(0x11c0), mload(0x43e0), f_q), result, f_q)mstore(0x6960, result) }mstore(0x6980, mulmod(mload(0x6960), mload(0x4a20), f_q))mstore(0x69a0, mulmod(sub(f_q, mload(0x6980)), mload(0x4aa0), f_q))mstore(0x69c0, mulmod(mload(0x6780), mload(0x4aa0), f_q))mstore(0x69e0, addmod(mload(0x6940), mload(0x69a0), f_q)){ let result := mulmod(mload(0x11e0), mload(0x43a0), f_q)result := addmod(mulmod(mload(0x1200), mload(0x43c0), f_q), result, f_q)result := addmod(mulmod(mload(0x1220), mload(0x43e0), f_q), result, f_q)mstore(0x6a00, result) }mstore(0x6a20, mulmod(mload(0x6a00), mload(0x4a20), f_q))mstore(0x6a40, mulmod(sub(f_q, mload(0x6a20)), mload(0x4ac0), f_q))mstore(0x6a60, mulmod(mload(0x6780), mload(0x4ac0), f_q))mstore(0x6a80, addmod(mload(0x69e0), mload(0x6a40), f_q))mstore(0x6aa0, mulmod(mload(0x6a80), mload(0x4d80), f_q))mstore(0x6ac0, mulmod(mload(0x6800), mload(0x4d80), f_q))mstore(0x6ae0, mulmod(mload(0x6880), mload(0x4d80), f_q))mstore(0x6b00, mulmod(mload(0x6920), mload(0x4d80), f_q))mstore(0x6b20, mulmod(mload(0x69c0), mload(0x4d80), f_q))mstore(0x6b40, mulmod(mload(0x6a60), mload(0x4d80), f_q))mstore(0x6b60, addmod(mload(0x6760), mload(0x6aa0), f_q))mstore(0x6b80, mulmod(1, mload(0x4820), f_q)){ let result := mulmod(mload(0x1240), mload(0x4420), f_q)result := addmod(mulmod(mload(0x1260), mload(0x4440), f_q), result, f_q)mstore(0x6ba0, result) }mstore(0x6bc0, mulmod(mload(0x6ba0), mload(0x4a40), f_q))mstore(0x6be0, mulmod(sub(f_q, mload(0x6bc0)), 1, f_q))mstore(0x6c00, mulmod(mload(0x6b80), 1, f_q)){ let result := mulmod(mload(0x1280), mload(0x4420), f_q)result := addmod(mulmod(mload(0x12a0), mload(0x4440), f_q), result, f_q)mstore(0x6c20, result) }mstore(0x6c40, mulmod(mload(0x6c20), mload(0x4a40), f_q))mstore(0x6c60, mulmod(sub(f_q, mload(0x6c40)), mload(0x1340), f_q))mstore(0x6c80, mulmod(mload(0x6b80), mload(0x1340), f_q))mstore(0x6ca0, addmod(mload(0x6be0), mload(0x6c60), f_q))mstore(0x6cc0, mulmod(mload(0x6ca0), mload(0x4da0), f_q))mstore(0x6ce0, mulmod(mload(0x6c00), mload(0x4da0), f_q))mstore(0x6d00, mulmod(mload(0x6c80), mload(0x4da0), f_q))mstore(0x6d20, addmod(mload(0x6b60), mload(0x6cc0), f_q))mstore(0x6d40, mulmod(1, mload(0x4860), f_q)){ let result := mulmod(mload(0x12c0), mload(0x4460), f_q)result := addmod(mulmod(mload(0x12e0), mload(0x4480), f_q), result, f_q)mstore(0x6d60, result) }mstore(0x6d80, mulmod(mload(0x6d60), mload(0x4a60), f_q))mstore(0x6da0, mulmod(sub(f_q, mload(0x6d80)), 1, f_q))mstore(0x6dc0, mulmod(mload(0x6d40), 1, f_q))mstore(0x6de0, mulmod(mload(0x6da0), mload(0x4dc0), f_q))mstore(0x6e00, mulmod(mload(0x6dc0), mload(0x4dc0), f_q))mstore(0x6e20, addmod(mload(0x6d20), mload(0x6de0), f_q))mstore(0x6e40, mulmod(1, mload(0x4360), f_q))mstore(0x6e60, mulmod(1, mload(0x1440), f_q))mstore(0x6e80, 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(0x6ea0, 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(0x6ec0, mload(0x6e20))success := and(eq(staticcall(gas(), 0x7, 0x6e80, 0x60, 0x6e80, 0x40), 1), success)mstore(0x6ee0, mload(0x6e80)) mstore(0x6f00, mload(0x6ea0))mstore(0x6f20, mload(0x220)) mstore(0x6f40, mload(0x240))success := and(eq(staticcall(gas(), 0x6, 0x6ee0, 0x80, 0x6ee0, 0x40), 1), success)mstore(0x6f60, mload(0x260)) mstore(0x6f80, mload(0x280))mstore(0x6fa0, mload(0x52e0))success := and(eq(staticcall(gas(), 0x7, 0x6f60, 0x60, 0x6f60, 0x40), 1), success)mstore(0x6fc0, mload(0x6ee0)) mstore(0x6fe0, mload(0x6f00))mstore(0x7000, mload(0x6f60)) mstore(0x7020, mload(0x6f80))success := and(eq(staticcall(gas(), 0x6, 0x6fc0, 0x80, 0x6fc0, 0x40), 1), success)mstore(0x7040, mload(0x2a0)) mstore(0x7060, mload(0x2c0))mstore(0x7080, mload(0x5300))success := and(eq(staticcall(gas(), 0x7, 0x7040, 0x60, 0x7040, 0x40), 1), success)mstore(0x70a0, mload(0x6fc0)) mstore(0x70c0, mload(0x6fe0))mstore(0x70e0, mload(0x7040)) mstore(0x7100, mload(0x7060))success := and(eq(staticcall(gas(), 0x6, 0x70a0, 0x80, 0x70a0, 0x40), 1), success)mstore(0x7120, mload(0x2e0)) mstore(0x7140, mload(0x300))mstore(0x7160, mload(0x5320))success := and(eq(staticcall(gas(), 0x7, 0x7120, 0x60, 0x7120, 0x40), 1), success)mstore(0x7180, mload(0x70a0)) mstore(0x71a0, mload(0x70c0))mstore(0x71c0, mload(0x7120)) mstore(0x71e0, mload(0x7140))success := and(eq(staticcall(gas(), 0x6, 0x7180, 0x80, 0x7180, 0x40), 1), success)mstore(0x7200, mload(0x320)) mstore(0x7220, mload(0x340))mstore(0x7240, mload(0x5340))success := and(eq(staticcall(gas(), 0x7, 0x7200, 0x60, 0x7200, 0x40), 1), success)mstore(0x7260, mload(0x7180)) mstore(0x7280, mload(0x71a0))mstore(0x72a0, mload(0x7200)) mstore(0x72c0, mload(0x7220))success := and(eq(staticcall(gas(), 0x6, 0x7260, 0x80, 0x7260, 0x40), 1), success)mstore(0x72e0, mload(0x360)) mstore(0x7300, mload(0x380))mstore(0x7320, mload(0x5360))success := and(eq(staticcall(gas(), 0x7, 0x72e0, 0x60, 0x72e0, 0x40), 1), success)mstore(0x7340, mload(0x7260)) mstore(0x7360, mload(0x7280))mstore(0x7380, mload(0x72e0)) mstore(0x73a0, mload(0x7300))success := and(eq(staticcall(gas(), 0x6, 0x7340, 0x80, 0x7340, 0x40), 1), success)mstore(0x73c0, mload(0x3a0)) mstore(0x73e0, mload(0x3c0))mstore(0x7400, mload(0x5380))success := and(eq(staticcall(gas(), 0x7, 0x73c0, 0x60, 0x73c0, 0x40), 1), success)mstore(0x7420, mload(0x7340)) mstore(0x7440, mload(0x7360))mstore(0x7460, mload(0x73c0)) mstore(0x7480, mload(0x73e0))success := and(eq(staticcall(gas(), 0x6, 0x7420, 0x80, 0x7420, 0x40), 1), success)mstore(0x74a0, mload(0x3e0)) mstore(0x74c0, mload(0x400))mstore(0x74e0, mload(0x53a0))success := and(eq(staticcall(gas(), 0x7, 0x74a0, 0x60, 0x74a0, 0x40), 1), success)mstore(0x7500, mload(0x7420)) mstore(0x7520, mload(0x7440))mstore(0x7540, mload(0x74a0)) mstore(0x7560, mload(0x74c0))success := and(eq(staticcall(gas(), 0x6, 0x7500, 0x80, 0x7500, 0x40), 1), success)mstore(0x7580, mload(0x420)) mstore(0x75a0, mload(0x440))mstore(0x75c0, mload(0x6400))success := and(eq(staticcall(gas(), 0x7, 0x7580, 0x60, 0x7580, 0x40), 1), success)mstore(0x75e0, mload(0x7500)) mstore(0x7600, mload(0x7520))mstore(0x7620, mload(0x7580)) mstore(0x7640, mload(0x75a0))success := and(eq(staticcall(gas(), 0x6, 0x75e0, 0x80, 0x75e0, 0x40), 1), success)mstore(0x7660, mload(0x500)) mstore(0x7680, mload(0x520))mstore(0x76a0, mload(0x6420))success := and(eq(staticcall(gas(), 0x7, 0x7660, 0x60, 0x7660, 0x40), 1), success)mstore(0x76c0, mload(0x75e0)) mstore(0x76e0, mload(0x7600))mstore(0x7700, mload(0x7660)) mstore(0x7720, mload(0x7680))success := and(eq(staticcall(gas(), 0x6, 0x76c0, 0x80, 0x76c0, 0x40), 1), success)mstore(0x7740, 0x16110139ffcaea288b5db7a90e2cc994d5dc1ab57d81cc3098eea01dd4dfee12) mstore(0x7760, 0x235058a877d843d2cdda0529dcfb95e8a5b2a2234aea4570ff5d073b489242fe)mstore(0x7780, mload(0x6440))success := and(eq(staticcall(gas(), 0x7, 0x7740, 0x60, 0x7740, 0x40), 1), success)mstore(0x77a0, mload(0x76c0)) mstore(0x77c0, mload(0x76e0))mstore(0x77e0, mload(0x7740)) mstore(0x7800, mload(0x7760))success := and(eq(staticcall(gas(), 0x6, 0x77a0, 0x80, 0x77a0, 0x40), 1), success)mstore(0x7820, 0x04528ec7365a2881b7d3c8925570e06bb3b17f04f6a95384ac8ed19a30c12097) mstore(0x7840, 0x28d1ef470a8a5278ad6d2eb9047ad7e93024113f543b06870f1bbea7177db404)mstore(0x7860, mload(0x6460))success := and(eq(staticcall(gas(), 0x7, 0x7820, 0x60, 0x7820, 0x40), 1), success)mstore(0x7880, mload(0x77a0)) mstore(0x78a0, mload(0x77c0))mstore(0x78c0, mload(0x7820)) mstore(0x78e0, mload(0x7840))success := and(eq(staticcall(gas(), 0x6, 0x7880, 0x80, 0x7880, 0x40), 1), success)mstore(0x7900, 0x2001fc91db9d47c157d22119ec3729c8bbf6dbff6f33a10471af41fe42f711e3) mstore(0x7920, 0x07d5a5bd6db475ff9f39b4563f19be62de5d9f7bbcce0f91389d0d75fc1a8585)mstore(0x7940, mload(0x6480))success := and(eq(staticcall(gas(), 0x7, 0x7900, 0x60, 0x7900, 0x40), 1), success)mstore(0x7960, mload(0x7880)) mstore(0x7980, mload(0x78a0))mstore(0x79a0, mload(0x7900)) mstore(0x79c0, mload(0x7920))success := and(eq(staticcall(gas(), 0x6, 0x7960, 0x80, 0x7960, 0x40), 1), success)mstore(0x79e0, 0x2075fd9cc848f563b37b2a7b11de080457d63e30263eda9b7a2548ecf4e6a5ac) mstore(0x7a00, 0x0992caec711622820814da7d80bcea3564ab07b7f671580483321fc282821b44)mstore(0x7a20, mload(0x64a0))success := and(eq(staticcall(gas(), 0x7, 0x79e0, 0x60, 0x79e0, 0x40), 1), success)mstore(0x7a40, mload(0x7960)) mstore(0x7a60, mload(0x7980))mstore(0x7a80, mload(0x79e0)) mstore(0x7aa0, mload(0x7a00))success := and(eq(staticcall(gas(), 0x6, 0x7a40, 0x80, 0x7a40, 0x40), 1), success)mstore(0x7ac0, 0x2959303e8d203fc1143f281f3a8a906e538376d279f2a8310c2dfa1b6eb03fb9) mstore(0x7ae0, 0x0d403fb9b9e9742f4a83953e2def8a6dd517f75ea60df6c1356dcf5a444026fa)mstore(0x7b00, mload(0x64c0))success := and(eq(staticcall(gas(), 0x7, 0x7ac0, 0x60, 0x7ac0, 0x40), 1), success)mstore(0x7b20, mload(0x7a40)) mstore(0x7b40, mload(0x7a60))mstore(0x7b60, mload(0x7ac0)) mstore(0x7b80, mload(0x7ae0))success := and(eq(staticcall(gas(), 0x6, 0x7b20, 0x80, 0x7b20, 0x40), 1), success)mstore(0x7ba0, 0x1af3f6fbed8b7b92f3657bbf56c79df1cea9be38d29ea9c7f6f7d193cd762ddd) mstore(0x7bc0, 0x29236751fd1d0dbe22c57f17dd319c8504178bb39baae088c062a6ce8b41a857)mstore(0x7be0, mload(0x64e0))success := and(eq(staticcall(gas(), 0x7, 0x7ba0, 0x60, 0x7ba0, 0x40), 1), success)mstore(0x7c00, mload(0x7b20)) mstore(0x7c20, mload(0x7b40))mstore(0x7c40, mload(0x7ba0)) mstore(0x7c60, mload(0x7bc0))success := and(eq(staticcall(gas(), 0x6, 0x7c00, 0x80, 0x7c00, 0x40), 1), success)mstore(0x7c80, 0x110253e33c343eceafc3d5f21ce20a5bad68de222b71563f3f0db3c2175b3cb2) mstore(0x7ca0, 0x1f354151121eb2b64e8f49abdf0c770773ef963aaf080b59b553022c05c12676)mstore(0x7cc0, mload(0x6500))success := and(eq(staticcall(gas(), 0x7, 0x7c80, 0x60, 0x7c80, 0x40), 1), success)mstore(0x7ce0, mload(0x7c00)) mstore(0x7d00, mload(0x7c20))mstore(0x7d20, mload(0x7c80)) mstore(0x7d40, mload(0x7ca0))success := and(eq(staticcall(gas(), 0x6, 0x7ce0, 0x80, 0x7ce0, 0x40), 1), success)mstore(0x7d60, 0x1441f29c4c2a4187b399976220d1732c676ab94a11e1d267066ac55e90d7824e) mstore(0x7d80, 0x1caf30d355cad4ef07ce07485d368c66735c508ca86cec117ebec24a4744817f)mstore(0x7da0, mload(0x6520))success := and(eq(staticcall(gas(), 0x7, 0x7d60, 0x60, 0x7d60, 0x40), 1), success)mstore(0x7dc0, mload(0x7ce0)) mstore(0x7de0, mload(0x7d00))mstore(0x7e00, mload(0x7d60)) mstore(0x7e20, mload(0x7d80))success := and(eq(staticcall(gas(), 0x6, 0x7dc0, 0x80, 0x7dc0, 0x40), 1), success)mstore(0x7e40, 0x0788e757e87d0a0dc0b4a8cc5611babc6635ad1028446112e5ba6d88244b3f88) mstore(0x7e60, 0x164ca47318fff945222117d8f2407c8bdd81c7d6d737858d7491dc85e5b36fea)mstore(0x7e80, mload(0x6540))success := and(eq(staticcall(gas(), 0x7, 0x7e40, 0x60, 0x7e40, 0x40), 1), success)mstore(0x7ea0, mload(0x7dc0)) mstore(0x7ec0, mload(0x7de0))mstore(0x7ee0, mload(0x7e40)) mstore(0x7f00, mload(0x7e60))success := and(eq(staticcall(gas(), 0x6, 0x7ea0, 0x80, 0x7ea0, 0x40), 1), success)mstore(0x7f20, 0x00c82f9056e6455b536b47ea783577cb4fa99a7488fe4d7f4712ee0344f18a80) mstore(0x7f40, 0x01f2889dcdc16b45f1056ac1af7167ae89a90f085cd725adcd408b6cc81bad87)mstore(0x7f60, mload(0x6560))success := and(eq(staticcall(gas(), 0x7, 0x7f20, 0x60, 0x7f20, 0x40), 1), success)mstore(0x7f80, mload(0x7ea0)) mstore(0x7fa0, mload(0x7ec0))mstore(0x7fc0, mload(0x7f20)) mstore(0x7fe0, mload(0x7f40))success := and(eq(staticcall(gas(), 0x6, 0x7f80, 0x80, 0x7f80, 0x40), 1), success)mstore(0x8000, 0x2ae781f09896e27b91a8cf5d00f0277237db0d8abf54c0afc6c440b3bb9f5ddf) mstore(0x8020, 0x14e6fb10c7630dc2d94bcd5f1635828bcaf1499f32cbf9f4b0d290113ca41333)mstore(0x8040, mload(0x6580))success := and(eq(staticcall(gas(), 0x7, 0x8000, 0x60, 0x8000, 0x40), 1), success)mstore(0x8060, mload(0x7f80)) mstore(0x8080, mload(0x7fa0))mstore(0x80a0, mload(0x8000)) mstore(0x80c0, mload(0x8020))success := and(eq(staticcall(gas(), 0x6, 0x8060, 0x80, 0x8060, 0x40), 1), success)mstore(0x80e0, 0x2e861ae220c06d7cea845b0609d44f3cd517abf16c6b76b54c29448c36d7bd7e) mstore(0x8100, 0x16e526e70e13e64f8c99c27b1396bf7ac5bae927d651468cbc393208c8715541)mstore(0x8120, mload(0x65a0))success := and(eq(staticcall(gas(), 0x7, 0x80e0, 0x60, 0x80e0, 0x40), 1), success)mstore(0x8140, mload(0x8060)) mstore(0x8160, mload(0x8080))mstore(0x8180, mload(0x80e0)) mstore(0x81a0, mload(0x8100))success := and(eq(staticcall(gas(), 0x6, 0x8140, 0x80, 0x8140, 0x40), 1), success)mstore(0x81c0, 0x0e9d9acc5419b14b666104bbde462e9933e17fe8e1aa95396358b3d05fb14d35) mstore(0x81e0, 0x19e87bf55ffacfaec23d42bc449b562476074828823882479d09f025b86b32a5)mstore(0x8200, mload(0x65c0))success := and(eq(staticcall(gas(), 0x7, 0x81c0, 0x60, 0x81c0, 0x40), 1), success)mstore(0x8220, mload(0x8140)) mstore(0x8240, mload(0x8160))mstore(0x8260, mload(0x81c0)) mstore(0x8280, mload(0x81e0))success := and(eq(staticcall(gas(), 0x6, 0x8220, 0x80, 0x8220, 0x40), 1), success)mstore(0x82a0, 0x26a5b8ef3f0d4e9b646134f4ffa79bae9607281ef2124fa455239a38fdd5134b) mstore(0x82c0, 0x0457a193201120b19db3b9dc122f79eba84f6e350dae80415bd720ca38789d04)mstore(0x82e0, mload(0x65e0))success := and(eq(staticcall(gas(), 0x7, 0x82a0, 0x60, 0x82a0, 0x40), 1), success)mstore(0x8300, mload(0x8220)) mstore(0x8320, mload(0x8240))mstore(0x8340, mload(0x82a0)) mstore(0x8360, mload(0x82c0))success := and(eq(staticcall(gas(), 0x6, 0x8300, 0x80, 0x8300, 0x40), 1), success)mstore(0x8380, 0x1e0330919a18cd04edf9d6c2f037e441567ca02e25f5fb13bbb6b4662f5facd7) mstore(0x83a0, 0x0b80b10b2364f73bf2fecff09a514461efa731aefae825f4a70ddb82da2996d2)mstore(0x83c0, mload(0x6600))success := and(eq(staticcall(gas(), 0x7, 0x8380, 0x60, 0x8380, 0x40), 1), success)mstore(0x83e0, mload(0x8300)) mstore(0x8400, mload(0x8320))mstore(0x8420, mload(0x8380)) mstore(0x8440, mload(0x83a0))success := and(eq(staticcall(gas(), 0x6, 0x83e0, 0x80, 0x83e0, 0x40), 1), success)mstore(0x8460, 0x29fea04b22e965cb7bb2b876ec3db91e192f09358b6cef07ef91f589c6f9ea93) mstore(0x8480, 0x26bedc0f0c6476d05c29607416f7197cca9df4468aba0c868bab000852eb41f9)mstore(0x84a0, mload(0x6620))success := and(eq(staticcall(gas(), 0x7, 0x8460, 0x60, 0x8460, 0x40), 1), success)mstore(0x84c0, mload(0x83e0)) mstore(0x84e0, mload(0x8400))mstore(0x8500, mload(0x8460)) mstore(0x8520, mload(0x8480))success := and(eq(staticcall(gas(), 0x6, 0x84c0, 0x80, 0x84c0, 0x40), 1), success)mstore(0x8540, 0x226c31dee63ec129f6a529ae7a056a9d0e49851f6adeea30d8ab9b2966fe69e3) mstore(0x8560, 0x1de138eac035d518bf490f363a1049aa54b1dbd07f231a7394f22a952c6945f4)mstore(0x8580, mload(0x6640))success := and(eq(staticcall(gas(), 0x7, 0x8540, 0x60, 0x8540, 0x40), 1), success)mstore(0x85a0, mload(0x84c0)) mstore(0x85c0, mload(0x84e0))mstore(0x85e0, mload(0x8540)) mstore(0x8600, mload(0x8560))success := and(eq(staticcall(gas(), 0x6, 0x85a0, 0x80, 0x85a0, 0x40), 1), success)mstore(0x8620, 0x0a01e44f207ada75eb6a531221f3ffc199ff903717acf2377e9f8e9fee7d46fc) mstore(0x8640, 0x13f3eda1f30b397a771d88e95d451dac6f2d900728672efa3998f834fb5019cf)mstore(0x8660, mload(0x6660))success := and(eq(staticcall(gas(), 0x7, 0x8620, 0x60, 0x8620, 0x40), 1), success)mstore(0x8680, mload(0x85a0)) mstore(0x86a0, mload(0x85c0))mstore(0x86c0, mload(0x8620)) mstore(0x86e0, mload(0x8640))success := and(eq(staticcall(gas(), 0x6, 0x8680, 0x80, 0x8680, 0x40), 1), success)mstore(0x8700, 0x183e0dcbfd90a179df050a7ff96fe9b21d90fc10307a0adf6ed8b5f11b94bfc5) mstore(0x8720, 0x1b99e60d00e75cf0ea81dbe6e9e74033b8f7cdbb33cee2ec717c31ae58442780)mstore(0x8740, mload(0x6680))success := and(eq(staticcall(gas(), 0x7, 0x8700, 0x60, 0x8700, 0x40), 1), success)mstore(0x8760, mload(0x8680)) mstore(0x8780, mload(0x86a0))mstore(0x87a0, mload(0x8700)) mstore(0x87c0, mload(0x8720))success := and(eq(staticcall(gas(), 0x6, 0x8760, 0x80, 0x8760, 0x40), 1), success)mstore(0x87e0, 0x2d48236e8a5794db527f9a5374839ce64b64e7229d183cda77fe66bd943f65e5) mstore(0x8800, 0x06f472369dc3c4ecae95586baca179cb3fe28e65675d71a3e6275520d9c7d747)mstore(0x8820, mload(0x66a0))success := and(eq(staticcall(gas(), 0x7, 0x87e0, 0x60, 0x87e0, 0x40), 1), success)mstore(0x8840, mload(0x8760)) mstore(0x8860, mload(0x8780))mstore(0x8880, mload(0x87e0)) mstore(0x88a0, mload(0x8800))success := and(eq(staticcall(gas(), 0x6, 0x8840, 0x80, 0x8840, 0x40), 1), success)mstore(0x88c0, 0x2b7ae2ec7837194e9ad18e9a65374be5fb7818bf0d352a6d069cbcfa6dc48750) mstore(0x88e0, 0x22b664ba612400d5cce32e88e9c00c790a83f2fec90eaa38cf7ddb678ddcdea6)mstore(0x8900, mload(0x66c0))success := and(eq(staticcall(gas(), 0x7, 0x88c0, 0x60, 0x88c0, 0x40), 1), success)mstore(0x8920, mload(0x8840)) mstore(0x8940, mload(0x8860))mstore(0x8960, mload(0x88c0)) mstore(0x8980, mload(0x88e0))success := and(eq(staticcall(gas(), 0x6, 0x8920, 0x80, 0x8920, 0x40), 1), success)mstore(0x89a0, mload(0x860)) mstore(0x89c0, mload(0x880))mstore(0x89e0, mload(0x66e0))success := and(eq(staticcall(gas(), 0x7, 0x89a0, 0x60, 0x89a0, 0x40), 1), success)mstore(0x8a00, mload(0x8920)) mstore(0x8a20, mload(0x8940))mstore(0x8a40, mload(0x89a0)) mstore(0x8a60, mload(0x89c0))success := and(eq(staticcall(gas(), 0x6, 0x8a00, 0x80, 0x8a00, 0x40), 1), success)mstore(0x8a80, mload(0x8a0)) mstore(0x8aa0, mload(0x8c0))mstore(0x8ac0, mload(0x6700))success := and(eq(staticcall(gas(), 0x7, 0x8a80, 0x60, 0x8a80, 0x40), 1), success)mstore(0x8ae0, mload(0x8a00)) mstore(0x8b00, mload(0x8a20))mstore(0x8b20, mload(0x8a80)) mstore(0x8b40, mload(0x8aa0))success := and(eq(staticcall(gas(), 0x6, 0x8ae0, 0x80, 0x8ae0, 0x40), 1), success)mstore(0x8b60, mload(0x8e0)) mstore(0x8b80, mload(0x900))mstore(0x8ba0, mload(0x6720))success := and(eq(staticcall(gas(), 0x7, 0x8b60, 0x60, 0x8b60, 0x40), 1), success)mstore(0x8bc0, mload(0x8ae0)) mstore(0x8be0, mload(0x8b00))mstore(0x8c00, mload(0x8b60)) mstore(0x8c20, mload(0x8b80))success := and(eq(staticcall(gas(), 0x6, 0x8bc0, 0x80, 0x8bc0, 0x40), 1), success)mstore(0x8c40, mload(0x7c0)) mstore(0x8c60, mload(0x7e0))mstore(0x8c80, mload(0x6740))success := and(eq(staticcall(gas(), 0x7, 0x8c40, 0x60, 0x8c40, 0x40), 1), success)mstore(0x8ca0, mload(0x8bc0)) mstore(0x8cc0, mload(0x8be0))mstore(0x8ce0, mload(0x8c40)) mstore(0x8d00, mload(0x8c60))success := and(eq(staticcall(gas(), 0x6, 0x8ca0, 0x80, 0x8ca0, 0x40), 1), success)mstore(0x8d20, mload(0x600)) mstore(0x8d40, mload(0x620))mstore(0x8d60, mload(0x6ac0))success := and(eq(staticcall(gas(), 0x7, 0x8d20, 0x60, 0x8d20, 0x40), 1), success)mstore(0x8d80, mload(0x8ca0)) mstore(0x8da0, mload(0x8cc0))mstore(0x8dc0, mload(0x8d20)) mstore(0x8de0, mload(0x8d40))success := and(eq(staticcall(gas(), 0x6, 0x8d80, 0x80, 0x8d80, 0x40), 1), success)mstore(0x8e00, mload(0x640)) mstore(0x8e20, mload(0x660))mstore(0x8e40, mload(0x6ae0))success := and(eq(staticcall(gas(), 0x7, 0x8e00, 0x60, 0x8e00, 0x40), 1), success)mstore(0x8e60, mload(0x8d80)) mstore(0x8e80, mload(0x8da0))mstore(0x8ea0, mload(0x8e00)) mstore(0x8ec0, mload(0x8e20))success := and(eq(staticcall(gas(), 0x6, 0x8e60, 0x80, 0x8e60, 0x40), 1), success)mstore(0x8ee0, mload(0x680)) mstore(0x8f00, mload(0x6a0))mstore(0x8f20, mload(0x6b00))success := and(eq(staticcall(gas(), 0x7, 0x8ee0, 0x60, 0x8ee0, 0x40), 1), success)mstore(0x8f40, mload(0x8e60)) mstore(0x8f60, mload(0x8e80))mstore(0x8f80, mload(0x8ee0)) mstore(0x8fa0, mload(0x8f00))success := and(eq(staticcall(gas(), 0x6, 0x8f40, 0x80, 0x8f40, 0x40), 1), success)mstore(0x8fc0, mload(0x6c0)) mstore(0x8fe0, mload(0x6e0))mstore(0x9000, mload(0x6b20))success := and(eq(staticcall(gas(), 0x7, 0x8fc0, 0x60, 0x8fc0, 0x40), 1), success)mstore(0x9020, mload(0x8f40)) mstore(0x9040, mload(0x8f60))mstore(0x9060, mload(0x8fc0)) mstore(0x9080, mload(0x8fe0))success := and(eq(staticcall(gas(), 0x6, 0x9020, 0x80, 0x9020, 0x40), 1), success)mstore(0x90a0, mload(0x700)) mstore(0x90c0, mload(0x720))mstore(0x90e0, mload(0x6b40))success := and(eq(staticcall(gas(), 0x7, 0x90a0, 0x60, 0x90a0, 0x40), 1), success)mstore(0x9100, mload(0x9020)) mstore(0x9120, mload(0x9040))mstore(0x9140, mload(0x90a0)) mstore(0x9160, mload(0x90c0))success := and(eq(staticcall(gas(), 0x6, 0x9100, 0x80, 0x9100, 0x40), 1), success)mstore(0x9180, mload(0x740)) mstore(0x91a0, mload(0x760))mstore(0x91c0, mload(0x6ce0))success := and(eq(staticcall(gas(), 0x7, 0x9180, 0x60, 0x9180, 0x40), 1), success)mstore(0x91e0, mload(0x9100)) mstore(0x9200, mload(0x9120))mstore(0x9220, mload(0x9180)) mstore(0x9240, mload(0x91a0))success := and(eq(staticcall(gas(), 0x6, 0x91e0, 0x80, 0x91e0, 0x40), 1), success)mstore(0x9260, mload(0x780)) mstore(0x9280, mload(0x7a0))mstore(0x92a0, mload(0x6d00))success := and(eq(staticcall(gas(), 0x7, 0x9260, 0x60, 0x9260, 0x40), 1), success)mstore(0x92c0, mload(0x91e0)) mstore(0x92e0, mload(0x9200))mstore(0x9300, mload(0x9260)) mstore(0x9320, mload(0x9280))success := and(eq(staticcall(gas(), 0x6, 0x92c0, 0x80, 0x92c0, 0x40), 1), success)mstore(0x9340, mload(0x4c0)) mstore(0x9360, mload(0x4e0))mstore(0x9380, mload(0x6e00))success := and(eq(staticcall(gas(), 0x7, 0x9340, 0x60, 0x9340, 0x40), 1), success)mstore(0x93a0, mload(0x92c0)) mstore(0x93c0, mload(0x92e0))mstore(0x93e0, mload(0x9340)) mstore(0x9400, mload(0x9360))success := and(eq(staticcall(gas(), 0x6, 0x93a0, 0x80, 0x93a0, 0x40), 1), success)mstore(0x9420, mload(0x13e0)) mstore(0x9440, mload(0x1400))mstore(0x9460, sub(f_q, mload(0x6e40)))success := and(eq(staticcall(gas(), 0x7, 0x9420, 0x60, 0x9420, 0x40), 1), success)mstore(0x9480, mload(0x93a0)) mstore(0x94a0, mload(0x93c0))mstore(0x94c0, mload(0x9420)) mstore(0x94e0, mload(0x9440))success := and(eq(staticcall(gas(), 0x6, 0x9480, 0x80, 0x9480, 0x40), 1), success)mstore(0x9500, mload(0x1480)) mstore(0x9520, mload(0x14a0))mstore(0x9540, mload(0x6e60))success := and(eq(staticcall(gas(), 0x7, 0x9500, 0x60, 0x9500, 0x40), 1), success)mstore(0x9560, mload(0x9480)) mstore(0x9580, mload(0x94a0))mstore(0x95a0, mload(0x9500)) mstore(0x95c0, mload(0x9520))success := and(eq(staticcall(gas(), 0x6, 0x9560, 0x80, 0x9560, 0x40), 1), success)mstore(0x95e0, mload(0x9560)) mstore(0x9600, mload(0x9580))mstore(0x9620, mload(0x1480)) mstore(0x9640, mload(0x14a0))mstore(0x9660, mload(0x14c0)) mstore(0x9680, mload(0x14e0))mstore(0x96a0, mload(0x1500)) mstore(0x96c0, mload(0x1520))mstore(0x96e0, keccak256(0x95e0, 256))mstore(0x9700, mod(mload(38496), f_q))mstore(0x9720, mulmod(mload(0x9700), mload(0x9700), f_q))mstore(0x9740, mulmod(1, mload(0x9700), f_q))mstore(0x9760, mload(0x9660)) mstore(0x9780, mload(0x9680))mstore(0x97a0, mload(0x9740))success := and(eq(staticcall(gas(), 0x7, 0x9760, 0x60, 0x9760, 0x40), 1), success)mstore(0x97c0, mload(0x95e0)) mstore(0x97e0, mload(0x9600))mstore(0x9800, mload(0x9760)) mstore(0x9820, mload(0x9780))success := and(eq(staticcall(gas(), 0x6, 0x97c0, 0x80, 0x97c0, 0x40), 1), success)mstore(0x9840, mload(0x96a0)) mstore(0x9860, mload(0x96c0))mstore(0x9880, mload(0x9740))success := and(eq(staticcall(gas(), 0x7, 0x9840, 0x60, 0x9840, 0x40), 1), success)mstore(0x98a0, mload(0x9620)) mstore(0x98c0, mload(0x9640))mstore(0x98e0, mload(0x9840)) mstore(0x9900, mload(0x9860))success := and(eq(staticcall(gas(), 0x6, 0x98a0, 0x80, 0x98a0, 0x40), 1), success)mstore(0x9920, mload(0x97c0)) mstore(0x9940, mload(0x97e0))mstore(0x9960, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(0x9980, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(0x99a0, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(0x99c0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(0x99e0, mload(0x98a0)) mstore(0x9a00, mload(0x98c0))mstore(0x9a20, 0x0181624e80f3d6ae28df7e01eaeab1c0e919877a3b8a6b7fbc69a6817d596ea2) mstore(0x9a40, 0x1783d30dcb12d259bb89098addf6280fa4b653be7a152542a28f7b926e27e648) mstore(0x9a60, 0x00ae44489d41a0d179e2dfdc03bddd883b7109f8b6ae316a59e815c1a6b35304) mstore(0x9a80, 0x0b2147ab62a386bd63e6de1522109b8c9588ab466f5aadfde8c41ca3749423ee)success := and(eq(staticcall(gas(), 0x8, 0x9920, 0x180, 0x9920, 0x20), 1), success)success := and(eq(mload(0x9920), 1), success)} return success; } } diff --git a/contracts/snark-verifiers/committee_update_verifier.sol b/contracts/snark-verifiers/committee_update_verifier.sol new file mode 100644 index 00000000..aef49de1 --- /dev/null +++ b/contracts/snark-verifiers/committee_update_verifier.sol @@ -0,0 +1,23 @@ +// 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[77] calldata pubInputs, + bytes calldata proof + ) public view returns (bool) { + bool success = true; + bytes32[970] 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(0xe0, mod(calldataload(0x44), f_q))mstore(0x100, mod(calldataload(0x64), f_q))mstore(0x120, mod(calldataload(0x84), f_q))mstore(0x140, mod(calldataload(0xa4), f_q))mstore(0x160, mod(calldataload(0xc4), f_q))mstore(0x180, mod(calldataload(0xe4), f_q))mstore(0x1a0, mod(calldataload(0x104), f_q))mstore(0x1c0, mod(calldataload(0x124), f_q))mstore(0x1e0, mod(calldataload(0x144), f_q))mstore(0x200, mod(calldataload(0x164), f_q))mstore(0x220, mod(calldataload(0x184), f_q))mstore(0x240, mod(calldataload(0x1a4), f_q))mstore(0x260, mod(calldataload(0x1c4), f_q))mstore(0x280, mod(calldataload(0x1e4), f_q))mstore(0x2a0, mod(calldataload(0x204), f_q))mstore(0x2c0, mod(calldataload(0x224), f_q))mstore(0x2e0, mod(calldataload(0x244), f_q))mstore(0x300, mod(calldataload(0x264), f_q))mstore(0x320, mod(calldataload(0x284), f_q))mstore(0x340, mod(calldataload(0x2a4), f_q))mstore(0x360, mod(calldataload(0x2c4), f_q))mstore(0x380, mod(calldataload(0x2e4), f_q))mstore(0x3a0, mod(calldataload(0x304), f_q))mstore(0x3c0, mod(calldataload(0x324), f_q))mstore(0x3e0, mod(calldataload(0x344), f_q))mstore(0x400, mod(calldataload(0x364), f_q))mstore(0x420, mod(calldataload(0x384), f_q))mstore(0x440, mod(calldataload(0x3a4), f_q))mstore(0x460, mod(calldataload(0x3c4), f_q))mstore(0x480, mod(calldataload(0x3e4), f_q))mstore(0x4a0, mod(calldataload(0x404), f_q))mstore(0x4c0, mod(calldataload(0x424), f_q))mstore(0x4e0, mod(calldataload(0x444), f_q))mstore(0x500, mod(calldataload(0x464), f_q))mstore(0x520, mod(calldataload(0x484), f_q))mstore(0x540, mod(calldataload(0x4a4), f_q))mstore(0x560, mod(calldataload(0x4c4), f_q))mstore(0x580, mod(calldataload(0x4e4), f_q))mstore(0x5a0, mod(calldataload(0x504), f_q))mstore(0x5c0, mod(calldataload(0x524), f_q))mstore(0x5e0, mod(calldataload(0x544), f_q))mstore(0x600, mod(calldataload(0x564), f_q))mstore(0x620, mod(calldataload(0x584), f_q))mstore(0x640, mod(calldataload(0x5a4), f_q))mstore(0x660, mod(calldataload(0x5c4), f_q))mstore(0x680, mod(calldataload(0x5e4), f_q))mstore(0x6a0, mod(calldataload(0x604), f_q))mstore(0x6c0, mod(calldataload(0x624), f_q))mstore(0x6e0, mod(calldataload(0x644), f_q))mstore(0x700, mod(calldataload(0x664), f_q))mstore(0x720, mod(calldataload(0x684), f_q))mstore(0x740, mod(calldataload(0x6a4), f_q))mstore(0x760, mod(calldataload(0x6c4), f_q))mstore(0x780, mod(calldataload(0x6e4), f_q))mstore(0x7a0, mod(calldataload(0x704), f_q))mstore(0x7c0, mod(calldataload(0x724), f_q))mstore(0x7e0, mod(calldataload(0x744), f_q))mstore(0x800, mod(calldataload(0x764), f_q))mstore(0x820, mod(calldataload(0x784), f_q))mstore(0x840, mod(calldataload(0x7a4), f_q))mstore(0x860, mod(calldataload(0x7c4), f_q))mstore(0x880, mod(calldataload(0x7e4), f_q))mstore(0x8a0, mod(calldataload(0x804), f_q))mstore(0x8c0, mod(calldataload(0x824), f_q))mstore(0x8e0, mod(calldataload(0x844), f_q))mstore(0x900, mod(calldataload(0x864), f_q))mstore(0x920, mod(calldataload(0x884), f_q))mstore(0x940, mod(calldataload(0x8a4), f_q))mstore(0x960, mod(calldataload(0x8c4), f_q))mstore(0x980, mod(calldataload(0x8e4), f_q))mstore(0x9a0, mod(calldataload(0x904), f_q))mstore(0x9c0, mod(calldataload(0x924), f_q))mstore(0x9e0, mod(calldataload(0x944), f_q))mstore(0xa00, mod(calldataload(0x964), f_q))mstore(0xa20, mod(calldataload(0x984), f_q))mstore(0x80, 15186837681902097513544980734177221849855427296742621920266601528186303241061) { let x := calldataload(0x9e4) mstore(0xa40, x) let y := calldataload(0xa04) mstore(0xa60, y) success := and(validate_ec_point(x, y), success) }mstore(0xa80, keccak256(0x80, 2560)){ let hash := mload(0xa80) mstore(0xaa0, mod(hash, f_q)) mstore(0xac0, hash) } { let x := calldataload(0xa24) mstore(0xae0, x) let y := calldataload(0xa44) mstore(0xb00, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xa64) mstore(0xb20, x) let y := calldataload(0xa84) mstore(0xb40, y) success := and(validate_ec_point(x, y), success) }mstore(0xb60, keccak256(0xac0, 160)){ let hash := mload(0xb60) mstore(0xb80, mod(hash, f_q)) mstore(0xba0, hash) }mstore8(0xbc0, 1)mstore(0xbc0, keccak256(0xba0, 33)){ let hash := mload(0xbc0) mstore(0xbe0, mod(hash, f_q)) mstore(0xc00, hash) } { let x := calldataload(0xaa4) mstore(0xc20, x) let y := calldataload(0xac4) mstore(0xc40, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xae4) mstore(0xc60, x) let y := calldataload(0xb04) mstore(0xc80, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xb24) mstore(0xca0, x) let y := calldataload(0xb44) mstore(0xcc0, y) success := and(validate_ec_point(x, y), success) }mstore(0xce0, keccak256(0xc00, 224)){ let hash := mload(0xce0) mstore(0xd00, mod(hash, f_q)) mstore(0xd20, hash) } { let x := calldataload(0xb64) mstore(0xd40, x) let y := calldataload(0xb84) mstore(0xd60, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xba4) mstore(0xd80, x) let y := calldataload(0xbc4) mstore(0xda0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xbe4) mstore(0xdc0, x) let y := calldataload(0xc04) mstore(0xde0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xc24) mstore(0xe00, x) let y := calldataload(0xc44) mstore(0xe20, y) success := and(validate_ec_point(x, y), success) }mstore(0xe40, keccak256(0xd20, 288)){ let hash := mload(0xe40) mstore(0xe60, mod(hash, f_q)) mstore(0xe80, hash) }mstore(0xea0, mod(calldataload(0xc64), f_q))mstore(0xec0, mod(calldataload(0xc84), f_q))mstore(0xee0, mod(calldataload(0xca4), f_q))mstore(0xf00, mod(calldataload(0xcc4), f_q))mstore(0xf20, mod(calldataload(0xce4), f_q))mstore(0xf40, mod(calldataload(0xd04), f_q))mstore(0xf60, mod(calldataload(0xd24), f_q))mstore(0xf80, mod(calldataload(0xd44), f_q))mstore(0xfa0, mod(calldataload(0xd64), f_q))mstore(0xfc0, mod(calldataload(0xd84), f_q))mstore(0xfe0, mod(calldataload(0xda4), f_q))mstore(0x1000, mod(calldataload(0xdc4), f_q))mstore(0x1020, mod(calldataload(0xde4), f_q))mstore(0x1040, mod(calldataload(0xe04), f_q))mstore(0x1060, mod(calldataload(0xe24), f_q))mstore(0x1080, mod(calldataload(0xe44), f_q))mstore(0x10a0, mod(calldataload(0xe64), f_q))mstore(0x10c0, mod(calldataload(0xe84), f_q))mstore(0x10e0, mod(calldataload(0xea4), f_q))mstore(0x1100, keccak256(0xe80, 640)){ let hash := mload(0x1100) mstore(0x1120, mod(hash, f_q)) mstore(0x1140, hash) }mstore8(0x1160, 1)mstore(0x1160, keccak256(0x1140, 33)){ let hash := mload(0x1160) mstore(0x1180, mod(hash, f_q)) mstore(0x11a0, hash) } { let x := calldataload(0xec4) mstore(0x11c0, x) let y := calldataload(0xee4) mstore(0x11e0, y) success := and(validate_ec_point(x, y), success) }mstore(0x1200, keccak256(0x11a0, 96)){ let hash := mload(0x1200) mstore(0x1220, mod(hash, f_q)) mstore(0x1240, hash) } { let x := calldataload(0xf04) mstore(0x1260, x) let y := calldataload(0xf24) mstore(0x1280, y) success := and(validate_ec_point(x, y), success) }{ let x := mload(0xa0)x := add(x, shl(88, mload(0xc0)))x := add(x, shl(176, mload(0xe0)))mstore(0x12a0, x)let y := mload(0x100)y := add(y, shl(88, mload(0x120)))y := add(y, shl(176, mload(0x140)))mstore(0x12c0, y) success := and(validate_ec_point(x, y), success) }{ let x := mload(0x160)x := add(x, shl(88, mload(0x180)))x := add(x, shl(176, mload(0x1a0)))mstore(0x12e0, x)let y := mload(0x1c0)y := add(y, shl(88, mload(0x1e0)))y := add(y, shl(176, mload(0x200)))mstore(0x1300, y) success := and(validate_ec_point(x, y), success) }mstore(0x1320, mulmod(mload(0xe60), mload(0xe60), f_q))mstore(0x1340, mulmod(mload(0x1320), mload(0x1320), f_q))mstore(0x1360, mulmod(mload(0x1340), mload(0x1340), f_q))mstore(0x1380, mulmod(mload(0x1360), mload(0x1360), f_q))mstore(0x13a0, mulmod(mload(0x1380), mload(0x1380), f_q))mstore(0x13c0, mulmod(mload(0x13a0), mload(0x13a0), f_q))mstore(0x13e0, mulmod(mload(0x13c0), mload(0x13c0), f_q))mstore(0x1400, mulmod(mload(0x13e0), mload(0x13e0), f_q))mstore(0x1420, mulmod(mload(0x1400), mload(0x1400), f_q))mstore(0x1440, mulmod(mload(0x1420), mload(0x1420), f_q))mstore(0x1460, mulmod(mload(0x1440), mload(0x1440), f_q))mstore(0x1480, mulmod(mload(0x1460), mload(0x1460), f_q))mstore(0x14a0, mulmod(mload(0x1480), mload(0x1480), f_q))mstore(0x14c0, mulmod(mload(0x14a0), mload(0x14a0), f_q))mstore(0x14e0, mulmod(mload(0x14c0), mload(0x14c0), f_q))mstore(0x1500, mulmod(mload(0x14e0), mload(0x14e0), f_q))mstore(0x1520, mulmod(mload(0x1500), mload(0x1500), f_q))mstore(0x1540, mulmod(mload(0x1520), mload(0x1520), f_q))mstore(0x1560, mulmod(mload(0x1540), mload(0x1540), f_q))mstore(0x1580, mulmod(mload(0x1560), mload(0x1560), f_q))mstore(0x15a0, mulmod(mload(0x1580), mload(0x1580), f_q))mstore(0x15c0, mulmod(mload(0x15a0), mload(0x15a0), f_q))mstore(0x15e0, mulmod(mload(0x15c0), mload(0x15c0), f_q))mstore(0x1600, mulmod(mload(0x15e0), mload(0x15e0), f_q))mstore(0x1620, mulmod(mload(0x1600), mload(0x1600), f_q))mstore(0x1640, addmod(mload(0x1620), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(0x1660, mulmod(mload(0x1640), 21888242219518804655518433051623070663413851959604507555939307129453691614729, f_q))mstore(0x1680, mulmod(mload(0x1660), 2589924162180571669379035227311450128851046490936248479048462765733473671200, f_q))mstore(0x16a0, addmod(mload(0xe60), 19298318709658703552867370517945824959697317909479785864649741420842334824417, f_q))mstore(0x16c0, mulmod(mload(0x1660), 7358966525675286471217089135633860168646304224547606326237275077574224349359, f_q))mstore(0x16e0, addmod(mload(0xe60), 14529276346163988751029316609623414919902060175868428017460929109001584146258, f_q))mstore(0x1700, mulmod(mload(0x1660), 5723528081196465413808013109680264505774289533922470433187916976440924869204, f_q))mstore(0x1720, addmod(mload(0xe60), 16164714790642809808438392635577010582774074866493563910510287210134883626413, f_q))mstore(0x1740, mulmod(mload(0x1660), 9741553891420464328295280489650144566903017206473301385034033384879943874347, f_q))mstore(0x1760, addmod(mload(0xe60), 12146688980418810893951125255607130521645347193942732958664170801695864621270, f_q))mstore(0x1780, mulmod(mload(0x1660), 16569469942529664681363945218228869388192121720036659574609237682362097667612, f_q))mstore(0x17a0, addmod(mload(0xe60), 5318772929309610540882460527028405700356242680379374769088966504213710828005, f_q))mstore(0x17c0, mulmod(mload(0x1660), 17329448237240114492580865744088056414251735686965494637158808787419781175510, f_q))mstore(0x17e0, addmod(mload(0xe60), 4558794634599160729665540001169218674296628713450539706539395399156027320107, f_q))mstore(0x1800, mulmod(mload(0x1660), 11377606117859914088982205826922132024839443553408109299929510653283289974216, f_q))mstore(0x1820, addmod(mload(0xe60), 10510636753979361133264199918335143063708920847007925043768693533292518521401, f_q))mstore(0x1840, mulmod(mload(0x1660), 1, f_q))mstore(0x1860, addmod(mload(0xe60), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(0x1880, mulmod(mload(0x1660), 6143038923529407703646399695489445107254060255791852207908457597807435305312, f_q))mstore(0x18a0, addmod(mload(0xe60), 15745203948309867518600006049767829981294304144624182135789746588768373190305, f_q))mstore(0x18c0, mulmod(mload(0x1660), 11451405578697956743456240853980216273390554734748796433026540431386972584651, f_q))mstore(0x18e0, addmod(mload(0xe60), 10436837293141318478790164891277058815157809665667237910671663755188835910966, f_q))mstore(0x1900, mulmod(mload(0x1660), 16670521521732547392407716560529197273408943645332907966320731856743274895475, f_q))mstore(0x1920, addmod(mload(0xe60), 5217721350106727829838689184728077815139420755083126377377472329832533600142, f_q))mstore(0x1940, mulmod(mload(0x1660), 8374374965308410102411073611984011876711565317741801500439755773472076597347, f_q))mstore(0x1960, addmod(mload(0xe60), 13513867906530865119835332133273263211836799082674232843258448413103731898270, f_q))mstore(0x1980, mulmod(mload(0x1660), 17041886618628883845743410343041491135676788197442345444346654338941897766515, f_q))mstore(0x19a0, addmod(mload(0xe60), 4846356253210391376502995402215783952871576202973688899351549847633910729102, f_q))mstore(0x19c0, mulmod(mload(0x1660), 21490807004895109926141140246143262403290679459142140821740925192625185504522, f_q))mstore(0x19e0, addmod(mload(0xe60), 397435866944165296105265499114012685257684941273893521957278993950622991095, f_q))mstore(0x1a00, mulmod(mload(0x1660), 4947689244094276630090796471410438387704819356682144196760515917874272844658, f_q))mstore(0x1a20, addmod(mload(0xe60), 16940553627744998592155609273846836700843545043733890146937688268701535650959, f_q))mstore(0x1a40, mulmod(mload(0x1660), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q))mstore(0x1a60, addmod(mload(0xe60), 10676941854703594198666993839846402519342119846958189386823924046696287912227, f_q))mstore(0x1a80, mulmod(mload(0x1660), 5264024894212359361117235356180248560912605977787414341366976252256241723081, f_q))mstore(0x1aa0, addmod(mload(0xe60), 16624217977626915861129170389077026527635758422628620002331227934319566772536, f_q))mstore(0x1ac0, mulmod(mload(0x1660), 18846108080730935585192484934247867403156699586319724728525857970312957475341, f_q))mstore(0x1ae0, addmod(mload(0xe60), 3042134791108339637053920811009407685391664814096309615172346216262851020276, f_q))mstore(0x1b00, mulmod(mload(0x1660), 14702679338564370535199761954906750181917994561807919001424434650417511039135, f_q))mstore(0x1b20, addmod(mload(0xe60), 7185563533274904687046643790350524906630369838608115342273769536158297456482, f_q))mstore(0x1b40, mulmod(mload(0x1660), 3615478808282855240548287271348143516886772452944084747768312988864436725401, f_q))mstore(0x1b60, addmod(mload(0xe60), 18272764063556419981698118473909131571661591947471949595929891197711371770216, f_q))mstore(0x1b80, mulmod(mload(0x1660), 20616120149426804763291284446254360562902600427757250597073510835143294097149, f_q))mstore(0x1ba0, addmod(mload(0xe60), 1272122722412470458955121299002914525645763972658783746624693351432514398468, f_q))mstore(0x1bc0, mulmod(mload(0x1660), 21451937155080765789602997556105366785934335730087568134349216848800867145453, f_q))mstore(0x1be0, addmod(mload(0xe60), 436305716758509432643408189151908302614028670328466209348987337774941350164, f_q))mstore(0x1c00, mulmod(mload(0x1660), 19017161409611545481649028523508330517390470146558499215911270929711753577772, f_q))mstore(0x1c20, addmod(mload(0xe60), 2871081462227729740597377221748944571157894253857535127786933256864054917845, f_q))mstore(0x1c40, mulmod(mload(0x1660), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q))mstore(0x1c60, addmod(mload(0xe60), 20461838439117790833741043996939313553025008529160428886800406442142042007110, f_q))mstore(0x1c80, mulmod(mload(0x1660), 10856460699172062612938276947444161095149765964986006640875349177781443506948, f_q))mstore(0x1ca0, addmod(mload(0xe60), 11031782172667212609308128797813113993398598435430027702822855008794364988669, f_q))mstore(0x1cc0, mulmod(mload(0x1660), 13982290267294411190096162596630216412723378687553046594730793425118513274800, f_q))mstore(0x1ce0, addmod(mload(0xe60), 7905952604544864032150243148627058675824985712862987748967410761457295220817, f_q))mstore(0x1d00, mulmod(mload(0x1660), 6561173800290098519452899326025724923999000100011249967503610931251216538972, f_q))mstore(0x1d20, addmod(mload(0xe60), 15327069071549176702793506419231550164549364300404784376194593255324591956645, f_q))mstore(0x1d40, mulmod(mload(0x1660), 216092043779272773661818549620449970334216366264741118684015851799902419467, f_q))mstore(0x1d60, addmod(mload(0xe60), 21672150828060002448584587195636825118214148034151293225014188334775906076150, f_q))mstore(0x1d80, mulmod(mload(0x1660), 8339897343549661683735240707424456381152000284494796404206060322637347081841, f_q))mstore(0x1da0, addmod(mload(0xe60), 13548345528289613538511165037832818707396364115921237939492143863938461413776, f_q))mstore(0x1dc0, mulmod(mload(0x1660), 9537783784440837896026284659246718978615447564543116209283382057778110278482, f_q))mstore(0x1de0, addmod(mload(0xe60), 12350459087398437326220121086010556109932916835872918134414822128797698217135, f_q))mstore(0x1e00, mulmod(mload(0x1660), 4918863199804216794313374068541208658413103970649356533216388956233707684201, f_q))mstore(0x1e20, addmod(mload(0xe60), 16969379672035058427933031676716066430135260429766677810481815230342100811416, f_q))mstore(0x1e40, mulmod(mload(0x1660), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q))mstore(0x1e60, addmod(mload(0xe60), 9268625363986062636089532824584791139728887410636484032390921470890938228625, f_q))mstore(0x1e80, mulmod(mload(0x1660), 7724834143148934071153960970746466069533317335090538734978957273885451415039, f_q))mstore(0x1ea0, addmod(mload(0xe60), 14163408728690341151092444774510809019015047065325495608719246912690357080578, f_q))mstore(0x1ec0, mulmod(mload(0x1660), 3947443723575973965644279767310964219908423994086470065513888332899718123222, f_q))mstore(0x1ee0, addmod(mload(0xe60), 17940799148263301256602125977946310868639940406329564278184315853676090372395, f_q))mstore(0x1f00, mulmod(mload(0x1660), 4278169934129084685243600944817585393960331423200121614669592058880339851017, f_q))mstore(0x1f20, addmod(mload(0xe60), 17610072937710190537002804800439689694588032977215912729028612127695468644600, f_q))mstore(0x1f40, mulmod(mload(0x1660), 18610195890048912503953886742825279624920778288956610528523679659246523534888, f_q))mstore(0x1f60, addmod(mload(0xe60), 3278046981790362718292519002431995463627586111459423815174524527329284960729, f_q))mstore(0x1f80, mulmod(mload(0x1660), 18650950439243380548803943501264732333660994969150820494757875443931913035538, f_q))mstore(0x1fa0, addmod(mload(0xe60), 3237292432595894673442462243992542754887369431265213848940328742643895460079, f_q))mstore(0x1fc0, mulmod(mload(0x1660), 1539082509056298927655194235755440186888826897239928178265486731666142403222, f_q))mstore(0x1fe0, addmod(mload(0xe60), 20349160362782976294591211509501834901659537503176106165432717454909666092395, f_q))mstore(0x2000, mulmod(mload(0x1660), 7201942790515709282685196242945925103656293029640288298785338889388148385095, f_q))mstore(0x2020, addmod(mload(0xe60), 14686300081323565939561209502311349984892071370775746044912865297187660110522, f_q))mstore(0x2040, mulmod(mload(0x1660), 19032961837237948602743626455740240236231119053033140765040043513661803148152, f_q))mstore(0x2060, addmod(mload(0xe60), 2855281034601326619502779289517034852317245347382893578658160672914005347465, f_q))mstore(0x2080, mulmod(mload(0x1660), 2567282239914283233897093963566444708534370585850632404740959782869832258160, f_q))mstore(0x20a0, addmod(mload(0xe60), 19320960631924991988349311781690830380013993814565401938957244403705976237457, f_q))mstore(0x20c0, mulmod(mload(0x1660), 4317410353320599552056040796202302907960891408523818766419977508859423800635, f_q))mstore(0x20e0, addmod(mload(0xe60), 17570832518518675670190364949054972180587472991892215577278226677716384694982, f_q))mstore(0x2100, mulmod(mload(0x1660), 13278633335035662196775171978256331227098467443289894350288377027124807268610, f_q))mstore(0x2120, addmod(mload(0xe60), 8609609536803613025471233767000943861449896957126139993409827159451001227007, f_q))mstore(0x2140, mulmod(mload(0x1660), 14875928112196239563830800280253496262679717528621719058794366823499719730250, f_q))mstore(0x2160, addmod(mload(0xe60), 7012314759643035658415605465003778825868646871794315284903837363076088765367, f_q))mstore(0x2180, mulmod(mload(0x1660), 19796139880566276863821462929959333991118601370893606152699382550533537294194, f_q))mstore(0x21a0, addmod(mload(0xe60), 2092102991272998358424942815297941097429763029522428190998821636042271201423, f_q))mstore(0x21c0, mulmod(mload(0x1660), 2366023502186770334390939928726871658997402416352868340984630739442624219298, f_q))mstore(0x21e0, addmod(mload(0xe60), 19522219369652504887855465816530403429550961984063166002713573447133184276319, f_q))mstore(0x2200, mulmod(mload(0x1660), 21253353101772772853143434797425538330127740258736196037595754086106342026689, f_q))mstore(0x2220, addmod(mload(0xe60), 634889770066502369102970947831736758420624141679838306102450100469466468928, f_q))mstore(0x2240, mulmod(mload(0x1660), 915149353520972163646494413843788069594022902357002628455555785223409501882, f_q))mstore(0x2260, addmod(mload(0xe60), 20973093518318303058599911331413487018954341498059031715242648401352398993735, f_q))mstore(0x2280, mulmod(mload(0x1660), 10568970125726285804117343896670014233202947662952899210242732241268902924574, f_q))mstore(0x22a0, addmod(mload(0xe60), 11319272746112989418129061848587260855345416737463135133455471945306905571043, f_q))mstore(0x22c0, mulmod(mload(0x1660), 14391499717548074167711220639833994904150450341569029103202493919171555826079, f_q))mstore(0x22e0, addmod(mload(0xe60), 7496743154291201054535185105423280184397914058847005240495710267404252669538, f_q))mstore(0x2300, mulmod(mload(0x1660), 21625474091353515468972056892507670731596366572979277269929807338991438239209, f_q))mstore(0x2320, addmod(mload(0xe60), 262768780485759753274348852749604356951997827436757073768396847584370256408, f_q))mstore(0x2340, mulmod(mload(0x1660), 5522161504810533295870699551020523636289972223872138525048055197429246400245, f_q))mstore(0x2360, addmod(mload(0xe60), 16366081367028741926375706194236751452258392176543895818650148989146562095372, f_q))mstore(0x2380, mulmod(mload(0x1660), 13460340987090708339895471217907463146299492238292355609500595215222015441425, f_q))mstore(0x23a0, addmod(mload(0xe60), 8427901884748566882350934527349811942248872162123678734197608971353793054192, f_q))mstore(0x23c0, mulmod(mload(0x1660), 10119780362642123194334092174270235809557798114544683654677907882314807212354, f_q))mstore(0x23e0, addmod(mload(0xe60), 11768462509197152027912313570987039278990566285871350689020296304261001283263, f_q))mstore(0x2400, mulmod(mload(0x1660), 17071166023700100601206475197987781457317255275364269378966936420361158573060, f_q))mstore(0x2420, addmod(mload(0xe60), 4817076848139174621039930547269493631231109125051764964731267766214649922557, f_q))mstore(0x2440, mulmod(mload(0x1660), 3766081621734395783232337525162072736827576297943013392955872170138036189193, f_q))mstore(0x2460, addmod(mload(0xe60), 18122161250104879439014068220095202351720788102473020950742332016437772306424, f_q))mstore(0x2480, mulmod(mload(0x1660), 12527559239011619672642164628594151794373299855825077281897476265823405013867, f_q))mstore(0x24a0, addmod(mload(0xe60), 9360683632827655549604241116663123294175064544590957061800727920752403481750, f_q))mstore(0x24c0, mulmod(mload(0x1660), 2080322550956715654503104356805349981348621877591103674778333538652571537127, f_q))mstore(0x24e0, addmod(mload(0xe60), 19807920320882559567743301388451925107199742522824930668919870647923236958490, f_q))mstore(0x2500, mulmod(mload(0x1660), 2628756703476154169061943895067339616982893965722790735027992440678275638809, f_q))mstore(0x2520, addmod(mload(0xe60), 19259486168363121053184461850189935471565470434693243608670211745897532856808, f_q))mstore(0x2540, mulmod(mload(0x1660), 9100833993744738801214480881117348002768153232283708533639316963648253510584, f_q))mstore(0x2560, addmod(mload(0xe60), 12787408878094536421031924864139927085780211168132325810058887222927554985033, f_q))mstore(0x2580, mulmod(mload(0x1660), 2716126075209315604595593532492318169063881707251443034813230722931138506730, f_q))mstore(0x25a0, addmod(mload(0xe60), 19172116796629959617650812212764956919484482693164591308884973463644669988887, f_q))mstore(0x25c0, mulmod(mload(0x1660), 11145214675344139457514777444556774698911688619991656085001542609383151586084, f_q))mstore(0x25e0, addmod(mload(0xe60), 10743028196495135764731628300700500389636675780424378258696661577192656909533, f_q))mstore(0x2600, mulmod(mload(0x1660), 9455661879513343744992217403146497004398519586311920696418911397370647067417, f_q))mstore(0x2620, addmod(mload(0xe60), 12432580992325931477254188342110778084149844814104113647279292789205161428200, f_q))mstore(0x2640, mulmod(mload(0x1660), 4245441013247250116003069945606352967193023389718465410501109428393342802981, f_q))mstore(0x2660, addmod(mload(0xe60), 17642801858592025106243335799650922121355341010697568933197094758182465692636, f_q))mstore(0x2680, mulmod(mload(0x1660), 8121682530053504880310722217952646955671803028092472717631336758359411770524, f_q))mstore(0x26a0, addmod(mload(0xe60), 13766560341785770341935683527304628132876561372323561626066867428216396725093, f_q))mstore(0x26c0, mulmod(mload(0x1660), 19228510170961893342195489288913594506775385223367826565223897736323409650249, f_q))mstore(0x26e0, addmod(mload(0xe60), 2659732700877381880050916456343680581772979177048207778474306450252398845368, f_q))mstore(0x2700, mulmod(mload(0x1660), 21028615043508430391966460973087822914495768542988934643007264425341826464745, f_q))mstore(0x2720, addmod(mload(0xe60), 859627828330844830279944772169452174052595857427099700690939761233982030872, f_q))mstore(0x2740, mulmod(mload(0x1660), 6132660129994545119218258312491950835441607143741804980633129304664017206141, f_q))mstore(0x2760, addmod(mload(0xe60), 15755582741844730103028147432765324253106757256674229363065074881911791289476, f_q))mstore(0x2780, mulmod(mload(0x1660), 20568413767908000563248462071403279763059526791006943936879709840333098380384, f_q))mstore(0x27a0, addmod(mload(0xe60), 1319829103931274658997943673853995325488837609409090406818494346242710115233, f_q))mstore(0x27c0, mulmod(mload(0x1660), 10094752117139066216691253588991632982053223883646966177987813353508871280747, f_q))mstore(0x27e0, addmod(mload(0xe60), 11793490754700209005555152156265642106495140516769068165710390833066937214870, f_q))mstore(0x2800, mulmod(mload(0x1660), 1412722828635353260820440480395979990287424749622479812473617828668210087992, f_q))mstore(0x2820, addmod(mload(0xe60), 20475520043203921961425965264861295098260939650793554531224586357907598407625, f_q))mstore(0x2840, mulmod(mload(0x1660), 5854133144571823792863860130267644613802765696134002830362054821530146160770, f_q))mstore(0x2860, addmod(mload(0xe60), 16034109727267451429382545614989630474745598704282031513336149365045662334847, f_q))mstore(0x2880, mulmod(mload(0x1660), 4011166062409277037846946896120088236083831265462590090132047642583670217875, f_q))mstore(0x28a0, addmod(mload(0xe60), 17877076809429998184399458849137186852464533134953444253566156543992138277742, f_q))mstore(0x28c0, mulmod(mload(0x1660), 21346203717540287263608402129024479709126363130664317843105498655869866203005, f_q))mstore(0x28e0, addmod(mload(0xe60), 542039154298987958638003616232795379422001269751716500592705530705942292612, f_q))mstore(0x2900, mulmod(mload(0x1660), 2596759765691555579319057187001626676797139380458426414819107034267851199894, f_q))mstore(0x2920, addmod(mload(0xe60), 19291483106147719642927348558255648411751225019957607928879097152307957295723, f_q))mstore(0x2940, mulmod(mload(0x1660), 515148244606945972463850631189471072103916690263705052318085725998468254533, f_q))mstore(0x2960, addmod(mload(0xe60), 21373094627232329249782555114067804016444447710152329291380118460577340241084, f_q))mstore(0x2980, mulmod(mload(0x1660), 16193474294403570471913209081172098662039194833035886085838226141251611760575, f_q))mstore(0x29a0, addmod(mload(0xe60), 5694768577435704750333196664085176426509169567380148257859978045324196735042, f_q))mstore(0x29c0, mulmod(mload(0x1660), 13788243025932779125104144225768424453664118806559109014238064020826883170336, f_q))mstore(0x29e0, addmod(mload(0xe60), 8099999845906496097142261519488850634884245593856925329460140165748925325281, f_q))mstore(0x2a00, mulmod(mload(0x1660), 12396386169390721083998741284742024397478287569179289945429941103360590919681, f_q))mstore(0x2a20, addmod(mload(0xe60), 9491856702448554138247664460515250691070076831236744398268263083215217575936, f_q))mstore(0x2a40, mulmod(mload(0x1660), 5980488956150442207659150513163747165544364597008566989111579977672498964212, f_q))mstore(0x2a60, addmod(mload(0xe60), 15907753915688833014587255232093527923003999803407467354586624208903309531405, f_q))mstore(0x2a80, mulmod(mload(0x1660), 6354421102357179089872998275128818476713799693323012459783788405734328942427, f_q))mstore(0x2aa0, addmod(mload(0xe60), 15533821769482096132373407470128456611834564707093021883914415780841479553190, f_q))mstore(0x2ac0, mulmod(mload(0x1660), 8561696234966975469289029207282849740510759316794581475824569334969644143582, f_q))mstore(0x2ae0, addmod(mload(0xe60), 13326546636872299752957376537974425348037605083621452867873634851606164352035, f_q))mstore(0x2b00, mulmod(mload(0x1660), 5397263786135457391507049168732549761126132269670746248720049083068923385507, f_q))mstore(0x2b20, addmod(mload(0xe60), 16490979085703817830739356576524725327422232130745288094978155103506885110110, f_q))mstore(0x2b40, mulmod(mload(0x1660), 5223738580615264174925218065001555728265216895679471490312087802465486318994, f_q))mstore(0x2b60, addmod(mload(0xe60), 16664504291224011047321187680255719360283147504736562853386116384110322176623, f_q)){ let prod := mload(0x16a0) prod := mulmod(mload(0x16e0), prod, f_q) mstore(0x2b80, prod) prod := mulmod(mload(0x1720), prod, f_q) mstore(0x2ba0, prod) prod := mulmod(mload(0x1760), prod, f_q) mstore(0x2bc0, prod) prod := mulmod(mload(0x17a0), prod, f_q) mstore(0x2be0, prod) prod := mulmod(mload(0x17e0), prod, f_q) mstore(0x2c00, prod) prod := mulmod(mload(0x1820), prod, f_q) mstore(0x2c20, prod) prod := mulmod(mload(0x1860), prod, f_q) mstore(0x2c40, prod) prod := mulmod(mload(0x18a0), prod, f_q) mstore(0x2c60, prod) prod := mulmod(mload(0x18e0), prod, f_q) mstore(0x2c80, prod) prod := mulmod(mload(0x1920), prod, f_q) mstore(0x2ca0, prod) prod := mulmod(mload(0x1960), prod, f_q) mstore(0x2cc0, prod) prod := mulmod(mload(0x19a0), prod, f_q) mstore(0x2ce0, prod) prod := mulmod(mload(0x19e0), prod, f_q) mstore(0x2d00, prod) prod := mulmod(mload(0x1a20), prod, f_q) mstore(0x2d20, prod) prod := mulmod(mload(0x1a60), prod, f_q) mstore(0x2d40, prod) prod := mulmod(mload(0x1aa0), prod, f_q) mstore(0x2d60, prod) prod := mulmod(mload(0x1ae0), prod, f_q) mstore(0x2d80, prod) prod := mulmod(mload(0x1b20), prod, f_q) mstore(0x2da0, prod) prod := mulmod(mload(0x1b60), prod, f_q) mstore(0x2dc0, prod) prod := mulmod(mload(0x1ba0), prod, f_q) mstore(0x2de0, prod) prod := mulmod(mload(0x1be0), prod, f_q) mstore(0x2e00, prod) prod := mulmod(mload(0x1c20), prod, f_q) mstore(0x2e20, prod) prod := mulmod(mload(0x1c60), prod, f_q) mstore(0x2e40, prod) prod := mulmod(mload(0x1ca0), prod, f_q) mstore(0x2e60, prod) prod := mulmod(mload(0x1ce0), prod, f_q) mstore(0x2e80, prod) prod := mulmod(mload(0x1d20), prod, f_q) mstore(0x2ea0, prod) prod := mulmod(mload(0x1d60), prod, f_q) mstore(0x2ec0, prod) prod := mulmod(mload(0x1da0), prod, f_q) mstore(0x2ee0, prod) prod := mulmod(mload(0x1de0), prod, f_q) mstore(0x2f00, prod) prod := mulmod(mload(0x1e20), prod, f_q) mstore(0x2f20, prod) prod := mulmod(mload(0x1e60), prod, f_q) mstore(0x2f40, prod) prod := mulmod(mload(0x1ea0), prod, f_q) mstore(0x2f60, prod) prod := mulmod(mload(0x1ee0), prod, f_q) mstore(0x2f80, prod) prod := mulmod(mload(0x1f20), prod, f_q) mstore(0x2fa0, prod) prod := mulmod(mload(0x1f60), prod, f_q) mstore(0x2fc0, prod) prod := mulmod(mload(0x1fa0), prod, f_q) mstore(0x2fe0, prod) prod := mulmod(mload(0x1fe0), prod, f_q) mstore(0x3000, prod) prod := mulmod(mload(0x2020), prod, f_q) mstore(0x3020, prod) prod := mulmod(mload(0x2060), prod, f_q) mstore(0x3040, prod) prod := mulmod(mload(0x20a0), prod, f_q) mstore(0x3060, prod) prod := mulmod(mload(0x20e0), prod, f_q) mstore(0x3080, prod) prod := mulmod(mload(0x2120), prod, f_q) mstore(0x30a0, prod) prod := mulmod(mload(0x2160), prod, f_q) mstore(0x30c0, prod) prod := mulmod(mload(0x21a0), prod, f_q) mstore(0x30e0, prod) prod := mulmod(mload(0x21e0), prod, f_q) mstore(0x3100, prod) prod := mulmod(mload(0x2220), prod, f_q) mstore(0x3120, prod) prod := mulmod(mload(0x2260), prod, f_q) mstore(0x3140, prod) prod := mulmod(mload(0x22a0), prod, f_q) mstore(0x3160, prod) prod := mulmod(mload(0x22e0), prod, f_q) mstore(0x3180, prod) prod := mulmod(mload(0x2320), prod, f_q) mstore(0x31a0, prod) prod := mulmod(mload(0x2360), prod, f_q) mstore(0x31c0, prod) prod := mulmod(mload(0x23a0), prod, f_q) mstore(0x31e0, prod) prod := mulmod(mload(0x23e0), prod, f_q) mstore(0x3200, prod) prod := mulmod(mload(0x2420), prod, f_q) mstore(0x3220, prod) prod := mulmod(mload(0x2460), prod, f_q) mstore(0x3240, prod) prod := mulmod(mload(0x24a0), prod, f_q) mstore(0x3260, prod) prod := mulmod(mload(0x24e0), prod, f_q) mstore(0x3280, prod) prod := mulmod(mload(0x2520), prod, f_q) mstore(0x32a0, prod) prod := mulmod(mload(0x2560), prod, f_q) mstore(0x32c0, prod) prod := mulmod(mload(0x25a0), prod, f_q) mstore(0x32e0, prod) prod := mulmod(mload(0x25e0), prod, f_q) mstore(0x3300, prod) prod := mulmod(mload(0x2620), prod, f_q) mstore(0x3320, prod) prod := mulmod(mload(0x2660), prod, f_q) mstore(0x3340, prod) prod := mulmod(mload(0x26a0), prod, f_q) mstore(0x3360, prod) prod := mulmod(mload(0x26e0), prod, f_q) mstore(0x3380, prod) prod := mulmod(mload(0x2720), prod, f_q) mstore(0x33a0, prod) prod := mulmod(mload(0x2760), prod, f_q) mstore(0x33c0, prod) prod := mulmod(mload(0x27a0), prod, f_q) mstore(0x33e0, prod) prod := mulmod(mload(0x27e0), prod, f_q) mstore(0x3400, prod) prod := mulmod(mload(0x2820), prod, f_q) mstore(0x3420, prod) prod := mulmod(mload(0x2860), prod, f_q) mstore(0x3440, prod) prod := mulmod(mload(0x28a0), prod, f_q) mstore(0x3460, prod) prod := mulmod(mload(0x28e0), prod, f_q) mstore(0x3480, prod) prod := mulmod(mload(0x2920), prod, f_q) mstore(0x34a0, prod) prod := mulmod(mload(0x2960), prod, f_q) mstore(0x34c0, prod) prod := mulmod(mload(0x29a0), prod, f_q) mstore(0x34e0, prod) prod := mulmod(mload(0x29e0), prod, f_q) mstore(0x3500, prod) prod := mulmod(mload(0x2a20), prod, f_q) mstore(0x3520, prod) prod := mulmod(mload(0x2a60), prod, f_q) mstore(0x3540, prod) prod := mulmod(mload(0x2aa0), prod, f_q) mstore(0x3560, prod) prod := mulmod(mload(0x2ae0), prod, f_q) mstore(0x3580, prod) prod := mulmod(mload(0x2b20), prod, f_q) mstore(0x35a0, prod) prod := mulmod(mload(0x2b60), prod, f_q) mstore(0x35c0, prod) prod := mulmod(mload(0x1640), prod, f_q) mstore(0x35e0, prod) }mstore(0x3620, 32)mstore(0x3640, 32)mstore(0x3660, 32)mstore(0x3680, mload(0x35e0))mstore(0x36a0, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x36c0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x3620, 0xc0, 0x3600, 0x20), 1), success){ let inv := mload(0x3600) let v v := mload(0x1640) mstore(0x1640, mulmod(mload(0x35c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2b60) mstore(0x2b60, mulmod(mload(0x35a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2b20) mstore(0x2b20, mulmod(mload(0x3580), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2ae0) mstore(0x2ae0, mulmod(mload(0x3560), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2aa0) mstore(0x2aa0, mulmod(mload(0x3540), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2a60) mstore(0x2a60, mulmod(mload(0x3520), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2a20) mstore(0x2a20, mulmod(mload(0x3500), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x29e0) mstore(0x29e0, mulmod(mload(0x34e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x29a0) mstore(0x29a0, mulmod(mload(0x34c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2960) mstore(0x2960, mulmod(mload(0x34a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2920) mstore(0x2920, mulmod(mload(0x3480), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x28e0) mstore(0x28e0, mulmod(mload(0x3460), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x28a0) mstore(0x28a0, mulmod(mload(0x3440), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2860) mstore(0x2860, mulmod(mload(0x3420), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2820) mstore(0x2820, mulmod(mload(0x3400), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x27e0) mstore(0x27e0, mulmod(mload(0x33e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x27a0) mstore(0x27a0, mulmod(mload(0x33c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2760) mstore(0x2760, mulmod(mload(0x33a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2720) mstore(0x2720, mulmod(mload(0x3380), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x26e0) mstore(0x26e0, mulmod(mload(0x3360), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x26a0) mstore(0x26a0, mulmod(mload(0x3340), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2660) mstore(0x2660, mulmod(mload(0x3320), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2620) mstore(0x2620, mulmod(mload(0x3300), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x25e0) mstore(0x25e0, mulmod(mload(0x32e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x25a0) mstore(0x25a0, mulmod(mload(0x32c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2560) mstore(0x2560, mulmod(mload(0x32a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2520) mstore(0x2520, mulmod(mload(0x3280), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x24e0) mstore(0x24e0, mulmod(mload(0x3260), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x24a0) mstore(0x24a0, mulmod(mload(0x3240), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2460) mstore(0x2460, mulmod(mload(0x3220), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2420) mstore(0x2420, mulmod(mload(0x3200), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x23e0) mstore(0x23e0, mulmod(mload(0x31e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x23a0) mstore(0x23a0, mulmod(mload(0x31c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2360) mstore(0x2360, mulmod(mload(0x31a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2320) mstore(0x2320, mulmod(mload(0x3180), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x22e0) mstore(0x22e0, mulmod(mload(0x3160), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x22a0) mstore(0x22a0, mulmod(mload(0x3140), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2260) mstore(0x2260, mulmod(mload(0x3120), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2220) mstore(0x2220, mulmod(mload(0x3100), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x21e0) mstore(0x21e0, mulmod(mload(0x30e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x21a0) mstore(0x21a0, mulmod(mload(0x30c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2160) mstore(0x2160, mulmod(mload(0x30a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2120) mstore(0x2120, mulmod(mload(0x3080), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x20e0) mstore(0x20e0, mulmod(mload(0x3060), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x20a0) mstore(0x20a0, mulmod(mload(0x3040), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2060) mstore(0x2060, mulmod(mload(0x3020), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x2020) mstore(0x2020, mulmod(mload(0x3000), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1fe0) mstore(0x1fe0, mulmod(mload(0x2fe0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1fa0) mstore(0x1fa0, mulmod(mload(0x2fc0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1f60) mstore(0x1f60, mulmod(mload(0x2fa0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1f20) mstore(0x1f20, mulmod(mload(0x2f80), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1ee0) mstore(0x1ee0, mulmod(mload(0x2f60), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1ea0) mstore(0x1ea0, mulmod(mload(0x2f40), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1e60) mstore(0x1e60, mulmod(mload(0x2f20), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1e20) mstore(0x1e20, mulmod(mload(0x2f00), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1de0) mstore(0x1de0, mulmod(mload(0x2ee0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1da0) mstore(0x1da0, mulmod(mload(0x2ec0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1d60) mstore(0x1d60, mulmod(mload(0x2ea0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1d20) mstore(0x1d20, mulmod(mload(0x2e80), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1ce0) mstore(0x1ce0, mulmod(mload(0x2e60), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1ca0) mstore(0x1ca0, mulmod(mload(0x2e40), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1c60) mstore(0x1c60, mulmod(mload(0x2e20), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1c20) mstore(0x1c20, mulmod(mload(0x2e00), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1be0) mstore(0x1be0, mulmod(mload(0x2de0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1ba0) mstore(0x1ba0, mulmod(mload(0x2dc0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1b60) mstore(0x1b60, mulmod(mload(0x2da0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1b20) mstore(0x1b20, mulmod(mload(0x2d80), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1ae0) mstore(0x1ae0, mulmod(mload(0x2d60), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1aa0) mstore(0x1aa0, mulmod(mload(0x2d40), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1a60) mstore(0x1a60, mulmod(mload(0x2d20), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1a20) mstore(0x1a20, mulmod(mload(0x2d00), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x19e0) mstore(0x19e0, mulmod(mload(0x2ce0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x19a0) mstore(0x19a0, mulmod(mload(0x2cc0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1960) mstore(0x1960, mulmod(mload(0x2ca0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1920) mstore(0x1920, mulmod(mload(0x2c80), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18e0) mstore(0x18e0, mulmod(mload(0x2c60), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18a0) mstore(0x18a0, mulmod(mload(0x2c40), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1860) mstore(0x1860, mulmod(mload(0x2c20), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1820) mstore(0x1820, mulmod(mload(0x2c00), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x17e0) mstore(0x17e0, mulmod(mload(0x2be0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x17a0) mstore(0x17a0, mulmod(mload(0x2bc0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1760) mstore(0x1760, mulmod(mload(0x2ba0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1720) mstore(0x1720, mulmod(mload(0x2b80), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x16e0) mstore(0x16e0, mulmod(mload(0x16a0), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x16a0, inv) }mstore(0x36e0, mulmod(mload(0x1680), mload(0x16a0), f_q))mstore(0x3700, mulmod(mload(0x16c0), mload(0x16e0), f_q))mstore(0x3720, mulmod(mload(0x1700), mload(0x1720), f_q))mstore(0x3740, mulmod(mload(0x1740), mload(0x1760), f_q))mstore(0x3760, mulmod(mload(0x1780), mload(0x17a0), f_q))mstore(0x3780, mulmod(mload(0x17c0), mload(0x17e0), f_q))mstore(0x37a0, mulmod(mload(0x1800), mload(0x1820), f_q))mstore(0x37c0, mulmod(mload(0x1840), mload(0x1860), f_q))mstore(0x37e0, mulmod(mload(0x1880), mload(0x18a0), f_q))mstore(0x3800, mulmod(mload(0x18c0), mload(0x18e0), f_q))mstore(0x3820, mulmod(mload(0x1900), mload(0x1920), f_q))mstore(0x3840, mulmod(mload(0x1940), mload(0x1960), f_q))mstore(0x3860, mulmod(mload(0x1980), mload(0x19a0), f_q))mstore(0x3880, mulmod(mload(0x19c0), mload(0x19e0), f_q))mstore(0x38a0, mulmod(mload(0x1a00), mload(0x1a20), f_q))mstore(0x38c0, mulmod(mload(0x1a40), mload(0x1a60), f_q))mstore(0x38e0, mulmod(mload(0x1a80), mload(0x1aa0), f_q))mstore(0x3900, mulmod(mload(0x1ac0), mload(0x1ae0), f_q))mstore(0x3920, mulmod(mload(0x1b00), mload(0x1b20), f_q))mstore(0x3940, mulmod(mload(0x1b40), mload(0x1b60), f_q))mstore(0x3960, mulmod(mload(0x1b80), mload(0x1ba0), f_q))mstore(0x3980, mulmod(mload(0x1bc0), mload(0x1be0), f_q))mstore(0x39a0, mulmod(mload(0x1c00), mload(0x1c20), f_q))mstore(0x39c0, mulmod(mload(0x1c40), mload(0x1c60), f_q))mstore(0x39e0, mulmod(mload(0x1c80), mload(0x1ca0), f_q))mstore(0x3a00, mulmod(mload(0x1cc0), mload(0x1ce0), f_q))mstore(0x3a20, mulmod(mload(0x1d00), mload(0x1d20), f_q))mstore(0x3a40, mulmod(mload(0x1d40), mload(0x1d60), f_q))mstore(0x3a60, mulmod(mload(0x1d80), mload(0x1da0), f_q))mstore(0x3a80, mulmod(mload(0x1dc0), mload(0x1de0), f_q))mstore(0x3aa0, mulmod(mload(0x1e00), mload(0x1e20), f_q))mstore(0x3ac0, mulmod(mload(0x1e40), mload(0x1e60), f_q))mstore(0x3ae0, mulmod(mload(0x1e80), mload(0x1ea0), f_q))mstore(0x3b00, mulmod(mload(0x1ec0), mload(0x1ee0), f_q))mstore(0x3b20, mulmod(mload(0x1f00), mload(0x1f20), f_q))mstore(0x3b40, mulmod(mload(0x1f40), mload(0x1f60), f_q))mstore(0x3b60, mulmod(mload(0x1f80), mload(0x1fa0), f_q))mstore(0x3b80, mulmod(mload(0x1fc0), mload(0x1fe0), f_q))mstore(0x3ba0, mulmod(mload(0x2000), mload(0x2020), f_q))mstore(0x3bc0, mulmod(mload(0x2040), mload(0x2060), f_q))mstore(0x3be0, mulmod(mload(0x2080), mload(0x20a0), f_q))mstore(0x3c00, mulmod(mload(0x20c0), mload(0x20e0), f_q))mstore(0x3c20, mulmod(mload(0x2100), mload(0x2120), f_q))mstore(0x3c40, mulmod(mload(0x2140), mload(0x2160), f_q))mstore(0x3c60, mulmod(mload(0x2180), mload(0x21a0), f_q))mstore(0x3c80, mulmod(mload(0x21c0), mload(0x21e0), f_q))mstore(0x3ca0, mulmod(mload(0x2200), mload(0x2220), f_q))mstore(0x3cc0, mulmod(mload(0x2240), mload(0x2260), f_q))mstore(0x3ce0, mulmod(mload(0x2280), mload(0x22a0), f_q))mstore(0x3d00, mulmod(mload(0x22c0), mload(0x22e0), f_q))mstore(0x3d20, mulmod(mload(0x2300), mload(0x2320), f_q))mstore(0x3d40, mulmod(mload(0x2340), mload(0x2360), f_q))mstore(0x3d60, mulmod(mload(0x2380), mload(0x23a0), f_q))mstore(0x3d80, mulmod(mload(0x23c0), mload(0x23e0), f_q))mstore(0x3da0, mulmod(mload(0x2400), mload(0x2420), f_q))mstore(0x3dc0, mulmod(mload(0x2440), mload(0x2460), f_q))mstore(0x3de0, mulmod(mload(0x2480), mload(0x24a0), f_q))mstore(0x3e00, mulmod(mload(0x24c0), mload(0x24e0), f_q))mstore(0x3e20, mulmod(mload(0x2500), mload(0x2520), f_q))mstore(0x3e40, mulmod(mload(0x2540), mload(0x2560), f_q))mstore(0x3e60, mulmod(mload(0x2580), mload(0x25a0), f_q))mstore(0x3e80, mulmod(mload(0x25c0), mload(0x25e0), f_q))mstore(0x3ea0, mulmod(mload(0x2600), mload(0x2620), f_q))mstore(0x3ec0, mulmod(mload(0x2640), mload(0x2660), f_q))mstore(0x3ee0, mulmod(mload(0x2680), mload(0x26a0), f_q))mstore(0x3f00, mulmod(mload(0x26c0), mload(0x26e0), f_q))mstore(0x3f20, mulmod(mload(0x2700), mload(0x2720), f_q))mstore(0x3f40, mulmod(mload(0x2740), mload(0x2760), f_q))mstore(0x3f60, mulmod(mload(0x2780), mload(0x27a0), f_q))mstore(0x3f80, mulmod(mload(0x27c0), mload(0x27e0), f_q))mstore(0x3fa0, mulmod(mload(0x2800), mload(0x2820), f_q))mstore(0x3fc0, mulmod(mload(0x2840), mload(0x2860), f_q))mstore(0x3fe0, mulmod(mload(0x2880), mload(0x28a0), f_q))mstore(0x4000, mulmod(mload(0x28c0), mload(0x28e0), f_q))mstore(0x4020, mulmod(mload(0x2900), mload(0x2920), f_q))mstore(0x4040, mulmod(mload(0x2940), mload(0x2960), f_q))mstore(0x4060, mulmod(mload(0x2980), mload(0x29a0), f_q))mstore(0x4080, mulmod(mload(0x29c0), mload(0x29e0), f_q))mstore(0x40a0, mulmod(mload(0x2a00), mload(0x2a20), f_q))mstore(0x40c0, mulmod(mload(0x2a40), mload(0x2a60), f_q))mstore(0x40e0, mulmod(mload(0x2a80), mload(0x2aa0), f_q))mstore(0x4100, mulmod(mload(0x2ac0), mload(0x2ae0), f_q))mstore(0x4120, mulmod(mload(0x2b00), mload(0x2b20), f_q))mstore(0x4140, mulmod(mload(0x2b40), mload(0x2b60), f_q)){ let result := mulmod(mload(0x37c0), mload(0xa0), f_q)result := addmod(mulmod(mload(0x37e0), mload(0xc0), f_q), result, f_q)result := addmod(mulmod(mload(0x3800), mload(0xe0), f_q), result, f_q)result := addmod(mulmod(mload(0x3820), mload(0x100), f_q), result, f_q)result := addmod(mulmod(mload(0x3840), mload(0x120), f_q), result, f_q)result := addmod(mulmod(mload(0x3860), mload(0x140), f_q), result, f_q)result := addmod(mulmod(mload(0x3880), mload(0x160), f_q), result, f_q)result := addmod(mulmod(mload(0x38a0), mload(0x180), f_q), result, f_q)result := addmod(mulmod(mload(0x38c0), mload(0x1a0), f_q), result, f_q)result := addmod(mulmod(mload(0x38e0), mload(0x1c0), f_q), result, f_q)result := addmod(mulmod(mload(0x3900), mload(0x1e0), f_q), result, f_q)result := addmod(mulmod(mload(0x3920), mload(0x200), f_q), result, f_q)result := addmod(mulmod(mload(0x3940), mload(0x220), f_q), result, f_q)result := addmod(mulmod(mload(0x3960), mload(0x240), f_q), result, f_q)result := addmod(mulmod(mload(0x3980), mload(0x260), f_q), result, f_q)result := addmod(mulmod(mload(0x39a0), mload(0x280), f_q), result, f_q)result := addmod(mulmod(mload(0x39c0), mload(0x2a0), f_q), result, f_q)result := addmod(mulmod(mload(0x39e0), mload(0x2c0), f_q), result, f_q)result := addmod(mulmod(mload(0x3a00), mload(0x2e0), f_q), result, f_q)result := addmod(mulmod(mload(0x3a20), mload(0x300), f_q), result, f_q)result := addmod(mulmod(mload(0x3a40), mload(0x320), f_q), result, f_q)result := addmod(mulmod(mload(0x3a60), mload(0x340), f_q), result, f_q)result := addmod(mulmod(mload(0x3a80), mload(0x360), f_q), result, f_q)result := addmod(mulmod(mload(0x3aa0), mload(0x380), f_q), result, f_q)result := addmod(mulmod(mload(0x3ac0), mload(0x3a0), f_q), result, f_q)result := addmod(mulmod(mload(0x3ae0), mload(0x3c0), f_q), result, f_q)result := addmod(mulmod(mload(0x3b00), mload(0x3e0), f_q), result, f_q)result := addmod(mulmod(mload(0x3b20), mload(0x400), f_q), result, f_q)result := addmod(mulmod(mload(0x3b40), mload(0x420), f_q), result, f_q)result := addmod(mulmod(mload(0x3b60), mload(0x440), f_q), result, f_q)result := addmod(mulmod(mload(0x3b80), mload(0x460), f_q), result, f_q)result := addmod(mulmod(mload(0x3ba0), mload(0x480), f_q), result, f_q)result := addmod(mulmod(mload(0x3bc0), mload(0x4a0), f_q), result, f_q)result := addmod(mulmod(mload(0x3be0), mload(0x4c0), f_q), result, f_q)result := addmod(mulmod(mload(0x3c00), mload(0x4e0), f_q), result, f_q)result := addmod(mulmod(mload(0x3c20), mload(0x500), f_q), result, f_q)result := addmod(mulmod(mload(0x3c40), mload(0x520), f_q), result, f_q)result := addmod(mulmod(mload(0x3c60), mload(0x540), f_q), result, f_q)result := addmod(mulmod(mload(0x3c80), mload(0x560), f_q), result, f_q)result := addmod(mulmod(mload(0x3ca0), mload(0x580), f_q), result, f_q)result := addmod(mulmod(mload(0x3cc0), mload(0x5a0), f_q), result, f_q)result := addmod(mulmod(mload(0x3ce0), mload(0x5c0), f_q), result, f_q)result := addmod(mulmod(mload(0x3d00), mload(0x5e0), f_q), result, f_q)result := addmod(mulmod(mload(0x3d20), mload(0x600), f_q), result, f_q)result := addmod(mulmod(mload(0x3d40), mload(0x620), f_q), result, f_q)result := addmod(mulmod(mload(0x3d60), mload(0x640), f_q), result, f_q)result := addmod(mulmod(mload(0x3d80), mload(0x660), f_q), result, f_q)result := addmod(mulmod(mload(0x3da0), mload(0x680), f_q), result, f_q)result := addmod(mulmod(mload(0x3dc0), mload(0x6a0), f_q), result, f_q)result := addmod(mulmod(mload(0x3de0), mload(0x6c0), f_q), result, f_q)result := addmod(mulmod(mload(0x3e00), mload(0x6e0), f_q), result, f_q)result := addmod(mulmod(mload(0x3e20), mload(0x700), f_q), result, f_q)result := addmod(mulmod(mload(0x3e40), mload(0x720), f_q), result, f_q)result := addmod(mulmod(mload(0x3e60), mload(0x740), f_q), result, f_q)result := addmod(mulmod(mload(0x3e80), mload(0x760), f_q), result, f_q)result := addmod(mulmod(mload(0x3ea0), mload(0x780), f_q), result, f_q)result := addmod(mulmod(mload(0x3ec0), mload(0x7a0), f_q), result, f_q)result := addmod(mulmod(mload(0x3ee0), mload(0x7c0), f_q), result, f_q)result := addmod(mulmod(mload(0x3f00), mload(0x7e0), f_q), result, f_q)result := addmod(mulmod(mload(0x3f20), mload(0x800), f_q), result, f_q)result := addmod(mulmod(mload(0x3f40), mload(0x820), f_q), result, f_q)result := addmod(mulmod(mload(0x3f60), mload(0x840), f_q), result, f_q)result := addmod(mulmod(mload(0x3f80), mload(0x860), f_q), result, f_q)result := addmod(mulmod(mload(0x3fa0), mload(0x880), f_q), result, f_q)result := addmod(mulmod(mload(0x3fc0), mload(0x8a0), f_q), result, f_q)result := addmod(mulmod(mload(0x3fe0), mload(0x8c0), f_q), result, f_q)result := addmod(mulmod(mload(0x4000), mload(0x8e0), f_q), result, f_q)result := addmod(mulmod(mload(0x4020), mload(0x900), f_q), result, f_q)result := addmod(mulmod(mload(0x4040), mload(0x920), f_q), result, f_q)result := addmod(mulmod(mload(0x4060), mload(0x940), f_q), result, f_q)result := addmod(mulmod(mload(0x4080), mload(0x960), f_q), result, f_q)result := addmod(mulmod(mload(0x40a0), mload(0x980), f_q), result, f_q)result := addmod(mulmod(mload(0x40c0), mload(0x9a0), f_q), result, f_q)result := addmod(mulmod(mload(0x40e0), mload(0x9c0), f_q), result, f_q)result := addmod(mulmod(mload(0x4100), mload(0x9e0), f_q), result, f_q)result := addmod(mulmod(mload(0x4120), mload(0xa00), f_q), result, f_q)result := addmod(mulmod(mload(0x4140), mload(0xa20), f_q), result, f_q)mstore(0x4160, result) }mstore(0x4180, mulmod(mload(0xee0), mload(0xec0), f_q))mstore(0x41a0, addmod(mload(0xea0), mload(0x4180), f_q))mstore(0x41c0, addmod(mload(0x41a0), sub(f_q, mload(0xf00)), f_q))mstore(0x41e0, mulmod(mload(0x41c0), mload(0xf80), f_q))mstore(0x4200, mulmod(mload(0xd00), mload(0x41e0), f_q))mstore(0x4220, addmod(1, sub(f_q, mload(0x1020)), f_q))mstore(0x4240, mulmod(mload(0x4220), mload(0x37c0), f_q))mstore(0x4260, addmod(mload(0x4200), mload(0x4240), f_q))mstore(0x4280, mulmod(mload(0xd00), mload(0x4260), f_q))mstore(0x42a0, mulmod(mload(0x1020), mload(0x1020), f_q))mstore(0x42c0, addmod(mload(0x42a0), sub(f_q, mload(0x1020)), f_q))mstore(0x42e0, mulmod(mload(0x42c0), mload(0x36e0), f_q))mstore(0x4300, addmod(mload(0x4280), mload(0x42e0), f_q))mstore(0x4320, mulmod(mload(0xd00), mload(0x4300), f_q))mstore(0x4340, addmod(1, sub(f_q, mload(0x36e0)), f_q))mstore(0x4360, addmod(mload(0x3700), mload(0x3720), f_q))mstore(0x4380, addmod(mload(0x4360), mload(0x3740), f_q))mstore(0x43a0, addmod(mload(0x4380), mload(0x3760), f_q))mstore(0x43c0, addmod(mload(0x43a0), mload(0x3780), f_q))mstore(0x43e0, addmod(mload(0x43c0), mload(0x37a0), f_q))mstore(0x4400, addmod(mload(0x4340), sub(f_q, mload(0x43e0)), f_q))mstore(0x4420, mulmod(mload(0xfc0), mload(0xb80), f_q))mstore(0x4440, addmod(mload(0xf20), mload(0x4420), f_q))mstore(0x4460, addmod(mload(0x4440), mload(0xbe0), f_q))mstore(0x4480, mulmod(mload(0xfe0), mload(0xb80), f_q))mstore(0x44a0, addmod(mload(0xea0), mload(0x4480), f_q))mstore(0x44c0, addmod(mload(0x44a0), mload(0xbe0), f_q))mstore(0x44e0, mulmod(mload(0x44c0), mload(0x4460), f_q))mstore(0x4500, mulmod(mload(0x1000), mload(0xb80), f_q))mstore(0x4520, addmod(mload(0x4160), mload(0x4500), f_q))mstore(0x4540, addmod(mload(0x4520), mload(0xbe0), f_q))mstore(0x4560, mulmod(mload(0x4540), mload(0x44e0), f_q))mstore(0x4580, mulmod(mload(0x4560), mload(0x1040), f_q))mstore(0x45a0, mulmod(1, mload(0xb80), f_q))mstore(0x45c0, mulmod(mload(0xe60), mload(0x45a0), f_q))mstore(0x45e0, addmod(mload(0xf20), mload(0x45c0), f_q))mstore(0x4600, addmod(mload(0x45e0), mload(0xbe0), f_q))mstore(0x4620, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0xb80), f_q))mstore(0x4640, mulmod(mload(0xe60), mload(0x4620), f_q))mstore(0x4660, addmod(mload(0xea0), mload(0x4640), f_q))mstore(0x4680, addmod(mload(0x4660), mload(0xbe0), f_q))mstore(0x46a0, mulmod(mload(0x4680), mload(0x4600), f_q))mstore(0x46c0, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0xb80), f_q))mstore(0x46e0, mulmod(mload(0xe60), mload(0x46c0), f_q))mstore(0x4700, addmod(mload(0x4160), mload(0x46e0), f_q))mstore(0x4720, addmod(mload(0x4700), mload(0xbe0), f_q))mstore(0x4740, mulmod(mload(0x4720), mload(0x46a0), f_q))mstore(0x4760, mulmod(mload(0x4740), mload(0x1020), f_q))mstore(0x4780, addmod(mload(0x4580), sub(f_q, mload(0x4760)), f_q))mstore(0x47a0, mulmod(mload(0x4780), mload(0x4400), f_q))mstore(0x47c0, addmod(mload(0x4320), mload(0x47a0), f_q))mstore(0x47e0, mulmod(mload(0xd00), mload(0x47c0), f_q))mstore(0x4800, addmod(1, sub(f_q, mload(0x1060)), f_q))mstore(0x4820, mulmod(mload(0x4800), mload(0x37c0), f_q))mstore(0x4840, addmod(mload(0x47e0), mload(0x4820), f_q))mstore(0x4860, mulmod(mload(0xd00), mload(0x4840), f_q))mstore(0x4880, mulmod(mload(0x1060), mload(0x1060), f_q))mstore(0x48a0, addmod(mload(0x4880), sub(f_q, mload(0x1060)), f_q))mstore(0x48c0, mulmod(mload(0x48a0), mload(0x36e0), f_q))mstore(0x48e0, addmod(mload(0x4860), mload(0x48c0), f_q))mstore(0x4900, mulmod(mload(0xd00), mload(0x48e0), f_q))mstore(0x4920, addmod(mload(0x10a0), mload(0xb80), f_q))mstore(0x4940, mulmod(mload(0x4920), mload(0x1080), f_q))mstore(0x4960, addmod(mload(0x10e0), mload(0xbe0), f_q))mstore(0x4980, mulmod(mload(0x4960), mload(0x4940), f_q))mstore(0x49a0, mulmod(mload(0xea0), mload(0xf60), f_q))mstore(0x49c0, addmod(mload(0x49a0), mload(0xb80), f_q))mstore(0x49e0, mulmod(mload(0x49c0), mload(0x1060), f_q))mstore(0x4a00, addmod(mload(0xf40), mload(0xbe0), f_q))mstore(0x4a20, mulmod(mload(0x4a00), mload(0x49e0), f_q))mstore(0x4a40, addmod(mload(0x4980), sub(f_q, mload(0x4a20)), f_q))mstore(0x4a60, mulmod(mload(0x4a40), mload(0x4400), f_q))mstore(0x4a80, addmod(mload(0x4900), mload(0x4a60), f_q))mstore(0x4aa0, mulmod(mload(0xd00), mload(0x4a80), f_q))mstore(0x4ac0, addmod(mload(0x10a0), sub(f_q, mload(0x10e0)), f_q))mstore(0x4ae0, mulmod(mload(0x4ac0), mload(0x37c0), f_q))mstore(0x4b00, addmod(mload(0x4aa0), mload(0x4ae0), f_q))mstore(0x4b20, mulmod(mload(0xd00), mload(0x4b00), f_q))mstore(0x4b40, mulmod(mload(0x4ac0), mload(0x4400), f_q))mstore(0x4b60, addmod(mload(0x10a0), sub(f_q, mload(0x10c0)), f_q))mstore(0x4b80, mulmod(mload(0x4b60), mload(0x4b40), f_q))mstore(0x4ba0, addmod(mload(0x4b20), mload(0x4b80), f_q))mstore(0x4bc0, mulmod(mload(0x1620), mload(0x1620), f_q))mstore(0x4be0, mulmod(mload(0x4bc0), mload(0x1620), f_q))mstore(0x4c00, mulmod(mload(0x4be0), mload(0x1620), f_q))mstore(0x4c20, mulmod(1, mload(0x1620), f_q))mstore(0x4c40, mulmod(1, mload(0x4bc0), f_q))mstore(0x4c60, mulmod(1, mload(0x4be0), f_q))mstore(0x4c80, mulmod(mload(0x4ba0), mload(0x1640), f_q))mstore(0x4ca0, mulmod(mload(0x1320), mload(0xe60), f_q))mstore(0x4cc0, mulmod(mload(0x4ca0), mload(0xe60), f_q))mstore(0x4ce0, mulmod(mload(0xe60), 11377606117859914088982205826922132024839443553408109299929510653283289974216, f_q))mstore(0x4d00, addmod(mload(0x1220), sub(f_q, mload(0x4ce0)), f_q))mstore(0x4d20, mulmod(mload(0xe60), 1, f_q))mstore(0x4d40, addmod(mload(0x1220), sub(f_q, mload(0x4d20)), f_q))mstore(0x4d60, mulmod(mload(0xe60), 6143038923529407703646399695489445107254060255791852207908457597807435305312, f_q))mstore(0x4d80, addmod(mload(0x1220), sub(f_q, mload(0x4d60)), f_q))mstore(0x4da0, mulmod(mload(0xe60), 11451405578697956743456240853980216273390554734748796433026540431386972584651, f_q))mstore(0x4dc0, addmod(mload(0x1220), sub(f_q, mload(0x4da0)), f_q))mstore(0x4de0, mulmod(mload(0xe60), 16670521521732547392407716560529197273408943645332907966320731856743274895475, f_q))mstore(0x4e00, addmod(mload(0x1220), sub(f_q, mload(0x4de0)), f_q))mstore(0x4e20, mulmod(8219252948654094797157108904669854317001423465917391825808691077170189464995, mload(0x4ca0), f_q))mstore(0x4e40, mulmod(mload(0x4e20), 1, f_q)){ let result := mulmod(mload(0x1220), mload(0x4e20), f_q)result := addmod(mulmod(mload(0xe60), sub(f_q, mload(0x4e40)), f_q), result, f_q)mstore(0x4e60, result) }mstore(0x4e80, mulmod(9296671232404480276013511827138458405364435620174469432662539796840967177791, mload(0x4ca0), f_q))mstore(0x4ea0, mulmod(mload(0x4e80), 6143038923529407703646399695489445107254060255791852207908457597807435305312, f_q)){ let result := mulmod(mload(0x1220), mload(0x4e80), f_q)result := addmod(mulmod(mload(0xe60), sub(f_q, mload(0x4ea0)), f_q), result, f_q)mstore(0x4ec0, result) }mstore(0x4ee0, mulmod(16067453484972395187530647612179984850313988171035408068464350590599411369550, mload(0x4ca0), f_q))mstore(0x4f00, mulmod(mload(0x4ee0), 11451405578697956743456240853980216273390554734748796433026540431386972584651, f_q)){ let result := mulmod(mload(0x1220), mload(0x4ee0), f_q)result := addmod(mulmod(mload(0xe60), sub(f_q, mload(0x4f00)), f_q), result, f_q)mstore(0x4f20, result) }mstore(0x4f40, mulmod(19739017567026423485440200119112518431529316337914698509896062636748956259037, mload(0x4ca0), f_q))mstore(0x4f60, mulmod(mload(0x4f40), 16670521521732547392407716560529197273408943645332907966320731856743274895475, f_q)){ let result := mulmod(mload(0x1220), mload(0x4f40), f_q)result := addmod(mulmod(mload(0xe60), sub(f_q, mload(0x4f60)), f_q), result, f_q)mstore(0x4f80, result) }mstore(0x4fa0, mulmod(1, mload(0x4d40), f_q))mstore(0x4fc0, mulmod(mload(0x4fa0), mload(0x4d80), f_q))mstore(0x4fe0, mulmod(mload(0x4fc0), mload(0x4dc0), f_q))mstore(0x5000, mulmod(mload(0x4fe0), mload(0x4e00), f_q))mstore(0x5020, mulmod(15745203948309867518600006049767829981294304144624182135789746588768373190306, mload(0xe60), f_q))mstore(0x5040, mulmod(mload(0x5020), 1, f_q)){ let result := mulmod(mload(0x1220), mload(0x5020), f_q)result := addmod(mulmod(mload(0xe60), sub(f_q, mload(0x5040)), f_q), result, f_q)mstore(0x5060, result) }mstore(0x5080, mulmod(6143038923529407703646399695489445107254060255791852207908457597807435305311, mload(0xe60), f_q))mstore(0x50a0, mulmod(mload(0x5080), 6143038923529407703646399695489445107254060255791852207908457597807435305312, f_q)){ let result := mulmod(mload(0x1220), mload(0x5080), f_q)result := addmod(mulmod(mload(0xe60), sub(f_q, mload(0x50a0)), f_q), result, f_q)mstore(0x50c0, result) }mstore(0x50e0, mulmod(10510636753979361133264199918335143063708920847007925043768693533292518521402, mload(0xe60), f_q))mstore(0x5100, mulmod(mload(0x50e0), 1, f_q)){ let result := mulmod(mload(0x1220), mload(0x50e0), f_q)result := addmod(mulmod(mload(0xe60), sub(f_q, mload(0x5100)), f_q), result, f_q)mstore(0x5120, result) }mstore(0x5140, mulmod(11377606117859914088982205826922132024839443553408109299929510653283289974215, mload(0xe60), f_q))mstore(0x5160, mulmod(mload(0x5140), 11377606117859914088982205826922132024839443553408109299929510653283289974216, f_q)){ let result := mulmod(mload(0x1220), mload(0x5140), f_q)result := addmod(mulmod(mload(0xe60), sub(f_q, mload(0x5160)), f_q), result, f_q)mstore(0x5180, result) }mstore(0x51a0, mulmod(mload(0x4fa0), mload(0x4d00), f_q)){ let result := mulmod(mload(0x1220), 1, f_q)result := addmod(mulmod(mload(0xe60), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(0x51c0, result) }{ let prod := mload(0x4e60) prod := mulmod(mload(0x4ec0), prod, f_q) mstore(0x51e0, prod) prod := mulmod(mload(0x4f20), prod, f_q) mstore(0x5200, prod) prod := mulmod(mload(0x4f80), prod, f_q) mstore(0x5220, prod) prod := mulmod(mload(0x5060), prod, f_q) mstore(0x5240, prod) prod := mulmod(mload(0x50c0), prod, f_q) mstore(0x5260, prod) prod := mulmod(mload(0x4fc0), prod, f_q) mstore(0x5280, prod) prod := mulmod(mload(0x5120), prod, f_q) mstore(0x52a0, prod) prod := mulmod(mload(0x5180), prod, f_q) mstore(0x52c0, prod) prod := mulmod(mload(0x51a0), prod, f_q) mstore(0x52e0, prod) prod := mulmod(mload(0x51c0), prod, f_q) mstore(0x5300, prod) prod := mulmod(mload(0x4fa0), prod, f_q) mstore(0x5320, prod) }mstore(0x5360, 32)mstore(0x5380, 32)mstore(0x53a0, 32)mstore(0x53c0, mload(0x5320))mstore(0x53e0, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x5400, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x5360, 0xc0, 0x5340, 0x20), 1), success){ let inv := mload(0x5340) let v v := mload(0x4fa0) mstore(0x4fa0, mulmod(mload(0x5300), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x51c0) mstore(0x51c0, mulmod(mload(0x52e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x51a0) mstore(0x51a0, mulmod(mload(0x52c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x5180) mstore(0x5180, mulmod(mload(0x52a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x5120) mstore(0x5120, mulmod(mload(0x5280), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4fc0) mstore(0x4fc0, mulmod(mload(0x5260), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x50c0) mstore(0x50c0, mulmod(mload(0x5240), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x5060) mstore(0x5060, mulmod(mload(0x5220), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4f80) mstore(0x4f80, mulmod(mload(0x5200), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4f20) mstore(0x4f20, mulmod(mload(0x51e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4ec0) mstore(0x4ec0, mulmod(mload(0x4e60), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x4e60, inv) }{ let result := mload(0x4e60)result := addmod(mload(0x4ec0), result, f_q)result := addmod(mload(0x4f20), result, f_q)result := addmod(mload(0x4f80), result, f_q)mstore(0x5420, result) }mstore(0x5440, mulmod(mload(0x5000), mload(0x4fc0), f_q)){ let result := mload(0x5060)result := addmod(mload(0x50c0), result, f_q)mstore(0x5460, result) }mstore(0x5480, mulmod(mload(0x5000), mload(0x51a0), f_q)){ let result := mload(0x5120)result := addmod(mload(0x5180), result, f_q)mstore(0x54a0, result) }mstore(0x54c0, mulmod(mload(0x5000), mload(0x4fa0), f_q)){ let result := mload(0x51c0)mstore(0x54e0, result) }{ let prod := mload(0x5420) prod := mulmod(mload(0x5460), prod, f_q) mstore(0x5500, prod) prod := mulmod(mload(0x54a0), prod, f_q) mstore(0x5520, prod) prod := mulmod(mload(0x54e0), prod, f_q) mstore(0x5540, prod) }mstore(0x5580, 32)mstore(0x55a0, 32)mstore(0x55c0, 32)mstore(0x55e0, mload(0x5540))mstore(0x5600, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x5620, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x5580, 0xc0, 0x5560, 0x20), 1), success){ let inv := mload(0x5560) let v v := mload(0x54e0) mstore(0x54e0, mulmod(mload(0x5520), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x54a0) mstore(0x54a0, mulmod(mload(0x5500), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x5460) mstore(0x5460, mulmod(mload(0x5420), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x5420, inv) }mstore(0x5640, mulmod(mload(0x5440), mload(0x5460), f_q))mstore(0x5660, mulmod(mload(0x5480), mload(0x54a0), f_q))mstore(0x5680, mulmod(mload(0x54c0), mload(0x54e0), f_q))mstore(0x56a0, mulmod(mload(0x1120), mload(0x1120), f_q))mstore(0x56c0, mulmod(mload(0x56a0), mload(0x1120), f_q))mstore(0x56e0, mulmod(mload(0x56c0), mload(0x1120), f_q))mstore(0x5700, mulmod(mload(0x56e0), mload(0x1120), f_q))mstore(0x5720, mulmod(mload(0x5700), mload(0x1120), f_q))mstore(0x5740, mulmod(mload(0x5720), mload(0x1120), f_q))mstore(0x5760, mulmod(mload(0x5740), mload(0x1120), f_q))mstore(0x5780, mulmod(mload(0x5760), mload(0x1120), f_q))mstore(0x57a0, mulmod(mload(0x5780), mload(0x1120), f_q))mstore(0x57c0, mulmod(mload(0x1180), mload(0x1180), f_q))mstore(0x57e0, mulmod(mload(0x57c0), mload(0x1180), f_q))mstore(0x5800, mulmod(mload(0x57e0), mload(0x1180), f_q)){ let result := mulmod(mload(0xea0), mload(0x4e60), f_q)result := addmod(mulmod(mload(0xec0), mload(0x4ec0), f_q), result, f_q)result := addmod(mulmod(mload(0xee0), mload(0x4f20), f_q), result, f_q)result := addmod(mulmod(mload(0xf00), mload(0x4f80), f_q), result, f_q)mstore(0x5820, result) }mstore(0x5840, mulmod(mload(0x5820), mload(0x5420), f_q))mstore(0x5860, mulmod(sub(f_q, mload(0x5840)), 1, f_q))mstore(0x5880, mulmod(mload(0x5860), 1, f_q))mstore(0x58a0, mulmod(1, mload(0x5440), f_q)){ let result := mulmod(mload(0x1020), mload(0x5060), f_q)result := addmod(mulmod(mload(0x1040), mload(0x50c0), f_q), result, f_q)mstore(0x58c0, result) }mstore(0x58e0, mulmod(mload(0x58c0), mload(0x5640), f_q))mstore(0x5900, mulmod(sub(f_q, mload(0x58e0)), 1, f_q))mstore(0x5920, mulmod(mload(0x58a0), 1, f_q)){ let result := mulmod(mload(0x1060), mload(0x5060), f_q)result := addmod(mulmod(mload(0x1080), mload(0x50c0), f_q), result, f_q)mstore(0x5940, result) }mstore(0x5960, mulmod(mload(0x5940), mload(0x5640), f_q))mstore(0x5980, mulmod(sub(f_q, mload(0x5960)), mload(0x1120), f_q))mstore(0x59a0, mulmod(mload(0x58a0), mload(0x1120), f_q))mstore(0x59c0, addmod(mload(0x5900), mload(0x5980), f_q))mstore(0x59e0, mulmod(mload(0x59c0), mload(0x1180), f_q))mstore(0x5a00, mulmod(mload(0x5920), mload(0x1180), f_q))mstore(0x5a20, mulmod(mload(0x59a0), mload(0x1180), f_q))mstore(0x5a40, addmod(mload(0x5880), mload(0x59e0), f_q))mstore(0x5a60, mulmod(1, mload(0x5480), f_q)){ let result := mulmod(mload(0x10a0), mload(0x5120), f_q)result := addmod(mulmod(mload(0x10c0), mload(0x5180), f_q), result, f_q)mstore(0x5a80, result) }mstore(0x5aa0, mulmod(mload(0x5a80), mload(0x5660), f_q))mstore(0x5ac0, mulmod(sub(f_q, mload(0x5aa0)), 1, f_q))mstore(0x5ae0, mulmod(mload(0x5a60), 1, f_q))mstore(0x5b00, mulmod(mload(0x5ac0), mload(0x57c0), f_q))mstore(0x5b20, mulmod(mload(0x5ae0), mload(0x57c0), f_q))mstore(0x5b40, addmod(mload(0x5a40), mload(0x5b00), f_q))mstore(0x5b60, mulmod(1, mload(0x54c0), f_q)){ let result := mulmod(mload(0x10e0), mload(0x51c0), f_q)mstore(0x5b80, result) }mstore(0x5ba0, mulmod(mload(0x5b80), mload(0x5680), f_q))mstore(0x5bc0, mulmod(sub(f_q, mload(0x5ba0)), 1, f_q))mstore(0x5be0, mulmod(mload(0x5b60), 1, f_q)){ let result := mulmod(mload(0xf20), mload(0x51c0), f_q)mstore(0x5c00, result) }mstore(0x5c20, mulmod(mload(0x5c00), mload(0x5680), f_q))mstore(0x5c40, mulmod(sub(f_q, mload(0x5c20)), mload(0x1120), f_q))mstore(0x5c60, mulmod(mload(0x5b60), mload(0x1120), f_q))mstore(0x5c80, addmod(mload(0x5bc0), mload(0x5c40), f_q)){ let result := mulmod(mload(0xf40), mload(0x51c0), f_q)mstore(0x5ca0, result) }mstore(0x5cc0, mulmod(mload(0x5ca0), mload(0x5680), f_q))mstore(0x5ce0, mulmod(sub(f_q, mload(0x5cc0)), mload(0x56a0), f_q))mstore(0x5d00, mulmod(mload(0x5b60), mload(0x56a0), f_q))mstore(0x5d20, addmod(mload(0x5c80), mload(0x5ce0), f_q)){ let result := mulmod(mload(0xf60), mload(0x51c0), f_q)mstore(0x5d40, result) }mstore(0x5d60, mulmod(mload(0x5d40), mload(0x5680), f_q))mstore(0x5d80, mulmod(sub(f_q, mload(0x5d60)), mload(0x56c0), f_q))mstore(0x5da0, mulmod(mload(0x5b60), mload(0x56c0), f_q))mstore(0x5dc0, addmod(mload(0x5d20), mload(0x5d80), f_q)){ let result := mulmod(mload(0xf80), mload(0x51c0), f_q)mstore(0x5de0, result) }mstore(0x5e00, mulmod(mload(0x5de0), mload(0x5680), f_q))mstore(0x5e20, mulmod(sub(f_q, mload(0x5e00)), mload(0x56e0), f_q))mstore(0x5e40, mulmod(mload(0x5b60), mload(0x56e0), f_q))mstore(0x5e60, addmod(mload(0x5dc0), mload(0x5e20), f_q)){ let result := mulmod(mload(0xfc0), mload(0x51c0), f_q)mstore(0x5e80, result) }mstore(0x5ea0, mulmod(mload(0x5e80), mload(0x5680), f_q))mstore(0x5ec0, mulmod(sub(f_q, mload(0x5ea0)), mload(0x5700), f_q))mstore(0x5ee0, mulmod(mload(0x5b60), mload(0x5700), f_q))mstore(0x5f00, addmod(mload(0x5e60), mload(0x5ec0), f_q)){ let result := mulmod(mload(0xfe0), mload(0x51c0), f_q)mstore(0x5f20, result) }mstore(0x5f40, mulmod(mload(0x5f20), mload(0x5680), f_q))mstore(0x5f60, mulmod(sub(f_q, mload(0x5f40)), mload(0x5720), f_q))mstore(0x5f80, mulmod(mload(0x5b60), mload(0x5720), f_q))mstore(0x5fa0, addmod(mload(0x5f00), mload(0x5f60), f_q)){ let result := mulmod(mload(0x1000), mload(0x51c0), f_q)mstore(0x5fc0, result) }mstore(0x5fe0, mulmod(mload(0x5fc0), mload(0x5680), f_q))mstore(0x6000, mulmod(sub(f_q, mload(0x5fe0)), mload(0x5740), f_q))mstore(0x6020, mulmod(mload(0x5b60), mload(0x5740), f_q))mstore(0x6040, addmod(mload(0x5fa0), mload(0x6000), f_q))mstore(0x6060, mulmod(mload(0x4c20), mload(0x54c0), f_q))mstore(0x6080, mulmod(mload(0x4c40), mload(0x54c0), f_q))mstore(0x60a0, mulmod(mload(0x4c60), mload(0x54c0), f_q)){ let result := mulmod(mload(0x4c80), mload(0x51c0), f_q)mstore(0x60c0, result) }mstore(0x60e0, mulmod(mload(0x60c0), mload(0x5680), f_q))mstore(0x6100, mulmod(sub(f_q, mload(0x60e0)), mload(0x5760), f_q))mstore(0x6120, mulmod(mload(0x5b60), mload(0x5760), f_q))mstore(0x6140, mulmod(mload(0x6060), mload(0x5760), f_q))mstore(0x6160, mulmod(mload(0x6080), mload(0x5760), f_q))mstore(0x6180, mulmod(mload(0x60a0), mload(0x5760), f_q))mstore(0x61a0, addmod(mload(0x6040), mload(0x6100), f_q)){ let result := mulmod(mload(0xfa0), mload(0x51c0), f_q)mstore(0x61c0, result) }mstore(0x61e0, mulmod(mload(0x61c0), mload(0x5680), f_q))mstore(0x6200, mulmod(sub(f_q, mload(0x61e0)), mload(0x5780), f_q))mstore(0x6220, mulmod(mload(0x5b60), mload(0x5780), f_q))mstore(0x6240, addmod(mload(0x61a0), mload(0x6200), f_q))mstore(0x6260, mulmod(mload(0x6240), mload(0x57e0), f_q))mstore(0x6280, mulmod(mload(0x5be0), mload(0x57e0), f_q))mstore(0x62a0, mulmod(mload(0x5c60), mload(0x57e0), f_q))mstore(0x62c0, mulmod(mload(0x5d00), mload(0x57e0), f_q))mstore(0x62e0, mulmod(mload(0x5da0), mload(0x57e0), f_q))mstore(0x6300, mulmod(mload(0x5e40), mload(0x57e0), f_q))mstore(0x6320, mulmod(mload(0x5ee0), mload(0x57e0), f_q))mstore(0x6340, mulmod(mload(0x5f80), mload(0x57e0), f_q))mstore(0x6360, mulmod(mload(0x6020), mload(0x57e0), f_q))mstore(0x6380, mulmod(mload(0x6120), mload(0x57e0), f_q))mstore(0x63a0, mulmod(mload(0x6140), mload(0x57e0), f_q))mstore(0x63c0, mulmod(mload(0x6160), mload(0x57e0), f_q))mstore(0x63e0, mulmod(mload(0x6180), mload(0x57e0), f_q))mstore(0x6400, mulmod(mload(0x6220), mload(0x57e0), f_q))mstore(0x6420, addmod(mload(0x5b40), mload(0x6260), f_q))mstore(0x6440, mulmod(1, mload(0x5000), f_q))mstore(0x6460, mulmod(1, mload(0x1220), f_q))mstore(0x6480, 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(0x64a0, 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(0x64c0, mload(0x6420))success := and(eq(staticcall(gas(), 0x7, 0x6480, 0x60, 0x6480, 0x40), 1), success)mstore(0x64e0, mload(0x6480)) mstore(0x6500, mload(0x64a0))mstore(0x6520, mload(0xa40)) mstore(0x6540, mload(0xa60))success := and(eq(staticcall(gas(), 0x6, 0x64e0, 0x80, 0x64e0, 0x40), 1), success)mstore(0x6560, mload(0xc20)) mstore(0x6580, mload(0xc40))mstore(0x65a0, mload(0x5a00))success := and(eq(staticcall(gas(), 0x7, 0x6560, 0x60, 0x6560, 0x40), 1), success)mstore(0x65c0, mload(0x64e0)) mstore(0x65e0, mload(0x6500))mstore(0x6600, mload(0x6560)) mstore(0x6620, mload(0x6580))success := and(eq(staticcall(gas(), 0x6, 0x65c0, 0x80, 0x65c0, 0x40), 1), success)mstore(0x6640, mload(0xc60)) mstore(0x6660, mload(0xc80))mstore(0x6680, mload(0x5a20))success := and(eq(staticcall(gas(), 0x7, 0x6640, 0x60, 0x6640, 0x40), 1), success)mstore(0x66a0, mload(0x65c0)) mstore(0x66c0, mload(0x65e0))mstore(0x66e0, mload(0x6640)) mstore(0x6700, mload(0x6660))success := and(eq(staticcall(gas(), 0x6, 0x66a0, 0x80, 0x66a0, 0x40), 1), success)mstore(0x6720, mload(0xae0)) mstore(0x6740, mload(0xb00))mstore(0x6760, mload(0x5b20))success := and(eq(staticcall(gas(), 0x7, 0x6720, 0x60, 0x6720, 0x40), 1), success)mstore(0x6780, mload(0x66a0)) mstore(0x67a0, mload(0x66c0))mstore(0x67c0, mload(0x6720)) mstore(0x67e0, mload(0x6740))success := and(eq(staticcall(gas(), 0x6, 0x6780, 0x80, 0x6780, 0x40), 1), success)mstore(0x6800, mload(0xb20)) mstore(0x6820, mload(0xb40))mstore(0x6840, mload(0x6280))success := and(eq(staticcall(gas(), 0x7, 0x6800, 0x60, 0x6800, 0x40), 1), success)mstore(0x6860, mload(0x6780)) mstore(0x6880, mload(0x67a0))mstore(0x68a0, mload(0x6800)) mstore(0x68c0, mload(0x6820))success := and(eq(staticcall(gas(), 0x6, 0x6860, 0x80, 0x6860, 0x40), 1), success)mstore(0x68e0, 0x22ab1845dfd98393b63341fa885737f42cc927dbe414a0d1b849868573042e27) mstore(0x6900, 0x0031e66fb2b432a281a411a5f818165d6f398df73046fade2d3e0372af1c77a3)mstore(0x6920, mload(0x62a0))success := and(eq(staticcall(gas(), 0x7, 0x68e0, 0x60, 0x68e0, 0x40), 1), success)mstore(0x6940, mload(0x6860)) mstore(0x6960, mload(0x6880))mstore(0x6980, mload(0x68e0)) mstore(0x69a0, mload(0x6900))success := and(eq(staticcall(gas(), 0x6, 0x6940, 0x80, 0x6940, 0x40), 1), success)mstore(0x69c0, 0x2b49991085edc0ad59347332eef079c69d246382b6050f559f6dfa3e267d4db7) mstore(0x69e0, 0x2f9011bf0177a5787cb6f4f2c628c3f220f334b24ce536720185a88518724f74)mstore(0x6a00, mload(0x62c0))success := and(eq(staticcall(gas(), 0x7, 0x69c0, 0x60, 0x69c0, 0x40), 1), success)mstore(0x6a20, mload(0x6940)) mstore(0x6a40, mload(0x6960))mstore(0x6a60, mload(0x69c0)) mstore(0x6a80, mload(0x69e0))success := and(eq(staticcall(gas(), 0x6, 0x6a20, 0x80, 0x6a20, 0x40), 1), success)mstore(0x6aa0, 0x1c3cf8fbb3bac48d327f768564acc4210893358a29706b6b845c4efb2d597a4c) mstore(0x6ac0, 0x0daadee16f46162c954229b2ec489f604ef3ced4a0d92bd1d578162adc4438c3)mstore(0x6ae0, mload(0x62e0))success := and(eq(staticcall(gas(), 0x7, 0x6aa0, 0x60, 0x6aa0, 0x40), 1), success)mstore(0x6b00, mload(0x6a20)) mstore(0x6b20, mload(0x6a40))mstore(0x6b40, mload(0x6aa0)) mstore(0x6b60, mload(0x6ac0))success := and(eq(staticcall(gas(), 0x6, 0x6b00, 0x80, 0x6b00, 0x40), 1), success)mstore(0x6b80, 0x068d9562cfccc9548fc64e6e30fe3efa4f8eadfdf01d837e300f444d714c8584) mstore(0x6ba0, 0x11b6f25ff1a6e228b4831558c5baf470c3dda44f5b81db253dde98b5a51b568a)mstore(0x6bc0, mload(0x6300))success := and(eq(staticcall(gas(), 0x7, 0x6b80, 0x60, 0x6b80, 0x40), 1), success)mstore(0x6be0, mload(0x6b00)) mstore(0x6c00, mload(0x6b20))mstore(0x6c20, mload(0x6b80)) mstore(0x6c40, mload(0x6ba0))success := and(eq(staticcall(gas(), 0x6, 0x6be0, 0x80, 0x6be0, 0x40), 1), success)mstore(0x6c60, 0x16b30314d1b578c95c5f8d19e826cdc833da127a84075ba0e413264b4abae674) mstore(0x6c80, 0x2f2ded715442bfb76754e49657f387933ea76fd7f4d0833fd4eace95cf46869d)mstore(0x6ca0, mload(0x6320))success := and(eq(staticcall(gas(), 0x7, 0x6c60, 0x60, 0x6c60, 0x40), 1), success)mstore(0x6cc0, mload(0x6be0)) mstore(0x6ce0, mload(0x6c00))mstore(0x6d00, mload(0x6c60)) mstore(0x6d20, mload(0x6c80))success := and(eq(staticcall(gas(), 0x6, 0x6cc0, 0x80, 0x6cc0, 0x40), 1), success)mstore(0x6d40, 0x02da89950a834d06bad25f820ca837babb09cf64bc5939b4fd8ff068de3d3744) mstore(0x6d60, 0x2b43b393ddd80e8788efdfd6d1162410b5d4bbcbe975844b58b229b4c424e4db)mstore(0x6d80, mload(0x6340))success := and(eq(staticcall(gas(), 0x7, 0x6d40, 0x60, 0x6d40, 0x40), 1), success)mstore(0x6da0, mload(0x6cc0)) mstore(0x6dc0, mload(0x6ce0))mstore(0x6de0, mload(0x6d40)) mstore(0x6e00, mload(0x6d60))success := and(eq(staticcall(gas(), 0x6, 0x6da0, 0x80, 0x6da0, 0x40), 1), success)mstore(0x6e20, 0x0099d310db67fd1b6fb03211c729e3a39a3bdcfd5a8820e8e606069c95297d0f) mstore(0x6e40, 0x1aa4cbeb3b34d4c18e165262b1d47135c936234dae97fd0727cc025c2b53d218)mstore(0x6e60, mload(0x6360))success := and(eq(staticcall(gas(), 0x7, 0x6e20, 0x60, 0x6e20, 0x40), 1), success)mstore(0x6e80, mload(0x6da0)) mstore(0x6ea0, mload(0x6dc0))mstore(0x6ec0, mload(0x6e20)) mstore(0x6ee0, mload(0x6e40))success := and(eq(staticcall(gas(), 0x6, 0x6e80, 0x80, 0x6e80, 0x40), 1), success)mstore(0x6f00, mload(0xd40)) mstore(0x6f20, mload(0xd60))mstore(0x6f40, mload(0x6380))success := and(eq(staticcall(gas(), 0x7, 0x6f00, 0x60, 0x6f00, 0x40), 1), success)mstore(0x6f60, mload(0x6e80)) mstore(0x6f80, mload(0x6ea0))mstore(0x6fa0, mload(0x6f00)) mstore(0x6fc0, mload(0x6f20))success := and(eq(staticcall(gas(), 0x6, 0x6f60, 0x80, 0x6f60, 0x40), 1), success)mstore(0x6fe0, mload(0xd80)) mstore(0x7000, mload(0xda0))mstore(0x7020, mload(0x63a0))success := and(eq(staticcall(gas(), 0x7, 0x6fe0, 0x60, 0x6fe0, 0x40), 1), success)mstore(0x7040, mload(0x6f60)) mstore(0x7060, mload(0x6f80))mstore(0x7080, mload(0x6fe0)) mstore(0x70a0, mload(0x7000))success := and(eq(staticcall(gas(), 0x6, 0x7040, 0x80, 0x7040, 0x40), 1), success)mstore(0x70c0, mload(0xdc0)) mstore(0x70e0, mload(0xde0))mstore(0x7100, mload(0x63c0))success := and(eq(staticcall(gas(), 0x7, 0x70c0, 0x60, 0x70c0, 0x40), 1), success)mstore(0x7120, mload(0x7040)) mstore(0x7140, mload(0x7060))mstore(0x7160, mload(0x70c0)) mstore(0x7180, mload(0x70e0))success := and(eq(staticcall(gas(), 0x6, 0x7120, 0x80, 0x7120, 0x40), 1), success)mstore(0x71a0, mload(0xe00)) mstore(0x71c0, mload(0xe20))mstore(0x71e0, mload(0x63e0))success := and(eq(staticcall(gas(), 0x7, 0x71a0, 0x60, 0x71a0, 0x40), 1), success)mstore(0x7200, mload(0x7120)) mstore(0x7220, mload(0x7140))mstore(0x7240, mload(0x71a0)) mstore(0x7260, mload(0x71c0))success := and(eq(staticcall(gas(), 0x6, 0x7200, 0x80, 0x7200, 0x40), 1), success)mstore(0x7280, mload(0xca0)) mstore(0x72a0, mload(0xcc0))mstore(0x72c0, mload(0x6400))success := and(eq(staticcall(gas(), 0x7, 0x7280, 0x60, 0x7280, 0x40), 1), success)mstore(0x72e0, mload(0x7200)) mstore(0x7300, mload(0x7220))mstore(0x7320, mload(0x7280)) mstore(0x7340, mload(0x72a0))success := and(eq(staticcall(gas(), 0x6, 0x72e0, 0x80, 0x72e0, 0x40), 1), success)mstore(0x7360, mload(0x11c0)) mstore(0x7380, mload(0x11e0))mstore(0x73a0, sub(f_q, mload(0x6440)))success := and(eq(staticcall(gas(), 0x7, 0x7360, 0x60, 0x7360, 0x40), 1), success)mstore(0x73c0, mload(0x72e0)) mstore(0x73e0, mload(0x7300))mstore(0x7400, mload(0x7360)) mstore(0x7420, mload(0x7380))success := and(eq(staticcall(gas(), 0x6, 0x73c0, 0x80, 0x73c0, 0x40), 1), success)mstore(0x7440, mload(0x1260)) mstore(0x7460, mload(0x1280))mstore(0x7480, mload(0x6460))success := and(eq(staticcall(gas(), 0x7, 0x7440, 0x60, 0x7440, 0x40), 1), success)mstore(0x74a0, mload(0x73c0)) mstore(0x74c0, mload(0x73e0))mstore(0x74e0, mload(0x7440)) mstore(0x7500, mload(0x7460))success := and(eq(staticcall(gas(), 0x6, 0x74a0, 0x80, 0x74a0, 0x40), 1), success)mstore(0x7520, mload(0x74a0)) mstore(0x7540, mload(0x74c0))mstore(0x7560, mload(0x1260)) mstore(0x7580, mload(0x1280))mstore(0x75a0, mload(0x12a0)) mstore(0x75c0, mload(0x12c0))mstore(0x75e0, mload(0x12e0)) mstore(0x7600, mload(0x1300))mstore(0x7620, keccak256(0x7520, 256))mstore(0x7640, mod(mload(30112), f_q))mstore(0x7660, mulmod(mload(0x7640), mload(0x7640), f_q))mstore(0x7680, mulmod(1, mload(0x7640), f_q))mstore(0x76a0, mload(0x75a0)) mstore(0x76c0, mload(0x75c0))mstore(0x76e0, mload(0x7680))success := and(eq(staticcall(gas(), 0x7, 0x76a0, 0x60, 0x76a0, 0x40), 1), success)mstore(0x7700, mload(0x7520)) mstore(0x7720, mload(0x7540))mstore(0x7740, mload(0x76a0)) mstore(0x7760, mload(0x76c0))success := and(eq(staticcall(gas(), 0x6, 0x7700, 0x80, 0x7700, 0x40), 1), success)mstore(0x7780, mload(0x75e0)) mstore(0x77a0, mload(0x7600))mstore(0x77c0, mload(0x7680))success := and(eq(staticcall(gas(), 0x7, 0x7780, 0x60, 0x7780, 0x40), 1), success)mstore(0x77e0, mload(0x7560)) mstore(0x7800, mload(0x7580))mstore(0x7820, mload(0x7780)) mstore(0x7840, mload(0x77a0))success := and(eq(staticcall(gas(), 0x6, 0x77e0, 0x80, 0x77e0, 0x40), 1), success)mstore(0x7860, mload(0x7700)) mstore(0x7880, mload(0x7720))mstore(0x78a0, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(0x78c0, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(0x78e0, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(0x7900, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(0x7920, mload(0x77e0)) mstore(0x7940, mload(0x7800))mstore(0x7960, 0x0181624e80f3d6ae28df7e01eaeab1c0e919877a3b8a6b7fbc69a6817d596ea2) mstore(0x7980, 0x1783d30dcb12d259bb89098addf6280fa4b653be7a152542a28f7b926e27e648) mstore(0x79a0, 0x00ae44489d41a0d179e2dfdc03bddd883b7109f8b6ae316a59e815c1a6b35304) mstore(0x79c0, 0x0b2147ab62a386bd63e6de1522109b8c9588ab466f5aadfde8c41ca3749423ee)success := and(eq(staticcall(gas(), 0x8, 0x7860, 0x180, 0x7860, 0x20), 1), success)success := and(eq(mload(0x7860), 1), success)} return success; } } diff --git a/contracts/snark-verifiers/sync_step.sol b/contracts/snark-verifiers/sync_step.sol index 85b857a3..e7c606b4 100644 --- a/contracts/snark-verifiers/sync_step.sol +++ b/contracts/snark-verifiers/sync_step.sol @@ -20,4 +20,4 @@ contract Verifier { for (uint i = 0; i < pubInputs.length; i++) { require(pubInputs[i] < SIZE_LIMIT); } - assembly { } { 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(0x80, 697977589985395630139925574281256772762542249956921372363329126037282444860) { let x := calldataload(0x64) mstore(0xc0, x) let y := calldataload(0x84) mstore(0xe0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xa4) mstore(0x100, x) let y := calldataload(0xc4) mstore(0x120, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xe4) mstore(0x140, x) let y := calldataload(0x104) mstore(0x160, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x124) mstore(0x180, x) let y := calldataload(0x144) mstore(0x1a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x164) mstore(0x1c0, x) let y := calldataload(0x184) mstore(0x1e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1a4) mstore(0x200, x) let y := calldataload(0x1c4) mstore(0x220, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1e4) mstore(0x240, x) let y := calldataload(0x204) mstore(0x260, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x224) mstore(0x280, x) let y := calldataload(0x244) mstore(0x2a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x264) mstore(0x2c0, x) let y := calldataload(0x284) mstore(0x2e0, y) success := and(validate_ec_point(x, y), success) }mstore(0x300, keccak256(0x80, 640)){ let hash := mload(0x300) mstore(0x320, mod(hash, f_q)) mstore(0x340, hash) } { let x := calldataload(0x2a4) mstore(0x360, x) let y := calldataload(0x2c4) mstore(0x380, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x2e4) mstore(0x3a0, x) let y := calldataload(0x304) mstore(0x3c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x324) mstore(0x3e0, x) let y := calldataload(0x344) mstore(0x400, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x364) mstore(0x420, x) let y := calldataload(0x384) mstore(0x440, y) success := and(validate_ec_point(x, y), success) }mstore(0x460, keccak256(0x340, 288)){ let hash := mload(0x460) mstore(0x480, mod(hash, f_q)) mstore(0x4a0, hash) }mstore8(0x4c0, 1)mstore(0x4c0, keccak256(0x4a0, 33)){ let hash := mload(0x4c0) mstore(0x4e0, mod(hash, f_q)) mstore(0x500, hash) } { let x := calldataload(0x3a4) mstore(0x520, x) let y := calldataload(0x3c4) mstore(0x540, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x3e4) mstore(0x560, x) let y := calldataload(0x404) mstore(0x580, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x424) mstore(0x5a0, x) let y := calldataload(0x444) mstore(0x5c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x464) mstore(0x5e0, x) let y := calldataload(0x484) mstore(0x600, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4a4) mstore(0x620, x) let y := calldataload(0x4c4) mstore(0x640, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4e4) mstore(0x660, x) let y := calldataload(0x504) mstore(0x680, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x524) mstore(0x6a0, x) let y := calldataload(0x544) mstore(0x6c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x564) mstore(0x6e0, x) let y := calldataload(0x584) mstore(0x700, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x5a4) mstore(0x720, x) let y := calldataload(0x5c4) mstore(0x740, y) success := and(validate_ec_point(x, y), success) }mstore(0x760, keccak256(0x500, 608)){ let hash := mload(0x760) mstore(0x780, mod(hash, f_q)) mstore(0x7a0, hash) } { let x := calldataload(0x5e4) mstore(0x7c0, x) let y := calldataload(0x604) mstore(0x7e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x624) mstore(0x800, x) let y := calldataload(0x644) mstore(0x820, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x664) mstore(0x840, x) let y := calldataload(0x684) mstore(0x860, y) success := and(validate_ec_point(x, y), success) }mstore(0x880, keccak256(0x7a0, 224)){ let hash := mload(0x880) mstore(0x8a0, mod(hash, f_q)) mstore(0x8c0, hash) }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, mod(calldataload(0xc04), f_q))mstore(0xe60, mod(calldataload(0xc24), f_q))mstore(0xe80, mod(calldataload(0xc44), f_q))mstore(0xea0, mod(calldataload(0xc64), f_q))mstore(0xec0, mod(calldataload(0xc84), f_q))mstore(0xee0, mod(calldataload(0xca4), f_q))mstore(0xf00, mod(calldataload(0xcc4), f_q))mstore(0xf20, mod(calldataload(0xce4), f_q))mstore(0xf40, mod(calldataload(0xd04), f_q))mstore(0xf60, mod(calldataload(0xd24), f_q))mstore(0xf80, mod(calldataload(0xd44), f_q))mstore(0xfa0, mod(calldataload(0xd64), f_q))mstore(0xfc0, mod(calldataload(0xd84), f_q))mstore(0xfe0, mod(calldataload(0xda4), f_q))mstore(0x1000, mod(calldataload(0xdc4), f_q))mstore(0x1020, mod(calldataload(0xde4), f_q))mstore(0x1040, mod(calldataload(0xe04), f_q))mstore(0x1060, mod(calldataload(0xe24), f_q))mstore(0x1080, mod(calldataload(0xe44), f_q))mstore(0x10a0, mod(calldataload(0xe64), f_q))mstore(0x10c0, mod(calldataload(0xe84), f_q))mstore(0x10e0, mod(calldataload(0xea4), f_q))mstore(0x1100, mod(calldataload(0xec4), f_q))mstore(0x1120, mod(calldataload(0xee4), f_q))mstore(0x1140, mod(calldataload(0xf04), f_q))mstore(0x1160, mod(calldataload(0xf24), f_q))mstore(0x1180, mod(calldataload(0xf44), f_q))mstore(0x11a0, mod(calldataload(0xf64), f_q))mstore(0x11c0, mod(calldataload(0xf84), f_q))mstore(0x11e0, mod(calldataload(0xfa4), f_q))mstore(0x1200, mod(calldataload(0xfc4), f_q))mstore(0x1220, mod(calldataload(0xfe4), f_q))mstore(0x1240, mod(calldataload(0x1004), f_q))mstore(0x1260, keccak256(0x8c0, 2464)){ let hash := mload(0x1260) mstore(0x1280, mod(hash, f_q)) mstore(0x12a0, hash) }mstore8(0x12c0, 1)mstore(0x12c0, keccak256(0x12a0, 33)){ let hash := mload(0x12c0) mstore(0x12e0, mod(hash, f_q)) mstore(0x1300, hash) } { let x := calldataload(0x1024) mstore(0x1320, x) let y := calldataload(0x1044) mstore(0x1340, y) success := and(validate_ec_point(x, y), success) }mstore(0x1360, keccak256(0x1300, 96)){ let hash := mload(0x1360) mstore(0x1380, mod(hash, f_q)) mstore(0x13a0, hash) } { let x := calldataload(0x1064) mstore(0x13c0, x) let y := calldataload(0x1084) mstore(0x13e0, y) success := and(validate_ec_point(x, y), success) }mstore(0x1400, mulmod(mload(0x8a0), mload(0x8a0), f_q))mstore(0x1420, mulmod(mload(0x1400), mload(0x1400), f_q))mstore(0x1440, mulmod(mload(0x1420), mload(0x1420), f_q))mstore(0x1460, mulmod(mload(0x1440), mload(0x1440), f_q))mstore(0x1480, mulmod(mload(0x1460), mload(0x1460), f_q))mstore(0x14a0, mulmod(mload(0x1480), mload(0x1480), f_q))mstore(0x14c0, mulmod(mload(0x14a0), mload(0x14a0), f_q))mstore(0x14e0, mulmod(mload(0x14c0), mload(0x14c0), f_q))mstore(0x1500, mulmod(mload(0x14e0), mload(0x14e0), f_q))mstore(0x1520, mulmod(mload(0x1500), mload(0x1500), f_q))mstore(0x1540, mulmod(mload(0x1520), mload(0x1520), f_q))mstore(0x1560, mulmod(mload(0x1540), mload(0x1540), f_q))mstore(0x1580, mulmod(mload(0x1560), mload(0x1560), f_q))mstore(0x15a0, mulmod(mload(0x1580), mload(0x1580), f_q))mstore(0x15c0, mulmod(mload(0x15a0), mload(0x15a0), f_q))mstore(0x15e0, mulmod(mload(0x15c0), mload(0x15c0), f_q))mstore(0x1600, mulmod(mload(0x15e0), mload(0x15e0), f_q))mstore(0x1620, mulmod(mload(0x1600), mload(0x1600), f_q))mstore(0x1640, mulmod(mload(0x1620), mload(0x1620), f_q))mstore(0x1660, mulmod(mload(0x1640), mload(0x1640), f_q))mstore(0x1680, mulmod(mload(0x1660), mload(0x1660), f_q))mstore(0x16a0, mulmod(mload(0x1680), mload(0x1680), f_q))mstore(0x16c0, addmod(mload(0x16a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(0x16e0, mulmod(mload(0x16c0), 21888237653275510688422624196183639687472264873923820041627027729598873448513, f_q))mstore(0x1700, mulmod(mload(0x16e0), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x1720, addmod(mload(0x8a0), 8662456992307693229192232929891638461323994988937738840793806641202669341572, f_q))mstore(0x1740, mulmod(mload(0x16e0), 10939663269433627367777756708678102241564365262857670666700619874077960926249, f_q))mstore(0x1760, addmod(mload(0x8a0), 10948579602405647854468649036579172846983999137558363676997584312497847569368, f_q))mstore(0x1780, mulmod(mload(0x16e0), 11016257578652593686382655500910603527869149377564754001549454008164059876499, f_q))mstore(0x17a0, addmod(mload(0x8a0), 10871985293186681535863750244346671560679215022851280342148750178411748619118, f_q))mstore(0x17c0, mulmod(mload(0x16e0), 15402826414547299628414612080036060696555554914079673875872749760617770134879, f_q))mstore(0x17e0, addmod(mload(0x8a0), 6485416457291975593831793665221214391992809486336360467825454425958038360738, f_q))mstore(0x1800, mulmod(mload(0x16e0), 21710372849001950800533397158415938114909991150039389063546734567764856596059, f_q))mstore(0x1820, addmod(mload(0x8a0), 177870022837324421713008586841336973638373250376645280151469618810951899558, f_q))mstore(0x1840, mulmod(mload(0x16e0), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q))mstore(0x1860, addmod(mload(0x8a0), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q))mstore(0x1880, mulmod(mload(0x16e0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x18a0, addmod(mload(0x8a0), 13154116519010929542673167886091370382741775939114889923107781597533678454429, f_q))mstore(0x18c0, mulmod(mload(0x16e0), 1, f_q))mstore(0x18e0, addmod(mload(0x8a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)){ let prod := mload(0x1720) prod := mulmod(mload(0x1760), prod, f_q) mstore(0x1900, prod) prod := mulmod(mload(0x17a0), prod, f_q) mstore(0x1920, prod) prod := mulmod(mload(0x17e0), prod, f_q) mstore(0x1940, prod) prod := mulmod(mload(0x1820), prod, f_q) mstore(0x1960, prod) prod := mulmod(mload(0x1860), prod, f_q) mstore(0x1980, prod) prod := mulmod(mload(0x18a0), prod, f_q) mstore(0x19a0, prod) prod := mulmod(mload(0x18e0), prod, f_q) mstore(0x19c0, prod) prod := mulmod(mload(0x16c0), prod, f_q) mstore(0x19e0, prod) }mstore(0x1a20, 32)mstore(0x1a40, 32)mstore(0x1a60, 32)mstore(0x1a80, mload(0x19e0))mstore(0x1aa0, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x1ac0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x1a20, 0xc0, 0x1a00, 0x20), 1), success){ let inv := mload(0x1a00) let v v := mload(0x16c0) mstore(0x16c0, mulmod(mload(0x19c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18e0) mstore(0x18e0, mulmod(mload(0x19a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18a0) mstore(0x18a0, mulmod(mload(0x1980), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1860) mstore(0x1860, mulmod(mload(0x1960), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1820) mstore(0x1820, mulmod(mload(0x1940), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x17e0) mstore(0x17e0, mulmod(mload(0x1920), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x17a0) mstore(0x17a0, mulmod(mload(0x1900), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1760) mstore(0x1760, mulmod(mload(0x1720), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x1720, inv) }mstore(0x1ae0, mulmod(mload(0x1700), mload(0x1720), f_q))mstore(0x1b00, mulmod(mload(0x1740), mload(0x1760), f_q))mstore(0x1b20, mulmod(mload(0x1780), mload(0x17a0), f_q))mstore(0x1b40, mulmod(mload(0x17c0), mload(0x17e0), f_q))mstore(0x1b60, mulmod(mload(0x1800), mload(0x1820), f_q))mstore(0x1b80, mulmod(mload(0x1840), mload(0x1860), f_q))mstore(0x1ba0, mulmod(mload(0x1880), mload(0x18a0), f_q))mstore(0x1bc0, mulmod(mload(0x18c0), mload(0x18e0), f_q)){ let result := mulmod(mload(0x1bc0), mload(0xa0), f_q)mstore(0x1be0, result) }mstore(0x1c00, mulmod(mload(0x920), mload(0x900), f_q))mstore(0x1c20, addmod(mload(0x8e0), mload(0x1c00), f_q))mstore(0x1c40, addmod(mload(0x1c20), sub(f_q, mload(0x940)), f_q))mstore(0x1c60, mulmod(mload(0x1c40), mload(0xcc0), f_q))mstore(0x1c80, mulmod(mload(0x780), mload(0x1c60), f_q))mstore(0x1ca0, mulmod(mload(0x9a0), mload(0x980), f_q))mstore(0x1cc0, addmod(mload(0x960), mload(0x1ca0), f_q))mstore(0x1ce0, addmod(mload(0x1cc0), sub(f_q, mload(0x9c0)), f_q))mstore(0x1d00, mulmod(mload(0x1ce0), mload(0xce0), f_q))mstore(0x1d20, addmod(mload(0x1c80), mload(0x1d00), f_q))mstore(0x1d40, mulmod(mload(0x780), mload(0x1d20), f_q))mstore(0x1d60, mulmod(mload(0xa20), mload(0xa00), f_q))mstore(0x1d80, addmod(mload(0x9e0), mload(0x1d60), f_q))mstore(0x1da0, addmod(mload(0x1d80), sub(f_q, mload(0xa40)), f_q))mstore(0x1dc0, mulmod(mload(0x1da0), mload(0xd00), f_q))mstore(0x1de0, addmod(mload(0x1d40), mload(0x1dc0), f_q))mstore(0x1e00, mulmod(mload(0x780), mload(0x1de0), f_q))mstore(0x1e20, mulmod(mload(0xaa0), mload(0xa80), f_q))mstore(0x1e40, addmod(mload(0xa60), mload(0x1e20), f_q))mstore(0x1e60, addmod(mload(0x1e40), sub(f_q, mload(0xac0)), f_q))mstore(0x1e80, mulmod(mload(0x1e60), mload(0xd20), f_q))mstore(0x1ea0, addmod(mload(0x1e00), mload(0x1e80), f_q))mstore(0x1ec0, mulmod(mload(0x780), mload(0x1ea0), f_q))mstore(0x1ee0, mulmod(mload(0xb20), mload(0xb00), f_q))mstore(0x1f00, addmod(mload(0xae0), mload(0x1ee0), f_q))mstore(0x1f20, addmod(mload(0x1f00), sub(f_q, mload(0xb40)), f_q))mstore(0x1f40, mulmod(mload(0x1f20), mload(0xd40), f_q))mstore(0x1f60, addmod(mload(0x1ec0), mload(0x1f40), f_q))mstore(0x1f80, mulmod(mload(0x780), mload(0x1f60), f_q))mstore(0x1fa0, mulmod(mload(0xba0), mload(0xb80), f_q))mstore(0x1fc0, addmod(mload(0xb60), mload(0x1fa0), f_q))mstore(0x1fe0, addmod(mload(0x1fc0), sub(f_q, mload(0xbc0)), f_q))mstore(0x2000, mulmod(mload(0x1fe0), mload(0xd60), f_q))mstore(0x2020, addmod(mload(0x1f80), mload(0x2000), f_q))mstore(0x2040, mulmod(mload(0x780), mload(0x2020), f_q))mstore(0x2060, addmod(1, sub(f_q, mload(0xf00)), f_q))mstore(0x2080, mulmod(mload(0x2060), mload(0x1bc0), f_q))mstore(0x20a0, addmod(mload(0x2040), mload(0x2080), f_q))mstore(0x20c0, mulmod(mload(0x780), mload(0x20a0), f_q))mstore(0x20e0, mulmod(mload(0x10e0), mload(0x10e0), f_q))mstore(0x2100, addmod(mload(0x20e0), sub(f_q, mload(0x10e0)), f_q))mstore(0x2120, mulmod(mload(0x2100), mload(0x1ae0), f_q))mstore(0x2140, addmod(mload(0x20c0), mload(0x2120), f_q))mstore(0x2160, mulmod(mload(0x780), mload(0x2140), f_q))mstore(0x2180, addmod(mload(0xf60), sub(f_q, mload(0xf40)), f_q))mstore(0x21a0, mulmod(mload(0x2180), mload(0x1bc0), f_q))mstore(0x21c0, addmod(mload(0x2160), mload(0x21a0), f_q))mstore(0x21e0, mulmod(mload(0x780), mload(0x21c0), f_q))mstore(0x2200, addmod(mload(0xfc0), sub(f_q, mload(0xfa0)), f_q))mstore(0x2220, mulmod(mload(0x2200), mload(0x1bc0), f_q))mstore(0x2240, addmod(mload(0x21e0), mload(0x2220), f_q))mstore(0x2260, mulmod(mload(0x780), mload(0x2240), f_q))mstore(0x2280, addmod(mload(0x1020), sub(f_q, mload(0x1000)), f_q))mstore(0x22a0, mulmod(mload(0x2280), mload(0x1bc0), f_q))mstore(0x22c0, addmod(mload(0x2260), mload(0x22a0), f_q))mstore(0x22e0, mulmod(mload(0x780), mload(0x22c0), f_q))mstore(0x2300, addmod(mload(0x1080), sub(f_q, mload(0x1060)), f_q))mstore(0x2320, mulmod(mload(0x2300), mload(0x1bc0), f_q))mstore(0x2340, addmod(mload(0x22e0), mload(0x2320), f_q))mstore(0x2360, mulmod(mload(0x780), mload(0x2340), f_q))mstore(0x2380, addmod(mload(0x10e0), sub(f_q, mload(0x10c0)), f_q))mstore(0x23a0, mulmod(mload(0x2380), mload(0x1bc0), f_q))mstore(0x23c0, addmod(mload(0x2360), mload(0x23a0), f_q))mstore(0x23e0, mulmod(mload(0x780), mload(0x23c0), f_q))mstore(0x2400, addmod(1, sub(f_q, mload(0x1ae0)), f_q))mstore(0x2420, addmod(mload(0x1b00), mload(0x1b20), f_q))mstore(0x2440, addmod(mload(0x2420), mload(0x1b40), f_q))mstore(0x2460, addmod(mload(0x2440), mload(0x1b60), f_q))mstore(0x2480, addmod(mload(0x2460), mload(0x1b80), f_q))mstore(0x24a0, addmod(mload(0x2480), mload(0x1ba0), f_q))mstore(0x24c0, addmod(mload(0x2400), sub(f_q, mload(0x24a0)), f_q))mstore(0x24e0, mulmod(mload(0xda0), mload(0x480), f_q))mstore(0x2500, addmod(mload(0xc40), mload(0x24e0), f_q))mstore(0x2520, addmod(mload(0x2500), mload(0x4e0), f_q))mstore(0x2540, mulmod(mload(0xdc0), mload(0x480), f_q))mstore(0x2560, addmod(mload(0x8e0), mload(0x2540), f_q))mstore(0x2580, addmod(mload(0x2560), mload(0x4e0), f_q))mstore(0x25a0, mulmod(mload(0x2580), mload(0x2520), f_q))mstore(0x25c0, mulmod(mload(0x25a0), mload(0xf20), f_q))mstore(0x25e0, mulmod(1, mload(0x480), f_q))mstore(0x2600, mulmod(mload(0x8a0), mload(0x25e0), f_q))mstore(0x2620, addmod(mload(0xc40), mload(0x2600), f_q))mstore(0x2640, addmod(mload(0x2620), mload(0x4e0), f_q))mstore(0x2660, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x480), f_q))mstore(0x2680, mulmod(mload(0x8a0), mload(0x2660), f_q))mstore(0x26a0, addmod(mload(0x8e0), mload(0x2680), f_q))mstore(0x26c0, addmod(mload(0x26a0), mload(0x4e0), f_q))mstore(0x26e0, mulmod(mload(0x26c0), mload(0x2640), f_q))mstore(0x2700, mulmod(mload(0x26e0), mload(0xf00), f_q))mstore(0x2720, addmod(mload(0x25c0), sub(f_q, mload(0x2700)), f_q))mstore(0x2740, mulmod(mload(0x2720), mload(0x24c0), f_q))mstore(0x2760, addmod(mload(0x23e0), mload(0x2740), f_q))mstore(0x2780, mulmod(mload(0x780), mload(0x2760), f_q))mstore(0x27a0, mulmod(mload(0xde0), mload(0x480), f_q))mstore(0x27c0, addmod(mload(0x960), mload(0x27a0), f_q))mstore(0x27e0, addmod(mload(0x27c0), mload(0x4e0), f_q))mstore(0x2800, mulmod(mload(0xe00), mload(0x480), f_q))mstore(0x2820, addmod(mload(0x9e0), mload(0x2800), f_q))mstore(0x2840, addmod(mload(0x2820), mload(0x4e0), f_q))mstore(0x2860, mulmod(mload(0x2840), mload(0x27e0), f_q))mstore(0x2880, mulmod(mload(0x2860), mload(0xf80), f_q))mstore(0x28a0, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x480), f_q))mstore(0x28c0, mulmod(mload(0x8a0), mload(0x28a0), f_q))mstore(0x28e0, addmod(mload(0x960), mload(0x28c0), f_q))mstore(0x2900, addmod(mload(0x28e0), mload(0x4e0), f_q))mstore(0x2920, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x480), f_q))mstore(0x2940, mulmod(mload(0x8a0), mload(0x2920), f_q))mstore(0x2960, addmod(mload(0x9e0), mload(0x2940), f_q))mstore(0x2980, addmod(mload(0x2960), mload(0x4e0), f_q))mstore(0x29a0, mulmod(mload(0x2980), mload(0x2900), f_q))mstore(0x29c0, mulmod(mload(0x29a0), mload(0xf60), f_q))mstore(0x29e0, addmod(mload(0x2880), sub(f_q, mload(0x29c0)), f_q))mstore(0x2a00, mulmod(mload(0x29e0), mload(0x24c0), f_q))mstore(0x2a20, addmod(mload(0x2780), mload(0x2a00), f_q))mstore(0x2a40, mulmod(mload(0x780), mload(0x2a20), f_q))mstore(0x2a60, mulmod(mload(0xe20), mload(0x480), f_q))mstore(0x2a80, addmod(mload(0xa60), mload(0x2a60), f_q))mstore(0x2aa0, addmod(mload(0x2a80), mload(0x4e0), f_q))mstore(0x2ac0, mulmod(mload(0xe40), mload(0x480), f_q))mstore(0x2ae0, addmod(mload(0xae0), mload(0x2ac0), f_q))mstore(0x2b00, addmod(mload(0x2ae0), mload(0x4e0), f_q))mstore(0x2b20, mulmod(mload(0x2b00), mload(0x2aa0), f_q))mstore(0x2b40, mulmod(mload(0x2b20), mload(0xfe0), f_q))mstore(0x2b60, mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(0x480), f_q))mstore(0x2b80, mulmod(mload(0x8a0), mload(0x2b60), f_q))mstore(0x2ba0, addmod(mload(0xa60), mload(0x2b80), f_q))mstore(0x2bc0, addmod(mload(0x2ba0), mload(0x4e0), f_q))mstore(0x2be0, mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(0x480), f_q))mstore(0x2c00, mulmod(mload(0x8a0), mload(0x2be0), f_q))mstore(0x2c20, addmod(mload(0xae0), mload(0x2c00), f_q))mstore(0x2c40, addmod(mload(0x2c20), mload(0x4e0), f_q))mstore(0x2c60, mulmod(mload(0x2c40), mload(0x2bc0), f_q))mstore(0x2c80, mulmod(mload(0x2c60), mload(0xfc0), f_q))mstore(0x2ca0, addmod(mload(0x2b40), sub(f_q, mload(0x2c80)), f_q))mstore(0x2cc0, mulmod(mload(0x2ca0), mload(0x24c0), f_q))mstore(0x2ce0, addmod(mload(0x2a40), mload(0x2cc0), f_q))mstore(0x2d00, mulmod(mload(0x780), mload(0x2ce0), f_q))mstore(0x2d20, mulmod(mload(0xe60), mload(0x480), f_q))mstore(0x2d40, addmod(mload(0xb60), mload(0x2d20), f_q))mstore(0x2d60, addmod(mload(0x2d40), mload(0x4e0), f_q))mstore(0x2d80, mulmod(mload(0xe80), mload(0x480), f_q))mstore(0x2da0, addmod(mload(0xbe0), mload(0x2d80), f_q))mstore(0x2dc0, addmod(mload(0x2da0), mload(0x4e0), f_q))mstore(0x2de0, mulmod(mload(0x2dc0), mload(0x2d60), f_q))mstore(0x2e00, mulmod(mload(0x2de0), mload(0x1040), f_q))mstore(0x2e20, mulmod(5625741653535312224677218588085279924365897425605943700675464992185016992283, mload(0x480), f_q))mstore(0x2e40, mulmod(mload(0x8a0), mload(0x2e20), f_q))mstore(0x2e60, addmod(mload(0xb60), mload(0x2e40), f_q))mstore(0x2e80, addmod(mload(0x2e60), mload(0x4e0), f_q))mstore(0x2ea0, mulmod(14704729814417906439424896605881467874595262020190401576785074330126828718155, mload(0x480), f_q))mstore(0x2ec0, mulmod(mload(0x8a0), mload(0x2ea0), f_q))mstore(0x2ee0, addmod(mload(0xbe0), mload(0x2ec0), f_q))mstore(0x2f00, addmod(mload(0x2ee0), mload(0x4e0), f_q))mstore(0x2f20, mulmod(mload(0x2f00), mload(0x2e80), f_q))mstore(0x2f40, mulmod(mload(0x2f20), mload(0x1020), f_q))mstore(0x2f60, addmod(mload(0x2e00), sub(f_q, mload(0x2f40)), f_q))mstore(0x2f80, mulmod(mload(0x2f60), mload(0x24c0), f_q))mstore(0x2fa0, addmod(mload(0x2d00), mload(0x2f80), f_q))mstore(0x2fc0, mulmod(mload(0x780), mload(0x2fa0), f_q))mstore(0x2fe0, mulmod(mload(0xea0), mload(0x480), f_q))mstore(0x3000, addmod(mload(0x1be0), mload(0x2fe0), f_q))mstore(0x3020, addmod(mload(0x3000), mload(0x4e0), f_q))mstore(0x3040, mulmod(mload(0xec0), mload(0x480), f_q))mstore(0x3060, addmod(mload(0xc00), mload(0x3040), f_q))mstore(0x3080, addmod(mload(0x3060), mload(0x4e0), f_q))mstore(0x30a0, mulmod(mload(0x3080), mload(0x3020), f_q))mstore(0x30c0, mulmod(mload(0x30a0), mload(0x10a0), f_q))mstore(0x30e0, mulmod(8343274462013750416000956870576256937330525306073862550863787263304548803879, mload(0x480), f_q))mstore(0x3100, mulmod(mload(0x8a0), mload(0x30e0), f_q))mstore(0x3120, addmod(mload(0x1be0), mload(0x3100), f_q))mstore(0x3140, addmod(mload(0x3120), mload(0x4e0), f_q))mstore(0x3160, mulmod(20928372310071051017340352686640453451620397549739756658327314209761852842004, mload(0x480), f_q))mstore(0x3180, mulmod(mload(0x8a0), mload(0x3160), f_q))mstore(0x31a0, addmod(mload(0xc00), mload(0x3180), f_q))mstore(0x31c0, addmod(mload(0x31a0), mload(0x4e0), f_q))mstore(0x31e0, mulmod(mload(0x31c0), mload(0x3140), f_q))mstore(0x3200, mulmod(mload(0x31e0), mload(0x1080), f_q))mstore(0x3220, addmod(mload(0x30c0), sub(f_q, mload(0x3200)), f_q))mstore(0x3240, mulmod(mload(0x3220), mload(0x24c0), f_q))mstore(0x3260, addmod(mload(0x2fc0), mload(0x3240), f_q))mstore(0x3280, mulmod(mload(0x780), mload(0x3260), f_q))mstore(0x32a0, mulmod(mload(0xee0), mload(0x480), f_q))mstore(0x32c0, addmod(mload(0xc20), mload(0x32a0), f_q))mstore(0x32e0, addmod(mload(0x32c0), mload(0x4e0), f_q))mstore(0x3300, mulmod(mload(0x32e0), mload(0x1100), f_q))mstore(0x3320, mulmod(15845651941796975697993789271154426079663327509658641548785793587449119139335, mload(0x480), f_q))mstore(0x3340, mulmod(mload(0x8a0), mload(0x3320), f_q))mstore(0x3360, addmod(mload(0xc20), mload(0x3340), f_q))mstore(0x3380, addmod(mload(0x3360), mload(0x4e0), f_q))mstore(0x33a0, mulmod(mload(0x3380), mload(0x10e0), f_q))mstore(0x33c0, addmod(mload(0x3300), sub(f_q, mload(0x33a0)), f_q))mstore(0x33e0, mulmod(mload(0x33c0), mload(0x24c0), f_q))mstore(0x3400, addmod(mload(0x3280), mload(0x33e0), f_q))mstore(0x3420, mulmod(mload(0x780), mload(0x3400), f_q))mstore(0x3440, addmod(1, sub(f_q, mload(0x1120)), f_q))mstore(0x3460, mulmod(mload(0x3440), mload(0x1bc0), f_q))mstore(0x3480, addmod(mload(0x3420), mload(0x3460), f_q))mstore(0x34a0, mulmod(mload(0x780), mload(0x3480), f_q))mstore(0x34c0, mulmod(mload(0x1120), mload(0x1120), f_q))mstore(0x34e0, addmod(mload(0x34c0), sub(f_q, mload(0x1120)), f_q))mstore(0x3500, mulmod(mload(0x34e0), mload(0x1ae0), f_q))mstore(0x3520, addmod(mload(0x34a0), mload(0x3500), f_q))mstore(0x3540, mulmod(mload(0x780), mload(0x3520), f_q))mstore(0x3560, addmod(mload(0x1160), mload(0x480), f_q))mstore(0x3580, mulmod(mload(0x3560), mload(0x1140), f_q))mstore(0x35a0, addmod(mload(0x11a0), mload(0x4e0), f_q))mstore(0x35c0, mulmod(mload(0x35a0), mload(0x3580), f_q))mstore(0x35e0, addmod(mload(0xbe0), mload(0x480), f_q))mstore(0x3600, mulmod(mload(0x35e0), mload(0x1120), f_q))mstore(0x3620, addmod(mload(0xc60), mload(0x4e0), f_q))mstore(0x3640, mulmod(mload(0x3620), mload(0x3600), f_q))mstore(0x3660, addmod(mload(0x35c0), sub(f_q, mload(0x3640)), f_q))mstore(0x3680, mulmod(mload(0x3660), mload(0x24c0), f_q))mstore(0x36a0, addmod(mload(0x3540), mload(0x3680), f_q))mstore(0x36c0, mulmod(mload(0x780), mload(0x36a0), f_q))mstore(0x36e0, addmod(mload(0x1160), sub(f_q, mload(0x11a0)), f_q))mstore(0x3700, mulmod(mload(0x36e0), mload(0x1bc0), f_q))mstore(0x3720, addmod(mload(0x36c0), mload(0x3700), f_q))mstore(0x3740, mulmod(mload(0x780), mload(0x3720), f_q))mstore(0x3760, mulmod(mload(0x36e0), mload(0x24c0), f_q))mstore(0x3780, addmod(mload(0x1160), sub(f_q, mload(0x1180)), f_q))mstore(0x37a0, mulmod(mload(0x3780), mload(0x3760), f_q))mstore(0x37c0, addmod(mload(0x3740), mload(0x37a0), f_q))mstore(0x37e0, mulmod(mload(0x780), mload(0x37c0), f_q))mstore(0x3800, addmod(1, sub(f_q, mload(0x11c0)), f_q))mstore(0x3820, mulmod(mload(0x3800), mload(0x1bc0), f_q))mstore(0x3840, addmod(mload(0x37e0), mload(0x3820), f_q))mstore(0x3860, mulmod(mload(0x780), mload(0x3840), f_q))mstore(0x3880, mulmod(mload(0x11c0), mload(0x11c0), f_q))mstore(0x38a0, addmod(mload(0x3880), sub(f_q, mload(0x11c0)), f_q))mstore(0x38c0, mulmod(mload(0x38a0), mload(0x1ae0), f_q))mstore(0x38e0, addmod(mload(0x3860), mload(0x38c0), f_q))mstore(0x3900, mulmod(mload(0x780), mload(0x38e0), f_q))mstore(0x3920, addmod(mload(0x1200), mload(0x480), f_q))mstore(0x3940, mulmod(mload(0x3920), mload(0x11e0), f_q))mstore(0x3960, addmod(mload(0x1240), mload(0x4e0), f_q))mstore(0x3980, mulmod(mload(0x3960), mload(0x3940), f_q))mstore(0x39a0, mulmod(mload(0x320), mload(0xc00), f_q))mstore(0x39c0, addmod(mload(0x39a0), mload(0xc20), f_q))mstore(0x39e0, addmod(mload(0x39c0), mload(0x480), f_q))mstore(0x3a00, mulmod(mload(0x39e0), mload(0x11c0), f_q))mstore(0x3a20, mulmod(mload(0x320), mload(0xc80), f_q))mstore(0x3a40, addmod(mload(0x3a20), mload(0xca0), f_q))mstore(0x3a60, addmod(mload(0x3a40), mload(0x4e0), f_q))mstore(0x3a80, mulmod(mload(0x3a60), mload(0x3a00), f_q))mstore(0x3aa0, addmod(mload(0x3980), sub(f_q, mload(0x3a80)), f_q))mstore(0x3ac0, mulmod(mload(0x3aa0), mload(0x24c0), f_q))mstore(0x3ae0, addmod(mload(0x3900), mload(0x3ac0), f_q))mstore(0x3b00, mulmod(mload(0x780), mload(0x3ae0), f_q))mstore(0x3b20, addmod(mload(0x1200), sub(f_q, mload(0x1240)), f_q))mstore(0x3b40, mulmod(mload(0x3b20), mload(0x1bc0), f_q))mstore(0x3b60, addmod(mload(0x3b00), mload(0x3b40), f_q))mstore(0x3b80, mulmod(mload(0x780), mload(0x3b60), f_q))mstore(0x3ba0, mulmod(mload(0x3b20), mload(0x24c0), f_q))mstore(0x3bc0, addmod(mload(0x1200), sub(f_q, mload(0x1220)), f_q))mstore(0x3be0, mulmod(mload(0x3bc0), mload(0x3ba0), f_q))mstore(0x3c00, addmod(mload(0x3b80), mload(0x3be0), f_q))mstore(0x3c20, mulmod(mload(0x16a0), mload(0x16a0), f_q))mstore(0x3c40, mulmod(mload(0x3c20), mload(0x16a0), f_q))mstore(0x3c60, mulmod(1, mload(0x16a0), f_q))mstore(0x3c80, mulmod(1, mload(0x3c20), f_q))mstore(0x3ca0, mulmod(mload(0x3c00), mload(0x16c0), f_q))mstore(0x3cc0, mulmod(mload(0x1400), mload(0x8a0), f_q))mstore(0x3ce0, mulmod(mload(0x3cc0), mload(0x8a0), f_q))mstore(0x3d00, mulmod(mload(0x8a0), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x3d20, addmod(mload(0x1380), sub(f_q, mload(0x3d00)), f_q))mstore(0x3d40, mulmod(mload(0x8a0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x3d60, addmod(mload(0x1380), sub(f_q, mload(0x3d40)), f_q))mstore(0x3d80, mulmod(mload(0x8a0), 1, f_q))mstore(0x3da0, addmod(mload(0x1380), sub(f_q, mload(0x3d80)), f_q))mstore(0x3dc0, mulmod(mload(0x8a0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q))mstore(0x3de0, addmod(mload(0x1380), sub(f_q, mload(0x3dc0)), f_q))mstore(0x3e00, mulmod(mload(0x8a0), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q))mstore(0x3e20, addmod(mload(0x1380), sub(f_q, mload(0x3e00)), f_q))mstore(0x3e40, mulmod(mload(0x8a0), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q))mstore(0x3e60, addmod(mload(0x1380), sub(f_q, mload(0x3e40)), f_q))mstore(0x3e80, mulmod(3544324119167359571073009690693121464267965232733679586767649244433889388945, mload(0x3cc0), f_q))mstore(0x3ea0, mulmod(mload(0x3e80), 1, f_q)){ let result := mulmod(mload(0x1380), mload(0x3e80), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x3ea0)), f_q), result, f_q)mstore(0x3ec0, result) }mstore(0x3ee0, mulmod(3860370625838117017501327045244227871206764201116468958063324100051382735289, mload(0x3cc0), f_q))mstore(0x3f00, mulmod(mload(0x3ee0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1380), mload(0x3ee0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x3f00)), f_q), result, f_q)mstore(0x3f20, result) }mstore(0x3f40, mulmod(21616901807277407275624036604424346159916096890712898844034238973395610537327, mload(0x3cc0), f_q))mstore(0x3f60, mulmod(mload(0x3f40), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q)){ let result := mulmod(mload(0x1380), mload(0x3f40), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x3f60)), f_q), result, f_q)mstore(0x3f80, result) }mstore(0x3fa0, mulmod(3209408481237076479025468386201293941554240476766691830436732310949352383503, mload(0x3cc0), f_q))mstore(0x3fc0, mulmod(mload(0x3fa0), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q)){ let result := mulmod(mload(0x1380), mload(0x3fa0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x3fc0)), f_q), result, f_q)mstore(0x3fe0, result) }mstore(0x4000, mulmod(1, mload(0x3da0), f_q))mstore(0x4020, mulmod(mload(0x4000), mload(0x3de0), f_q))mstore(0x4040, mulmod(mload(0x4020), mload(0x3e20), f_q))mstore(0x4060, mulmod(mload(0x4040), mload(0x3e60), f_q)){ let result := mulmod(mload(0x1380), 1, f_q)result := addmod(mulmod(mload(0x8a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(0x4080, result) }mstore(0x40a0, mulmod(8390819244605639573390577733158868133682115698337564550620146375401109684432, mload(0x1400), f_q))mstore(0x40c0, mulmod(mload(0x40a0), 1, f_q)){ let result := mulmod(mload(0x1380), mload(0x40a0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x40c0)), f_q), result, f_q)mstore(0x40e0, result) }mstore(0x4100, mulmod(14389468897523033212448771694851898440525479866834419679925499462425232628530, mload(0x1400), f_q))mstore(0x4120, mulmod(mload(0x4100), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1380), mload(0x4100), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4120)), f_q), result, f_q)mstore(0x4140, result) }mstore(0x4160, mulmod(8021781111580269725587432039983408559403601261632071736490564397134126857583, mload(0x1400), f_q))mstore(0x4180, mulmod(mload(0x4160), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q)){ let result := mulmod(mload(0x1380), mload(0x4160), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4180)), f_q), result, f_q)mstore(0x41a0, result) }mstore(0x41c0, mulmod(mload(0x4020), mload(0x3d20), f_q))mstore(0x41e0, mulmod(10676941854703594198666993839846402519342119846958189386823924046696287912228, mload(0x8a0), f_q))mstore(0x4200, mulmod(mload(0x41e0), 1, f_q)){ let result := mulmod(mload(0x1380), mload(0x41e0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4200)), f_q), result, f_q)mstore(0x4220, result) }mstore(0x4240, mulmod(11211301017135681023579411905410872569206244553457844956874280139879520583389, mload(0x8a0), f_q))mstore(0x4260, mulmod(mload(0x4240), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1380), mload(0x4240), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4260)), f_q), result, f_q)mstore(0x4280, result) }mstore(0x42a0, mulmod(13154116519010929542673167886091370382741775939114889923107781597533678454430, mload(0x8a0), f_q))mstore(0x42c0, mulmod(mload(0x42a0), 1, f_q)){ let result := mulmod(mload(0x1380), mload(0x42a0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x42c0)), f_q), result, f_q)mstore(0x42e0, result) }mstore(0x4300, mulmod(8734126352828345679573237859165904705806588461301144420590422589042130041187, mload(0x8a0), f_q))mstore(0x4320, mulmod(mload(0x4300), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q)){ let result := mulmod(mload(0x1380), mload(0x4300), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4320)), f_q), result, f_q)mstore(0x4340, result) }mstore(0x4360, mulmod(mload(0x4000), mload(0x3d60), f_q)){ let prod := mload(0x3ec0) prod := mulmod(mload(0x3f20), prod, f_q) mstore(0x4380, prod) prod := mulmod(mload(0x3f80), prod, f_q) mstore(0x43a0, prod) prod := mulmod(mload(0x3fe0), prod, f_q) mstore(0x43c0, prod) prod := mulmod(mload(0x4080), prod, f_q) mstore(0x43e0, prod) prod := mulmod(mload(0x4000), prod, f_q) mstore(0x4400, prod) prod := mulmod(mload(0x40e0), prod, f_q) mstore(0x4420, prod) prod := mulmod(mload(0x4140), prod, f_q) mstore(0x4440, prod) prod := mulmod(mload(0x41a0), prod, f_q) mstore(0x4460, prod) prod := mulmod(mload(0x41c0), prod, f_q) mstore(0x4480, prod) prod := mulmod(mload(0x4220), prod, f_q) mstore(0x44a0, prod) prod := mulmod(mload(0x4280), prod, f_q) mstore(0x44c0, prod) prod := mulmod(mload(0x4020), prod, f_q) mstore(0x44e0, prod) prod := mulmod(mload(0x42e0), prod, f_q) mstore(0x4500, prod) prod := mulmod(mload(0x4340), prod, f_q) mstore(0x4520, prod) prod := mulmod(mload(0x4360), prod, f_q) mstore(0x4540, prod) }mstore(0x4580, 32)mstore(0x45a0, 32)mstore(0x45c0, 32)mstore(0x45e0, mload(0x4540))mstore(0x4600, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x4620, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x4580, 0xc0, 0x4560, 0x20), 1), success){ let inv := mload(0x4560) let v v := mload(0x4360) mstore(0x4360, mulmod(mload(0x4520), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4340) mstore(0x4340, mulmod(mload(0x4500), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x42e0) mstore(0x42e0, mulmod(mload(0x44e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4020) mstore(0x4020, mulmod(mload(0x44c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4280) mstore(0x4280, mulmod(mload(0x44a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4220) mstore(0x4220, mulmod(mload(0x4480), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x41c0) mstore(0x41c0, mulmod(mload(0x4460), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x41a0) mstore(0x41a0, mulmod(mload(0x4440), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4140) mstore(0x4140, mulmod(mload(0x4420), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x40e0) mstore(0x40e0, mulmod(mload(0x4400), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4000) mstore(0x4000, mulmod(mload(0x43e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4080) mstore(0x4080, mulmod(mload(0x43c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3fe0) mstore(0x3fe0, mulmod(mload(0x43a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3f80) mstore(0x3f80, mulmod(mload(0x4380), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3f20) mstore(0x3f20, mulmod(mload(0x3ec0), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x3ec0, inv) }{ let result := mload(0x3ec0)result := addmod(mload(0x3f20), result, f_q)result := addmod(mload(0x3f80), result, f_q)result := addmod(mload(0x3fe0), result, f_q)mstore(0x4640, result) }mstore(0x4660, mulmod(mload(0x4060), mload(0x4000), f_q)){ let result := mload(0x4080)mstore(0x4680, result) }mstore(0x46a0, mulmod(mload(0x4060), mload(0x41c0), f_q)){ let result := mload(0x40e0)result := addmod(mload(0x4140), result, f_q)result := addmod(mload(0x41a0), result, f_q)mstore(0x46c0, result) }mstore(0x46e0, mulmod(mload(0x4060), mload(0x4020), f_q)){ let result := mload(0x4220)result := addmod(mload(0x4280), result, f_q)mstore(0x4700, result) }mstore(0x4720, mulmod(mload(0x4060), mload(0x4360), f_q)){ let result := mload(0x42e0)result := addmod(mload(0x4340), result, f_q)mstore(0x4740, result) }{ let prod := mload(0x4640) prod := mulmod(mload(0x4680), prod, f_q) mstore(0x4760, prod) prod := mulmod(mload(0x46c0), prod, f_q) mstore(0x4780, prod) prod := mulmod(mload(0x4700), prod, f_q) mstore(0x47a0, prod) prod := mulmod(mload(0x4740), prod, f_q) mstore(0x47c0, prod) }mstore(0x4800, 32)mstore(0x4820, 32)mstore(0x4840, 32)mstore(0x4860, mload(0x47c0))mstore(0x4880, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x48a0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x4800, 0xc0, 0x47e0, 0x20), 1), success){ let inv := mload(0x47e0) let v v := mload(0x4740) mstore(0x4740, mulmod(mload(0x47a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4700) mstore(0x4700, mulmod(mload(0x4780), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x46c0) mstore(0x46c0, mulmod(mload(0x4760), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4680) mstore(0x4680, mulmod(mload(0x4640), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x4640, inv) }mstore(0x48c0, mulmod(mload(0x4660), mload(0x4680), f_q))mstore(0x48e0, mulmod(mload(0x46a0), mload(0x46c0), f_q))mstore(0x4900, mulmod(mload(0x46e0), mload(0x4700), f_q))mstore(0x4920, mulmod(mload(0x4720), mload(0x4740), f_q))mstore(0x4940, mulmod(mload(0x1280), mload(0x1280), f_q))mstore(0x4960, mulmod(mload(0x4940), mload(0x1280), f_q))mstore(0x4980, mulmod(mload(0x4960), mload(0x1280), f_q))mstore(0x49a0, mulmod(mload(0x4980), mload(0x1280), f_q))mstore(0x49c0, mulmod(mload(0x49a0), mload(0x1280), f_q))mstore(0x49e0, mulmod(mload(0x49c0), mload(0x1280), f_q))mstore(0x4a00, mulmod(mload(0x49e0), mload(0x1280), f_q))mstore(0x4a20, mulmod(mload(0x4a00), mload(0x1280), f_q))mstore(0x4a40, mulmod(mload(0x4a20), mload(0x1280), f_q))mstore(0x4a60, mulmod(mload(0x4a40), mload(0x1280), f_q))mstore(0x4a80, mulmod(mload(0x4a60), mload(0x1280), f_q))mstore(0x4aa0, mulmod(mload(0x4a80), mload(0x1280), f_q))mstore(0x4ac0, mulmod(mload(0x4aa0), mload(0x1280), f_q))mstore(0x4ae0, mulmod(mload(0x4ac0), mload(0x1280), f_q))mstore(0x4b00, mulmod(mload(0x4ae0), mload(0x1280), f_q))mstore(0x4b20, mulmod(mload(0x4b00), mload(0x1280), f_q))mstore(0x4b40, mulmod(mload(0x4b20), mload(0x1280), f_q))mstore(0x4b60, mulmod(mload(0x4b40), mload(0x1280), f_q))mstore(0x4b80, mulmod(mload(0x4b60), mload(0x1280), f_q))mstore(0x4ba0, mulmod(mload(0x4b80), mload(0x1280), f_q))mstore(0x4bc0, mulmod(mload(0x4ba0), mload(0x1280), f_q))mstore(0x4be0, mulmod(mload(0x4bc0), mload(0x1280), f_q))mstore(0x4c00, mulmod(mload(0x4be0), mload(0x1280), f_q))mstore(0x4c20, mulmod(mload(0x4c00), mload(0x1280), f_q))mstore(0x4c40, mulmod(mload(0x4c20), mload(0x1280), f_q))mstore(0x4c60, mulmod(mload(0x4c40), mload(0x1280), f_q))mstore(0x4c80, mulmod(mload(0x4c60), mload(0x1280), f_q))mstore(0x4ca0, mulmod(mload(0x12e0), mload(0x12e0), f_q))mstore(0x4cc0, mulmod(mload(0x4ca0), mload(0x12e0), f_q))mstore(0x4ce0, mulmod(mload(0x4cc0), mload(0x12e0), f_q))mstore(0x4d00, mulmod(mload(0x4ce0), mload(0x12e0), f_q)){ let result := mulmod(mload(0x8e0), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0x900), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0x920), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0x940), mload(0x3fe0), f_q), result, f_q)mstore(0x4d20, result) }mstore(0x4d40, mulmod(mload(0x4d20), mload(0x4640), f_q))mstore(0x4d60, mulmod(sub(f_q, mload(0x4d40)), 1, f_q)){ let result := mulmod(mload(0x960), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0x980), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0x9a0), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0x9c0), mload(0x3fe0), f_q), result, f_q)mstore(0x4d80, result) }mstore(0x4da0, mulmod(mload(0x4d80), mload(0x4640), f_q))mstore(0x4dc0, mulmod(sub(f_q, mload(0x4da0)), mload(0x1280), f_q))mstore(0x4de0, mulmod(1, mload(0x1280), f_q))mstore(0x4e00, addmod(mload(0x4d60), mload(0x4dc0), f_q)){ let result := mulmod(mload(0x9e0), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0xa00), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0xa20), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0xa40), mload(0x3fe0), f_q), result, f_q)mstore(0x4e20, result) }mstore(0x4e40, mulmod(mload(0x4e20), mload(0x4640), f_q))mstore(0x4e60, mulmod(sub(f_q, mload(0x4e40)), mload(0x4940), f_q))mstore(0x4e80, mulmod(1, mload(0x4940), f_q))mstore(0x4ea0, addmod(mload(0x4e00), mload(0x4e60), f_q)){ let result := mulmod(mload(0xa60), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0xa80), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0xaa0), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0xac0), mload(0x3fe0), f_q), result, f_q)mstore(0x4ec0, result) }mstore(0x4ee0, mulmod(mload(0x4ec0), mload(0x4640), f_q))mstore(0x4f00, mulmod(sub(f_q, mload(0x4ee0)), mload(0x4960), f_q))mstore(0x4f20, mulmod(1, mload(0x4960), f_q))mstore(0x4f40, addmod(mload(0x4ea0), mload(0x4f00), f_q)){ let result := mulmod(mload(0xae0), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0xb00), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0xb20), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0xb40), mload(0x3fe0), f_q), result, f_q)mstore(0x4f60, result) }mstore(0x4f80, mulmod(mload(0x4f60), mload(0x4640), f_q))mstore(0x4fa0, mulmod(sub(f_q, mload(0x4f80)), mload(0x4980), f_q))mstore(0x4fc0, mulmod(1, mload(0x4980), f_q))mstore(0x4fe0, addmod(mload(0x4f40), mload(0x4fa0), f_q)){ let result := mulmod(mload(0xb60), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0xb80), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0xba0), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0xbc0), mload(0x3fe0), f_q), result, f_q)mstore(0x5000, result) }mstore(0x5020, mulmod(mload(0x5000), mload(0x4640), f_q))mstore(0x5040, mulmod(sub(f_q, mload(0x5020)), mload(0x49a0), f_q))mstore(0x5060, mulmod(1, mload(0x49a0), f_q))mstore(0x5080, addmod(mload(0x4fe0), mload(0x5040), f_q))mstore(0x50a0, mulmod(mload(0x5080), 1, f_q))mstore(0x50c0, mulmod(mload(0x4de0), 1, f_q))mstore(0x50e0, mulmod(mload(0x4e80), 1, f_q))mstore(0x5100, mulmod(mload(0x4f20), 1, f_q))mstore(0x5120, mulmod(mload(0x4fc0), 1, f_q))mstore(0x5140, mulmod(mload(0x5060), 1, f_q))mstore(0x5160, mulmod(1, mload(0x4660), f_q)){ let result := mulmod(mload(0xbe0), mload(0x4080), f_q)mstore(0x5180, result) }mstore(0x51a0, mulmod(mload(0x5180), mload(0x48c0), f_q))mstore(0x51c0, mulmod(sub(f_q, mload(0x51a0)), 1, f_q))mstore(0x51e0, mulmod(mload(0x5160), 1, f_q)){ let result := mulmod(mload(0xc00), mload(0x4080), f_q)mstore(0x5200, result) }mstore(0x5220, mulmod(mload(0x5200), mload(0x48c0), f_q))mstore(0x5240, mulmod(sub(f_q, mload(0x5220)), mload(0x1280), f_q))mstore(0x5260, mulmod(mload(0x5160), mload(0x1280), f_q))mstore(0x5280, addmod(mload(0x51c0), mload(0x5240), f_q)){ let result := mulmod(mload(0xc20), mload(0x4080), f_q)mstore(0x52a0, result) }mstore(0x52c0, mulmod(mload(0x52a0), mload(0x48c0), f_q))mstore(0x52e0, mulmod(sub(f_q, mload(0x52c0)), mload(0x4940), f_q))mstore(0x5300, mulmod(mload(0x5160), mload(0x4940), f_q))mstore(0x5320, addmod(mload(0x5280), mload(0x52e0), f_q)){ let result := mulmod(mload(0x11a0), mload(0x4080), f_q)mstore(0x5340, result) }mstore(0x5360, mulmod(mload(0x5340), mload(0x48c0), f_q))mstore(0x5380, mulmod(sub(f_q, mload(0x5360)), mload(0x4960), f_q))mstore(0x53a0, mulmod(mload(0x5160), mload(0x4960), f_q))mstore(0x53c0, addmod(mload(0x5320), mload(0x5380), f_q)){ let result := mulmod(mload(0x1240), mload(0x4080), f_q)mstore(0x53e0, result) }mstore(0x5400, mulmod(mload(0x53e0), mload(0x48c0), f_q))mstore(0x5420, mulmod(sub(f_q, mload(0x5400)), mload(0x4980), f_q))mstore(0x5440, mulmod(mload(0x5160), mload(0x4980), f_q))mstore(0x5460, addmod(mload(0x53c0), mload(0x5420), f_q)){ let result := mulmod(mload(0xc40), mload(0x4080), f_q)mstore(0x5480, result) }mstore(0x54a0, mulmod(mload(0x5480), mload(0x48c0), f_q))mstore(0x54c0, mulmod(sub(f_q, mload(0x54a0)), mload(0x49a0), f_q))mstore(0x54e0, mulmod(mload(0x5160), mload(0x49a0), f_q))mstore(0x5500, addmod(mload(0x5460), mload(0x54c0), f_q)){ let result := mulmod(mload(0xc60), mload(0x4080), f_q)mstore(0x5520, result) }mstore(0x5540, mulmod(mload(0x5520), mload(0x48c0), f_q))mstore(0x5560, mulmod(sub(f_q, mload(0x5540)), mload(0x49c0), f_q))mstore(0x5580, mulmod(mload(0x5160), mload(0x49c0), f_q))mstore(0x55a0, addmod(mload(0x5500), mload(0x5560), f_q)){ let result := mulmod(mload(0xc80), mload(0x4080), f_q)mstore(0x55c0, result) }mstore(0x55e0, mulmod(mload(0x55c0), mload(0x48c0), f_q))mstore(0x5600, mulmod(sub(f_q, mload(0x55e0)), mload(0x49e0), f_q))mstore(0x5620, mulmod(mload(0x5160), mload(0x49e0), f_q))mstore(0x5640, addmod(mload(0x55a0), mload(0x5600), f_q))mstore(0x5660, addmod(mload(0x5580), mload(0x5620), f_q)){ let result := mulmod(mload(0xca0), mload(0x4080), f_q)mstore(0x5680, result) }mstore(0x56a0, mulmod(mload(0x5680), mload(0x48c0), f_q))mstore(0x56c0, mulmod(sub(f_q, mload(0x56a0)), mload(0x4a00), f_q))mstore(0x56e0, mulmod(mload(0x5160), mload(0x4a00), f_q))mstore(0x5700, addmod(mload(0x5640), mload(0x56c0), f_q)){ let result := mulmod(mload(0xcc0), mload(0x4080), f_q)mstore(0x5720, result) }mstore(0x5740, mulmod(mload(0x5720), mload(0x48c0), f_q))mstore(0x5760, mulmod(sub(f_q, mload(0x5740)), mload(0x4a20), f_q))mstore(0x5780, mulmod(mload(0x5160), mload(0x4a20), f_q))mstore(0x57a0, addmod(mload(0x5700), mload(0x5760), f_q)){ let result := mulmod(mload(0xce0), mload(0x4080), f_q)mstore(0x57c0, result) }mstore(0x57e0, mulmod(mload(0x57c0), mload(0x48c0), f_q))mstore(0x5800, mulmod(sub(f_q, mload(0x57e0)), mload(0x4a40), f_q))mstore(0x5820, mulmod(mload(0x5160), mload(0x4a40), f_q))mstore(0x5840, addmod(mload(0x57a0), mload(0x5800), f_q)){ let result := mulmod(mload(0xd00), mload(0x4080), f_q)mstore(0x5860, result) }mstore(0x5880, mulmod(mload(0x5860), mload(0x48c0), f_q))mstore(0x58a0, mulmod(sub(f_q, mload(0x5880)), mload(0x4a60), f_q))mstore(0x58c0, mulmod(mload(0x5160), mload(0x4a60), f_q))mstore(0x58e0, addmod(mload(0x5840), mload(0x58a0), f_q)){ let result := mulmod(mload(0xd20), mload(0x4080), f_q)mstore(0x5900, result) }mstore(0x5920, mulmod(mload(0x5900), mload(0x48c0), f_q))mstore(0x5940, mulmod(sub(f_q, mload(0x5920)), mload(0x4a80), f_q))mstore(0x5960, mulmod(mload(0x5160), mload(0x4a80), f_q))mstore(0x5980, addmod(mload(0x58e0), mload(0x5940), f_q)){ let result := mulmod(mload(0xd40), mload(0x4080), f_q)mstore(0x59a0, result) }mstore(0x59c0, mulmod(mload(0x59a0), mload(0x48c0), f_q))mstore(0x59e0, mulmod(sub(f_q, mload(0x59c0)), mload(0x4aa0), f_q))mstore(0x5a00, mulmod(mload(0x5160), mload(0x4aa0), f_q))mstore(0x5a20, addmod(mload(0x5980), mload(0x59e0), f_q)){ let result := mulmod(mload(0xd60), mload(0x4080), f_q)mstore(0x5a40, result) }mstore(0x5a60, mulmod(mload(0x5a40), mload(0x48c0), f_q))mstore(0x5a80, mulmod(sub(f_q, mload(0x5a60)), mload(0x4ac0), f_q))mstore(0x5aa0, mulmod(mload(0x5160), mload(0x4ac0), f_q))mstore(0x5ac0, addmod(mload(0x5a20), mload(0x5a80), f_q)){ let result := mulmod(mload(0xda0), mload(0x4080), f_q)mstore(0x5ae0, result) }mstore(0x5b00, mulmod(mload(0x5ae0), mload(0x48c0), f_q))mstore(0x5b20, mulmod(sub(f_q, mload(0x5b00)), mload(0x4ae0), f_q))mstore(0x5b40, mulmod(mload(0x5160), mload(0x4ae0), f_q))mstore(0x5b60, addmod(mload(0x5ac0), mload(0x5b20), f_q)){ let result := mulmod(mload(0xdc0), mload(0x4080), f_q)mstore(0x5b80, result) }mstore(0x5ba0, mulmod(mload(0x5b80), mload(0x48c0), f_q))mstore(0x5bc0, mulmod(sub(f_q, mload(0x5ba0)), mload(0x4b00), f_q))mstore(0x5be0, mulmod(mload(0x5160), mload(0x4b00), f_q))mstore(0x5c00, addmod(mload(0x5b60), mload(0x5bc0), f_q)){ let result := mulmod(mload(0xde0), mload(0x4080), f_q)mstore(0x5c20, result) }mstore(0x5c40, mulmod(mload(0x5c20), mload(0x48c0), f_q))mstore(0x5c60, mulmod(sub(f_q, mload(0x5c40)), mload(0x4b20), f_q))mstore(0x5c80, mulmod(mload(0x5160), mload(0x4b20), f_q))mstore(0x5ca0, addmod(mload(0x5c00), mload(0x5c60), f_q)){ let result := mulmod(mload(0xe00), mload(0x4080), f_q)mstore(0x5cc0, result) }mstore(0x5ce0, mulmod(mload(0x5cc0), mload(0x48c0), f_q))mstore(0x5d00, mulmod(sub(f_q, mload(0x5ce0)), mload(0x4b40), f_q))mstore(0x5d20, mulmod(mload(0x5160), mload(0x4b40), f_q))mstore(0x5d40, addmod(mload(0x5ca0), mload(0x5d00), f_q)){ let result := mulmod(mload(0xe20), mload(0x4080), f_q)mstore(0x5d60, result) }mstore(0x5d80, mulmod(mload(0x5d60), mload(0x48c0), f_q))mstore(0x5da0, mulmod(sub(f_q, mload(0x5d80)), mload(0x4b60), f_q))mstore(0x5dc0, mulmod(mload(0x5160), mload(0x4b60), f_q))mstore(0x5de0, addmod(mload(0x5d40), mload(0x5da0), f_q)){ let result := mulmod(mload(0xe40), mload(0x4080), f_q)mstore(0x5e00, result) }mstore(0x5e20, mulmod(mload(0x5e00), mload(0x48c0), f_q))mstore(0x5e40, mulmod(sub(f_q, mload(0x5e20)), mload(0x4b80), f_q))mstore(0x5e60, mulmod(mload(0x5160), mload(0x4b80), f_q))mstore(0x5e80, addmod(mload(0x5de0), mload(0x5e40), f_q)){ let result := mulmod(mload(0xe60), mload(0x4080), f_q)mstore(0x5ea0, result) }mstore(0x5ec0, mulmod(mload(0x5ea0), mload(0x48c0), f_q))mstore(0x5ee0, mulmod(sub(f_q, mload(0x5ec0)), mload(0x4ba0), f_q))mstore(0x5f00, mulmod(mload(0x5160), mload(0x4ba0), f_q))mstore(0x5f20, addmod(mload(0x5e80), mload(0x5ee0), f_q)){ let result := mulmod(mload(0xe80), mload(0x4080), f_q)mstore(0x5f40, result) }mstore(0x5f60, mulmod(mload(0x5f40), mload(0x48c0), f_q))mstore(0x5f80, mulmod(sub(f_q, mload(0x5f60)), mload(0x4bc0), f_q))mstore(0x5fa0, mulmod(mload(0x5160), mload(0x4bc0), f_q))mstore(0x5fc0, addmod(mload(0x5f20), mload(0x5f80), f_q)){ let result := mulmod(mload(0xea0), mload(0x4080), f_q)mstore(0x5fe0, result) }mstore(0x6000, mulmod(mload(0x5fe0), mload(0x48c0), f_q))mstore(0x6020, mulmod(sub(f_q, mload(0x6000)), mload(0x4be0), f_q))mstore(0x6040, mulmod(mload(0x5160), mload(0x4be0), f_q))mstore(0x6060, addmod(mload(0x5fc0), mload(0x6020), f_q)){ let result := mulmod(mload(0xec0), mload(0x4080), f_q)mstore(0x6080, result) }mstore(0x60a0, mulmod(mload(0x6080), mload(0x48c0), f_q))mstore(0x60c0, mulmod(sub(f_q, mload(0x60a0)), mload(0x4c00), f_q))mstore(0x60e0, mulmod(mload(0x5160), mload(0x4c00), f_q))mstore(0x6100, addmod(mload(0x6060), mload(0x60c0), f_q)){ let result := mulmod(mload(0xee0), mload(0x4080), f_q)mstore(0x6120, result) }mstore(0x6140, mulmod(mload(0x6120), mload(0x48c0), f_q))mstore(0x6160, mulmod(sub(f_q, mload(0x6140)), mload(0x4c20), f_q))mstore(0x6180, mulmod(mload(0x5160), mload(0x4c20), f_q))mstore(0x61a0, addmod(mload(0x6100), mload(0x6160), f_q))mstore(0x61c0, mulmod(mload(0x3c60), mload(0x4660), f_q))mstore(0x61e0, mulmod(mload(0x3c80), mload(0x4660), f_q)){ let result := mulmod(mload(0x3ca0), mload(0x4080), f_q)mstore(0x6200, result) }mstore(0x6220, mulmod(mload(0x6200), mload(0x48c0), f_q))mstore(0x6240, mulmod(sub(f_q, mload(0x6220)), mload(0x4c40), f_q))mstore(0x6260, mulmod(mload(0x5160), mload(0x4c40), f_q))mstore(0x6280, mulmod(mload(0x61c0), mload(0x4c40), f_q))mstore(0x62a0, mulmod(mload(0x61e0), mload(0x4c40), f_q))mstore(0x62c0, addmod(mload(0x61a0), mload(0x6240), f_q)){ let result := mulmod(mload(0xd80), mload(0x4080), f_q)mstore(0x62e0, result) }mstore(0x6300, mulmod(mload(0x62e0), mload(0x48c0), f_q))mstore(0x6320, mulmod(sub(f_q, mload(0x6300)), mload(0x4c60), f_q))mstore(0x6340, mulmod(mload(0x5160), mload(0x4c60), f_q))mstore(0x6360, addmod(mload(0x62c0), mload(0x6320), f_q))mstore(0x6380, mulmod(mload(0x6360), mload(0x12e0), f_q))mstore(0x63a0, mulmod(mload(0x51e0), mload(0x12e0), f_q))mstore(0x63c0, mulmod(mload(0x5260), mload(0x12e0), f_q))mstore(0x63e0, mulmod(mload(0x5300), mload(0x12e0), f_q))mstore(0x6400, mulmod(mload(0x53a0), mload(0x12e0), f_q))mstore(0x6420, mulmod(mload(0x5440), mload(0x12e0), f_q))mstore(0x6440, mulmod(mload(0x54e0), mload(0x12e0), f_q))mstore(0x6460, mulmod(mload(0x5660), mload(0x12e0), f_q))mstore(0x6480, mulmod(mload(0x56e0), mload(0x12e0), f_q))mstore(0x64a0, mulmod(mload(0x5780), mload(0x12e0), f_q))mstore(0x64c0, mulmod(mload(0x5820), mload(0x12e0), f_q))mstore(0x64e0, mulmod(mload(0x58c0), mload(0x12e0), f_q))mstore(0x6500, mulmod(mload(0x5960), mload(0x12e0), f_q))mstore(0x6520, mulmod(mload(0x5a00), mload(0x12e0), f_q))mstore(0x6540, mulmod(mload(0x5aa0), mload(0x12e0), f_q))mstore(0x6560, mulmod(mload(0x5b40), mload(0x12e0), f_q))mstore(0x6580, mulmod(mload(0x5be0), mload(0x12e0), f_q))mstore(0x65a0, mulmod(mload(0x5c80), mload(0x12e0), f_q))mstore(0x65c0, mulmod(mload(0x5d20), mload(0x12e0), f_q))mstore(0x65e0, mulmod(mload(0x5dc0), mload(0x12e0), f_q))mstore(0x6600, mulmod(mload(0x5e60), mload(0x12e0), f_q))mstore(0x6620, mulmod(mload(0x5f00), mload(0x12e0), f_q))mstore(0x6640, mulmod(mload(0x5fa0), mload(0x12e0), f_q))mstore(0x6660, mulmod(mload(0x6040), mload(0x12e0), f_q))mstore(0x6680, mulmod(mload(0x60e0), mload(0x12e0), f_q))mstore(0x66a0, mulmod(mload(0x6180), mload(0x12e0), f_q))mstore(0x66c0, mulmod(mload(0x6260), mload(0x12e0), f_q))mstore(0x66e0, mulmod(mload(0x6280), mload(0x12e0), f_q))mstore(0x6700, mulmod(mload(0x62a0), mload(0x12e0), f_q))mstore(0x6720, mulmod(mload(0x6340), mload(0x12e0), f_q))mstore(0x6740, addmod(mload(0x50a0), mload(0x6380), f_q))mstore(0x6760, mulmod(1, mload(0x46a0), f_q)){ let result := mulmod(mload(0xf00), mload(0x40e0), f_q)result := addmod(mulmod(mload(0xf20), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0xf40), mload(0x41a0), f_q), result, f_q)mstore(0x6780, result) }mstore(0x67a0, mulmod(mload(0x6780), mload(0x48e0), f_q))mstore(0x67c0, mulmod(sub(f_q, mload(0x67a0)), 1, f_q))mstore(0x67e0, mulmod(mload(0x6760), 1, f_q)){ let result := mulmod(mload(0xf60), mload(0x40e0), f_q)result := addmod(mulmod(mload(0xf80), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0xfa0), mload(0x41a0), f_q), result, f_q)mstore(0x6800, result) }mstore(0x6820, mulmod(mload(0x6800), mload(0x48e0), f_q))mstore(0x6840, mulmod(sub(f_q, mload(0x6820)), mload(0x1280), f_q))mstore(0x6860, mulmod(mload(0x6760), mload(0x1280), f_q))mstore(0x6880, addmod(mload(0x67c0), mload(0x6840), f_q)){ let result := mulmod(mload(0xfc0), mload(0x40e0), f_q)result := addmod(mulmod(mload(0xfe0), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0x1000), mload(0x41a0), f_q), result, f_q)mstore(0x68a0, result) }mstore(0x68c0, mulmod(mload(0x68a0), mload(0x48e0), f_q))mstore(0x68e0, mulmod(sub(f_q, mload(0x68c0)), mload(0x4940), f_q))mstore(0x6900, mulmod(mload(0x6760), mload(0x4940), f_q))mstore(0x6920, addmod(mload(0x6880), mload(0x68e0), f_q)){ let result := mulmod(mload(0x1020), mload(0x40e0), f_q)result := addmod(mulmod(mload(0x1040), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0x1060), mload(0x41a0), f_q), result, f_q)mstore(0x6940, result) }mstore(0x6960, mulmod(mload(0x6940), mload(0x48e0), f_q))mstore(0x6980, mulmod(sub(f_q, mload(0x6960)), mload(0x4960), f_q))mstore(0x69a0, mulmod(mload(0x6760), mload(0x4960), f_q))mstore(0x69c0, addmod(mload(0x6920), mload(0x6980), f_q)){ let result := mulmod(mload(0x1080), mload(0x40e0), f_q)result := addmod(mulmod(mload(0x10a0), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0x10c0), mload(0x41a0), f_q), result, f_q)mstore(0x69e0, result) }mstore(0x6a00, mulmod(mload(0x69e0), mload(0x48e0), f_q))mstore(0x6a20, mulmod(sub(f_q, mload(0x6a00)), mload(0x4980), f_q))mstore(0x6a40, mulmod(mload(0x6760), mload(0x4980), f_q))mstore(0x6a60, addmod(mload(0x69c0), mload(0x6a20), f_q))mstore(0x6a80, mulmod(mload(0x6a60), mload(0x4ca0), f_q))mstore(0x6aa0, mulmod(mload(0x67e0), mload(0x4ca0), f_q))mstore(0x6ac0, mulmod(mload(0x6860), mload(0x4ca0), f_q))mstore(0x6ae0, mulmod(mload(0x6900), mload(0x4ca0), f_q))mstore(0x6b00, mulmod(mload(0x69a0), mload(0x4ca0), f_q))mstore(0x6b20, mulmod(mload(0x6a40), mload(0x4ca0), f_q))mstore(0x6b40, addmod(mload(0x6740), mload(0x6a80), f_q))mstore(0x6b60, mulmod(1, mload(0x46e0), f_q)){ let result := mulmod(mload(0x10e0), mload(0x4220), f_q)result := addmod(mulmod(mload(0x1100), mload(0x4280), f_q), result, f_q)mstore(0x6b80, result) }mstore(0x6ba0, mulmod(mload(0x6b80), mload(0x4900), f_q))mstore(0x6bc0, mulmod(sub(f_q, mload(0x6ba0)), 1, f_q))mstore(0x6be0, mulmod(mload(0x6b60), 1, f_q)){ let result := mulmod(mload(0x1120), mload(0x4220), f_q)result := addmod(mulmod(mload(0x1140), mload(0x4280), f_q), result, f_q)mstore(0x6c00, result) }mstore(0x6c20, mulmod(mload(0x6c00), mload(0x4900), f_q))mstore(0x6c40, mulmod(sub(f_q, mload(0x6c20)), mload(0x1280), f_q))mstore(0x6c60, mulmod(mload(0x6b60), mload(0x1280), f_q))mstore(0x6c80, addmod(mload(0x6bc0), mload(0x6c40), f_q)){ let result := mulmod(mload(0x11c0), mload(0x4220), f_q)result := addmod(mulmod(mload(0x11e0), mload(0x4280), f_q), result, f_q)mstore(0x6ca0, result) }mstore(0x6cc0, mulmod(mload(0x6ca0), mload(0x4900), f_q))mstore(0x6ce0, mulmod(sub(f_q, mload(0x6cc0)), mload(0x4940), f_q))mstore(0x6d00, mulmod(mload(0x6b60), mload(0x4940), f_q))mstore(0x6d20, addmod(mload(0x6c80), mload(0x6ce0), f_q))mstore(0x6d40, mulmod(mload(0x6d20), mload(0x4cc0), f_q))mstore(0x6d60, mulmod(mload(0x6be0), mload(0x4cc0), f_q))mstore(0x6d80, mulmod(mload(0x6c60), mload(0x4cc0), f_q))mstore(0x6da0, mulmod(mload(0x6d00), mload(0x4cc0), f_q))mstore(0x6dc0, addmod(mload(0x6b40), mload(0x6d40), f_q))mstore(0x6de0, mulmod(1, mload(0x4720), f_q)){ let result := mulmod(mload(0x1160), mload(0x42e0), f_q)result := addmod(mulmod(mload(0x1180), mload(0x4340), f_q), result, f_q)mstore(0x6e00, result) }mstore(0x6e20, mulmod(mload(0x6e00), mload(0x4920), f_q))mstore(0x6e40, mulmod(sub(f_q, mload(0x6e20)), 1, f_q))mstore(0x6e60, mulmod(mload(0x6de0), 1, f_q)){ let result := mulmod(mload(0x1200), mload(0x42e0), f_q)result := addmod(mulmod(mload(0x1220), mload(0x4340), f_q), result, f_q)mstore(0x6e80, result) }mstore(0x6ea0, mulmod(mload(0x6e80), mload(0x4920), f_q))mstore(0x6ec0, mulmod(sub(f_q, mload(0x6ea0)), mload(0x1280), f_q))mstore(0x6ee0, mulmod(mload(0x6de0), mload(0x1280), f_q))mstore(0x6f00, addmod(mload(0x6e40), mload(0x6ec0), f_q))mstore(0x6f20, mulmod(mload(0x6f00), mload(0x4ce0), f_q))mstore(0x6f40, mulmod(mload(0x6e60), mload(0x4ce0), f_q))mstore(0x6f60, mulmod(mload(0x6ee0), mload(0x4ce0), f_q))mstore(0x6f80, addmod(mload(0x6dc0), mload(0x6f20), f_q))mstore(0x6fa0, mulmod(1, mload(0x4060), f_q))mstore(0x6fc0, mulmod(1, mload(0x1380), f_q))mstore(0x6fe0, 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(0x7000, 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(0x7020, mload(0x6f80))success := and(eq(staticcall(gas(), 0x7, 0x6fe0, 0x60, 0x6fe0, 0x40), 1), success)mstore(0x7040, mload(0x6fe0)) mstore(0x7060, mload(0x7000))mstore(0x7080, mload(0xc0)) mstore(0x70a0, mload(0xe0))success := and(eq(staticcall(gas(), 0x6, 0x7040, 0x80, 0x7040, 0x40), 1), success)mstore(0x70c0, mload(0x100)) mstore(0x70e0, mload(0x120))mstore(0x7100, mload(0x50c0))success := and(eq(staticcall(gas(), 0x7, 0x70c0, 0x60, 0x70c0, 0x40), 1), success)mstore(0x7120, mload(0x7040)) mstore(0x7140, mload(0x7060))mstore(0x7160, mload(0x70c0)) mstore(0x7180, mload(0x70e0))success := and(eq(staticcall(gas(), 0x6, 0x7120, 0x80, 0x7120, 0x40), 1), success)mstore(0x71a0, mload(0x140)) mstore(0x71c0, mload(0x160))mstore(0x71e0, mload(0x50e0))success := and(eq(staticcall(gas(), 0x7, 0x71a0, 0x60, 0x71a0, 0x40), 1), success)mstore(0x7200, mload(0x7120)) mstore(0x7220, mload(0x7140))mstore(0x7240, mload(0x71a0)) mstore(0x7260, mload(0x71c0))success := and(eq(staticcall(gas(), 0x6, 0x7200, 0x80, 0x7200, 0x40), 1), success)mstore(0x7280, mload(0x180)) mstore(0x72a0, mload(0x1a0))mstore(0x72c0, mload(0x5100))success := and(eq(staticcall(gas(), 0x7, 0x7280, 0x60, 0x7280, 0x40), 1), success)mstore(0x72e0, mload(0x7200)) mstore(0x7300, mload(0x7220))mstore(0x7320, mload(0x7280)) mstore(0x7340, mload(0x72a0))success := and(eq(staticcall(gas(), 0x6, 0x72e0, 0x80, 0x72e0, 0x40), 1), success)mstore(0x7360, mload(0x1c0)) mstore(0x7380, mload(0x1e0))mstore(0x73a0, mload(0x5120))success := and(eq(staticcall(gas(), 0x7, 0x7360, 0x60, 0x7360, 0x40), 1), success)mstore(0x73c0, mload(0x72e0)) mstore(0x73e0, mload(0x7300))mstore(0x7400, mload(0x7360)) mstore(0x7420, mload(0x7380))success := and(eq(staticcall(gas(), 0x6, 0x73c0, 0x80, 0x73c0, 0x40), 1), success)mstore(0x7440, mload(0x200)) mstore(0x7460, mload(0x220))mstore(0x7480, mload(0x5140))success := and(eq(staticcall(gas(), 0x7, 0x7440, 0x60, 0x7440, 0x40), 1), success)mstore(0x74a0, mload(0x73c0)) mstore(0x74c0, mload(0x73e0))mstore(0x74e0, mload(0x7440)) mstore(0x7500, mload(0x7460))success := and(eq(staticcall(gas(), 0x6, 0x74a0, 0x80, 0x74a0, 0x40), 1), success)mstore(0x7520, mload(0x240)) mstore(0x7540, mload(0x260))mstore(0x7560, mload(0x63a0))success := and(eq(staticcall(gas(), 0x7, 0x7520, 0x60, 0x7520, 0x40), 1), success)mstore(0x7580, mload(0x74a0)) mstore(0x75a0, mload(0x74c0))mstore(0x75c0, mload(0x7520)) mstore(0x75e0, mload(0x7540))success := and(eq(staticcall(gas(), 0x6, 0x7580, 0x80, 0x7580, 0x40), 1), success)mstore(0x7600, mload(0x280)) mstore(0x7620, mload(0x2a0))mstore(0x7640, mload(0x63c0))success := and(eq(staticcall(gas(), 0x7, 0x7600, 0x60, 0x7600, 0x40), 1), success)mstore(0x7660, mload(0x7580)) mstore(0x7680, mload(0x75a0))mstore(0x76a0, mload(0x7600)) mstore(0x76c0, mload(0x7620))success := and(eq(staticcall(gas(), 0x6, 0x7660, 0x80, 0x7660, 0x40), 1), success)mstore(0x76e0, mload(0x2c0)) mstore(0x7700, mload(0x2e0))mstore(0x7720, mload(0x63e0))success := and(eq(staticcall(gas(), 0x7, 0x76e0, 0x60, 0x76e0, 0x40), 1), success)mstore(0x7740, mload(0x7660)) mstore(0x7760, mload(0x7680))mstore(0x7780, mload(0x76e0)) mstore(0x77a0, mload(0x7700))success := and(eq(staticcall(gas(), 0x6, 0x7740, 0x80, 0x7740, 0x40), 1), success)mstore(0x77c0, mload(0x3a0)) mstore(0x77e0, mload(0x3c0))mstore(0x7800, mload(0x6400))success := and(eq(staticcall(gas(), 0x7, 0x77c0, 0x60, 0x77c0, 0x40), 1), success)mstore(0x7820, mload(0x7740)) mstore(0x7840, mload(0x7760))mstore(0x7860, mload(0x77c0)) mstore(0x7880, mload(0x77e0))success := and(eq(staticcall(gas(), 0x6, 0x7820, 0x80, 0x7820, 0x40), 1), success)mstore(0x78a0, mload(0x420)) mstore(0x78c0, mload(0x440))mstore(0x78e0, mload(0x6420))success := and(eq(staticcall(gas(), 0x7, 0x78a0, 0x60, 0x78a0, 0x40), 1), success)mstore(0x7900, mload(0x7820)) mstore(0x7920, mload(0x7840))mstore(0x7940, mload(0x78a0)) mstore(0x7960, mload(0x78c0))success := and(eq(staticcall(gas(), 0x6, 0x7900, 0x80, 0x7900, 0x40), 1), success)mstore(0x7980, 0x0d3b7c04b7391ddf5d9fc5f8906033e1d1442f341c4cab5c1584c8082ea8c21c) mstore(0x79a0, 0x1596df7247ab32fb79261c31617e2f2bbde95b6e8719386dacfeaa8f6d7df60c)mstore(0x79c0, mload(0x6440))success := and(eq(staticcall(gas(), 0x7, 0x7980, 0x60, 0x7980, 0x40), 1), success)mstore(0x79e0, mload(0x7900)) mstore(0x7a00, mload(0x7920))mstore(0x7a20, mload(0x7980)) mstore(0x7a40, mload(0x79a0))success := and(eq(staticcall(gas(), 0x6, 0x79e0, 0x80, 0x79e0, 0x40), 1), success)mstore(0x7a60, 0x04d043081f0d55eead6d8ad7b10d09a6ee2718f445d9bce454075a8a37bacaf3) mstore(0x7a80, 0x27d6bcbb02cd624ab80b5532a0a65fc6f88a0faf7cf3e0d106f4aa0aa25e758b)mstore(0x7aa0, mload(0x6460))success := and(eq(staticcall(gas(), 0x7, 0x7a60, 0x60, 0x7a60, 0x40), 1), success)mstore(0x7ac0, mload(0x79e0)) mstore(0x7ae0, mload(0x7a00))mstore(0x7b00, mload(0x7a60)) mstore(0x7b20, mload(0x7a80))success := and(eq(staticcall(gas(), 0x6, 0x7ac0, 0x80, 0x7ac0, 0x40), 1), success)mstore(0x7b40, 0x2d07a1bca289cdb98b648a91cbb0809dfa3a06fe01047b291d1161ddf8d1732c) mstore(0x7b60, 0x021d078d5869c57b3fe2413b517561205de5f297ac56c0e5ef0f1a7f4a31ee94)mstore(0x7b80, mload(0x6480))success := and(eq(staticcall(gas(), 0x7, 0x7b40, 0x60, 0x7b40, 0x40), 1), success)mstore(0x7ba0, mload(0x7ac0)) mstore(0x7bc0, mload(0x7ae0))mstore(0x7be0, mload(0x7b40)) mstore(0x7c00, mload(0x7b60))success := and(eq(staticcall(gas(), 0x6, 0x7ba0, 0x80, 0x7ba0, 0x40), 1), success)mstore(0x7c20, 0x2808de5f33581574dd857304add28f30335fa32c49a3d7c9128f5a3f453360cc) mstore(0x7c40, 0x07f10d421231cb6aa063db7a3cf7be709ff037fbb78d19c866d7c2c674a1aaf0)mstore(0x7c60, mload(0x64a0))success := and(eq(staticcall(gas(), 0x7, 0x7c20, 0x60, 0x7c20, 0x40), 1), success)mstore(0x7c80, mload(0x7ba0)) mstore(0x7ca0, mload(0x7bc0))mstore(0x7cc0, mload(0x7c20)) mstore(0x7ce0, mload(0x7c40))success := and(eq(staticcall(gas(), 0x6, 0x7c80, 0x80, 0x7c80, 0x40), 1), success)mstore(0x7d00, 0x2a9d8bc0a06a141e47fa114e4e62686823227f5416f19f9b2b54b9948a0bfb4b) mstore(0x7d20, 0x170610ca7497030a3dbbfeb52cc8f5f086e7a7a91e3b52e44988e6b24f1c6c34)mstore(0x7d40, mload(0x64c0))success := and(eq(staticcall(gas(), 0x7, 0x7d00, 0x60, 0x7d00, 0x40), 1), success)mstore(0x7d60, mload(0x7c80)) mstore(0x7d80, mload(0x7ca0))mstore(0x7da0, mload(0x7d00)) mstore(0x7dc0, mload(0x7d20))success := and(eq(staticcall(gas(), 0x6, 0x7d60, 0x80, 0x7d60, 0x40), 1), success)mstore(0x7de0, 0x104eb8e796d7c0b0ac9eb316eac3aadbcf9ac5b42d4b14a95ec269fefd70d9ac) mstore(0x7e00, 0x22e1365078923b7f828a54c75e0b0b108c311580bac730c92d8868c7781a917b)mstore(0x7e20, mload(0x64e0))success := and(eq(staticcall(gas(), 0x7, 0x7de0, 0x60, 0x7de0, 0x40), 1), success)mstore(0x7e40, mload(0x7d60)) mstore(0x7e60, mload(0x7d80))mstore(0x7e80, mload(0x7de0)) mstore(0x7ea0, mload(0x7e00))success := and(eq(staticcall(gas(), 0x6, 0x7e40, 0x80, 0x7e40, 0x40), 1), success)mstore(0x7ec0, 0x2e8f499835598c80e2ec4cabd4753e67822df35d0a29c05b60dca21d9173b11a) mstore(0x7ee0, 0x02990fa09b4831443e5956b84832f525976cd30aa6cafe055a45f7a04328d00f)mstore(0x7f00, mload(0x6500))success := and(eq(staticcall(gas(), 0x7, 0x7ec0, 0x60, 0x7ec0, 0x40), 1), success)mstore(0x7f20, mload(0x7e40)) mstore(0x7f40, mload(0x7e60))mstore(0x7f60, mload(0x7ec0)) mstore(0x7f80, mload(0x7ee0))success := and(eq(staticcall(gas(), 0x6, 0x7f20, 0x80, 0x7f20, 0x40), 1), success)mstore(0x7fa0, 0x258bbf1a0f256c29c1cee612fb7deaa2102870b85d7bda1ac8064307a593101f) mstore(0x7fc0, 0x2bbbde7d34cf03b70ea4a0125d6736aeb56da64f07226bf4d662a85e8d50db3a)mstore(0x7fe0, mload(0x6520))success := and(eq(staticcall(gas(), 0x7, 0x7fa0, 0x60, 0x7fa0, 0x40), 1), success)mstore(0x8000, mload(0x7f20)) mstore(0x8020, mload(0x7f40))mstore(0x8040, mload(0x7fa0)) mstore(0x8060, mload(0x7fc0))success := and(eq(staticcall(gas(), 0x6, 0x8000, 0x80, 0x8000, 0x40), 1), success)mstore(0x8080, 0x05127b4a2ff58c747435761c7256b8094a0cf4e6d0f829a060c601d5cce0fdc0) mstore(0x80a0, 0x106a8cecab556f1a6d729cdeefd6dd70afbe4954cae4785871d68396dba88d95)mstore(0x80c0, mload(0x6540))success := and(eq(staticcall(gas(), 0x7, 0x8080, 0x60, 0x8080, 0x40), 1), success)mstore(0x80e0, mload(0x8000)) mstore(0x8100, mload(0x8020))mstore(0x8120, mload(0x8080)) mstore(0x8140, mload(0x80a0))success := and(eq(staticcall(gas(), 0x6, 0x80e0, 0x80, 0x80e0, 0x40), 1), success)mstore(0x8160, 0x24c985411f901ba3e9fe3296d58db7a896d53a060afc4c3b85182122d2a06b16) mstore(0x8180, 0x1e02136b244f617c37779b0cb970dce25ff03579c671e7f3f57a320e7b1a4b06)mstore(0x81a0, mload(0x6560))success := and(eq(staticcall(gas(), 0x7, 0x8160, 0x60, 0x8160, 0x40), 1), success)mstore(0x81c0, mload(0x80e0)) mstore(0x81e0, mload(0x8100))mstore(0x8200, mload(0x8160)) mstore(0x8220, mload(0x8180))success := and(eq(staticcall(gas(), 0x6, 0x81c0, 0x80, 0x81c0, 0x40), 1), success)mstore(0x8240, 0x0e5c5a486399e328a6629926a042fde07863ce1a2e91995ee60e5c477008ebdc) mstore(0x8260, 0x223b4bdd8d3877955728258fd5be1b7f2ac8093891a83c738f80395720cc55ca)mstore(0x8280, mload(0x6580))success := and(eq(staticcall(gas(), 0x7, 0x8240, 0x60, 0x8240, 0x40), 1), success)mstore(0x82a0, mload(0x81c0)) mstore(0x82c0, mload(0x81e0))mstore(0x82e0, mload(0x8240)) mstore(0x8300, mload(0x8260))success := and(eq(staticcall(gas(), 0x6, 0x82a0, 0x80, 0x82a0, 0x40), 1), success)mstore(0x8320, 0x2e55f008e10b629fc37b0808b8264d2857e6fa34a1be704a4132f9c1621b8736) mstore(0x8340, 0x01c3487db12618c270ffe8251633753bdad9fd2968144a02b18447bee326d19d)mstore(0x8360, mload(0x65a0))success := and(eq(staticcall(gas(), 0x7, 0x8320, 0x60, 0x8320, 0x40), 1), success)mstore(0x8380, mload(0x82a0)) mstore(0x83a0, mload(0x82c0))mstore(0x83c0, mload(0x8320)) mstore(0x83e0, mload(0x8340))success := and(eq(staticcall(gas(), 0x6, 0x8380, 0x80, 0x8380, 0x40), 1), success)mstore(0x8400, 0x0154bffa5c54063b60c4f4c66b2a9acb09fd7f1b2653a9f2b9ee75bcb1bc8ba2) mstore(0x8420, 0x0b15f039df5ebe088e2231ce9a07c50dbb4739402712b56dd8bab6ab93a95f3f)mstore(0x8440, mload(0x65c0))success := and(eq(staticcall(gas(), 0x7, 0x8400, 0x60, 0x8400, 0x40), 1), success)mstore(0x8460, mload(0x8380)) mstore(0x8480, mload(0x83a0))mstore(0x84a0, mload(0x8400)) mstore(0x84c0, mload(0x8420))success := and(eq(staticcall(gas(), 0x6, 0x8460, 0x80, 0x8460, 0x40), 1), success)mstore(0x84e0, 0x0032a37f146820eccad7796039d21d0c85504baff34e194f750d7f8c4eccf729) mstore(0x8500, 0x2a655340cddc523abd37c3d77f022b8e616194a3c31e414dc5d466eb2e4c0b69)mstore(0x8520, mload(0x65e0))success := and(eq(staticcall(gas(), 0x7, 0x84e0, 0x60, 0x84e0, 0x40), 1), success)mstore(0x8540, mload(0x8460)) mstore(0x8560, mload(0x8480))mstore(0x8580, mload(0x84e0)) mstore(0x85a0, mload(0x8500))success := and(eq(staticcall(gas(), 0x6, 0x8540, 0x80, 0x8540, 0x40), 1), success)mstore(0x85c0, 0x0d6b367e25327ebd99fae2aaffa6fad2acae34ba7b329ef817a95fe425f65e4d) mstore(0x85e0, 0x2bc4769ce00a494fde791f07b3f092019995d323c0b067d61e0660e1ad84d94f)mstore(0x8600, mload(0x6600))success := and(eq(staticcall(gas(), 0x7, 0x85c0, 0x60, 0x85c0, 0x40), 1), success)mstore(0x8620, mload(0x8540)) mstore(0x8640, mload(0x8560))mstore(0x8660, mload(0x85c0)) mstore(0x8680, mload(0x85e0))success := and(eq(staticcall(gas(), 0x6, 0x8620, 0x80, 0x8620, 0x40), 1), success)mstore(0x86a0, 0x0fef43d29ecdb947fc934c7adf7f38748fe212082d5a8e3bc621ff907213812b) mstore(0x86c0, 0x1ab8ccbb8486a5508a34837db62c3426d6f6210970a2b1351f12d0ba73e11874)mstore(0x86e0, mload(0x6620))success := and(eq(staticcall(gas(), 0x7, 0x86a0, 0x60, 0x86a0, 0x40), 1), success)mstore(0x8700, mload(0x8620)) mstore(0x8720, mload(0x8640))mstore(0x8740, mload(0x86a0)) mstore(0x8760, mload(0x86c0))success := and(eq(staticcall(gas(), 0x6, 0x8700, 0x80, 0x8700, 0x40), 1), success)mstore(0x8780, 0x29cc03da3870fc7139115d43275baf04cc110d79f85d2c2e712b981c409df25e) mstore(0x87a0, 0x016a8cd002e522595ef910f87dc707449ae5f56876eb88274b2e586fceacf165)mstore(0x87c0, mload(0x6640))success := and(eq(staticcall(gas(), 0x7, 0x8780, 0x60, 0x8780, 0x40), 1), success)mstore(0x87e0, mload(0x8700)) mstore(0x8800, mload(0x8720))mstore(0x8820, mload(0x8780)) mstore(0x8840, mload(0x87a0))success := and(eq(staticcall(gas(), 0x6, 0x87e0, 0x80, 0x87e0, 0x40), 1), success)mstore(0x8860, 0x0ec6d72e2ce7c233ca8af2fc2bd4223a6d81d545e8785579de4cb241740f36a2) mstore(0x8880, 0x028a4450999577e25fc7d191fecf7f1a8a0526f7e042f316767c7ff43299fdd9)mstore(0x88a0, mload(0x6660))success := and(eq(staticcall(gas(), 0x7, 0x8860, 0x60, 0x8860, 0x40), 1), success)mstore(0x88c0, mload(0x87e0)) mstore(0x88e0, mload(0x8800))mstore(0x8900, mload(0x8860)) mstore(0x8920, mload(0x8880))success := and(eq(staticcall(gas(), 0x6, 0x88c0, 0x80, 0x88c0, 0x40), 1), success)mstore(0x8940, 0x1fdb57cefe9c10024dfe402759cad8061e8d0edeba3f42f187ea796b1938118e) mstore(0x8960, 0x1294d92ed67eec88a2adbb5cef0682a64fae9827c02d37e69beaddd3b6a145ad)mstore(0x8980, mload(0x6680))success := and(eq(staticcall(gas(), 0x7, 0x8940, 0x60, 0x8940, 0x40), 1), success)mstore(0x89a0, mload(0x88c0)) mstore(0x89c0, mload(0x88e0))mstore(0x89e0, mload(0x8940)) mstore(0x8a00, mload(0x8960))success := and(eq(staticcall(gas(), 0x6, 0x89a0, 0x80, 0x89a0, 0x40), 1), success)mstore(0x8a20, 0x292267e75402bf3fb816d404fe987ec7b277ec539cd653568a31dc8fdd04b6f1) mstore(0x8a40, 0x0a2975f29c8f29df52ea4e941daa28752eea2da8c6b6135622e4a0d823accd78)mstore(0x8a60, mload(0x66a0))success := and(eq(staticcall(gas(), 0x7, 0x8a20, 0x60, 0x8a20, 0x40), 1), success)mstore(0x8a80, mload(0x89a0)) mstore(0x8aa0, mload(0x89c0))mstore(0x8ac0, mload(0x8a20)) mstore(0x8ae0, mload(0x8a40))success := and(eq(staticcall(gas(), 0x6, 0x8a80, 0x80, 0x8a80, 0x40), 1), success)mstore(0x8b00, mload(0x7c0)) mstore(0x8b20, mload(0x7e0))mstore(0x8b40, mload(0x66c0))success := and(eq(staticcall(gas(), 0x7, 0x8b00, 0x60, 0x8b00, 0x40), 1), success)mstore(0x8b60, mload(0x8a80)) mstore(0x8b80, mload(0x8aa0))mstore(0x8ba0, mload(0x8b00)) mstore(0x8bc0, mload(0x8b20))success := and(eq(staticcall(gas(), 0x6, 0x8b60, 0x80, 0x8b60, 0x40), 1), success)mstore(0x8be0, mload(0x800)) mstore(0x8c00, mload(0x820))mstore(0x8c20, mload(0x66e0))success := and(eq(staticcall(gas(), 0x7, 0x8be0, 0x60, 0x8be0, 0x40), 1), success)mstore(0x8c40, mload(0x8b60)) mstore(0x8c60, mload(0x8b80))mstore(0x8c80, mload(0x8be0)) mstore(0x8ca0, mload(0x8c00))success := and(eq(staticcall(gas(), 0x6, 0x8c40, 0x80, 0x8c40, 0x40), 1), success)mstore(0x8cc0, mload(0x840)) mstore(0x8ce0, mload(0x860))mstore(0x8d00, mload(0x6700))success := and(eq(staticcall(gas(), 0x7, 0x8cc0, 0x60, 0x8cc0, 0x40), 1), success)mstore(0x8d20, mload(0x8c40)) mstore(0x8d40, mload(0x8c60))mstore(0x8d60, mload(0x8cc0)) mstore(0x8d80, mload(0x8ce0))success := and(eq(staticcall(gas(), 0x6, 0x8d20, 0x80, 0x8d20, 0x40), 1), success)mstore(0x8da0, mload(0x720)) mstore(0x8dc0, mload(0x740))mstore(0x8de0, mload(0x6720))success := and(eq(staticcall(gas(), 0x7, 0x8da0, 0x60, 0x8da0, 0x40), 1), success)mstore(0x8e00, mload(0x8d20)) mstore(0x8e20, mload(0x8d40))mstore(0x8e40, mload(0x8da0)) mstore(0x8e60, mload(0x8dc0))success := and(eq(staticcall(gas(), 0x6, 0x8e00, 0x80, 0x8e00, 0x40), 1), success)mstore(0x8e80, mload(0x520)) mstore(0x8ea0, mload(0x540))mstore(0x8ec0, mload(0x6aa0))success := and(eq(staticcall(gas(), 0x7, 0x8e80, 0x60, 0x8e80, 0x40), 1), success)mstore(0x8ee0, mload(0x8e00)) mstore(0x8f00, mload(0x8e20))mstore(0x8f20, mload(0x8e80)) mstore(0x8f40, mload(0x8ea0))success := and(eq(staticcall(gas(), 0x6, 0x8ee0, 0x80, 0x8ee0, 0x40), 1), success)mstore(0x8f60, mload(0x560)) mstore(0x8f80, mload(0x580))mstore(0x8fa0, mload(0x6ac0))success := and(eq(staticcall(gas(), 0x7, 0x8f60, 0x60, 0x8f60, 0x40), 1), success)mstore(0x8fc0, mload(0x8ee0)) mstore(0x8fe0, mload(0x8f00))mstore(0x9000, mload(0x8f60)) mstore(0x9020, mload(0x8f80))success := and(eq(staticcall(gas(), 0x6, 0x8fc0, 0x80, 0x8fc0, 0x40), 1), success)mstore(0x9040, mload(0x5a0)) mstore(0x9060, mload(0x5c0))mstore(0x9080, mload(0x6ae0))success := and(eq(staticcall(gas(), 0x7, 0x9040, 0x60, 0x9040, 0x40), 1), success)mstore(0x90a0, mload(0x8fc0)) mstore(0x90c0, mload(0x8fe0))mstore(0x90e0, mload(0x9040)) mstore(0x9100, mload(0x9060))success := and(eq(staticcall(gas(), 0x6, 0x90a0, 0x80, 0x90a0, 0x40), 1), success)mstore(0x9120, mload(0x5e0)) mstore(0x9140, mload(0x600))mstore(0x9160, mload(0x6b00))success := and(eq(staticcall(gas(), 0x7, 0x9120, 0x60, 0x9120, 0x40), 1), success)mstore(0x9180, mload(0x90a0)) mstore(0x91a0, mload(0x90c0))mstore(0x91c0, mload(0x9120)) mstore(0x91e0, mload(0x9140))success := and(eq(staticcall(gas(), 0x6, 0x9180, 0x80, 0x9180, 0x40), 1), success)mstore(0x9200, mload(0x620)) mstore(0x9220, mload(0x640))mstore(0x9240, mload(0x6b20))success := and(eq(staticcall(gas(), 0x7, 0x9200, 0x60, 0x9200, 0x40), 1), success)mstore(0x9260, mload(0x9180)) mstore(0x9280, mload(0x91a0))mstore(0x92a0, mload(0x9200)) mstore(0x92c0, mload(0x9220))success := and(eq(staticcall(gas(), 0x6, 0x9260, 0x80, 0x9260, 0x40), 1), success)mstore(0x92e0, mload(0x660)) mstore(0x9300, mload(0x680))mstore(0x9320, mload(0x6d60))success := and(eq(staticcall(gas(), 0x7, 0x92e0, 0x60, 0x92e0, 0x40), 1), success)mstore(0x9340, mload(0x9260)) mstore(0x9360, mload(0x9280))mstore(0x9380, mload(0x92e0)) mstore(0x93a0, mload(0x9300))success := and(eq(staticcall(gas(), 0x6, 0x9340, 0x80, 0x9340, 0x40), 1), success)mstore(0x93c0, mload(0x6a0)) mstore(0x93e0, mload(0x6c0))mstore(0x9400, mload(0x6d80))success := and(eq(staticcall(gas(), 0x7, 0x93c0, 0x60, 0x93c0, 0x40), 1), success)mstore(0x9420, mload(0x9340)) mstore(0x9440, mload(0x9360))mstore(0x9460, mload(0x93c0)) mstore(0x9480, mload(0x93e0))success := and(eq(staticcall(gas(), 0x6, 0x9420, 0x80, 0x9420, 0x40), 1), success)mstore(0x94a0, mload(0x6e0)) mstore(0x94c0, mload(0x700))mstore(0x94e0, mload(0x6da0))success := and(eq(staticcall(gas(), 0x7, 0x94a0, 0x60, 0x94a0, 0x40), 1), success)mstore(0x9500, mload(0x9420)) mstore(0x9520, mload(0x9440))mstore(0x9540, mload(0x94a0)) mstore(0x9560, mload(0x94c0))success := and(eq(staticcall(gas(), 0x6, 0x9500, 0x80, 0x9500, 0x40), 1), success)mstore(0x9580, mload(0x360)) mstore(0x95a0, mload(0x380))mstore(0x95c0, mload(0x6f40))success := and(eq(staticcall(gas(), 0x7, 0x9580, 0x60, 0x9580, 0x40), 1), success)mstore(0x95e0, mload(0x9500)) mstore(0x9600, mload(0x9520))mstore(0x9620, mload(0x9580)) mstore(0x9640, mload(0x95a0))success := and(eq(staticcall(gas(), 0x6, 0x95e0, 0x80, 0x95e0, 0x40), 1), success)mstore(0x9660, mload(0x3e0)) mstore(0x9680, mload(0x400))mstore(0x96a0, mload(0x6f60))success := and(eq(staticcall(gas(), 0x7, 0x9660, 0x60, 0x9660, 0x40), 1), success)mstore(0x96c0, mload(0x95e0)) mstore(0x96e0, mload(0x9600))mstore(0x9700, mload(0x9660)) mstore(0x9720, mload(0x9680))success := and(eq(staticcall(gas(), 0x6, 0x96c0, 0x80, 0x96c0, 0x40), 1), success)mstore(0x9740, mload(0x1320)) mstore(0x9760, mload(0x1340))mstore(0x9780, sub(f_q, mload(0x6fa0)))success := and(eq(staticcall(gas(), 0x7, 0x9740, 0x60, 0x9740, 0x40), 1), success)mstore(0x97a0, mload(0x96c0)) mstore(0x97c0, mload(0x96e0))mstore(0x97e0, mload(0x9740)) mstore(0x9800, mload(0x9760))success := and(eq(staticcall(gas(), 0x6, 0x97a0, 0x80, 0x97a0, 0x40), 1), success)mstore(0x9820, mload(0x13c0)) mstore(0x9840, mload(0x13e0))mstore(0x9860, mload(0x6fc0))success := and(eq(staticcall(gas(), 0x7, 0x9820, 0x60, 0x9820, 0x40), 1), success)mstore(0x9880, mload(0x97a0)) mstore(0x98a0, mload(0x97c0))mstore(0x98c0, mload(0x9820)) mstore(0x98e0, mload(0x9840))success := and(eq(staticcall(gas(), 0x6, 0x9880, 0x80, 0x9880, 0x40), 1), success)mstore(0x9900, mload(0x9880)) mstore(0x9920, mload(0x98a0))mstore(0x9940, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(0x9960, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(0x9980, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(0x99a0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(0x99c0, mload(0x13c0)) mstore(0x99e0, mload(0x13e0))mstore(0x9a00, 0x0181624e80f3d6ae28df7e01eaeab1c0e919877a3b8a6b7fbc69a6817d596ea2) mstore(0x9a20, 0x1783d30dcb12d259bb89098addf6280fa4b653be7a152542a28f7b926e27e648) mstore(0x9a40, 0x00ae44489d41a0d179e2dfdc03bddd883b7109f8b6ae316a59e815c1a6b35304) mstore(0x9a60, 0x0b2147ab62a386bd63e6de1522109b8c9588ab466f5aadfde8c41ca3749423ee)success := and(eq(staticcall(gas(), 0x8, 0x9900, 0x180, 0x9900, 0x20), 1), success)success := and(eq(mload(0x9900), 1), success) // Revert if anything fails if iszero(success) { revert(0, 0) }} return success; } } + 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(0x80, 697977589985395630139925574281256772762542249956921372363329126037282444860) { let x := calldataload(0x64) mstore(0xc0, x) let y := calldataload(0x84) mstore(0xe0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xa4) mstore(0x100, x) let y := calldataload(0xc4) mstore(0x120, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0xe4) mstore(0x140, x) let y := calldataload(0x104) mstore(0x160, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x124) mstore(0x180, x) let y := calldataload(0x144) mstore(0x1a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x164) mstore(0x1c0, x) let y := calldataload(0x184) mstore(0x1e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1a4) mstore(0x200, x) let y := calldataload(0x1c4) mstore(0x220, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x1e4) mstore(0x240, x) let y := calldataload(0x204) mstore(0x260, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x224) mstore(0x280, x) let y := calldataload(0x244) mstore(0x2a0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x264) mstore(0x2c0, x) let y := calldataload(0x284) mstore(0x2e0, y) success := and(validate_ec_point(x, y), success) }mstore(0x300, keccak256(0x80, 640)){ let hash := mload(0x300) mstore(0x320, mod(hash, f_q)) mstore(0x340, hash) } { let x := calldataload(0x2a4) mstore(0x360, x) let y := calldataload(0x2c4) mstore(0x380, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x2e4) mstore(0x3a0, x) let y := calldataload(0x304) mstore(0x3c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x324) mstore(0x3e0, x) let y := calldataload(0x344) mstore(0x400, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x364) mstore(0x420, x) let y := calldataload(0x384) mstore(0x440, y) success := and(validate_ec_point(x, y), success) }mstore(0x460, keccak256(0x340, 288)){ let hash := mload(0x460) mstore(0x480, mod(hash, f_q)) mstore(0x4a0, hash) }mstore8(0x4c0, 1)mstore(0x4c0, keccak256(0x4a0, 33)){ let hash := mload(0x4c0) mstore(0x4e0, mod(hash, f_q)) mstore(0x500, hash) } { let x := calldataload(0x3a4) mstore(0x520, x) let y := calldataload(0x3c4) mstore(0x540, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x3e4) mstore(0x560, x) let y := calldataload(0x404) mstore(0x580, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x424) mstore(0x5a0, x) let y := calldataload(0x444) mstore(0x5c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x464) mstore(0x5e0, x) let y := calldataload(0x484) mstore(0x600, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4a4) mstore(0x620, x) let y := calldataload(0x4c4) mstore(0x640, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x4e4) mstore(0x660, x) let y := calldataload(0x504) mstore(0x680, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x524) mstore(0x6a0, x) let y := calldataload(0x544) mstore(0x6c0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x564) mstore(0x6e0, x) let y := calldataload(0x584) mstore(0x700, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x5a4) mstore(0x720, x) let y := calldataload(0x5c4) mstore(0x740, y) success := and(validate_ec_point(x, y), success) }mstore(0x760, keccak256(0x500, 608)){ let hash := mload(0x760) mstore(0x780, mod(hash, f_q)) mstore(0x7a0, hash) } { let x := calldataload(0x5e4) mstore(0x7c0, x) let y := calldataload(0x604) mstore(0x7e0, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x624) mstore(0x800, x) let y := calldataload(0x644) mstore(0x820, y) success := and(validate_ec_point(x, y), success) } { let x := calldataload(0x664) mstore(0x840, x) let y := calldataload(0x684) mstore(0x860, y) success := and(validate_ec_point(x, y), success) }mstore(0x880, keccak256(0x7a0, 224)){ let hash := mload(0x880) mstore(0x8a0, mod(hash, f_q)) mstore(0x8c0, hash) }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, mod(calldataload(0xc04), f_q))mstore(0xe60, mod(calldataload(0xc24), f_q))mstore(0xe80, mod(calldataload(0xc44), f_q))mstore(0xea0, mod(calldataload(0xc64), f_q))mstore(0xec0, mod(calldataload(0xc84), f_q))mstore(0xee0, mod(calldataload(0xca4), f_q))mstore(0xf00, mod(calldataload(0xcc4), f_q))mstore(0xf20, mod(calldataload(0xce4), f_q))mstore(0xf40, mod(calldataload(0xd04), f_q))mstore(0xf60, mod(calldataload(0xd24), f_q))mstore(0xf80, mod(calldataload(0xd44), f_q))mstore(0xfa0, mod(calldataload(0xd64), f_q))mstore(0xfc0, mod(calldataload(0xd84), f_q))mstore(0xfe0, mod(calldataload(0xda4), f_q))mstore(0x1000, mod(calldataload(0xdc4), f_q))mstore(0x1020, mod(calldataload(0xde4), f_q))mstore(0x1040, mod(calldataload(0xe04), f_q))mstore(0x1060, mod(calldataload(0xe24), f_q))mstore(0x1080, mod(calldataload(0xe44), f_q))mstore(0x10a0, mod(calldataload(0xe64), f_q))mstore(0x10c0, mod(calldataload(0xe84), f_q))mstore(0x10e0, mod(calldataload(0xea4), f_q))mstore(0x1100, mod(calldataload(0xec4), f_q))mstore(0x1120, mod(calldataload(0xee4), f_q))mstore(0x1140, mod(calldataload(0xf04), f_q))mstore(0x1160, mod(calldataload(0xf24), f_q))mstore(0x1180, mod(calldataload(0xf44), f_q))mstore(0x11a0, mod(calldataload(0xf64), f_q))mstore(0x11c0, mod(calldataload(0xf84), f_q))mstore(0x11e0, mod(calldataload(0xfa4), f_q))mstore(0x1200, mod(calldataload(0xfc4), f_q))mstore(0x1220, mod(calldataload(0xfe4), f_q))mstore(0x1240, mod(calldataload(0x1004), f_q))mstore(0x1260, keccak256(0x8c0, 2464)){ let hash := mload(0x1260) mstore(0x1280, mod(hash, f_q)) mstore(0x12a0, hash) }mstore8(0x12c0, 1)mstore(0x12c0, keccak256(0x12a0, 33)){ let hash := mload(0x12c0) mstore(0x12e0, mod(hash, f_q)) mstore(0x1300, hash) } { let x := calldataload(0x1024) mstore(0x1320, x) let y := calldataload(0x1044) mstore(0x1340, y) success := and(validate_ec_point(x, y), success) }mstore(0x1360, keccak256(0x1300, 96)){ let hash := mload(0x1360) mstore(0x1380, mod(hash, f_q)) mstore(0x13a0, hash) } { let x := calldataload(0x1064) mstore(0x13c0, x) let y := calldataload(0x1084) mstore(0x13e0, y) success := and(validate_ec_point(x, y), success) }mstore(0x1400, mulmod(mload(0x8a0), mload(0x8a0), f_q))mstore(0x1420, mulmod(mload(0x1400), mload(0x1400), f_q))mstore(0x1440, mulmod(mload(0x1420), mload(0x1420), f_q))mstore(0x1460, mulmod(mload(0x1440), mload(0x1440), f_q))mstore(0x1480, mulmod(mload(0x1460), mload(0x1460), f_q))mstore(0x14a0, mulmod(mload(0x1480), mload(0x1480), f_q))mstore(0x14c0, mulmod(mload(0x14a0), mload(0x14a0), f_q))mstore(0x14e0, mulmod(mload(0x14c0), mload(0x14c0), f_q))mstore(0x1500, mulmod(mload(0x14e0), mload(0x14e0), f_q))mstore(0x1520, mulmod(mload(0x1500), mload(0x1500), f_q))mstore(0x1540, mulmod(mload(0x1520), mload(0x1520), f_q))mstore(0x1560, mulmod(mload(0x1540), mload(0x1540), f_q))mstore(0x1580, mulmod(mload(0x1560), mload(0x1560), f_q))mstore(0x15a0, mulmod(mload(0x1580), mload(0x1580), f_q))mstore(0x15c0, mulmod(mload(0x15a0), mload(0x15a0), f_q))mstore(0x15e0, mulmod(mload(0x15c0), mload(0x15c0), f_q))mstore(0x1600, mulmod(mload(0x15e0), mload(0x15e0), f_q))mstore(0x1620, mulmod(mload(0x1600), mload(0x1600), f_q))mstore(0x1640, mulmod(mload(0x1620), mload(0x1620), f_q))mstore(0x1660, mulmod(mload(0x1640), mload(0x1640), f_q))mstore(0x1680, mulmod(mload(0x1660), mload(0x1660), f_q))mstore(0x16a0, mulmod(mload(0x1680), mload(0x1680), f_q))mstore(0x16c0, addmod(mload(0x16a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(0x16e0, mulmod(mload(0x16c0), 21888237653275510688422624196183639687472264873923820041627027729598873448513, f_q))mstore(0x1700, mulmod(mload(0x16e0), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x1720, addmod(mload(0x8a0), 8662456992307693229192232929891638461323994988937738840793806641202669341572, f_q))mstore(0x1740, mulmod(mload(0x16e0), 10939663269433627367777756708678102241564365262857670666700619874077960926249, f_q))mstore(0x1760, addmod(mload(0x8a0), 10948579602405647854468649036579172846983999137558363676997584312497847569368, f_q))mstore(0x1780, mulmod(mload(0x16e0), 11016257578652593686382655500910603527869149377564754001549454008164059876499, f_q))mstore(0x17a0, addmod(mload(0x8a0), 10871985293186681535863750244346671560679215022851280342148750178411748619118, f_q))mstore(0x17c0, mulmod(mload(0x16e0), 15402826414547299628414612080036060696555554914079673875872749760617770134879, f_q))mstore(0x17e0, addmod(mload(0x8a0), 6485416457291975593831793665221214391992809486336360467825454425958038360738, f_q))mstore(0x1800, mulmod(mload(0x16e0), 21710372849001950800533397158415938114909991150039389063546734567764856596059, f_q))mstore(0x1820, addmod(mload(0x8a0), 177870022837324421713008586841336973638373250376645280151469618810951899558, f_q))mstore(0x1840, mulmod(mload(0x16e0), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q))mstore(0x1860, addmod(mload(0x8a0), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q))mstore(0x1880, mulmod(mload(0x16e0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x18a0, addmod(mload(0x8a0), 13154116519010929542673167886091370382741775939114889923107781597533678454429, f_q))mstore(0x18c0, mulmod(mload(0x16e0), 1, f_q))mstore(0x18e0, addmod(mload(0x8a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)){ let prod := mload(0x1720) prod := mulmod(mload(0x1760), prod, f_q) mstore(0x1900, prod) prod := mulmod(mload(0x17a0), prod, f_q) mstore(0x1920, prod) prod := mulmod(mload(0x17e0), prod, f_q) mstore(0x1940, prod) prod := mulmod(mload(0x1820), prod, f_q) mstore(0x1960, prod) prod := mulmod(mload(0x1860), prod, f_q) mstore(0x1980, prod) prod := mulmod(mload(0x18a0), prod, f_q) mstore(0x19a0, prod) prod := mulmod(mload(0x18e0), prod, f_q) mstore(0x19c0, prod) prod := mulmod(mload(0x16c0), prod, f_q) mstore(0x19e0, prod) }mstore(0x1a20, 32)mstore(0x1a40, 32)mstore(0x1a60, 32)mstore(0x1a80, mload(0x19e0))mstore(0x1aa0, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x1ac0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x1a20, 0xc0, 0x1a00, 0x20), 1), success){ let inv := mload(0x1a00) let v v := mload(0x16c0) mstore(0x16c0, mulmod(mload(0x19c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18e0) mstore(0x18e0, mulmod(mload(0x19a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x18a0) mstore(0x18a0, mulmod(mload(0x1980), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1860) mstore(0x1860, mulmod(mload(0x1960), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1820) mstore(0x1820, mulmod(mload(0x1940), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x17e0) mstore(0x17e0, mulmod(mload(0x1920), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x17a0) mstore(0x17a0, mulmod(mload(0x1900), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x1760) mstore(0x1760, mulmod(mload(0x1720), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x1720, inv) }mstore(0x1ae0, mulmod(mload(0x1700), mload(0x1720), f_q))mstore(0x1b00, mulmod(mload(0x1740), mload(0x1760), f_q))mstore(0x1b20, mulmod(mload(0x1780), mload(0x17a0), f_q))mstore(0x1b40, mulmod(mload(0x17c0), mload(0x17e0), f_q))mstore(0x1b60, mulmod(mload(0x1800), mload(0x1820), f_q))mstore(0x1b80, mulmod(mload(0x1840), mload(0x1860), f_q))mstore(0x1ba0, mulmod(mload(0x1880), mload(0x18a0), f_q))mstore(0x1bc0, mulmod(mload(0x18c0), mload(0x18e0), f_q)){ let result := mulmod(mload(0x1bc0), mload(0xa0), f_q)mstore(0x1be0, result) }mstore(0x1c00, mulmod(mload(0x920), mload(0x900), f_q))mstore(0x1c20, addmod(mload(0x8e0), mload(0x1c00), f_q))mstore(0x1c40, addmod(mload(0x1c20), sub(f_q, mload(0x940)), f_q))mstore(0x1c60, mulmod(mload(0x1c40), mload(0xcc0), f_q))mstore(0x1c80, mulmod(mload(0x780), mload(0x1c60), f_q))mstore(0x1ca0, mulmod(mload(0x9a0), mload(0x980), f_q))mstore(0x1cc0, addmod(mload(0x960), mload(0x1ca0), f_q))mstore(0x1ce0, addmod(mload(0x1cc0), sub(f_q, mload(0x9c0)), f_q))mstore(0x1d00, mulmod(mload(0x1ce0), mload(0xce0), f_q))mstore(0x1d20, addmod(mload(0x1c80), mload(0x1d00), f_q))mstore(0x1d40, mulmod(mload(0x780), mload(0x1d20), f_q))mstore(0x1d60, mulmod(mload(0xa20), mload(0xa00), f_q))mstore(0x1d80, addmod(mload(0x9e0), mload(0x1d60), f_q))mstore(0x1da0, addmod(mload(0x1d80), sub(f_q, mload(0xa40)), f_q))mstore(0x1dc0, mulmod(mload(0x1da0), mload(0xd00), f_q))mstore(0x1de0, addmod(mload(0x1d40), mload(0x1dc0), f_q))mstore(0x1e00, mulmod(mload(0x780), mload(0x1de0), f_q))mstore(0x1e20, mulmod(mload(0xaa0), mload(0xa80), f_q))mstore(0x1e40, addmod(mload(0xa60), mload(0x1e20), f_q))mstore(0x1e60, addmod(mload(0x1e40), sub(f_q, mload(0xac0)), f_q))mstore(0x1e80, mulmod(mload(0x1e60), mload(0xd20), f_q))mstore(0x1ea0, addmod(mload(0x1e00), mload(0x1e80), f_q))mstore(0x1ec0, mulmod(mload(0x780), mload(0x1ea0), f_q))mstore(0x1ee0, mulmod(mload(0xb20), mload(0xb00), f_q))mstore(0x1f00, addmod(mload(0xae0), mload(0x1ee0), f_q))mstore(0x1f20, addmod(mload(0x1f00), sub(f_q, mload(0xb40)), f_q))mstore(0x1f40, mulmod(mload(0x1f20), mload(0xd40), f_q))mstore(0x1f60, addmod(mload(0x1ec0), mload(0x1f40), f_q))mstore(0x1f80, mulmod(mload(0x780), mload(0x1f60), f_q))mstore(0x1fa0, mulmod(mload(0xba0), mload(0xb80), f_q))mstore(0x1fc0, addmod(mload(0xb60), mload(0x1fa0), f_q))mstore(0x1fe0, addmod(mload(0x1fc0), sub(f_q, mload(0xbc0)), f_q))mstore(0x2000, mulmod(mload(0x1fe0), mload(0xd60), f_q))mstore(0x2020, addmod(mload(0x1f80), mload(0x2000), f_q))mstore(0x2040, mulmod(mload(0x780), mload(0x2020), f_q))mstore(0x2060, addmod(1, sub(f_q, mload(0xf00)), f_q))mstore(0x2080, mulmod(mload(0x2060), mload(0x1bc0), f_q))mstore(0x20a0, addmod(mload(0x2040), mload(0x2080), f_q))mstore(0x20c0, mulmod(mload(0x780), mload(0x20a0), f_q))mstore(0x20e0, mulmod(mload(0x10e0), mload(0x10e0), f_q))mstore(0x2100, addmod(mload(0x20e0), sub(f_q, mload(0x10e0)), f_q))mstore(0x2120, mulmod(mload(0x2100), mload(0x1ae0), f_q))mstore(0x2140, addmod(mload(0x20c0), mload(0x2120), f_q))mstore(0x2160, mulmod(mload(0x780), mload(0x2140), f_q))mstore(0x2180, addmod(mload(0xf60), sub(f_q, mload(0xf40)), f_q))mstore(0x21a0, mulmod(mload(0x2180), mload(0x1bc0), f_q))mstore(0x21c0, addmod(mload(0x2160), mload(0x21a0), f_q))mstore(0x21e0, mulmod(mload(0x780), mload(0x21c0), f_q))mstore(0x2200, addmod(mload(0xfc0), sub(f_q, mload(0xfa0)), f_q))mstore(0x2220, mulmod(mload(0x2200), mload(0x1bc0), f_q))mstore(0x2240, addmod(mload(0x21e0), mload(0x2220), f_q))mstore(0x2260, mulmod(mload(0x780), mload(0x2240), f_q))mstore(0x2280, addmod(mload(0x1020), sub(f_q, mload(0x1000)), f_q))mstore(0x22a0, mulmod(mload(0x2280), mload(0x1bc0), f_q))mstore(0x22c0, addmod(mload(0x2260), mload(0x22a0), f_q))mstore(0x22e0, mulmod(mload(0x780), mload(0x22c0), f_q))mstore(0x2300, addmod(mload(0x1080), sub(f_q, mload(0x1060)), f_q))mstore(0x2320, mulmod(mload(0x2300), mload(0x1bc0), f_q))mstore(0x2340, addmod(mload(0x22e0), mload(0x2320), f_q))mstore(0x2360, mulmod(mload(0x780), mload(0x2340), f_q))mstore(0x2380, addmod(mload(0x10e0), sub(f_q, mload(0x10c0)), f_q))mstore(0x23a0, mulmod(mload(0x2380), mload(0x1bc0), f_q))mstore(0x23c0, addmod(mload(0x2360), mload(0x23a0), f_q))mstore(0x23e0, mulmod(mload(0x780), mload(0x23c0), f_q))mstore(0x2400, addmod(1, sub(f_q, mload(0x1ae0)), f_q))mstore(0x2420, addmod(mload(0x1b00), mload(0x1b20), f_q))mstore(0x2440, addmod(mload(0x2420), mload(0x1b40), f_q))mstore(0x2460, addmod(mload(0x2440), mload(0x1b60), f_q))mstore(0x2480, addmod(mload(0x2460), mload(0x1b80), f_q))mstore(0x24a0, addmod(mload(0x2480), mload(0x1ba0), f_q))mstore(0x24c0, addmod(mload(0x2400), sub(f_q, mload(0x24a0)), f_q))mstore(0x24e0, mulmod(mload(0xda0), mload(0x480), f_q))mstore(0x2500, addmod(mload(0xc40), mload(0x24e0), f_q))mstore(0x2520, addmod(mload(0x2500), mload(0x4e0), f_q))mstore(0x2540, mulmod(mload(0xdc0), mload(0x480), f_q))mstore(0x2560, addmod(mload(0x8e0), mload(0x2540), f_q))mstore(0x2580, addmod(mload(0x2560), mload(0x4e0), f_q))mstore(0x25a0, mulmod(mload(0x2580), mload(0x2520), f_q))mstore(0x25c0, mulmod(mload(0x25a0), mload(0xf20), f_q))mstore(0x25e0, mulmod(1, mload(0x480), f_q))mstore(0x2600, mulmod(mload(0x8a0), mload(0x25e0), f_q))mstore(0x2620, addmod(mload(0xc40), mload(0x2600), f_q))mstore(0x2640, addmod(mload(0x2620), mload(0x4e0), f_q))mstore(0x2660, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x480), f_q))mstore(0x2680, mulmod(mload(0x8a0), mload(0x2660), f_q))mstore(0x26a0, addmod(mload(0x8e0), mload(0x2680), f_q))mstore(0x26c0, addmod(mload(0x26a0), mload(0x4e0), f_q))mstore(0x26e0, mulmod(mload(0x26c0), mload(0x2640), f_q))mstore(0x2700, mulmod(mload(0x26e0), mload(0xf00), f_q))mstore(0x2720, addmod(mload(0x25c0), sub(f_q, mload(0x2700)), f_q))mstore(0x2740, mulmod(mload(0x2720), mload(0x24c0), f_q))mstore(0x2760, addmod(mload(0x23e0), mload(0x2740), f_q))mstore(0x2780, mulmod(mload(0x780), mload(0x2760), f_q))mstore(0x27a0, mulmod(mload(0xde0), mload(0x480), f_q))mstore(0x27c0, addmod(mload(0x960), mload(0x27a0), f_q))mstore(0x27e0, addmod(mload(0x27c0), mload(0x4e0), f_q))mstore(0x2800, mulmod(mload(0xe00), mload(0x480), f_q))mstore(0x2820, addmod(mload(0x9e0), mload(0x2800), f_q))mstore(0x2840, addmod(mload(0x2820), mload(0x4e0), f_q))mstore(0x2860, mulmod(mload(0x2840), mload(0x27e0), f_q))mstore(0x2880, mulmod(mload(0x2860), mload(0xf80), f_q))mstore(0x28a0, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x480), f_q))mstore(0x28c0, mulmod(mload(0x8a0), mload(0x28a0), f_q))mstore(0x28e0, addmod(mload(0x960), mload(0x28c0), f_q))mstore(0x2900, addmod(mload(0x28e0), mload(0x4e0), f_q))mstore(0x2920, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x480), f_q))mstore(0x2940, mulmod(mload(0x8a0), mload(0x2920), f_q))mstore(0x2960, addmod(mload(0x9e0), mload(0x2940), f_q))mstore(0x2980, addmod(mload(0x2960), mload(0x4e0), f_q))mstore(0x29a0, mulmod(mload(0x2980), mload(0x2900), f_q))mstore(0x29c0, mulmod(mload(0x29a0), mload(0xf60), f_q))mstore(0x29e0, addmod(mload(0x2880), sub(f_q, mload(0x29c0)), f_q))mstore(0x2a00, mulmod(mload(0x29e0), mload(0x24c0), f_q))mstore(0x2a20, addmod(mload(0x2780), mload(0x2a00), f_q))mstore(0x2a40, mulmod(mload(0x780), mload(0x2a20), f_q))mstore(0x2a60, mulmod(mload(0xe20), mload(0x480), f_q))mstore(0x2a80, addmod(mload(0xa60), mload(0x2a60), f_q))mstore(0x2aa0, addmod(mload(0x2a80), mload(0x4e0), f_q))mstore(0x2ac0, mulmod(mload(0xe40), mload(0x480), f_q))mstore(0x2ae0, addmod(mload(0xae0), mload(0x2ac0), f_q))mstore(0x2b00, addmod(mload(0x2ae0), mload(0x4e0), f_q))mstore(0x2b20, mulmod(mload(0x2b00), mload(0x2aa0), f_q))mstore(0x2b40, mulmod(mload(0x2b20), mload(0xfe0), f_q))mstore(0x2b60, mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(0x480), f_q))mstore(0x2b80, mulmod(mload(0x8a0), mload(0x2b60), f_q))mstore(0x2ba0, addmod(mload(0xa60), mload(0x2b80), f_q))mstore(0x2bc0, addmod(mload(0x2ba0), mload(0x4e0), f_q))mstore(0x2be0, mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(0x480), f_q))mstore(0x2c00, mulmod(mload(0x8a0), mload(0x2be0), f_q))mstore(0x2c20, addmod(mload(0xae0), mload(0x2c00), f_q))mstore(0x2c40, addmod(mload(0x2c20), mload(0x4e0), f_q))mstore(0x2c60, mulmod(mload(0x2c40), mload(0x2bc0), f_q))mstore(0x2c80, mulmod(mload(0x2c60), mload(0xfc0), f_q))mstore(0x2ca0, addmod(mload(0x2b40), sub(f_q, mload(0x2c80)), f_q))mstore(0x2cc0, mulmod(mload(0x2ca0), mload(0x24c0), f_q))mstore(0x2ce0, addmod(mload(0x2a40), mload(0x2cc0), f_q))mstore(0x2d00, mulmod(mload(0x780), mload(0x2ce0), f_q))mstore(0x2d20, mulmod(mload(0xe60), mload(0x480), f_q))mstore(0x2d40, addmod(mload(0xb60), mload(0x2d20), f_q))mstore(0x2d60, addmod(mload(0x2d40), mload(0x4e0), f_q))mstore(0x2d80, mulmod(mload(0xe80), mload(0x480), f_q))mstore(0x2da0, addmod(mload(0xbe0), mload(0x2d80), f_q))mstore(0x2dc0, addmod(mload(0x2da0), mload(0x4e0), f_q))mstore(0x2de0, mulmod(mload(0x2dc0), mload(0x2d60), f_q))mstore(0x2e00, mulmod(mload(0x2de0), mload(0x1040), f_q))mstore(0x2e20, mulmod(5625741653535312224677218588085279924365897425605943700675464992185016992283, mload(0x480), f_q))mstore(0x2e40, mulmod(mload(0x8a0), mload(0x2e20), f_q))mstore(0x2e60, addmod(mload(0xb60), mload(0x2e40), f_q))mstore(0x2e80, addmod(mload(0x2e60), mload(0x4e0), f_q))mstore(0x2ea0, mulmod(14704729814417906439424896605881467874595262020190401576785074330126828718155, mload(0x480), f_q))mstore(0x2ec0, mulmod(mload(0x8a0), mload(0x2ea0), f_q))mstore(0x2ee0, addmod(mload(0xbe0), mload(0x2ec0), f_q))mstore(0x2f00, addmod(mload(0x2ee0), mload(0x4e0), f_q))mstore(0x2f20, mulmod(mload(0x2f00), mload(0x2e80), f_q))mstore(0x2f40, mulmod(mload(0x2f20), mload(0x1020), f_q))mstore(0x2f60, addmod(mload(0x2e00), sub(f_q, mload(0x2f40)), f_q))mstore(0x2f80, mulmod(mload(0x2f60), mload(0x24c0), f_q))mstore(0x2fa0, addmod(mload(0x2d00), mload(0x2f80), f_q))mstore(0x2fc0, mulmod(mload(0x780), mload(0x2fa0), f_q))mstore(0x2fe0, mulmod(mload(0xea0), mload(0x480), f_q))mstore(0x3000, addmod(mload(0x1be0), mload(0x2fe0), f_q))mstore(0x3020, addmod(mload(0x3000), mload(0x4e0), f_q))mstore(0x3040, mulmod(mload(0xec0), mload(0x480), f_q))mstore(0x3060, addmod(mload(0xc00), mload(0x3040), f_q))mstore(0x3080, addmod(mload(0x3060), mload(0x4e0), f_q))mstore(0x30a0, mulmod(mload(0x3080), mload(0x3020), f_q))mstore(0x30c0, mulmod(mload(0x30a0), mload(0x10a0), f_q))mstore(0x30e0, mulmod(8343274462013750416000956870576256937330525306073862550863787263304548803879, mload(0x480), f_q))mstore(0x3100, mulmod(mload(0x8a0), mload(0x30e0), f_q))mstore(0x3120, addmod(mload(0x1be0), mload(0x3100), f_q))mstore(0x3140, addmod(mload(0x3120), mload(0x4e0), f_q))mstore(0x3160, mulmod(20928372310071051017340352686640453451620397549739756658327314209761852842004, mload(0x480), f_q))mstore(0x3180, mulmod(mload(0x8a0), mload(0x3160), f_q))mstore(0x31a0, addmod(mload(0xc00), mload(0x3180), f_q))mstore(0x31c0, addmod(mload(0x31a0), mload(0x4e0), f_q))mstore(0x31e0, mulmod(mload(0x31c0), mload(0x3140), f_q))mstore(0x3200, mulmod(mload(0x31e0), mload(0x1080), f_q))mstore(0x3220, addmod(mload(0x30c0), sub(f_q, mload(0x3200)), f_q))mstore(0x3240, mulmod(mload(0x3220), mload(0x24c0), f_q))mstore(0x3260, addmod(mload(0x2fc0), mload(0x3240), f_q))mstore(0x3280, mulmod(mload(0x780), mload(0x3260), f_q))mstore(0x32a0, mulmod(mload(0xee0), mload(0x480), f_q))mstore(0x32c0, addmod(mload(0xc20), mload(0x32a0), f_q))mstore(0x32e0, addmod(mload(0x32c0), mload(0x4e0), f_q))mstore(0x3300, mulmod(mload(0x32e0), mload(0x1100), f_q))mstore(0x3320, mulmod(15845651941796975697993789271154426079663327509658641548785793587449119139335, mload(0x480), f_q))mstore(0x3340, mulmod(mload(0x8a0), mload(0x3320), f_q))mstore(0x3360, addmod(mload(0xc20), mload(0x3340), f_q))mstore(0x3380, addmod(mload(0x3360), mload(0x4e0), f_q))mstore(0x33a0, mulmod(mload(0x3380), mload(0x10e0), f_q))mstore(0x33c0, addmod(mload(0x3300), sub(f_q, mload(0x33a0)), f_q))mstore(0x33e0, mulmod(mload(0x33c0), mload(0x24c0), f_q))mstore(0x3400, addmod(mload(0x3280), mload(0x33e0), f_q))mstore(0x3420, mulmod(mload(0x780), mload(0x3400), f_q))mstore(0x3440, addmod(1, sub(f_q, mload(0x1120)), f_q))mstore(0x3460, mulmod(mload(0x3440), mload(0x1bc0), f_q))mstore(0x3480, addmod(mload(0x3420), mload(0x3460), f_q))mstore(0x34a0, mulmod(mload(0x780), mload(0x3480), f_q))mstore(0x34c0, mulmod(mload(0x1120), mload(0x1120), f_q))mstore(0x34e0, addmod(mload(0x34c0), sub(f_q, mload(0x1120)), f_q))mstore(0x3500, mulmod(mload(0x34e0), mload(0x1ae0), f_q))mstore(0x3520, addmod(mload(0x34a0), mload(0x3500), f_q))mstore(0x3540, mulmod(mload(0x780), mload(0x3520), f_q))mstore(0x3560, addmod(mload(0x1160), mload(0x480), f_q))mstore(0x3580, mulmod(mload(0x3560), mload(0x1140), f_q))mstore(0x35a0, addmod(mload(0x11a0), mload(0x4e0), f_q))mstore(0x35c0, mulmod(mload(0x35a0), mload(0x3580), f_q))mstore(0x35e0, addmod(mload(0xbe0), mload(0x480), f_q))mstore(0x3600, mulmod(mload(0x35e0), mload(0x1120), f_q))mstore(0x3620, addmod(mload(0xc60), mload(0x4e0), f_q))mstore(0x3640, mulmod(mload(0x3620), mload(0x3600), f_q))mstore(0x3660, addmod(mload(0x35c0), sub(f_q, mload(0x3640)), f_q))mstore(0x3680, mulmod(mload(0x3660), mload(0x24c0), f_q))mstore(0x36a0, addmod(mload(0x3540), mload(0x3680), f_q))mstore(0x36c0, mulmod(mload(0x780), mload(0x36a0), f_q))mstore(0x36e0, addmod(mload(0x1160), sub(f_q, mload(0x11a0)), f_q))mstore(0x3700, mulmod(mload(0x36e0), mload(0x1bc0), f_q))mstore(0x3720, addmod(mload(0x36c0), mload(0x3700), f_q))mstore(0x3740, mulmod(mload(0x780), mload(0x3720), f_q))mstore(0x3760, mulmod(mload(0x36e0), mload(0x24c0), f_q))mstore(0x3780, addmod(mload(0x1160), sub(f_q, mload(0x1180)), f_q))mstore(0x37a0, mulmod(mload(0x3780), mload(0x3760), f_q))mstore(0x37c0, addmod(mload(0x3740), mload(0x37a0), f_q))mstore(0x37e0, mulmod(mload(0x780), mload(0x37c0), f_q))mstore(0x3800, addmod(1, sub(f_q, mload(0x11c0)), f_q))mstore(0x3820, mulmod(mload(0x3800), mload(0x1bc0), f_q))mstore(0x3840, addmod(mload(0x37e0), mload(0x3820), f_q))mstore(0x3860, mulmod(mload(0x780), mload(0x3840), f_q))mstore(0x3880, mulmod(mload(0x11c0), mload(0x11c0), f_q))mstore(0x38a0, addmod(mload(0x3880), sub(f_q, mload(0x11c0)), f_q))mstore(0x38c0, mulmod(mload(0x38a0), mload(0x1ae0), f_q))mstore(0x38e0, addmod(mload(0x3860), mload(0x38c0), f_q))mstore(0x3900, mulmod(mload(0x780), mload(0x38e0), f_q))mstore(0x3920, addmod(mload(0x1200), mload(0x480), f_q))mstore(0x3940, mulmod(mload(0x3920), mload(0x11e0), f_q))mstore(0x3960, addmod(mload(0x1240), mload(0x4e0), f_q))mstore(0x3980, mulmod(mload(0x3960), mload(0x3940), f_q))mstore(0x39a0, mulmod(mload(0x320), mload(0xc00), f_q))mstore(0x39c0, addmod(mload(0x39a0), mload(0xc20), f_q))mstore(0x39e0, addmod(mload(0x39c0), mload(0x480), f_q))mstore(0x3a00, mulmod(mload(0x39e0), mload(0x11c0), f_q))mstore(0x3a20, mulmod(mload(0x320), mload(0xc80), f_q))mstore(0x3a40, addmod(mload(0x3a20), mload(0xca0), f_q))mstore(0x3a60, addmod(mload(0x3a40), mload(0x4e0), f_q))mstore(0x3a80, mulmod(mload(0x3a60), mload(0x3a00), f_q))mstore(0x3aa0, addmod(mload(0x3980), sub(f_q, mload(0x3a80)), f_q))mstore(0x3ac0, mulmod(mload(0x3aa0), mload(0x24c0), f_q))mstore(0x3ae0, addmod(mload(0x3900), mload(0x3ac0), f_q))mstore(0x3b00, mulmod(mload(0x780), mload(0x3ae0), f_q))mstore(0x3b20, addmod(mload(0x1200), sub(f_q, mload(0x1240)), f_q))mstore(0x3b40, mulmod(mload(0x3b20), mload(0x1bc0), f_q))mstore(0x3b60, addmod(mload(0x3b00), mload(0x3b40), f_q))mstore(0x3b80, mulmod(mload(0x780), mload(0x3b60), f_q))mstore(0x3ba0, mulmod(mload(0x3b20), mload(0x24c0), f_q))mstore(0x3bc0, addmod(mload(0x1200), sub(f_q, mload(0x1220)), f_q))mstore(0x3be0, mulmod(mload(0x3bc0), mload(0x3ba0), f_q))mstore(0x3c00, addmod(mload(0x3b80), mload(0x3be0), f_q))mstore(0x3c20, mulmod(mload(0x16a0), mload(0x16a0), f_q))mstore(0x3c40, mulmod(mload(0x3c20), mload(0x16a0), f_q))mstore(0x3c60, mulmod(1, mload(0x16a0), f_q))mstore(0x3c80, mulmod(1, mload(0x3c20), f_q))mstore(0x3ca0, mulmod(mload(0x3c00), mload(0x16c0), f_q))mstore(0x3cc0, mulmod(mload(0x1400), mload(0x8a0), f_q))mstore(0x3ce0, mulmod(mload(0x3cc0), mload(0x8a0), f_q))mstore(0x3d00, mulmod(mload(0x8a0), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q))mstore(0x3d20, addmod(mload(0x1380), sub(f_q, mload(0x3d00)), f_q))mstore(0x3d40, mulmod(mload(0x8a0), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q))mstore(0x3d60, addmod(mload(0x1380), sub(f_q, mload(0x3d40)), f_q))mstore(0x3d80, mulmod(mload(0x8a0), 1, f_q))mstore(0x3da0, addmod(mload(0x1380), sub(f_q, mload(0x3d80)), f_q))mstore(0x3dc0, mulmod(mload(0x8a0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q))mstore(0x3de0, addmod(mload(0x1380), sub(f_q, mload(0x3dc0)), f_q))mstore(0x3e00, mulmod(mload(0x8a0), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q))mstore(0x3e20, addmod(mload(0x1380), sub(f_q, mload(0x3e00)), f_q))mstore(0x3e40, mulmod(mload(0x8a0), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q))mstore(0x3e60, addmod(mload(0x1380), sub(f_q, mload(0x3e40)), f_q))mstore(0x3e80, mulmod(3544324119167359571073009690693121464267965232733679586767649244433889388945, mload(0x3cc0), f_q))mstore(0x3ea0, mulmod(mload(0x3e80), 1, f_q)){ let result := mulmod(mload(0x1380), mload(0x3e80), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x3ea0)), f_q), result, f_q)mstore(0x3ec0, result) }mstore(0x3ee0, mulmod(3860370625838117017501327045244227871206764201116468958063324100051382735289, mload(0x3cc0), f_q))mstore(0x3f00, mulmod(mload(0x3ee0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1380), mload(0x3ee0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x3f00)), f_q), result, f_q)mstore(0x3f20, result) }mstore(0x3f40, mulmod(21616901807277407275624036604424346159916096890712898844034238973395610537327, mload(0x3cc0), f_q))mstore(0x3f60, mulmod(mload(0x3f40), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q)){ let result := mulmod(mload(0x1380), mload(0x3f40), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x3f60)), f_q), result, f_q)mstore(0x3f80, result) }mstore(0x3fa0, mulmod(3209408481237076479025468386201293941554240476766691830436732310949352383503, mload(0x3cc0), f_q))mstore(0x3fc0, mulmod(mload(0x3fa0), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q)){ let result := mulmod(mload(0x1380), mload(0x3fa0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x3fc0)), f_q), result, f_q)mstore(0x3fe0, result) }mstore(0x4000, mulmod(1, mload(0x3da0), f_q))mstore(0x4020, mulmod(mload(0x4000), mload(0x3de0), f_q))mstore(0x4040, mulmod(mload(0x4020), mload(0x3e20), f_q))mstore(0x4060, mulmod(mload(0x4040), mload(0x3e60), f_q)){ let result := mulmod(mload(0x1380), 1, f_q)result := addmod(mulmod(mload(0x8a0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(0x4080, result) }mstore(0x40a0, mulmod(8390819244605639573390577733158868133682115698337564550620146375401109684432, mload(0x1400), f_q))mstore(0x40c0, mulmod(mload(0x40a0), 1, f_q)){ let result := mulmod(mload(0x1380), mload(0x40a0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x40c0)), f_q), result, f_q)mstore(0x40e0, result) }mstore(0x4100, mulmod(14389468897523033212448771694851898440525479866834419679925499462425232628530, mload(0x1400), f_q))mstore(0x4120, mulmod(mload(0x4100), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1380), mload(0x4100), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4120)), f_q), result, f_q)mstore(0x4140, result) }mstore(0x4160, mulmod(8021781111580269725587432039983408559403601261632071736490564397134126857583, mload(0x1400), f_q))mstore(0x4180, mulmod(mload(0x4160), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q)){ let result := mulmod(mload(0x1380), mload(0x4160), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4180)), f_q), result, f_q)mstore(0x41a0, result) }mstore(0x41c0, mulmod(mload(0x4020), mload(0x3d20), f_q))mstore(0x41e0, mulmod(10676941854703594198666993839846402519342119846958189386823924046696287912228, mload(0x8a0), f_q))mstore(0x4200, mulmod(mload(0x41e0), 1, f_q)){ let result := mulmod(mload(0x1380), mload(0x41e0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4200)), f_q), result, f_q)mstore(0x4220, result) }mstore(0x4240, mulmod(11211301017135681023579411905410872569206244553457844956874280139879520583389, mload(0x8a0), f_q))mstore(0x4260, mulmod(mload(0x4240), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q)){ let result := mulmod(mload(0x1380), mload(0x4240), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4260)), f_q), result, f_q)mstore(0x4280, result) }mstore(0x42a0, mulmod(13154116519010929542673167886091370382741775939114889923107781597533678454430, mload(0x8a0), f_q))mstore(0x42c0, mulmod(mload(0x42a0), 1, f_q)){ let result := mulmod(mload(0x1380), mload(0x42a0), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x42c0)), f_q), result, f_q)mstore(0x42e0, result) }mstore(0x4300, mulmod(8734126352828345679573237859165904705806588461301144420590422589042130041187, mload(0x8a0), f_q))mstore(0x4320, mulmod(mload(0x4300), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q)){ let result := mulmod(mload(0x1380), mload(0x4300), f_q)result := addmod(mulmod(mload(0x8a0), sub(f_q, mload(0x4320)), f_q), result, f_q)mstore(0x4340, result) }mstore(0x4360, mulmod(mload(0x4000), mload(0x3d60), f_q)){ let prod := mload(0x3ec0) prod := mulmod(mload(0x3f20), prod, f_q) mstore(0x4380, prod) prod := mulmod(mload(0x3f80), prod, f_q) mstore(0x43a0, prod) prod := mulmod(mload(0x3fe0), prod, f_q) mstore(0x43c0, prod) prod := mulmod(mload(0x4080), prod, f_q) mstore(0x43e0, prod) prod := mulmod(mload(0x4000), prod, f_q) mstore(0x4400, prod) prod := mulmod(mload(0x40e0), prod, f_q) mstore(0x4420, prod) prod := mulmod(mload(0x4140), prod, f_q) mstore(0x4440, prod) prod := mulmod(mload(0x41a0), prod, f_q) mstore(0x4460, prod) prod := mulmod(mload(0x41c0), prod, f_q) mstore(0x4480, prod) prod := mulmod(mload(0x4220), prod, f_q) mstore(0x44a0, prod) prod := mulmod(mload(0x4280), prod, f_q) mstore(0x44c0, prod) prod := mulmod(mload(0x4020), prod, f_q) mstore(0x44e0, prod) prod := mulmod(mload(0x42e0), prod, f_q) mstore(0x4500, prod) prod := mulmod(mload(0x4340), prod, f_q) mstore(0x4520, prod) prod := mulmod(mload(0x4360), prod, f_q) mstore(0x4540, prod) }mstore(0x4580, 32)mstore(0x45a0, 32)mstore(0x45c0, 32)mstore(0x45e0, mload(0x4540))mstore(0x4600, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x4620, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x4580, 0xc0, 0x4560, 0x20), 1), success){ let inv := mload(0x4560) let v v := mload(0x4360) mstore(0x4360, mulmod(mload(0x4520), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4340) mstore(0x4340, mulmod(mload(0x4500), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x42e0) mstore(0x42e0, mulmod(mload(0x44e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4020) mstore(0x4020, mulmod(mload(0x44c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4280) mstore(0x4280, mulmod(mload(0x44a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4220) mstore(0x4220, mulmod(mload(0x4480), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x41c0) mstore(0x41c0, mulmod(mload(0x4460), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x41a0) mstore(0x41a0, mulmod(mload(0x4440), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4140) mstore(0x4140, mulmod(mload(0x4420), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x40e0) mstore(0x40e0, mulmod(mload(0x4400), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4000) mstore(0x4000, mulmod(mload(0x43e0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4080) mstore(0x4080, mulmod(mload(0x43c0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3fe0) mstore(0x3fe0, mulmod(mload(0x43a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3f80) mstore(0x3f80, mulmod(mload(0x4380), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3f20) mstore(0x3f20, mulmod(mload(0x3ec0), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x3ec0, inv) }{ let result := mload(0x3ec0)result := addmod(mload(0x3f20), result, f_q)result := addmod(mload(0x3f80), result, f_q)result := addmod(mload(0x3fe0), result, f_q)mstore(0x4640, result) }mstore(0x4660, mulmod(mload(0x4060), mload(0x4000), f_q)){ let result := mload(0x4080)mstore(0x4680, result) }mstore(0x46a0, mulmod(mload(0x4060), mload(0x41c0), f_q)){ let result := mload(0x40e0)result := addmod(mload(0x4140), result, f_q)result := addmod(mload(0x41a0), result, f_q)mstore(0x46c0, result) }mstore(0x46e0, mulmod(mload(0x4060), mload(0x4020), f_q)){ let result := mload(0x4220)result := addmod(mload(0x4280), result, f_q)mstore(0x4700, result) }mstore(0x4720, mulmod(mload(0x4060), mload(0x4360), f_q)){ let result := mload(0x42e0)result := addmod(mload(0x4340), result, f_q)mstore(0x4740, result) }{ let prod := mload(0x4640) prod := mulmod(mload(0x4680), prod, f_q) mstore(0x4760, prod) prod := mulmod(mload(0x46c0), prod, f_q) mstore(0x4780, prod) prod := mulmod(mload(0x4700), prod, f_q) mstore(0x47a0, prod) prod := mulmod(mload(0x4740), prod, f_q) mstore(0x47c0, prod) }mstore(0x4800, 32)mstore(0x4820, 32)mstore(0x4840, 32)mstore(0x4860, mload(0x47c0))mstore(0x4880, 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(0x48a0, 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, 0x4800, 0xc0, 0x47e0, 0x20), 1), success){ let inv := mload(0x47e0) let v v := mload(0x4740) mstore(0x4740, mulmod(mload(0x47a0), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4700) mstore(0x4700, mulmod(mload(0x4780), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x46c0) mstore(0x46c0, mulmod(mload(0x4760), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x4680) mstore(0x4680, mulmod(mload(0x4640), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(0x4640, inv) }mstore(0x48c0, mulmod(mload(0x4660), mload(0x4680), f_q))mstore(0x48e0, mulmod(mload(0x46a0), mload(0x46c0), f_q))mstore(0x4900, mulmod(mload(0x46e0), mload(0x4700), f_q))mstore(0x4920, mulmod(mload(0x4720), mload(0x4740), f_q))mstore(0x4940, mulmod(mload(0x1280), mload(0x1280), f_q))mstore(0x4960, mulmod(mload(0x4940), mload(0x1280), f_q))mstore(0x4980, mulmod(mload(0x4960), mload(0x1280), f_q))mstore(0x49a0, mulmod(mload(0x4980), mload(0x1280), f_q))mstore(0x49c0, mulmod(mload(0x49a0), mload(0x1280), f_q))mstore(0x49e0, mulmod(mload(0x49c0), mload(0x1280), f_q))mstore(0x4a00, mulmod(mload(0x49e0), mload(0x1280), f_q))mstore(0x4a20, mulmod(mload(0x4a00), mload(0x1280), f_q))mstore(0x4a40, mulmod(mload(0x4a20), mload(0x1280), f_q))mstore(0x4a60, mulmod(mload(0x4a40), mload(0x1280), f_q))mstore(0x4a80, mulmod(mload(0x4a60), mload(0x1280), f_q))mstore(0x4aa0, mulmod(mload(0x4a80), mload(0x1280), f_q))mstore(0x4ac0, mulmod(mload(0x4aa0), mload(0x1280), f_q))mstore(0x4ae0, mulmod(mload(0x4ac0), mload(0x1280), f_q))mstore(0x4b00, mulmod(mload(0x4ae0), mload(0x1280), f_q))mstore(0x4b20, mulmod(mload(0x4b00), mload(0x1280), f_q))mstore(0x4b40, mulmod(mload(0x4b20), mload(0x1280), f_q))mstore(0x4b60, mulmod(mload(0x4b40), mload(0x1280), f_q))mstore(0x4b80, mulmod(mload(0x4b60), mload(0x1280), f_q))mstore(0x4ba0, mulmod(mload(0x4b80), mload(0x1280), f_q))mstore(0x4bc0, mulmod(mload(0x4ba0), mload(0x1280), f_q))mstore(0x4be0, mulmod(mload(0x4bc0), mload(0x1280), f_q))mstore(0x4c00, mulmod(mload(0x4be0), mload(0x1280), f_q))mstore(0x4c20, mulmod(mload(0x4c00), mload(0x1280), f_q))mstore(0x4c40, mulmod(mload(0x4c20), mload(0x1280), f_q))mstore(0x4c60, mulmod(mload(0x4c40), mload(0x1280), f_q))mstore(0x4c80, mulmod(mload(0x4c60), mload(0x1280), f_q))mstore(0x4ca0, mulmod(mload(0x12e0), mload(0x12e0), f_q))mstore(0x4cc0, mulmod(mload(0x4ca0), mload(0x12e0), f_q))mstore(0x4ce0, mulmod(mload(0x4cc0), mload(0x12e0), f_q))mstore(0x4d00, mulmod(mload(0x4ce0), mload(0x12e0), f_q)){ let result := mulmod(mload(0x8e0), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0x900), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0x920), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0x940), mload(0x3fe0), f_q), result, f_q)mstore(0x4d20, result) }mstore(0x4d40, mulmod(mload(0x4d20), mload(0x4640), f_q))mstore(0x4d60, mulmod(sub(f_q, mload(0x4d40)), 1, f_q)){ let result := mulmod(mload(0x960), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0x980), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0x9a0), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0x9c0), mload(0x3fe0), f_q), result, f_q)mstore(0x4d80, result) }mstore(0x4da0, mulmod(mload(0x4d80), mload(0x4640), f_q))mstore(0x4dc0, mulmod(sub(f_q, mload(0x4da0)), mload(0x1280), f_q))mstore(0x4de0, mulmod(1, mload(0x1280), f_q))mstore(0x4e00, addmod(mload(0x4d60), mload(0x4dc0), f_q)){ let result := mulmod(mload(0x9e0), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0xa00), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0xa20), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0xa40), mload(0x3fe0), f_q), result, f_q)mstore(0x4e20, result) }mstore(0x4e40, mulmod(mload(0x4e20), mload(0x4640), f_q))mstore(0x4e60, mulmod(sub(f_q, mload(0x4e40)), mload(0x4940), f_q))mstore(0x4e80, mulmod(1, mload(0x4940), f_q))mstore(0x4ea0, addmod(mload(0x4e00), mload(0x4e60), f_q)){ let result := mulmod(mload(0xa60), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0xa80), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0xaa0), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0xac0), mload(0x3fe0), f_q), result, f_q)mstore(0x4ec0, result) }mstore(0x4ee0, mulmod(mload(0x4ec0), mload(0x4640), f_q))mstore(0x4f00, mulmod(sub(f_q, mload(0x4ee0)), mload(0x4960), f_q))mstore(0x4f20, mulmod(1, mload(0x4960), f_q))mstore(0x4f40, addmod(mload(0x4ea0), mload(0x4f00), f_q)){ let result := mulmod(mload(0xae0), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0xb00), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0xb20), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0xb40), mload(0x3fe0), f_q), result, f_q)mstore(0x4f60, result) }mstore(0x4f80, mulmod(mload(0x4f60), mload(0x4640), f_q))mstore(0x4fa0, mulmod(sub(f_q, mload(0x4f80)), mload(0x4980), f_q))mstore(0x4fc0, mulmod(1, mload(0x4980), f_q))mstore(0x4fe0, addmod(mload(0x4f40), mload(0x4fa0), f_q)){ let result := mulmod(mload(0xb60), mload(0x3ec0), f_q)result := addmod(mulmod(mload(0xb80), mload(0x3f20), f_q), result, f_q)result := addmod(mulmod(mload(0xba0), mload(0x3f80), f_q), result, f_q)result := addmod(mulmod(mload(0xbc0), mload(0x3fe0), f_q), result, f_q)mstore(0x5000, result) }mstore(0x5020, mulmod(mload(0x5000), mload(0x4640), f_q))mstore(0x5040, mulmod(sub(f_q, mload(0x5020)), mload(0x49a0), f_q))mstore(0x5060, mulmod(1, mload(0x49a0), f_q))mstore(0x5080, addmod(mload(0x4fe0), mload(0x5040), f_q))mstore(0x50a0, mulmod(mload(0x5080), 1, f_q))mstore(0x50c0, mulmod(mload(0x4de0), 1, f_q))mstore(0x50e0, mulmod(mload(0x4e80), 1, f_q))mstore(0x5100, mulmod(mload(0x4f20), 1, f_q))mstore(0x5120, mulmod(mload(0x4fc0), 1, f_q))mstore(0x5140, mulmod(mload(0x5060), 1, f_q))mstore(0x5160, mulmod(1, mload(0x4660), f_q)){ let result := mulmod(mload(0xbe0), mload(0x4080), f_q)mstore(0x5180, result) }mstore(0x51a0, mulmod(mload(0x5180), mload(0x48c0), f_q))mstore(0x51c0, mulmod(sub(f_q, mload(0x51a0)), 1, f_q))mstore(0x51e0, mulmod(mload(0x5160), 1, f_q)){ let result := mulmod(mload(0xc00), mload(0x4080), f_q)mstore(0x5200, result) }mstore(0x5220, mulmod(mload(0x5200), mload(0x48c0), f_q))mstore(0x5240, mulmod(sub(f_q, mload(0x5220)), mload(0x1280), f_q))mstore(0x5260, mulmod(mload(0x5160), mload(0x1280), f_q))mstore(0x5280, addmod(mload(0x51c0), mload(0x5240), f_q)){ let result := mulmod(mload(0xc20), mload(0x4080), f_q)mstore(0x52a0, result) }mstore(0x52c0, mulmod(mload(0x52a0), mload(0x48c0), f_q))mstore(0x52e0, mulmod(sub(f_q, mload(0x52c0)), mload(0x4940), f_q))mstore(0x5300, mulmod(mload(0x5160), mload(0x4940), f_q))mstore(0x5320, addmod(mload(0x5280), mload(0x52e0), f_q)){ let result := mulmod(mload(0x11a0), mload(0x4080), f_q)mstore(0x5340, result) }mstore(0x5360, mulmod(mload(0x5340), mload(0x48c0), f_q))mstore(0x5380, mulmod(sub(f_q, mload(0x5360)), mload(0x4960), f_q))mstore(0x53a0, mulmod(mload(0x5160), mload(0x4960), f_q))mstore(0x53c0, addmod(mload(0x5320), mload(0x5380), f_q)){ let result := mulmod(mload(0x1240), mload(0x4080), f_q)mstore(0x53e0, result) }mstore(0x5400, mulmod(mload(0x53e0), mload(0x48c0), f_q))mstore(0x5420, mulmod(sub(f_q, mload(0x5400)), mload(0x4980), f_q))mstore(0x5440, mulmod(mload(0x5160), mload(0x4980), f_q))mstore(0x5460, addmod(mload(0x53c0), mload(0x5420), f_q)){ let result := mulmod(mload(0xc40), mload(0x4080), f_q)mstore(0x5480, result) }mstore(0x54a0, mulmod(mload(0x5480), mload(0x48c0), f_q))mstore(0x54c0, mulmod(sub(f_q, mload(0x54a0)), mload(0x49a0), f_q))mstore(0x54e0, mulmod(mload(0x5160), mload(0x49a0), f_q))mstore(0x5500, addmod(mload(0x5460), mload(0x54c0), f_q)){ let result := mulmod(mload(0xc60), mload(0x4080), f_q)mstore(0x5520, result) }mstore(0x5540, mulmod(mload(0x5520), mload(0x48c0), f_q))mstore(0x5560, mulmod(sub(f_q, mload(0x5540)), mload(0x49c0), f_q))mstore(0x5580, mulmod(mload(0x5160), mload(0x49c0), f_q))mstore(0x55a0, addmod(mload(0x5500), mload(0x5560), f_q)){ let result := mulmod(mload(0xc80), mload(0x4080), f_q)mstore(0x55c0, result) }mstore(0x55e0, mulmod(mload(0x55c0), mload(0x48c0), f_q))mstore(0x5600, mulmod(sub(f_q, mload(0x55e0)), mload(0x49e0), f_q))mstore(0x5620, mulmod(mload(0x5160), mload(0x49e0), f_q))mstore(0x5640, addmod(mload(0x55a0), mload(0x5600), f_q))mstore(0x5660, addmod(mload(0x5580), mload(0x5620), f_q)){ let result := mulmod(mload(0xca0), mload(0x4080), f_q)mstore(0x5680, result) }mstore(0x56a0, mulmod(mload(0x5680), mload(0x48c0), f_q))mstore(0x56c0, mulmod(sub(f_q, mload(0x56a0)), mload(0x4a00), f_q))mstore(0x56e0, mulmod(mload(0x5160), mload(0x4a00), f_q))mstore(0x5700, addmod(mload(0x5640), mload(0x56c0), f_q)){ let result := mulmod(mload(0xcc0), mload(0x4080), f_q)mstore(0x5720, result) }mstore(0x5740, mulmod(mload(0x5720), mload(0x48c0), f_q))mstore(0x5760, mulmod(sub(f_q, mload(0x5740)), mload(0x4a20), f_q))mstore(0x5780, mulmod(mload(0x5160), mload(0x4a20), f_q))mstore(0x57a0, addmod(mload(0x5700), mload(0x5760), f_q)){ let result := mulmod(mload(0xce0), mload(0x4080), f_q)mstore(0x57c0, result) }mstore(0x57e0, mulmod(mload(0x57c0), mload(0x48c0), f_q))mstore(0x5800, mulmod(sub(f_q, mload(0x57e0)), mload(0x4a40), f_q))mstore(0x5820, mulmod(mload(0x5160), mload(0x4a40), f_q))mstore(0x5840, addmod(mload(0x57a0), mload(0x5800), f_q)){ let result := mulmod(mload(0xd00), mload(0x4080), f_q)mstore(0x5860, result) }mstore(0x5880, mulmod(mload(0x5860), mload(0x48c0), f_q))mstore(0x58a0, mulmod(sub(f_q, mload(0x5880)), mload(0x4a60), f_q))mstore(0x58c0, mulmod(mload(0x5160), mload(0x4a60), f_q))mstore(0x58e0, addmod(mload(0x5840), mload(0x58a0), f_q)){ let result := mulmod(mload(0xd20), mload(0x4080), f_q)mstore(0x5900, result) }mstore(0x5920, mulmod(mload(0x5900), mload(0x48c0), f_q))mstore(0x5940, mulmod(sub(f_q, mload(0x5920)), mload(0x4a80), f_q))mstore(0x5960, mulmod(mload(0x5160), mload(0x4a80), f_q))mstore(0x5980, addmod(mload(0x58e0), mload(0x5940), f_q)){ let result := mulmod(mload(0xd40), mload(0x4080), f_q)mstore(0x59a0, result) }mstore(0x59c0, mulmod(mload(0x59a0), mload(0x48c0), f_q))mstore(0x59e0, mulmod(sub(f_q, mload(0x59c0)), mload(0x4aa0), f_q))mstore(0x5a00, mulmod(mload(0x5160), mload(0x4aa0), f_q))mstore(0x5a20, addmod(mload(0x5980), mload(0x59e0), f_q)){ let result := mulmod(mload(0xd60), mload(0x4080), f_q)mstore(0x5a40, result) }mstore(0x5a60, mulmod(mload(0x5a40), mload(0x48c0), f_q))mstore(0x5a80, mulmod(sub(f_q, mload(0x5a60)), mload(0x4ac0), f_q))mstore(0x5aa0, mulmod(mload(0x5160), mload(0x4ac0), f_q))mstore(0x5ac0, addmod(mload(0x5a20), mload(0x5a80), f_q)){ let result := mulmod(mload(0xda0), mload(0x4080), f_q)mstore(0x5ae0, result) }mstore(0x5b00, mulmod(mload(0x5ae0), mload(0x48c0), f_q))mstore(0x5b20, mulmod(sub(f_q, mload(0x5b00)), mload(0x4ae0), f_q))mstore(0x5b40, mulmod(mload(0x5160), mload(0x4ae0), f_q))mstore(0x5b60, addmod(mload(0x5ac0), mload(0x5b20), f_q)){ let result := mulmod(mload(0xdc0), mload(0x4080), f_q)mstore(0x5b80, result) }mstore(0x5ba0, mulmod(mload(0x5b80), mload(0x48c0), f_q))mstore(0x5bc0, mulmod(sub(f_q, mload(0x5ba0)), mload(0x4b00), f_q))mstore(0x5be0, mulmod(mload(0x5160), mload(0x4b00), f_q))mstore(0x5c00, addmod(mload(0x5b60), mload(0x5bc0), f_q)){ let result := mulmod(mload(0xde0), mload(0x4080), f_q)mstore(0x5c20, result) }mstore(0x5c40, mulmod(mload(0x5c20), mload(0x48c0), f_q))mstore(0x5c60, mulmod(sub(f_q, mload(0x5c40)), mload(0x4b20), f_q))mstore(0x5c80, mulmod(mload(0x5160), mload(0x4b20), f_q))mstore(0x5ca0, addmod(mload(0x5c00), mload(0x5c60), f_q)){ let result := mulmod(mload(0xe00), mload(0x4080), f_q)mstore(0x5cc0, result) }mstore(0x5ce0, mulmod(mload(0x5cc0), mload(0x48c0), f_q))mstore(0x5d00, mulmod(sub(f_q, mload(0x5ce0)), mload(0x4b40), f_q))mstore(0x5d20, mulmod(mload(0x5160), mload(0x4b40), f_q))mstore(0x5d40, addmod(mload(0x5ca0), mload(0x5d00), f_q)){ let result := mulmod(mload(0xe20), mload(0x4080), f_q)mstore(0x5d60, result) }mstore(0x5d80, mulmod(mload(0x5d60), mload(0x48c0), f_q))mstore(0x5da0, mulmod(sub(f_q, mload(0x5d80)), mload(0x4b60), f_q))mstore(0x5dc0, mulmod(mload(0x5160), mload(0x4b60), f_q))mstore(0x5de0, addmod(mload(0x5d40), mload(0x5da0), f_q)){ let result := mulmod(mload(0xe40), mload(0x4080), f_q)mstore(0x5e00, result) }mstore(0x5e20, mulmod(mload(0x5e00), mload(0x48c0), f_q))mstore(0x5e40, mulmod(sub(f_q, mload(0x5e20)), mload(0x4b80), f_q))mstore(0x5e60, mulmod(mload(0x5160), mload(0x4b80), f_q))mstore(0x5e80, addmod(mload(0x5de0), mload(0x5e40), f_q)){ let result := mulmod(mload(0xe60), mload(0x4080), f_q)mstore(0x5ea0, result) }mstore(0x5ec0, mulmod(mload(0x5ea0), mload(0x48c0), f_q))mstore(0x5ee0, mulmod(sub(f_q, mload(0x5ec0)), mload(0x4ba0), f_q))mstore(0x5f00, mulmod(mload(0x5160), mload(0x4ba0), f_q))mstore(0x5f20, addmod(mload(0x5e80), mload(0x5ee0), f_q)){ let result := mulmod(mload(0xe80), mload(0x4080), f_q)mstore(0x5f40, result) }mstore(0x5f60, mulmod(mload(0x5f40), mload(0x48c0), f_q))mstore(0x5f80, mulmod(sub(f_q, mload(0x5f60)), mload(0x4bc0), f_q))mstore(0x5fa0, mulmod(mload(0x5160), mload(0x4bc0), f_q))mstore(0x5fc0, addmod(mload(0x5f20), mload(0x5f80), f_q)){ let result := mulmod(mload(0xea0), mload(0x4080), f_q)mstore(0x5fe0, result) }mstore(0x6000, mulmod(mload(0x5fe0), mload(0x48c0), f_q))mstore(0x6020, mulmod(sub(f_q, mload(0x6000)), mload(0x4be0), f_q))mstore(0x6040, mulmod(mload(0x5160), mload(0x4be0), f_q))mstore(0x6060, addmod(mload(0x5fc0), mload(0x6020), f_q)){ let result := mulmod(mload(0xec0), mload(0x4080), f_q)mstore(0x6080, result) }mstore(0x60a0, mulmod(mload(0x6080), mload(0x48c0), f_q))mstore(0x60c0, mulmod(sub(f_q, mload(0x60a0)), mload(0x4c00), f_q))mstore(0x60e0, mulmod(mload(0x5160), mload(0x4c00), f_q))mstore(0x6100, addmod(mload(0x6060), mload(0x60c0), f_q)){ let result := mulmod(mload(0xee0), mload(0x4080), f_q)mstore(0x6120, result) }mstore(0x6140, mulmod(mload(0x6120), mload(0x48c0), f_q))mstore(0x6160, mulmod(sub(f_q, mload(0x6140)), mload(0x4c20), f_q))mstore(0x6180, mulmod(mload(0x5160), mload(0x4c20), f_q))mstore(0x61a0, addmod(mload(0x6100), mload(0x6160), f_q))mstore(0x61c0, mulmod(mload(0x3c60), mload(0x4660), f_q))mstore(0x61e0, mulmod(mload(0x3c80), mload(0x4660), f_q)){ let result := mulmod(mload(0x3ca0), mload(0x4080), f_q)mstore(0x6200, result) }mstore(0x6220, mulmod(mload(0x6200), mload(0x48c0), f_q))mstore(0x6240, mulmod(sub(f_q, mload(0x6220)), mload(0x4c40), f_q))mstore(0x6260, mulmod(mload(0x5160), mload(0x4c40), f_q))mstore(0x6280, mulmod(mload(0x61c0), mload(0x4c40), f_q))mstore(0x62a0, mulmod(mload(0x61e0), mload(0x4c40), f_q))mstore(0x62c0, addmod(mload(0x61a0), mload(0x6240), f_q)){ let result := mulmod(mload(0xd80), mload(0x4080), f_q)mstore(0x62e0, result) }mstore(0x6300, mulmod(mload(0x62e0), mload(0x48c0), f_q))mstore(0x6320, mulmod(sub(f_q, mload(0x6300)), mload(0x4c60), f_q))mstore(0x6340, mulmod(mload(0x5160), mload(0x4c60), f_q))mstore(0x6360, addmod(mload(0x62c0), mload(0x6320), f_q))mstore(0x6380, mulmod(mload(0x6360), mload(0x12e0), f_q))mstore(0x63a0, mulmod(mload(0x51e0), mload(0x12e0), f_q))mstore(0x63c0, mulmod(mload(0x5260), mload(0x12e0), f_q))mstore(0x63e0, mulmod(mload(0x5300), mload(0x12e0), f_q))mstore(0x6400, mulmod(mload(0x53a0), mload(0x12e0), f_q))mstore(0x6420, mulmod(mload(0x5440), mload(0x12e0), f_q))mstore(0x6440, mulmod(mload(0x54e0), mload(0x12e0), f_q))mstore(0x6460, mulmod(mload(0x5660), mload(0x12e0), f_q))mstore(0x6480, mulmod(mload(0x56e0), mload(0x12e0), f_q))mstore(0x64a0, mulmod(mload(0x5780), mload(0x12e0), f_q))mstore(0x64c0, mulmod(mload(0x5820), mload(0x12e0), f_q))mstore(0x64e0, mulmod(mload(0x58c0), mload(0x12e0), f_q))mstore(0x6500, mulmod(mload(0x5960), mload(0x12e0), f_q))mstore(0x6520, mulmod(mload(0x5a00), mload(0x12e0), f_q))mstore(0x6540, mulmod(mload(0x5aa0), mload(0x12e0), f_q))mstore(0x6560, mulmod(mload(0x5b40), mload(0x12e0), f_q))mstore(0x6580, mulmod(mload(0x5be0), mload(0x12e0), f_q))mstore(0x65a0, mulmod(mload(0x5c80), mload(0x12e0), f_q))mstore(0x65c0, mulmod(mload(0x5d20), mload(0x12e0), f_q))mstore(0x65e0, mulmod(mload(0x5dc0), mload(0x12e0), f_q))mstore(0x6600, mulmod(mload(0x5e60), mload(0x12e0), f_q))mstore(0x6620, mulmod(mload(0x5f00), mload(0x12e0), f_q))mstore(0x6640, mulmod(mload(0x5fa0), mload(0x12e0), f_q))mstore(0x6660, mulmod(mload(0x6040), mload(0x12e0), f_q))mstore(0x6680, mulmod(mload(0x60e0), mload(0x12e0), f_q))mstore(0x66a0, mulmod(mload(0x6180), mload(0x12e0), f_q))mstore(0x66c0, mulmod(mload(0x6260), mload(0x12e0), f_q))mstore(0x66e0, mulmod(mload(0x6280), mload(0x12e0), f_q))mstore(0x6700, mulmod(mload(0x62a0), mload(0x12e0), f_q))mstore(0x6720, mulmod(mload(0x6340), mload(0x12e0), f_q))mstore(0x6740, addmod(mload(0x50a0), mload(0x6380), f_q))mstore(0x6760, mulmod(1, mload(0x46a0), f_q)){ let result := mulmod(mload(0xf00), mload(0x40e0), f_q)result := addmod(mulmod(mload(0xf20), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0xf40), mload(0x41a0), f_q), result, f_q)mstore(0x6780, result) }mstore(0x67a0, mulmod(mload(0x6780), mload(0x48e0), f_q))mstore(0x67c0, mulmod(sub(f_q, mload(0x67a0)), 1, f_q))mstore(0x67e0, mulmod(mload(0x6760), 1, f_q)){ let result := mulmod(mload(0xf60), mload(0x40e0), f_q)result := addmod(mulmod(mload(0xf80), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0xfa0), mload(0x41a0), f_q), result, f_q)mstore(0x6800, result) }mstore(0x6820, mulmod(mload(0x6800), mload(0x48e0), f_q))mstore(0x6840, mulmod(sub(f_q, mload(0x6820)), mload(0x1280), f_q))mstore(0x6860, mulmod(mload(0x6760), mload(0x1280), f_q))mstore(0x6880, addmod(mload(0x67c0), mload(0x6840), f_q)){ let result := mulmod(mload(0xfc0), mload(0x40e0), f_q)result := addmod(mulmod(mload(0xfe0), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0x1000), mload(0x41a0), f_q), result, f_q)mstore(0x68a0, result) }mstore(0x68c0, mulmod(mload(0x68a0), mload(0x48e0), f_q))mstore(0x68e0, mulmod(sub(f_q, mload(0x68c0)), mload(0x4940), f_q))mstore(0x6900, mulmod(mload(0x6760), mload(0x4940), f_q))mstore(0x6920, addmod(mload(0x6880), mload(0x68e0), f_q)){ let result := mulmod(mload(0x1020), mload(0x40e0), f_q)result := addmod(mulmod(mload(0x1040), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0x1060), mload(0x41a0), f_q), result, f_q)mstore(0x6940, result) }mstore(0x6960, mulmod(mload(0x6940), mload(0x48e0), f_q))mstore(0x6980, mulmod(sub(f_q, mload(0x6960)), mload(0x4960), f_q))mstore(0x69a0, mulmod(mload(0x6760), mload(0x4960), f_q))mstore(0x69c0, addmod(mload(0x6920), mload(0x6980), f_q)){ let result := mulmod(mload(0x1080), mload(0x40e0), f_q)result := addmod(mulmod(mload(0x10a0), mload(0x4140), f_q), result, f_q)result := addmod(mulmod(mload(0x10c0), mload(0x41a0), f_q), result, f_q)mstore(0x69e0, result) }mstore(0x6a00, mulmod(mload(0x69e0), mload(0x48e0), f_q))mstore(0x6a20, mulmod(sub(f_q, mload(0x6a00)), mload(0x4980), f_q))mstore(0x6a40, mulmod(mload(0x6760), mload(0x4980), f_q))mstore(0x6a60, addmod(mload(0x69c0), mload(0x6a20), f_q))mstore(0x6a80, mulmod(mload(0x6a60), mload(0x4ca0), f_q))mstore(0x6aa0, mulmod(mload(0x67e0), mload(0x4ca0), f_q))mstore(0x6ac0, mulmod(mload(0x6860), mload(0x4ca0), f_q))mstore(0x6ae0, mulmod(mload(0x6900), mload(0x4ca0), f_q))mstore(0x6b00, mulmod(mload(0x69a0), mload(0x4ca0), f_q))mstore(0x6b20, mulmod(mload(0x6a40), mload(0x4ca0), f_q))mstore(0x6b40, addmod(mload(0x6740), mload(0x6a80), f_q))mstore(0x6b60, mulmod(1, mload(0x46e0), f_q)){ let result := mulmod(mload(0x10e0), mload(0x4220), f_q)result := addmod(mulmod(mload(0x1100), mload(0x4280), f_q), result, f_q)mstore(0x6b80, result) }mstore(0x6ba0, mulmod(mload(0x6b80), mload(0x4900), f_q))mstore(0x6bc0, mulmod(sub(f_q, mload(0x6ba0)), 1, f_q))mstore(0x6be0, mulmod(mload(0x6b60), 1, f_q)){ let result := mulmod(mload(0x1120), mload(0x4220), f_q)result := addmod(mulmod(mload(0x1140), mload(0x4280), f_q), result, f_q)mstore(0x6c00, result) }mstore(0x6c20, mulmod(mload(0x6c00), mload(0x4900), f_q))mstore(0x6c40, mulmod(sub(f_q, mload(0x6c20)), mload(0x1280), f_q))mstore(0x6c60, mulmod(mload(0x6b60), mload(0x1280), f_q))mstore(0x6c80, addmod(mload(0x6bc0), mload(0x6c40), f_q)){ let result := mulmod(mload(0x11c0), mload(0x4220), f_q)result := addmod(mulmod(mload(0x11e0), mload(0x4280), f_q), result, f_q)mstore(0x6ca0, result) }mstore(0x6cc0, mulmod(mload(0x6ca0), mload(0x4900), f_q))mstore(0x6ce0, mulmod(sub(f_q, mload(0x6cc0)), mload(0x4940), f_q))mstore(0x6d00, mulmod(mload(0x6b60), mload(0x4940), f_q))mstore(0x6d20, addmod(mload(0x6c80), mload(0x6ce0), f_q))mstore(0x6d40, mulmod(mload(0x6d20), mload(0x4cc0), f_q))mstore(0x6d60, mulmod(mload(0x6be0), mload(0x4cc0), f_q))mstore(0x6d80, mulmod(mload(0x6c60), mload(0x4cc0), f_q))mstore(0x6da0, mulmod(mload(0x6d00), mload(0x4cc0), f_q))mstore(0x6dc0, addmod(mload(0x6b40), mload(0x6d40), f_q))mstore(0x6de0, mulmod(1, mload(0x4720), f_q)){ let result := mulmod(mload(0x1160), mload(0x42e0), f_q)result := addmod(mulmod(mload(0x1180), mload(0x4340), f_q), result, f_q)mstore(0x6e00, result) }mstore(0x6e20, mulmod(mload(0x6e00), mload(0x4920), f_q))mstore(0x6e40, mulmod(sub(f_q, mload(0x6e20)), 1, f_q))mstore(0x6e60, mulmod(mload(0x6de0), 1, f_q)){ let result := mulmod(mload(0x1200), mload(0x42e0), f_q)result := addmod(mulmod(mload(0x1220), mload(0x4340), f_q), result, f_q)mstore(0x6e80, result) }mstore(0x6ea0, mulmod(mload(0x6e80), mload(0x4920), f_q))mstore(0x6ec0, mulmod(sub(f_q, mload(0x6ea0)), mload(0x1280), f_q))mstore(0x6ee0, mulmod(mload(0x6de0), mload(0x1280), f_q))mstore(0x6f00, addmod(mload(0x6e40), mload(0x6ec0), f_q))mstore(0x6f20, mulmod(mload(0x6f00), mload(0x4ce0), f_q))mstore(0x6f40, mulmod(mload(0x6e60), mload(0x4ce0), f_q))mstore(0x6f60, mulmod(mload(0x6ee0), mload(0x4ce0), f_q))mstore(0x6f80, addmod(mload(0x6dc0), mload(0x6f20), f_q))mstore(0x6fa0, mulmod(1, mload(0x4060), f_q))mstore(0x6fc0, mulmod(1, mload(0x1380), f_q))mstore(0x6fe0, 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(0x7000, 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(0x7020, mload(0x6f80))success := and(eq(staticcall(gas(), 0x7, 0x6fe0, 0x60, 0x6fe0, 0x40), 1), success)mstore(0x7040, mload(0x6fe0)) mstore(0x7060, mload(0x7000))mstore(0x7080, mload(0xc0)) mstore(0x70a0, mload(0xe0))success := and(eq(staticcall(gas(), 0x6, 0x7040, 0x80, 0x7040, 0x40), 1), success)mstore(0x70c0, mload(0x100)) mstore(0x70e0, mload(0x120))mstore(0x7100, mload(0x50c0))success := and(eq(staticcall(gas(), 0x7, 0x70c0, 0x60, 0x70c0, 0x40), 1), success)mstore(0x7120, mload(0x7040)) mstore(0x7140, mload(0x7060))mstore(0x7160, mload(0x70c0)) mstore(0x7180, mload(0x70e0))success := and(eq(staticcall(gas(), 0x6, 0x7120, 0x80, 0x7120, 0x40), 1), success)mstore(0x71a0, mload(0x140)) mstore(0x71c0, mload(0x160))mstore(0x71e0, mload(0x50e0))success := and(eq(staticcall(gas(), 0x7, 0x71a0, 0x60, 0x71a0, 0x40), 1), success)mstore(0x7200, mload(0x7120)) mstore(0x7220, mload(0x7140))mstore(0x7240, mload(0x71a0)) mstore(0x7260, mload(0x71c0))success := and(eq(staticcall(gas(), 0x6, 0x7200, 0x80, 0x7200, 0x40), 1), success)mstore(0x7280, mload(0x180)) mstore(0x72a0, mload(0x1a0))mstore(0x72c0, mload(0x5100))success := and(eq(staticcall(gas(), 0x7, 0x7280, 0x60, 0x7280, 0x40), 1), success)mstore(0x72e0, mload(0x7200)) mstore(0x7300, mload(0x7220))mstore(0x7320, mload(0x7280)) mstore(0x7340, mload(0x72a0))success := and(eq(staticcall(gas(), 0x6, 0x72e0, 0x80, 0x72e0, 0x40), 1), success)mstore(0x7360, mload(0x1c0)) mstore(0x7380, mload(0x1e0))mstore(0x73a0, mload(0x5120))success := and(eq(staticcall(gas(), 0x7, 0x7360, 0x60, 0x7360, 0x40), 1), success)mstore(0x73c0, mload(0x72e0)) mstore(0x73e0, mload(0x7300))mstore(0x7400, mload(0x7360)) mstore(0x7420, mload(0x7380))success := and(eq(staticcall(gas(), 0x6, 0x73c0, 0x80, 0x73c0, 0x40), 1), success)mstore(0x7440, mload(0x200)) mstore(0x7460, mload(0x220))mstore(0x7480, mload(0x5140))success := and(eq(staticcall(gas(), 0x7, 0x7440, 0x60, 0x7440, 0x40), 1), success)mstore(0x74a0, mload(0x73c0)) mstore(0x74c0, mload(0x73e0))mstore(0x74e0, mload(0x7440)) mstore(0x7500, mload(0x7460))success := and(eq(staticcall(gas(), 0x6, 0x74a0, 0x80, 0x74a0, 0x40), 1), success)mstore(0x7520, mload(0x240)) mstore(0x7540, mload(0x260))mstore(0x7560, mload(0x63a0))success := and(eq(staticcall(gas(), 0x7, 0x7520, 0x60, 0x7520, 0x40), 1), success)mstore(0x7580, mload(0x74a0)) mstore(0x75a0, mload(0x74c0))mstore(0x75c0, mload(0x7520)) mstore(0x75e0, mload(0x7540))success := and(eq(staticcall(gas(), 0x6, 0x7580, 0x80, 0x7580, 0x40), 1), success)mstore(0x7600, mload(0x280)) mstore(0x7620, mload(0x2a0))mstore(0x7640, mload(0x63c0))success := and(eq(staticcall(gas(), 0x7, 0x7600, 0x60, 0x7600, 0x40), 1), success)mstore(0x7660, mload(0x7580)) mstore(0x7680, mload(0x75a0))mstore(0x76a0, mload(0x7600)) mstore(0x76c0, mload(0x7620))success := and(eq(staticcall(gas(), 0x6, 0x7660, 0x80, 0x7660, 0x40), 1), success)mstore(0x76e0, mload(0x2c0)) mstore(0x7700, mload(0x2e0))mstore(0x7720, mload(0x63e0))success := and(eq(staticcall(gas(), 0x7, 0x76e0, 0x60, 0x76e0, 0x40), 1), success)mstore(0x7740, mload(0x7660)) mstore(0x7760, mload(0x7680))mstore(0x7780, mload(0x76e0)) mstore(0x77a0, mload(0x7700))success := and(eq(staticcall(gas(), 0x6, 0x7740, 0x80, 0x7740, 0x40), 1), success)mstore(0x77c0, mload(0x3a0)) mstore(0x77e0, mload(0x3c0))mstore(0x7800, mload(0x6400))success := and(eq(staticcall(gas(), 0x7, 0x77c0, 0x60, 0x77c0, 0x40), 1), success)mstore(0x7820, mload(0x7740)) mstore(0x7840, mload(0x7760))mstore(0x7860, mload(0x77c0)) mstore(0x7880, mload(0x77e0))success := and(eq(staticcall(gas(), 0x6, 0x7820, 0x80, 0x7820, 0x40), 1), success)mstore(0x78a0, mload(0x420)) mstore(0x78c0, mload(0x440))mstore(0x78e0, mload(0x6420))success := and(eq(staticcall(gas(), 0x7, 0x78a0, 0x60, 0x78a0, 0x40), 1), success)mstore(0x7900, mload(0x7820)) mstore(0x7920, mload(0x7840))mstore(0x7940, mload(0x78a0)) mstore(0x7960, mload(0x78c0))success := and(eq(staticcall(gas(), 0x6, 0x7900, 0x80, 0x7900, 0x40), 1), success)mstore(0x7980, 0x0d3b7c04b7391ddf5d9fc5f8906033e1d1442f341c4cab5c1584c8082ea8c21c) mstore(0x79a0, 0x1596df7247ab32fb79261c31617e2f2bbde95b6e8719386dacfeaa8f6d7df60c)mstore(0x79c0, mload(0x6440))success := and(eq(staticcall(gas(), 0x7, 0x7980, 0x60, 0x7980, 0x40), 1), success)mstore(0x79e0, mload(0x7900)) mstore(0x7a00, mload(0x7920))mstore(0x7a20, mload(0x7980)) mstore(0x7a40, mload(0x79a0))success := and(eq(staticcall(gas(), 0x6, 0x79e0, 0x80, 0x79e0, 0x40), 1), success)mstore(0x7a60, 0x04d043081f0d55eead6d8ad7b10d09a6ee2718f445d9bce454075a8a37bacaf3) mstore(0x7a80, 0x27d6bcbb02cd624ab80b5532a0a65fc6f88a0faf7cf3e0d106f4aa0aa25e758b)mstore(0x7aa0, mload(0x6460))success := and(eq(staticcall(gas(), 0x7, 0x7a60, 0x60, 0x7a60, 0x40), 1), success)mstore(0x7ac0, mload(0x79e0)) mstore(0x7ae0, mload(0x7a00))mstore(0x7b00, mload(0x7a60)) mstore(0x7b20, mload(0x7a80))success := and(eq(staticcall(gas(), 0x6, 0x7ac0, 0x80, 0x7ac0, 0x40), 1), success)mstore(0x7b40, 0x2d07a1bca289cdb98b648a91cbb0809dfa3a06fe01047b291d1161ddf8d1732c) mstore(0x7b60, 0x021d078d5869c57b3fe2413b517561205de5f297ac56c0e5ef0f1a7f4a31ee94)mstore(0x7b80, mload(0x6480))success := and(eq(staticcall(gas(), 0x7, 0x7b40, 0x60, 0x7b40, 0x40), 1), success)mstore(0x7ba0, mload(0x7ac0)) mstore(0x7bc0, mload(0x7ae0))mstore(0x7be0, mload(0x7b40)) mstore(0x7c00, mload(0x7b60))success := and(eq(staticcall(gas(), 0x6, 0x7ba0, 0x80, 0x7ba0, 0x40), 1), success)mstore(0x7c20, 0x2808de5f33581574dd857304add28f30335fa32c49a3d7c9128f5a3f453360cc) mstore(0x7c40, 0x07f10d421231cb6aa063db7a3cf7be709ff037fbb78d19c866d7c2c674a1aaf0)mstore(0x7c60, mload(0x64a0))success := and(eq(staticcall(gas(), 0x7, 0x7c20, 0x60, 0x7c20, 0x40), 1), success)mstore(0x7c80, mload(0x7ba0)) mstore(0x7ca0, mload(0x7bc0))mstore(0x7cc0, mload(0x7c20)) mstore(0x7ce0, mload(0x7c40))success := and(eq(staticcall(gas(), 0x6, 0x7c80, 0x80, 0x7c80, 0x40), 1), success)mstore(0x7d00, 0x2a9d8bc0a06a141e47fa114e4e62686823227f5416f19f9b2b54b9948a0bfb4b) mstore(0x7d20, 0x170610ca7497030a3dbbfeb52cc8f5f086e7a7a91e3b52e44988e6b24f1c6c34)mstore(0x7d40, mload(0x64c0))success := and(eq(staticcall(gas(), 0x7, 0x7d00, 0x60, 0x7d00, 0x40), 1), success)mstore(0x7d60, mload(0x7c80)) mstore(0x7d80, mload(0x7ca0))mstore(0x7da0, mload(0x7d00)) mstore(0x7dc0, mload(0x7d20))success := and(eq(staticcall(gas(), 0x6, 0x7d60, 0x80, 0x7d60, 0x40), 1), success)mstore(0x7de0, 0x104eb8e796d7c0b0ac9eb316eac3aadbcf9ac5b42d4b14a95ec269fefd70d9ac) mstore(0x7e00, 0x22e1365078923b7f828a54c75e0b0b108c311580bac730c92d8868c7781a917b)mstore(0x7e20, mload(0x64e0))success := and(eq(staticcall(gas(), 0x7, 0x7de0, 0x60, 0x7de0, 0x40), 1), success)mstore(0x7e40, mload(0x7d60)) mstore(0x7e60, mload(0x7d80))mstore(0x7e80, mload(0x7de0)) mstore(0x7ea0, mload(0x7e00))success := and(eq(staticcall(gas(), 0x6, 0x7e40, 0x80, 0x7e40, 0x40), 1), success)mstore(0x7ec0, 0x2e8f499835598c80e2ec4cabd4753e67822df35d0a29c05b60dca21d9173b11a) mstore(0x7ee0, 0x02990fa09b4831443e5956b84832f525976cd30aa6cafe055a45f7a04328d00f)mstore(0x7f00, mload(0x6500))success := and(eq(staticcall(gas(), 0x7, 0x7ec0, 0x60, 0x7ec0, 0x40), 1), success)mstore(0x7f20, mload(0x7e40)) mstore(0x7f40, mload(0x7e60))mstore(0x7f60, mload(0x7ec0)) mstore(0x7f80, mload(0x7ee0))success := and(eq(staticcall(gas(), 0x6, 0x7f20, 0x80, 0x7f20, 0x40), 1), success)mstore(0x7fa0, 0x258bbf1a0f256c29c1cee612fb7deaa2102870b85d7bda1ac8064307a593101f) mstore(0x7fc0, 0x2bbbde7d34cf03b70ea4a0125d6736aeb56da64f07226bf4d662a85e8d50db3a)mstore(0x7fe0, mload(0x6520))success := and(eq(staticcall(gas(), 0x7, 0x7fa0, 0x60, 0x7fa0, 0x40), 1), success)mstore(0x8000, mload(0x7f20)) mstore(0x8020, mload(0x7f40))mstore(0x8040, mload(0x7fa0)) mstore(0x8060, mload(0x7fc0))success := and(eq(staticcall(gas(), 0x6, 0x8000, 0x80, 0x8000, 0x40), 1), success)mstore(0x8080, 0x05127b4a2ff58c747435761c7256b8094a0cf4e6d0f829a060c601d5cce0fdc0) mstore(0x80a0, 0x106a8cecab556f1a6d729cdeefd6dd70afbe4954cae4785871d68396dba88d95)mstore(0x80c0, mload(0x6540))success := and(eq(staticcall(gas(), 0x7, 0x8080, 0x60, 0x8080, 0x40), 1), success)mstore(0x80e0, mload(0x8000)) mstore(0x8100, mload(0x8020))mstore(0x8120, mload(0x8080)) mstore(0x8140, mload(0x80a0))success := and(eq(staticcall(gas(), 0x6, 0x80e0, 0x80, 0x80e0, 0x40), 1), success)mstore(0x8160, 0x24c985411f901ba3e9fe3296d58db7a896d53a060afc4c3b85182122d2a06b16) mstore(0x8180, 0x1e02136b244f617c37779b0cb970dce25ff03579c671e7f3f57a320e7b1a4b06)mstore(0x81a0, mload(0x6560))success := and(eq(staticcall(gas(), 0x7, 0x8160, 0x60, 0x8160, 0x40), 1), success)mstore(0x81c0, mload(0x80e0)) mstore(0x81e0, mload(0x8100))mstore(0x8200, mload(0x8160)) mstore(0x8220, mload(0x8180))success := and(eq(staticcall(gas(), 0x6, 0x81c0, 0x80, 0x81c0, 0x40), 1), success)mstore(0x8240, 0x0e5c5a486399e328a6629926a042fde07863ce1a2e91995ee60e5c477008ebdc) mstore(0x8260, 0x223b4bdd8d3877955728258fd5be1b7f2ac8093891a83c738f80395720cc55ca)mstore(0x8280, mload(0x6580))success := and(eq(staticcall(gas(), 0x7, 0x8240, 0x60, 0x8240, 0x40), 1), success)mstore(0x82a0, mload(0x81c0)) mstore(0x82c0, mload(0x81e0))mstore(0x82e0, mload(0x8240)) mstore(0x8300, mload(0x8260))success := and(eq(staticcall(gas(), 0x6, 0x82a0, 0x80, 0x82a0, 0x40), 1), success)mstore(0x8320, 0x2e55f008e10b629fc37b0808b8264d2857e6fa34a1be704a4132f9c1621b8736) mstore(0x8340, 0x01c3487db12618c270ffe8251633753bdad9fd2968144a02b18447bee326d19d)mstore(0x8360, mload(0x65a0))success := and(eq(staticcall(gas(), 0x7, 0x8320, 0x60, 0x8320, 0x40), 1), success)mstore(0x8380, mload(0x82a0)) mstore(0x83a0, mload(0x82c0))mstore(0x83c0, mload(0x8320)) mstore(0x83e0, mload(0x8340))success := and(eq(staticcall(gas(), 0x6, 0x8380, 0x80, 0x8380, 0x40), 1), success)mstore(0x8400, 0x0154bffa5c54063b60c4f4c66b2a9acb09fd7f1b2653a9f2b9ee75bcb1bc8ba2) mstore(0x8420, 0x0b15f039df5ebe088e2231ce9a07c50dbb4739402712b56dd8bab6ab93a95f3f)mstore(0x8440, mload(0x65c0))success := and(eq(staticcall(gas(), 0x7, 0x8400, 0x60, 0x8400, 0x40), 1), success)mstore(0x8460, mload(0x8380)) mstore(0x8480, mload(0x83a0))mstore(0x84a0, mload(0x8400)) mstore(0x84c0, mload(0x8420))success := and(eq(staticcall(gas(), 0x6, 0x8460, 0x80, 0x8460, 0x40), 1), success)mstore(0x84e0, 0x0032a37f146820eccad7796039d21d0c85504baff34e194f750d7f8c4eccf729) mstore(0x8500, 0x2a655340cddc523abd37c3d77f022b8e616194a3c31e414dc5d466eb2e4c0b69)mstore(0x8520, mload(0x65e0))success := and(eq(staticcall(gas(), 0x7, 0x84e0, 0x60, 0x84e0, 0x40), 1), success)mstore(0x8540, mload(0x8460)) mstore(0x8560, mload(0x8480))mstore(0x8580, mload(0x84e0)) mstore(0x85a0, mload(0x8500))success := and(eq(staticcall(gas(), 0x6, 0x8540, 0x80, 0x8540, 0x40), 1), success)mstore(0x85c0, 0x0d6b367e25327ebd99fae2aaffa6fad2acae34ba7b329ef817a95fe425f65e4d) mstore(0x85e0, 0x2bc4769ce00a494fde791f07b3f092019995d323c0b067d61e0660e1ad84d94f)mstore(0x8600, mload(0x6600))success := and(eq(staticcall(gas(), 0x7, 0x85c0, 0x60, 0x85c0, 0x40), 1), success)mstore(0x8620, mload(0x8540)) mstore(0x8640, mload(0x8560))mstore(0x8660, mload(0x85c0)) mstore(0x8680, mload(0x85e0))success := and(eq(staticcall(gas(), 0x6, 0x8620, 0x80, 0x8620, 0x40), 1), success)mstore(0x86a0, 0x0fef43d29ecdb947fc934c7adf7f38748fe212082d5a8e3bc621ff907213812b) mstore(0x86c0, 0x1ab8ccbb8486a5508a34837db62c3426d6f6210970a2b1351f12d0ba73e11874)mstore(0x86e0, mload(0x6620))success := and(eq(staticcall(gas(), 0x7, 0x86a0, 0x60, 0x86a0, 0x40), 1), success)mstore(0x8700, mload(0x8620)) mstore(0x8720, mload(0x8640))mstore(0x8740, mload(0x86a0)) mstore(0x8760, mload(0x86c0))success := and(eq(staticcall(gas(), 0x6, 0x8700, 0x80, 0x8700, 0x40), 1), success)mstore(0x8780, 0x29cc03da3870fc7139115d43275baf04cc110d79f85d2c2e712b981c409df25e) mstore(0x87a0, 0x016a8cd002e522595ef910f87dc707449ae5f56876eb88274b2e586fceacf165)mstore(0x87c0, mload(0x6640))success := and(eq(staticcall(gas(), 0x7, 0x8780, 0x60, 0x8780, 0x40), 1), success)mstore(0x87e0, mload(0x8700)) mstore(0x8800, mload(0x8720))mstore(0x8820, mload(0x8780)) mstore(0x8840, mload(0x87a0))success := and(eq(staticcall(gas(), 0x6, 0x87e0, 0x80, 0x87e0, 0x40), 1), success)mstore(0x8860, 0x0ec6d72e2ce7c233ca8af2fc2bd4223a6d81d545e8785579de4cb241740f36a2) mstore(0x8880, 0x028a4450999577e25fc7d191fecf7f1a8a0526f7e042f316767c7ff43299fdd9)mstore(0x88a0, mload(0x6660))success := and(eq(staticcall(gas(), 0x7, 0x8860, 0x60, 0x8860, 0x40), 1), success)mstore(0x88c0, mload(0x87e0)) mstore(0x88e0, mload(0x8800))mstore(0x8900, mload(0x8860)) mstore(0x8920, mload(0x8880))success := and(eq(staticcall(gas(), 0x6, 0x88c0, 0x80, 0x88c0, 0x40), 1), success)mstore(0x8940, 0x1fdb57cefe9c10024dfe402759cad8061e8d0edeba3f42f187ea796b1938118e) mstore(0x8960, 0x1294d92ed67eec88a2adbb5cef0682a64fae9827c02d37e69beaddd3b6a145ad)mstore(0x8980, mload(0x6680))success := and(eq(staticcall(gas(), 0x7, 0x8940, 0x60, 0x8940, 0x40), 1), success)mstore(0x89a0, mload(0x88c0)) mstore(0x89c0, mload(0x88e0))mstore(0x89e0, mload(0x8940)) mstore(0x8a00, mload(0x8960))success := and(eq(staticcall(gas(), 0x6, 0x89a0, 0x80, 0x89a0, 0x40), 1), success)mstore(0x8a20, 0x292267e75402bf3fb816d404fe987ec7b277ec539cd653568a31dc8fdd04b6f1) mstore(0x8a40, 0x0a2975f29c8f29df52ea4e941daa28752eea2da8c6b6135622e4a0d823accd78)mstore(0x8a60, mload(0x66a0))success := and(eq(staticcall(gas(), 0x7, 0x8a20, 0x60, 0x8a20, 0x40), 1), success)mstore(0x8a80, mload(0x89a0)) mstore(0x8aa0, mload(0x89c0))mstore(0x8ac0, mload(0x8a20)) mstore(0x8ae0, mload(0x8a40))success := and(eq(staticcall(gas(), 0x6, 0x8a80, 0x80, 0x8a80, 0x40), 1), success)mstore(0x8b00, mload(0x7c0)) mstore(0x8b20, mload(0x7e0))mstore(0x8b40, mload(0x66c0))success := and(eq(staticcall(gas(), 0x7, 0x8b00, 0x60, 0x8b00, 0x40), 1), success)mstore(0x8b60, mload(0x8a80)) mstore(0x8b80, mload(0x8aa0))mstore(0x8ba0, mload(0x8b00)) mstore(0x8bc0, mload(0x8b20))success := and(eq(staticcall(gas(), 0x6, 0x8b60, 0x80, 0x8b60, 0x40), 1), success)mstore(0x8be0, mload(0x800)) mstore(0x8c00, mload(0x820))mstore(0x8c20, mload(0x66e0))success := and(eq(staticcall(gas(), 0x7, 0x8be0, 0x60, 0x8be0, 0x40), 1), success)mstore(0x8c40, mload(0x8b60)) mstore(0x8c60, mload(0x8b80))mstore(0x8c80, mload(0x8be0)) mstore(0x8ca0, mload(0x8c00))success := and(eq(staticcall(gas(), 0x6, 0x8c40, 0x80, 0x8c40, 0x40), 1), success)mstore(0x8cc0, mload(0x840)) mstore(0x8ce0, mload(0x860))mstore(0x8d00, mload(0x6700))success := and(eq(staticcall(gas(), 0x7, 0x8cc0, 0x60, 0x8cc0, 0x40), 1), success)mstore(0x8d20, mload(0x8c40)) mstore(0x8d40, mload(0x8c60))mstore(0x8d60, mload(0x8cc0)) mstore(0x8d80, mload(0x8ce0))success := and(eq(staticcall(gas(), 0x6, 0x8d20, 0x80, 0x8d20, 0x40), 1), success)mstore(0x8da0, mload(0x720)) mstore(0x8dc0, mload(0x740))mstore(0x8de0, mload(0x6720))success := and(eq(staticcall(gas(), 0x7, 0x8da0, 0x60, 0x8da0, 0x40), 1), success)mstore(0x8e00, mload(0x8d20)) mstore(0x8e20, mload(0x8d40))mstore(0x8e40, mload(0x8da0)) mstore(0x8e60, mload(0x8dc0))success := and(eq(staticcall(gas(), 0x6, 0x8e00, 0x80, 0x8e00, 0x40), 1), success)mstore(0x8e80, mload(0x520)) mstore(0x8ea0, mload(0x540))mstore(0x8ec0, mload(0x6aa0))success := and(eq(staticcall(gas(), 0x7, 0x8e80, 0x60, 0x8e80, 0x40), 1), success)mstore(0x8ee0, mload(0x8e00)) mstore(0x8f00, mload(0x8e20))mstore(0x8f20, mload(0x8e80)) mstore(0x8f40, mload(0x8ea0))success := and(eq(staticcall(gas(), 0x6, 0x8ee0, 0x80, 0x8ee0, 0x40), 1), success)mstore(0x8f60, mload(0x560)) mstore(0x8f80, mload(0x580))mstore(0x8fa0, mload(0x6ac0))success := and(eq(staticcall(gas(), 0x7, 0x8f60, 0x60, 0x8f60, 0x40), 1), success)mstore(0x8fc0, mload(0x8ee0)) mstore(0x8fe0, mload(0x8f00))mstore(0x9000, mload(0x8f60)) mstore(0x9020, mload(0x8f80))success := and(eq(staticcall(gas(), 0x6, 0x8fc0, 0x80, 0x8fc0, 0x40), 1), success)mstore(0x9040, mload(0x5a0)) mstore(0x9060, mload(0x5c0))mstore(0x9080, mload(0x6ae0))success := and(eq(staticcall(gas(), 0x7, 0x9040, 0x60, 0x9040, 0x40), 1), success)mstore(0x90a0, mload(0x8fc0)) mstore(0x90c0, mload(0x8fe0))mstore(0x90e0, mload(0x9040)) mstore(0x9100, mload(0x9060))success := and(eq(staticcall(gas(), 0x6, 0x90a0, 0x80, 0x90a0, 0x40), 1), success)mstore(0x9120, mload(0x5e0)) mstore(0x9140, mload(0x600))mstore(0x9160, mload(0x6b00))success := and(eq(staticcall(gas(), 0x7, 0x9120, 0x60, 0x9120, 0x40), 1), success)mstore(0x9180, mload(0x90a0)) mstore(0x91a0, mload(0x90c0))mstore(0x91c0, mload(0x9120)) mstore(0x91e0, mload(0x9140))success := and(eq(staticcall(gas(), 0x6, 0x9180, 0x80, 0x9180, 0x40), 1), success)mstore(0x9200, mload(0x620)) mstore(0x9220, mload(0x640))mstore(0x9240, mload(0x6b20))success := and(eq(staticcall(gas(), 0x7, 0x9200, 0x60, 0x9200, 0x40), 1), success)mstore(0x9260, mload(0x9180)) mstore(0x9280, mload(0x91a0))mstore(0x92a0, mload(0x9200)) mstore(0x92c0, mload(0x9220))success := and(eq(staticcall(gas(), 0x6, 0x9260, 0x80, 0x9260, 0x40), 1), success)mstore(0x92e0, mload(0x660)) mstore(0x9300, mload(0x680))mstore(0x9320, mload(0x6d60))success := and(eq(staticcall(gas(), 0x7, 0x92e0, 0x60, 0x92e0, 0x40), 1), success)mstore(0x9340, mload(0x9260)) mstore(0x9360, mload(0x9280))mstore(0x9380, mload(0x92e0)) mstore(0x93a0, mload(0x9300))success := and(eq(staticcall(gas(), 0x6, 0x9340, 0x80, 0x9340, 0x40), 1), success)mstore(0x93c0, mload(0x6a0)) mstore(0x93e0, mload(0x6c0))mstore(0x9400, mload(0x6d80))success := and(eq(staticcall(gas(), 0x7, 0x93c0, 0x60, 0x93c0, 0x40), 1), success)mstore(0x9420, mload(0x9340)) mstore(0x9440, mload(0x9360))mstore(0x9460, mload(0x93c0)) mstore(0x9480, mload(0x93e0))success := and(eq(staticcall(gas(), 0x6, 0x9420, 0x80, 0x9420, 0x40), 1), success)mstore(0x94a0, mload(0x6e0)) mstore(0x94c0, mload(0x700))mstore(0x94e0, mload(0x6da0))success := and(eq(staticcall(gas(), 0x7, 0x94a0, 0x60, 0x94a0, 0x40), 1), success)mstore(0x9500, mload(0x9420)) mstore(0x9520, mload(0x9440))mstore(0x9540, mload(0x94a0)) mstore(0x9560, mload(0x94c0))success := and(eq(staticcall(gas(), 0x6, 0x9500, 0x80, 0x9500, 0x40), 1), success)mstore(0x9580, mload(0x360)) mstore(0x95a0, mload(0x380))mstore(0x95c0, mload(0x6f40))success := and(eq(staticcall(gas(), 0x7, 0x9580, 0x60, 0x9580, 0x40), 1), success)mstore(0x95e0, mload(0x9500)) mstore(0x9600, mload(0x9520))mstore(0x9620, mload(0x9580)) mstore(0x9640, mload(0x95a0))success := and(eq(staticcall(gas(), 0x6, 0x95e0, 0x80, 0x95e0, 0x40), 1), success)mstore(0x9660, mload(0x3e0)) mstore(0x9680, mload(0x400))mstore(0x96a0, mload(0x6f60))success := and(eq(staticcall(gas(), 0x7, 0x9660, 0x60, 0x9660, 0x40), 1), success)mstore(0x96c0, mload(0x95e0)) mstore(0x96e0, mload(0x9600))mstore(0x9700, mload(0x9660)) mstore(0x9720, mload(0x9680))success := and(eq(staticcall(gas(), 0x6, 0x96c0, 0x80, 0x96c0, 0x40), 1), success)mstore(0x9740, mload(0x1320)) mstore(0x9760, mload(0x1340))mstore(0x9780, sub(f_q, mload(0x6fa0)))success := and(eq(staticcall(gas(), 0x7, 0x9740, 0x60, 0x9740, 0x40), 1), success)mstore(0x97a0, mload(0x96c0)) mstore(0x97c0, mload(0x96e0))mstore(0x97e0, mload(0x9740)) mstore(0x9800, mload(0x9760))success := and(eq(staticcall(gas(), 0x6, 0x97a0, 0x80, 0x97a0, 0x40), 1), success)mstore(0x9820, mload(0x13c0)) mstore(0x9840, mload(0x13e0))mstore(0x9860, mload(0x6fc0))success := and(eq(staticcall(gas(), 0x7, 0x9820, 0x60, 0x9820, 0x40), 1), success)mstore(0x9880, mload(0x97a0)) mstore(0x98a0, mload(0x97c0))mstore(0x98c0, mload(0x9820)) mstore(0x98e0, mload(0x9840))success := and(eq(staticcall(gas(), 0x6, 0x9880, 0x80, 0x9880, 0x40), 1), success)mstore(0x9900, mload(0x9880)) mstore(0x9920, mload(0x98a0))mstore(0x9940, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(0x9960, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(0x9980, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(0x99a0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(0x99c0, mload(0x13c0)) mstore(0x99e0, mload(0x13e0))mstore(0x9a00, 0x0181624e80f3d6ae28df7e01eaeab1c0e919877a3b8a6b7fbc69a6817d596ea2) mstore(0x9a20, 0x1783d30dcb12d259bb89098addf6280fa4b653be7a152542a28f7b926e27e648) mstore(0x9a40, 0x00ae44489d41a0d179e2dfdc03bddd883b7109f8b6ae316a59e815c1a6b35304) mstore(0x9a60, 0x0b2147ab62a386bd63e6de1522109b8c9588ab466f5aadfde8c41ca3749423ee)success := and(eq(staticcall(gas(), 0x8, 0x9900, 0x180, 0x9900, 0x20), 1), success)success := and(eq(mload(0x9900), 1), success)} return success; } } diff --git a/justfile b/justfile index 6e2d385c..9102f9bd 100644 --- a/justfile +++ b/justfile @@ -21,11 +21,11 @@ setup-committee-update network *k='25': --verifier-k $2 --verifier-pk-path ./build/committee_update_verifier_$1.pkey setup gen-verifier-step network: - cargo run -r -- circuit sync-step -p ./build/sync_step_$1.pkey gen-verifier -o ./contracts/snark-verifiers/sync_step_$1.sol + cargo run -r -- circuit sync-step -p ./build/sync_step_$1.pkey gen-verifier -o ./contracts/snark-verifiers/sync_step.sol gen-verifier-committee-update network: cargo run -r -- circuit committee-update -p ./build/committee_update_$1.pkey --verifier-pk-path ./build/committee_update_verifier_$1.pkey \ - gen-verifier -o ./contracts/snark-verifiers/committee_update_$1.sol + gen-verifier -o ./contracts/snark-verifiers/committee_update_verifier.sol build-contracts: cd contracts && forge build